diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index fd86829ea9..bf8d1056e0 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -11,6 +11,16 @@ "Comment": "null-5", "Rev": "'75cd24fc2f2c2a2088577d12123ddee5f54e0675'" }, + { + "ImportPath": "cloud.google.com/go/compute/metadata", + "Comment": "v0.1.0-115-g3b1ae45", + "Rev": "3b1ae45394a234c385be014e9a488f2bb6eef821" + }, + { + "ImportPath": "cloud.google.com/go/internal", + "Comment": "v0.1.0-115-g3b1ae45", + "Rev": "3b1ae45394a234c385be014e9a488f2bb6eef821" + }, { "ImportPath": "github.com/Azure/azure-sdk-for-go/arm/compute", "Comment": "v3.0.0-beta", @@ -322,248 +332,248 @@ }, { "ImportPath": "github.com/coreos/etcd/alarm", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/auth", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/auth/authpb", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/client", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/clientv3", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/compactor", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/discovery", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/error", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/etcdserver", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/etcdserver/api", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/etcdserver/api/v2http", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/etcdserver/api/v2http/httptypes", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/etcdserver/auth", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/etcdserver/etcdserverpb", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/etcdserver/membership", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/etcdserver/stats", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/lease", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/lease/leasehttp", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/lease/leasepb", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/mvcc", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/mvcc/backend", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/mvcc/mvccpb", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/adt", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/contention", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/crc", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/fileutil", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/httputil", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/idutil", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/ioutil", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/logutil", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/netutil", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/pathutil", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/pbutil", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/runtime", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/schedule", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/tlsutil", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/transport", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/types", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/pkg/wait", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/raft", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/raft/raftpb", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/rafthttp", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/snap", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/snap/snappb", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/store", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/version", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/wal", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/etcd/wal/walpb", - "Comment": "v3.0.6", - "Rev": "9efa00d1030d4bf62eb8e5ec130023aeb1b8e2d0" + "Comment": "v3.0.12", + "Rev": "2d1e2e8e646e65f73ca0d9ee905a5343d6135a50" }, { "ImportPath": "github.com/coreos/go-oidc/http", @@ -1075,198 +1085,198 @@ }, { "ImportPath": "github.com/google/cadvisor/api", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/cache/memory", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/collector", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/container", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/container/common", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/container/docker", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/container/libcontainer", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/container/raw", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/container/rkt", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/container/systemd", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/devicemapper", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/events", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/fs", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/healthz", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/http", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/http/mux", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/info/v1", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/info/v2", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/machine", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/manager", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/manager/watcher", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/manager/watcher/raw", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/manager/watcher/rkt", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/metrics", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/pages", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/pages/static", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/storage", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/summary", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/utils", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/utils/cloudinfo", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/utils/cpuload", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/utils/cpuload/netlink", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/utils/docker", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/utils/oomparser", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/utils/sysfs", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/utils/sysinfo", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/utils/tail", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/validate", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/cadvisor/version", - "Comment": "v0.24.0", - "Rev": "0cdf4912793fac9990de3790c273342ec31817fb" + "Comment": "v0.24.0-alpha1-56-ga726d13", + "Rev": "a726d13de8cb32860e73d72a78dc8e0124267709" }, { "ImportPath": "github.com/google/certificate-transparency/go", @@ -1508,83 +1518,83 @@ }, { "ImportPath": "github.com/opencontainers/runc/libcontainer", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/apparmor", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/cgroups", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/cgroups/fs", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/cgroups/systemd", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/configs", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/configs/validate", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/criurpc", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/keys", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/label", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/seccomp", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/selinux", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/stacktrace", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/system", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/user", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/opencontainers/runc/libcontainer/utils", - "Comment": "v1.0.0-rc1-100-g142df38", - "Rev": "142df3836b740af53dc6da59eed8dbc92f62917c" + "Comment": "v1.0.0-rc1-224-g5653ced", + "Rev": "5653ced544b1fa9d9623f12aaf9601bf1aefc013" }, { "ImportPath": "github.com/pborman/uuid", @@ -1971,7 +1981,7 @@ }, { "ImportPath": "github.com/xiang90/probing", - "Rev": "6a0cc1ae81b4cc11db5e491e030e4b98fba79c19" + "Rev": "07dd2e8dfe18522e9c447ba95f2fe95262f63bb2" }, { "ImportPath": "go4.org/errorutil", @@ -2059,23 +2069,23 @@ }, { "ImportPath": "golang.org/x/oauth2", - "Rev": "b5adcc2dcdf009d0391547edc6ecbaff889f5bb9" + "Rev": "3c3a985cb79f52a3190fbc056984415ca6763d01" }, { "ImportPath": "golang.org/x/oauth2/google", - "Rev": "b5adcc2dcdf009d0391547edc6ecbaff889f5bb9" + "Rev": "3c3a985cb79f52a3190fbc056984415ca6763d01" }, { "ImportPath": "golang.org/x/oauth2/internal", - "Rev": "b5adcc2dcdf009d0391547edc6ecbaff889f5bb9" + "Rev": "3c3a985cb79f52a3190fbc056984415ca6763d01" }, { "ImportPath": "golang.org/x/oauth2/jws", - "Rev": "b5adcc2dcdf009d0391547edc6ecbaff889f5bb9" + "Rev": "3c3a985cb79f52a3190fbc056984415ca6763d01" }, { "ImportPath": "golang.org/x/oauth2/jwt", - "Rev": "b5adcc2dcdf009d0391547edc6ecbaff889f5bb9" + "Rev": "3c3a985cb79f52a3190fbc056984415ca6763d01" }, { "ImportPath": "golang.org/x/sys/unix", @@ -2127,80 +2137,104 @@ }, { "ImportPath": "google.golang.org/api/cloudmonitoring/v2beta2", - "Rev": "4300f6b0c8a7f09e521dd0af2cee27e28846e037" + "Rev": "a69f0f19d246419bb931b0ac8f4f8d3f3e6d4feb" }, { "ImportPath": "google.golang.org/api/compute/v1", - "Rev": "4300f6b0c8a7f09e521dd0af2cee27e28846e037" + "Rev": "a69f0f19d246419bb931b0ac8f4f8d3f3e6d4feb" }, { "ImportPath": "google.golang.org/api/container/v1", - "Rev": "4300f6b0c8a7f09e521dd0af2cee27e28846e037" + "Rev": "a69f0f19d246419bb931b0ac8f4f8d3f3e6d4feb" }, { "ImportPath": "google.golang.org/api/gensupport", - "Rev": "4300f6b0c8a7f09e521dd0af2cee27e28846e037" + "Rev": "a69f0f19d246419bb931b0ac8f4f8d3f3e6d4feb" }, { "ImportPath": "google.golang.org/api/googleapi", - "Rev": "4300f6b0c8a7f09e521dd0af2cee27e28846e037" + "Rev": "a69f0f19d246419bb931b0ac8f4f8d3f3e6d4feb" }, { "ImportPath": "google.golang.org/api/googleapi/internal/uritemplates", - "Rev": "4300f6b0c8a7f09e521dd0af2cee27e28846e037" + "Rev": "a69f0f19d246419bb931b0ac8f4f8d3f3e6d4feb" }, { - "ImportPath": "google.golang.org/cloud/compute/metadata", - "Rev": "eb47ba841d53d93506cfbfbc03927daf9cc48f88" + "ImportPath": "google.golang.org/appengine", + "Rev": "4f7eeb5305a4ba1966344836ba4af9996b7b4e05" }, { - "ImportPath": "google.golang.org/cloud/internal", - "Rev": "eb47ba841d53d93506cfbfbc03927daf9cc48f88" + "ImportPath": "google.golang.org/appengine/internal", + "Rev": "4f7eeb5305a4ba1966344836ba4af9996b7b4e05" + }, + { + "ImportPath": "google.golang.org/appengine/internal/app_identity", + "Rev": "4f7eeb5305a4ba1966344836ba4af9996b7b4e05" + }, + { + "ImportPath": "google.golang.org/appengine/internal/base", + "Rev": "4f7eeb5305a4ba1966344836ba4af9996b7b4e05" + }, + { + "ImportPath": "google.golang.org/appengine/internal/datastore", + "Rev": "4f7eeb5305a4ba1966344836ba4af9996b7b4e05" + }, + { + "ImportPath": "google.golang.org/appengine/internal/log", + "Rev": "4f7eeb5305a4ba1966344836ba4af9996b7b4e05" + }, + { + "ImportPath": "google.golang.org/appengine/internal/modules", + "Rev": "4f7eeb5305a4ba1966344836ba4af9996b7b4e05" + }, + { + "ImportPath": "google.golang.org/appengine/internal/remote_api", + "Rev": "4f7eeb5305a4ba1966344836ba4af9996b7b4e05" }, { "ImportPath": "google.golang.org/grpc", - "Comment": "v1.0.0-6-g02fca89", - "Rev": "02fca896ff5f50c6bbbee0860345a49344b37a03" + "Comment": "v1.0.0-183-g231b4cf", + "Rev": "231b4cfea0e79843053a33f5fe90bd4d84b23cd3" }, { "ImportPath": "google.golang.org/grpc/codes", - "Comment": "v1.0.0-6-g02fca89", - "Rev": "02fca896ff5f50c6bbbee0860345a49344b37a03" + "Comment": "v1.0.0-183-g231b4cf", + "Rev": "231b4cfea0e79843053a33f5fe90bd4d84b23cd3" }, { "ImportPath": "google.golang.org/grpc/credentials", - "Comment": "v1.0.0-6-g02fca89", - "Rev": "02fca896ff5f50c6bbbee0860345a49344b37a03" + "Comment": "v1.0.0-183-g231b4cf", + "Rev": "231b4cfea0e79843053a33f5fe90bd4d84b23cd3" }, { "ImportPath": "google.golang.org/grpc/grpclog", - "Comment": "v1.0.0-6-g02fca89", - "Rev": "02fca896ff5f50c6bbbee0860345a49344b37a03" + "Comment": "v1.0.0-183-g231b4cf", + "Rev": "231b4cfea0e79843053a33f5fe90bd4d84b23cd3" }, { "ImportPath": "google.golang.org/grpc/internal", - "Comment": "v1.0.0-6-g02fca89", - "Rev": "02fca896ff5f50c6bbbee0860345a49344b37a03" + "Comment": "v1.0.0-183-g231b4cf", + "Rev": "231b4cfea0e79843053a33f5fe90bd4d84b23cd3" }, { "ImportPath": "google.golang.org/grpc/metadata", - "Comment": "v1.0.0-6-g02fca89", - "Rev": "02fca896ff5f50c6bbbee0860345a49344b37a03" + "Comment": "v1.0.0-183-g231b4cf", + "Rev": "231b4cfea0e79843053a33f5fe90bd4d84b23cd3" }, { "ImportPath": "google.golang.org/grpc/naming", - "Comment": "v1.0.0-6-g02fca89", - "Rev": "02fca896ff5f50c6bbbee0860345a49344b37a03" + "Comment": "v1.0.0-183-g231b4cf", + "Rev": "231b4cfea0e79843053a33f5fe90bd4d84b23cd3" }, { "ImportPath": "google.golang.org/grpc/peer", - "Comment": "v1.0.0-6-g02fca89", - "Rev": "02fca896ff5f50c6bbbee0860345a49344b37a03" + "Comment": "v1.0.0-183-g231b4cf", + "Rev": "231b4cfea0e79843053a33f5fe90bd4d84b23cd3" }, { "ImportPath": "google.golang.org/grpc/transport", - "Comment": "v1.0.0-6-g02fca89", - "Rev": "02fca896ff5f50c6bbbee0860345a49344b37a03" + "Comment": "v1.0.0-183-g231b4cf", + "Rev": "231b4cfea0e79843053a33f5fe90bd4d84b23cd3" }, { "ImportPath": "gopkg.in/cheggaaa/pb.v1", @@ -2513,2573 +2547,2573 @@ }, { "ImportPath": "k8s.io/kubernetes/cmd/kube-apiserver/app", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/cmd/kube-apiserver/app/options", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/cmd/kube-controller-manager/app", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/cmd/kube-controller-manager/app/options", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/cmd/kube-proxy/app", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/cmd/kube-proxy/app/options", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/cmd/kubelet/app", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/cmd/kubelet/app/options", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/admission", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/annotations", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/endpoints", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/errors", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/errors/storage", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/install", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/meta", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/meta/metatypes", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/pod", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/resource", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/rest", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/service", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/unversioned", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/unversioned/validation", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/util", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/v1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/validation", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apimachinery", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apimachinery/registered", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/abac", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/abac/latest", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/abac/v0", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/abac/v1beta1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/apps", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/install", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/v1alpha1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/validation", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authentication", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authentication/install", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authentication/v1beta1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization/install", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization/v1beta1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization/validation", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/install", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/v1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/validation", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/batch", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/install", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/v1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/v2alpha1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/validation", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/certificates", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/certificates/install", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/certificates/v1alpha1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/certificates/validation", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/componentconfig", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/componentconfig/install", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions/install", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions/v1beta1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions/validation", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/imagepolicy", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/imagepolicy/install", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/imagepolicy/v1alpha1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/policy", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/policy/install", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/policy/v1alpha1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/policy/validation", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac/install", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac/validation", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/storage", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/storage/install", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/storage/v1beta1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/storage/validation", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apiserver", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apiserver/audit", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apiserver/authenticator", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/apiserver/metrics", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/auth/authenticator", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/auth/authenticator/bearertoken", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/auth/authorizer", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/auth/authorizer/abac", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/auth/authorizer/union", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/auth/handlers", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/auth/user", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/capabilities", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/cache", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/chaosclient", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authentication/unversioned", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authentication/unversioned/fake", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authorization/unversioned", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/authorization/unversioned/fake", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/autoscaling/unversioned", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/autoscaling/unversioned/fake", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/batch/unversioned/fake", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/certificates/unversioned", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/certificates/unversioned/fake", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/unversioned/fake", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/unversioned/fake", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/rbac/unversioned", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/rbac/unversioned/fake", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/storage/unversioned", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/storage/unversioned/fake", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/leaderelection", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/metrics", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/record", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/restclient", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/testing/core", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/transport", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/typed/discovery", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/typed/discovery/fake", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/typed/dynamic", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/unversioned", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/unversioned/auth", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/unversioned/clientcmd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/latest", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/aws", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/azure", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/cloudstack", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/gce", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/mesos", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/openstack", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/ovirt", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/certificates", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/daemon", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/deployment", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/deployment/util", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/disruption", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/endpoint", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/garbagecollector", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/garbagecollector/metaonly", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/informers", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/job", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/namespace", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/node", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/petset", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/podautoscaler", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/podautoscaler/metrics", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/podgc", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/replicaset", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/replication", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/resourcequota", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/route", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/scheduledjob", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/service", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/serviceaccount", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/attachdetach", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/attachdetach/cache", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/attachdetach/populator", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/attachdetach/reconciler", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/attachdetach/statusupdater", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller/volume/persistentvolume", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/conversion", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/conversion/queryparams", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider/aws", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider/gcp", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/fieldpath", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/fields", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/genericapiserver", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/genericapiserver/authorizer", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/genericapiserver/openapi", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/genericapiserver/options", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/genericapiserver/validation", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/healthz", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/httplog", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/api", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/stats", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cadvisor", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/client", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/config", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/container", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/custommetrics", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockertools", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/envvars", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/events", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/eviction", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/images", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/kuberuntime", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/leaky", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/lifecycle", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/metrics", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network/cni", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network/exec", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network/hairpin", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network/hostport", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network/kubenet", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/pleg", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/pod", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/prober", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/prober/results", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/qos", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/remote", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/rkt", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server/portforward", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server/remotecommand", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server/stats", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/status", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/sysctl", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/types", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/cache", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/format", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/ioutils", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/queue", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/sliceutils", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/volumemanager", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/volumemanager/cache", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/volumemanager/populator", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/labels", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/master", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/master/ports", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/probe", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/probe/exec", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/probe/http", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/probe/tcp", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/config", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/healthcheck", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/iptables", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/userspace", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/quota", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/quota/evaluator/core", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/quota/generic", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/quota/install", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/authorization/subjectaccessreview", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/authorization/util", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/cachesize", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/certificates", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/certificates/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/clusterrole", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/clusterrole/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/clusterrole/policybased", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/clusterrolebinding", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/clusterrolebinding/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/clusterrolebinding/policybased", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/componentstatus", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/configmap", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/configmap/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/controller", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/controller/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/daemonset", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/daemonset/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/deployment", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/deployment/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/endpoint", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/endpoint/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/event", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/event/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/experimental/controller/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/generic", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/generic/registry", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/generic/rest", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/horizontalpodautoscaler", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/horizontalpodautoscaler/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/ingress", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/ingress/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/job", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/job/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/limitrange", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/limitrange/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/namespace", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/namespace/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/networkpolicy", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/networkpolicy/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/node", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/node/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/node/rest", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/persistentvolume", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/persistentvolume/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/persistentvolumeclaim", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/persistentvolumeclaim/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/petset", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/petset/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/pod", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/pod/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/pod/rest", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/poddisruptionbudget", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/poddisruptionbudget/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/podsecuritypolicy", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/podsecuritypolicy/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/podtemplate", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/podtemplate/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/rangeallocation", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/replicaset", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/replicaset/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/resourcequota", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/resourcequota/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/role", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/role/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/role/policybased", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/rolebinding", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/rolebinding/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/rolebinding/policybased", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/scheduledjob", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/scheduledjob/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/secret", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/secret/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/service", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/service/allocator", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/service/allocator/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/service/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/service/ipallocator", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/service/ipallocator/controller", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/service/portallocator", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/service/portallocator/controller", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/serviceaccount", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/serviceaccount/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/storageclass", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/storageclass/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/thirdpartyresource", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/thirdpartyresource/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/registry/tokenreview", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/runtime", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/runtime/serializer", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/runtime/serializer/json", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/runtime/serializer/protobuf", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/runtime/serializer/recognizer", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/runtime/serializer/streaming", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/runtime/serializer/versioning", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/security/apparmor", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/apparmor", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/capabilities", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/group", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/selinux", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/sysctl", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/user", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/security/podsecuritypolicy/util", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/securitycontext", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/selection", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/serviceaccount", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/ssh", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/storage", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/storage/etcd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/storage/etcd/metrics", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/storage/etcd/util", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/storage/etcd3", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/storage/storagebackend", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/storage/storagebackend/factory", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/types", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/ui", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/ui/data/swagger", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/async", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/bandwidth", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/cache", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/certificates", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/chmod", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/chown", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/clock", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/config", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/configz", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/crypto", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/dbus", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/diff", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/ebtables", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/env", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/errors", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/exec", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/flock", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/flowcontrol", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/flushwriter", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/framer", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/goroutinemap", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/goroutinemap/exponentialbackoff", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/hash", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/homedir", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/httpstream", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/httpstream/spdy", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/integer", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/interrupt", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/intstr", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/io", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/iptables", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/json", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/keymutex", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/labels", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/limitwriter", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/maps", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/metrics", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/mount", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/net", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/net/sets", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/node", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/oom", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/parsers", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/pod", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/procfs", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/proxy", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/rand", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/replicaset", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/resourcecontainer", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/rlimit", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/runtime", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/selinux", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/sets", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/slice", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/strategicpatch", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/strings", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/sysctl", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/system", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/term", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/uuid", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/validation", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/validation/field", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/wait", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/workqueue", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/wsstream", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/yaml", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/version", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/aws_ebs", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/azure_dd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/azure_file", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/cephfs", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/cinder", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/configmap", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/downwardapi", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/empty_dir", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/fc", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/flexvolume", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/flocker", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/gce_pd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/git_repo", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/glusterfs", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/host_path", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/iscsi", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/nfs", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/quobyte", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/rbd", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/secret", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/util", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/util/operationexecutor", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/util/types", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/util/volumehelper", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/vsphere_volume", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/watch", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/pkg/watch/versioned", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/cmd/kube-scheduler/app", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/cmd/kube-scheduler/app/options", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/admit", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/alwayspullimages", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/antiaffinity", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/deny", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/exec", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/imagepolicy", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/initialresources", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/limitranger", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/namespace/autoprovision", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/namespace/exists", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/namespace/lifecycle", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/persistentvolume/label", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/resourcequota", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/security/podsecuritypolicy", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/securitycontext/scdeny", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/serviceaccount", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/admission/storageclass/default", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/auth/authenticator/password/keystone", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/auth/authenticator/password/passwordfile", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/auth/authenticator/request/basicauth", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/auth/authenticator/request/union", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/auth/authenticator/request/x509", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/auth/authenticator/token/oidc", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/auth/authenticator/token/tokenfile", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/auth/authenticator/token/webhook", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/auth/authorizer/webhook", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/client/auth", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/client/auth/gcp", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/client/auth/oidc", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/predicates", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/priorities", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/priorities/util", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/algorithmprovider", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/algorithmprovider/defaults", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/api", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/api/latest", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/api/v1", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/api/validation", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/factory", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/metrics", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/scheduler/schedulercache", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/plugin/pkg/webhook", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/third_party/forked/golang/expansion", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/third_party/forked/golang/json", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/third_party/forked/golang/netutil", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" }, { "ImportPath": "k8s.io/kubernetes/third_party/forked/golang/reflect", - "Comment": "v1.4.3", - "Rev": "4957b090e9a4f6a68b4a40375408fdc74a212260" + "Comment": "v1.4.5", + "Rev": "5a0a696437ad35c133c0c8493f7e9d22b0f9b81b" } ] } diff --git a/docs/minikube_start.md b/docs/minikube_start.md index 945ad3430a..46a9aa79b4 100644 --- a/docs/minikube_start.md +++ b/docs/minikube_start.md @@ -27,7 +27,7 @@ minikube start --insecure-registry value Insecure Docker registries to pass to the Docker daemon (default []) --iso-url string Location of the minikube iso (default "https://storage.googleapis.com/minikube/minikube-0.7.iso") --kubernetes-version string The kubernetes version that the minikube VM will (ex: v1.2.3) - OR a URI which contains a localkube binary (ex: https://storage.googleapis.com/minikube/k8sReleases/v1.3.0/localkube-linux-amd64) (default "v1.4.3") + OR a URI which contains a localkube binary (ex: https://storage.googleapis.com/minikube/k8sReleases/v1.3.0/localkube-linux-amd64) (default "v1.4.5") --kvm-network string The KVM network name. (only supported with KVM driver) (default "default") --memory int Amount of RAM allocated to the minikube VM (default 2048) --network-plugin string The name of the network plugin diff --git a/vendor/google.golang.org/cloud/LICENSE b/vendor/cloud.google.com/go/LICENSE similarity index 100% rename from vendor/google.golang.org/cloud/LICENSE rename to vendor/cloud.google.com/go/LICENSE diff --git a/vendor/google.golang.org/cloud/compute/metadata/metadata.go b/vendor/cloud.google.com/go/compute/metadata/metadata.go similarity index 81% rename from vendor/google.golang.org/cloud/compute/metadata/metadata.go rename to vendor/cloud.google.com/go/compute/metadata/metadata.go index 0a709598df..5c6f3bf382 100644 --- a/vendor/google.golang.org/cloud/compute/metadata/metadata.go +++ b/vendor/cloud.google.com/go/compute/metadata/metadata.go @@ -27,6 +27,7 @@ import ( "net/http" "net/url" "os" + "runtime" "strings" "sync" "time" @@ -34,11 +35,20 @@ import ( "golang.org/x/net/context" "golang.org/x/net/context/ctxhttp" - "google.golang.org/cloud/internal" + "cloud.google.com/go/internal" ) -// metadataIP is the documented metadata server IP address. -const metadataIP = "169.254.169.254" +const ( + // metadataIP is the documented metadata server IP address. + metadataIP = "169.254.169.254" + + // metadataHostEnv is the environment variable specifying the + // GCE metadata hostname. If empty, the default value of + // metadataIP ("169.254.169.254") is used instead. + // This is variable name is not defined by any spec, as far as + // I know; it was made up for the Go package. + metadataHostEnv = "GCE_METADATA_HOST" +) type cachedValue struct { k string @@ -110,7 +120,7 @@ func getETag(client *http.Client, suffix string) (value, etag string, err error) // deployments. To enable spoofing of the metadata service, the environment // variable GCE_METADATA_HOST is first inspected to decide where metadata // requests shall go. - host := os.Getenv("GCE_METADATA_HOST") + host := os.Getenv(metadataHostEnv) if host == "" { // Using 169.254.169.254 instead of "metadata" here because Go // binaries built with the "netgo" tag and without cgo won't @@ -163,32 +173,34 @@ func (c *cachedValue) get() (v string, err error) { return } -var onGCE struct { - sync.Mutex - set bool - v bool -} +var ( + onGCEOnce sync.Once + onGCE bool +) // OnGCE reports whether this process is running on Google Compute Engine. func OnGCE() bool { - defer onGCE.Unlock() - onGCE.Lock() - if onGCE.set { - return onGCE.v - } - onGCE.set = true - onGCE.v = testOnGCE() - return onGCE.v + onGCEOnce.Do(initOnGCE) + return onGCE +} + +func initOnGCE() { + onGCE = testOnGCE() } func testOnGCE() bool { + // The user explicitly said they're on GCE, so trust them. + if os.Getenv(metadataHostEnv) != "" { + return true + } + ctx, cancel := context.WithCancel(context.Background()) defer cancel() resc := make(chan bool, 2) // Try two strategies in parallel. - // See https://github.com/GoogleCloudPlatform/gcloud-golang/issues/194 + // See https://github.com/GoogleCloudPlatform/google-cloud-go/issues/194 go func() { res, err := ctxhttp.Get(ctx, metaClient, "http://"+metadataIP) if err != nil { @@ -208,9 +220,53 @@ func testOnGCE() bool { resc <- strsContains(addrs, metadataIP) }() + tryHarder := systemInfoSuggestsGCE() + if tryHarder { + res := <-resc + if res { + // The first strategy succeeded, so let's use it. + return true + } + // Wait for either the DNS or metadata server probe to + // contradict the other one and say we are running on + // GCE. Give it a lot of time to do so, since the system + // info already suggests we're running on a GCE BIOS. + timer := time.NewTimer(5 * time.Second) + defer timer.Stop() + select { + case res = <-resc: + return res + case <-timer.C: + // Too slow. Who knows what this system is. + return false + } + } + + // There's no hint from the system info that we're running on + // GCE, so use the first probe's result as truth, whether it's + // true or false. The goal here is to optimize for speed for + // users who are NOT running on GCE. We can't assume that + // either a DNS lookup or an HTTP request to a blackholed IP + // address is fast. Worst case this should return when the + // metaClient's Transport.ResponseHeaderTimeout or + // Transport.Dial.Timeout fires (in two seconds). return <-resc } +// systemInfoSuggestsGCE reports whether the local system (without +// doing network requests) suggests that we're running on GCE. If this +// returns true, testOnGCE tries a bit harder to reach its metadata +// server. +func systemInfoSuggestsGCE() bool { + if runtime.GOOS != "linux" { + // We don't have any non-Linux clues available, at least yet. + return false + } + slurp, _ := ioutil.ReadFile("/sys/class/dmi/id/product_name") + name := strings.TrimSpace(string(slurp)) + return name == "Google" || name == "Google Compute Engine" +} + // Subscribe subscribes to a value from the metadata service. // The suffix is appended to "http://${GCE_METADATA_HOST}/computeMetadata/v1/". // The suffix may contain query parameters. diff --git a/vendor/cloud.google.com/go/internal/cloud.go b/vendor/cloud.google.com/go/internal/cloud.go new file mode 100644 index 0000000000..8e0c8f8e52 --- /dev/null +++ b/vendor/cloud.google.com/go/internal/cloud.go @@ -0,0 +1,64 @@ +// 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 internal provides support for the cloud packages. +// +// Users should not import this package directly. +package internal + +import ( + "fmt" + "net/http" +) + +const userAgent = "gcloud-golang/0.1" + +// Transport is an http.RoundTripper that appends Google Cloud client's +// user-agent to the original request's user-agent header. +type Transport struct { + // TODO(bradfitz): delete internal.Transport. It's too wrappy for what it does. + // Do User-Agent some other way. + + // Base is the actual http.RoundTripper + // requests will use. It must not be nil. + Base http.RoundTripper +} + +// RoundTrip appends a user-agent to the existing user-agent +// header and delegates the request to the base http.RoundTripper. +func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { + req = cloneRequest(req) + ua := req.Header.Get("User-Agent") + if ua == "" { + ua = userAgent + } else { + ua = fmt.Sprintf("%s %s", ua, userAgent) + } + req.Header.Set("User-Agent", ua) + return t.Base.RoundTrip(req) +} + +// cloneRequest returns a clone of the provided *http.Request. +// The clone is a shallow copy of the struct and its Header map. +func cloneRequest(r *http.Request) *http.Request { + // shallow copy of the struct + r2 := new(http.Request) + *r2 = *r + // deep copy of the Header + r2.Header = make(http.Header) + for k, s := range r.Header { + r2.Header[k] = s + } + return r2 +} diff --git a/vendor/github.com/coreos/etcd/auth/authpb/auth.pb.go b/vendor/github.com/coreos/etcd/auth/authpb/auth.pb.go index 448e1eaa0d..bafa775d52 100644 --- a/vendor/github.com/coreos/etcd/auth/authpb/auth.pb.go +++ b/vendor/github.com/coreos/etcd/auth/authpb/auth.pb.go @@ -21,9 +21,9 @@ import ( proto "github.com/golang/protobuf/proto" math "math" -) -import io "io" + io "io" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal diff --git a/vendor/github.com/coreos/etcd/auth/range_perm_cache.go b/vendor/github.com/coreos/etcd/auth/range_perm_cache.go index e5525cd4bc..23db3a5a4d 100644 --- a/vendor/github.com/coreos/etcd/auth/range_perm_cache.go +++ b/vendor/github.com/coreos/etcd/auth/range_perm_cache.go @@ -22,7 +22,10 @@ import ( "github.com/coreos/etcd/mvcc/backend" ) -// isSubset returns true if a is a subset of b +// isSubset returns true if a is a subset of b. +// If a is a prefix of b, then a is a subset of b. +// Given intervals [a1,a2) and [b1,b2), is +// the a interval a subset of b? func isSubset(a, b *rangePerm) bool { switch { case len(a.end) == 0 && len(b.end) == 0: @@ -32,9 +35,11 @@ func isSubset(a, b *rangePerm) bool { // b is a key, a is a range return false case len(a.end) == 0: - return 0 <= bytes.Compare(a.begin, b.begin) && bytes.Compare(a.begin, b.end) <= 0 + // a is a key, b is a range. need b1 <= a1 and a1 < b2 + return bytes.Compare(b.begin, a.begin) <= 0 && bytes.Compare(a.begin, b.end) < 0 default: - return 0 <= bytes.Compare(a.begin, b.begin) && bytes.Compare(a.end, b.end) <= 0 + // both are ranges. need b1 <= a1 and a2 <= b2 + return bytes.Compare(b.begin, a.begin) <= 0 && bytes.Compare(a.end, b.end) <= 0 } } @@ -88,12 +93,18 @@ func mergeRangePerms(perms []*rangePerm) []*rangePerm { i := 0 for i < len(perms) { begin, next := i, i - for next+1 < len(perms) && bytes.Compare(perms[next].end, perms[next+1].begin) != -1 { + for next+1 < len(perms) && bytes.Compare(perms[next].end, perms[next+1].begin) >= 0 { next++ } - - merged = append(merged, &rangePerm{begin: perms[begin].begin, end: perms[next].end}) - + // don't merge ["a", "b") with ["b", ""), because perms[next+1].end is empty. + if next != begin && len(perms[next].end) > 0 { + merged = append(merged, &rangePerm{begin: perms[begin].begin, end: perms[next].end}) + } else { + merged = append(merged, perms[begin]) + if next != begin { + merged = append(merged, perms[next]) + } + } i = next + 1 } diff --git a/vendor/github.com/coreos/etcd/clientv3/balancer.go b/vendor/github.com/coreos/etcd/clientv3/balancer.go index b7fba6a204..7e8d957f9c 100644 --- a/vendor/github.com/coreos/etcd/clientv3/balancer.go +++ b/vendor/github.com/coreos/etcd/clientv3/balancer.go @@ -45,6 +45,8 @@ type simpleBalancer struct { // pinAddr is the currently pinned address; set to the empty string on // intialization and shutdown. pinAddr string + + closed bool } func newSimpleBalancer(eps []string) *simpleBalancer { @@ -74,15 +76,25 @@ func (b *simpleBalancer) ConnectNotify() <-chan struct{} { func (b *simpleBalancer) Up(addr grpc.Address) func(error) { b.mu.Lock() + defer b.mu.Unlock() + + // gRPC might call Up after it called Close. We add this check + // to "fix" it up at application layer. Or our simplerBalancer + // might panic since b.upc is closed. + if b.closed { + return func(err error) {} + } + if len(b.upEps) == 0 { // notify waiting Get()s and pin first connected address close(b.upc) b.pinAddr = addr.Addr } b.upEps[addr.Addr] = struct{}{} - b.mu.Unlock() + // notify client that a connection is up b.readyOnce.Do(func() { close(b.readyc) }) + return func(err error) { b.mu.Lock() delete(b.upEps, addr.Addr) @@ -128,13 +140,19 @@ func (b *simpleBalancer) Notify() <-chan []grpc.Address { return b.notifyCh } func (b *simpleBalancer) Close() error { b.mu.Lock() + defer b.mu.Unlock() + // In case gRPC calls close twice. TODO: remove the checking + // when we are sure that gRPC wont call close twice. + if b.closed { + return nil + } + b.closed = true close(b.notifyCh) // terminate all waiting Get()s b.pinAddr = "" if len(b.upEps) == 0 { close(b.upc) } - b.mu.Unlock() return nil } diff --git a/vendor/github.com/coreos/etcd/clientv3/kv.go b/vendor/github.com/coreos/etcd/clientv3/kv.go index 27f9110f80..5849129858 100644 --- a/vendor/github.com/coreos/etcd/clientv3/kv.go +++ b/vendor/github.com/coreos/etcd/clientv3/kv.go @@ -157,14 +157,14 @@ func (kv *kv) do(ctx context.Context, op Op) (OpResponse, error) { } case tPut: var resp *pb.PutResponse - r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID)} + r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID), PrevKv: op.prevKV} resp, err = kv.remote.Put(ctx, r) if err == nil { return OpResponse{put: (*PutResponse)(resp)}, nil } case tDeleteRange: var resp *pb.DeleteRangeResponse - r := &pb.DeleteRangeRequest{Key: op.key, RangeEnd: op.end} + r := &pb.DeleteRangeRequest{Key: op.key, RangeEnd: op.end, PrevKv: op.prevKV} resp, err = kv.remote.DeleteRange(ctx, r) if err == nil { return OpResponse{del: (*DeleteResponse)(resp)}, nil diff --git a/vendor/github.com/coreos/etcd/clientv3/op.go b/vendor/github.com/coreos/etcd/clientv3/op.go index 89698be234..e2afdd5283 100644 --- a/vendor/github.com/coreos/etcd/clientv3/op.go +++ b/vendor/github.com/coreos/etcd/clientv3/op.go @@ -47,6 +47,9 @@ type Op struct { // for range, watch rev int64 + // for watch, put, delete + prevKV bool + // progressNotify is for progress updates. progressNotify bool @@ -73,10 +76,10 @@ func (op Op) toRequestOp() *pb.RequestOp { } return &pb.RequestOp{Request: &pb.RequestOp_RequestRange{RequestRange: r}} case tPut: - r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID)} + r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID), PrevKv: op.prevKV} return &pb.RequestOp{Request: &pb.RequestOp_RequestPut{RequestPut: r}} case tDeleteRange: - r := &pb.DeleteRangeRequest{Key: op.key, RangeEnd: op.end} + r := &pb.DeleteRangeRequest{Key: op.key, RangeEnd: op.end, PrevKv: op.prevKV} return &pb.RequestOp{Request: &pb.RequestOp_RequestDeleteRange{RequestDeleteRange: r}} default: panic("Unknown Op") @@ -271,3 +274,11 @@ func WithProgressNotify() OpOption { op.progressNotify = true } } + +// WithPrevKV gets the previous key-value pair before the event happens. If the previous KV is already compacted, +// nothing will be returned. +func WithPrevKV() OpOption { + return func(op *Op) { + op.prevKV = true + } +} diff --git a/vendor/github.com/coreos/etcd/clientv3/watch.go b/vendor/github.com/coreos/etcd/clientv3/watch.go index afcc3b1afa..10b97f2ee7 100644 --- a/vendor/github.com/coreos/etcd/clientv3/watch.go +++ b/vendor/github.com/coreos/etcd/clientv3/watch.go @@ -61,6 +61,9 @@ type WatchResponse struct { // the channel sends a final response that has Canceled set to true with a non-nil Err(). Canceled bool + // created is used to indicate the creation of the watcher. + created bool + closeErr error } @@ -89,7 +92,7 @@ func (wr *WatchResponse) Err() error { // IsProgressNotify returns true if the WatchResponse is progress notification. func (wr *WatchResponse) IsProgressNotify() bool { - return len(wr.Events) == 0 && !wr.Canceled + return len(wr.Events) == 0 && !wr.Canceled && !wr.created && wr.CompactRevision == 0 && wr.Header.Revision != 0 } // watcher implements the Watcher interface @@ -102,6 +105,7 @@ type watcher struct { streams map[string]*watchGrpcStream } +// watchGrpcStream tracks all watch resources attached to a single grpc stream. type watchGrpcStream struct { owner *watcher remote pb.WatchClient @@ -112,10 +116,10 @@ type watchGrpcStream struct { ctxKey string cancel context.CancelFunc - // mu protects the streams map - mu sync.RWMutex - // streams holds all active watchers - streams map[int64]*watcherStream + // substreams holds all active watchers on this grpc stream + substreams map[int64]*watcherStream + // resuming holds all resuming watchers on this grpc stream + resuming []*watcherStream // reqc sends a watch request from Watch() to the main goroutine reqc chan *watchRequest @@ -127,8 +131,12 @@ type watchGrpcStream struct { donec chan struct{} // errc transmits errors from grpc Recv to the watch stream reconn logic errc chan error + // closingc gets the watcherStream of closing watchers + closingc chan *watcherStream - // the error that closed the watch stream + // resumec closes to signal that all substreams should begin resuming + resumec chan struct{} + // closeErr is the error that closed the watch stream closeErr error } @@ -140,6 +148,8 @@ type watchRequest struct { rev int64 // progressNotify is for progress updates. progressNotify bool + // get the previous key-value pair before the event happens + prevKV bool // retc receives a chan WatchResponse once the watcher is established retc chan chan WatchResponse } @@ -150,15 +160,18 @@ type watcherStream struct { initReq watchRequest // outc publishes watch responses to subscriber - outc chan<- WatchResponse + outc chan WatchResponse // recvc buffers watch responses before publishing recvc chan *WatchResponse - id int64 + // donec closes when the watcherStream goroutine stops. + donec chan struct{} + // closing is set to true when stream should be scheduled to shutdown. + closing bool + // id is the registered watch id on the grpc stream + id int64 - // lastRev is revision last successfully sent over outc - lastRev int64 - // resumec indicates the stream must recover at a given revision - resumec chan int64 + // buf holds all events received from etcd but not yet consumed by the client + buf []*WatchResponse } func NewWatcher(c *Client) Watcher { @@ -182,18 +195,20 @@ func (vc *valCtx) Err() error { return nil } func (w *watcher) newWatcherGrpcStream(inctx context.Context) *watchGrpcStream { ctx, cancel := context.WithCancel(&valCtx{inctx}) wgs := &watchGrpcStream{ - owner: w, - remote: w.remote, - ctx: ctx, - ctxKey: fmt.Sprintf("%v", inctx), - cancel: cancel, - streams: make(map[int64]*watcherStream), + owner: w, + remote: w.remote, + ctx: ctx, + ctxKey: fmt.Sprintf("%v", inctx), + cancel: cancel, + substreams: make(map[int64]*watcherStream), - respc: make(chan *pb.WatchResponse), - reqc: make(chan *watchRequest), - stopc: make(chan struct{}), - donec: make(chan struct{}), - errc: make(chan error, 1), + respc: make(chan *pb.WatchResponse), + reqc: make(chan *watchRequest), + stopc: make(chan struct{}), + donec: make(chan struct{}), + errc: make(chan error, 1), + closingc: make(chan *watcherStream), + resumec: make(chan struct{}), } go wgs.run() return wgs @@ -203,14 +218,14 @@ func (w *watcher) newWatcherGrpcStream(inctx context.Context) *watchGrpcStream { func (w *watcher) Watch(ctx context.Context, key string, opts ...OpOption) WatchChan { ow := opWatch(key, opts...) - retc := make(chan chan WatchResponse, 1) wr := &watchRequest{ ctx: ctx, key: string(ow.key), end: string(ow.end), rev: ow.rev, progressNotify: ow.progressNotify, - retc: retc, + prevKV: ow.prevKV, + retc: make(chan chan WatchResponse, 1), } ok := false @@ -242,7 +257,6 @@ func (w *watcher) Watch(ctx context.Context, key string, opts ...OpOption) Watch case reqc <- wr: ok = true case <-wr.ctx.Done(): - wgs.stopIfEmpty() case <-donec: if wgs.closeErr != nil { closeCh <- WatchResponse{closeErr: wgs.closeErr} @@ -255,7 +269,7 @@ func (w *watcher) Watch(ctx context.Context, key string, opts ...OpOption) Watch // receive channel if ok { select { - case ret := <-retc: + case ret := <-wr.retc: return ret case <-ctx.Done(): case <-donec: @@ -286,12 +300,7 @@ func (w *watcher) Close() (err error) { } func (w *watchGrpcStream) Close() (err error) { - w.mu.Lock() - if w.stopc != nil { - close(w.stopc) - w.stopc = nil - } - w.mu.Unlock() + close(w.stopc) <-w.donec select { case err = <-w.errc: @@ -300,67 +309,57 @@ func (w *watchGrpcStream) Close() (err error) { return toErr(w.ctx, err) } -func (w *watchGrpcStream) addStream(resp *pb.WatchResponse, pendingReq *watchRequest) { - if pendingReq == nil { - // no pending request; ignore - return - } - if resp.Canceled || resp.CompactRevision != 0 { - // a cancel at id creation time means the start revision has - // been compacted out of the store - ret := make(chan WatchResponse, 1) - ret <- WatchResponse{ - Header: *resp.Header, - CompactRevision: resp.CompactRevision, - Canceled: true} - close(ret) - pendingReq.retc <- ret - return - } - - ret := make(chan WatchResponse) - if resp.WatchId == -1 { - // failed; no channel - close(ret) - pendingReq.retc <- ret - return - } - - ws := &watcherStream{ - initReq: *pendingReq, - id: resp.WatchId, - outc: ret, - // buffered so unlikely to block on sending while holding mu - recvc: make(chan *WatchResponse, 4), - resumec: make(chan int64), - } - - if pendingReq.rev == 0 { - // note the header revision so that a put following a current watcher - // disconnect will arrive on the watcher channel after reconnect - ws.initReq.rev = resp.Header.Revision - } - +func (w *watcher) closeStream(wgs *watchGrpcStream) { w.mu.Lock() - w.streams[ws.id] = ws + close(wgs.donec) + wgs.cancel() + if w.streams != nil { + delete(w.streams, wgs.ctxKey) + } w.mu.Unlock() - - // pass back the subscriber channel for the watcher - pendingReq.retc <- ret - - // send messages to subscriber - go w.serveStream(ws) } -// closeStream closes the watcher resources and removes it -func (w *watchGrpcStream) closeStream(ws *watcherStream) { - w.mu.Lock() - // cancels request stream; subscriber receives nil channel - close(ws.initReq.retc) - // close subscriber's channel +func (w *watchGrpcStream) addSubstream(resp *pb.WatchResponse, ws *watcherStream) { + if resp.WatchId == -1 { + // failed; no channel + close(ws.recvc) + return + } + ws.id = resp.WatchId + w.substreams[ws.id] = ws +} + +func (w *watchGrpcStream) sendCloseSubstream(ws *watcherStream, resp *WatchResponse) { + select { + case ws.outc <- *resp: + case <-ws.initReq.ctx.Done(): + case <-time.After(closeSendErrTimeout): + } close(ws.outc) - delete(w.streams, ws.id) - w.mu.Unlock() +} + +func (w *watchGrpcStream) closeSubstream(ws *watcherStream) { + // send channel response in case stream was never established + select { + case ws.initReq.retc <- ws.outc: + default: + } + // close subscriber's channel + if closeErr := w.closeErr; closeErr != nil && ws.initReq.ctx.Err() == nil { + go w.sendCloseSubstream(ws, &WatchResponse{closeErr: w.closeErr}) + } else { + close(ws.outc) + } + if ws.id != -1 { + delete(w.substreams, ws.id) + return + } + for i := range w.resuming { + if w.resuming[i] == ws { + w.resuming[i] = nil + return + } + } } // run is the root of the goroutines for managing a watcher client @@ -368,66 +367,79 @@ func (w *watchGrpcStream) run() { var wc pb.Watch_WatchClient var closeErr error - defer func() { - w.owner.mu.Lock() - w.closeErr = closeErr - if w.owner.streams != nil { - delete(w.owner.streams, w.ctxKey) - } - close(w.donec) - w.owner.mu.Unlock() - w.cancel() - }() + // substreams marked to close but goroutine still running; needed for + // avoiding double-closing recvc on grpc stream teardown + closing := make(map[*watcherStream]struct{}) - // already stopped? - w.mu.RLock() - stopc := w.stopc - w.mu.RUnlock() - if stopc == nil { - return - } + defer func() { + w.closeErr = closeErr + // shutdown substreams and resuming substreams + for _, ws := range w.substreams { + if _, ok := closing[ws]; !ok { + close(ws.recvc) + } + } + for _, ws := range w.resuming { + if _, ok := closing[ws]; ws != nil && !ok { + close(ws.recvc) + } + } + w.joinSubstreams() + for toClose := len(w.substreams) + len(w.resuming); toClose > 0; toClose-- { + w.closeSubstream(<-w.closingc) + } + + w.owner.closeStream(w) + }() // start a stream with the etcd grpc server if wc, closeErr = w.newWatchClient(); closeErr != nil { return } - var pendingReq, failedReq *watchRequest - curReqC := w.reqc cancelSet := make(map[int64]struct{}) for { select { // Watch() requested - case pendingReq = <-curReqC: - // no more watch requests until there's a response - curReqC = nil - if err := wc.Send(pendingReq.toPB()); err == nil { - // pendingReq now waits on w.respc - break + case wreq := <-w.reqc: + outc := make(chan WatchResponse, 1) + ws := &watcherStream{ + initReq: *wreq, + id: -1, + outc: outc, + // unbufffered so resumes won't cause repeat events + recvc: make(chan *WatchResponse), + } + + ws.donec = make(chan struct{}) + go w.serveSubstream(ws, w.resumec) + + // queue up for watcher creation/resume + w.resuming = append(w.resuming, ws) + if len(w.resuming) == 1 { + // head of resume queue, can register a new watcher + wc.Send(ws.initReq.toPB()) } - failedReq = pendingReq // New events from the watch client case pbresp := <-w.respc: switch { case pbresp.Created: - // response to pending req, try to add - w.addStream(pbresp, pendingReq) - pendingReq = nil - curReqC = w.reqc + // response to head of queue creation + if ws := w.resuming[0]; ws != nil { + w.addSubstream(pbresp, ws) + w.dispatchEvent(pbresp) + w.resuming[0] = nil + } + if ws := w.nextResume(); ws != nil { + wc.Send(ws.initReq.toPB()) + } case pbresp.Canceled: delete(cancelSet, pbresp.WatchId) - // shutdown serveStream, if any - w.mu.Lock() - if ws, ok := w.streams[pbresp.WatchId]; ok { + if ws, ok := w.substreams[pbresp.WatchId]; ok { + // signal to stream goroutine to update closingc close(ws.recvc) - delete(w.streams, ws.id) - } - numStreams := len(w.streams) - w.mu.Unlock() - if numStreams == 0 { - // don't leak watcher streams - return + closing[ws] = struct{}{} } default: // dispatch to appropriate watch stream @@ -448,7 +460,6 @@ func (w *watchGrpcStream) run() { wc.Send(req) } // watch client failed to recv; spawn another if possible - // TODO report watch client errors from errc? case err := <-w.errc: if toErr(w.ctx, err) == v3rpc.ErrNoLeader { closeErr = err @@ -457,48 +468,58 @@ func (w *watchGrpcStream) run() { if wc, closeErr = w.newWatchClient(); closeErr != nil { return } - curReqC = w.reqc - if pendingReq != nil { - failedReq = pendingReq + if ws := w.nextResume(); ws != nil { + wc.Send(ws.initReq.toPB()) } cancelSet = make(map[int64]struct{}) - case <-stopc: + case <-w.stopc: return - } - - // send failed; queue for retry - if failedReq != nil { - go func(wr *watchRequest) { - select { - case w.reqc <- wr: - case <-wr.ctx.Done(): - case <-w.donec: - } - }(pendingReq) - failedReq = nil - pendingReq = nil + case ws := <-w.closingc: + w.closeSubstream(ws) + delete(closing, ws) + if len(w.substreams)+len(w.resuming) == 0 { + // no more watchers on this stream, shutdown + return + } } } } +// nextResume chooses the next resuming to register with the grpc stream. Abandoned +// streams are marked as nil in the queue since the head must wait for its inflight registration. +func (w *watchGrpcStream) nextResume() *watcherStream { + for len(w.resuming) != 0 { + if w.resuming[0] != nil { + return w.resuming[0] + } + w.resuming = w.resuming[1:len(w.resuming)] + } + return nil +} + // dispatchEvent sends a WatchResponse to the appropriate watcher stream func (w *watchGrpcStream) dispatchEvent(pbresp *pb.WatchResponse) bool { - w.mu.RLock() - defer w.mu.RUnlock() - ws, ok := w.streams[pbresp.WatchId] + ws, ok := w.substreams[pbresp.WatchId] + if !ok { + return false + } events := make([]*Event, len(pbresp.Events)) for i, ev := range pbresp.Events { events[i] = (*Event)(ev) } - if ok { - wr := &WatchResponse{ - Header: *pbresp.Header, - Events: events, - CompactRevision: pbresp.CompactRevision, - Canceled: pbresp.Canceled} - ws.recvc <- wr + wr := &WatchResponse{ + Header: *pbresp.Header, + Events: events, + CompactRevision: pbresp.CompactRevision, + created: pbresp.Created, + Canceled: pbresp.Canceled, } - return ok + select { + case ws.recvc <- wr: + case <-ws.donec: + return false + } + return true } // serveWatchClient forwards messages from the grpc stream to run() @@ -520,134 +541,123 @@ func (w *watchGrpcStream) serveWatchClient(wc pb.Watch_WatchClient) { } } -// serveStream forwards watch responses from run() to the subscriber -func (w *watchGrpcStream) serveStream(ws *watcherStream) { - var closeErr error - emptyWr := &WatchResponse{} - wrs := []*WatchResponse{} +// serveSubstream forwards watch responses from run() to the subscriber +func (w *watchGrpcStream) serveSubstream(ws *watcherStream, resumec chan struct{}) { + if ws.closing { + panic("created substream goroutine but substream is closing") + } + + // nextRev is the minimum expected next revision + nextRev := ws.initReq.rev resuming := false - closing := false - for !closing { + defer func() { + if !resuming { + ws.closing = true + } + close(ws.donec) + if !resuming { + w.closingc <- ws + } + }() + + emptyWr := &WatchResponse{} + for { curWr := emptyWr outc := ws.outc - if len(wrs) > 0 { - curWr = wrs[0] + + if len(ws.buf) > 0 && ws.buf[0].created { + select { + case ws.initReq.retc <- ws.outc: + default: + } + ws.buf = ws.buf[1:] + } + + if len(ws.buf) > 0 { + curWr = ws.buf[0] } else { outc = nil } select { case outc <- *curWr: - if wrs[0].Err() != nil { - closing = true - break - } - var newRev int64 - if len(wrs[0].Events) > 0 { - newRev = wrs[0].Events[len(wrs[0].Events)-1].Kv.ModRevision - } else { - newRev = wrs[0].Header.Revision - } - if newRev != ws.lastRev { - ws.lastRev = newRev - } - wrs[0] = nil - wrs = wrs[1:] - case wr, ok := <-ws.recvc: - if !ok { - // shutdown from closeStream + if ws.buf[0].Err() != nil { return } - // resume up to last seen event if disconnected - if resuming && wr.Err() == nil { - resuming = false - // trim events already seen - for i := 0; i < len(wr.Events); i++ { - if wr.Events[i].Kv.ModRevision > ws.lastRev { - wr.Events = wr.Events[i:] - break - } - } - // only forward new events - if wr.Events[0].Kv.ModRevision == ws.lastRev { - break - } + ws.buf[0] = nil + ws.buf = ws.buf[1:] + case wr, ok := <-ws.recvc: + if !ok { + // shutdown from closeSubstream + return } - resuming = false - // TODO don't keep buffering if subscriber stops reading - wrs = append(wrs, wr) - case resumeRev := <-ws.resumec: - wrs = nil - resuming = true - if resumeRev == -1 { - // pause serving stream while resume gets set up - break + // TODO pause channel if buffer gets too large + ws.buf = append(ws.buf, wr) + nextRev = wr.Header.Revision + if len(wr.Events) > 0 { + nextRev = wr.Events[len(wr.Events)-1].Kv.ModRevision + 1 } - if resumeRev != ws.lastRev { - panic("unexpected resume revision") - } - case <-w.donec: - closing = true - closeErr = w.closeErr + ws.initReq.rev = nextRev case <-ws.initReq.ctx.Done(): - closing = true + return + case <-resumec: + resuming = true + return } } - - // try to send off close error - if closeErr != nil { - select { - case ws.outc <- WatchResponse{closeErr: w.closeErr}: - case <-w.donec: - case <-time.After(closeSendErrTimeout): - } - } - - w.closeStream(ws) - w.stopIfEmpty() // lazily send cancel message if events on missing id } -func (wgs *watchGrpcStream) stopIfEmpty() { - wgs.mu.Lock() - if len(wgs.streams) == 0 && wgs.stopc != nil { - close(wgs.stopc) - wgs.stopc = nil - } - wgs.mu.Unlock() -} - func (w *watchGrpcStream) newWatchClient() (pb.Watch_WatchClient, error) { - ws, rerr := w.resume() - if rerr != nil { - return nil, rerr + // connect to grpc stream + wc, err := w.openWatchClient() + if err != nil { + return nil, v3rpc.Error(err) } - go w.serveWatchClient(ws) - return ws, nil -} - -// resume creates a new WatchClient with all current watchers reestablished -func (w *watchGrpcStream) resume() (ws pb.Watch_WatchClient, err error) { - for { - if ws, err = w.openWatchClient(); err != nil { - break - } else if err = w.resumeWatchers(ws); err == nil { - break + // mark all substreams as resuming + if len(w.substreams)+len(w.resuming) > 0 { + close(w.resumec) + w.resumec = make(chan struct{}) + w.joinSubstreams() + for _, ws := range w.substreams { + ws.id = -1 + w.resuming = append(w.resuming, ws) + } + for _, ws := range w.resuming { + if ws == nil || ws.closing { + continue + } + ws.donec = make(chan struct{}) + go w.serveSubstream(ws, w.resumec) + } + } + w.substreams = make(map[int64]*watcherStream) + // receive data from new grpc stream + go w.serveWatchClient(wc) + return wc, nil +} + +// joinSubstream waits for all substream goroutines to complete +func (w *watchGrpcStream) joinSubstreams() { + for _, ws := range w.substreams { + <-ws.donec + } + for _, ws := range w.resuming { + if ws != nil { + <-ws.donec } } - return ws, v3rpc.Error(err) } // openWatchClient retries opening a watchclient until retryConnection fails func (w *watchGrpcStream) openWatchClient() (ws pb.Watch_WatchClient, err error) { for { - w.mu.Lock() - stopc := w.stopc - w.mu.Unlock() - if stopc == nil { + select { + case <-w.stopc: if err == nil { - err = context.Canceled + return nil, context.Canceled } return nil, err + default: } if ws, err = w.remote.Watch(w.ctx, grpc.FailFast(false)); ws != nil && err == nil { break @@ -659,48 +669,6 @@ func (w *watchGrpcStream) openWatchClient() (ws pb.Watch_WatchClient, err error) return ws, nil } -// resumeWatchers rebuilds every registered watcher on a new client -func (w *watchGrpcStream) resumeWatchers(wc pb.Watch_WatchClient) error { - w.mu.RLock() - streams := make([]*watcherStream, 0, len(w.streams)) - for _, ws := range w.streams { - streams = append(streams, ws) - } - w.mu.RUnlock() - - for _, ws := range streams { - // pause serveStream - ws.resumec <- -1 - - // reconstruct watcher from initial request - if ws.lastRev != 0 { - ws.initReq.rev = ws.lastRev - } - if err := wc.Send(ws.initReq.toPB()); err != nil { - return err - } - - // wait for request ack - resp, err := wc.Recv() - if err != nil { - return err - } else if len(resp.Events) != 0 || !resp.Created { - return fmt.Errorf("watcher: unexpected response (%+v)", resp) - } - - // id may be different since new remote watcher; update map - w.mu.Lock() - delete(w.streams, ws.id) - ws.id = resp.WatchId - w.streams[ws.id] = ws - w.mu.Unlock() - - // unpause serveStream - ws.resumec <- ws.lastRev - } - return nil -} - // toPB converts an internal watch request structure to its protobuf messagefunc (wr *watchRequest) func (wr *watchRequest) toPB() *pb.WatchRequest { req := &pb.WatchCreateRequest{ @@ -708,6 +676,7 @@ func (wr *watchRequest) toPB() *pb.WatchRequest { Key: []byte(wr.key), RangeEnd: []byte(wr.end), ProgressNotify: wr.progressNotify, + PrevKv: wr.prevKV, } cr := &pb.WatchRequest_CreateRequest{CreateRequest: req} return &pb.WatchRequest{RequestUnion: cr} diff --git a/vendor/github.com/coreos/etcd/discovery/srv.go b/vendor/github.com/coreos/etcd/discovery/srv.go index 4dab356693..83032b8073 100644 --- a/vendor/github.com/coreos/etcd/discovery/srv.go +++ b/vendor/github.com/coreos/etcd/discovery/srv.go @@ -53,8 +53,8 @@ func SRVGetCluster(name, dns string, defaultToken string, apurls types.URLs) (st return err } for _, srv := range addrs { - target := strings.TrimSuffix(srv.Target, ".") - host := net.JoinHostPort(target, fmt.Sprintf("%d", srv.Port)) + port := fmt.Sprintf("%d", srv.Port) + host := net.JoinHostPort(srv.Target, port) tcpAddr, err := resolveTCPAddr("tcp", host) if err != nil { plog.Warningf("couldn't resolve host %s during SRV discovery", host) @@ -70,8 +70,11 @@ func SRVGetCluster(name, dns string, defaultToken string, apurls types.URLs) (st n = fmt.Sprintf("%d", tempName) tempName += 1 } - stringParts = append(stringParts, fmt.Sprintf("%s=%s%s", n, prefix, host)) - plog.Noticef("got bootstrap from DNS for %s at %s%s", service, prefix, host) + // SRV records have a trailing dot but URL shouldn't. + shortHost := strings.TrimSuffix(srv.Target, ".") + urlHost := net.JoinHostPort(shortHost, port) + stringParts = append(stringParts, fmt.Sprintf("%s=%s%s", n, prefix, urlHost)) + plog.Noticef("got bootstrap from DNS for %s at %s%s", service, prefix, urlHost) } return nil } diff --git a/vendor/github.com/coreos/etcd/etcdserver/apply.go b/vendor/github.com/coreos/etcd/etcdserver/apply.go index 820b4fc527..ed2027c82e 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/apply.go +++ b/vendor/github.com/coreos/etcd/etcdserver/apply.go @@ -159,6 +159,22 @@ func (a *applierV3backend) Put(txnID int64, p *pb.PutRequest) (*pb.PutResponse, rev int64 err error ) + + var rr *mvcc.RangeResult + if p.PrevKv { + if txnID != noTxn { + rr, err = a.s.KV().TxnRange(txnID, p.Key, nil, mvcc.RangeOptions{}) + if err != nil { + return nil, err + } + } else { + rr, err = a.s.KV().Range(p.Key, nil, mvcc.RangeOptions{}) + if err != nil { + return nil, err + } + } + } + if txnID != noTxn { rev, err = a.s.KV().TxnPut(txnID, p.Key, p.Value, lease.LeaseID(p.Lease)) if err != nil { @@ -174,6 +190,9 @@ func (a *applierV3backend) Put(txnID int64, p *pb.PutRequest) (*pb.PutResponse, rev = a.s.KV().Put(p.Key, p.Value, leaseID) } resp.Header.Revision = rev + if rr != nil && len(rr.KVs) != 0 { + resp.PrevKv = &rr.KVs[0] + } return resp, nil } @@ -191,6 +210,21 @@ func (a *applierV3backend) DeleteRange(txnID int64, dr *pb.DeleteRangeRequest) ( dr.RangeEnd = []byte{} } + var rr *mvcc.RangeResult + if dr.PrevKv { + if txnID != noTxn { + rr, err = a.s.KV().TxnRange(txnID, dr.Key, dr.RangeEnd, mvcc.RangeOptions{}) + if err != nil { + return nil, err + } + } else { + rr, err = a.s.KV().Range(dr.Key, dr.RangeEnd, mvcc.RangeOptions{}) + if err != nil { + return nil, err + } + } + } + if txnID != noTxn { n, rev, err = a.s.KV().TxnDeleteRange(txnID, dr.Key, dr.RangeEnd) if err != nil { @@ -201,6 +235,11 @@ func (a *applierV3backend) DeleteRange(txnID int64, dr *pb.DeleteRangeRequest) ( } resp.Deleted = n + if rr != nil { + for i := range rr.KVs { + resp.PrevKvs = append(resp.PrevKvs, &rr.KVs[i]) + } + } resp.Header.Revision = rev return resp, nil } diff --git a/vendor/github.com/coreos/etcd/etcdserver/apply_auth.go b/vendor/github.com/coreos/etcd/etcdserver/apply_auth.go index 1a45788950..38bf2b407e 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/apply_auth.go +++ b/vendor/github.com/coreos/etcd/etcdserver/apply_auth.go @@ -56,6 +56,9 @@ func (aa *authApplierV3) Put(txnID int64, r *pb.PutRequest) (*pb.PutResponse, er if !aa.as.IsPutPermitted(aa.user, r.Key) { return nil, auth.ErrPermissionDenied } + if r.PrevKv && !aa.as.IsRangePermitted(aa.user, r.Key, nil) { + return nil, auth.ErrPermissionDenied + } return aa.applierV3.Put(txnID, r) } @@ -70,6 +73,9 @@ func (aa *authApplierV3) DeleteRange(txnID int64, r *pb.DeleteRangeRequest) (*pb if !aa.as.IsDeleteRangePermitted(aa.user, r.Key, r.RangeEnd) { return nil, auth.ErrPermissionDenied } + if r.PrevKv && !aa.as.IsRangePermitted(aa.user, r.Key, r.RangeEnd) { + return nil, auth.ErrPermissionDenied + } return aa.applierV3.DeleteRange(txnID, r) } @@ -99,7 +105,7 @@ func (aa *authApplierV3) checkTxnReqsPermission(reqs []*pb.RequestOp) bool { continue } - if !aa.as.IsDeleteRangePermitted(aa.user, tv.RequestDeleteRange.Key, tv.RequestDeleteRange.RangeEnd) { + if tv.RequestDeleteRange.PrevKv && !aa.as.IsRangePermitted(aa.user, tv.RequestDeleteRange.Key, tv.RequestDeleteRange.RangeEnd) { return false } } diff --git a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/etcdserver.pb.go b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/etcdserver.pb.go index 746e9a116a..ac4be4f6c5 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/etcdserver.pb.go +++ b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/etcdserver.pb.go @@ -102,9 +102,9 @@ import ( proto "github.com/golang/protobuf/proto" math "math" -) -import io "io" + io "io" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal diff --git a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/raft_internal.pb.go b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/raft_internal.pb.go index 068aefff0b..a82e2b2350 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/raft_internal.pb.go +++ b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/raft_internal.pb.go @@ -10,9 +10,9 @@ import ( proto "github.com/golang/protobuf/proto" math "math" -) -import io "io" + io "io" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal diff --git a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/rpc.pb.go b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/rpc.pb.go index 213d544268..1bc62c2eb6 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/rpc.pb.go +++ b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/rpc.pb.go @@ -11,16 +11,15 @@ import ( math "math" + mvccpb "github.com/coreos/etcd/mvcc/mvccpb" + authpb "github.com/coreos/etcd/auth/authpb" - io "io" -) - -import mvccpb "github.com/coreos/etcd/mvcc/mvccpb" - -import ( context "golang.org/x/net/context" + grpc "google.golang.org/grpc" + + io "io" ) // Reference imports to suppress errors if they are not otherwise used. @@ -271,6 +270,9 @@ type PutRequest struct { // lease is the lease ID to associate with the key in the key-value store. A lease // value of 0 indicates no lease. Lease int64 `protobuf:"varint,3,opt,name=lease,proto3" json:"lease,omitempty"` + // If prev_kv is set, etcd gets the previous key-value pair before changing it. + // The previous key-value pair will be returned in the put response. + PrevKv bool `protobuf:"varint,4,opt,name=prev_kv,json=prevKv,proto3" json:"prev_kv,omitempty"` } func (m *PutRequest) Reset() { *m = PutRequest{} } @@ -280,6 +282,8 @@ func (*PutRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []in type PutResponse struct { Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` + // if prev_kv is set in the request, the previous key-value pair will be returned. + PrevKv *mvccpb.KeyValue `protobuf:"bytes,2,opt,name=prev_kv,json=prevKv" json:"prev_kv,omitempty"` } func (m *PutResponse) Reset() { *m = PutResponse{} } @@ -294,6 +298,13 @@ func (m *PutResponse) GetHeader() *ResponseHeader { return nil } +func (m *PutResponse) GetPrevKv() *mvccpb.KeyValue { + if m != nil { + return m.PrevKv + } + return nil +} + type DeleteRangeRequest struct { // key is the first key to delete in the range. Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` @@ -301,6 +312,9 @@ type DeleteRangeRequest struct { // If range_end is not given, the range is defined to contain only the key argument. // If range_end is '\0', the range is all keys greater than or equal to the key argument. RangeEnd []byte `protobuf:"bytes,2,opt,name=range_end,json=rangeEnd,proto3" json:"range_end,omitempty"` + // If prev_kv is set, etcd gets the previous key-value pairs before deleting it. + // The previous key-value pairs will be returned in the delte response. + PrevKv bool `protobuf:"varint,3,opt,name=prev_kv,json=prevKv,proto3" json:"prev_kv,omitempty"` } func (m *DeleteRangeRequest) Reset() { *m = DeleteRangeRequest{} } @@ -312,6 +326,8 @@ type DeleteRangeResponse struct { Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` // deleted is the number of keys deleted by the delete range request. Deleted int64 `protobuf:"varint,2,opt,name=deleted,proto3" json:"deleted,omitempty"` + // if prev_kv is set in the request, the previous key-value pairs will be returned. + PrevKvs []*mvccpb.KeyValue `protobuf:"bytes,3,rep,name=prev_kvs,json=prevKvs" json:"prev_kvs,omitempty"` } func (m *DeleteRangeResponse) Reset() { *m = DeleteRangeResponse{} } @@ -326,6 +342,13 @@ func (m *DeleteRangeResponse) GetHeader() *ResponseHeader { return nil } +func (m *DeleteRangeResponse) GetPrevKvs() []*mvccpb.KeyValue { + if m != nil { + return m.PrevKvs + } + return nil +} + type RequestOp struct { // request is a union of request types accepted by a transaction. // @@ -1119,6 +1142,9 @@ type WatchCreateRequest struct { // wish to recover a disconnected watcher starting from a recent known revision. // The etcd server may decide how often it will send notifications based on current load. ProgressNotify bool `protobuf:"varint,4,opt,name=progress_notify,json=progressNotify,proto3" json:"progress_notify,omitempty"` + // If prev_kv is set, created watcher gets the previous KV before the event happens. + // If the previous KV is already compacted, nothing will be returned. + PrevKv bool `protobuf:"varint,6,opt,name=prev_kv,json=prevKv,proto3" json:"prev_kv,omitempty"` } func (m *WatchCreateRequest) Reset() { *m = WatchCreateRequest{} } @@ -3765,6 +3791,16 @@ func (m *PutRequest) MarshalTo(data []byte) (int, error) { i++ i = encodeVarintRpc(data, i, uint64(m.Lease)) } + if m.PrevKv { + data[i] = 0x20 + i++ + if m.PrevKv { + data[i] = 1 + } else { + data[i] = 0 + } + i++ + } return i, nil } @@ -3793,6 +3829,16 @@ func (m *PutResponse) MarshalTo(data []byte) (int, error) { } i += n2 } + if m.PrevKv != nil { + data[i] = 0x12 + i++ + i = encodeVarintRpc(data, i, uint64(m.PrevKv.Size())) + n3, err := m.PrevKv.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n3 + } return i, nil } @@ -3823,6 +3869,16 @@ func (m *DeleteRangeRequest) MarshalTo(data []byte) (int, error) { i = encodeVarintRpc(data, i, uint64(len(m.RangeEnd))) i += copy(data[i:], m.RangeEnd) } + if m.PrevKv { + data[i] = 0x18 + i++ + if m.PrevKv { + data[i] = 1 + } else { + data[i] = 0 + } + i++ + } return i, nil } @@ -3845,17 +3901,29 @@ func (m *DeleteRangeResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n3, err := m.Header.MarshalTo(data[i:]) + n4, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n3 + i += n4 } if m.Deleted != 0 { data[i] = 0x10 i++ i = encodeVarintRpc(data, i, uint64(m.Deleted)) } + if len(m.PrevKvs) > 0 { + for _, msg := range m.PrevKvs { + data[i] = 0x1a + i++ + i = encodeVarintRpc(data, i, uint64(msg.Size())) + n, err := msg.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -3875,11 +3943,11 @@ func (m *RequestOp) MarshalTo(data []byte) (int, error) { var l int _ = l if m.Request != nil { - nn4, err := m.Request.MarshalTo(data[i:]) + nn5, err := m.Request.MarshalTo(data[i:]) if err != nil { return 0, err } - i += nn4 + i += nn5 } return i, nil } @@ -3890,11 +3958,11 @@ func (m *RequestOp_RequestRange) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.RequestRange.Size())) - n5, err := m.RequestRange.MarshalTo(data[i:]) + n6, err := m.RequestRange.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n5 + i += n6 } return i, nil } @@ -3904,11 +3972,11 @@ func (m *RequestOp_RequestPut) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintRpc(data, i, uint64(m.RequestPut.Size())) - n6, err := m.RequestPut.MarshalTo(data[i:]) + n7, err := m.RequestPut.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n6 + i += n7 } return i, nil } @@ -3918,11 +3986,11 @@ func (m *RequestOp_RequestDeleteRange) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintRpc(data, i, uint64(m.RequestDeleteRange.Size())) - n7, err := m.RequestDeleteRange.MarshalTo(data[i:]) + n8, err := m.RequestDeleteRange.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n7 + i += n8 } return i, nil } @@ -3942,11 +4010,11 @@ func (m *ResponseOp) MarshalTo(data []byte) (int, error) { var l int _ = l if m.Response != nil { - nn8, err := m.Response.MarshalTo(data[i:]) + nn9, err := m.Response.MarshalTo(data[i:]) if err != nil { return 0, err } - i += nn8 + i += nn9 } return i, nil } @@ -3957,11 +4025,11 @@ func (m *ResponseOp_ResponseRange) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.ResponseRange.Size())) - n9, err := m.ResponseRange.MarshalTo(data[i:]) + n10, err := m.ResponseRange.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n9 + i += n10 } return i, nil } @@ -3971,11 +4039,11 @@ func (m *ResponseOp_ResponsePut) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintRpc(data, i, uint64(m.ResponsePut.Size())) - n10, err := m.ResponsePut.MarshalTo(data[i:]) + n11, err := m.ResponsePut.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n10 + i += n11 } return i, nil } @@ -3985,11 +4053,11 @@ func (m *ResponseOp_ResponseDeleteRange) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintRpc(data, i, uint64(m.ResponseDeleteRange.Size())) - n11, err := m.ResponseDeleteRange.MarshalTo(data[i:]) + n12, err := m.ResponseDeleteRange.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n11 + i += n12 } return i, nil } @@ -4025,11 +4093,11 @@ func (m *Compare) MarshalTo(data []byte) (int, error) { i += copy(data[i:], m.Key) } if m.TargetUnion != nil { - nn12, err := m.TargetUnion.MarshalTo(data[i:]) + nn13, err := m.TargetUnion.MarshalTo(data[i:]) if err != nil { return 0, err } - i += nn12 + i += nn13 } return i, nil } @@ -4138,11 +4206,11 @@ func (m *TxnResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n13, err := m.Header.MarshalTo(data[i:]) + n14, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n13 + i += n14 } if m.Succeeded { data[i] = 0x10 @@ -4221,11 +4289,11 @@ func (m *CompactionResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n14, err := m.Header.MarshalTo(data[i:]) + n15, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n14 + i += n15 } return i, nil } @@ -4267,11 +4335,11 @@ func (m *HashResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n15, err := m.Header.MarshalTo(data[i:]) + n16, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n15 + i += n16 } if m.Hash != 0 { data[i] = 0x10 @@ -4318,11 +4386,11 @@ func (m *SnapshotResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n16, err := m.Header.MarshalTo(data[i:]) + n17, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n16 + i += n17 } if m.RemainingBytes != 0 { data[i] = 0x10 @@ -4354,11 +4422,11 @@ func (m *WatchRequest) MarshalTo(data []byte) (int, error) { var l int _ = l if m.RequestUnion != nil { - nn17, err := m.RequestUnion.MarshalTo(data[i:]) + nn18, err := m.RequestUnion.MarshalTo(data[i:]) if err != nil { return 0, err } - i += nn17 + i += nn18 } return i, nil } @@ -4369,11 +4437,11 @@ func (m *WatchRequest_CreateRequest) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.CreateRequest.Size())) - n18, err := m.CreateRequest.MarshalTo(data[i:]) + n19, err := m.CreateRequest.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n18 + i += n19 } return i, nil } @@ -4383,11 +4451,11 @@ func (m *WatchRequest_CancelRequest) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintRpc(data, i, uint64(m.CancelRequest.Size())) - n19, err := m.CancelRequest.MarshalTo(data[i:]) + n20, err := m.CancelRequest.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n19 + i += n20 } return i, nil } @@ -4433,6 +4501,16 @@ func (m *WatchCreateRequest) MarshalTo(data []byte) (int, error) { } i++ } + if m.PrevKv { + data[i] = 0x30 + i++ + if m.PrevKv { + data[i] = 1 + } else { + data[i] = 0 + } + i++ + } return i, nil } @@ -4478,11 +4556,11 @@ func (m *WatchResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n20, err := m.Header.MarshalTo(data[i:]) + n21, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n20 + i += n21 } if m.WatchId != 0 { data[i] = 0x10 @@ -4576,11 +4654,11 @@ func (m *LeaseGrantResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n21, err := m.Header.MarshalTo(data[i:]) + n22, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n21 + i += n22 } if m.ID != 0 { data[i] = 0x10 @@ -4643,11 +4721,11 @@ func (m *LeaseRevokeResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n22, err := m.Header.MarshalTo(data[i:]) + n23, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n22 + i += n23 } return i, nil } @@ -4694,11 +4772,11 @@ func (m *LeaseKeepAliveResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n23, err := m.Header.MarshalTo(data[i:]) + n24, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n23 + i += n24 } if m.ID != 0 { data[i] = 0x10 @@ -4824,21 +4902,21 @@ func (m *MemberAddResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n24, err := m.Header.MarshalTo(data[i:]) + n25, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n24 + i += n25 } if m.Member != nil { data[i] = 0x12 i++ i = encodeVarintRpc(data, i, uint64(m.Member.Size())) - n25, err := m.Member.MarshalTo(data[i:]) + n26, err := m.Member.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n25 + i += n26 } return i, nil } @@ -4885,11 +4963,11 @@ func (m *MemberRemoveResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n26, err := m.Header.MarshalTo(data[i:]) + n27, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n26 + i += n27 } return i, nil } @@ -4951,11 +5029,11 @@ func (m *MemberUpdateResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n27, err := m.Header.MarshalTo(data[i:]) + n28, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n27 + i += n28 } return i, nil } @@ -4997,11 +5075,11 @@ func (m *MemberListResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n28, err := m.Header.MarshalTo(data[i:]) + n29, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n28 + i += n29 } if len(m.Members) > 0 { for _, msg := range m.Members { @@ -5055,11 +5133,11 @@ func (m *DefragmentResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n29, err := m.Header.MarshalTo(data[i:]) + n30, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n29 + i += n30 } return i, nil } @@ -5144,11 +5222,11 @@ func (m *AlarmResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n30, err := m.Header.MarshalTo(data[i:]) + n31, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n30 + i += n31 } if len(m.Alarms) > 0 { for _, msg := range m.Alarms { @@ -5202,11 +5280,11 @@ func (m *StatusResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n31, err := m.Header.MarshalTo(data[i:]) + n32, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n31 + i += n32 } if len(m.Version) > 0 { data[i] = 0x12 @@ -5604,11 +5682,11 @@ func (m *AuthRoleGrantPermissionRequest) MarshalTo(data []byte) (int, error) { data[i] = 0x12 i++ i = encodeVarintRpc(data, i, uint64(m.Perm.Size())) - n32, err := m.Perm.MarshalTo(data[i:]) + n33, err := m.Perm.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n32 + i += n33 } return i, nil } @@ -5668,11 +5746,11 @@ func (m *AuthEnableResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n33, err := m.Header.MarshalTo(data[i:]) + n34, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n33 + i += n34 } return i, nil } @@ -5696,11 +5774,11 @@ func (m *AuthDisableResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n34, err := m.Header.MarshalTo(data[i:]) + n35, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n34 + i += n35 } return i, nil } @@ -5724,11 +5802,11 @@ func (m *AuthenticateResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n35, err := m.Header.MarshalTo(data[i:]) + n36, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n35 + i += n36 } if len(m.Token) > 0 { data[i] = 0x12 @@ -5758,11 +5836,11 @@ func (m *AuthUserAddResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n36, err := m.Header.MarshalTo(data[i:]) + n37, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n36 + i += n37 } return i, nil } @@ -5786,11 +5864,11 @@ func (m *AuthUserGetResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n37, err := m.Header.MarshalTo(data[i:]) + n38, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n37 + i += n38 } if len(m.Roles) > 0 { for _, s := range m.Roles { @@ -5829,11 +5907,11 @@ func (m *AuthUserDeleteResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n38, err := m.Header.MarshalTo(data[i:]) + n39, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n38 + i += n39 } return i, nil } @@ -5857,11 +5935,11 @@ func (m *AuthUserChangePasswordResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n39, err := m.Header.MarshalTo(data[i:]) + n40, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n39 + i += n40 } return i, nil } @@ -5885,11 +5963,11 @@ func (m *AuthUserGrantRoleResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n40, err := m.Header.MarshalTo(data[i:]) + n41, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n40 + i += n41 } return i, nil } @@ -5913,11 +5991,11 @@ func (m *AuthUserRevokeRoleResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n41, err := m.Header.MarshalTo(data[i:]) + n42, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n41 + i += n42 } return i, nil } @@ -5941,11 +6019,11 @@ func (m *AuthRoleAddResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n42, err := m.Header.MarshalTo(data[i:]) + n43, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n42 + i += n43 } return i, nil } @@ -5969,11 +6047,11 @@ func (m *AuthRoleGetResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n43, err := m.Header.MarshalTo(data[i:]) + n44, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n43 + i += n44 } if len(m.Perm) > 0 { for _, msg := range m.Perm { @@ -6009,11 +6087,11 @@ func (m *AuthRoleListResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n44, err := m.Header.MarshalTo(data[i:]) + n45, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n44 + i += n45 } if len(m.Roles) > 0 { for _, s := range m.Roles { @@ -6052,11 +6130,11 @@ func (m *AuthUserListResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n45, err := m.Header.MarshalTo(data[i:]) + n46, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n45 + i += n46 } if len(m.Users) > 0 { for _, s := range m.Users { @@ -6095,11 +6173,11 @@ func (m *AuthRoleDeleteResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n46, err := m.Header.MarshalTo(data[i:]) + n47, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n46 + i += n47 } return i, nil } @@ -6123,11 +6201,11 @@ func (m *AuthRoleGrantPermissionResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n47, err := m.Header.MarshalTo(data[i:]) + n48, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n47 + i += n48 } return i, nil } @@ -6151,11 +6229,11 @@ func (m *AuthRoleRevokePermissionResponse) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintRpc(data, i, uint64(m.Header.Size())) - n48, err := m.Header.MarshalTo(data[i:]) + n49, err := m.Header.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n48 + i += n49 } return i, nil } @@ -6276,6 +6354,9 @@ func (m *PutRequest) Size() (n int) { if m.Lease != 0 { n += 1 + sovRpc(uint64(m.Lease)) } + if m.PrevKv { + n += 2 + } return n } @@ -6286,6 +6367,10 @@ func (m *PutResponse) Size() (n int) { l = m.Header.Size() n += 1 + l + sovRpc(uint64(l)) } + if m.PrevKv != nil { + l = m.PrevKv.Size() + n += 1 + l + sovRpc(uint64(l)) + } return n } @@ -6300,6 +6385,9 @@ func (m *DeleteRangeRequest) Size() (n int) { if l > 0 { n += 1 + l + sovRpc(uint64(l)) } + if m.PrevKv { + n += 2 + } return n } @@ -6313,6 +6401,12 @@ func (m *DeleteRangeResponse) Size() (n int) { if m.Deleted != 0 { n += 1 + sovRpc(uint64(m.Deleted)) } + if len(m.PrevKvs) > 0 { + for _, e := range m.PrevKvs { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } return n } @@ -6585,6 +6679,9 @@ func (m *WatchCreateRequest) Size() (n int) { if m.ProgressNotify { n += 2 } + if m.PrevKv { + n += 2 + } return n } @@ -7923,6 +8020,26 @@ func (m *PutRequest) Unmarshal(data []byte) error { break } } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevKv", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.PrevKv = bool(v != 0) default: iNdEx = preIndex skippy, err := skipRpc(data[iNdEx:]) @@ -8006,6 +8123,39 @@ func (m *PutResponse) Unmarshal(data []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevKv", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PrevKv == nil { + m.PrevKv = &mvccpb.KeyValue{} + } + if err := m.PrevKv.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRpc(data[iNdEx:]) @@ -8118,6 +8268,26 @@ func (m *DeleteRangeRequest) Unmarshal(data []byte) error { m.RangeEnd = []byte{} } iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevKv", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.PrevKv = bool(v != 0) default: iNdEx = preIndex skippy, err := skipRpc(data[iNdEx:]) @@ -8220,6 +8390,37 @@ func (m *DeleteRangeResponse) Unmarshal(data []byte) error { break } } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevKvs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PrevKvs = append(m.PrevKvs, &mvccpb.KeyValue{}) + if err := m.PrevKvs[len(m.PrevKvs)-1].Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRpc(data[iNdEx:]) @@ -9770,6 +9971,26 @@ func (m *WatchCreateRequest) Unmarshal(data []byte) error { } } m.ProgressNotify = bool(v != 0) + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevKv", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.PrevKv = bool(v != 0) default: iNdEx = preIndex skippy, err := skipRpc(data[iNdEx:]) @@ -15125,203 +15346,206 @@ var ( ) var fileDescriptorRpc = []byte{ - // 3154 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x5a, 0xcd, 0x72, 0xe3, 0xc6, - 0xf1, 0x17, 0x48, 0x4a, 0x14, 0x9b, 0x14, 0xc5, 0x1d, 0x69, 0xd7, 0x14, 0x56, 0xab, 0xd5, 0xce, - 0x7e, 0xc9, 0x6b, 0x5b, 0xb4, 0x65, 0xff, 0xff, 0x87, 0x4d, 0xca, 0x55, 0x92, 0xc8, 0xac, 0x64, - 0xc9, 0xd2, 0x1a, 0xd2, 0xca, 0x4e, 0x55, 0x2a, 0x2a, 0x88, 0x9c, 0x25, 0x59, 0x22, 0x01, 0x1a, - 0x00, 0xb9, 0x2b, 0x27, 0xa9, 0x4a, 0xb9, 0xe2, 0x43, 0x72, 0xf5, 0x21, 0x5f, 0xc7, 0x3c, 0x43, - 0x6e, 0x79, 0x80, 0x54, 0x2e, 0x71, 0x55, 0x5e, 0x20, 0xb5, 0xc9, 0x21, 0x87, 0xdc, 0x53, 0x39, - 0xa4, 0x92, 0x9a, 0x2f, 0x60, 0x00, 0x02, 0x94, 0x1c, 0xc4, 0x17, 0x09, 0xd3, 0xd3, 0xd3, 0xbf, - 0x9e, 0x9e, 0xe9, 0x46, 0x77, 0x83, 0x50, 0x70, 0x06, 0xcd, 0xf5, 0x81, 0x63, 0x7b, 0x36, 0x2a, - 0x11, 0xaf, 0xd9, 0x72, 0x89, 0x33, 0x22, 0xce, 0xe0, 0x4c, 0x5f, 0x6c, 0xdb, 0x6d, 0x9b, 0x4d, - 0xd4, 0xe8, 0x13, 0xe7, 0xd1, 0x97, 0x28, 0x4f, 0xad, 0x3f, 0x6a, 0x36, 0xd9, 0x9f, 0xc1, 0x59, - 0xed, 0x7c, 0x24, 0xa6, 0x6e, 0xb2, 0x29, 0x73, 0xe8, 0x75, 0xd8, 0x9f, 0xc1, 0x19, 0xfb, 0x27, - 0x26, 0x97, 0xdb, 0xb6, 0xdd, 0xee, 0x91, 0x9a, 0x39, 0xe8, 0xd6, 0x4c, 0xcb, 0xb2, 0x3d, 0xd3, - 0xeb, 0xda, 0x96, 0xcb, 0x67, 0xf1, 0x17, 0x1a, 0x94, 0x0d, 0xe2, 0x0e, 0x6c, 0xcb, 0x25, 0x3b, - 0xc4, 0x6c, 0x11, 0x07, 0xdd, 0x02, 0x68, 0xf6, 0x86, 0xae, 0x47, 0x9c, 0xd3, 0x6e, 0xab, 0xaa, - 0xad, 0x6a, 0x6b, 0x39, 0xa3, 0x20, 0x28, 0xbb, 0x2d, 0x74, 0x13, 0x0a, 0x7d, 0xd2, 0x3f, 0xe3, - 0xb3, 0x19, 0x36, 0x3b, 0xcb, 0x09, 0xbb, 0x2d, 0xa4, 0xc3, 0xac, 0x43, 0x46, 0x5d, 0xb7, 0x6b, - 0x5b, 0xd5, 0xec, 0xaa, 0xb6, 0x96, 0x35, 0xfc, 0x31, 0x5d, 0xe8, 0x98, 0xcf, 0xbd, 0x53, 0x8f, - 0x38, 0xfd, 0x6a, 0x8e, 0x2f, 0xa4, 0x84, 0x63, 0xe2, 0xf4, 0xf1, 0x57, 0x59, 0x28, 0x19, 0xa6, - 0xd5, 0x26, 0x06, 0xf9, 0x74, 0x48, 0x5c, 0x0f, 0x55, 0x20, 0x7b, 0x4e, 0x2e, 0x18, 0x7c, 0xc9, - 0xa0, 0x8f, 0x7c, 0xbd, 0xd5, 0x26, 0xa7, 0xc4, 0xe2, 0xc0, 0x25, 0xba, 0xde, 0x6a, 0x93, 0x86, - 0xd5, 0x42, 0x8b, 0x30, 0xdd, 0xeb, 0xf6, 0xbb, 0x9e, 0x40, 0xe5, 0x83, 0x90, 0x3a, 0xb9, 0x88, - 0x3a, 0xdb, 0x00, 0xae, 0xed, 0x78, 0xa7, 0xb6, 0xd3, 0x22, 0x4e, 0x75, 0x7a, 0x55, 0x5b, 0x2b, - 0x6f, 0xdc, 0x5b, 0x57, 0x0f, 0x62, 0x5d, 0x55, 0x68, 0xfd, 0xc8, 0x76, 0xbc, 0x43, 0xca, 0x6b, - 0x14, 0x5c, 0xf9, 0x88, 0xbe, 0x03, 0x45, 0x26, 0xc4, 0x33, 0x9d, 0x36, 0xf1, 0xaa, 0x33, 0x4c, - 0xca, 0xfd, 0x4b, 0xa4, 0x1c, 0x33, 0x66, 0x83, 0xc1, 0xf3, 0x67, 0x84, 0xa1, 0xe4, 0x12, 0xa7, - 0x6b, 0xf6, 0xba, 0x9f, 0x99, 0x67, 0x3d, 0x52, 0xcd, 0xaf, 0x6a, 0x6b, 0xb3, 0x46, 0x88, 0x46, - 0xf7, 0x7f, 0x4e, 0x2e, 0xdc, 0x53, 0xdb, 0xea, 0x5d, 0x54, 0x67, 0x19, 0xc3, 0x2c, 0x25, 0x1c, - 0x5a, 0xbd, 0x0b, 0x76, 0x68, 0xf6, 0xd0, 0xf2, 0xf8, 0x6c, 0x81, 0xcd, 0x16, 0x18, 0x85, 0x4e, - 0xe3, 0x75, 0x28, 0xf8, 0xfa, 0xa3, 0x59, 0xc8, 0x1d, 0x1c, 0x1e, 0x34, 0x2a, 0x53, 0x08, 0x60, - 0x66, 0xf3, 0x68, 0xbb, 0x71, 0x50, 0xaf, 0x68, 0xa8, 0x08, 0xf9, 0x7a, 0x83, 0x0f, 0x32, 0x78, - 0x0b, 0x20, 0xd0, 0x14, 0xe5, 0x21, 0xbb, 0xd7, 0xf8, 0x6e, 0x65, 0x8a, 0xf2, 0x9c, 0x34, 0x8c, - 0xa3, 0xdd, 0xc3, 0x83, 0x8a, 0x46, 0x17, 0x6f, 0x1b, 0x8d, 0xcd, 0xe3, 0x46, 0x25, 0x43, 0x39, - 0x3e, 0x3c, 0xac, 0x57, 0xb2, 0xa8, 0x00, 0xd3, 0x27, 0x9b, 0xfb, 0xcf, 0x1a, 0x95, 0x1c, 0xfe, - 0x52, 0x83, 0x39, 0xb1, 0x77, 0x7e, 0xbf, 0xd0, 0x7b, 0x30, 0xd3, 0x61, 0x77, 0x8c, 0x1d, 0x6b, - 0x71, 0x63, 0x39, 0x62, 0xa8, 0xd0, 0x3d, 0x34, 0x04, 0x2f, 0xc2, 0x90, 0x3d, 0x1f, 0xb9, 0xd5, - 0xcc, 0x6a, 0x76, 0xad, 0xb8, 0x51, 0x59, 0xe7, 0x97, 0x7f, 0x7d, 0x8f, 0x5c, 0x9c, 0x98, 0xbd, - 0x21, 0x31, 0xe8, 0x24, 0x42, 0x90, 0xeb, 0xdb, 0x0e, 0x61, 0xa7, 0x3f, 0x6b, 0xb0, 0x67, 0x7a, - 0x25, 0x98, 0x01, 0xc4, 0xc9, 0xf3, 0x01, 0xfe, 0x00, 0xe0, 0xe9, 0xd0, 0x4b, 0xbe, 0x65, 0x8b, - 0x30, 0x3d, 0xa2, 0x72, 0xc5, 0x0d, 0xe3, 0x03, 0x76, 0xbd, 0x88, 0xe9, 0x12, 0xff, 0x7a, 0xd1, - 0x01, 0xde, 0x86, 0x22, 0x93, 0x95, 0x66, 0x7b, 0x78, 0x1b, 0x50, 0x9d, 0xf4, 0x88, 0x47, 0x52, - 0x5c, 0x7f, 0x4c, 0x60, 0x21, 0x24, 0x24, 0x95, 0xc1, 0xab, 0x90, 0x6f, 0x31, 0x61, 0x1c, 0x27, - 0x6b, 0xc8, 0x21, 0xfe, 0xbb, 0x06, 0x05, 0xa1, 0xe1, 0xe1, 0x00, 0x6d, 0xc2, 0x9c, 0xc3, 0x07, - 0xa7, 0x4c, 0x11, 0x01, 0xa2, 0x27, 0x5f, 0xff, 0x9d, 0x29, 0xa3, 0x24, 0x96, 0x30, 0x32, 0xfa, - 0x16, 0x14, 0xa5, 0x88, 0xc1, 0xd0, 0x63, 0x70, 0xc5, 0x8d, 0x6a, 0x58, 0x40, 0x70, 0x5c, 0x3b, - 0x53, 0x06, 0x08, 0xf6, 0xa7, 0x43, 0x0f, 0x1d, 0xc3, 0xa2, 0x5c, 0xcc, 0x15, 0x14, 0x6a, 0x64, - 0x99, 0x94, 0xd5, 0xb0, 0x94, 0x71, 0x1b, 0xef, 0x4c, 0x19, 0x48, 0xac, 0x57, 0x26, 0xb7, 0x0a, - 0x90, 0x17, 0x54, 0xfc, 0x0f, 0x0d, 0x40, 0xda, 0xe8, 0x70, 0x80, 0xea, 0x50, 0x76, 0xc4, 0x28, - 0xb4, 0xe1, 0x9b, 0xb1, 0x1b, 0x16, 0xa6, 0x9d, 0x32, 0xe6, 0xe4, 0x22, 0xbe, 0xe5, 0xf7, 0xa1, - 0xe4, 0x4b, 0x09, 0xf6, 0xbc, 0x14, 0xb3, 0x67, 0x5f, 0x42, 0x51, 0x2e, 0xa0, 0xbb, 0xfe, 0x18, - 0xae, 0xfb, 0xeb, 0x63, 0xb6, 0x7d, 0x67, 0xc2, 0xb6, 0x7d, 0x81, 0x0b, 0x52, 0x82, 0xba, 0x71, - 0xa0, 0xc1, 0x92, 0x93, 0xf1, 0xaf, 0xb2, 0x90, 0xdf, 0xb6, 0xfb, 0x03, 0xd3, 0xa1, 0x67, 0x34, - 0xe3, 0x10, 0x77, 0xd8, 0xf3, 0xd8, 0x76, 0xcb, 0x1b, 0x77, 0xc3, 0x08, 0x82, 0x4d, 0xfe, 0x37, - 0x18, 0xab, 0x21, 0x96, 0xd0, 0xc5, 0x22, 0x36, 0x66, 0xae, 0xb0, 0x58, 0x44, 0x46, 0xb1, 0x44, - 0x3a, 0x41, 0x36, 0x70, 0x02, 0x1d, 0xf2, 0x23, 0xe2, 0x04, 0xf1, 0x7c, 0x67, 0xca, 0x90, 0x04, - 0xf4, 0x3a, 0xcc, 0x37, 0x1d, 0x62, 0x52, 0x7b, 0xc8, 0x98, 0x3f, 0x2d, 0x78, 0xca, 0x7c, 0xc2, - 0x90, 0xb1, 0xff, 0x2e, 0x94, 0xfa, 0x76, 0x2b, 0xe0, 0x9b, 0x11, 0x7c, 0xc5, 0xbe, 0xdd, 0xf2, - 0x99, 0x6e, 0xc8, 0x48, 0x40, 0x83, 0x71, 0x69, 0x67, 0x4a, 0xc4, 0x02, 0xfc, 0x0e, 0xcc, 0x85, - 0xf6, 0x4a, 0x63, 0x5e, 0xe3, 0xa3, 0x67, 0x9b, 0xfb, 0x3c, 0x40, 0x3e, 0x61, 0x31, 0xd1, 0xa8, - 0x68, 0x34, 0xce, 0xee, 0x37, 0x8e, 0x8e, 0x2a, 0x19, 0xfc, 0x6d, 0x7f, 0x89, 0x88, 0xa8, 0x4a, - 0x20, 0x9d, 0x52, 0x02, 0xa9, 0x26, 0x03, 0x69, 0x26, 0x08, 0xa4, 0xd9, 0xad, 0x32, 0x94, 0xb8, - 0x41, 0x4e, 0x87, 0x56, 0xd7, 0xb6, 0xf0, 0x6f, 0x34, 0x80, 0xe3, 0x97, 0x96, 0x0c, 0x15, 0x35, - 0xc8, 0x37, 0xb9, 0xf0, 0xaa, 0xc6, 0x62, 0xe4, 0xf5, 0x58, 0x1b, 0x1b, 0x92, 0x0b, 0xbd, 0x03, - 0x79, 0x77, 0xd8, 0x6c, 0x12, 0x57, 0x06, 0xd5, 0xd7, 0xa2, 0x61, 0x41, 0x78, 0xb8, 0x21, 0xf9, - 0xe8, 0x92, 0xe7, 0x66, 0xb7, 0x37, 0x64, 0x21, 0x76, 0xf2, 0x12, 0xc1, 0x87, 0x7f, 0xa9, 0x41, - 0x91, 0x69, 0x99, 0x2a, 0x16, 0x2d, 0x43, 0x81, 0xe9, 0x40, 0x5a, 0x22, 0x1a, 0xcd, 0x1a, 0x01, - 0x01, 0xfd, 0x3f, 0x14, 0xe4, 0x95, 0x75, 0x85, 0x62, 0xd5, 0x78, 0xb1, 0x87, 0x03, 0x23, 0x60, - 0xc5, 0x7b, 0x70, 0x8d, 0x59, 0xa5, 0x49, 0x53, 0x21, 0x69, 0x47, 0x35, 0x59, 0xd0, 0x22, 0xc9, - 0x82, 0x0e, 0xb3, 0x83, 0xce, 0x85, 0xdb, 0x6d, 0x9a, 0x3d, 0xa1, 0x85, 0x3f, 0xc6, 0x1f, 0x00, - 0x52, 0x85, 0xa5, 0x7a, 0x19, 0xcc, 0x41, 0x71, 0xc7, 0x74, 0x3b, 0x42, 0x25, 0xfc, 0x09, 0x94, - 0xf8, 0x30, 0x95, 0x0d, 0x11, 0xe4, 0x3a, 0xa6, 0xdb, 0x61, 0x8a, 0xcf, 0x19, 0xec, 0x19, 0x5f, - 0x83, 0xf9, 0x23, 0xcb, 0x1c, 0xb8, 0x1d, 0x5b, 0x06, 0x57, 0x9a, 0x0a, 0x56, 0x02, 0x5a, 0x2a, - 0xc4, 0x87, 0x30, 0xef, 0x90, 0xbe, 0xd9, 0xb5, 0xba, 0x56, 0xfb, 0xf4, 0xec, 0xc2, 0x23, 0xae, - 0xc8, 0x14, 0xcb, 0x3e, 0x79, 0x8b, 0x52, 0xa9, 0x6a, 0x67, 0x3d, 0xfb, 0x4c, 0xb8, 0x38, 0x7b, - 0xc6, 0xbf, 0xd5, 0xa0, 0xf4, 0xb1, 0xe9, 0x35, 0xa5, 0x15, 0xd0, 0x2e, 0x94, 0x7d, 0xc7, 0x66, - 0x14, 0xa1, 0x4b, 0x24, 0xc2, 0xb3, 0x35, 0xdb, 0xc2, 0xd1, 0x65, 0x84, 0x9f, 0x6b, 0xaa, 0x04, - 0x26, 0xca, 0xb4, 0x9a, 0xa4, 0xe7, 0x8b, 0xca, 0x24, 0x8b, 0x62, 0x8c, 0xaa, 0x28, 0x95, 0xb0, - 0x35, 0x1f, 0xbc, 0xfd, 0xb8, 0x5b, 0x7e, 0xa9, 0x01, 0x1a, 0xd7, 0xe1, 0xeb, 0x26, 0xb2, 0xf7, - 0xa1, 0xec, 0x7a, 0xa6, 0xe3, 0x9d, 0x46, 0xf2, 0xe8, 0x39, 0x46, 0xf5, 0x83, 0xd3, 0x43, 0x98, - 0x1f, 0x38, 0x76, 0xdb, 0x21, 0xae, 0x7b, 0x6a, 0xd9, 0x5e, 0xf7, 0xf9, 0x05, 0x0b, 0x88, 0xb3, - 0x46, 0x59, 0x92, 0x0f, 0x18, 0x15, 0xd7, 0xa4, 0x52, 0xaa, 0xf2, 0x68, 0x09, 0x66, 0x5f, 0x50, - 0xaa, 0xcc, 0xf0, 0xb3, 0x46, 0x9e, 0x8d, 0x77, 0x5b, 0xf8, 0x6f, 0x1a, 0xcc, 0x09, 0xf3, 0xa7, - 0xba, 0x03, 0x2a, 0x44, 0x26, 0x04, 0x41, 0x13, 0x0c, 0x7e, 0x2c, 0x2d, 0x91, 0xb0, 0xc9, 0x21, - 0xf5, 0x33, 0x6e, 0x65, 0xd2, 0x12, 0xfb, 0xf1, 0xc7, 0xe8, 0x75, 0xa8, 0x34, 0xb9, 0x9f, 0x45, - 0x02, 0xbc, 0x31, 0x2f, 0xe8, 0xbe, 0x75, 0xee, 0xc3, 0x0c, 0x19, 0x11, 0xcb, 0x73, 0xab, 0x45, - 0x16, 0x14, 0xe6, 0x64, 0xd6, 0xd8, 0xa0, 0x54, 0x43, 0x4c, 0xe2, 0xff, 0x83, 0x6b, 0xfb, 0x34, - 0x91, 0x7b, 0xe2, 0x98, 0x96, 0x9a, 0x12, 0x1e, 0x1f, 0xef, 0x0b, 0xab, 0x64, 0xbd, 0xe3, 0x7d, - 0x54, 0x86, 0xcc, 0x6e, 0x5d, 0xec, 0x21, 0xd3, 0xad, 0xe3, 0xcf, 0x35, 0x40, 0xea, 0xba, 0x54, - 0x66, 0x8a, 0x08, 0x97, 0xf0, 0xd9, 0x00, 0x7e, 0x11, 0xa6, 0x89, 0xe3, 0xd8, 0x0e, 0x33, 0x48, - 0xc1, 0xe0, 0x03, 0x7c, 0x4f, 0xe8, 0x60, 0x90, 0x91, 0x7d, 0xee, 0x5f, 0x36, 0x2e, 0x4d, 0xf3, - 0x55, 0xdd, 0x83, 0x85, 0x10, 0x57, 0xaa, 0xe0, 0xf4, 0x10, 0xae, 0x33, 0x61, 0x7b, 0x84, 0x0c, - 0x36, 0x7b, 0xdd, 0x51, 0x22, 0xea, 0x00, 0x6e, 0x44, 0x19, 0xbf, 0x59, 0x1b, 0xe1, 0x0e, 0xcc, - 0x7c, 0xc8, 0x6a, 0x50, 0x45, 0x97, 0x1c, 0xe3, 0x45, 0x90, 0xb3, 0xcc, 0x3e, 0x4f, 0xe7, 0x0b, - 0x06, 0x7b, 0x66, 0xd1, 0x9c, 0x10, 0xe7, 0x99, 0xb1, 0xcf, 0xdf, 0x1a, 0x05, 0xc3, 0x1f, 0xa3, - 0x15, 0x5a, 0xfd, 0x76, 0x89, 0xe5, 0xb1, 0xd9, 0x1c, 0x9b, 0x55, 0x28, 0x78, 0x1d, 0x2a, 0x1c, - 0x69, 0xb3, 0xd5, 0x52, 0xde, 0x1c, 0xbe, 0x3c, 0x2d, 0x2c, 0x0f, 0xbf, 0x80, 0x6b, 0x0a, 0x7f, - 0x2a, 0x33, 0xbc, 0x09, 0x33, 0xbc, 0xd0, 0x16, 0x41, 0x6b, 0x31, 0xbc, 0x8a, 0xc3, 0x18, 0x82, - 0x07, 0xdf, 0x87, 0x05, 0x41, 0x21, 0x7d, 0x3b, 0xee, 0xac, 0x98, 0x7d, 0xf0, 0x3e, 0x2c, 0x86, - 0xd9, 0x52, 0x5d, 0x91, 0x4d, 0x09, 0xfa, 0x6c, 0xd0, 0x52, 0x62, 0x60, 0xf4, 0x50, 0x54, 0x83, - 0x65, 0x22, 0x06, 0xf3, 0x15, 0x92, 0x22, 0x52, 0x29, 0xb4, 0x20, 0xcd, 0xbf, 0xdf, 0x75, 0xfd, - 0x37, 0xdd, 0x67, 0x80, 0x54, 0x62, 0xaa, 0x43, 0x59, 0x87, 0x3c, 0x37, 0xb8, 0x4c, 0xa6, 0xe2, - 0x4f, 0x45, 0x32, 0x51, 0x85, 0xea, 0xe4, 0xb9, 0x63, 0xb6, 0xfb, 0xc4, 0x8f, 0x39, 0x34, 0x85, - 0x50, 0x89, 0xa9, 0x76, 0xfc, 0x47, 0x0d, 0x4a, 0x9b, 0x3d, 0xd3, 0xe9, 0x4b, 0xe3, 0xbf, 0x0f, - 0x33, 0x3c, 0x37, 0x11, 0xf9, 0xfb, 0x83, 0xb0, 0x18, 0x95, 0x97, 0x0f, 0x36, 0x79, 0x26, 0x23, - 0x56, 0xd1, 0xc3, 0x12, 0xfd, 0x9d, 0x7a, 0xa4, 0xdf, 0x53, 0x47, 0x6f, 0xc1, 0xb4, 0x49, 0x97, - 0x30, 0x5f, 0x2c, 0x47, 0xb3, 0x42, 0x26, 0xed, 0xf8, 0x62, 0x40, 0x0c, 0xce, 0x85, 0xdf, 0x83, - 0xa2, 0x82, 0x40, 0x93, 0xdd, 0x27, 0x8d, 0xe3, 0xca, 0x14, 0x2a, 0xc1, 0xec, 0xe6, 0xf6, 0xf1, - 0xee, 0x09, 0xcf, 0x81, 0xcb, 0x00, 0xf5, 0x86, 0x3f, 0xce, 0xe0, 0x4f, 0xc4, 0x2a, 0xe1, 0xe1, - 0xaa, 0x3e, 0x5a, 0x92, 0x3e, 0x99, 0x2b, 0xe9, 0xf3, 0x12, 0xe6, 0xc4, 0xf6, 0x53, 0xdd, 0x81, - 0x77, 0x60, 0x86, 0xc9, 0x93, 0x57, 0x60, 0x29, 0x06, 0x56, 0x7a, 0x27, 0x67, 0xc4, 0xf3, 0x30, - 0x77, 0xe4, 0x99, 0xde, 0xd0, 0x95, 0x57, 0xe0, 0x0f, 0x1a, 0x94, 0x25, 0x25, 0x6d, 0xf5, 0x2e, - 0x4b, 0x24, 0x1e, 0xf3, 0xfc, 0x02, 0xe9, 0x06, 0xcc, 0xb4, 0xce, 0x8e, 0xba, 0x9f, 0xc9, 0x2e, - 0x86, 0x18, 0x51, 0x7a, 0x8f, 0xe3, 0xf0, 0xae, 0x9c, 0x18, 0xd1, 0xdc, 0xdb, 0x31, 0x9f, 0x7b, - 0xbb, 0x56, 0x8b, 0xbc, 0x64, 0x6f, 0xda, 0x9c, 0x11, 0x10, 0x58, 0xba, 0x2c, 0xba, 0x77, 0xac, - 0x7e, 0x52, 0xbb, 0x79, 0x0b, 0x70, 0x6d, 0x73, 0xe8, 0x75, 0x1a, 0x96, 0x79, 0xd6, 0x93, 0x41, - 0x00, 0x2f, 0x02, 0xa2, 0xc4, 0x7a, 0xd7, 0x55, 0xa9, 0x0d, 0x58, 0xa0, 0x54, 0x62, 0x79, 0xdd, - 0xa6, 0x12, 0x31, 0x64, 0xd8, 0xd6, 0x22, 0x61, 0xdb, 0x74, 0xdd, 0x17, 0xb6, 0xd3, 0x12, 0x5b, - 0xf3, 0xc7, 0xb8, 0xce, 0x85, 0x3f, 0x73, 0x43, 0x81, 0xf9, 0xeb, 0x4a, 0x59, 0x0b, 0xa4, 0x3c, - 0x21, 0xde, 0x04, 0x29, 0xf8, 0x0d, 0xb8, 0x2e, 0x39, 0x45, 0x0d, 0x3d, 0x81, 0xf9, 0x10, 0x6e, - 0x49, 0xe6, 0xed, 0x0e, 0x4d, 0xf4, 0x9e, 0x0a, 0xc0, 0xff, 0x56, 0xcf, 0x2d, 0xa8, 0xfa, 0x7a, - 0xb2, 0x1c, 0xc4, 0xee, 0xa9, 0x0a, 0x0c, 0x5d, 0x71, 0x67, 0x0a, 0x06, 0x7b, 0xa6, 0x34, 0xc7, - 0xee, 0xf9, 0x2f, 0x41, 0xfa, 0x8c, 0xb7, 0x61, 0x49, 0xca, 0x10, 0xd9, 0x41, 0x58, 0xc8, 0x98, - 0x42, 0x71, 0x42, 0x84, 0xc1, 0xe8, 0xd2, 0xc9, 0x66, 0x57, 0x39, 0xc3, 0xa6, 0x65, 0x32, 0x35, - 0x45, 0xe6, 0x75, 0x7e, 0x23, 0xa8, 0x62, 0x6a, 0xd0, 0x16, 0x64, 0x2a, 0x40, 0x25, 0x8b, 0x83, - 0xa0, 0xe4, 0xb1, 0x83, 0x18, 0x13, 0xfd, 0x3d, 0x58, 0xf1, 0x95, 0xa0, 0x76, 0x7b, 0x4a, 0x9c, - 0x7e, 0xd7, 0x75, 0x95, 0x22, 0x30, 0x6e, 0xe3, 0x0f, 0x20, 0x37, 0x20, 0x22, 0xa6, 0x14, 0x37, - 0xd0, 0x3a, 0xef, 0xb1, 0xaf, 0x2b, 0x8b, 0xd9, 0x3c, 0x6e, 0xc1, 0x6d, 0x29, 0x9d, 0x5b, 0x34, - 0x56, 0x7c, 0x54, 0x29, 0x59, 0x20, 0x70, 0xb3, 0x8e, 0x17, 0x08, 0x59, 0x7e, 0xf6, 0x7e, 0xab, - 0xef, 0x03, 0x6e, 0x48, 0xe9, 0x5b, 0xa9, 0xde, 0x15, 0x7b, 0xdc, 0xa6, 0xbe, 0x4b, 0xa6, 0x12, - 0x76, 0x06, 0x8b, 0x61, 0x4f, 0x4e, 0x15, 0xc6, 0x16, 0x61, 0xda, 0xb3, 0xcf, 0x89, 0x0c, 0x62, - 0x7c, 0x20, 0x15, 0xf6, 0xdd, 0x3c, 0x95, 0xc2, 0x66, 0x20, 0x8c, 0x5d, 0xc9, 0xb4, 0xfa, 0xd2, - 0xd3, 0x94, 0xf9, 0x0c, 0x1f, 0xe0, 0x03, 0xb8, 0x11, 0x0d, 0x13, 0xa9, 0x54, 0x3e, 0xe1, 0x17, - 0x38, 0x2e, 0x92, 0xa4, 0x92, 0xfb, 0x51, 0x10, 0x0c, 0x94, 0x80, 0x92, 0x4a, 0xa4, 0x01, 0x7a, - 0x5c, 0x7c, 0xf9, 0x5f, 0xdc, 0x57, 0x3f, 0xdc, 0xa4, 0x12, 0xe6, 0x06, 0xc2, 0xd2, 0x1f, 0x7f, - 0x10, 0x23, 0xb2, 0x13, 0x63, 0x84, 0x70, 0x92, 0x20, 0x8a, 0x7d, 0x03, 0x97, 0x4e, 0x60, 0x04, - 0x01, 0x34, 0x2d, 0x06, 0x7d, 0x87, 0xf8, 0x18, 0x6c, 0x20, 0x2f, 0xb6, 0x1a, 0x76, 0x53, 0x1d, - 0xc6, 0xc7, 0x41, 0xec, 0x1c, 0x8b, 0xcc, 0xa9, 0x04, 0x7f, 0x02, 0xab, 0xc9, 0x41, 0x39, 0x8d, - 0xe4, 0x47, 0x18, 0x0a, 0x7e, 0x42, 0xa9, 0x7c, 0x53, 0x2b, 0x42, 0xfe, 0xe0, 0xf0, 0xe8, 0xe9, - 0xe6, 0x76, 0xa3, 0xa2, 0x6d, 0xfc, 0x2b, 0x0b, 0x99, 0xbd, 0x13, 0xf4, 0x7d, 0x98, 0xe6, 0xcd, - 0xff, 0x09, 0xdf, 0x46, 0xf4, 0x49, 0x9f, 0x11, 0xf0, 0xf2, 0xe7, 0x7f, 0xfa, 0xeb, 0x97, 0x99, - 0x1b, 0xf8, 0x5a, 0x6d, 0xf4, 0xae, 0xd9, 0x1b, 0x74, 0xcc, 0xda, 0xf9, 0xa8, 0xc6, 0xde, 0x09, - 0x8f, 0xb5, 0x47, 0xe8, 0x04, 0xb2, 0x4f, 0x87, 0x1e, 0x4a, 0xfc, 0x70, 0xa2, 0x27, 0x7f, 0x5e, - 0xc0, 0x3a, 0x93, 0xbc, 0x88, 0xe7, 0x55, 0xc9, 0x83, 0xa1, 0x47, 0xe5, 0x8e, 0xa0, 0xa8, 0x7c, - 0x21, 0x40, 0x97, 0x7e, 0x52, 0xd1, 0x2f, 0xff, 0xfa, 0x80, 0x31, 0xc3, 0x5b, 0xc6, 0xaf, 0xa9, - 0x78, 0xfc, 0x43, 0x86, 0xba, 0x9f, 0xe3, 0x97, 0x56, 0x74, 0x3f, 0x41, 0xcf, 0x3b, 0xba, 0x1f, - 0xa5, 0xcf, 0x1c, 0xbf, 0x1f, 0xef, 0xa5, 0x45, 0xe5, 0xda, 0xe2, 0xab, 0x46, 0xd3, 0x43, 0xb7, - 0x63, 0x9a, 0xe4, 0x6a, 0x3b, 0x58, 0x5f, 0x4d, 0x66, 0x10, 0x48, 0x77, 0x18, 0xd2, 0x4d, 0x7c, - 0x43, 0x45, 0x6a, 0xfa, 0x7c, 0x8f, 0xb5, 0x47, 0x1b, 0x1d, 0x98, 0x66, 0xbd, 0x34, 0x74, 0x2a, - 0x1f, 0xf4, 0x98, 0x4e, 0x63, 0xc2, 0x0d, 0x08, 0x75, 0xe1, 0xf0, 0x12, 0x43, 0x5b, 0xc0, 0x65, - 0x1f, 0x8d, 0xb5, 0xd3, 0x1e, 0x6b, 0x8f, 0xd6, 0xb4, 0xb7, 0xb5, 0x8d, 0x7f, 0x66, 0x60, 0x9a, - 0x35, 0x5d, 0xd0, 0x00, 0x20, 0xe8, 0x4e, 0x45, 0xf7, 0x39, 0xd6, 0xef, 0x8a, 0xee, 0x73, 0xbc, - 0xb1, 0x85, 0x6f, 0x33, 0xe4, 0x25, 0xbc, 0xe8, 0x23, 0xb3, 0xcf, 0x9f, 0xb5, 0x36, 0xe5, 0xa2, - 0x66, 0x7d, 0x01, 0x45, 0xa5, 0xcb, 0x84, 0xe2, 0x24, 0x86, 0xda, 0x54, 0xd1, 0x6b, 0x12, 0xd3, - 0xa2, 0xc2, 0x77, 0x19, 0xe8, 0x2d, 0x5c, 0x55, 0x8d, 0xcb, 0x71, 0x1d, 0xc6, 0x49, 0x81, 0x7f, - 0xa2, 0x41, 0x39, 0xdc, 0x69, 0x42, 0x77, 0x63, 0x44, 0x47, 0x1b, 0x56, 0xfa, 0xbd, 0xc9, 0x4c, - 0x89, 0x2a, 0x70, 0xfc, 0x73, 0x42, 0x06, 0x26, 0xe5, 0x94, 0xb6, 0xff, 0x77, 0x16, 0xf2, 0xdb, - 0xfc, 0x07, 0x12, 0xc8, 0x83, 0x82, 0xdf, 0xef, 0x41, 0x2b, 0x71, 0xbd, 0x80, 0x20, 0x51, 0xd6, - 0x6f, 0x27, 0xce, 0x0b, 0x15, 0x1e, 0x30, 0x15, 0x56, 0xf1, 0x4d, 0x5f, 0x05, 0xf1, 0x43, 0x8c, - 0x1a, 0x2f, 0x79, 0x6b, 0x66, 0xab, 0x45, 0x0d, 0xf1, 0x63, 0x0d, 0x4a, 0x6a, 0x1b, 0x07, 0xdd, - 0x89, 0xed, 0x42, 0xa8, 0x9d, 0x20, 0x1d, 0x4f, 0x62, 0x11, 0xf8, 0xaf, 0x33, 0xfc, 0xbb, 0x78, - 0x25, 0x09, 0xdf, 0x61, 0xfc, 0x61, 0x15, 0x78, 0xe3, 0x26, 0x5e, 0x85, 0x50, 0x5f, 0x28, 0x5e, - 0x85, 0x70, 0xdf, 0xe7, 0x72, 0x15, 0x86, 0x8c, 0x9f, 0xaa, 0xf0, 0x12, 0x20, 0xe8, 0xeb, 0xa0, - 0x58, 0xe3, 0x2a, 0xa5, 0x43, 0xf4, 0xe6, 0x8f, 0xb7, 0x84, 0xf0, 0x43, 0x86, 0x7d, 0x07, 0x2f, - 0x27, 0x61, 0xf7, 0xba, 0x2e, 0xf5, 0x80, 0x8d, 0xdf, 0xe5, 0xa0, 0xf8, 0xa1, 0xd9, 0xb5, 0x3c, - 0x62, 0x99, 0x56, 0x93, 0xa0, 0x36, 0x4c, 0xb3, 0x77, 0x43, 0xd4, 0xdd, 0xd5, 0x66, 0x4b, 0xd4, - 0xdd, 0x43, 0x9d, 0x08, 0x7c, 0x9f, 0x41, 0xdf, 0xc6, 0xba, 0x0f, 0xdd, 0x0f, 0xe4, 0xd7, 0x58, - 0x17, 0x81, 0x6e, 0xf9, 0x1c, 0x66, 0x78, 0xd7, 0x00, 0x45, 0xa4, 0x85, 0xba, 0x0b, 0xfa, 0x72, - 0xfc, 0x64, 0xe2, 0x2d, 0x53, 0xb1, 0x5c, 0xc6, 0x4c, 0xc1, 0x7e, 0x00, 0x10, 0xb4, 0xa9, 0xa2, - 0xf6, 0x1d, 0xeb, 0x6a, 0xe9, 0xab, 0xc9, 0x0c, 0x02, 0xf8, 0x11, 0x03, 0xbe, 0x87, 0x6f, 0xc7, - 0x02, 0xb7, 0xfc, 0x05, 0x14, 0xbc, 0x09, 0xb9, 0x1d, 0xd3, 0xed, 0xa0, 0x48, 0xe8, 0x57, 0x3e, - 0x97, 0xe9, 0x7a, 0xdc, 0x94, 0x80, 0xba, 0xc7, 0xa0, 0x56, 0xf0, 0x52, 0x2c, 0x54, 0xc7, 0x74, - 0x69, 0x24, 0x45, 0x43, 0x98, 0x95, 0x9f, 0xc0, 0xd0, 0xad, 0x88, 0xcd, 0xc2, 0x9f, 0xcb, 0xf4, - 0x95, 0xa4, 0x69, 0x01, 0xb8, 0xc6, 0x00, 0x31, 0xbe, 0x15, 0x6f, 0x54, 0xc1, 0xfe, 0x58, 0x7b, - 0xf4, 0xb6, 0xb6, 0xf1, 0xb3, 0x0a, 0xe4, 0x68, 0x96, 0x42, 0x63, 0x77, 0x50, 0xdc, 0x45, 0x2d, - 0x3c, 0xd6, 0x52, 0x89, 0x5a, 0x78, 0xbc, 0x2e, 0x8c, 0x89, 0xdd, 0xec, 0x67, 0x62, 0x84, 0x71, - 0xd1, 0x1d, 0x7b, 0x50, 0x54, 0x4a, 0x40, 0x14, 0x23, 0x31, 0xdc, 0xb0, 0x89, 0xc6, 0xee, 0x98, - 0xfa, 0x11, 0xaf, 0x32, 0x50, 0x1d, 0x5f, 0x0f, 0x83, 0xb6, 0x38, 0x1b, 0x45, 0xfd, 0x21, 0x94, - 0xd4, 0x5a, 0x11, 0xc5, 0x08, 0x8d, 0x74, 0x84, 0xa2, 0xb1, 0x22, 0xae, 0xd4, 0x8c, 0x71, 0x1a, - 0xff, 0x47, 0x71, 0x92, 0x97, 0xa2, 0x7f, 0x0a, 0x79, 0x51, 0x41, 0xc6, 0xed, 0x37, 0xdc, 0x43, - 0x8a, 0xdb, 0x6f, 0xa4, 0xfc, 0x8c, 0x49, 0x04, 0x18, 0x2c, 0xcd, 0x94, 0x65, 0x80, 0x16, 0x90, - 0x4f, 0x88, 0x97, 0x04, 0x19, 0x74, 0x45, 0x92, 0x20, 0x95, 0x2a, 0x65, 0x22, 0x64, 0x9b, 0x78, - 0xe2, 0x2e, 0xcb, 0x12, 0x00, 0x25, 0x48, 0x54, 0xa3, 0x21, 0x9e, 0xc4, 0x92, 0x98, 0xbb, 0x05, - 0xa8, 0x22, 0x14, 0xa2, 0x1f, 0x01, 0x04, 0xe5, 0x6e, 0xf4, 0x75, 0x1c, 0xdb, 0x33, 0x8b, 0xbe, - 0x8e, 0xe3, 0x2b, 0xe6, 0x18, 0x0f, 0x0e, 0xc0, 0x79, 0xfe, 0x48, 0xe1, 0x7f, 0xae, 0x01, 0x1a, - 0x2f, 0x8f, 0xd1, 0x1b, 0xf1, 0x10, 0xb1, 0xed, 0x38, 0xfd, 0xcd, 0xab, 0x31, 0x27, 0x46, 0xcf, - 0x40, 0xaf, 0x26, 0x5b, 0x32, 0x78, 0x41, 0x35, 0xfb, 0x42, 0x83, 0xb9, 0x50, 0x81, 0x8d, 0x1e, - 0x24, 0x9c, 0x73, 0xa4, 0xa5, 0xa7, 0x3f, 0xbc, 0x94, 0x2f, 0x31, 0x63, 0x51, 0x6e, 0x85, 0xcc, - 0xd6, 0x7e, 0xaa, 0x41, 0x39, 0x5c, 0x95, 0xa3, 0x04, 0x80, 0xb1, 0xbe, 0xa0, 0xbe, 0x76, 0x39, - 0xe3, 0x15, 0x4e, 0x2b, 0x48, 0xe0, 0x3e, 0x85, 0xbc, 0x28, 0xe6, 0xe3, 0xdc, 0x22, 0xdc, 0x56, - 0x8c, 0x73, 0x8b, 0x48, 0x27, 0x20, 0xc9, 0x2d, 0x68, 0x5d, 0xac, 0x78, 0xa2, 0x28, 0xf9, 0x93, - 0x20, 0x27, 0x7b, 0x62, 0xa4, 0x5f, 0x30, 0x11, 0x32, 0xf0, 0x44, 0x59, 0xf0, 0xa3, 0x04, 0x89, - 0x97, 0x78, 0x62, 0xb4, 0x5f, 0x90, 0xe4, 0x89, 0x0c, 0x55, 0xf1, 0xc4, 0xa0, 0x3e, 0x8f, 0xf3, - 0xc4, 0xb1, 0xa6, 0x69, 0x9c, 0x27, 0x8e, 0x97, 0xf8, 0x49, 0x67, 0xcb, 0xc0, 0x43, 0x9e, 0xb8, - 0x10, 0x53, 0xcf, 0xa3, 0x37, 0x13, 0x6c, 0x1a, 0xdb, 0x90, 0xd5, 0xdf, 0xba, 0x22, 0xf7, 0x64, - 0x0f, 0xe0, 0xa7, 0x21, 0x3d, 0xe0, 0xd7, 0x1a, 0x2c, 0xc6, 0x35, 0x04, 0x50, 0x02, 0x58, 0x42, - 0x37, 0x57, 0x5f, 0xbf, 0x2a, 0xfb, 0x15, 0xec, 0xe6, 0xfb, 0xc4, 0x56, 0xe5, 0xf7, 0xaf, 0x56, - 0xb4, 0xaf, 0x5e, 0xad, 0x68, 0x7f, 0x7e, 0xb5, 0xa2, 0xfd, 0xe2, 0x2f, 0x2b, 0x53, 0x67, 0x33, - 0xec, 0xb7, 0xda, 0xef, 0xfe, 0x27, 0x00, 0x00, 0xff, 0xff, 0x45, 0x26, 0x54, 0x69, 0x32, 0x2e, - 0x00, 0x00, + // 3206 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x5a, 0xcd, 0x73, 0x1b, 0xc7, + 0xb1, 0xe7, 0x02, 0x20, 0x3e, 0x1a, 0x20, 0x08, 0x0d, 0x29, 0x19, 0x5c, 0x49, 0x14, 0x35, 0xfa, + 0xa2, 0x64, 0x9b, 0xb0, 0x69, 0xbf, 0x77, 0xd0, 0x7b, 0xe5, 0x2a, 0x8a, 0xc4, 0x13, 0xf9, 0x48, + 0x93, 0xf2, 0x92, 0xa2, 0x9d, 0x2a, 0x57, 0x58, 0x4b, 0x60, 0x04, 0xa0, 0x08, 0xec, 0xc2, 0xbb, + 0x0b, 0x48, 0x74, 0x92, 0xaa, 0x94, 0x2b, 0x3e, 0x24, 0xc7, 0xf8, 0x90, 0xaf, 0x63, 0xae, 0xb9, + 0xe6, 0x96, 0x3f, 0x20, 0x95, 0x4b, 0x5c, 0x95, 0x7f, 0x20, 0xe5, 0xe4, 0x90, 0x43, 0xee, 0xa9, + 0x1c, 0x52, 0x49, 0xcd, 0xd7, 0xee, 0xec, 0x62, 0x17, 0xa4, 0xb3, 0xf1, 0x85, 0xdc, 0xe9, 0xe9, + 0xe9, 0x5f, 0x77, 0xcf, 0x74, 0x6f, 0x4f, 0x2f, 0xa0, 0xe4, 0x0c, 0x5b, 0x6b, 0x43, 0xc7, 0xf6, + 0x6c, 0x54, 0x21, 0x5e, 0xab, 0xed, 0x12, 0x67, 0x4c, 0x9c, 0xe1, 0xa9, 0xbe, 0xd8, 0xb1, 0x3b, + 0x36, 0x9b, 0x68, 0xd0, 0x27, 0xce, 0xa3, 0x2f, 0x51, 0x9e, 0xc6, 0x60, 0xdc, 0x6a, 0xb1, 0x3f, + 0xc3, 0xd3, 0xc6, 0xd9, 0x58, 0x4c, 0x5d, 0x67, 0x53, 0xe6, 0xc8, 0xeb, 0xb2, 0x3f, 0xc3, 0x53, + 0xf6, 0x4f, 0x4c, 0xde, 0xe8, 0xd8, 0x76, 0xa7, 0x4f, 0x1a, 0xe6, 0xb0, 0xd7, 0x30, 0x2d, 0xcb, + 0xf6, 0x4c, 0xaf, 0x67, 0x5b, 0x2e, 0x9f, 0xc5, 0x9f, 0x6b, 0x50, 0x35, 0x88, 0x3b, 0xb4, 0x2d, + 0x97, 0x6c, 0x13, 0xb3, 0x4d, 0x1c, 0x74, 0x13, 0xa0, 0xd5, 0x1f, 0xb9, 0x1e, 0x71, 0x4e, 0x7a, + 0xed, 0xba, 0xb6, 0xa2, 0xad, 0xe6, 0x8c, 0x92, 0xa0, 0xec, 0xb4, 0xd1, 0x75, 0x28, 0x0d, 0xc8, + 0xe0, 0x94, 0xcf, 0x66, 0xd8, 0x6c, 0x91, 0x13, 0x76, 0xda, 0x48, 0x87, 0xa2, 0x43, 0xc6, 0x3d, + 0xb7, 0x67, 0x5b, 0xf5, 0xec, 0x8a, 0xb6, 0x9a, 0x35, 0xfc, 0x31, 0x5d, 0xe8, 0x98, 0x2f, 0xbc, + 0x13, 0x8f, 0x38, 0x83, 0x7a, 0x8e, 0x2f, 0xa4, 0x84, 0x23, 0xe2, 0x0c, 0xf0, 0x97, 0x59, 0xa8, + 0x18, 0xa6, 0xd5, 0x21, 0x06, 0xf9, 0x64, 0x44, 0x5c, 0x0f, 0xd5, 0x20, 0x7b, 0x46, 0xce, 0x19, + 0x7c, 0xc5, 0xa0, 0x8f, 0x7c, 0xbd, 0xd5, 0x21, 0x27, 0xc4, 0xe2, 0xc0, 0x15, 0xba, 0xde, 0xea, + 0x90, 0xa6, 0xd5, 0x46, 0x8b, 0x30, 0xdb, 0xef, 0x0d, 0x7a, 0x9e, 0x40, 0xe5, 0x83, 0x90, 0x3a, + 0xb9, 0x88, 0x3a, 0x9b, 0x00, 0xae, 0xed, 0x78, 0x27, 0xb6, 0xd3, 0x26, 0x4e, 0x7d, 0x76, 0x45, + 0x5b, 0xad, 0xae, 0xdf, 0x5d, 0x53, 0x37, 0x62, 0x4d, 0x55, 0x68, 0xed, 0xd0, 0x76, 0xbc, 0x03, + 0xca, 0x6b, 0x94, 0x5c, 0xf9, 0x88, 0xfe, 0x0f, 0xca, 0x4c, 0x88, 0x67, 0x3a, 0x1d, 0xe2, 0xd5, + 0xf3, 0x4c, 0xca, 0xbd, 0x0b, 0xa4, 0x1c, 0x31, 0x66, 0x83, 0xc1, 0xf3, 0x67, 0x84, 0xa1, 0xe2, + 0x12, 0xa7, 0x67, 0xf6, 0x7b, 0x9f, 0x9a, 0xa7, 0x7d, 0x52, 0x2f, 0xac, 0x68, 0xab, 0x45, 0x23, + 0x44, 0xa3, 0xf6, 0x9f, 0x91, 0x73, 0xf7, 0xc4, 0xb6, 0xfa, 0xe7, 0xf5, 0x22, 0x63, 0x28, 0x52, + 0xc2, 0x81, 0xd5, 0x3f, 0x67, 0x9b, 0x66, 0x8f, 0x2c, 0x8f, 0xcf, 0x96, 0xd8, 0x6c, 0x89, 0x51, + 0xe8, 0x34, 0x5e, 0x83, 0x92, 0xaf, 0x3f, 0x2a, 0x42, 0x6e, 0xff, 0x60, 0xbf, 0x59, 0x9b, 0x41, + 0x00, 0xf9, 0x8d, 0xc3, 0xcd, 0xe6, 0xfe, 0x56, 0x4d, 0x43, 0x65, 0x28, 0x6c, 0x35, 0xf9, 0x20, + 0x83, 0x9f, 0x00, 0x04, 0x9a, 0xa2, 0x02, 0x64, 0x77, 0x9b, 0xdf, 0xaa, 0xcd, 0x50, 0x9e, 0xe3, + 0xa6, 0x71, 0xb8, 0x73, 0xb0, 0x5f, 0xd3, 0xe8, 0xe2, 0x4d, 0xa3, 0xb9, 0x71, 0xd4, 0xac, 0x65, + 0x28, 0xc7, 0xfb, 0x07, 0x5b, 0xb5, 0x2c, 0x2a, 0xc1, 0xec, 0xf1, 0xc6, 0xde, 0xf3, 0x66, 0x2d, + 0x87, 0xbf, 0xd0, 0x60, 0x4e, 0xd8, 0xce, 0xcf, 0x17, 0x7a, 0x17, 0xf2, 0x5d, 0x76, 0xc6, 0xd8, + 0xb6, 0x96, 0xd7, 0x6f, 0x44, 0x1c, 0x15, 0x3a, 0x87, 0x86, 0xe0, 0x45, 0x18, 0xb2, 0x67, 0x63, + 0xb7, 0x9e, 0x59, 0xc9, 0xae, 0x96, 0xd7, 0x6b, 0x6b, 0xfc, 0xf0, 0xaf, 0xed, 0x92, 0xf3, 0x63, + 0xb3, 0x3f, 0x22, 0x06, 0x9d, 0x44, 0x08, 0x72, 0x03, 0xdb, 0x21, 0x6c, 0xf7, 0x8b, 0x06, 0x7b, + 0xa6, 0x47, 0x82, 0x39, 0x40, 0xec, 0x3c, 0x1f, 0xe0, 0x16, 0xc0, 0xb3, 0x91, 0x97, 0x7c, 0xca, + 0x16, 0x61, 0x76, 0x4c, 0xe5, 0x8a, 0x13, 0xc6, 0x07, 0xec, 0x78, 0x11, 0xd3, 0x25, 0xfe, 0xf1, + 0xa2, 0x03, 0xf4, 0x1a, 0x14, 0x86, 0x0e, 0x19, 0x9f, 0x9c, 0x8d, 0x19, 0x46, 0xd1, 0xc8, 0xd3, + 0xe1, 0xee, 0x18, 0x5b, 0x50, 0x66, 0x20, 0xa9, 0xec, 0x7e, 0x18, 0x48, 0xcf, 0xb0, 0x65, 0x93, + 0xb6, 0x4b, 0xbc, 0x8f, 0x01, 0x6d, 0x91, 0x3e, 0xf1, 0x48, 0x9a, 0x10, 0x52, 0xac, 0xc9, 0x86, + 0xac, 0xf9, 0xb1, 0x06, 0x0b, 0x21, 0xf1, 0xa9, 0xcc, 0xaa, 0x43, 0xa1, 0xcd, 0x84, 0x71, 0x0d, + 0xb2, 0x86, 0x1c, 0xa2, 0xd7, 0xa1, 0x28, 0x14, 0x70, 0xeb, 0xd9, 0x84, 0xdd, 0x2e, 0x70, 0x9d, + 0x5c, 0xfc, 0x57, 0x0d, 0x4a, 0xc2, 0xd0, 0x83, 0x21, 0xda, 0x80, 0x39, 0x87, 0x0f, 0x4e, 0x98, + 0x3d, 0x42, 0x23, 0x3d, 0x39, 0x12, 0xb7, 0x67, 0x8c, 0x8a, 0x58, 0xc2, 0xc8, 0xe8, 0x7f, 0xa0, + 0x2c, 0x45, 0x0c, 0x47, 0x9e, 0x70, 0x79, 0x3d, 0x2c, 0x20, 0x38, 0x39, 0xdb, 0x33, 0x06, 0x08, + 0xf6, 0x67, 0x23, 0x0f, 0x1d, 0xc1, 0xa2, 0x5c, 0xcc, 0xad, 0x11, 0x6a, 0x64, 0x99, 0x94, 0x95, + 0xb0, 0x94, 0xc9, 0xad, 0xda, 0x9e, 0x31, 0x90, 0x58, 0xaf, 0x4c, 0x3e, 0x29, 0x41, 0x41, 0x50, + 0xf1, 0xdf, 0x34, 0x00, 0xe9, 0xd0, 0x83, 0x21, 0xda, 0x82, 0xaa, 0x23, 0x46, 0x21, 0x83, 0xaf, + 0xc7, 0x1a, 0x2c, 0xf6, 0x61, 0xc6, 0x98, 0x93, 0x8b, 0xb8, 0xc9, 0xef, 0x41, 0xc5, 0x97, 0x12, + 0xd8, 0xbc, 0x14, 0x63, 0xb3, 0x2f, 0xa1, 0x2c, 0x17, 0x50, 0xab, 0x3f, 0x84, 0xab, 0xfe, 0xfa, + 0x18, 0xb3, 0x6f, 0x4f, 0x31, 0xdb, 0x17, 0xb8, 0x20, 0x25, 0xa8, 0x86, 0x03, 0xcd, 0xdb, 0x9c, + 0x8c, 0x7f, 0x9e, 0x85, 0xc2, 0xa6, 0x3d, 0x18, 0x9a, 0x0e, 0xdd, 0xa3, 0xbc, 0x43, 0xdc, 0x51, + 0xdf, 0x63, 0xe6, 0x56, 0xd7, 0xef, 0x84, 0x11, 0x04, 0x9b, 0xfc, 0x6f, 0x30, 0x56, 0x43, 0x2c, + 0xa1, 0x8b, 0x45, 0x9a, 0xce, 0x5c, 0x62, 0xb1, 0x48, 0xd2, 0x62, 0x89, 0x8c, 0xa5, 0x6c, 0x10, + 0x4b, 0x3a, 0x14, 0xc6, 0xc4, 0x09, 0x5e, 0x2d, 0xdb, 0x33, 0x86, 0x24, 0xa0, 0x87, 0x30, 0xdf, + 0x72, 0x88, 0x49, 0xfd, 0x21, 0x5f, 0x3f, 0xb3, 0x82, 0xa7, 0xca, 0x27, 0x0c, 0xf9, 0x1a, 0xba, + 0x03, 0x95, 0x81, 0xdd, 0x0e, 0xf8, 0xf2, 0x82, 0xaf, 0x3c, 0xb0, 0xdb, 0x3e, 0xd3, 0x35, 0x99, + 0x94, 0xe8, 0x7b, 0xa1, 0xb2, 0x3d, 0x23, 0xd2, 0x12, 0x7e, 0x1b, 0xe6, 0x42, 0xb6, 0xd2, 0xf4, + 0xdb, 0xfc, 0xe0, 0xf9, 0xc6, 0x1e, 0xcf, 0xd5, 0x4f, 0x59, 0x7a, 0x36, 0x6a, 0x1a, 0x4d, 0xf9, + 0x7b, 0xcd, 0xc3, 0xc3, 0x5a, 0x06, 0xff, 0xaf, 0xbf, 0x44, 0x24, 0x77, 0x25, 0xa7, 0xcf, 0x28, + 0x39, 0x5d, 0x93, 0x39, 0x3d, 0x13, 0xe4, 0xf4, 0xec, 0x93, 0x2a, 0x54, 0xb8, 0x43, 0x4e, 0x46, + 0x56, 0xcf, 0xb6, 0xf0, 0x2f, 0x35, 0x80, 0xa3, 0x57, 0x96, 0xcc, 0x38, 0x0d, 0x28, 0xb4, 0xb8, + 0xf0, 0xba, 0xc6, 0x02, 0xf8, 0x6a, 0xac, 0x8f, 0x0d, 0xc9, 0x85, 0xde, 0x86, 0x82, 0x3b, 0x6a, + 0xb5, 0x88, 0x2b, 0xf3, 0xfb, 0x6b, 0xd1, 0x1c, 0x22, 0x22, 0xdc, 0x90, 0x7c, 0x74, 0xc9, 0x0b, + 0xb3, 0xd7, 0x1f, 0xb1, 0x6c, 0x3f, 0x7d, 0x89, 0xe0, 0xc3, 0x3f, 0xd3, 0xa0, 0xcc, 0xb4, 0x4c, + 0x95, 0xb8, 0x6e, 0x40, 0x89, 0xe9, 0x40, 0xda, 0x22, 0x75, 0x15, 0x8d, 0x80, 0x80, 0xfe, 0x1b, + 0x4a, 0xf2, 0xc8, 0xca, 0xec, 0x55, 0x8f, 0x17, 0x7b, 0x30, 0x34, 0x02, 0x56, 0xbc, 0x0b, 0x57, + 0x98, 0x57, 0x5a, 0xb4, 0x2a, 0x93, 0x7e, 0x54, 0xeb, 0x16, 0x2d, 0x52, 0xb7, 0xe8, 0x50, 0x1c, + 0x76, 0xcf, 0xdd, 0x5e, 0xcb, 0xec, 0x0b, 0x2d, 0xfc, 0x31, 0xfe, 0x7f, 0x40, 0xaa, 0xb0, 0x34, + 0xe6, 0xe2, 0x39, 0x28, 0x6f, 0x9b, 0x6e, 0x57, 0xa8, 0x84, 0x3f, 0x82, 0x0a, 0x1f, 0xa6, 0xf2, + 0x21, 0x82, 0x5c, 0xd7, 0x74, 0xbb, 0x4c, 0xf1, 0x39, 0x83, 0x3d, 0xe3, 0x2b, 0x30, 0x7f, 0x68, + 0x99, 0x43, 0xb7, 0x6b, 0xcb, 0xe4, 0x4a, 0xab, 0xd2, 0x5a, 0x40, 0x4b, 0x85, 0xf8, 0x00, 0xe6, + 0x1d, 0x32, 0x30, 0x7b, 0x56, 0xcf, 0xea, 0x9c, 0x9c, 0x9e, 0x7b, 0xc4, 0x15, 0x45, 0x6b, 0xd5, + 0x27, 0x3f, 0xa1, 0x54, 0xaa, 0xda, 0x69, 0xdf, 0x3e, 0x15, 0x21, 0xce, 0x9e, 0xf1, 0xaf, 0x35, + 0xa8, 0x7c, 0x68, 0x7a, 0x2d, 0xe9, 0x05, 0xb4, 0x03, 0x55, 0x3f, 0xb0, 0x19, 0x45, 0xe8, 0x12, + 0xc9, 0xf0, 0x6c, 0xcd, 0xa6, 0x08, 0x74, 0x99, 0xe1, 0xe7, 0x5a, 0x2a, 0x81, 0x89, 0x32, 0xad, + 0x16, 0xe9, 0xfb, 0xa2, 0x32, 0xc9, 0xa2, 0x18, 0xa3, 0x2a, 0x4a, 0x25, 0x3c, 0x99, 0x0f, 0xde, + 0x7e, 0x3c, 0x2c, 0x7f, 0xa5, 0x01, 0x9a, 0xd4, 0xe1, 0xeb, 0x16, 0x04, 0xf7, 0xa0, 0xea, 0x7a, + 0xa6, 0xe3, 0x9d, 0x44, 0x4a, 0xfa, 0x39, 0x46, 0xf5, 0x93, 0xd3, 0x03, 0x98, 0x1f, 0x3a, 0x76, + 0xc7, 0x21, 0xae, 0x7b, 0x62, 0xd9, 0x5e, 0xef, 0xc5, 0xb9, 0xa8, 0x86, 0xaa, 0x92, 0xbc, 0xcf, + 0xa8, 0x6a, 0x81, 0x91, 0x0f, 0x15, 0x18, 0x0d, 0xa9, 0xad, 0x6a, 0x15, 0x5a, 0x82, 0xe2, 0x4b, + 0x4a, 0x95, 0xb7, 0x90, 0xac, 0x51, 0x60, 0xe3, 0x9d, 0x36, 0xfe, 0x8b, 0x06, 0x73, 0x62, 0x5f, + 0x52, 0x1d, 0x0e, 0x15, 0x22, 0x13, 0x82, 0xa0, 0x65, 0x0a, 0xdf, 0xaf, 0xb6, 0xa8, 0x86, 0xe4, + 0x90, 0x06, 0x20, 0x77, 0x3f, 0x69, 0x0b, 0x43, 0xfd, 0x31, 0x7a, 0x08, 0xb5, 0x16, 0x0f, 0xc0, + 0x48, 0xe6, 0x37, 0xe6, 0x05, 0xdd, 0x77, 0xdb, 0x3d, 0xc8, 0x93, 0x31, 0xb1, 0x3c, 0xb7, 0x5e, + 0x66, 0xd9, 0x62, 0x4e, 0xd6, 0x3a, 0x4d, 0x4a, 0x35, 0xc4, 0x24, 0xfe, 0x2f, 0xb8, 0xb2, 0x47, + 0x8b, 0xcd, 0xa7, 0x8e, 0x69, 0xa9, 0x65, 0xeb, 0xd1, 0xd1, 0x9e, 0xf0, 0x4a, 0xd6, 0x3b, 0xda, + 0x43, 0x55, 0xc8, 0xec, 0x6c, 0x09, 0x1b, 0x32, 0xbd, 0x2d, 0xfc, 0x99, 0x06, 0x48, 0x5d, 0x97, + 0xca, 0x4d, 0x11, 0xe1, 0x12, 0x3e, 0x1b, 0xc0, 0x2f, 0xc2, 0x2c, 0x71, 0x1c, 0xdb, 0x61, 0x0e, + 0x29, 0x19, 0x7c, 0x80, 0xef, 0x0a, 0x1d, 0x0c, 0x32, 0xb6, 0xcf, 0xfc, 0x53, 0xc8, 0xa5, 0x69, + 0xbe, 0xaa, 0xbb, 0xb0, 0x10, 0xe2, 0x4a, 0x95, 0xb5, 0x1e, 0xc0, 0x55, 0x26, 0x6c, 0x97, 0x90, + 0xe1, 0x46, 0xbf, 0x37, 0x4e, 0x44, 0x1d, 0xc2, 0xb5, 0x28, 0xe3, 0x37, 0xeb, 0x23, 0xdc, 0x85, + 0xfc, 0xfb, 0xec, 0x9e, 0xac, 0xe8, 0x92, 0x63, 0xbc, 0x08, 0x72, 0x96, 0x39, 0xe0, 0x57, 0x8e, + 0x92, 0xc1, 0x9e, 0x59, 0x9a, 0x27, 0xc4, 0x79, 0x6e, 0xec, 0xf1, 0xd7, 0x49, 0xc9, 0xf0, 0xc7, + 0x68, 0x99, 0xde, 0xd0, 0x7b, 0xc4, 0xf2, 0xd8, 0x6c, 0x8e, 0xcd, 0x2a, 0x14, 0xbc, 0x06, 0x35, + 0x8e, 0xb4, 0xd1, 0x6e, 0x2b, 0xaf, 0x14, 0x5f, 0x9e, 0x16, 0x96, 0x87, 0x5f, 0xc2, 0x15, 0x85, + 0x3f, 0x95, 0x1b, 0xde, 0x80, 0x3c, 0x6f, 0x06, 0x88, 0x6c, 0xb6, 0x18, 0x5e, 0xc5, 0x61, 0x0c, + 0xc1, 0x83, 0xef, 0xc1, 0x82, 0xa0, 0x90, 0x81, 0x1d, 0xb7, 0x57, 0xcc, 0x3f, 0x78, 0x0f, 0x16, + 0xc3, 0x6c, 0xa9, 0x8e, 0xc8, 0x86, 0x04, 0x7d, 0x3e, 0x6c, 0x2b, 0xc9, 0x31, 0xba, 0x29, 0xaa, + 0xc3, 0x32, 0x11, 0x87, 0xf9, 0x0a, 0x49, 0x11, 0xa9, 0x14, 0x5a, 0x90, 0xee, 0xdf, 0xeb, 0xb9, + 0xfe, 0x2b, 0xf0, 0x53, 0x40, 0x2a, 0x31, 0xd5, 0xa6, 0xac, 0x41, 0x81, 0x3b, 0x5c, 0x56, 0x59, + 0xf1, 0xbb, 0x22, 0x99, 0xa8, 0x42, 0x5b, 0xe4, 0x85, 0x63, 0x76, 0x06, 0xc4, 0xcf, 0x39, 0xb4, + 0xb6, 0x50, 0x89, 0xa9, 0x2c, 0xfe, 0xbd, 0x06, 0x95, 0x8d, 0xbe, 0xe9, 0x0c, 0xa4, 0xf3, 0xdf, + 0x83, 0x3c, 0x2f, 0x5a, 0x44, 0x61, 0x7f, 0x3f, 0x2c, 0x46, 0xe5, 0xe5, 0x83, 0x0d, 0x5e, 0xe2, + 0x88, 0x55, 0x74, 0xb3, 0x44, 0x0f, 0x6a, 0x2b, 0xd2, 0x93, 0xda, 0x42, 0x6f, 0xc2, 0xac, 0x49, + 0x97, 0xb0, 0x58, 0xac, 0x46, 0xcb, 0x45, 0x26, 0xed, 0xe8, 0x7c, 0x48, 0x0c, 0xce, 0x85, 0xdf, + 0x85, 0xb2, 0x82, 0x40, 0xab, 0xe0, 0xa7, 0xcd, 0xa3, 0xda, 0x0c, 0xaa, 0x40, 0x71, 0x63, 0xf3, + 0x68, 0xe7, 0x98, 0x17, 0xc7, 0x55, 0x80, 0xad, 0xa6, 0x3f, 0xce, 0xe0, 0x8f, 0xc4, 0x2a, 0x11, + 0xe1, 0xaa, 0x3e, 0x5a, 0x92, 0x3e, 0x99, 0x4b, 0xe9, 0xf3, 0x0a, 0xe6, 0x84, 0xf9, 0xa9, 0xce, + 0xc0, 0xdb, 0x90, 0x67, 0xf2, 0xe4, 0x11, 0x58, 0x8a, 0x81, 0x95, 0xd1, 0xc9, 0x19, 0xf1, 0x3c, + 0xcc, 0x1d, 0x7a, 0xa6, 0x37, 0x72, 0xe5, 0x11, 0xf8, 0x9d, 0x06, 0x55, 0x49, 0x49, 0xdb, 0x03, + 0x90, 0x77, 0x27, 0x9e, 0xf3, 0xfc, 0x9b, 0xd3, 0x35, 0xc8, 0xb7, 0x4f, 0x0f, 0x7b, 0x9f, 0xca, + 0x4e, 0x8b, 0x18, 0x51, 0x7a, 0x9f, 0xe3, 0xf0, 0xce, 0xa1, 0x18, 0xd1, 0xa2, 0xdc, 0x31, 0x5f, + 0x78, 0x3b, 0x56, 0x9b, 0xbc, 0x62, 0x6f, 0xda, 0x9c, 0x11, 0x10, 0x58, 0x1d, 0x2d, 0x3a, 0x8c, + 0xac, 0xe4, 0x50, 0x3b, 0x8e, 0x0b, 0x70, 0x65, 0x63, 0xe4, 0x75, 0x9b, 0x96, 0x79, 0xda, 0x97, + 0x49, 0x00, 0x2f, 0x02, 0xa2, 0xc4, 0xad, 0x9e, 0xab, 0x52, 0x9b, 0xb0, 0x40, 0xa9, 0xc4, 0xf2, + 0x7a, 0x2d, 0x25, 0x63, 0xc8, 0xb4, 0xad, 0x45, 0xd2, 0xb6, 0xe9, 0xba, 0x2f, 0x6d, 0xa7, 0x2d, + 0x4c, 0xf3, 0xc7, 0x78, 0x8b, 0x0b, 0x7f, 0xee, 0x86, 0x12, 0xf3, 0xd7, 0x95, 0xb2, 0x1a, 0x48, + 0x79, 0x4a, 0xbc, 0x29, 0x52, 0xf0, 0xeb, 0x70, 0x55, 0x72, 0x8a, 0xcb, 0xf5, 0x14, 0xe6, 0x03, + 0xb8, 0x29, 0x99, 0x37, 0xbb, 0xb4, 0x02, 0x7c, 0x26, 0x00, 0xff, 0x5d, 0x3d, 0x9f, 0x40, 0xdd, + 0xd7, 0x93, 0xd5, 0x20, 0x76, 0x5f, 0x55, 0x60, 0xe4, 0x8a, 0x33, 0x53, 0x32, 0xd8, 0x33, 0xa5, + 0x39, 0x76, 0xdf, 0x7f, 0x09, 0xd2, 0x67, 0xbc, 0x09, 0x4b, 0x52, 0x86, 0xa8, 0x0e, 0xc2, 0x42, + 0x26, 0x14, 0x8a, 0x13, 0x22, 0x1c, 0x46, 0x97, 0x4e, 0x77, 0xbb, 0xca, 0x19, 0x76, 0x2d, 0x93, + 0xa9, 0x29, 0x32, 0xaf, 0xf2, 0x13, 0x41, 0x15, 0x53, 0x93, 0xb6, 0x20, 0x53, 0x01, 0x2a, 0x59, + 0x6c, 0x04, 0x25, 0x4f, 0x6c, 0xc4, 0x84, 0xe8, 0x8f, 0x61, 0xd9, 0x57, 0x82, 0xfa, 0xed, 0x19, + 0x71, 0x06, 0x3d, 0xd7, 0x55, 0x6e, 0x87, 0x71, 0x86, 0xdf, 0x87, 0xdc, 0x90, 0x88, 0x9c, 0x52, + 0x5e, 0x47, 0x6b, 0xfc, 0x3b, 0xc0, 0x9a, 0xb2, 0x98, 0xcd, 0xe3, 0x36, 0xdc, 0x92, 0xd2, 0xb9, + 0x47, 0x63, 0xc5, 0x47, 0x95, 0x92, 0x37, 0x07, 0xee, 0xd6, 0xc9, 0x9b, 0x43, 0x96, 0xef, 0xbd, + 0xbc, 0x39, 0xd0, 0x77, 0x85, 0x1a, 0x5b, 0xa9, 0xde, 0x15, 0xbb, 0xdc, 0xa7, 0x7e, 0x48, 0xa6, + 0x12, 0x76, 0x0a, 0x8b, 0xe1, 0x48, 0x4e, 0x95, 0xc6, 0x16, 0x61, 0xd6, 0xb3, 0xcf, 0x88, 0x4c, + 0x62, 0x7c, 0x20, 0x15, 0xf6, 0xc3, 0x3c, 0x95, 0xc2, 0x66, 0x20, 0x8c, 0x1d, 0xc9, 0xb4, 0xfa, + 0xd2, 0xdd, 0x94, 0xf5, 0x0c, 0x1f, 0xe0, 0x7d, 0xb8, 0x16, 0x4d, 0x13, 0xa9, 0x54, 0x3e, 0xe6, + 0x07, 0x38, 0x2e, 0x93, 0xa4, 0x92, 0xfb, 0x41, 0x90, 0x0c, 0x94, 0x84, 0x92, 0x4a, 0xa4, 0x01, + 0x7a, 0x5c, 0x7e, 0xf9, 0x4f, 0x9c, 0x57, 0x3f, 0xdd, 0xa4, 0x12, 0xe6, 0x06, 0xc2, 0xd2, 0x6f, + 0x7f, 0x90, 0x23, 0xb2, 0x53, 0x73, 0x84, 0x08, 0x92, 0x20, 0x8b, 0x7d, 0x03, 0x87, 0x4e, 0x60, + 0x04, 0x09, 0x34, 0x2d, 0x06, 0x7d, 0x87, 0xf8, 0x18, 0x6c, 0x20, 0x0f, 0xb6, 0x9a, 0x76, 0x53, + 0x6d, 0xc6, 0x87, 0x41, 0xee, 0x9c, 0xc8, 0xcc, 0xa9, 0x04, 0x7f, 0x04, 0x2b, 0xc9, 0x49, 0x39, + 0x8d, 0xe4, 0x47, 0x18, 0x4a, 0x7e, 0x41, 0xa9, 0x7c, 0xf7, 0x2b, 0x43, 0x61, 0xff, 0xe0, 0xf0, + 0xd9, 0xc6, 0x66, 0xb3, 0xa6, 0xad, 0xff, 0x23, 0x0b, 0x99, 0xdd, 0x63, 0xf4, 0x6d, 0x98, 0xe5, + 0x5f, 0x05, 0xa6, 0x7c, 0x34, 0xd1, 0xa7, 0x7d, 0x5f, 0xc0, 0x37, 0x3e, 0xfb, 0xc3, 0x9f, 0xbf, + 0xc8, 0x5c, 0xc3, 0x57, 0x1a, 0xe3, 0x77, 0xcc, 0xfe, 0xb0, 0x6b, 0x36, 0xce, 0xc6, 0x0d, 0xf6, + 0x4e, 0x78, 0xac, 0x3d, 0x42, 0xc7, 0x90, 0x7d, 0x36, 0xf2, 0x50, 0xe2, 0x17, 0x15, 0x3d, 0xf9, + 0xbb, 0x03, 0xd6, 0x99, 0xe4, 0x45, 0x3c, 0xaf, 0x4a, 0x1e, 0x8e, 0x3c, 0x2a, 0x77, 0x0c, 0x65, + 0xe5, 0xd3, 0x01, 0xba, 0xf0, 0x5b, 0x8b, 0x7e, 0xf1, 0x67, 0x09, 0x8c, 0x19, 0xde, 0x0d, 0xfc, + 0x9a, 0x8a, 0xc7, 0xbf, 0x70, 0xa8, 0xf6, 0x1c, 0xbd, 0xb2, 0xa2, 0xf6, 0x04, 0xcd, 0xf0, 0xa8, + 0x3d, 0x4a, 0x03, 0x3a, 0xde, 0x1e, 0xef, 0x95, 0x45, 0xe5, 0xda, 0xe2, 0x73, 0x47, 0xcb, 0x43, + 0xb7, 0x62, 0xba, 0xe7, 0x6a, 0x9f, 0x58, 0x5f, 0x49, 0x66, 0x10, 0x48, 0xb7, 0x19, 0xd2, 0x75, + 0x7c, 0x4d, 0x45, 0x6a, 0xf9, 0x7c, 0x8f, 0xb5, 0x47, 0xeb, 0x5d, 0x98, 0x65, 0xbd, 0x34, 0x74, + 0x22, 0x1f, 0xf4, 0x98, 0x16, 0x64, 0xc2, 0x09, 0x08, 0x75, 0xe1, 0xf0, 0x12, 0x43, 0x5b, 0xc0, + 0x55, 0x1f, 0x8d, 0xb5, 0xd3, 0x1e, 0x6b, 0x8f, 0x56, 0xb5, 0xb7, 0xb4, 0xf5, 0xbf, 0x67, 0x60, + 0x96, 0x35, 0x5d, 0xd0, 0x10, 0x20, 0xe8, 0x4e, 0x45, 0xed, 0x9c, 0xe8, 0x77, 0x45, 0xed, 0x9c, + 0x6c, 0x6c, 0xe1, 0x5b, 0x0c, 0x79, 0x09, 0x2f, 0xfa, 0xc8, 0xec, 0x13, 0x6d, 0xa3, 0x43, 0xb9, + 0xa8, 0x5b, 0x5f, 0x42, 0x59, 0xe9, 0x32, 0xa1, 0x38, 0x89, 0xa1, 0x36, 0x55, 0xf4, 0x98, 0xc4, + 0xb4, 0xa8, 0xf0, 0x1d, 0x06, 0x7a, 0x13, 0xd7, 0x55, 0xe7, 0x72, 0x5c, 0x87, 0x71, 0x52, 0xe0, + 0x1f, 0x68, 0x50, 0x0d, 0x77, 0x9a, 0xd0, 0x9d, 0x18, 0xd1, 0xd1, 0x86, 0x95, 0x7e, 0x77, 0x3a, + 0x53, 0xa2, 0x0a, 0x1c, 0xff, 0x8c, 0x90, 0xa1, 0x49, 0x39, 0xa5, 0xef, 0xff, 0x99, 0x85, 0xc2, + 0x26, 0xff, 0x11, 0x07, 0xf2, 0xa0, 0xe4, 0xf7, 0x7b, 0xd0, 0x72, 0x5c, 0x2f, 0x20, 0x28, 0x94, + 0xf5, 0x5b, 0x89, 0xf3, 0x42, 0x85, 0xfb, 0x4c, 0x85, 0x15, 0x7c, 0xdd, 0x57, 0x41, 0xfc, 0x58, + 0xa4, 0xc1, 0xaf, 0xbc, 0x0d, 0xb3, 0xdd, 0xa6, 0x8e, 0xf8, 0xbe, 0x06, 0x15, 0xb5, 0x8d, 0x83, + 0x6e, 0xc7, 0x76, 0x21, 0xd4, 0x4e, 0x90, 0x8e, 0xa7, 0xb1, 0x08, 0xfc, 0x87, 0x0c, 0xff, 0x0e, + 0x5e, 0x4e, 0xc2, 0x77, 0x18, 0x7f, 0x58, 0x05, 0xde, 0xb8, 0x89, 0x57, 0x21, 0xd4, 0x17, 0x8a, + 0x57, 0x21, 0xdc, 0xf7, 0xb9, 0x58, 0x85, 0x11, 0xe3, 0xa7, 0x2a, 0xbc, 0x02, 0x08, 0xfa, 0x3a, + 0x28, 0xd6, 0xb9, 0xca, 0xd5, 0x21, 0x7a, 0xf2, 0x27, 0x5b, 0x42, 0xf8, 0x01, 0xc3, 0xbe, 0x8d, + 0x6f, 0x24, 0x61, 0xf7, 0x7b, 0x2e, 0x8d, 0x80, 0xf5, 0xdf, 0xe4, 0xa0, 0xfc, 0xbe, 0xd9, 0xb3, + 0x3c, 0x62, 0x99, 0x56, 0x8b, 0xa0, 0x0e, 0xcc, 0xb2, 0x77, 0x43, 0x34, 0xdc, 0xd5, 0x66, 0x4b, + 0x34, 0xdc, 0x43, 0x9d, 0x08, 0x7c, 0x8f, 0x41, 0xdf, 0xc2, 0xba, 0x0f, 0x3d, 0x08, 0xe4, 0x37, + 0x58, 0x17, 0x81, 0x9a, 0x7c, 0x06, 0x79, 0xde, 0x35, 0x40, 0x11, 0x69, 0xa1, 0xee, 0x82, 0x7e, + 0x23, 0x7e, 0x32, 0xf1, 0x94, 0xa9, 0x58, 0x2e, 0x63, 0xa6, 0x60, 0xdf, 0x01, 0x08, 0xda, 0x54, + 0x51, 0xff, 0x4e, 0x74, 0xb5, 0xf4, 0x95, 0x64, 0x06, 0x01, 0xfc, 0x88, 0x01, 0xdf, 0xc5, 0xb7, + 0x62, 0x81, 0xdb, 0xfe, 0x02, 0x0a, 0xde, 0x82, 0xdc, 0xb6, 0xe9, 0x76, 0x51, 0x24, 0xf5, 0x2b, + 0xdf, 0xd1, 0x74, 0x3d, 0x6e, 0x4a, 0x40, 0xdd, 0x65, 0x50, 0xcb, 0x78, 0x29, 0x16, 0xaa, 0x6b, + 0xba, 0x34, 0x93, 0xa2, 0x11, 0x14, 0xe5, 0xb7, 0x31, 0x74, 0x33, 0xe2, 0xb3, 0xf0, 0x77, 0x34, + 0x7d, 0x39, 0x69, 0x5a, 0x00, 0xae, 0x32, 0x40, 0x8c, 0x6f, 0xc6, 0x3b, 0x55, 0xb0, 0x3f, 0xd6, + 0x1e, 0xbd, 0xa5, 0xad, 0xff, 0xa8, 0x06, 0x39, 0x5a, 0xa5, 0xd0, 0xdc, 0x1d, 0x5c, 0xee, 0xa2, + 0x1e, 0x9e, 0x68, 0xa9, 0x44, 0x3d, 0x3c, 0x79, 0x2f, 0x8c, 0xc9, 0xdd, 0xec, 0xa7, 0x6c, 0x84, + 0x71, 0x51, 0x8b, 0x3d, 0x28, 0x2b, 0x57, 0x40, 0x14, 0x23, 0x31, 0xdc, 0xb0, 0x89, 0xe6, 0xee, + 0x98, 0xfb, 0x23, 0x5e, 0x61, 0xa0, 0x3a, 0xbe, 0x1a, 0x06, 0x6d, 0x73, 0x36, 0x8a, 0xfa, 0x5d, + 0xa8, 0xa8, 0x77, 0x45, 0x14, 0x23, 0x34, 0xd2, 0x11, 0x8a, 0xe6, 0x8a, 0xb8, 0xab, 0x66, 0x4c, + 0xd0, 0xf8, 0x3f, 0xdc, 0x93, 0xbc, 0x14, 0xfd, 0x13, 0x28, 0x88, 0x1b, 0x64, 0x9c, 0xbd, 0xe1, + 0x1e, 0x52, 0x9c, 0xbd, 0x91, 0xeb, 0x67, 0x4c, 0x21, 0xc0, 0x60, 0x69, 0xa5, 0x2c, 0x13, 0xb4, + 0x80, 0x7c, 0x4a, 0xbc, 0x24, 0xc8, 0xa0, 0x2b, 0x92, 0x04, 0xa9, 0xdc, 0x52, 0xa6, 0x42, 0x76, + 0x88, 0x27, 0xce, 0xb2, 0xbc, 0x02, 0xa0, 0x04, 0x89, 0x6a, 0x36, 0xc4, 0xd3, 0x58, 0x12, 0x6b, + 0xb7, 0x00, 0x55, 0xa4, 0x42, 0xf4, 0x3d, 0x80, 0xe0, 0xba, 0x1b, 0x7d, 0x1d, 0xc7, 0xf6, 0xcc, + 0xa2, 0xaf, 0xe3, 0xf8, 0x1b, 0x73, 0x4c, 0x04, 0x07, 0xe0, 0xbc, 0x7e, 0xa4, 0xf0, 0x3f, 0xd1, + 0x00, 0x4d, 0x5e, 0x8f, 0xd1, 0xeb, 0xf1, 0x10, 0xb1, 0xed, 0x38, 0xfd, 0x8d, 0xcb, 0x31, 0x27, + 0x66, 0xcf, 0x40, 0xaf, 0x16, 0x5b, 0x32, 0x7c, 0x49, 0x35, 0xfb, 0x5c, 0x83, 0xb9, 0xd0, 0x05, + 0x1b, 0xdd, 0x4f, 0xd8, 0xe7, 0x48, 0x4b, 0x4f, 0x7f, 0x70, 0x21, 0x5f, 0x62, 0xc5, 0xa2, 0x9c, + 0x0a, 0x59, 0xad, 0xfd, 0x50, 0x83, 0x6a, 0xf8, 0x56, 0x8e, 0x12, 0x00, 0x26, 0xfa, 0x82, 0xfa, + 0xea, 0xc5, 0x8c, 0x97, 0xd8, 0xad, 0xa0, 0x80, 0xfb, 0x04, 0x0a, 0xe2, 0x32, 0x1f, 0x17, 0x16, + 0xe1, 0xb6, 0x62, 0x5c, 0x58, 0x44, 0x3a, 0x01, 0x49, 0x61, 0x41, 0xef, 0xc5, 0x4a, 0x24, 0x8a, + 0x2b, 0x7f, 0x12, 0xe4, 0xf4, 0x48, 0x8c, 0xf4, 0x0b, 0xa6, 0x42, 0x06, 0x91, 0x28, 0x2f, 0xfc, + 0x28, 0x41, 0xe2, 0x05, 0x91, 0x18, 0xed, 0x17, 0x24, 0x45, 0x22, 0x43, 0x55, 0x22, 0x31, 0xb8, + 0x9f, 0xc7, 0x45, 0xe2, 0x44, 0xd3, 0x34, 0x2e, 0x12, 0x27, 0xaf, 0xf8, 0x49, 0x7b, 0xcb, 0xc0, + 0x43, 0x91, 0xb8, 0x10, 0x73, 0x9f, 0x47, 0x6f, 0x24, 0xf8, 0x34, 0xb6, 0x21, 0xab, 0xbf, 0x79, + 0x49, 0xee, 0xe9, 0x11, 0xc0, 0x77, 0x43, 0x46, 0xc0, 0x2f, 0x34, 0x58, 0x8c, 0x6b, 0x08, 0xa0, + 0x04, 0xb0, 0x84, 0x6e, 0xae, 0xbe, 0x76, 0x59, 0xf6, 0x4b, 0xf8, 0xcd, 0x8f, 0x89, 0x27, 0xb5, + 0xdf, 0x7e, 0xb5, 0xac, 0x7d, 0xf9, 0xd5, 0xb2, 0xf6, 0xc7, 0xaf, 0x96, 0xb5, 0x9f, 0xfe, 0x69, + 0x79, 0xe6, 0x34, 0xcf, 0x7e, 0x4f, 0xfe, 0xce, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x2c, 0x72, + 0x99, 0x38, 0xd6, 0x2e, 0x00, 0x00, } diff --git a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/rpc.proto b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/rpc.proto index 04f08cb564..5c04ccb8e9 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/rpc.proto +++ b/vendor/github.com/coreos/etcd/etcdserver/etcdserverpb/rpc.proto @@ -396,10 +396,16 @@ message PutRequest { // lease is the lease ID to associate with the key in the key-value store. A lease // value of 0 indicates no lease. int64 lease = 3; + + // If prev_kv is set, etcd gets the previous key-value pair before changing it. + // The previous key-value pair will be returned in the put response. + bool prev_kv = 4; } message PutResponse { ResponseHeader header = 1; + // if prev_kv is set in the request, the previous key-value pair will be returned. + mvccpb.KeyValue prev_kv = 2; } message DeleteRangeRequest { @@ -409,12 +415,17 @@ message DeleteRangeRequest { // If range_end is not given, the range is defined to contain only the key argument. // If range_end is '\0', the range is all keys greater than or equal to the key argument. bytes range_end = 2; + // If prev_kv is set, etcd gets the previous key-value pairs before deleting it. + // The previous key-value pairs will be returned in the delte response. + bool prev_kv = 3; } message DeleteRangeResponse { ResponseHeader header = 1; // deleted is the number of keys deleted by the delete range request. int64 deleted = 2; + // if prev_kv is set in the request, the previous key-value pairs will be returned. + repeated mvccpb.KeyValue prev_kvs = 3; } message RequestOp { @@ -563,6 +574,9 @@ message WatchCreateRequest { // wish to recover a disconnected watcher starting from a recent known revision. // The etcd server may decide how often it will send notifications based on current load. bool progress_notify = 4; + // If prev_kv is set, created watcher gets the previous KV before the event happens. + // If the previous KV is already compacted, nothing will be returned. + bool prev_kv = 6; } message WatchCancelRequest { diff --git a/vendor/github.com/coreos/etcd/etcdserver/server.go b/vendor/github.com/coreos/etcd/etcdserver/server.go index afbbfc656a..dd232d5ef2 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/server.go +++ b/vendor/github.com/coreos/etcd/etcdserver/server.go @@ -412,8 +412,13 @@ func NewServer(cfg *ServerConfig) (srv *EtcdServer, err error) { srv.kv = mvcc.New(srv.be, srv.lessor, &srv.consistIndex) if beExist { kvindex := srv.kv.ConsistentIndex() + // TODO: remove kvindex != 0 checking when we do not expect users to upgrade + // etcd from pre-3.0 release. if snapshot != nil && kvindex < snapshot.Metadata.Index { - return nil, fmt.Errorf("database file (%v index %d) does not match with snapshot (index %d).", bepath, kvindex, snapshot.Metadata.Index) + if kvindex != 0 { + return nil, fmt.Errorf("database file (%v index %d) does not match with snapshot (index %d).", bepath, kvindex, snapshot.Metadata.Index) + } + plog.Warningf("consistent index never saved (snapshot index=%d)", snapshot.Metadata.Index) } } srv.consistIndex.setConsistentIndex(srv.kv.ConsistentIndex()) diff --git a/vendor/github.com/coreos/etcd/etcdserver/v3_server.go b/vendor/github.com/coreos/etcd/etcdserver/v3_server.go index 12e7eda703..dcd0f0d8a4 100644 --- a/vendor/github.com/coreos/etcd/etcdserver/v3_server.go +++ b/vendor/github.com/coreos/etcd/etcdserver/v3_server.go @@ -551,4 +551,4 @@ func (s *EtcdServer) processInternalRaftRequest(ctx context.Context, r pb.Intern } // Watchable returns a watchable interface attached to the etcdserver. -func (s *EtcdServer) Watchable() mvcc.Watchable { return s.KV() } +func (s *EtcdServer) Watchable() mvcc.WatchableKV { return s.KV() } diff --git a/vendor/github.com/coreos/etcd/lease/leasepb/lease.pb.go b/vendor/github.com/coreos/etcd/lease/leasepb/lease.pb.go index 62115a3c99..dde5f286ea 100644 --- a/vendor/github.com/coreos/etcd/lease/leasepb/lease.pb.go +++ b/vendor/github.com/coreos/etcd/lease/leasepb/lease.pb.go @@ -19,9 +19,9 @@ import ( proto "github.com/golang/protobuf/proto" math "math" -) -import io "io" + io "io" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal diff --git a/vendor/github.com/coreos/etcd/mvcc/mvccpb/kv.pb.go b/vendor/github.com/coreos/etcd/mvcc/mvccpb/kv.pb.go index 2ab97270cf..12c0383285 100644 --- a/vendor/github.com/coreos/etcd/mvcc/mvccpb/kv.pb.go +++ b/vendor/github.com/coreos/etcd/mvcc/mvccpb/kv.pb.go @@ -20,9 +20,9 @@ import ( proto "github.com/golang/protobuf/proto" math "math" -) -import io "io" + io "io" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -89,6 +89,8 @@ type Event struct { // A DELETE/EXPIRE event contains the deleted key with // its modification revision set to the revision of deletion. Kv *KeyValue `protobuf:"bytes,2,opt,name=kv" json:"kv,omitempty"` + // prev_kv holds the key-value pair before the event happens. + PrevKv *KeyValue `protobuf:"bytes,3,opt,name=prev_kv,json=prevKv" json:"prev_kv,omitempty"` } func (m *Event) Reset() { *m = Event{} } @@ -181,6 +183,16 @@ func (m *Event) MarshalTo(data []byte) (int, error) { } i += n1 } + if m.PrevKv != nil { + data[i] = 0x1a + i++ + i = encodeVarintKv(data, i, uint64(m.PrevKv.Size())) + n2, err := m.PrevKv.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n2 + } return i, nil } @@ -247,6 +259,10 @@ func (m *Event) Size() (n int) { l = m.Kv.Size() n += 1 + l + sovKv(uint64(l)) } + if m.PrevKv != nil { + l = m.PrevKv.Size() + n += 1 + l + sovKv(uint64(l)) + } return n } @@ -532,6 +548,39 @@ func (m *Event) Unmarshal(data []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrevKv", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowKv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthKv + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PrevKv == nil { + m.PrevKv = &KeyValue{} + } + if err := m.PrevKv.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipKv(data[iNdEx:]) @@ -659,23 +708,24 @@ var ( ) var fileDescriptorKv = []byte{ - // 285 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x44, 0x90, 0x41, 0x4a, 0xc3, 0x40, - 0x14, 0x86, 0x33, 0x4d, 0x9b, 0xd6, 0xd7, 0x52, 0xc3, 0x50, 0x70, 0x70, 0x31, 0xc4, 0x6e, 0x2c, - 0x08, 0x11, 0xea, 0x0d, 0xc4, 0xac, 0x74, 0x21, 0x21, 0xba, 0x95, 0x34, 0x7d, 0x94, 0x92, 0xa6, - 0x13, 0xd2, 0x38, 0x98, 0x9b, 0x78, 0x0a, 0xcf, 0xd1, 0x65, 0x8f, 0x60, 0xe3, 0x45, 0x24, 0x6f, - 0x4c, 0xdd, 0x0c, 0xef, 0xff, 0xff, 0x6f, 0x98, 0xff, 0x0d, 0x0c, 0x52, 0xed, 0xe7, 0x85, 0x2a, - 0x15, 0x77, 0x32, 0x9d, 0x24, 0xf9, 0xe2, 0x72, 0xb2, 0x52, 0x2b, 0x45, 0xd6, 0x6d, 0x33, 0x99, - 0x74, 0xfa, 0xc5, 0x60, 0xf0, 0x88, 0xd5, 0x6b, 0xbc, 0x79, 0x47, 0xee, 0x82, 0x9d, 0x62, 0x25, - 0x98, 0xc7, 0x66, 0xa3, 0xb0, 0x19, 0xf9, 0x35, 0x9c, 0x27, 0x05, 0xc6, 0x25, 0xbe, 0x15, 0xa8, - 0xd7, 0xbb, 0xb5, 0xda, 0x8a, 0x8e, 0xc7, 0x66, 0x76, 0x38, 0x36, 0x76, 0xf8, 0xe7, 0xf2, 0x2b, - 0x18, 0x65, 0x6a, 0xf9, 0x4f, 0xd9, 0x44, 0x0d, 0x33, 0xb5, 0x3c, 0x21, 0x02, 0xfa, 0x1a, 0x0b, - 0x4a, 0xbb, 0x94, 0xb6, 0x92, 0x4f, 0xa0, 0xa7, 0x9b, 0x02, 0xa2, 0x47, 0x2f, 0x1b, 0xd1, 0xb8, - 0x1b, 0x8c, 0x77, 0x28, 0x1c, 0xa2, 0x8d, 0x98, 0x7e, 0x40, 0x2f, 0xd0, 0xb8, 0x2d, 0xf9, 0x0d, - 0x74, 0xcb, 0x2a, 0x47, 0x6a, 0x3b, 0x9e, 0x5f, 0xf8, 0x66, 0x4d, 0x9f, 0x42, 0x73, 0x46, 0x55, - 0x8e, 0x21, 0x41, 0xdc, 0x83, 0x4e, 0xaa, 0xa9, 0xfa, 0x70, 0xee, 0xb6, 0x68, 0xbb, 0x77, 0xd8, - 0x49, 0xf5, 0xd4, 0x83, 0xb3, 0xd3, 0x25, 0xde, 0x07, 0xfb, 0xf9, 0x25, 0x72, 0x2d, 0x0e, 0xe0, - 0x3c, 0x04, 0x4f, 0x41, 0x14, 0xb8, 0xec, 0x5e, 0xec, 0x8f, 0xd2, 0x3a, 0x1c, 0xa5, 0xb5, 0xaf, - 0x25, 0x3b, 0xd4, 0x92, 0x7d, 0xd7, 0x92, 0x7d, 0xfe, 0x48, 0x6b, 0xe1, 0xd0, 0x5f, 0xde, 0xfd, - 0x06, 0x00, 0x00, 0xff, 0xff, 0xd6, 0x21, 0x8f, 0x2c, 0x75, 0x01, 0x00, 0x00, + // 303 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x6c, 0x90, 0x41, 0x4e, 0xc2, 0x40, + 0x14, 0x86, 0x3b, 0x14, 0x0a, 0x3e, 0x08, 0x36, 0x13, 0x12, 0x27, 0x2e, 0x26, 0x95, 0x8d, 0x18, + 0x13, 0x4c, 0xf0, 0x06, 0xc6, 0xae, 0x70, 0x61, 0x1a, 0x74, 0x4b, 0x4a, 0x79, 0x21, 0xa4, 0x94, + 0x69, 0x4a, 0x9d, 0xa4, 0x37, 0x71, 0xef, 0xde, 0x73, 0xb0, 0xe4, 0x08, 0x52, 0x2f, 0x62, 0xfa, + 0xc6, 0xe2, 0xc6, 0xcd, 0xe4, 0xfd, 0xff, 0xff, 0x65, 0xe6, 0x7f, 0x03, 0x9d, 0x58, 0x8f, 0xd3, + 0x4c, 0xe5, 0x8a, 0x3b, 0x89, 0x8e, 0xa2, 0x74, 0x71, 0x39, 0x58, 0xa9, 0x95, 0x22, 0xeb, 0xae, + 0x9a, 0x4c, 0x3a, 0xfc, 0x64, 0xd0, 0x99, 0x62, 0xf1, 0x1a, 0x6e, 0xde, 0x90, 0xbb, 0x60, 0xc7, + 0x58, 0x08, 0xe6, 0xb1, 0x51, 0x2f, 0xa8, 0x46, 0x7e, 0x0d, 0xe7, 0x51, 0x86, 0x61, 0x8e, 0xf3, + 0x0c, 0xf5, 0x7a, 0xb7, 0x56, 0x5b, 0xd1, 0xf0, 0xd8, 0xc8, 0x0e, 0xfa, 0xc6, 0x0e, 0x7e, 0x5d, + 0x7e, 0x05, 0xbd, 0x44, 0x2d, 0xff, 0x28, 0x9b, 0xa8, 0x6e, 0xa2, 0x96, 0x27, 0x44, 0x40, 0x5b, + 0x63, 0x46, 0x69, 0x93, 0xd2, 0x5a, 0xf2, 0x01, 0xb4, 0x74, 0x55, 0x40, 0xb4, 0xe8, 0x65, 0x23, + 0x2a, 0x77, 0x83, 0xe1, 0x0e, 0x85, 0x43, 0xb4, 0x11, 0xc3, 0x0f, 0x06, 0x2d, 0x5f, 0xe3, 0x36, + 0xe7, 0xb7, 0xd0, 0xcc, 0x8b, 0x14, 0xa9, 0x6e, 0x7f, 0x72, 0x31, 0x36, 0x7b, 0x8e, 0x29, 0x34, + 0xe7, 0xac, 0x48, 0x31, 0x20, 0x88, 0x7b, 0xd0, 0x88, 0x35, 0x75, 0xef, 0x4e, 0xdc, 0x1a, 0xad, + 0x17, 0x0f, 0x1a, 0xb1, 0xe6, 0x37, 0xd0, 0x4e, 0x33, 0xd4, 0xf3, 0x58, 0x53, 0xf9, 0xff, 0x30, + 0xa7, 0x02, 0xa6, 0x7a, 0xe8, 0xc1, 0xd9, 0xe9, 0x7e, 0xde, 0x06, 0xfb, 0xf9, 0x65, 0xe6, 0x5a, + 0x1c, 0xc0, 0x79, 0xf4, 0x9f, 0xfc, 0x99, 0xef, 0xb2, 0x07, 0xb1, 0x3f, 0x4a, 0xeb, 0x70, 0x94, + 0xd6, 0xbe, 0x94, 0xec, 0x50, 0x4a, 0xf6, 0x55, 0x4a, 0xf6, 0xfe, 0x2d, 0xad, 0x85, 0x43, 0xff, + 0x7e, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x45, 0x92, 0x5d, 0xa1, 0x01, 0x00, 0x00, } diff --git a/vendor/github.com/coreos/etcd/mvcc/mvccpb/kv.proto b/vendor/github.com/coreos/etcd/mvcc/mvccpb/kv.proto index f0c82b57cd..f150d26c75 100644 --- a/vendor/github.com/coreos/etcd/mvcc/mvccpb/kv.proto +++ b/vendor/github.com/coreos/etcd/mvcc/mvccpb/kv.proto @@ -43,4 +43,6 @@ message Event { // A DELETE/EXPIRE event contains the deleted key with // its modification revision set to the revision of deletion. KeyValue kv = 2; + // prev_kv holds the key-value pair before the event happens. + KeyValue prev_kv = 3; } diff --git a/vendor/github.com/coreos/etcd/pkg/fileutil/dir_unix.go b/vendor/github.com/coreos/etcd/pkg/fileutil/dir_unix.go new file mode 100644 index 0000000000..58a77dfc1a --- /dev/null +++ b/vendor/github.com/coreos/etcd/pkg/fileutil/dir_unix.go @@ -0,0 +1,22 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows + +package fileutil + +import "os" + +// OpenDir opens a directory for syncing. +func OpenDir(path string) (*os.File, error) { return os.Open(path) } diff --git a/vendor/github.com/coreos/etcd/pkg/fileutil/dir_windows.go b/vendor/github.com/coreos/etcd/pkg/fileutil/dir_windows.go new file mode 100644 index 0000000000..c123395c00 --- /dev/null +++ b/vendor/github.com/coreos/etcd/pkg/fileutil/dir_windows.go @@ -0,0 +1,46 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build windows + +package fileutil + +import ( + "os" + "syscall" +) + +// OpenDir opens a directory in windows with write access for syncing. +func OpenDir(path string) (*os.File, error) { + fd, err := openDir(path) + if err != nil { + return nil, err + } + return os.NewFile(uintptr(fd), path), nil +} + +func openDir(path string) (fd syscall.Handle, err error) { + if len(path) == 0 { + return syscall.InvalidHandle, syscall.ERROR_FILE_NOT_FOUND + } + pathp, err := syscall.UTF16PtrFromString(path) + if err != nil { + return syscall.InvalidHandle, err + } + access := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE) + sharemode := uint32(syscall.FILE_SHARE_READ | syscall.FILE_SHARE_WRITE) + createmode := uint32(syscall.OPEN_EXISTING) + fl := uint32(syscall.FILE_FLAG_BACKUP_SEMANTICS) + return syscall.CreateFile(pathp, access, sharemode, nil, createmode, fl, 0) +} diff --git a/vendor/github.com/coreos/etcd/pkg/fileutil/fileutil.go b/vendor/github.com/coreos/etcd/pkg/fileutil/fileutil.go index c963a79032..8d9e725f09 100644 --- a/vendor/github.com/coreos/etcd/pkg/fileutil/fileutil.go +++ b/vendor/github.com/coreos/etcd/pkg/fileutil/fileutil.go @@ -96,3 +96,26 @@ func Exist(name string) bool { _, err := os.Stat(name) return err == nil } + +// ZeroToEnd zeros a file starting from SEEK_CUR to its SEEK_END. May temporarily +// shorten the length of the file. +func ZeroToEnd(f *os.File) error { + // TODO: support FALLOC_FL_ZERO_RANGE + off, err := f.Seek(0, os.SEEK_CUR) + if err != nil { + return err + } + lenf, lerr := f.Seek(0, os.SEEK_END) + if lerr != nil { + return lerr + } + if err = f.Truncate(off); err != nil { + return err + } + // make sure blocks remain allocated + if err = Preallocate(f, lenf, true); err != nil { + return err + } + _, err = f.Seek(off, os.SEEK_SET) + return err +} diff --git a/vendor/github.com/coreos/etcd/pkg/ioutil/pagewriter.go b/vendor/github.com/coreos/etcd/pkg/ioutil/pagewriter.go new file mode 100644 index 0000000000..72de1593d3 --- /dev/null +++ b/vendor/github.com/coreos/etcd/pkg/ioutil/pagewriter.go @@ -0,0 +1,106 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ioutil + +import ( + "io" +) + +var defaultBufferBytes = 128 * 1024 + +// PageWriter implements the io.Writer interface so that writes will +// either be in page chunks or from flushing. +type PageWriter struct { + w io.Writer + // pageOffset tracks the page offset of the base of the buffer + pageOffset int + // pageBytes is the number of bytes per page + pageBytes int + // bufferedBytes counts the number of bytes pending for write in the buffer + bufferedBytes int + // buf holds the write buffer + buf []byte + // bufWatermarkBytes is the number of bytes the buffer can hold before it needs + // to be flushed. It is less than len(buf) so there is space for slack writes + // to bring the writer to page alignment. + bufWatermarkBytes int +} + +// NewPageWriter creates a new PageWriter. pageBytes is the number of bytes +// to write per page. pageOffset is the starting offset of io.Writer. +func NewPageWriter(w io.Writer, pageBytes, pageOffset int) *PageWriter { + return &PageWriter{ + w: w, + pageOffset: pageOffset, + pageBytes: pageBytes, + buf: make([]byte, defaultBufferBytes+pageBytes), + bufWatermarkBytes: defaultBufferBytes, + } +} + +func (pw *PageWriter) Write(p []byte) (n int, err error) { + if len(p)+pw.bufferedBytes <= pw.bufWatermarkBytes { + // no overflow + copy(pw.buf[pw.bufferedBytes:], p) + pw.bufferedBytes += len(p) + return len(p), nil + } + // complete the slack page in the buffer if unaligned + slack := pw.pageBytes - ((pw.pageOffset + pw.bufferedBytes) % pw.pageBytes) + if slack != pw.pageBytes { + partial := slack > len(p) + if partial { + // not enough data to complete the slack page + slack = len(p) + } + // special case: writing to slack page in buffer + copy(pw.buf[pw.bufferedBytes:], p[:slack]) + pw.bufferedBytes += slack + n = slack + p = p[slack:] + if partial { + // avoid forcing an unaligned flush + return n, nil + } + } + // buffer contents are now page-aligned; clear out + if err = pw.Flush(); err != nil { + return n, err + } + // directly write all complete pages without copying + if len(p) > pw.pageBytes { + pages := len(p) / pw.pageBytes + c, werr := pw.w.Write(p[:pages*pw.pageBytes]) + n += c + if werr != nil { + return n, werr + } + p = p[pages*pw.pageBytes:] + } + // write remaining tail to buffer + c, werr := pw.Write(p) + n += c + return n, werr +} + +func (pw *PageWriter) Flush() error { + if pw.bufferedBytes == 0 { + return nil + } + _, err := pw.w.Write(pw.buf[:pw.bufferedBytes]) + pw.pageOffset = (pw.pageOffset + pw.bufferedBytes) % pw.pageBytes + pw.bufferedBytes = 0 + return err +} diff --git a/vendor/github.com/coreos/etcd/raft/raftpb/raft.pb.go b/vendor/github.com/coreos/etcd/raft/raftpb/raft.pb.go index 6199ee8165..664b5b8289 100644 --- a/vendor/github.com/coreos/etcd/raft/raftpb/raft.pb.go +++ b/vendor/github.com/coreos/etcd/raft/raftpb/raft.pb.go @@ -25,9 +25,9 @@ import ( proto "github.com/golang/protobuf/proto" math "math" -) -import io "io" + io "io" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal diff --git a/vendor/github.com/coreos/etcd/rafthttp/stream.go b/vendor/github.com/coreos/etcd/rafthttp/stream.go index 76e731e91d..7487707267 100644 --- a/vendor/github.com/coreos/etcd/rafthttp/stream.go +++ b/vendor/github.com/coreos/etcd/rafthttp/stream.go @@ -49,6 +49,7 @@ var ( "2.1.0": {streamTypeMsgAppV2, streamTypeMessage}, "2.2.0": {streamTypeMsgAppV2, streamTypeMessage}, "2.3.0": {streamTypeMsgAppV2, streamTypeMessage}, + "3.0.0": {streamTypeMsgAppV2, streamTypeMessage}, } ) diff --git a/vendor/github.com/coreos/etcd/snap/snappb/snap.pb.go b/vendor/github.com/coreos/etcd/snap/snappb/snap.pb.go index 11c86dfeae..f9ef5077dd 100644 --- a/vendor/github.com/coreos/etcd/snap/snappb/snap.pb.go +++ b/vendor/github.com/coreos/etcd/snap/snappb/snap.pb.go @@ -19,9 +19,9 @@ import ( proto "github.com/golang/protobuf/proto" math "math" -) -import io "io" + io "io" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal diff --git a/vendor/github.com/coreos/etcd/version/version.go b/vendor/github.com/coreos/etcd/version/version.go index 224dfe4322..6934905ba0 100644 --- a/vendor/github.com/coreos/etcd/version/version.go +++ b/vendor/github.com/coreos/etcd/version/version.go @@ -29,7 +29,7 @@ import ( var ( // MinClusterVersion is the min cluster version this etcd binary is compatible with. MinClusterVersion = "2.3.0" - Version = "3.0.6" + Version = "3.0.12" // Git SHA Value will be set during build GitSHA = "Not provided (use ./build instead of go build)" diff --git a/vendor/github.com/coreos/etcd/wal/encoder.go b/vendor/github.com/coreos/etcd/wal/encoder.go index fdeceaf800..cc3eeebcc7 100644 --- a/vendor/github.com/coreos/etcd/wal/encoder.go +++ b/vendor/github.com/coreos/etcd/wal/encoder.go @@ -15,28 +15,34 @@ package wal import ( - "bufio" "encoding/binary" "hash" "io" + "os" "sync" "github.com/coreos/etcd/pkg/crc" + "github.com/coreos/etcd/pkg/ioutil" "github.com/coreos/etcd/wal/walpb" ) +// walPageBytes is the alignment for flushing records to the backing Writer. +// It should be a multiple of the minimum sector size so that WAL repair can +// safely between torn writes and ordinary data corruption. +const walPageBytes = 8 * minSectorSize + type encoder struct { mu sync.Mutex - bw *bufio.Writer + bw *ioutil.PageWriter crc hash.Hash32 buf []byte uint64buf []byte } -func newEncoder(w io.Writer, prevCrc uint32) *encoder { +func newEncoder(w io.Writer, prevCrc uint32, pageOffset int) *encoder { return &encoder{ - bw: bufio.NewWriter(w), + bw: ioutil.NewPageWriter(w, walPageBytes, pageOffset), crc: crc.New(prevCrc, crcTable), // 1MB buffer buf: make([]byte, 1024*1024), @@ -44,6 +50,15 @@ func newEncoder(w io.Writer, prevCrc uint32) *encoder { } } +// newFileEncoder creates a new encoder with current file offset for the page writer. +func newFileEncoder(f *os.File, prevCrc uint32) (*encoder, error) { + offset, err := f.Seek(0, os.SEEK_CUR) + if err != nil { + return nil, err + } + return newEncoder(f, prevCrc, int(offset)), nil +} + func (e *encoder) encode(rec *walpb.Record) error { e.mu.Lock() defer e.mu.Unlock() diff --git a/vendor/github.com/coreos/etcd/wal/wal.go b/vendor/github.com/coreos/etcd/wal/wal.go index e9ca81e2a2..2e4e0ba0e8 100644 --- a/vendor/github.com/coreos/etcd/wal/wal.go +++ b/vendor/github.com/coreos/etcd/wal/wal.go @@ -67,7 +67,11 @@ var ( // A just opened WAL is in read mode, and ready for reading records. // The WAL will be ready for appending after reading out all the previous records. type WAL struct { - dir string // the living directory of the underlay files + dir string // the living directory of the underlay files + + // dirFile is a fd for the wal directory for syncing on Rename + dirFile *os.File + metadata []byte // metadata recorded at the head of each WAL state raftpb.HardState // hardstate recorded at the head of WAL @@ -106,45 +110,49 @@ func Create(dirpath string, metadata []byte) (*WAL, error) { if err != nil { return nil, err } - if _, err := f.Seek(0, os.SEEK_END); err != nil { + if _, err = f.Seek(0, os.SEEK_END); err != nil { return nil, err } - if err := fileutil.Preallocate(f.File, segmentSizeBytes, true); err != nil { + if err = fileutil.Preallocate(f.File, segmentSizeBytes, true); err != nil { return nil, err } w := &WAL{ dir: dirpath, metadata: metadata, - encoder: newEncoder(f, 0), + } + w.encoder, err = newFileEncoder(f.File, 0) + if err != nil { + return nil, err } w.locks = append(w.locks, f) - if err := w.saveCrc(0); err != nil { + if err = w.saveCrc(0); err != nil { return nil, err } - if err := w.encoder.encode(&walpb.Record{Type: metadataType, Data: metadata}); err != nil { + if err = w.encoder.encode(&walpb.Record{Type: metadataType, Data: metadata}); err != nil { return nil, err } - if err := w.SaveSnapshot(walpb.Snapshot{}); err != nil { + if err = w.SaveSnapshot(walpb.Snapshot{}); err != nil { return nil, err } - // rename of directory with locked files doesn't work on windows; close - // the WAL to release the locks so the directory can be renamed - w.Close() - if err := os.Rename(tmpdirpath, dirpath); err != nil { + if w, err = w.renameWal(tmpdirpath); err != nil { return nil, err } - // reopen and relock - newWAL, oerr := Open(dirpath, walpb.Snapshot{}) - if oerr != nil { - return nil, oerr + + // directory was renamed; sync parent dir to persist rename + pdir, perr := fileutil.OpenDir(path.Dir(w.dir)) + if perr != nil { + return nil, perr } - if _, _, _, err := newWAL.ReadAll(); err != nil { - newWAL.Close() - return nil, err + if perr = fileutil.Fsync(pdir); perr != nil { + return nil, perr } - return newWAL, nil + if perr = pdir.Close(); err != nil { + return nil, perr + } + + return w, nil } // Open opens the WAL at the given snap. @@ -154,7 +162,14 @@ func Create(dirpath string, metadata []byte) (*WAL, error) { // the given snap. The WAL cannot be appended to before reading out all of its // previous records. func Open(dirpath string, snap walpb.Snapshot) (*WAL, error) { - return openAtIndex(dirpath, snap, true) + w, err := openAtIndex(dirpath, snap, true) + if err != nil { + return nil, err + } + if w.dirFile, err = fileutil.OpenDir(w.dir); err != nil { + return nil, err + } + return w, nil } // OpenForRead only opens the wal files for read. @@ -299,6 +314,18 @@ func (w *WAL) ReadAll() (metadata []byte, state raftpb.HardState, ents []raftpb. state.Reset() return nil, state, nil, err } + // decodeRecord() will return io.EOF if it detects a zero record, + // but this zero record may be followed by non-zero records from + // a torn write. Overwriting some of these non-zero records, but + // not all, will cause CRC errors on WAL open. Since the records + // were never fully synced to disk in the first place, it's safe + // to zero them out to avoid any CRC errors from new writes. + if _, err = w.tail().Seek(w.decoder.lastOffset(), os.SEEK_SET); err != nil { + return nil, state, nil, err + } + if err = fileutil.ZeroToEnd(w.tail().File); err != nil { + return nil, state, nil, err + } } err = nil @@ -317,8 +344,10 @@ func (w *WAL) ReadAll() (metadata []byte, state raftpb.HardState, ents []raftpb. if w.tail() != nil { // create encoder (chain crc with the decoder), enable appending - _, err = w.tail().Seek(w.decoder.lastOffset(), os.SEEK_SET) - w.encoder = newEncoder(w.tail(), w.decoder.lastCRC()) + w.encoder, err = newFileEncoder(w.tail().File, w.decoder.lastCRC()) + if err != nil { + return + } } w.decoder = nil @@ -352,7 +381,10 @@ func (w *WAL) cut() error { // update writer and save the previous crc w.locks = append(w.locks, newTail) prevCrc := w.encoder.crc.Sum32() - w.encoder = newEncoder(w.tail(), prevCrc) + w.encoder, err = newFileEncoder(w.tail().File, prevCrc) + if err != nil { + return err + } if err = w.saveCrc(prevCrc); err != nil { return err } @@ -375,6 +407,10 @@ func (w *WAL) cut() error { if err = os.Rename(newTail.Name(), fpath); err != nil { return err } + if err = fileutil.Fsync(w.dirFile); err != nil { + return err + } + newTail.Close() if newTail, err = fileutil.LockFile(fpath, os.O_WRONLY, fileutil.PrivateFileMode); err != nil { @@ -387,7 +423,10 @@ func (w *WAL) cut() error { w.locks[len(w.locks)-1] = newTail prevCrc = w.encoder.crc.Sum32() - w.encoder = newEncoder(w.tail(), prevCrc) + w.encoder, err = newFileEncoder(w.tail().File, prevCrc) + if err != nil { + return err + } plog.Infof("segmented wal file %v is created", fpath) return nil @@ -477,7 +516,7 @@ func (w *WAL) Close() error { plog.Errorf("failed to unlock during closing wal: %s", err) } } - return nil + return w.dirFile.Close() } func (w *WAL) saveEntry(e *raftpb.Entry) error { diff --git a/vendor/github.com/coreos/etcd/wal/wal_unix.go b/vendor/github.com/coreos/etcd/wal/wal_unix.go new file mode 100644 index 0000000000..a066d2d381 --- /dev/null +++ b/vendor/github.com/coreos/etcd/wal/wal_unix.go @@ -0,0 +1,44 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows + +package wal + +import ( + "os" + + "github.com/coreos/etcd/pkg/fileutil" +) + +func (w *WAL) renameWal(tmpdirpath string) (*WAL, error) { + // On non-Windows platforms, hold the lock while renaming. Releasing + // the lock and trying to reacquire it quickly can be flaky because + // it's possible the process will fork to spawn a process while this is + // happening. The fds are set up as close-on-exec by the Go runtime, + // but there is a window between the fork and the exec where another + // process holds the lock. + + if err := os.RemoveAll(w.dir); err != nil { + return nil, err + } + if err := os.Rename(tmpdirpath, w.dir); err != nil { + return nil, err + } + + w.fp = newFilePipeline(w.dir, segmentSizeBytes) + df, err := fileutil.OpenDir(w.dir) + w.dirFile = df + return w, err +} diff --git a/vendor/github.com/coreos/etcd/wal/wal_windows.go b/vendor/github.com/coreos/etcd/wal/wal_windows.go new file mode 100644 index 0000000000..0b9e434cf5 --- /dev/null +++ b/vendor/github.com/coreos/etcd/wal/wal_windows.go @@ -0,0 +1,41 @@ +// Copyright 2016 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package wal + +import ( + "os" + + "github.com/coreos/etcd/wal/walpb" +) + +func (w *WAL) renameWal(tmpdirpath string) (*WAL, error) { + // rename of directory with locked files doesn't work on + // windows; close the WAL to release the locks so the directory + // can be renamed + w.Close() + if err := os.Rename(tmpdirpath, w.dir); err != nil { + return nil, err + } + // reopen and relock + newWAL, oerr := Open(w.dir, walpb.Snapshot{}) + if oerr != nil { + return nil, oerr + } + if _, _, _, err := newWAL.ReadAll(); err != nil { + newWAL.Close() + return nil, err + } + return newWAL, nil +} diff --git a/vendor/github.com/coreos/etcd/wal/walpb/record.pb.go b/vendor/github.com/coreos/etcd/wal/walpb/record.pb.go index bc715a818e..0e86f363e5 100644 --- a/vendor/github.com/coreos/etcd/wal/walpb/record.pb.go +++ b/vendor/github.com/coreos/etcd/wal/walpb/record.pb.go @@ -20,9 +20,9 @@ import ( proto "github.com/golang/protobuf/proto" math "math" -) -import io "io" + io "io" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal diff --git a/vendor/github.com/google/cadvisor/collector/config.go b/vendor/github.com/google/cadvisor/collector/config.go index 75063d93b0..5c7cc77f94 100644 --- a/vendor/github.com/google/cadvisor/collector/config.go +++ b/vendor/github.com/google/cadvisor/collector/config.go @@ -22,43 +22,43 @@ import ( ) type Config struct { - //the endpoint to hit to scrape metrics + // the endpoint to hit to scrape metrics Endpoint EndpointConfig `json:"endpoint"` - //holds information about different metrics that can be collected + // holds information about different metrics that can be collected MetricsConfig []MetricConfig `json:"metrics_config"` } // metricConfig holds information extracted from the config file about a metric type MetricConfig struct { - //the name of the metric + // the name of the metric Name string `json:"name"` - //enum type for the metric type + // enum type for the metric type MetricType v1.MetricType `json:"metric_type"` // metric units to display on UI and in storage (eg: MB, cores) // this is only used for display. Units string `json:"units"` - //data type of the metric (eg: int, float) + // data type of the metric (eg: int, float) DataType v1.DataType `json:"data_type"` - //the frequency at which the metric should be collected + // the frequency at which the metric should be collected PollingFrequency time.Duration `json:"polling_frequency"` - //the regular expression that can be used to extract the metric + // the regular expression that can be used to extract the metric Regex string `json:"regex"` } type Prometheus struct { - //the endpoint to hit to scrape metrics + // the endpoint to hit to scrape metrics Endpoint EndpointConfig `json:"endpoint"` - //the frequency at which metrics should be collected + // the frequency at which metrics should be collected PollingFrequency time.Duration `json:"polling_frequency"` - //holds names of different metrics that can be collected + // holds names of different metrics that can be collected MetricsConfig []string `json:"metrics_config"` } diff --git a/vendor/github.com/google/cadvisor/collector/generic_collector.go b/vendor/github.com/google/cadvisor/collector/generic_collector.go index b667cf1975..27483018eb 100644 --- a/vendor/github.com/google/cadvisor/collector/generic_collector.go +++ b/vendor/github.com/google/cadvisor/collector/generic_collector.go @@ -29,13 +29,13 @@ import ( ) type GenericCollector struct { - //name of the collector + // name of the collector name string - //holds information extracted from the config file for a collector + // holds information extracted from the config file for a collector configFile Config - //holds information necessary to extract metrics + // holds information necessary to extract metrics info *collectorInfo // The Http client to use when connecting to metric endpoints @@ -43,10 +43,10 @@ type GenericCollector struct { } type collectorInfo struct { - //minimum polling frequency among all metrics + // minimum polling frequency among all metrics minPollingFrequency time.Duration - //regular expresssions for all metrics + // regular expresssions for all metrics regexps []*regexp.Regexp // Limit for the number of srcaped metrics. If the count is higher, @@ -54,7 +54,7 @@ type collectorInfo struct { metricCountLimit int } -//Returns a new collector using the information extracted from the configfile +// Returns a new collector using the information extracted from the configfile func NewCollector(collectorName string, configFile []byte, metricCountLimit int, containerHandler container.ContainerHandler, httpClient *http.Client) (*GenericCollector, error) { var configInJSON Config err := json.Unmarshal(configFile, &configInJSON) @@ -64,7 +64,7 @@ func NewCollector(collectorName string, configFile []byte, metricCountLimit int, configInJSON.Endpoint.configure(containerHandler) - //TODO : Add checks for validity of config file (eg : Accurate JSON fields) + // TODO : Add checks for validity of config file (eg : Accurate JSON fields) if len(configInJSON.MetricsConfig) == 0 { return nil, fmt.Errorf("No metrics provided in config") @@ -109,7 +109,7 @@ func NewCollector(collectorName string, configFile []byte, metricCountLimit int, }, nil } -//Returns name of the collector +// Returns name of the collector func (collector *GenericCollector) Name() string { return collector.name } @@ -132,7 +132,7 @@ func (collector *GenericCollector) GetSpec() []v1.MetricSpec { return specs } -//Returns collected metrics and the next collection time of the collector +// Returns collected metrics and the next collection time of the collector func (collector *GenericCollector) Collect(metrics map[string][]v1.MetricVal) (time.Time, map[string][]v1.MetricVal, error) { currentTime := time.Now() nextCollectionTime := currentTime.Add(time.Duration(collector.info.minPollingFrequency)) diff --git a/vendor/github.com/google/cadvisor/collector/prometheus_collector.go b/vendor/github.com/google/cadvisor/collector/prometheus_collector.go index 37ee44c832..da8472bf9b 100644 --- a/vendor/github.com/google/cadvisor/collector/prometheus_collector.go +++ b/vendor/github.com/google/cadvisor/collector/prometheus_collector.go @@ -15,27 +15,30 @@ package collector import ( + "bytes" "encoding/json" "fmt" - "io/ioutil" - "math" + "io" "net/http" - "strconv" - "strings" + "sort" "time" + rawmodel "github.com/prometheus/client_model/go" + "github.com/prometheus/common/expfmt" + "github.com/prometheus/common/model" + "github.com/google/cadvisor/container" "github.com/google/cadvisor/info/v1" ) type PrometheusCollector struct { - //name of the collector + // name of the collector name string - //rate at which metrics are collected + // rate at which metrics are collected pollingFrequency time.Duration - //holds information extracted from the config file for a collector + // holds information extracted from the config file for a collector configFile Prometheus // the metrics to gather (uses a map as a set) @@ -49,7 +52,7 @@ type PrometheusCollector struct { httpClient *http.Client } -//Returns a new collector using the information extracted from the configfile +// Returns a new collector using the information extracted from the configfile func NewPrometheusCollector(collectorName string, configFile []byte, metricCountLimit int, containerHandler container.ContainerHandler, httpClient *http.Client) (*PrometheusCollector, error) { var configInJSON Prometheus err := json.Unmarshal(configFile, &configInJSON) @@ -84,7 +87,7 @@ func NewPrometheusCollector(collectorName string, configFile []byte, metricCount return nil, fmt.Errorf("Too many metrics defined: %d limit %d", len(configInJSON.MetricsConfig), metricCountLimit) } - //TODO : Add checks for validity of config file (eg : Accurate JSON fields) + // TODO : Add checks for validity of config file (eg : Accurate JSON fields) return &PrometheusCollector{ name: collectorName, pollingFrequency: minPollingFrequency, @@ -95,68 +98,110 @@ func NewPrometheusCollector(collectorName string, configFile []byte, metricCount }, nil } -//Returns name of the collector +// Returns name of the collector func (collector *PrometheusCollector) Name() string { return collector.name } -func getMetricData(line string) string { - fields := strings.Fields(line) - data := fields[3] - if len(fields) > 4 { - for i := range fields { - if i > 3 { - data = data + "_" + fields[i] - } - } - } - return strings.TrimSpace(data) -} - func (collector *PrometheusCollector) GetSpec() []v1.MetricSpec { - specs := []v1.MetricSpec{} response, err := collector.httpClient.Get(collector.configFile.Endpoint.URL) if err != nil { - return specs + return nil } defer response.Body.Close() - pageContent, err := ioutil.ReadAll(response.Body) - if err != nil { - return specs + if response.StatusCode != http.StatusOK { + return nil } - lines := strings.Split(string(pageContent), "\n") - lineCount := len(lines) - for i, line := range lines { - if strings.HasPrefix(line, "# HELP") { - if i+2 >= lineCount { - break - } + dec := expfmt.NewDecoder(response.Body, expfmt.ResponseFormat(response.Header)) - stopIndex := strings.IndexAny(lines[i+2], "{ ") - if stopIndex == -1 { - continue - } + var specs []v1.MetricSpec - name := strings.TrimSpace(lines[i+2][0:stopIndex]) - if _, ok := collector.metricsSet[name]; collector.metricsSet != nil && !ok { - continue - } - spec := v1.MetricSpec{ - Name: name, - Type: v1.MetricType(getMetricData(lines[i+1])), - Format: "float", - Units: getMetricData(lines[i]), - } - specs = append(specs, spec) + for { + d := rawmodel.MetricFamily{} + if err = dec.Decode(&d); err != nil { + break } + name := d.GetName() + if len(name) == 0 { + continue + } + // If metrics to collect is specified, skip any metrics not in the list to collect. + if _, ok := collector.metricsSet[name]; collector.metricsSet != nil && !ok { + continue + } + + spec := v1.MetricSpec{ + Name: name, + Type: metricType(d.GetType()), + Format: v1.FloatType, + } + specs = append(specs, spec) } + + if err != nil && err != io.EOF { + return nil + } + return specs } -//Returns collected metrics and the next collection time of the collector +// metricType converts Prometheus metric type to cadvisor metric type. +// If there is no mapping then just return the name of the Prometheus metric type. +func metricType(t rawmodel.MetricType) v1.MetricType { + switch t { + case rawmodel.MetricType_COUNTER: + return v1.MetricCumulative + case rawmodel.MetricType_GAUGE: + return v1.MetricGauge + default: + return v1.MetricType(t.String()) + } +} + +type prometheusLabels []*rawmodel.LabelPair + +func labelSetToLabelPairs(labels model.Metric) prometheusLabels { + var promLabels prometheusLabels + for k, v := range labels { + name := string(k) + value := string(v) + promLabels = append(promLabels, &rawmodel.LabelPair{Name: &name, Value: &value}) + } + return promLabels +} + +func (s prometheusLabels) Len() int { return len(s) } +func (s prometheusLabels) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// ByName implements sort.Interface by providing Less and using the Len and +// Swap methods of the embedded PrometheusLabels value. +type byName struct{ prometheusLabels } + +func (s byName) Less(i, j int) bool { + return s.prometheusLabels[i].GetName() < s.prometheusLabels[j].GetName() +} + +func prometheusLabelSetToCadvisorLabel(promLabels model.Metric) string { + labels := labelSetToLabelPairs(promLabels) + sort.Sort(byName{labels}) + var b bytes.Buffer + + for i, l := range labels { + if i > 0 { + b.WriteString("\xff") + } + b.WriteString(l.GetName()) + b.WriteString("=") + b.WriteString(l.GetValue()) + } + + return string(b.Bytes()) +} + +// Returns collected metrics and the next collection time of the collector func (collector *PrometheusCollector) Collect(metrics map[string][]v1.MetricVal) (time.Time, map[string][]v1.MetricVal, error) { currentTime := time.Now() nextCollectionTime := currentTime.Add(time.Duration(collector.pollingFrequency)) @@ -168,59 +213,61 @@ func (collector *PrometheusCollector) Collect(metrics map[string][]v1.MetricVal) } defer response.Body.Close() - pageContent, err := ioutil.ReadAll(response.Body) - if err != nil { - return nextCollectionTime, nil, err + if response.StatusCode != http.StatusOK { + return nextCollectionTime, nil, fmt.Errorf("server returned HTTP status %s", response.Status) } - var errorSlice []error - lines := strings.Split(string(pageContent), "\n") + sdec := expfmt.SampleDecoder{ + Dec: expfmt.NewDecoder(response.Body, expfmt.ResponseFormat(response.Header)), + Opts: &expfmt.DecodeOptions{ + Timestamp: model.TimeFromUnixNano(currentTime.UnixNano()), + }, + } - newMetrics := make(map[string][]v1.MetricVal) - - for _, line := range lines { - if line == "" { + var ( + // 50 is chosen as a reasonable guesstimate at a number of metrics we can + // expect from virtually any endpoint to try to save allocations. + decSamples = make(model.Vector, 0, 50) + newMetrics = make(map[string][]v1.MetricVal) + ) + for { + if err = sdec.Decode(&decSamples); err != nil { break } - if !strings.HasPrefix(line, "# HELP") && !strings.HasPrefix(line, "# TYPE") { - var metLabel string - startLabelIndex := strings.Index(line, "{") - spaceIndex := strings.Index(line, " ") - if startLabelIndex == -1 { - startLabelIndex = spaceIndex - } - metName := strings.TrimSpace(line[0:startLabelIndex]) + for _, sample := range decSamples { + metName := string(sample.Metric[model.MetricNameLabel]) + if len(metName) == 0 { + continue + } + // If metrics to collect is specified, skip any metrics not in the list to collect. if _, ok := collector.metricsSet[metName]; collector.metricsSet != nil && !ok { continue } - - if startLabelIndex+1 <= spaceIndex-1 { - metLabel = strings.TrimSpace(line[(startLabelIndex + 1):(spaceIndex - 1)]) - } - - metVal, err := strconv.ParseFloat(line[spaceIndex+1:], 64) - if err != nil { - errorSlice = append(errorSlice, err) - } - if math.IsNaN(metVal) { - metVal = 0 - } + // TODO Handle multiple labels nicer. Prometheus metrics can have multiple + // labels, cadvisor only accepts a single string for the metric label. + label := prometheusLabelSetToCadvisorLabel(sample.Metric) metric := v1.MetricVal{ - Label: metLabel, - FloatValue: metVal, - Timestamp: currentTime, + FloatValue: float64(sample.Value), + Timestamp: sample.Timestamp.Time(), + Label: label, } newMetrics[metName] = append(newMetrics[metName], metric) if len(newMetrics) > collector.metricCountLimit { return nextCollectionTime, nil, fmt.Errorf("too many metrics to collect") } } + decSamples = decSamples[:0] } + + if err != nil && err != io.EOF { + return nextCollectionTime, nil, err + } + for key, val := range newMetrics { metrics[key] = append(metrics[key], val...) } - return nextCollectionTime, metrics, compileErrors(errorSlice) + return nextCollectionTime, metrics, nil } diff --git a/vendor/github.com/google/cadvisor/container/common/fsHandler.go b/vendor/github.com/google/cadvisor/container/common/fsHandler.go index ec2e76affe..451395f679 100644 --- a/vendor/github.com/google/cadvisor/container/common/fsHandler.go +++ b/vendor/github.com/google/cadvisor/container/common/fsHandler.go @@ -16,6 +16,7 @@ package common import ( + "fmt" "sync" "time" @@ -26,71 +27,85 @@ import ( type FsHandler interface { Start() - Usage() (baseUsageBytes uint64, totalUsageBytes uint64) + Usage() FsUsage Stop() } +type FsUsage struct { + BaseUsageBytes uint64 + TotalUsageBytes uint64 + InodeUsage uint64 +} + type realFsHandler struct { sync.RWMutex - lastUpdate time.Time - usageBytes uint64 - baseUsageBytes uint64 - period time.Duration - minPeriod time.Duration - rootfs string - extraDir string - fsInfo fs.FsInfo + lastUpdate time.Time + usage FsUsage + period time.Duration + minPeriod time.Duration + rootfs string + extraDir string + fsInfo fs.FsInfo // Tells the container to stop. stopChan chan struct{} } const ( - longDu = time.Second - duTimeout = time.Minute - maxDuBackoffFactor = 20 + longOp = time.Second + timeout = 2 * time.Minute + maxBackoffFactor = 20 ) +const DefaultPeriod = time.Minute + var _ FsHandler = &realFsHandler{} func NewFsHandler(period time.Duration, rootfs, extraDir string, fsInfo fs.FsInfo) FsHandler { return &realFsHandler{ - lastUpdate: time.Time{}, - usageBytes: 0, - baseUsageBytes: 0, - period: period, - minPeriod: period, - rootfs: rootfs, - extraDir: extraDir, - fsInfo: fsInfo, - stopChan: make(chan struct{}, 1), + lastUpdate: time.Time{}, + usage: FsUsage{}, + period: period, + minPeriod: period, + rootfs: rootfs, + extraDir: extraDir, + fsInfo: fsInfo, + stopChan: make(chan struct{}, 1), } } func (fh *realFsHandler) update() error { var ( - baseUsage, extraDirUsage uint64 - err error + baseUsage, extraDirUsage, inodeUsage uint64 + rootDiskErr, rootInodeErr, extraDiskErr error ) // TODO(vishh): Add support for external mounts. if fh.rootfs != "" { - baseUsage, err = fh.fsInfo.GetDirUsage(fh.rootfs, duTimeout) - if err != nil { - return err - } + baseUsage, rootDiskErr = fh.fsInfo.GetDirDiskUsage(fh.rootfs, timeout) + inodeUsage, rootInodeErr = fh.fsInfo.GetDirInodeUsage(fh.rootfs, timeout) } if fh.extraDir != "" { - extraDirUsage, err = fh.fsInfo.GetDirUsage(fh.extraDir, duTimeout) - if err != nil { - return err - } + extraDirUsage, extraDiskErr = fh.fsInfo.GetDirDiskUsage(fh.extraDir, timeout) } + // Wait to handle errors until after all operartions are run. + // An error in one will not cause an early return, skipping others fh.Lock() defer fh.Unlock() fh.lastUpdate = time.Now() - fh.usageBytes = baseUsage + extraDirUsage - fh.baseUsageBytes = baseUsage + if rootDiskErr == nil && fh.rootfs != "" { + fh.usage.InodeUsage = inodeUsage + } + if rootInodeErr == nil && fh.rootfs != "" { + fh.usage.TotalUsageBytes = baseUsage + extraDirUsage + } + if extraDiskErr == nil && fh.extraDir != "" { + fh.usage.BaseUsageBytes = baseUsage + } + // Combine errors into a single error to return + if rootDiskErr != nil || rootInodeErr != nil || extraDiskErr != nil { + return fmt.Errorf("rootDiskErr: %v, rootInodeErr: %v, extraDiskErr: %v", rootDiskErr, rootInodeErr, extraDiskErr) + } return nil } @@ -105,15 +120,15 @@ func (fh *realFsHandler) trackUsage() { if err := fh.update(); err != nil { glog.Errorf("failed to collect filesystem stats - %v", err) fh.period = fh.period * 2 - if fh.period > maxDuBackoffFactor*fh.minPeriod { - fh.period = maxDuBackoffFactor * fh.minPeriod + if fh.period > maxBackoffFactor*fh.minPeriod { + fh.period = maxBackoffFactor * fh.minPeriod } } else { fh.period = fh.minPeriod } duration := time.Since(start) - if duration > longDu { - glog.V(2).Infof("`du` on following dirs took %v: %v", duration, []string{fh.rootfs, fh.extraDir}) + if duration > longOp { + glog.V(2).Infof("du and find on following dirs took %v: %v", duration, []string{fh.rootfs, fh.extraDir}) } } } @@ -127,8 +142,8 @@ func (fh *realFsHandler) Stop() { close(fh.stopChan) } -func (fh *realFsHandler) Usage() (baseUsageBytes, totalUsageBytes uint64) { +func (fh *realFsHandler) Usage() FsUsage { fh.RLock() defer fh.RUnlock() - return fh.baseUsageBytes, fh.usageBytes + return fh.usage } diff --git a/vendor/github.com/google/cadvisor/container/docker/handler.go b/vendor/github.com/google/cadvisor/container/docker/handler.go index 19a6346650..291350df1a 100644 --- a/vendor/github.com/google/cadvisor/container/docker/handler.go +++ b/vendor/github.com/google/cadvisor/container/docker/handler.go @@ -243,7 +243,7 @@ func newDockerContainerHandler( if !ignoreMetrics.Has(container.DiskUsageMetrics) { handler.fsHandler = &dockerFsHandler{ - fsHandler: common.NewFsHandler(time.Minute, rootfsStorageDir, otherStorageDir, fsInfo), + fsHandler: common.NewFsHandler(common.DefaultPeriod, rootfsStorageDir, otherStorageDir, fsInfo), thinPoolWatcher: thinPoolWatcher, deviceID: handler.deviceID, } @@ -283,8 +283,8 @@ func (h *dockerFsHandler) Stop() { h.fsHandler.Stop() } -func (h *dockerFsHandler) Usage() (uint64, uint64) { - baseUsage, usage := h.fsHandler.Usage() +func (h *dockerFsHandler) Usage() common.FsUsage { + usage := h.fsHandler.Usage() // When devicemapper is the storage driver, the base usage of the container comes from the thin pool. // We still need the result of the fsHandler for any extra storage associated with the container. @@ -299,12 +299,12 @@ func (h *dockerFsHandler) Usage() (uint64, uint64) { // had at least 1 refresh and we still can't find the device. glog.V(5).Infof("unable to get fs usage from thin pool for device %s: %v", h.deviceID, err) } else { - baseUsage = thinPoolUsage - usage += thinPoolUsage + usage.BaseUsageBytes = thinPoolUsage + usage.TotalUsageBytes += thinPoolUsage } } - return baseUsage, usage + return usage } func (self *dockerContainerHandler) Start() { @@ -387,7 +387,10 @@ func (self *dockerContainerHandler) getFsStats(stats *info.ContainerStats) error } fsStat := info.FsStats{Device: device, Type: fsType, Limit: limit} - fsStat.BaseUsage, fsStat.Usage = self.fsHandler.Usage() + usage := self.fsHandler.Usage() + fsStat.BaseUsage = usage.BaseUsageBytes + fsStat.Usage = usage.TotalUsageBytes + fsStat.Inodes = usage.InodeUsage stats.Filesystem = append(stats.Filesystem, fsStat) diff --git a/vendor/github.com/google/cadvisor/container/libcontainer/helpers.go b/vendor/github.com/google/cadvisor/container/libcontainer/helpers.go index 05d0c6e9d6..69116a35c5 100644 --- a/vendor/github.com/google/cadvisor/container/libcontainer/helpers.go +++ b/vendor/github.com/google/cadvisor/container/libcontainer/helpers.go @@ -45,7 +45,7 @@ type CgroupSubsystems struct { // Get information about the cgroup subsystems. func GetCgroupSubsystems() (CgroupSubsystems, error) { // Get all cgroup mounts. - allCgroups, err := cgroups.GetCgroupMounts() + allCgroups, err := cgroups.GetCgroupMounts(true) if err != nil { return CgroupSubsystems{}, err } diff --git a/vendor/github.com/google/cadvisor/container/rkt/handler.go b/vendor/github.com/google/cadvisor/container/rkt/handler.go index fad91dbec5..b5708aa8bf 100644 --- a/vendor/github.com/google/cadvisor/container/rkt/handler.go +++ b/vendor/github.com/google/cadvisor/container/rkt/handler.go @@ -18,7 +18,6 @@ package rkt import ( "fmt" "os" - "time" rktapi "github.com/coreos/rkt/api/v1alpha" "github.com/google/cadvisor/container" @@ -84,7 +83,7 @@ func newRktContainerHandler(name string, rktClient rktapi.PublicAPIClient, rktPa return nil, fmt.Errorf("this should be impossible!, new handler failing, but factory allowed, name = %s", name) } - //rktnetes uses containerID: rkt://fff40827-b994-4e3a-8f88-6427c2c8a5ac:nginx + // rktnetes uses containerID: rkt://fff40827-b994-4e3a-8f88-6427c2c8a5ac:nginx if parsed.Container == "" { isPod = true aliases = append(aliases, "rkt://"+parsed.Pod) @@ -150,7 +149,7 @@ func newRktContainerHandler(name string, rktClient rktapi.PublicAPIClient, rktPa } if !ignoreMetrics.Has(container.DiskUsageMetrics) { - handler.fsHandler = common.NewFsHandler(time.Minute, rootfsStorageDir, "", fsInfo) + handler.fsHandler = common.NewFsHandler(common.DefaultPeriod, rootfsStorageDir, "", fsInfo) } return handler, nil @@ -228,7 +227,10 @@ func (handler *rktContainerHandler) getFsStats(stats *info.ContainerStats) error fsStat := info.FsStats{Device: deviceInfo.Device, Limit: limit} - fsStat.BaseUsage, fsStat.Usage = handler.fsHandler.Usage() + usage := handler.fsHandler.Usage() + fsStat.BaseUsage = usage.BaseUsageBytes + fsStat.Usage = usage.TotalUsageBytes + fsStat.Inodes = usage.InodeUsage stats.Filesystem = append(stats.Filesystem, fsStat) diff --git a/vendor/github.com/google/cadvisor/fs/fs.go b/vendor/github.com/google/cadvisor/fs/fs.go index 248684dea3..46756d4e8b 100644 --- a/vendor/github.com/google/cadvisor/fs/fs.go +++ b/vendor/github.com/google/cadvisor/fs/fs.go @@ -19,6 +19,7 @@ package fs import ( "bufio" + "bytes" "fmt" "io/ioutil" "os" @@ -44,24 +45,24 @@ const ( LabelRktImages = "rkt-images" ) -// The maximum number of `du` tasks that can be running at once. -const maxConsecutiveDus = 20 +// The maximum number of `du` and `find` tasks that can be running at once. +const maxConcurrentOps = 20 -// A pool for restricting the number of consecutive `du` tasks running. -var duPool = make(chan struct{}, maxConsecutiveDus) +// A pool for restricting the number of consecutive `du` and `find` tasks running. +var pool = make(chan struct{}, maxConcurrentOps) func init() { - for i := 0; i < maxConsecutiveDus; i++ { - releaseDuToken() + for i := 0; i < maxConcurrentOps; i++ { + releaseToken() } } -func claimDuToken() { - <-duPool +func claimToken() { + <-pool } -func releaseDuToken() { - duPool <- struct{}{} +func releaseToken() { + pool <- struct{}{} } type partition struct { @@ -428,12 +429,12 @@ func (self *RealFsInfo) GetDirFsDevice(dir string) (*DeviceInfo, error) { return nil, fmt.Errorf("could not find device with major: %d, minor: %d in cached partitions map", major, minor) } -func (self *RealFsInfo) GetDirUsage(dir string, timeout time.Duration) (uint64, error) { +func (self *RealFsInfo) GetDirDiskUsage(dir string, timeout time.Duration) (uint64, error) { if dir == "" { return 0, fmt.Errorf("invalid directory") } - claimDuToken() - defer releaseDuToken() + claimToken() + defer releaseToken() cmd := exec.Command("nice", "-n", "19", "du", "-s", dir) stdoutp, err := cmd.StdoutPipe() if err != nil { @@ -447,21 +448,21 @@ func (self *RealFsInfo) GetDirUsage(dir string, timeout time.Duration) (uint64, if err := cmd.Start(); err != nil { return 0, fmt.Errorf("failed to exec du - %v", err) } - stdoutb, souterr := ioutil.ReadAll(stdoutp) - stderrb, _ := ioutil.ReadAll(stderrp) timer := time.AfterFunc(timeout, func() { glog.Infof("killing cmd %v due to timeout(%s)", cmd.Args, timeout.String()) cmd.Process.Kill() }) + stdoutb, souterr := ioutil.ReadAll(stdoutp) + if souterr != nil { + glog.Errorf("failed to read from stdout for cmd %v - %v", cmd.Args, souterr) + } + stderrb, _ := ioutil.ReadAll(stderrp) err = cmd.Wait() timer.Stop() if err != nil { return 0, fmt.Errorf("du command failed on %s with output stdout: %s, stderr: %s - %v", dir, string(stdoutb), string(stderrb), err) } stdout := string(stdoutb) - if souterr != nil { - glog.Errorf("failed to read from stdout for cmd %v - %v", cmd.Args, souterr) - } usageInKb, err := strconv.ParseUint(strings.Fields(stdout)[0], 10, 64) if err != nil { return 0, fmt.Errorf("cannot parse 'du' output %s - %s", stdout, err) @@ -469,6 +470,48 @@ func (self *RealFsInfo) GetDirUsage(dir string, timeout time.Duration) (uint64, return usageInKb * 1024, nil } +func (self *RealFsInfo) GetDirInodeUsage(dir string, timeout time.Duration) (uint64, error) { + if dir == "" { + return 0, fmt.Errorf("invalid directory") + } + var stdout, stdwcerr, stdfinderr bytes.Buffer + var err error + claimToken() + defer releaseToken() + findCmd := exec.Command("find", dir, "-xdev", "-printf", ".") + wcCmd := exec.Command("wc", "-c") + if wcCmd.Stdin, err = findCmd.StdoutPipe(); err != nil { + return 0, fmt.Errorf("failed to setup stdout for cmd %v - %v", findCmd.Args, err) + } + wcCmd.Stdout, wcCmd.Stderr, findCmd.Stderr = &stdout, &stdwcerr, &stdfinderr + if err = findCmd.Start(); err != nil { + return 0, fmt.Errorf("failed to exec cmd %v - %v; stderr: %v", findCmd.Args, err, stdfinderr.String()) + } + + if err = wcCmd.Start(); err != nil { + return 0, fmt.Errorf("failed to exec cmd %v - %v; stderr %v", wcCmd.Args, err, stdwcerr.String()) + } + timer := time.AfterFunc(timeout, func() { + glog.Infof("killing cmd %v, and cmd %v due to timeout(%s)", findCmd.Args, wcCmd.Args, timeout.String()) + wcCmd.Process.Kill() + findCmd.Process.Kill() + }) + err = findCmd.Wait() + if err != nil { + return 0, fmt.Errorf("cmd %v failed. stderr: %s; err: %v", findCmd.Args, stdfinderr.String(), err) + } + err = wcCmd.Wait() + if err != nil { + return 0, fmt.Errorf("cmd %v failed. stderr: %s; err: %v", wcCmd.Args, stdwcerr.String(), err) + } + timer.Stop() + inodeUsage, err := strconv.ParseUint(strings.TrimSpace(stdout.String()), 10, 64) + if err != nil { + return 0, fmt.Errorf("cannot parse cmds: %v, %v output %s - %s", findCmd.Args, wcCmd.Args, stdout.String(), err) + } + return inodeUsage, nil +} + func getVfsStats(path string) (total uint64, free uint64, avail uint64, inodes uint64, inodesFree uint64, err error) { var s syscall.Statfs_t if err = syscall.Statfs(path, &s); err != nil { diff --git a/vendor/github.com/google/cadvisor/fs/types.go b/vendor/github.com/google/cadvisor/fs/types.go index 140aff3fec..0bed080d13 100644 --- a/vendor/github.com/google/cadvisor/fs/types.go +++ b/vendor/github.com/google/cadvisor/fs/types.go @@ -67,7 +67,10 @@ type FsInfo interface { GetFsInfoForPath(mountSet map[string]struct{}) ([]Fs, error) // Returns number of bytes occupied by 'dir'. - GetDirUsage(dir string, timeout time.Duration) (uint64, error) + GetDirDiskUsage(dir string, timeout time.Duration) (uint64, error) + + // Returns number of inodes used by 'dir'. + GetDirInodeUsage(dir string, timeout time.Duration) (uint64, error) // Returns the block device info of the filesystem on which 'dir' resides. GetDirFsDevice(dir string) (*DeviceInfo, error) diff --git a/vendor/github.com/google/cadvisor/info/v1/container.go b/vendor/github.com/google/cadvisor/info/v1/container.go index 21c85bd2a9..6c9be7c635 100644 --- a/vendor/github.com/google/cadvisor/info/v1/container.go +++ b/vendor/github.com/google/cadvisor/info/v1/container.go @@ -389,27 +389,27 @@ type NetworkStats struct { } type TcpStat struct { - //Count of TCP connections in state "Established" + // Count of TCP connections in state "Established" Established uint64 - //Count of TCP connections in state "Syn_Sent" + // Count of TCP connections in state "Syn_Sent" SynSent uint64 - //Count of TCP connections in state "Syn_Recv" + // Count of TCP connections in state "Syn_Recv" SynRecv uint64 - //Count of TCP connections in state "Fin_Wait1" + // Count of TCP connections in state "Fin_Wait1" FinWait1 uint64 - //Count of TCP connections in state "Fin_Wait2" + // Count of TCP connections in state "Fin_Wait2" FinWait2 uint64 - //Count of TCP connections in state "Time_Wait + // Count of TCP connections in state "Time_Wait TimeWait uint64 - //Count of TCP connections in state "Close" + // Count of TCP connections in state "Close" Close uint64 - //Count of TCP connections in state "Close_Wait" + // Count of TCP connections in state "Close_Wait" CloseWait uint64 - //Count of TCP connections in state "Listen_Ack" + // Count of TCP connections in state "Listen_Ack" LastAck uint64 - //Count of TCP connections in state "Listen" + // Count of TCP connections in state "Listen" Listen uint64 - //Count of TCP connections in state "Closing" + // Count of TCP connections in state "Closing" Closing uint64 } @@ -511,7 +511,7 @@ type ContainerStats struct { // Task load stats TaskStats LoadStats `json:"task_stats,omitempty"` - //Custom metrics from all collectors + // Custom metrics from all collectors CustomMetrics map[string][]MetricVal `json:"custom_metrics,omitempty"` } diff --git a/vendor/github.com/google/cadvisor/info/v1/metric.go b/vendor/github.com/google/cadvisor/info/v1/metric.go index 90fd9e4931..30c23ed1ca 100644 --- a/vendor/github.com/google/cadvisor/info/v1/metric.go +++ b/vendor/github.com/google/cadvisor/info/v1/metric.go @@ -26,10 +26,10 @@ const ( MetricGauge MetricType = "gauge" // A counter-like value that is only expected to increase. - MetricCumulative = "cumulative" + MetricCumulative MetricType = "cumulative" // Rate over a time period. - MetricDelta = "delta" + MetricDelta MetricType = "delta" ) // DataType for metric being exported. @@ -37,7 +37,7 @@ type DataType string const ( IntType DataType = "int" - FloatType = "float" + FloatType DataType = "float" ) // Spec for custom metric. diff --git a/vendor/github.com/google/cadvisor/info/v2/container.go b/vendor/github.com/google/cadvisor/info/v2/container.go index c521e35f13..f3f67a55a8 100644 --- a/vendor/github.com/google/cadvisor/info/v2/container.go +++ b/vendor/github.com/google/cadvisor/info/v2/container.go @@ -301,4 +301,8 @@ type FilesystemStats struct { TotalUsageBytes *uint64 `json:"totalUsageBytes,omitempty"` // Number of bytes consumed by a container through its root filesystem. BaseUsageBytes *uint64 `json:"baseUsageBytes,omitempty"` + // Number of inodes used within the container's root filesystem. + // This only accounts for inodes that are shared across containers, + // and does not include inodes used in mounted directories. + InodeUsage *uint64 `json:"containter_inode_usage,omitempty"` } diff --git a/vendor/github.com/google/cadvisor/info/v2/conversion.go b/vendor/github.com/google/cadvisor/info/v2/conversion.go index 08e41a6f98..03dfe09602 100644 --- a/vendor/github.com/google/cadvisor/info/v2/conversion.go +++ b/vendor/github.com/google/cadvisor/info/v2/conversion.go @@ -127,6 +127,7 @@ func ContainerStatsFromV1(spec *v1.ContainerSpec, stats []*v1.ContainerStats) [] stat.Filesystem = &FilesystemStats{ TotalUsageBytes: &val.Filesystem[0].Usage, BaseUsageBytes: &val.Filesystem[0].BaseUsage, + InodeUsage: &val.Filesystem[0].Inodes, } } else if len(val.Filesystem) > 1 { // Cannot handle multiple devices per container. diff --git a/vendor/github.com/google/cadvisor/manager/manager.go b/vendor/github.com/google/cadvisor/manager/manager.go index 3622b0604a..32623ef606 100644 --- a/vendor/github.com/google/cadvisor/manager/manager.go +++ b/vendor/github.com/google/cadvisor/manager/manager.go @@ -101,6 +101,9 @@ type Manager interface { // Get version information about different components we depend on. GetVersionInfo() (*info.VersionInfo, error) + // Get filesystem information for the filesystem that contains the given directory + GetDirFsInfo(dir string) (v2.FsInfo, error) + // Get filesystem information for a given label. // Returns information for all global filesystems if label is empty. GetFsInfo(label string) ([]v2.FsInfo, error) @@ -657,6 +660,27 @@ func (self *manager) getRequestedContainers(containerName string, options v2.Req return containersMap, nil } +func (self *manager) GetDirFsInfo(dir string) (v2.FsInfo, error) { + dirDevice, err := self.fsInfo.GetDirFsDevice(dir) + if err != nil { + return v2.FsInfo{}, fmt.Errorf("error trying to get filesystem Device for dir %v: err: %v", dir, err) + } + dirMountpoint, err := self.fsInfo.GetMountpointForDevice(dirDevice.Device) + if err != nil { + return v2.FsInfo{}, fmt.Errorf("error trying to get MountPoint for Root Device: %v, err: %v", dirDevice, err) + } + infos, err := self.GetFsInfo("") + if err != nil { + return v2.FsInfo{}, err + } + for _, info := range infos { + if info.Mountpoint == dirMountpoint { + return info, nil + } + } + return v2.FsInfo{}, fmt.Errorf("did not find fs info for dir: %v", dir) +} + func (self *manager) GetFsInfo(label string) ([]v2.FsInfo, error) { var empty time.Time // Get latest data from filesystems hanging off root container. diff --git a/vendor/github.com/google/cadvisor/metrics/prometheus.go b/vendor/github.com/google/cadvisor/metrics/prometheus.go index 7d73859932..775866bb36 100644 --- a/vendor/github.com/google/cadvisor/metrics/prometheus.go +++ b/vendor/github.com/google/cadvisor/metrics/prometheus.go @@ -228,6 +228,26 @@ func NewPrometheusCollector(i infoProvider, f ContainerLabelsFunc) *PrometheusCo }, } }, + }, { + name: "container_fs_inodes_free", + help: "Number of available Inodes", + valueType: prometheus.GaugeValue, + extraLabels: []string{"device"}, + getValues: func(s *info.ContainerStats) metricValues { + return fsValues(s.Filesystem, func(fs *info.FsStats) float64 { + return float64(fs.InodesFree) + }) + }, + }, { + name: "container_fs_inodes_total", + help: "Number of Inodes", + valueType: prometheus.GaugeValue, + extraLabels: []string{"device"}, + getValues: func(s *info.ContainerStats) metricValues { + return fsValues(s.Filesystem, func(fs *info.FsStats) float64 { + return float64(fs.Inodes) + }) + }, }, { name: "container_fs_limit_bytes", help: "Number of bytes that can be consumed by the container on this filesystem.", diff --git a/vendor/github.com/google/cadvisor/pages/static/assets.go b/vendor/github.com/google/cadvisor/pages/static/assets.go index de680f655b..84ddc99a41 100644 --- a/vendor/github.com/google/cadvisor/pages/static/assets.go +++ b/vendor/github.com/google/cadvisor/pages/static/assets.go @@ -105,7 +105,7 @@ func pagesAssetsJsBootstrap311MinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "pages/assets/js/bootstrap-3.1.1.min.js", size: 29111, mode: os.FileMode(416), modTime: time.Unix(1461696347, 0)} + info := bindataFileInfo{name: "pages/assets/js/bootstrap-3.1.1.min.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -125,7 +125,7 @@ func pagesAssetsJsContainersJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "pages/assets/js/containers.js", size: 34370, mode: os.FileMode(416), modTime: time.Unix(1462915324, 0)} + 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 } @@ -145,7 +145,7 @@ func pagesAssetsJsGchartsJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "pages/assets/js/gcharts.js", size: 696697, mode: os.FileMode(416), modTime: time.Unix(1461696347, 0)} + 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 } @@ -165,7 +165,7 @@ func pagesAssetsJsGoogleJsapiJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "pages/assets/js/google-jsapi.js", size: 24553, mode: os.FileMode(416), modTime: time.Unix(1461696347, 0)} + 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 } @@ -185,7 +185,7 @@ func pagesAssetsJsJquery1102MinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "pages/assets/js/jquery-1.10.2.min.js", size: 93100, mode: os.FileMode(416), modTime: time.Unix(1461696347, 0)} + info := bindataFileInfo{name: "pages/assets/js/jquery-1.10.2.min.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -205,7 +205,7 @@ func pagesAssetsStylesBootstrap311MinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "pages/assets/styles/bootstrap-3.1.1.min.css", size: 99962, mode: os.FileMode(416), modTime: time.Unix(1461696347, 0)} + info := bindataFileInfo{name: "pages/assets/styles/bootstrap-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 } @@ -225,12 +225,12 @@ func pagesAssetsStylesBootstrapTheme311MinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "pages/assets/styles/bootstrap-theme-3.1.1.min.css", size: 13186, mode: os.FileMode(416), modTime: time.Unix(1461696347, 0)} + 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\x09\x6e\x88\x00\xff\xac\xfb\xd9\x93\xa3\x58\xb6\x2e\x0e\x3e\xf7\xf9\x2b\xa2\xcf\xb1\x36\xbb\xf7\x52\x51\xcc\x53\xa6\xf5\x03\x83\x10\x93\x18\x24\x04\x88\x97\x36\x66\x90\x98\x27\x01\x65\xe7\x7f\xef\x2d\x77\x0f\x8f\xc8\xcc\xa8\xcc\xaa\x73\x7f\x6e\xa9\x70\x17\xec\x61\xed\xb5\xd7\xfa\xd6\xf7\x6d\xc8\xff\xf8\x7b\xde\xb6\x79\x95\x7e\x5d\xca\x71\x0e\xab\x72\x0f\xa7\xb2\x6d\xbe\x4e\x6d\x5b\x45\xe1\xf0\x8f\xac\x6d\xa6\xaf\x63\xb9\xa7\xbf\xa0\x08\xf2\xff\xf9\xef\x3f\x6d\xfc\xe5\x4f\xef\x7e\x4d\xd7\xae\x1d\xa6\xaf\xe5\x7b\xa3\xbf\xfd\x3f\x30\x54\x12\x4e\xe1\xff\xd5\x38\xc5\x54\x57\x5f\xe3\x36\x49\xff\x51\x87\x43\x5e\x36\x5f\x87\x32\x2f\xa6\x5f\xfe\x8e\xa6\xf5\x9f\x2f\xf5\x7b\xcf\x97\x2d\x55\xd8\xbc\xdd\x7d\xf7\xd6\x33\x7d\x1b\x24\x6a\xab\xe4\x2f\x06\x69\x1f\x5f\xa3\x79\x9a\x40\xc7\x2e\x4c\x92\xb2\xc9\x7f\xc1\xba\xf5\x2f\xfa\x4c\x43\x19\x36\xe0\xf6\x3f\xba\x76\x2c\x5f\x77\x7e\x09\xa3\xb1\xad\xe6\x29\xfd\xf5\xdd\x78\xe4\xd7\xa9\xed\x7e\x41\xfe\x62\x98\x38\xec\xde\xbf\x87\x11\x18\xeb\x59\x26\x53\xf1\xb6\xc3\xbf\x7e\xb3\x04\xf9\xf5\xdd\x25\xe0\x8f\xa8\x1d\x92\x74\xf8\xfc\x03\x2c\xbb\xaa\xc2\x6e\x4c\x7f\xf9\xf6\xc7\x5f\xcc\x35\xd6\x61\x55\x7d\x4d\xca\xb0\x6a\xf3\x8f\xa9\x48\x04\xf9\xcb\x95\x46\x65\xfe\xdb\x4e\xcc\xbf\xd0\xe9\xc7\xb9\xfe\x3c\x34\x7e\x1c\xff\x8f\xbe\x8c\xc2\xf8\x91\x0f\xed\xdc\x24\xaf\xe5\xb6\xc3\x2f\xff\x15\xa3\x09\x9b\x65\xdf\x9c\x81\x76\xeb\x17\xd0\xb4\x4c\xbe\xfc\x17\x1e\x92\x34\x4d\x7c\x3a\x8e\xf9\xb7\x6c\xfc\x1a\xfd\xeb\x66\x82\xb6\xff\xf8\xa3\x5d\x49\x92\xfc\xfa\x47\xfb\xdf\x62\xe0\xd7\x2a\xcd\xa6\xbf\x0c\x85\xdf\x98\x33\x95\xd3\x5f\xe5\xe6\x8f\x16\xbd\x35\xff\x89\x51\x29\x92\x26\x59\xfa\xeb\xc7\x37\x04\x41\x7e\x8d\xe7\x61\x04\x7f\x77\x6d\xd9\x4c\xe9\xf0\xa3\xb7\xbe\x5b\x3f\xa4\x15\x98\x69\x49\x7f\xfd\x01\x75\xb0\x6e\xfa\xf5\xf7\x69\xf5\xeb\x92\x0e\x53\x19\x87\xd5\x57\x60\x5c\xde\xfc\x52\x97\x49\x52\xfd\x3b\x51\x08\xcc\x04\x56\x34\xd3\xbf\xbe\xd0\x8f\x0e\x3f\x59\x6a\x06\x82\xe2\xdb\x6a\x08\xb0\x9a\x1f\x8d\x6d\xda\x01\xcc\xfa\x6b\x0b\xec\xcd\xaa\xf6\xf9\x4b\x38\x4f\xed\xbf\xbd\x1b\x5f\xe3\xaa\x1d\xff\xdd\x3d\x79\xef\xf4\x83\xb9\xbf\x4c\x43\xd8\x8c\x5d\x38\x80\x55\x7c\x99\x87\xea\x7f\xbd\x35\xf8\xff\x45\xed\xfa\xf7\xbc\xcc\xfe\xf7\x97\xa6\xfd\x3a\xa4\x5d\x1a\x4e\x5f\xc6\x78\x00\x79\xfd\x25\x4e\xdf\x36\xaa\x78\x5f\x09\x4a\xfe\xb8\x51\xbf\x83\x1c\x14\xe4\xe5\x5b\xc4\xbd\x76\xf3\x03\x4b\xc8\x7f\x2f\x0d\x3e\xfc\xfb\xa5\xcc\x86\xb0\xfe\x37\x16\xfb\xdb\x7e\x3f\xa2\xcb\x37\xcb\xe9\xb7\x2f\x7f\x48\xdb\xa8\x02\xae\xf9\xef\xbf\xc7\x45\x38\x4c\xe3\xd7\xb2\xa9\xca\x26\xfd\x1a\x55\x6d\xfc\xf8\xc7\x1f\xe3\x31\x29\x47\x00\xf2\xdb\x2f\x5f\xeb\x76\xff\x6c\xdb\xae\x9f\xd7\x7f\xec\xfe\xdf\xff\xe7\xcb\xab\x38\x7c\xf9\xd9\xd0\x7f\xfb\x3f\xbf\x64\xe5\x30\x4e\x5f\xe3\xa2\xac\x12\xe8\x9f\xb6\xfb\xc7\x6f\x07\xfe\x34\xb3\x4e\x9b\xf9\xc7\x3d\x7d\x0b\xbe\xef\xa8\xfc\x06\x53\x71\xfc\xe5\xbf\x28\x8a\xfa\xf8\x07\x7c\xfd\xd6\x60\x9c\xb6\x2a\xfd\xe5\x6d\xf5\xdf\x2e\x7d\xec\x15\xf0\xcf\x47\x7a\x26\x69\x16\xce\xd5\x7b\xc6\x7d\x44\xef\x17\x14\x07\x4e\xe3\x40\xd9\xa9\xfe\x36\x82\x10\xfa\x3a\xa6\x43\x99\x7d\xaf\x0e\xed\x3c\xbd\x6c\x04\xad\x9b\xf4\xc7\x44\xf8\x82\xfc\x24\x5e\x5e\xde\x4b\xd2\xf5\x17\x0c\x40\x02\xf2\x9b\x65\x7d\xab\x84\x3f\xae\x0e\x40\xdb\x5b\xa8\xc2\xf0\x38\x56\x7f\xcf\xc7\x09\xec\x46\xfc\xf7\xb8\xad\xe1\x34\x29\xa7\x76\x80\xdf\xfb\x00\x5c\xfc\x7b\xd7\xe4\xff\xfb\xcb\x7b\x00\x7f\x5d\xbf\x80\x58\xfc\xf2\xc2\xbe\xef\xa5\xeb\x9f\x23\x51\x55\x82\xfd\x78\xf7\xcd\xdb\x12\x3e\x16\x06\x2a\xf1\xcf\x97\x06\xea\x6b\xba\x02\xee\x91\xc6\xed\xf0\x16\x96\xef\xb7\xff\x09\x24\xfd\x71\x85\x5f\xc1\xa8\xc0\xf5\x20\x7c\xfe\xf6\xb3\xbb\x65\xd3\xbc\xdf\xfd\xc7\x3f\xdf\xb6\x8f\xc5\x84\x61\xf8\xfb\x69\xc1\xc2\xff\x7c\xce\x7f\xfc\xae\xaa\x7f\x0f\x81\xd7\x7e\x7d\x5b\xe2\x4f\xc7\xf8\x6e\xd9\xb7\x31\xbe\x7c\x45\x3f\x53\xeb\x63\x20\xe4\xcb\xeb\xd2\xb7\x81\x5e\x91\x03\x42\xe1\xf7\x29\xf1\xf3\x51\xdf\x8a\xd5\x6b\xc4\x3f\x6b\x3e\x4c\x3f\xbf\xfe\x7d\x81\x9f\xc3\x7c\x80\xd3\x1b\xe6\xfe\x0f\x46\xfc\x6e\xd8\x8f\xe3\xfc\xf3\xfc\xfd\xcb\x45\xfd\x6b\x5d\xff\xda\x9c\xb7\x21\x7f\xb7\xbe\x5f\x7e\x19\xda\x76\xfa\x59\xc7\x7f\xbc\xa1\xca\x07\x16\x22\x7f\xd2\xf0\x47\x17\xfe\xab\x5d\x7e\x30\xea\x5f\xed\xf2\x41\x3c\x7f\xd3\xe1\x1d\x68\xfe\xac\x57\x32\xb4\x5d\xd2\x3e\x7f\xda\xed\xa7\xed\xcb\xf1\x45\x6c\x93\x1f\xeb\x75\x59\x87\xf9\x7b\x2e\xff\xbf\xcb\xfa\xa5\x1f\xc2\x66\xfa\xb5\xed\xc2\xb8\x9c\xb6\x5f\xfe\x8e\xff\xfa\x06\xee\x3f\x7c\xcf\xca\x0a\x38\xe4\x97\xb0\xea\x8a\xf0\x7f\x7d\x5c\xff\xff\xe2\xc8\xff\xfe\xd3\x09\xff\xdc\xb3\x3f\xcd\xf8\x3f\xed\xfa\xe9\xe1\x7f\xbf\xeb\x87\xa7\xff\xfd\x8e\x9f\xce\xfe\xc0\x19\x1c\xc7\x7f\xf0\xd8\x6f\x31\x88\x65\xd9\xef\xf7\xfe\x2c\xcd\xbe\xcd\xf8\x67\x25\xf0\xa7\x3b\xf8\x1d\x8f\x5f\xd0\xf2\x83\x21\x9f\x68\xf5\xdb\xeb\x3f\xdd\x9e\xe2\x45\xc1\xfe\x07\x7b\xf3\xcf\xfb\xfd\x01\xa7\xbf\x39\x24\xce\x40\xe9\x65\xd3\x8f\x7f\xe8\x30\xfb\x0b\xd3\xc2\xf8\x45\x31\x7e\x3a\x7b\xdb\xa5\xcd\x4f\x18\x67\x14\x45\x3f\xea\x93\xcf\x2a\x1b\xb5\xa0\x57\xfd\x56\xf8\x7e\x3a\x53\xd6\xc6\xf3\xf8\x3f\x0a\xd1\x3f\xeb\xf9\x4f\x1c\x01\x8a\x63\x93\xff\xbc\x00\x7e\x83\x80\xef\x1b\xf8\x46\x17\x40\x01\xfa\x17\xab\xd9\x67\x80\xfe\x48\x4e\xdf\xeb\x0f\xfd\x2a\x48\xdf\x29\xc4\x9f\xb2\x87\xf7\x5f\x1f\xa4\xf2\x9d\x41\x7c\x67\xc1\x5f\x71\x86\x79\x2b\x8a\xff\xa2\x4d\xdf\xb4\xf0\xfb\x11\xc2\x4f\xbd\xf8\xdb\x26\xff\x83\x6d\xf8\x17\x06\xf8\x7d\x91\xfe\x38\xd1\xf8\x79\x45\xff\x1c\xef\x15\x32\x7f\x3e\xe3\xab\xc5\x5f\x54\x8d\x8f\x09\xbf\x69\xce\xff\xd1\x68\x7f\x30\xff\x7d\xb4\x6f\xa0\xf3\xad\xf4\x7d\x93\xde\x80\xfe\xfe\xf5\x44\x3f\x6d\x50\xa4\xf1\xe3\x5f\x0d\xe8\xdf\xcf\x0a\x68\xe9\x6f\x66\x2d\xa7\xb4\xfe\xc7\x0f\x04\xf3\xaf\xc9\xf3\x3f\xe1\x9c\xc8\x6f\xf8\x33\x9d\xd6\x6f\x89\x81\xbd\xa9\xaa\x02\xcc\xf2\x15\xe8\xb7\xf8\xd5\xe5\x39\x84\xdd\x1f\x4c\xf8\xfd\xf7\x17\x95\xf8\x96\x63\xef\x6b\x00\x23\x7e\x9b\xe1\x23\x2e\xb0\xb7\xd3\x8a\x1f\x9d\xd0\xb4\x6f\xbe\x01\xcb\xff\xf2\xfb\x01\xff\xf6\xbb\x86\x25\x10\x5f\x7f\x68\xf4\xdb\x19\x51\xec\x8f\xe3\x87\x71\x9c\x56\xff\xbc\xdf\x87\x61\xc8\xef\x3a\xbe\xad\xe8\x9b\x0a\xff\x77\x9c\xfd\xc7\x51\x7e\x5a\xfc\xde\xee\xbc\x99\xf6\xb7\x7f\xa3\xc3\xef\x0c\x02\x6a\xeb\x9f\xa0\xfd\x5f\x8c\xf3\x72\xe5\x3f\xfe\x6f\xb9\xc8\xdb\x48\x05\x70\x5f\xf5\x07\x08\x7a\xbf\xf5\x2a\x66\x3f\x3b\x41\xa2\x52\x36\x63\x7e\x57\xd8\x7f\x7b\xf1\x3d\x56\x13\x50\x60\xd2\x3f\x8a\xc7\xef\xca\xe1\xeb\x7b\x09\x7a\xf1\xfe\xcf\x4b\xaf\x73\x01\xfc\xa7\x9b\xf9\x11\x67\x7f\x34\xf4\xcd\x1b\x3f\xd8\xf9\x0e\xc9\xbf\x7c\x82\xf3\xe7\xa1\x04\x05\xe6\x79\x8b\x33\xea\x4f\x4e\x27\x5e\x04\xf9\xe7\xf2\xec\xdb\x59\x05\xf5\x33\xf3\x7e\x4f\xc4\xff\xc2\xe6\x9f\x36\x7f\x5b\xc8\x9b\x81\x6f\x46\xbc\xdb\xf3\xe3\x6c\xed\xfb\x29\xec\x98\x56\x69\x3c\xfd\x34\xc0\x7e\x3f\xe1\x5f\xf6\xf8\x9d\xf3\xfe\x6f\x4a\x20\xf9\x4a\xdf\x2f\xc8\x1f\x7d\xf3\x96\x27\xff\xf8\x4e\x01\x7f\x4d\xca\x01\x98\xf3\x72\x7e\x35\x0d\xbf\x7e\x5f\xf1\xf7\x12\xff\x67\x3b\xf4\x21\xa9\xdf\xb7\xe6\xed\xd2\xbf\xb8\x1d\xef\x76\x7c\xd4\x88\x1f\x76\xfb\x87\xe1\xfe\xc0\x86\xde\x3a\xd6\x4d\x5a\xb7\x4d\x19\x83\x74\x01\xd9\xfb\x7b\x41\x0f\xdc\x96\x0e\x7f\x38\x78\xf9\x6d\xc7\x31\xed\x42\xd0\xbc\x1d\x7e\x74\xc3\x6f\xce\x2d\xbf\xa7\xc0\x9b\x81\x2f\x1d\xfc\x1f\xff\xf1\xf7\xd7\x1e\x7c\xad\xc2\x08\x40\xe0\x3f\xfe\xe3\x0b\xf8\xf9\xc3\xe1\xe6\x7f\xfc\xf7\x7f\xfc\x7d\x6e\xca\xdf\xb6\xfa\x98\x84\x79\xfb\xf9\xf5\x7b\xc7\xf7\xc4\x2c\x27\xb0\xd8\xf8\xad\xe7\x3b\x9d\xfc\x1a\x77\xf3\x3f\x1d\xff\x87\xf1\x90\xb7\x9f\xb7\x8e\x65\xf3\x87\xae\xbf\x9b\x14\x34\x1a\xc2\xe7\xd7\xd7\x0a\xc6\x1f\x07\xcf\xc2\xba\xac\xb6\x5f\xbe\xfc\xa7\xd0\xce\x43\x09\xf8\xb2\x91\x3e\xff\xf3\x7d\x9a\x1f\xcb\xd6\x97\x6e\x48\xbf\xbe\x2a\xd7\xfb\x74\x20\x02\x3e\x4e\xf5\x5e\xe7\x95\x60\xbc\xff\xd7\xc7\x74\xd2\xdb\xcf\x5b\xa3\xb7\xa7\x13\x5f\x87\xf6\xf9\xd3\xe9\xe2\xf7\xe9\xfe\xf3\x6f\x5f\xfe\x13\xec\x49\xfb\x36\xcb\x7f\xfe\xe8\x9b\xd7\x46\x7c\x79\x23\x87\x6f\x17\x7f\x88\x8a\x2f\x6f\xc1\xf2\x7e\xf9\x77\xd0\xf0\x3a\x3c\x7a\xbf\xf1\x71\x78\xf4\xe5\x73\x80\x1f\x39\xc9\x17\xfc\x77\x57\xdf\xc3\xef\x0f\x97\x5f\xf0\xf7\x87\x8b\x1f\x30\xf9\x7e\x1d\xac\x73\x9c\xa3\x57\x25\x09\xcb\x17\xf3\xf8\x38\xfb\x03\x3c\xa4\x9b\xa7\x8f\x85\xff\x66\x66\xe2\xdb\x68\xef\xf0\xf5\x85\x40\xde\x87\xf9\xaf\xaa\xcd\xdb\x8f\x0e\x1f\x08\xf9\x05\x7b\x3b\xfd\xfc\x83\x41\xd8\xe7\xd5\x3f\xc2\xec\x77\x04\xf8\x43\x8b\x77\x8f\x7e\x98\xfa\x87\xbb\x9f\xe9\xfd\xed\xec\xf8\xf7\x0d\xde\x15\xf8\x0b\x90\xfe\xf3\xf5\xe8\xee\x97\xb7\xef\x30\x40\x1d\x40\xd9\xc7\x94\x22\xfe\x56\xba\xbc\x79\x7e\x22\xda\x31\x6f\x39\xf0\x63\x5c\xae\xc5\xe1\x9a\x73\x1c\x4f\x5f\x5f\x5f\x4b\x81\x53\xc0\x6f\x81\xc7\xec\x0e\x07\x7f\x68\x17\xaf\x12\x6d\x94\xdf\xaf\x8f\x44\x50\x0e\x95\x64\xef\xb7\xd5\x74\x6e\x98\xee\x28\xf3\xc9\xe6\xb8\xd4\xe8\x93\x2b\x9e\xdc\x1e\x70\xec\x59\x13\x8c\x07\x36\xeb\xd9\xd3\xfd\x39\x06\xc9\x98\xdb\x5c\xa9\x50\x4f\x65\xe3\xf9\xa0\x2d\x84\x0b\x77\x3c\x1e\x0e\xbc\xca\xad\x37\x4f\x11\xaa\xdb\x55\x3a\x1f\xe3\x8b\xe4\x1f\xf2\xe9\xaa\x5d\x54\x4c\x21\x7a\xae\x9d\x8f\x09\x5f\xb6\x45\x58\xa2\x6e\x6c\x9a\x44\x86\x6b\x29\x9a\xf9\xc3\x42\xa7\x38\x8d\xc2\x33\x43\x92\x7b\x03\x9f\xc0\xbf\x4f\x88\x3b\x9c\x95\xfa\x91\x86\x65\x98\x73\xe4\xb5\xbd\x32\xe6\x94\x67\x77\x84\x55\xd6\x53\xcd\xe6\x9c\xe2\x5e\x4c\xee\xa0\xf0\x62\xbd\x31\x6a\xc3\xc7\x60\x7d\x16\x27\xa6\x7e\x01\x25\x3a\x07\xc3\xdc\x71\x89\x9e\x9c\xc0\xc9\xa2\xab\x97\xf6\x65\x85\x64\x38\xa7\x3b\x5b\xad\x62\x4e\x51\x0f\x1c\x21\x28\x17\xf2\x39\xf2\x0f\x49\xe1\x36\x81\xbc\x6e\xbc\xcd\x6d\x7c\xce\x8d\x92\xb9\x07\x5c\xcb\x55\xc0\x39\x91\x5c\x31\x76\xa9\x70\x7d\x8e\x70\xb4\x75\x56\xad\xfc\xca\x61\x5a\xed\xe0\x7c\x0c\x7e\x2b\x71\x6f\xe7\xdc\xdd\x3e\x70\xf5\xa5\x90\x55\x4e\xe5\xe6\x27\x9f\xbb\x37\xe9\xa2\x73\x3a\xf7\xcc\x85\x7c\x38\x70\xa5\x9e\x3b\xdc\x90\x1f\x39\x2f\xba\x6d\xe7\xa7\xc6\x2d\xf6\x95\x4b\x5a\xf2\xf6\xe0\x58\xee\x06\xcc\xab\xaf\xca\xb8\x73\x5c\x6e\x82\x7d\xb1\x57\xc2\xd9\xed\x13\xe8\x61\xe6\x27\x43\x83\x09\xad\xca\x62\xc5\x23\x2e\xdc\x81\x7b\x9e\x66\x77\x0f\x12\x1d\xb9\x9f\xae\xb3\xea\xdb\xc7\x26\xdb\x18\x53\x2c\x95\x54\x17\x22\x5d\x12\x6e\xe7\xb8\x3b\x1c\x6f\x2a\x29\x68\x71\x45\x8e\xf7\x03\x72\x6f\x38\x64\x37\x45\xb0\x8e\xe3\xd2\x9c\x9f\x19\x41\x58\xa4\xd8\x90\xb3\x53\x90\x75\xd4\x44\x26\x8c\xac\xa1\x0e\x85\x30\xbf\x28\x77\xa2\x60\x12\x18\x5a\x94\xa7\xc0\x73\x9c\xed\x8c\xf0\x82\x55\x70\x45\x26\x37\x31\x3e\xc5\xfc\x28\x7b\x70\x48\x55\x11\x67\x74\x1e\x77\xbc\x67\x90\x8b\xec\xd8\xb3\xce\xbd\x7c\xb0\xd3\xa5\xd6\x53\xe7\xce\xd8\x3c\x95\xb6\xae\xa8\x58\x3c\x12\x0b\xf9\xa8\xd3\x17\xb7\x6c\x23\xe4\x49\x10\x23\x04\xef\x56\x11\x41\x82\x9e\x2d\x11\x68\x47\x43\x18\x3e\x3c\x39\xf9\x18\xda\x6a\x3d\x3d\x35\x53\x84\x7d\xa9\x88\x9a\x70\xbe\xb6\x74\xb3\x3d\xcf\xc2\xc9\xa3\x71\x72\xb3\xa0\x95\x70\x61\xf8\x46\x74\x48\xaa\x20\xa3\xfb\x1c\xa5\xdb\xb0\x7a\x4a\x4d\x5c\x05\xd5\x58\xf1\x9a\xbc\x76\xd2\x41\x89\x6b\x97\x28\xf4\x2e\xdb\xf5\x55\x26\x23\x56\x08\x0c\x5c\xb4\x85\xb1\x78\xc0\x9c\x33\xdc\xe4\x29\x9e\xc6\xa7\x4c\xcf\x9c\xad\xe9\x62\x75\xbf\x24\x39\xcf\x65\xcb\x69\xba\xf3\xad\xfe\xb0\x39\x3b\xd8\xed\x2d\xcd\x62\x8e\x53\x4d\x18\xba\xb1\x9c\xf6\x3c\x70\x7b\x90\x3e\x88\x27\xc7\x2d\x66\x7e\xf3\xb5\xf2\x2a\x21\xfb\x51\x00\x7e\x3c\x6b\x02\xaf\x0d\x3c\xcf\x3f\x77\x5e\xd2\x76\x4e\xec\x76\x5e\x8e\x76\x4e\x7a\xaa\x05\xff\x38\x73\xa2\xe0\x70\x16\xcf\x0b\xfc\x7c\xe1\x64\xae\x2f\x8e\x6a\xc0\x1f\x5d\xb0\x9b\x53\x7e\x98\x22\x4e\x3c\xf6\xdc\xb9\x9e\x0f\xf6\x74\x3a\xac\x26\x87\x37\x04\xaf\xc6\x79\x3a\x3d\xa5\x67\x90\x1f\x55\x5a\x38\xea\xdb\x51\xb0\xcf\xfc\xc6\xe5\xce\xed\x72\xa0\x4a\x5e\x2a\xef\x53\x5e\xee\x79\xee\xd7\x37\xe2\xa0\xd4\x92\x62\xa8\x1a\xd7\x09\x62\x57\xf2\xe7\xb3\x32\xfa\xaf\x20\x14\xfa\xab\xda\x3f\x5c\x54\x51\x60\x65\x8a\x0b\x9b\xbc\xbb\x2b\x07\x75\x62\xb4\x09\xdc\x56\x2e\x9b\xb6\x1c\xe2\xb5\x52\x8e\xdb\xd5\xb6\xae\x5c\xe3\x72\x73\x98\x67\xc7\x76\x38\xb6\xb2\x75\x4e\x44\xdb\xf2\x6f\x82\xd7\xd6\xcb\xf9\x08\xb6\xd3\xba\x09\x58\xdb\x67\xe7\x0b\x54\xa0\x09\xc7\xb3\x65\x4b\xde\x73\xe3\xb0\x8a\x75\x78\xc2\x3c\x29\xbe\x2b\x89\x74\x53\xaa\xdb\xb1\x8c\x64\xa9\xb6\x2a\x4f\x74\xbd\xfb\xee\xde\x65\x37\xc7\x93\xe2\x1a\x3d\x55\xb2\xa0\x9f\xf9\x03\x64\x3a\x77\x80\x9e\x8a\xdf\xda\xf6\xb3\xde\x84\x87\xca\xcb\xde\x61\xbd\xd9\x54\x5e\xd1\x82\x89\x1c\x86\x56\x71\x9f\xb5\x58\x88\xb2\xa0\x6e\x9a\xd3\x1f\x20\x44\xf5\xdb\x0b\x14\x9f\x89\xdb\xbd\x5f\x1f\x52\x71\x1c\x84\x68\x56\xce\x44\xd1\x94\x6e\xaa\x3e\x09\xc7\x27\x0d\x45\xe5\x68\xf5\x31\x9f\x4d\xa1\x3c\x54\x0f\x51\x55\x05\xa4\x1a\x2e\xc6\xa4\xe8\xe1\xd9\xe9\x44\xfa\x72\x38\xd6\xb1\x23\x44\xc3\xe3\x88\xab\xf8\x6c\x2b\x63\x2b\x8c\x8a\x9a\x9e\x27\x92\xb3\x1e\x07\xe8\x02\x31\x8d\x48\xea\xf1\xd5\x1c\x3d\x85\x78\x3c\xd5\xb6\x3c\x5f\x3a\xd5\xbe\x5c\xee\x6e\x65\x41\xd7\x43\x17\x30\x9b\xdd\xd5\x79\x5f\xc9\x46\x1f\xd0\x57\x41\xeb\x15\xb3\x63\xc3\x8b\x87\xe5\x49\xc5\x2d\x57\x22\xed\x0e\xfb\x19\xad\x4b\xdf\xa8\xd7\x40\xdc\x28\x7b\x6a\x59\xdf\xae\xeb\xaa\x09\xb3\xa4\xd5\xa1\x0a\x99\xf3\x26\xc9\x57\x52\xaa\x58\xc1\x47\xea\xa5\xe5\xa1\xa6\xa1\x6e\x16\x92\x3c\x9f\x46\x91\x63\xe2\x8a\x14\xa5\xc6\x57\xc3\xd1\x1f\x83\x6e\x2d\xf1\xe3\x05\x0a\x1c\xed\x26\x21\x64\x1a\x6c\x92\xfd\x44\x77\x25\xaa\xbd\xf4\x26\x92\xc5\xe2\xba\x79\xcf\x96\x1d\x23\x05\xb2\x76\xe8\xae\x54\xe5\x86\x6e\xd6\xf9\x4d\x5f\x9d\xdd\x18\xbd\xc2\xa8\x5f\xf7\x02\x7a\x19\x5c\x1b\x1a\xfc\x2a\x60\xbb\x47\xe0\x8e\xa8\x78\xef\xed\xe6\x2a\xf5\x8b\xdb\x9f\x51\x77\xa6\x1e\xd8\x30\x92\x97\x04\xd5\xac\xeb\x89\x3d\xfb\x94\x09\xf9\x30\x26\x40\xf5\xc9\x18\xdb\x50\x3a\xf7\xc2\xf1\xa2\x19\xd7\x1b\x9d\x1d\x8f\x37\xa4\x90\xc6\xdb\x16\x64\xd2\xcd\x9e\x82\xcd\xcd\xad\x41\x3f\xce\x37\xc7\x53\xa3\x71\x69\x46\x47\xbe\x49\xd0\x3a\x61\x3a\x3e\x9d\xae\x88\xb1\xf7\x75\x08\x16\x21\x01\x52\x17\xac\xbb\x7d\x30\xd7\x41\xce\x19\xb1\x09\x9a\xc3\x60\x2a\x31\x61\xec\xcd\x38\x71\x1b\x02\xeb\x91\xec\x85\x3d\x5a\x0f\x3e\x35\x19\x6c\x47\x61\x03\x1d\xde\x66\x74\xa3\xcf\xd1\x44\xb1\xc3\x92\xf8\x42\x62\xab\xc8\xd8\x64\x57\x2a\x72\x06\x3c\xb1\x6b\xca\x18\xba\xf3\xdc\x7a\x14\x86\xfb\x16\x75\xa7\x9d\x1b\x34\x91\x94\xdd\xa0\xdb\x72\x35\xa9\x04\x3f\x9f\x61\x77\x62\x35\x0b\x95\xa0\x61\x41\x67\xf8\x2c\xef\xf1\xd3\xe0\x72\xec\xc1\x57\xe3\xc9\x29\xee\xcc\x69\xb3\x6f\x50\x31\xd4\xc7\x9a\x40\x32\xe1\x40\x84\xf9\x79\xc3\x4a\xea\x11\x9f\xdb\x96\x95\xd4\x76\x4b\x09\x75\xa6\xe4\x00\x3a\xa1\x29\x1f\x43\x41\xbf\x2e\xf2\x51\x1b\x0d\x83\xac\xf0\xe3\xc8\xdc\x3c\xb5\x3b\x4d\xf3\x63\xd5\x1c\x89\xd4\x89\x6e\x0f\xce\x43\x5d\x87\x14\x12\x39\x4e\x72\xda\x4f\x9b\xb0\xc7\x83\x51\x8e\x5b\xba\x99\x66\xe2\xc5\x21\x09\x36\x6c\xaa\x19\x0c\xde\x8c\x22\x74\xa5\xe6\xe4\x6a\xe5\x1e\xea\x2b\x19\x85\x55\xb3\xeb\x7c\x10\x18\xd5\x92\x8e\xb5\x74\x83\xdc\xa6\xf2\x58\x37\xf2\x87\x43\xe3\xf9\xe6\x38\x82\x45\x7a\x2e\xb6\xda\x47\x34\x8d\x44\x75\xa4\x6a\x66\xc6\x7a\x0d\x8b\x86\xf8\x8c\xd5\x18\x9e\x49\xa6\x72\xbd\x6f\xcd\x45\xcb\x5c\x27\x9a\xda\x95\xb6\xf6\x51\x98\xb7\x90\xe6\xa2\xc9\xcc\x82\x82\x2d\x7d\x2c\xca\x22\x4b\x8e\x9f\xf1\xa1\xc0\x3d\x13\xb7\xe9\x4c\x56\x91\x24\x5e\xb1\x48\x16\x18\x8a\x72\x0a\xe3\x64\x76\xab\xd6\x88\x94\x9b\x34\x47\x2c\x2d\x62\x12\xdf\x8d\x73\x5a\x5f\x48\x51\x3f\x74\x09\x56\xad\x89\x13\x85\xa9\xd6\x61\x54\x96\x8e\xb3\x4b\x9e\x87\x79\x9e\x34\x14\x81\xbd\x7b\x4d\xcf\x11\xae\xe1\x41\x94\x38\xc9\x2e\xe2\x52\x16\x2e\xb4\x73\xa1\xa2\x23\x53\x25\xcf\x1d\x5f\xec\xcc\x79\xb2\xe8\xbd\x8c\xe3\xfd\xde\x84\x69\xd4\x31\xfa\xfe\x30\xe3\xc5\x6f\x82\xd4\x73\x69\x7a\x39\x93\xd6\x48\x3e\xeb\x66\xba\x3d\xa3\xf8\x1e\xad\xd2\x92\x2f\xf1\x44\xdf\xc4\x16\xb2\x3c\x9f\xda\xe7\x87\x68\x8d\x37\x88\xeb\x58\xaa\x21\x52\xa8\x1b\x88\x12\xdf\x31\x48\xc1\x69\x2f\xeb\x2a\x88\x87\xb7\x14\xda\x17\x6a\x83\x31\x0b\xd2\xe1\x22\xcd\x14\x8f\xb9\x12\xd2\x8d\x93\x79\x2e\xbd\xf2\xcb\xed\x10\xe6\xd1\x49\x0c\x9f\xa7\x8c\x57\x1f\x87\xce\x8e\x51\xfe\x86\x48\xf3\xf3\xb6\x88\x22\xe1\xda\xf9\x53\x15\xdd\x47\x16\x77\xc6\xf2\xe4\xb3\xed\x08\x57\xf7\x13\xbb\x36\xba\x3a\x9c\xa5\xb8\x55\x9a\xb3\x1b\x1e\xe1\xf6\xb9\x0b\xc1\x49\x9e\x6e\xe7\x7b\x1b\x59\x82\xc1\xd8\x59\x0d\xd5\xd0\x75\xef\x76\xfd\xa6\x94\x26\x80\x7b\xa5\x24\x64\xec\x11\xd4\xe7\x8c\xcc\xce\x76\xa7\xdd\xb5\x5e\x9f\xbb\xf3\x24\x19\x48\xec\x3b\xb8\x6e\x84\x23\x29\x35\x74\x40\x63\x26\x73\x83\xba\xbb\xfe\xa0\x31\xac\xc7\x62\x90\x12\xc3\xb1\x1b\xaf\xf5\x7a\xa7\xd5\x99\xc8\xf5\xb2\x9f\x15\x89\x28\xe0\x42\x62\x82\xf8\x92\xf0\xa7\x87\x90\x62\x2a\x79\x72\x6e\xab\x88\xa9\x04\x7e\x12\x48\x6c\x0b\x4f\xe4\xfe\xa8\xab\x8b\x97\x1c\xcd\x99\x4c\xb6\x72\x3e\x67\x35\x15\xd3\x7a\xd3\xc4\x8c\xe7\xb8\xc1\x43\x7e\x12\x45\x90\x5f\x2a\x5a\x81\xc9\xdb\x29\xb7\x01\x46\x1d\x0f\x70\xd5\x61\xa4\x21\x9f\xad\xad\x50\x67\xc9\x41\x3c\xa8\x6d\xb1\xf2\x1a\x1d\xf1\xf9\xd0\x32\x8f\x39\x4c\xdc\xce\xc7\x4c\x03\xa1\xb3\xab\x45\x85\x4a\x60\x9d\x1b\xff\x78\x7a\x56\xd6\xb5\x9c\xc8\xc7\xb9\xbe\xcc\x17\x6b\x07\xc3\x1f\xd0\x89\x1a\x77\xb6\x5a\xb1\x0b\x42\x56\xea\x76\x6d\x34\xe3\x22\x7a\xb5\x37\x09\x8b\x7f\xd2\xe3\x76\x42\xd8\x5a\xdb\x66\x47\x4c\xcf\x24\x59\xe3\xda\x91\x34\xe5\x6d\xc9\x1e\x0a\x5c\xed\x0c\x3b\xba\x91\xe2\x9e\x90\xd0\x44\xae\x3d\x69\x8b\x45\x70\xd2\xa9\x7c\x48\x01\xc0\x78\x78\x49\x5c\x74\x54\xf1\x26\x7b\xc7\xb1\x08\xa2\x96\xc7\x5d\x20\x14\x2f\xd3\x31\x7b\x94\x04\x62\xd4\xad\xdb\x2c\x17\x01\x93\x72\xe5\x82\x78\xb4\x54\x9a\xfa\x75\x4d\x70\xfd\x2e\x25\xd7\xa1\x7b\xa4\xc7\xe6\x89\x34\xb8\x1e\x9e\xe6\xad\x5a\x50\x9b\xa8\x8a\x8b\x9b\xa9\x7d\x9a\xec\xdb\xbd\xd2\x44\xa4\xf7\x2a\x7b\x9b\x05\x77\xbf\xb8\x7d\xe0\xa8\x1b\x46\xcd\xac\xd4\x93\xb7\xd5\x2d\x2a\xef\xec\xd2\x58\xef\xa3\xee\xe4\x65\x5b\xeb\x57\x2e\x34\xc6\xda\xd6\x0e\x4b\xf9\x3c\x0f\xf7\x9a\xa8\x12\xd3\x67\x5d\x86\xf5\xab\x09\x9b\x86\xf4\x32\x64\x1a\x9d\x4e\x0a\xc8\xa1\x21\xea\x77\xdc\x8b\xa0\xe5\x32\xa0\xbd\x9d\xf8\x76\xb1\x70\xc6\x70\x5e\xd6\x7b\x7a\x8d\x7c\x0c\xd5\xf0\xe6\x52\xa4\xf5\x80\xde\x47\x0c\x79\xa1\x03\xb7\xbb\x85\x91\xa2\xd1\xae\x87\x23\x06\x6b\x85\xd1\x5b\x58\xda\xa1\xb0\x1f\x4f\x80\x54\x61\xc3\x44\xd3\x81\x3a\x0d\xde\xc2\xa2\x78\x0a\x9f\xcc\x7c\x45\x5c\x93\xa5\x97\xca\xdc\x98\xe9\x32\x11\x2e\x36\x03\xc0\xc6\xd1\x68\xd2\xe7\x7c\xc2\xac\x63\xad\x44\xf3\x00\xd7\xd9\x84\x11\x67\x3c\xb1\xd6\x80\xb2\x52\xca\xa5\x79\x38\x90\x68\x68\xea\x93\x23\x3b\xe2\x1a\x04\x2f\xb4\xa2\x46\xae\x82\xdd\xcf\xa4\x62\x36\x62\x55\x13\xfc\x82\x75\x00\x9d\x9a\x14\x8d\xa5\xb6\x17\x47\x95\x27\xe3\x43\x83\x53\xc0\xc5\x90\x61\x53\x9a\x6c\x3e\xd9\x5d\xdc\x13\x28\xc8\xe8\x0c\x15\xcc\x49\x49\x2f\xcb\xc5\x1c\x58\x74\x10\xb0\x7b\x14\x72\x6c\x1b\xe1\x0b\xa5\x6c\xf7\xe6\x8c\xa6\xf2\x35\x85\x26\x98\x85\xe8\x5d\xbe\xdf\x70\x5f\x36\x6e\x2c\x28\x4a\x42\xa2\x89\xf8\x0a\xa5\x17\xe1\x01\x99\x4d\xa0\xa5\x69\x73\x25\x60\x2b\xb9\x04\xb8\xdc\xe0\x8e\xb5\x05\x21\x8a\x9e\xfd\x08\x6d\x6c\x06\x4a\xad\x35\x41\xe8\xc7\x86\xfb\x70\xa6\x32\x2c\xdd\xdc\x51\xfc\xb9\xc8\x22\xa2\x2c\x49\x89\x6d\x1e\x7e\xa1\x10\x76\xb8\xa3\x72\xd6\x88\x2c\x71\x2d\x17\x0f\x83\x87\x20\xcb\x74\xda\x8d\x99\xa1\x71\x10\x27\x1d\x69\x24\x85\x9d\x0c\xee\xfa\xa7\xe1\xee\x28\x7c\xf7\xf5\x0a\xcb\x52\x60\xe7\x3a\x3f\x23\xe0\xa2\x1a\x3f\x6f\x84\x1a\x0d\x28\x24\x47\x18\x7d\x4e\x70\x61\x26\x4f\xb8\x84\x52\x77\xbc\x5c\x60\x9d\x0e\xe1\xb4\x95\xa1\x1c\xee\x33\xda\x81\x46\xcf\xe7\xa2\x54\x24\x6e\x27\x3e\xdf\x19\x23\x10\x21\xc6\x14\x6e\x29\xd0\x57\x0e\x8c\x10\x59\x81\x3c\xb2\xd3\x99\xbd\xde\xcf\xa5\x69\xdc\x49\x24\x93\xd7\xd1\x38\x0e\xf8\x16\x9c\x28\x87\x08\xd3\xad\x5b\x2d\x6b\x6b\x48\x0f\xc6\x9b\x21\xa6\x96\x06\x87\xf1\x12\x42\x16\xcb\xb3\xf6\x1b\xc3\x2d\x64\xc9\x40\xf0\xd0\xd4\x1d\x83\xeb\x4b\x4f\xd5\x8b\x39\xc6\xf7\x75\x85\x98\xbd\x79\xb0\x4c\x18\x31\x43\x4c\x47\x59\x0a\x11\x34\x3d\x64\x2b\x8d\x64\xf5\x05\xf0\x6a\x8b\xb4\x19\x56\xa6\x6e\x4c\xda\x20\x07\x18\xb7\xe6\x84\x81\x97\xe7\xc2\x02\xa9\x00\x21\xb0\xaa\x04\xcc\x4b\xe7\x1d\x6f\x8f\x49\x06\x0c\x14\xe6\x2c\x86\x83\x29\x81\xed\xc8\xd3\xeb\xba\x0a\x8a\x41\x10\x03\x2e\xab\x97\xe0\xbb\x40\xdc\x39\xbf\xac\x2c\xfc\xf6\xba\x27\x27\x87\xca\x38\xdb\x59\xca\xe7\xf6\x45\xb9\x5b\x77\x6e\x7e\x29\x45\x2e\xe7\x0e\xd5\xc1\x76\xcf\x04\x36\xef\x49\x82\xf1\x11\x8a\x37\x78\xec\x29\x67\xe5\x70\xb8\xa8\xfa\x1d\xef\xca\xb3\x19\xdd\x5e\x67\x0f\x7e\x50\xcd\xf6\x94\xc6\xed\x7d\x0c\xb0\x87\x17\x63\x26\xb2\x05\x13\x41\x9f\x17\x04\x3f\x3f\xcc\xb1\x8e\xba\xba\x3a\x12\x34\x5a\x79\x8c\x11\xa2\x03\x57\x17\xc8\x59\x93\x05\xa5\xa2\xef\x08\xff\xc8\x79\xfe\xae\x2c\x38\x28\x48\x90\x6c\xb3\x92\xd2\x4a\xb4\x48\x88\x0b\xf9\x84\xf0\xc7\xa5\x8e\xc9\x9d\x6e\x98\x93\xce\x10\x19\x1f\x57\x49\x36\x88\xf6\xdb\x9a\x38\x45\xc8\x09\x99\xa3\xc4\xe7\x95\xcb\x38\xc5\x1e\x67\x16\x49\x8f\xe7\x4a\x95\x09\x61\xe8\x00\x8f\xfa\xd6\xe8\xea\xa2\x0e\x04\x1c\x1b\xa1\x8f\x46\xad\x73\x29\x97\x44\x07\x61\x2d\xba\x80\x59\x72\x1e\xcc\xa1\x46\x6f\x9c\x8b\xc0\x12\xdc\x1c\xde\xba\xd8\x86\x70\xab\x83\x86\xbc\xaf\x30\xbb\x9a\xee\xa6\xbb\xd8\x96\x1a\x18\x35\x39\xf2\x19\xc9\xec\x83\x6d\x88\x03\x95\x22\x6c\x6a\xf1\xf6\x05\x00\xc3\xe5\x31\x6c\xd2\x0e\xc3\xe6\xb9\x15\x7c\x11\xdf\x62\xfb\x35\x0a\xcf\x5d\x8d\x0a\x26\x4c\xa1\x78\x02\xd2\xf1\x1c\x35\xc4\x9b\x41\x8c\x5c\x17\x7f\x70\x11\x47\x3a\xbb\x92\xf7\xe4\x0e\x5d\x46\x43\x70\x7e\x92\x45\x14\x6d\xc3\xe8\x11\x33\x09\x8a\xd3\x3b\x5a\x75\x17\x0f\xe1\xa3\x82\x22\xcd\xf7\xb5\xe6\x1a\x5f\x4e\xec\x02\x74\x50\x0c\x27\x43\x15\x57\x30\xd4\x38\x7d\x4a\x37\xaa\x12\xdd\xaf\x61\x08\x44\x6b\x2b\x02\x75\x28\x37\x3b\x20\x7c\xc6\xce\xe0\x4b\xd1\xdc\x1f\x33\xdd\x4f\x19\x14\xa8\x5a\x17\x2a\xe4\xd3\xb8\xde\xe5\x67\xfc\x36\x1e\xaf\x8e\x38\x0e\xa2\x83\x6a\x1c\x17\x82\xe1\x47\xfc\xe8\xa1\x64\x44\x7b\xb6\x53\x44\x41\xb6\xdf\x86\xc2\xf7\x86\x81\x6b\x87\x19\xa7\x69\x5e\x3c\x5f\x62\x6a\x1f\xe1\xe9\xbc\xfe\xb4\xe9\xc8\xed\xc6\x9d\x86\x1e\x24\x03\xa9\xd7\xe6\xc2\xc3\x54\x5c\xf1\x2b\x67\x5b\x33\x11\x88\xcf\x51\x17\x9e\xdb\x69\xd1\xd4\x08\x5f\x8d\x9e\xf5\x2f\x6a\x2a\x84\x0f\x85\x11\xdf\xf7\x45\xb7\x4f\x0c\x03\xa1\xec\x99\x21\x2e\x16\x2c\x5d\x1e\x64\xae\xf0\x7b\xe1\x81\xf9\xc0\x6c\x43\x84\xae\xc4\xf3\x16\xf2\xee\x73\x60\xbe\xed\x0b\xcf\xf7\x21\xb6\xc0\x74\x0a\xc3\xb1\x72\x5d\x10\xb3\x42\x36\xf2\x36\x7b\xd1\x54\x27\xfe\x19\x31\x4c\x44\x50\xb4\x1d\x82\x5b\x09\x17\x2b\xa4\x3b\xda\x8c\x2e\xb0\x46\x6b\x48\x30\x4c\x75\xc9\xfd\x56\xab\xe0\x8e\x30\x41\x2a\xa2\xbf\x0d\x78\xe0\xec\x6d\x5c\x74\xe7\x4a\x9a\xc7\xe2\x19\x43\x03\xa0\x22\x7a\x15\xaf\x08\x14\x0f\x5a\x0f\xc6\x55\x09\x24\xe9\xd1\x10\xd9\x1f\x17\x90\x0d\x08\xbb\x44\x2c\x43\x15\xcf\x35\x09\xbd\x85\x2e\xd9\x29\x2a\x89\xdc\x3b\x10\x8c\x38\x8e\x32\xf3\xe1\x58\x21\x76\x3a\x6c\x4e\x17\x73\x6a\xdc\x6c\xaf\xdc\x7e\x4a\x96\x63\x59\x78\x60\xdf\xdb\x5a\xbf\x87\xee\xc2\xf1\x8e\x8f\x26\x3e\xbb\xf7\xb2\x38\x9c\x01\x37\x9a\x7d\x3f\x83\xfa\xf5\x8c\x1b\xdb\x38\x3f\xa2\x13\xb7\xbc\xe9\x4e\x90\xa8\x1c\x61\x9e\x11\x73\x81\x51\x1c\x67\x88\xd3\x6e\x80\xf1\x20\x50\x06\xf3\x5e\x1b\xfb\xc5\xa7\x33\x2f\x12\x23\xc7\xb2\x05\x0d\x90\x96\xc5\x94\x1d\x62\xd3\x3c\x6c\xea\x17\x58\x43\x2a\xf5\xe2\xc2\x14\x31\x27\x9d\xec\x70\x74\xa3\x31\xc2\x9b\x7d\x5c\x61\x12\xa9\x5c\x48\xa9\x5b\x75\xd4\xdc\x0f\xb0\x3e\x58\x80\x93\x45\x29\x16\x8c\x58\x36\xbc\xfc\x31\x0c\xec\xec\x5f\x55\xc6\x12\x91\x83\xa2\x4e\x7a\xc5\x0e\xa9\xe9\x6f\x44\x4b\x59\xbb\xb7\xc0\x25\x53\xbb\x3a\x75\x26\x9e\x21\xe4\xdc\xbf\xe5\xd8\xe4\x39\x2b\xd1\x2f\xd6\xba\x41\x8e\x6a\x36\x23\x60\xac\x14\xd4\x58\x92\xb0\x06\xf1\x84\x91\x53\x58\xb7\x5a\x64\x3b\xb9\x8b\xe0\x86\x44\x10\xb1\x99\x0c\x09\xb2\x9b\xfa\x42\x2d\x6e\x58\x24\x5e\x65\x18\xe2\xcd\x88\x94\xf5\xf9\xb1\xd7\x97\x91\xb5\x00\xd7\x30\xfd\xea\x19\x5b\x7c\x08\x53\xca\xe3\x92\xc6\xd1\xb1\x68\xc3\x23\x31\x6a\x02\x05\xd1\x51\x8d\x7a\x41\x19\x19\xbc\xc9\x47\x7e\x0f\xe3\xb8\x55\x1f\x9f\x48\x6a\xee\xb3\x92\xb2\x01\x5d\xf2\xd9\xc9\xe0\x73\xcb\xe0\x8f\xa1\x91\xf1\xcf\xf7\x2d\x3f\x3d\x3d\x1d\xed\x89\x94\x81\xa3\x11\x9e\xe9\x57\x3f\xfb\xb1\xe8\x45\x10\x7a\xb8\xba\xc5\x14\x1b\x4e\xfa\xe5\xae\x74\x24\xc3\x91\x0f\xea\xd2\x89\x46\x43\x11\x44\x9a\xf9\xc9\x23\x91\x1d\x73\xa2\x0b\x89\xe5\xcd\x9b\x00\xab\xeb\x47\x0c\x3d\x3d\xb4\x38\x2f\x4d\x96\x65\x2d\x2c\x9f\xc8\xd8\x0f\x53\xb8\x0d\x4d\xb8\xbd\x1c\x58\x6b\xc6\xe8\x64\x06\x04\x8f\x81\x1e\x7d\x6e\x54\xeb\xcc\xe2\xae\x11\xf9\xcb\xd2\x2c\xa7\xdb\xe0\x9b\x70\xe2\x9e\xd4\xca\x80\xb2\x82\x4c\xf8\x34\x14\xbe\xdb\xb9\x9d\xce\xb5\x71\xbe\x79\x92\x13\xc3\x56\xec\x53\x3d\x3e\x41\x70\x40\x92\xa4\x75\x79\x74\xe1\x8c\x05\xa0\x80\xd6\x81\xd7\x63\xf5\x62\x0b\xf3\x63\xb4\x0a\x53\xf6\x28\x6a\x74\xd4\x2b\x6a\x38\x57\x9a\xa4\xf6\xeb\x55\xd7\x50\xbb\x97\x22\x44\x22\x1f\x60\x1b\xfd\xa1\xe3\xf2\xf7\xd4\x2d\xc5\x2b\xea\xe3\xf7\x1a\x4b\x13\x06\x22\xfb\x55\x9d\x2c\x10\xe8\xb3\xa7\x57\xf5\x88\x40\x4d\x7b\x52\xb8\xa1\x06\xfe\xb0\x64\xba\x24\xcd\xba\xa7\xba\x3a\x38\x9e\x21\x68\x38\xf4\x15\x34\xf7\x3e\xcc\x76\xa3\x31\x19\xc5\x4d\xa0\x6f\xd6\x93\x78\x1b\x54\x90\xf5\xbd\xcc\x7b\xe3\xdc\x5b\x46\xb0\x58\x45\x88\xf6\x23\xda\x01\x07\x0c\xec\x4e\x59\x82\x46\xc6\x63\xef\x52\x94\x72\x57\xb6\xc7\xfe\xe4\xa0\xdb\xf1\xfc\x20\x4f\x25\xbd\x42\xc3\x00\x20\x3e\x89\x3a\x08\x4e\xa5\xa0\x56\xe7\x03\x71\x92\xb3\xf1\x13\xab\x74\x06\xc7\x9b\x7d\x48\x24\x0f\x6d\x50\x02\xc4\xe5\xca\x6c\xa9\x2a\xf5\x68\xba\x94\x77\x2f\x08\x45\x8f\x7b\x81\x0d\xdd\x51\x69\x8b\xa4\x96\xe1\x42\x84\x72\xa8\x2f\x0d\x11\x12\x6c\x70\x03\xca\x25\x1e\x3b\xd6\xe7\x64\x5d\x82\xe5\xf7\x24\xb0\xe1\x53\xa7\x5d\x60\xcc\xbf\xef\x73\xb2\x17\xa7\xc6\x21\xb1\xb9\x2f\x89\x49\x77\xeb\x3d\x04\x49\x1b\xe6\xad\xc1\x23\xaa\xc7\x10\x9e\x07\x6a\xae\x39\xe1\x09\x02\xc9\xd7\xeb\xe4\x76\x20\x58\xd5\xd3\x44\x1c\x49\x65\x65\x3e\x86\xbb\xc0\x8d\xba\x8f\x94\x79\x6f\xb7\xb8\x52\xe1\x27\x5e\x30\xfe\xbd\xa7\xe6\x61\x00\x9f\x9d\x81\x75\x6f\x90\x48\xd7\x93\x0a\x0e\x23\x64\x9b\xf0\x43\x7a\x67\x23\x57\xde\x27\x2c\x93\x8b\xc7\x59\x25\x69\xaf\x3a\x5f\xa5\x23\x22\x93\x2d\xc9\x7c\xda\x28\xd9\xbd\x0b\x26\x63\x6e\x35\x80\x14\xfb\x46\xa1\x6a\x84\x51\xaf\xfc\x06\x11\x20\x7a\x83\x8b\x7a\xd7\x0a\x7b\x20\xc7\xa5\xb5\x78\xf1\x48\xe3\x3e\xbd\xa1\x66\xe5\x74\xd4\x04\xf6\x54\x10\xb5\x6d\x1c\xf4\xd0\xdf\xf3\x23\x0c\x09\x84\xbc\x7f\xcb\xad\x36\x14\x86\x19\x5e\x7c\x18\xf6\xb3\x53\xce\x00\xe1\xef\x01\x0f\xf9\x9b\x14\xcf\xfe\xf9\x7a\x3e\x9c\x38\x97\x7b\xf0\x8f\x40\x76\x50\x08\x3e\x5d\x82\x11\xbf\xce\x15\xb2\x98\xb1\x73\x0d\xf7\x84\x61\x18\x1b\x9f\xb5\x96\xb7\xbe\x63\x1e\x77\x19\xef\xca\x7e\x43\x90\xba\x64\x01\xc3\xa7\x78\xe7\x8a\x5a\xb4\xb8\x3e\x99\x78\x71\x92\xb3\x3d\x0e\x5a\x95\xce\x97\x43\xa1\xdc\x04\x8d\x53\x0c\x11\x6c\x24\xcd\xac\xa7\xda\x43\xab\x08\xb6\x7c\x7a\x17\x16\x7d\x8b\xf3\x46\xe6\x5c\xa6\xf8\xb6\xef\x85\x02\x16\x3a\xab\xf7\x15\x81\x15\x8b\xa2\x1d\xca\x59\xd1\x79\xee\x10\xd7\x77\x0b\x3b\x3e\xf6\x5b\x77\x95\xf8\xac\x39\xf1\x67\x41\xc1\x8f\x24\xee\x67\x18\x49\x6c\x89\x29\xe6\x84\xa9\x55\xc5\x31\xbc\x3e\xd4\xf8\x09\xd8\x00\x80\xd3\xf7\x00\xe5\xaf\xbb\xca\xc0\x0e\x29\x31\xb0\xa8\x2d\x28\xbb\xbc\x95\x6f\xac\xeb\x6f\x0f\x9d\x07\xa5\x64\x90\xca\x35\xea\x13\xb1\xad\x79\x3b\x57\x0e\xa4\xe9\x74\x08\x95\x0c\x7d\x3f\x8f\xc9\x32\x6d\x55\x58\xba\xfd\xd2\xec\xdb\x54\x9e\x73\x3e\x53\xce\x1f\x5b\xa5\x5c\x34\x1a\x38\xbb\x54\x4a\x85\x4a\xab\x2e\x88\xc7\x9b\x5c\x54\x24\x43\x61\x09\x04\x5c\xe0\xeb\xdd\x83\xb9\xb5\xee\x86\x19\x86\xda\xdf\x8e\x07\x29\xb0\x1c\x08\x5e\x1f\xdb\x1b\x9e\xb1\x72\xcb\x28\xac\x07\xf6\x74\x9d\x8d\xf3\x7c\x93\x18\xde\xff\xe4\x10\xbd\x24\x0c\xe8\xd5\x95\x0a\xdf\x45\xd9\x8b\x72\x3d\xed\x08\x9b\x65\x4e\xf2\x8a\xc9\x86\xcc\xe1\x01\xbb\x4b\xcc\xec\x93\x90\x5f\x9d\x0e\x02\x67\x4e\xec\x04\x18\xf4\x2e\x52\x89\xe1\xe2\x80\xe5\xd8\xc5\x15\xcb\x60\x82\x09\xf2\xec\xa9\x64\x9f\x98\xa5\xd4\x0e\xbb\x34\xa5\x48\x42\x47\xef\xa2\x8a\x57\xcc\x70\x62\xcc\xb8\x64\x87\x75\x63\xa3\xa9\x71\xd6\xb6\xbd\x32\x49\xce\xda\xe8\x74\x27\x52\xc9\x75\x93\x2b\x3e\x1d\x63\xcf\xba\x2e\x35\x51\xaf\xc5\xce\x5b\xb9\x0d\x39\xef\x60\xa2\x28\xf6\x55\x3a\x07\x20\x61\x3a\x7e\x7f\x54\xc4\x42\x02\x9e\x94\xa0\x34\x3e\x91\x30\x71\xe4\x03\x2f\xad\xb5\x20\x5e\x2e\x08\x6b\xde\xf4\x03\x6f\xfa\x3d\x84\x43\x57\x55\x77\x5d\x1f\x5d\xaf\xb3\xaf\x1e\x1e\x97\x11\x29\x76\x5f\x5a\x2f\xd7\x52\x73\xf8\xec\xc7\xb1\x9d\x96\xcd\xfa\xb8\x31\xd7\x57\x1d\x3a\xe8\x27\xb8\x8a\x27\xdf\x6b\xfa\x7a\xb2\x02\x33\x6d\x86\x80\xc1\x22\x7d\x1b\x2b\x2d\x25\xec\x86\xa8\x19\x14\x80\x15\xd5\x0d\x21\xd8\x33\x37\x1f\xf3\x2e\xd3\x88\x4b\xcf\xed\x54\xcd\xf8\x25\x9b\xbc\xa7\x96\x70\xb8\xbf\x72\x1e\xc2\xe3\xc9\x19\xf3\xcb\xfd\x7a\x13\x4d\x50\x0f\xaf\xa3\xa7\x63\x37\xda\x4c\xf9\xfd\xbd\x2e\x4c\x03\x08\xe4\xe9\x82\xcd\x43\xae\xb3\x0e\xd3\x1d\x52\x38\xb5\xef\x90\xff\x60\xfa\xa7\xf8\x54\xb3\xd0\xe2\x9e\xef\x45\xff\x82\xc8\xb9\xc5\x35\x0e\xe1\x0b\xf1\xd0\xb7\x90\xef\x7a\x49\xdd\xf5\x5b\x60\xc9\x65\x71\xf6\x2b\xbe\x35\xf9\xa3\xed\xd4\xa1\xbc\x32\x8b\x16\x61\x8e\x09\xea\xed\x7a\x72\x0e\x4f\xe9\x3a\x3d\xa8\x66\x63\x68\xed\xb6\xb4\x1c\xbe\x29\x1f\x25\x40\x38\x54\xa3\x73\x58\x01\xa6\x50\xa7\x46\xdd\x6c\xa1\x9f\x23\x16\x26\x34\x2c\x99\x59\x3a\x9d\x29\x88\x48\x4f\xf2\x65\xbd\x4d\x7b\x8c\x9b\xb7\x33\xc4\x87\xa9\xb3\xa5\xc5\x18\xd6\x35\x58\xfd\xb4\x44\x98\x2d\xae\xb6\xe2\x8c\xc3\x85\x1a\xab\x2d\x37\x98\xfb\x91\xe9\xdf\xf7\x5f\x54\xb4\xf8\x6e\x99\xb8\x89\xe9\xb3\xa8\xbd\xf8\x64\xe2\xbf\x28\x89\x8f\x32\x40\xcd\x94\x6b\xe0\xb9\xea\xc5\x5f\x63\x5f\x3a\x05\xcb\xc6\xe0\x3d\xdb\x2c\x30\xa8\x1f\xfd\xeb\x3f\xf9\x31\xec\xf0\x05\xbe\x42\xd4\xb8\xc0\xae\x36\xa2\xc7\x11\xaf\x32\xaa\xbb\x6a\x45\xdb\x2e\x10\x3d\x37\x83\x81\x26\x99\xdf\xec\x0f\xd6\x72\x9e\xd9\xf3\x1e\x8e\x79\x43\x3d\x0e\x99\x42\x7f\x62\x90\x92\x26\xa3\x9f\xe1\xfa\x40\x3f\x43\x46\x84\x2f\x3d\x7a\x0e\xea\xe0\xe1\xbe\xf1\x92\x0b\x00\xa1\xb3\x74\xa2\x58\x7f\x4f\x87\x57\x14\x5b\x00\xf6\x1a\x79\x3a\x59\xc5\x6c\x3d\xad\x82\xb1\x8a\x5a\xad\x83\xd8\xe9\x93\x13\x42\x35\x08\x54\x21\xfb\xbd\x68\x1a\xd1\x98\x2b\x76\xe9\x62\xb0\x1e\x7d\xc8\x22\x1a\xe0\xac\x7f\xa1\x7d\xf2\xba\x32\xe8\xc3\xc8\x9c\x11\x10\x86\x1e\xfc\xc7\xba\x49\x37\xf9\x7d\xa2\x0f\x4f\xc6\xe2\x9f\x70\x00\x43\xed\x4b\x57\x64\xcc\x40\x3c\x60\xd8\x5d\x99\xe0\x18\x37\x9d\x39\x25\x7d\x74\xdc\xc7\x48\xc2\xd9\x17\x9f\x19\xa3\xe3\xaa\xe8\x65\xac\xe3\xfb\x3c\x52\x75\xa7\x5d\x9f\x03\x21\x2d\x9f\x75\xaa\x50\x37\x01\x16\x37\x57\x9b\x79\xfc\x2e\xd7\x2c\x3e\x02\xf4\x7f\x7d\x5e\x35\xb0\x88\x5d\xa9\x0a\xae\xd5\x09\xca\x5c\xc6\x59\x05\x4c\x2a\x6e\x17\xca\x0f\x31\x50\x64\xeb\x6e\x0b\xc7\xae\xae\xc9\x3e\x04\x31\x13\xbe\x7d\x7d\xa0\x06\x96\xe2\x8e\x31\x2c\x49\x04\x04\xa1\xcc\x91\xea\xa3\xb8\x74\x4e\x00\x78\x50\xa0\xc6\xfa\x14\x8f\x70\x4f\x86\xc3\x8d\x02\x24\x57\x29\x4f\x77\xa5\x7c\x85\x8a\x56\x0e\x5a\x28\xda\xe1\x3d\x8e\xda\x5e\xbb\xb7\xb5\x59\xde\xa8\x63\x69\x9c\xc7\x93\x50\xab\x54\x6a\x35\x40\x58\xa6\x7b\x30\xf7\x34\xd0\x06\x02\xa9\x69\xd6\xf9\x22\xe6\x26\xc4\x59\x4b\x9d\xbf\x73\xce\x07\x7f\x72\xa5\x00\xd4\x96\x17\x90\xf2\x76\x5c\x41\xd6\x9a\xaa\xc0\x2e\x72\x0e\xeb\x27\x72\xb4\x71\x79\xcd\x07\xed\xf2\x58\x76\xc6\xd2\xdd\x50\x4e\x36\x87\x92\x43\x1a\xfc\x39\x04\xc9\x5a\x8e\x80\xf3\x02\x9c\x94\x6e\x5d\x1d\x37\x00\xf0\x40\xf4\xde\x6a\x99\x23\xe4\x83\x44\x6e\xc0\x7e\xff\x06\x94\x2d\xcc\xa1\x0f\xc0\x28\x40\x06\xac\x5d\x57\x02\x6a\x7e\x6f\x31\x40\x27\x1e\xcc\x03\x14\x19\x5d\x5a\x47\x2f\xbc\xd5\x9a\x00\xd7\x25\x60\x39\x75\xb0\xf6\x51\xcd\x40\x71\xa4\x0f\x1e\x3a\x27\xf8\xac\xe8\x33\xb5\xe8\x6b\x0c\xc4\x3d\x67\x91\xc2\x67\x1e\x5e\x7d\x32\xf5\x27\xf1\x41\x40\x40\xba\xf1\x1b\x3a\x79\x49\x1f\x32\xec\xe1\xfc\x00\x3a\x41\x14\xe0\x49\xb3\x09\x1d\x64\x8c\x20\xde\xae\x0e\x82\x1a\xf7\xdb\x66\xbe\x66\xbe\x13\x90\x75\x27\x30\xf0\x81\x8c\xd7\x6f\x0c\x7b\x62\x7b\xbb\xb3\x27\xfd\xe5\xff\x2c\xe2\x9f\xb7\xa3\xb5\x88\x4d\x38\x5c\x29\xb5\x8c\x8e\x32\x1f\xfb\x01\x41\xec\x2b\x03\x50\x2b\xf6\x82\xdd\x97\xd7\xa0\x39\xd9\xcd\xe9\xb9\x5b\x0e\x9e\xe0\xf2\x5e\x64\x07\xe3\x7e\x3d\x45\x25\xbd\x35\x0a\xc0\x7e\x92\x83\x69\x0e\x4a\x3f\xb4\x93\xf4\x06\xba\x08\x2d\x9f\x16\xde\x42\xab\x63\xbe\x1d\xdb\x5e\x17\x08\x50\x5e\x80\x58\xd4\x59\xb9\x67\x21\xce\xa3\xf1\x94\x2e\x88\xe0\x58\x00\xce\x0e\x30\xf5\xf8\xf6\x01\x44\xf4\xf5\x3b\xa8\xcf\x95\x37\xa8\x6f\x6b\xab\xd7\x53\x26\xab\x8c\xdd\xac\x27\xe0\x72\xc1\x7e\x80\xf4\x3d\xd6\x0c\xc2\x33\xf1\x28\xbb\xfd\x8c\xf6\x59\x25\xdc\xc0\x84\x01\x9a\xfa\x2b\x74\x52\xa1\xae\x01\x28\x99\xc1\x26\x58\x70\x53\x5c\x75\x88\xdf\xe9\x4f\x7e\x70\xc9\x1b\x73\x1f\x95\x7b\x29\xc2\xe5\xfa\x34\xcf\x40\x29\xce\xd9\x40\xc5\x6b\x6f\xa8\x65\x4c\xa7\x2c\xc5\xb4\x4d\x25\x15\xa9\xf6\x88\x78\xca\x0a\xb0\xa2\x4d\x65\xbe\x0d\x65\xfe\xc9\xc8\xca\x18\x0d\xd2\xad\x12\xdb\xc0\x12\x9d\x80\xce\x6e\xf3\x0c\xe3\x2c\x89\x9f\x07\x43\x1d\x80\x97\xcb\xc7\x0b\xf6\x56\xc5\x79\x90\xe6\xe5\x5a\x99\x67\x62\x44\x6b\x1b\x7c\x18\xbf\x06\x78\x01\x41\x52\xd5\x45\xb5\xb0\x21\x19\x5e\x9e\xb2\x55\xd3\xca\x36\xbf\xcb\x9c\xc3\x16\xf0\xfe\x51\x13\x0e\x0e\xcb\x6a\x55\x26\x72\x00\x08\x20\x41\x7a\xed\x81\x74\x8e\x1e\x24\x94\x35\xe0\x03\x7c\xf9\x3c\x9a\xb7\x14\xc3\xbc\x9d\x85\x6d\x83\x85\x33\x9c\xe5\x9e\x80\x16\x20\xaf\x0c\x31\x8b\xd1\x3a\xe1\x2f\xed\x38\xcf\xa0\xe6\x02\x1b\x48\x15\xd8\x02\x54\xe0\x8b\x36\x57\x96\xf8\x8c\xc5\x87\x3e\x4a\xf9\x28\x6d\x10\xea\x47\x2b\x41\xb9\x80\x77\xc1\x0e\x92\x00\xed\x64\xbf\xf8\x58\x86\xe3\xa0\x72\x5c\x78\x6b\xe3\x3f\xf9\xba\xa6\xa6\x38\x2c\x1d\x13\x50\x2f\x34\x39\xe1\x06\xf7\x15\xf6\xc0\x9e\xfa\xdc\x04\x58\xd6\x00\x40\x09\x80\x4e\xcf\xc4\xfd\x80\x1a\x89\xef\x60\x6c\x16\x61\xf8\x48\x4a\x1d\x74\xab\x8f\x62\xc1\xc7\xc7\x0d\x60\xad\x11\x7a\x75\x17\x02\x04\xa0\xbc\xaa\x7b\xfd\x0d\xdf\x4b\x2a\xc0\x56\x40\xa0\xcc\xbd\xa7\xc0\xae\xd0\x18\x7b\xc3\x57\xc6\x3a\x9d\xe9\xa5\xf6\xf7\xae\xf2\x5c\x0d\xad\xe8\x5c\x84\xec\xfb\xf3\x3d\xb6\xec\xea\x6c\xd0\x41\xe3\xfb\x13\xcb\xcb\x2c\xe1\x48\x6b\xfa\xca\xa1\xf3\x23\x78\xb1\x93\x3e\x7c\x74\x0a\x33\x53\x78\xa5\x77\xe9\x30\xd1\xe9\xd2\xd1\x29\x0e\xa8\x33\xde\xd1\x99\x7f\x1b\x64\x1b\x33\x85\xfa\xda\x37\x25\x01\x9d\xf6\xd3\xa4\xec\xc8\x04\x58\xc7\x64\x39\x40\x52\x36\x09\xbe\x91\xab\x07\xba\xad\xcc\xed\xc8\x97\xc4\x22\xab\xa3\x51\xcc\x6c\x16\xb3\x8d\x05\x5b\xdd\x5d\x01\xea\x39\x17\x09\x10\xe8\x9f\x39\x09\xc0\xa4\xe6\x1f\x28\xb1\xc0\xa0\xf8\x65\xaf\x0f\x88\x25\x32\x83\x3b\xa6\x7a\x80\x1d\x00\xd0\xc5\xe0\xaf\xba\xfd\xca\x7d\xf9\x7c\x75\xe5\xb3\x31\x01\x3a\x79\xa5\x7c\x67\x69\xae\xd1\x04\x74\x0b\xd0\xd0\x0b\x88\x17\x27\x47\x64\x1e\x24\x57\xd2\xb8\x70\x66\x23\x3c\x2f\x77\xad\x7d\x1d\xd8\x98\x06\x83\x6c\xa7\xbb\xba\xb1\xf5\x9a\x78\x52\x79\x03\xa5\x41\x77\x90\x45\xdf\x4f\xbb\xb2\x9f\xd6\xd3\xe5\xd1\x9f\x4e\xc5\x90\xc1\xc8\x51\x07\x7c\x03\x5c\x3e\x61\x33\x8e\xf6\x2f\xec\x8d\x1b\x3d\xbe\x15\x80\xef\xbe\x67\x58\x28\xe7\xb4\x91\xa3\xe6\x5c\x54\xe1\xab\xfe\x1b\xad\x0d\x71\x0b\x4d\x4b\x21\xf7\x51\xbb\x44\xbb\x52\xcb\x5b\x28\x72\xa1\xfc\x44\x0e\x83\xd5\xbd\x90\x0f\xfc\x17\x22\xbe\x05\xa9\xc0\x89\xb4\xa2\x5e\x9b\x2d\x15\x77\xe6\x76\x1f\xd2\x1d\x72\xb7\xc4\x3f\x63\x49\x73\xc6\x96\x25\x6e\xa8\x85\xa9\x2e\x81\x1e\xd1\x61\x20\xa1\x5b\x0b\x34\x87\x77\x07\xc1\x25\x3f\x0f\xf0\x75\x7a\x27\x28\xdc\x41\xd7\x01\x5f\x52\xdb\x67\xb9\x01\x4a\xf1\x56\xe3\xb0\xf9\xd9\xc8\xcc\x39\x49\xee\xe3\x15\x40\x5f\x49\x3d\x3d\x44\x3b\x70\x38\x69\xbe\x77\xc9\x13\x0d\x04\x4d\xa2\x1c\x38\x41\xb9\xcb\xcf\x8c\x29\x9b\x6f\x02\x4a\xa0\x04\x95\xe0\x04\x81\x32\xb0\xd5\xc9\x9d\x4f\xdd\x0e\x16\x12\x0f\x10\xe0\x9a\xc2\xab\x86\x96\xb7\x87\xca\x02\x33\xe4\x4f\x6d\x2b\xb6\xe5\x3d\x8d\x40\x91\x14\x29\xfb\xc4\x9d\x2e\xd7\x46\x0d\xab\xab\x06\x78\x0a\xc4\xc1\x9f\xf3\x76\x02\xb8\xce\x1e\x00\xab\xd4\xd3\x56\xd2\x2e\xa1\xad\xe7\xee\xf7\xb3\x01\xbb\xea\xd6\x13\xcc\x9d\xb9\xab\xd0\xc4\x2d\xc7\xc1\x9f\xba\x49\x01\x02\x5f\x70\x30\x10\xb7\xb6\x2b\xa9\x17\xe5\x81\x80\x9b\xdd\xa7\xfe\x41\x0a\xc5\x49\xad\x5b\xc2\x1d\x49\xdb\x56\xf2\xf2\xb3\xce\xea\x97\xc3\xd9\x54\x1a\x4e\xd0\x2f\x14\x7c\x05\x70\x22\x23\x5c\xc6\x7d\x3f\x27\x3a\x94\xba\x11\x54\x88\x59\xa0\x2c\x58\x74\x58\x28\x67\xa2\x06\x31\x79\x84\xbf\xe9\x00\xf1\xfa\xe2\x36\x88\x6d\x73\xed\x5d\xda\xc3\xa7\xce\xdc\xf1\x6f\xbe\x12\x7b\x41\x7b\xb9\xb0\xb4\xe8\x9c\x0b\x3e\xcf\xab\x0e\x5a\x82\x5d\x9f\x0a\x7f\x15\x39\x8f\x34\x03\x15\x24\xdc\xf9\x4e\x7c\xb8\xa0\x40\xd5\xce\x54\xd5\x9c\xb3\x9d\xcb\x86\xab\xa3\x08\x6f\xa7\x98\x7f\xbb\xa5\xc9\xa6\xc4\x1b\xe2\xe1\x29\x28\x6a\x1b\x44\x07\x88\x87\x3f\xcf\xcf\x24\xce\xbf\x6d\x60\xb2\x92\x8b\x0f\x74\x5c\x3f\x2d\x58\xf9\x8e\xc1\x04\x65\x76\x6d\x0d\xf6\x4e\x73\xfa\xcc\xa1\x60\xff\xb5\x46\xfc\x73\x8d\x5a\xbe\x9f\x1f\xd1\x85\xe7\xf8\x12\x0f\xd2\xd3\xb9\x6b\xb9\x4d\xe1\x3f\x7d\x47\x8d\xba\xf8\xc4\xaf\x94\x0c\xba\x29\x1c\x75\x7f\xc4\xf0\xc4\x89\xf5\x27\x46\x1c\xf8\x5b\x70\xb8\x1e\x1c\x60\x3b\x72\x85\x74\xdc\xcb\xf9\xef\x6b\x05\x62\xd2\x8c\x18\x6e\xd5\xdb\xae\xf0\x0d\x87\x9b\xcf\x9c\x95\xbf\xbb\x8e\xb3\x80\x0f\x4f\xd2\x7c\xc9\x83\xf9\xd2\x72\xf1\xe7\x3a\xb9\x5c\x47\x89\xcc\xe1\x39\xb1\x44\x94\x64\xbf\x3e\xf5\x87\x2d\x7e\xf8\xe7\x20\xdc\xce\xbd\x59\x08\xb6\x40\x68\xf6\xb1\x28\xbe\xc5\xa5\xc2\x3d\xef\x41\xdb\x0a\x2d\xaf\x18\x1b\xd0\x3c\xd7\x97\x6b\xdf\xed\xe3\x94\x73\x67\x58\x1b\x27\x1e\xb8\x3c\xbc\x5f\x71\xf5\x2a\x78\xf4\xee\x86\xef\x37\x05\x4e\x95\xab\x8e\xcb\xf9\x35\xd5\xf1\xb8\xe2\x38\xf2\xbb\xed\x5c\x7d\x39\xab\x06\x68\x62\xde\x99\x04\xf8\x9d\xfb\x71\x5d\xf5\xe3\x56\x96\x1c\x57\x1e\x44\x08\xe1\xd2\xe0\x1b\x6f\xe0\x6c\xb2\x5b\x57\x24\xb7\x39\xa2\x2b\x83\x3a\x3c\x80\xad\xdc\x3f\xf7\x42\x90\xad\x93\x79\xcc\xc1\xa4\x60\xdd\xb3\x73\xcf\xf9\x1f\xee\xa9\x73\xaa\x16\xa0\xea\xf1\x9c\x6c\x6c\x2e\x27\xcd\xdf\xe2\x9e\xb7\x49\xd8\xa5\x22\xe7\x16\x65\x36\x97\xdf\xdb\x46\xbd\x04\xbf\xdb\xa3\x17\xd5\xbb\x3f\xd3\x66\x64\x54\x5b\xe0\x40\x51\x3c\x21\x5c\xc0\xf1\x9f\xda\xc7\x38\x07\xba\x14\xbe\x60\xa7\x05\x1c\xd8\xb1\x34\x50\x34\x39\xf9\x33\xef\x50\x0e\xb1\x44\xf6\x74\xe0\x4c\x3d\xa9\x1f\x60\xf0\x99\x5f\x7e\x88\x2d\xfc\x0c\xfc\x9f\x4b\x40\x44\xa8\xfa\xf7\xb8\x0a\xa9\x66\x22\x63\x10\x57\xbc\xa1\xff\x2e\xe6\x94\x2b\x76\xe9\x0c\x3a\xb5\x40\x7e\xdb\xe2\x25\xf1\x13\xe4\xb7\x31\x77\xb8\x0f\xf4\x4c\xae\xb3\xbb\x23\xdc\x8d\x6f\x5f\x47\x71\xb4\x7c\xa3\x33\x5b\xfc\x01\x6b\xc4\x4b\x5d\xb2\x20\xcf\x1f\x20\x74\xcf\xea\xf5\x31\xe9\x1a\xfe\xfb\xbc\x06\x64\xae\x7e\x08\x60\x73\x51\x43\x8c\xce\xfc\x49\x58\xbe\xe7\xcb\x71\x58\x22\xf4\x9e\xc8\x97\xab\x05\xf2\xe9\x8a\x4c\x03\x05\x39\x0f\x55\x7e\x8d\x91\x7c\x8e\x31\x3f\xa8\xd4\x7c\x5c\x41\xfc\xde\x75\x02\x3e\x02\xcd\xd5\xd7\x22\x21\xc2\xdf\xf3\x55\xbd\x66\x30\xc3\x15\xd4\xc8\x1d\x8c\x4d\x05\xcd\x41\x51\xcd\x3a\x00\x5c\xcd\xa7\x8f\x78\x01\x0d\x20\x36\x1d\xd8\x44\x97\x41\x7e\xee\xa6\xf4\x5c\x64\xab\x3d\xbd\xcd\x75\xfe\x9c\xab\xec\x81\xa0\x02\xda\x31\xec\x4f\x16\x77\x3a\xe3\xcc\xe4\x74\xfb\x48\xcc\x6f\x75\xee\x3b\xa6\xbc\xd4\x0e\x42\x4f\x1b\x5a\xef\x00\x6b\xb9\x12\xe8\x6a\x1c\x26\x1e\x8b\x57\xda\x55\xc8\x65\x65\x5c\x56\x4c\xc5\x7d\xd3\x76\x7a\x88\xb1\x73\x92\xa6\xaa\xbc\x67\xdc\xe1\x50\x2d\x80\x88\x29\x71\x9a\x09\xdc\xaa\xdc\x24\x8f\x13\xc9\xc3\xb7\x9c\x13\x84\xa3\x7c\x5f\x9f\x6c\x6c\x71\x09\xe0\xfe\x2d\x7f\x13\xb8\xc3\x4a\xa4\xd9\x94\x26\x09\x79\x71\xab\x89\xd3\x9e\x52\xf6\x7d\x1f\x63\xb9\x4b\x74\x1a\x61\xfa\xc9\xd8\x63\x0c\x01\x84\x1e\x30\x49\xac\x8f\x27\xcb\x30\x28\x80\xdf\x55\xcb\xef\xfc\xf7\xba\x01\x29\xd8\xe9\x7e\xa7\x77\xda\x02\xe4\x87\x31\x41\x7b\xce\xde\x4e\x8b\xbe\x64\x70\x9a\x6e\xca\x5d\xc1\x1e\xd2\xe9\x90\x7d\x9e\x49\x2b\x46\xc2\xb4\xa9\x5f\xb9\x28\x89\x02\x8e\x0d\xda\x8b\x76\xa9\xcc\x06\x9e\xd1\x1c\x0c\x42\x5a\x8b\x6c\xa1\xe6\x96\xcf\x33\x8c\x93\xb8\x50\xf4\x20\xb1\xd0\x93\x7d\x12\x62\xc9\x11\xfc\x29\x95\x07\x72\xa2\x48\xa4\x02\xdc\x19\xe1\xba\x1c\xfd\x8c\x31\x59\x04\x75\x73\x5b\x00\x57\xa8\x6b\xc7\x68\x42\xdb\xe3\x6e\x9a\x7b\xe9\x9d\x70\x5c\x20\x99\xa2\xd8\xe8\x2c\xd4\x82\x87\x23\xce\xf7\x33\xf2\xa3\x89\x63\x24\x4b\xd2\x0b\xa0\xad\x25\x19\x72\x17\xb1\x75\x83\x8b\x1f\x45\xf8\xe0\xb4\xe8\xd1\xde\x66\x2e\x04\x28\x27\x7e\x4b\xab\x1a\xd0\x7e\xb0\x35\xc4\xfe\xc6\x07\x81\xfd\x02\x20\x0f\x8d\x99\x35\x22\x0d\x03\xe5\x79\x00\xf6\xcf\x42\xf4\x39\x7e\x6b\xe8\x2e\x9e\xe1\xc8\x89\x81\x03\xda\x0f\xc0\xf8\xc2\x43\x15\x6e\x0f\xcb\xd2\x15\x1b\x3f\xae\xe3\xab\xbd\x3c\x7c\xb7\xc7\x90\x6f\xa8\x05\x2a\x01\x05\x51\xbe\xf0\xb2\x87\x3b\x00\x5a\x23\x59\xd9\x6e\xb3\xcb\x05\x31\xa4\x96\xf7\x85\xef\x67\x3c\x0f\xad\xec\x87\xa6\xd9\x87\x00\xbb\xa8\xc6\x41\xe3\x04\x49\x07\x31\xb9\x64\x90\x00\xc1\xfa\x93\xf1\x72\x29\x16\xbf\x9f\xdd\x3c\xdf\xce\xf9\x2d\x42\xe4\x11\x6b\xea\x47\x4b\x4c\xae\xe1\xfd\x74\x51\x4a\x65\x54\x01\x48\x31\x16\x0a\x6a\xb9\xd9\xa1\x66\xe7\x6a\x1d\x9a\xf6\xcf\x51\x14\x16\x14\x5a\xd0\x14\x50\x5e\xa0\x8f\xa7\xe4\xde\x27\xc8\x93\x92\x6f\x6c\x57\x34\x74\x14\xd1\xc9\x69\x3c\x82\x30\xaf\xae\xad\x0b\xd4\x45\x70\xf4\x2b\x72\x3b\x8f\xf3\x80\x03\xdd\xd8\x1b\x97\xde\xb5\x7b\xd7\x2d\x6e\x35\xc8\x67\xf9\x51\x6d\x33\xfa\x9c\x27\x76\x29\x62\x31\x8f\xef\x73\xd3\x85\x80\xb7\xd2\x4d\x48\xdb\x54\x77\x06\xfa\x1a\xc3\xd8\x90\xde\x1e\x9d\xee\x89\x16\xe7\xd3\xd4\xfa\x99\x93\x9c\x9e\x0c\x13\x4a\xdf\x3b\x86\x38\xc6\xb6\xdf\x1b\xa9\xfc\x92\x86\xea\xe8\xc8\x2f\x0e\x5f\xa7\x56\xe9\x08\x81\x13\x69\xcf\x4e\x2b\x3b\xad\x63\x2d\x83\x98\xae\x8f\x4b\xa4\x07\x91\x11\xaa\x42\xb8\x48\x66\x4d\x04\x32\xf0\xf8\xeb\x73\x5c\xdb\xb4\x01\xf4\xed\x56\xa2\xfc\x41\x06\x92\x11\xf0\x17\xc1\x0b\x77\xcc\xdb\xcc\x72\x07\xe3\xd5\xaa\xf1\xd2\x96\xdb\x8b\x1c\xee\x0d\x31\x05\x3d\x50\x92\x75\x5c\x0f\x6a\x38\xf0\xe1\x40\x66\x9a\x20\xaf\x80\xf3\xad\x44\x20\xa4\x7a\xec\x6b\xa8\x87\xe3\x83\x5e\xcd\xbe\x5e\x0d\x9a\x97\x0b\xe3\xf7\xe7\x65\x2f\x1f\xc2\x0b\x75\xc4\x60\x0f\x35\xec\x23\xe6\xbb\x12\x70\xd5\x03\x14\x8b\x77\xc2\xfe\xfa\xf4\x11\x80\x70\xe7\xa4\x17\x21\xa3\xbe\xf8\xf2\x4b\x73\x00\xed\xc3\x81\x0f\x9c\x00\x04\x0f\x4d\x20\x37\x9f\xcf\x4d\xb8\x01\xe9\xf3\x18\x00\x07\xad\xd4\xcb\x75\x32\x2e\xd7\x0e\xa8\x69\xc6\x32\xf6\x4c\x41\xfa\x8b\x21\xde\x20\x6b\xe2\x60\xc4\xc8\x80\x72\xc9\x7c\x94\xc5\x1d\x0a\xb7\xa9\x9c\xaa\x2b\xad\xf3\x7b\xb2\x9b\x80\x85\x06\x25\x85\xa3\x3e\x1b\x2a\xfe\xc3\xf9\x26\x07\x78\x25\xc8\xfb\x79\x41\x13\x00\x25\x04\xad\x97\x40\xf4\xed\xf1\x62\x6c\xf1\xf0\x3a\x0e\xd6\x1c\xc0\x6b\xaa\xed\x60\x2f\xb4\xf6\x3a\x69\x98\x87\x99\x9a\xe9\x99\x7e\x89\x8b\x14\xaf\x68\xef\x88\x83\xaa\xcf\x4a\x8f\xc0\x03\xae\xc2\x92\x2a\xc0\xdc\x2a\xa8\xa3\x16\x70\x70\x89\xde\xe2\xd7\x89\x00\x20\xdf\x28\xa0\xe0\x38\x90\x0e\x08\x56\xef\x08\x01\x0d\x3b\x54\xcc\x8b\x8f\xe3\x1c\x4b\x3d\x71\xc2\x34\x3f\xb9\x1f\xa7\x1e\x9a\x0b\xb3\x41\x0c\x50\xda\x57\xc9\xe0\xfd\x36\x91\x5a\x60\xca\xfe\x7a\x37\xb4\x24\x5a\x0d\x38\xec\x52\x68\xb8\x13\x0c\x46\xb2\xc8\x65\xd7\x45\x1e\xca\xa6\x5a\x45\x79\xb5\xa9\x33\xd9\x58\x5f\xb7\xba\x1d\x35\xe1\xd9\x6a\xc2\x4b\xef\xaf\x8e\xb5\xde\x21\x0b\x4d\x97\x85\x82\xd0\x29\xf4\x2a\xf0\x01\xa6\x40\x4f\x85\xb5\xdc\x99\x0e\x16\xdf\x30\x58\x5c\xc1\xf2\x13\x74\xf8\xf4\x8b\xf8\xe4\xe5\x96\x18\x26\xb7\x27\xd7\xab\x0b\x94\xd5\x55\xe2\xaf\xee\xd6\x08\x66\x71\x64\x68\x9c\xc5\x93\x2c\xa2\x8a\x31\x3c\xae\x8f\xcc\xd2\xe2\xcc\x2f\xf7\x34\xba\x20\x1d\xe0\xe0\x9d\x76\x05\xba\x83\xeb\xa7\x75\x9e\x00\x98\x1a\x01\x03\x67\x34\xc5\xb6\x88\x79\xe1\xee\xee\x51\xd9\x14\xd9\xca\xe9\x4f\x2c\x7d\x72\xe7\xd9\xd4\x48\xaf\x87\x62\x20\x7b\x42\xb7\x1a\xa9\xc8\x5d\xcf\xb7\x31\x2b\xe5\x34\xc2\xd3\x7b\x4b\x9b\xcc\x13\x31\x48\x86\x02\xe2\x90\xc4\x46\x61\x5f\x1f\xd7\x67\x7d\x45\x5c\xd2\xf3\x5e\x8f\x7d\x41\x28\xf4\x7c\x56\x02\x3d\x14\x62\xc5\x68\x36\x19\x94\x1d\x12\x39\xd8\x44\x6f\xc1\xe8\xa9\x06\x7b\x8f\x9f\xca\x90\x17\x29\xee\x53\x7b\x1e\x4a\xc6\x9f\xe1\x5d\xa7\xf7\x1b\xc2\x17\x39\x11\xe5\xa4\x5e\xd3\xea\x63\xf4\x74\x69\xc3\x4e\x65\xdb\x6a\x63\xf1\x7a\xf6\x84\x81\x5d\x40\xd0\x29\x72\x27\xfa\x8c\x8d\x0e\xba\xd5\x1f\xe7\xd9\xe1\xd8\x14\xab\x7d\x3d\x42\x5e\x8f\x98\x63\x0f\x72\xeb\x8c\x4d\x40\x29\x02\x65\x15\x99\xc1\x70\x92\xdc\xd9\xf7\x07\xd0\x8d\x60\x6e\xc6\x70\x80\x73\x38\x06\x9a\xdc\x7e\x0f\x3a\x52\x73\x7d\xbf\xc7\x86\xfe\x09\xdd\x1a\xba\x73\xfb\xdc\xdf\x49\x0a\xbd\x2d\xf7\x27\x6e\x20\xd9\x4a\x62\x38\x85\x31\xf7\x36\x94\x5d\xd4\xf1\x5d\x83\x8e\xf7\x93\xc8\x8d\x68\x70\x00\x52\x8f\x62\xe3\xd1\x79\xb6\xd6\x73\xa0\x38\x05\x96\x11\x7c\x2f\x9e\x6d\x0d\x0a\x6c\x4b\xcf\x4f\xad\xa5\x15\x24\x42\x2b\x16\xc6\x9d\xd6\xd3\x16\x11\xc6\xa9\x46\xfd\x56\xe7\xf2\x54\x47\x0d\x96\x1a\x87\x9e\x50\x4b\x49\x45\xcd\x09\x2f\xdf\x9e\x35\xa0\xd9\xeb\xec\xa3\x30\xae\x60\xa2\xdd\x72\x8d\xe8\xda\x38\x1d\xb5\x79\x3d\x36\x62\xaa\x00\x24\xe7\xc6\xa4\x95\x0b\x94\x73\xdd\x9d\xfb\x93\xda\xdb\xaf\x60\x1a\xe9\x64\xd9\x0f\xd0\x2d\x3c\xda\x62\x9d\x64\xa7\xa5\x06\x25\xa7\x77\x69\xb5\xcc\xe3\xe5\xb3\xb6\xe6\x9e\xec\xd3\x77\x5c\x76\xc8\xe7\x75\x61\x28\x45\x38\x59\xbd\x1b\x00\xbc\xd8\x30\xbd\x54\x72\x05\x8b\xeb\x8b\x6a\x56\x8c\xcd\x98\x67\x05\x62\x00\x00\x60\x6b\xa2\x18\x69\xf4\xa0\xcd\x79\x70\x07\x66\xb1\xf6\x7c\xa1\x7c\x55\xa3\xb9\xdb\x70\x88\x2d\xfc\xb8\xf5\xc3\x70\xa4\xfd\x9b\xee\xf7\x00\xf3\xa2\xe1\xce\x4e\xaf\xe7\x70\xcd\x09\xc9\x7d\xe1\x3b\xbf\x96\x8b\xcd\x90\x70\x16\xa2\x23\x1d\x2c\x33\x1d\x50\x88\x0d\x07\xcd\x0d\x80\xfc\xf5\x5b\xf6\xba\xde\x3c\x69\x8e\xd0\x74\x84\x12\x13\x86\xcd\x36\x3e\x81\xda\x66\x20\xca\x56\x80\xfc\x0d\x46\x5f\x67\x20\x7d\x83\x7c\xb7\x7a\x62\x27\x47\x5a\xa1\xd3\xfd\x5c\x4f\x5d\x78\x47\xe2\xcb\x7c\xa5\x50\xaf\xc1\xe1\x2c\x8b\x3d\x9d\xbc\x5b\x15\x27\x7f\xd4\x32\x8e\x43\x12\xdf\x6b\x9a\x6a\x5a\xd7\xb1\x84\x9f\xc2\x80\x40\x8f\xde\xa5\xc8\xdb\x88\x83\xea\x62\x32\x01\xbc\x03\x9e\x63\xf8\x7e\xb3\x2f\xcf\xbd\x3c\xea\xeb\x55\xc1\xf3\x47\x10\x86\x73\x7f\x64\x9d\xf8\x2a\x9d\xfd\x4b\x99\x33\xd1\x84\xe6\xa0\x6c\x75\x0c\x59\x6f\x09\x21\xa7\x93\xb3\xef\xdb\xf5\x40\x62\xc6\x62\x4a\x87\x43\xfc\xad\x36\xdb\x1e\xf8\x5e\xd5\x69\x96\xa2\xd4\x65\x35\xb0\x93\xe7\x4a\x69\x32\x99\xc6\x11\x33\xca\x5b\x57\x8e\x1a\x2e\xd0\x78\x9c\x9a\xcd\x5e\x6c\xac\x84\x35\x08\xf2\xc0\xb9\xaa\x43\x12\xc3\x39\x8a\x67\x10\xf0\xe1\x53\x21\x13\xe3\x3a\x8c\x11\x47\x98\xe2\x6c\x79\x10\x3e\x45\x57\xdd\xa3\x64\xfe\x66\xdd\x11\x82\x60\x5e\x8f\x35\x77\xcf\x2e\xaa\x4f\xad\x21\xcb\x28\x80\x59\x98\x1c\x52\xf8\xb0\x07\xe7\xfd\x5a\x58\x38\xad\x56\x57\x2c\x38\xf2\x77\x03\xad\x5e\xd8\xbe\x44\x93\x85\xf2\x34\x59\x6e\x93\x70\x38\x87\x83\x17\xb8\x41\xea\xa2\x14\x1b\x1e\x0b\xa0\x7b\xee\xe1\x72\x45\x8d\x0b\x13\x40\x70\x3a\x46\xd2\x7a\x8a\xc7\x1d\x60\x57\x06\xc7\x5b\xd3\xf6\xe6\xbd\xbe\xd4\x07\xdd\xfa\xa8\xe1\x8a\x90\x0f\x52\x34\x0c\x38\xcd\xd6\x0c\xd0\x05\xb6\x34\x94\x44\xfe\xc4\xe5\xdd\x71\x6e\x60\xab\x3c\x5b\xa7\x2f\x3b\xc2\x2e\x21\xb4\xcc\x96\x91\xc7\x12\xef\x15\x12\x07\x7a\x6d\x11\x0d\xa3\x15\x68\x6d\x4a\xdd\x3a\x24\x20\xa5\xe9\x45\xbe\x17\x08\x95\x19\xaf\x97\xef\x8b\x9b\x0f\xaa\x10\xd5\xc7\x59\x46\x3a\x96\xc5\x0b\xdb\x67\xfc\x08\x5a\xf8\x7a\xa7\x85\xf5\x60\x28\xc5\xf9\xe7\xe5\x24\x86\x97\xc7\xac\x45\x6c\xbd\x99\x97\xb6\x2f\xeb\x3a\x34\x6e\xb0\xcc\x40\xd4\xfa\x7a\x3c\x2f\xe3\x21\x6d\xf9\x67\x31\x56\x8f\xe7\x43\x30\x2d\x4b\xd3\x14\xcf\xbc\x0b\x4f\xe7\xec\xc5\x11\x01\x3f\x93\x6a\x17\x4d\xf1\x5c\xf7\x0d\x6d\xeb\x28\xea\x74\x90\x21\xdd\xb6\xda\x5b\xf5\x8d\x37\xe7\xb2\x06\xfb\x10\x93\x36\x0d\x86\x76\xd1\xd9\x9b\xc6\x17\xdd\x32\xc0\x58\x9e\x0f\xc1\x72\x73\x7a\x5c\x41\x14\x2a\xf4\x8c\x59\x52\x7d\xc6\xe2\x66\x38\xf3\x5e\xea\x36\x5d\x35\x62\xd1\xfd\x70\xbb\x0f\x99\xa8\x36\x29\x8a\xb8\x99\x9f\x66\xd9\x28\x59\xa2\xd1\xbf\x62\x7e\x0f\xa6\x39\x68\x09\x3b\x1f\xbf\x61\x90\x28\x60\x99\x85\xe1\x4d\x6a\xc9\xe7\x74\xea\x3b\xbd\xe4\xfd\x2c\xce\xaa\xe9\x70\x06\x92\x9c\x3c\x18\xe9\x00\x67\xc9\x8d\x89\x2d\x59\xdc\x5b\xe6\x5a\x20\xf6\x96\x1f\x73\x98\xc6\x3c\x8c\x99\xb4\x6d\xae\xa4\x88\x40\x5f\xef\xb2\x20\xe3\xbc\xbc\x78\x7c\x59\x45\x37\x74\x58\x40\x9d\x5d\x5b\xe5\x6c\x02\xa9\x7c\xfa\x8c\xd1\x8d\xac\xf7\x24\x84\x18\xa8\xeb\x6c\xf5\x45\xaa\x4a\x2c\x32\x36\x34\x19\xbb\x7b\xc0\x04\x26\xb4\x0c\x14\x48\x08\x12\x0d\x80\x86\x71\xf3\xbc\x34\xf7\x65\x68\x6a\x34\x72\x2e\x37\x67\xc8\x38\xf9\x12\x28\xe6\xd2\x58\xed\x2b\x9f\x8b\x78\xa8\x26\x69\x98\x6e\x04\x0b\x29\xe5\xb8\x3f\x9e\x95\x70\x11\x0e\xdf\xa0\x5d\xe9\x74\x08\x86\xd9\x14\x86\x42\x5c\x27\xcf\x5a\xd3\xbd\xce\x28\xe5\x65\xc1\xbb\xd0\x7e\x9c\xc4\x11\x52\x7d\x87\x4a\x36\x32\xc4\xb3\xa9\x8e\x4c\xc4\xae\x1e\x7d\xe5\x0d\xac\x98\xa4\x8b\x47\x4f\xc7\xc1\x8d\x1c\x31\x82\x7b\xda\xec\x28\x26\x74\x7d\xb5\xbc\xd5\xab\xf0\xe8\xcc\xfb\x40\x09\x24\x4c\x6b\x2b\x35\xe7\x86\x40\x51\xc1\xf1\x9b\x16\x3e\x9c\x1c\x84\x85\xe3\x05\x86\x48\xf8\x2e\xb5\x23\xa1\x5e\xd0\xd0\x93\xe5\x68\x88\xb2\x36\x11\xbb\xfa\xbc\x12\xaf\x1a\xb2\xd0\xc9\x2e\xd9\xfb\xec\x1e\x8a\x47\x90\xa6\x0c\x8b\xc1\xfa\xce\xd4\xa5\x64\x1d\x9f\x18\x46\x8c\xcb\xc2\xea\x1e\x5a\x02\xaa\xe3\x3c\x48\xec\xc6\xb2\x4c\x61\x30\x66\xab\xdb\xb6\xf3\x71\x2e\xc0\x8b\x92\x0c\xd3\x44\x72\x5c\x86\xf3\xf5\xa8\x21\x5e\x8e\x78\x7b\xb0\x78\x03\x39\x6a\xd9\xa9\x1c\x69\x0a\x5a\x00\x16\x64\xac\xd4\x4f\x89\xa2\xd5\xa1\xd7\x74\x3b\xfa\xc4\x69\x2c\xee\x2f\xca\x0e\xb8\x0e\x26\xef\x05\xc1\x1a\xe8\x9d\xe8\x2e\x48\xdf\xe8\xd5\x2b\x76\x6a\xbe\x3f\x08\x9f\xb9\x06\xa4\x6c\x81\x40\xe3\x02\x03\x31\x79\xd4\xca\x1b\x65\xe2\x0b\xcd\x65\xe7\xa6\xa3\xe2\x4d\x57\xe6\x15\x83\x5e\xb6\xfa\xab\xda\x1d\x30\xd4\xf6\x60\x95\x78\xbc\x68\xa0\x2a\xbd\xde\x59\x12\x1e\x57\xc4\xb8\x87\x2c\x33\x75\x83\xd3\xc7\xed\x19\x99\xa6\x17\x2f\x27\xf2\xab\x5e\xf3\xe9\x81\x5b\xbe\xcd\x23\xbe\x1e\x24\x50\x19\xbc\xd0\x16\x02\x30\xf1\xa0\xac\x5a\xdc\xa8\xe2\x0e\x21\xd6\xe5\x56\x17\x4d\x75\x7e\x00\xfe\x1c\xd1\x3b\xe9\x3e\xf0\xe9\xe8\xb6\x45\x4e\x82\x5a\xae\x17\xd8\xee\x0d\x54\xab\x6d\x10\xa0\x97\x4d\x83\x57\x20\x13\x54\xad\x38\x02\x3e\x5f\x6a\x10\xa3\xd7\x70\xd9\x02\xda\xe1\x12\x36\x7b\xfa\x16\xef\x9c\x36\x02\x1e\x6f\xc1\x70\x35\x3c\xcf\xe4\x45\x42\x0b\x3b\x23\x59\x96\xa5\xee\x28\x34\x07\xd2\x0a\xea\x4a\xa3\x5e\x1b\x83\xe9\x85\x43\x07\xb0\x2a\x8a\x7c\xff\xf5\x60\x0d\x08\x95\x42\xba\x0d\x49\x04\xa7\x59\x1f\xb4\xa1\x54\x1c\x6e\x83\xba\x9f\xee\x04\xab\xc5\x29\xb1\xf1\x1b\x2f\xe2\xc6\x03\x61\xa0\xcb\xf9\x9d\xf7\x72\x5c\x47\xc1\x2d\x48\x58\x10\xd4\x67\xad\x78\x50\x81\x2e\xb1\xec\xc6\xde\xc3\x64\x2d\xcb\xd3\xeb\x39\x41\xa1\x64\xb4\x50\x9c\x81\x9e\x85\x2b\x31\x38\x3a\x07\xe5\xc9\xc0\xae\x54\xdc\x6c\x61\x3c\xdc\x1c\xee\x26\x55\xe1\x95\x85\x81\xa8\x07\xb4\x56\x43\xe9\xd7\x69\xec\x01\x83\x90\x79\x3b\xb1\x8d\x5f\x88\x31\xc4\xe5\xca\xfb\xaa\x84\x07\x82\x02\x62\x8d\x76\xe1\x6b\xae\x3d\xed\xdc\x84\x5d\xa1\x23\x39\x56\x67\xd7\x48\xdd\x25\xca\xc1\xb2\x51\x73\xa4\x25\x76\x38\xbe\x9e\x6f\xc9\x32\x3e\x22\xda\x6e\x3a\x6e\x5e\x48\x03\x1b\x83\xca\x27\x62\x04\xe0\x1f\xe7\xcb\xbd\xc6\xac\x83\x23\x9f\xb1\x04\xb0\x37\xe1\x08\xc1\xd4\xfb\x7a\x44\xe9\xae\x50\x26\xdd\x54\xf4\xf0\x2c\xdd\x41\x87\x0b\xa8\x9b\x96\xb9\x3b\x00\x3a\x62\x14\x76\x2c\x8b\xe2\x8e\xdc\xe4\x82\x34\x35\x7c\x97\x02\x51\x65\xa9\x45\x92\x1f\xab\xe2\x84\x37\x8f\x33\xf8\x01\xb0\xf2\x2c\xbd\xa2\x52\xda\x35\x79\xf5\x28\x2f\x2c\x6c\x76\x2f\x2e\xbf\xbf\xcd\x63\x7d\x70\xce\x03\x17\xbc\x9e\x21\x83\x15\xa4\x89\xd3\x27\x65\x95\x6e\x69\x62\x18\x06\xba\xc2\xb2\x03\x62\x7b\xda\xe2\xe6\x10\xc3\xd0\xb5\x38\x14\x8a\xe4\xed\x12\x0a\xa8\x41\xe3\xdc\x77\x26\x8c\xf6\xc8\x11\xea\x23\xd0\x6e\xdd\xe4\x81\x2a\x3f\xd7\x97\x95\xe8\xdc\x9b\xae\x86\x78\x32\x93\xe5\xb9\x10\x4f\x38\x46\x21\xef\xeb\x11\xf2\x52\xb3\x16\x79\x5e\x3a\xca\xf5\x98\xbb\x00\xb0\x88\xc2\xfa\xe1\x68\x53\xab\x9a\x9e\x9b\x85\x6e\xd5\x95\x58\x8f\x32\x28\x12\xdd\x76\xdb\xfd\xa3\x65\xc1\x9d\xfa\x60\xaa\x83\xf6\xbc\x34\xd7\xbe\x9a\x17\x08\xf7\x82\xeb\xec\x6b\x12\xad\xd6\x91\x81\xee\xe7\x24\xac\xf9\xc3\x41\x83\x3f\x73\x48\x78\x3d\xe1\x11\x69\x72\xbf\x58\x87\x2d\x9a\x36\x62\x01\xb9\x26\xf4\xb7\xfb\x55\xbb\xd4\xdd\x9d\xde\x10\xc5\x2a\x08\x67\xe5\x92\x20\x38\x75\x5d\x21\x5b\xb0\xa4\x24\xb2\x8d\x0c\x76\xae\xbc\x34\xcb\x54\x4d\xcb\xeb\xa5\x1a\x97\xde\x2e\xb2\x07\x31\x94\xcf\x11\xaf\x39\xd4\xec\x33\x7f\xe2\x45\xa2\x17\x8d\x82\xd8\x97\x96\xac\x2e\xe8\x1d\x4f\xda\x57\x7d\x9d\x03\xa7\x15\x2e\x58\x50\x93\xed\xc9\xb2\x34\xd1\x0d\xeb\xbb\x34\x39\x4a\x78\x0f\x60\x66\x15\xcc\x97\x12\x44\x94\x56\x68\x5d\x45\x89\xb7\xd7\x33\x22\x81\xe3\x2e\xd7\x33\xef\x6a\x00\x36\x58\xf2\x0c\x30\x9c\xc3\x1c\x05\xd4\xfd\x04\xa7\x27\x20\x34\x80\xa4\x7f\xdc\x3e\x34\xa9\x79\x06\x15\xe0\xdc\xad\x57\xd6\xf3\x22\x89\xc1\x6e\x48\x64\xec\x9c\x9f\x5f\xf2\x45\x87\x33\x28\x85\x58\xb7\x47\x3d\x84\x98\xdb\x40\x54\x82\xd7\xba\x9e\x76\xf3\x64\xc0\xba\x88\x70\xf0\xa9\x17\xae\x0b\x00\xf7\x2a\x01\xbf\xef\x46\x4d\x5d\x30\x74\x72\xb8\x54\x60\xa4\xf9\x24\xbd\xd7\x0b\x8e\x14\xed\xd5\x8c\x1a\xf8\x79\x00\x99\x80\x96\xcf\x9b\x45\x4c\xde\x7e\xdb\x25\x42\x1a\xf0\x61\x2b\x31\x8c\x62\x0b\x87\x8c\xd5\x1b\x7a\x5c\x32\x1c\x82\x48\xcd\x79\x60\x95\x94\x1b\x6a\x3f\x81\x60\x4b\x30\x56\x2b\x47\x65\x87\x4e\x61\x64\xee\x48\x2a\xb2\x26\xaf\x7c\xd6\x23\xc1\x46\x63\x2a\x99\x81\x7f\x82\xc2\x1e\x01\x21\x65\xe1\x80\x9c\x3c\xf4\xda\x27\x05\x23\x4f\xbd\xab\x57\xfd\x1a\xcd\xc4\x0d\xf2\x15\x8c\x06\x41\x7f\x37\xf6\x14\x68\x16\x1b\x59\x5c\x1a\x66\x14\x2b\xba\x61\xda\xd5\x12\x27\x28\x91\x1d\x04\x31\x0f\xf7\x9d\xf3\x04\xf1\x7b\x1c\x43\xaf\xe7\x1a\xc7\xb5\x8f\x24\xe1\x99\x1b\xf7\x08\x7b\xa6\x38\x0e\xf4\x28\x43\x88\x87\x1b\x28\x7c\xcf\xa5\xdf\x90\x42\x24\x63\xec\x16\xa1\x28\x9a\x5e\x2b\xd6\x7c\x9d\x87\x3a\x07\xd8\x7a\xda\x4f\xb8\x67\xd3\x83\x86\x36\x22\x82\x7b\xc6\xfd\x86\x59\x27\xfe\xa6\xa8\xdf\xce\x38\x6d\x21\xbc\xa8\x42\x43\x17\x62\xca\x5a\xcb\x76\x2e\xe8\x40\x3e\x5f\xaf\xab\xc4\x48\x7c\xe7\xaa\xd3\x92\x2e\xe6\xeb\x99\x92\xb7\x48\xab\x36\x0e\xfa\x30\xc0\xb3\xb9\xb4\xb6\x21\x01\xc5\x0c\x41\x2c\x89\x11\x92\xf0\xe2\x84\xce\x04\xca\xc2\xa1\x3c\x1c\xbe\x9f\xcd\x9e\xee\x15\x44\xcc\x8e\x42\x69\xa5\xc0\x7b\x1b\xcb\x30\xf4\x61\x3d\xd8\xb5\xd2\x15\xed\x94\xb4\x32\x3d\x2c\x7e\xa8\x6c\x0f\xe9\x0c\x79\x8f\x4e\x65\x56\x08\xc3\x91\x5b\x9c\x5f\xd1\xf3\x6d\x3e\xca\xac\x68\xb7\x5e\x6c\x4a\xc2\x05\x99\x06\x6d\x35\xf9\xf6\x70\xf8\xf4\x79\x0e\xf4\x59\x0a\x65\xf6\xcd\x06\xdc\x52\x7f\xbd\x7f\x2a\xaf\x5c\x79\x2b\xa1\xd7\xb3\x4d\x63\xc5\xf7\x1d\xed\x0d\x3b\xd3\x60\xb2\x06\x5b\x72\x12\x59\x16\x96\xaf\x57\x95\xa7\xa2\x0e\x0d\xa1\xcc\xd0\x50\xed\x99\x4b\x18\x8d\x93\xb7\x47\x79\xab\xb8\x58\xf8\x26\xe7\x44\x85\x88\x45\x3e\x59\xcf\x8c\x7e\x4c\x20\x7f\xa6\x8f\x62\x3a\x07\x85\x27\xb8\x35\x39\x01\xb5\x8d\xe0\x48\x9b\xe1\x33\xbe\x44\x6e\x63\xc4\xb2\x8c\x28\x97\x12\x50\xf2\x99\x9a\x12\xc6\x8b\xf6\x6b\xeb\x9e\x44\x65\x7b\x3b\x10\x6d\x7f\x33\x2e\x81\xc7\x77\xe5\x72\x00\xb5\x27\x74\x8f\x77\xa2\xdd\xf0\xc6\xc2\x8d\xc1\x0b\x65\xe2\x28\x62\x00\x6b\xab\xcc\x6a\x76\xea\x64\x55\x14\x1a\xcd\x54\xd8\x8e\x2a\x07\xf1\xe2\x51\x7c\xfa\x22\xd0\x06\x49\x6b\xf0\x7d\x25\x34\xf7\x06\x39\x1e\x1b\x04\xe0\x87\xc2\xdd\x9f\xdf\xce\x47\x38\x9d\xa5\x41\xae\x40\x77\x26\xbd\xa3\x66\x11\xd1\xf4\xee\x84\xa2\xbd\x09\x88\xbc\x0c\xf7\x69\x26\xa1\xe3\x00\x14\x4a\xf1\x7a\xae\x49\x81\x8a\xdb\xdc\x89\xc3\x12\x5c\xae\x15\x3f\xe2\xda\x02\x14\xa6\x13\x46\x74\x26\x9c\x5b\xe6\x29\xe4\xb9\xf8\xa1\xa7\x45\x6e\xa1\x3b\x3a\x7d\x9d\x54\x90\xd7\x30\x4b\x3d\x8d\x04\x83\xf0\xf1\x2a\x68\xaf\x57\x1e\x8c\x95\x42\x57\xa4\xc0\x5b\xe7\x19\x1b\x08\x0b\xf2\xc4\x8d\xa5\x71\x25\xf5\x4b\x3f\xde\x95\x45\x07\x00\x8a\x5c\xa1\xd8\x3a\x7a\x3b\x16\xe4\x12\x2f\xb6\x93\xfe\x5e\x3f\x39\xc8\xf0\xf8\x1c\x62\x5a\xc3\x3f\x5f\xae\xb3\x6e\x18\x4f\x7f\x1a\x93\xb3\xd9\xd1\x6f\x67\x82\x38\x98\x75\x99\xf0\xe4\x19\xcb\x7c\x79\x1b\xd5\x72\x4c\xca\xba\xeb\x9e\x73\x87\x5b\x47\xcd\xaf\x59\xb3\x47\x30\x5f\x83\xac\x52\x14\x6e\x6f\x67\x56\xc7\x55\xc8\x0e\x2a\x05\x68\x45\x98\x36\x1d\x96\x0c\x91\x1a\x70\x83\xd6\x14\xb6\x27\x49\x97\xd9\x97\xe5\x92\xd4\x6a\x1b\xf6\xa3\x68\x39\x56\xce\xeb\x31\xe8\x55\xa2\xc2\x15\x32\xba\x08\x83\x97\xd7\xfb\xa2\x34\xc4\x44\x32\x9f\xc7\xc7\x75\x46\x3d\xed\xe9\x00\x6d\xee\x50\xc1\xba\x9a\x13\x32\x57\x08\x90\x6a\x80\x6b\xbe\xde\xdd\x3d\x85\xe1\xad\xe6\x8b\xb7\x73\x32\xf5\xf2\x92\x1d\x08\x0a\x28\x2b\x0b\xd8\x17\xfc\xb2\x1e\x92\xfb\xf2\xda\xd7\x18\xfe\x92\x65\x38\x4c\xf6\x10\x30\xea\xea\xce\xf6\x35\x35\x97\x61\x22\x11\x06\x63\xf6\xcb\x31\xff\xc4\x40\x6b\x6b\x47\x6a\x19\x88\xd1\xd5\xcb\x7c\x9b\xdc\x7e\xc6\xa2\x08\xd5\xfb\x27\x96\x36\xf8\xb3\xba\x44\x83\x9d\x99\x12\x10\x15\x18\x19\x43\x49\xf8\xda\xc2\x14\xef\xea\xcc\xeb\x8c\x5b\xad\x96\xd9\x43\xe2\x2f\x5e\xa5\xa6\x57\x57\x7a\xdd\x0c\x8e\xe7\x07\x02\xc4\x5e\x57\x8c\xf8\x34\x04\xa9\xcc\x3f\x12\x31\x96\x96\x89\xd2\x85\x1c\xe0\x91\x94\x67\x8e\x94\xf9\x08\x6b\x5c\x12\xd3\x5f\x00\x07\x6a\x5e\xaf\xf5\x9a\xf7\x9c\xf2\xb7\xdd\x1f\x2a\xa4\xd3\x9c\x8e\x80\x33\x94\x24\xc1\x98\xc1\xd9\xaf\xd6\xd8\x97\x6d\x9c\xaf\x5e\x2f\x8a\xbc\xde\x45\xdf\x2f\x80\x2e\x81\x4d\x6e\x5f\xef\x30\xa3\x14\x19\xec\x51\x75\x14\x8e\x79\xff\x3a\xcb\x97\x3e\xb4\x6b\xb6\x68\x34\x0e\xc3\x56\x07\x10\xee\x7c\x0b\xd2\x97\x66\x8d\x8f\xcf\xb4\xda\xce\x5d\x7a\x2c\xdb\x65\xa1\x63\x0f\x83\x98\xab\x6b\x38\x04\x6c\x3a\xb8\xee\x86\x91\x5b\x91\x69\xea\xf5\x1b\xd0\xea\x28\x14\x3d\xc8\x3c\xe0\x57\xb6\xa5\xcd\x86\xa6\xe7\x1d\x3a\x60\x4b\x12\xa6\xfa\x7d\xbe\xa0\x30\x63\x37\x22\x13\x8c\xe2\x83\x3c\x9e\x9b\x33\x93\x15\x36\x91\xe1\x74\x32\xd2\xa6\x28\xb6\x0c\x9b\x5a\xa5\x52\xdc\xc6\xc6\xe9\x5e\xe7\x6e\xaf\x98\xb7\xee\x00\xea\x61\x78\xa5\x3c\xe0\xc3\x92\xe9\x4f\x8d\x53\x6d\x85\x87\x47\x46\x73\xaa\x57\x44\x90\xbe\x3d\x4b\x38\xf1\x19\x88\x21\x3a\x83\xbd\x0c\xa6\x7c\x05\x39\x06\x3b\xce\x03\x6e\xb3\xd7\x89\x53\x24\x0f\x3d\x72\xc3\x21\x5b\x70\xba\x59\x86\x21\x4a\x41\x6e\x0c\x0c\x93\xf5\x64\xea\x3f\x22\xa3\xde\x6f\xcb\xd1\xd5\x01\x53\x0e\x6d\x31\xe9\xd7\x75\x5a\xdc\x29\xbb\x16\xd3\x05\xc7\x36\x34\x32\x7a\x34\x1e\x2f\x3a\x31\xf4\x73\x37\x02\xd1\x3f\x54\x28\x9d\xcc\x50\xda\xa8\x3b\x02\xdd\xe6\x01\xa4\x8c\x54\xae\x40\xf0\x99\xcd\xb1\xc6\x28\x4a\x73\x34\xbb\x81\xd4\x61\x72\x3b\x98\x5d\x8c\xec\x75\xae\x0c\xdd\x62\x53\x7c\x82\x85\x4c\x29\x74\x78\x6c\x70\x4e\xa8\x76\x8b\x37\xdb\x76\xc9\x3e\xde\x2f\x16\x39\x99\xa5\xc3\xd9\x9b\x88\xe0\x70\x39\xb7\x29\x04\xd3\x2c\x75\xb8\x89\x9b\x84\x79\xdc\x53\x52\xe3\x2b\x8e\x37\x7e\x63\x03\xad\x5b\x80\x14\x33\xef\x0b\x0d\x67\x13\x85\x2e\xc7\x15\x9b\x86\x10\x65\x29\x26\xf6\x29\xe8\xde\x8b\xca\x45\x69\x54\x10\xf8\xd7\xdc\x2d\x5b\x5c\xdb\x46\x06\xf6\xd0\xcb\xe3\x22\x6d\x6d\xa9\x6c\x16\x7b\x9f\xa6\x59\x60\x45\x75\x1e\xf4\xd7\xd9\xab\xe6\x86\x33\x86\x47\xc8\xa4\xdd\xfb\xbe\x0b\x5d\x74\x9d\xe5\x27\x71\x9b\xe8\x25\xa1\x01\xbf\x26\xef\x34\xf8\x41\xda\x71\x61\x97\x08\x53\xcb\xeb\xeb\xc5\xba\x07\x6f\x96\x89\x1d\xc2\xfe\xb4\xf5\x6b\x91\xec\x77\x06\xe8\x90\x63\x7e\xcd\x0e\xcf\xe1\xed\xb1\xc7\xfb\x9e\x70\xcb\x8b\x03\x25\x10\x1d\xb6\xcc\xdd\x96\x40\x50\xf6\x68\xe2\xf2\x4d\x42\x83\xcc\x73\x22\xba\x41\xd1\x65\x67\xf2\x06\x60\xe8\x54\x8d\x46\x07\xc1\x59\xcd\x2e\x34\x21\xb3\x10\x0e\x36\xeb\xf5\xde\xd9\xeb\x10\x33\xd7\xe7\xf1\x18\x4e\x6e\x3d\x6b\x27\x07\x68\x8b\x36\x12\x58\xb2\x03\x14\x69\x20\xda\x14\x3f\xdb\x3e\x72\x9c\x04\x82\x59\x34\xad\x24\x96\x28\x8a\x48\x28\x6e\xf4\xdd\xc6\x4d\x50\x51\xf0\x94\xc6\x2f\x88\xaf\x0f\x3b\x84\xd5\x13\x1a\x40\xcb\x29\x68\x8c\x63\xf0\x88\xb8\xe9\x92\xb3\x56\x8a\x0a\x17\x66\x79\x90\xaa\xc3\xd8\x40\xa4\x8b\x21\xd8\x6b\x77\xbb\x23\x99\x78\x2c\x10\xfe\xf3\x79\x12\xa3\x4c\x2c\xf4\x84\x11\x36\xf3\x75\x0b\x23\x89\xd9\xa4\x0a\xda\x86\x5b\x36\xeb\xec\x50\x56\x67\x40\x16\x92\x84\xdd\xd3\xd7\xa1\x08\xd9\xb1\x22\x5e\x02\x45\x82\x00\xf1\xfc\x7a\x26\x83\xc1\x6d\xa2\xf7\x65\xdb\xeb\xdc\x36\x40\x97\x47\xa7\x87\xd8\x34\x83\xf5\x2c\xb6\x4e\x58\xd5\xfb\xff\x8f\xf1\x6c\x25\x3e\x64\xf0\x9a\xbf\x8d\x78\x34\x3d\xdb\xab\xee\x00\xd4\x31\x01\x46\xd1\x37\xa6\x78\x69\x09\x7c\xa2\x76\x92\xbd\xa8\x8f\xad\xee\x7a\x10\xec\x94\x2d\x5f\x65\xd5\xd5\xaa\x60\xbb\x7a\xf2\x52\x0f\xd6\x2a\xce\x2c\x3a\xb7\xec\xf1\x76\xbc\x71\x99\x96\xf3\xc5\xf7\xf3\x1a\xe8\x89\x41\xd8\xb2\x0c\xa4\xf8\x28\x1d\xb2\xa0\xe9\x02\x9a\x67\xad\x6c\x3b\xa1\x63\x3d\x8a\xb1\x44\xf4\xc8\x86\x91\xa3\x85\x8e\x8a\xd0\x54\x78\x2b\xc0\x6e\x5c\x54\x62\x4b\x30\x3a\x69\x03\x79\x7d\xbd\x28\xc4\x64\xf6\x09\x55\x9d\x2b\x98\xbf\x27\x54\x3a\x77\xf3\x93\x59\xe2\x16\xce\xc3\x0c\x8f\xa1\xd9\xd3\x05\x20\x07\xd8\x70\x0d\xcd\x6f\x6f\xfe\x15\xc3\x86\xac\xbc\x68\x23\x06\xc8\x17\x0c\x5c\x9b\x33\x03\x67\xa1\xd7\xdb\x5f\xad\xec\x1c\x03\x51\x33\xee\x0a\x4d\x0d\x1b\xea\x9f\xc4\x96\x9a\x01\x3f\x2e\x7b\x8e\x21\xec\x84\xff\x7c\xb7\xc0\xe4\xe9\x95\xa0\xb2\x59\xbe\xaf\x8f\x65\xbf\xbf\x88\xeb\x7b\x0d\x76\x43\xd9\x6b\x0d\x7d\x7b\x74\x5b\xbc\x58\x26\xbe\xb7\xa3\xc5\x40\x0f\x9a\x37\xb0\x84\x20\xa1\x03\xed\x52\x89\x25\xa9\x17\xb7\x1e\xf7\x47\x8e\x15\xca\x8b\xaa\xad\xa7\x44\xce\x80\x9b\x0e\x57\x1c\xbe\xaf\x2d\x52\xa4\xd6\x79\x07\xfa\xeb\xe1\x38\x59\x06\x06\xbd\x60\xa0\x80\xd1\x11\x7b\x06\xf0\x4f\x27\xf4\x8e\x41\x43\x51\x65\xa6\x2c\x14\x37\x79\x13\xae\xe7\x23\x70\xbb\x9b\x44\x3e\xd3\x20\xa8\x69\xae\xeb\xeb\x11\x86\x9a\xfb\x15\x65\x22\x4a\xfc\x8d\x9f\x3d\x4f\xf1\xe3\xe2\x0f\x5d\xe5\x26\x4d\x50\x47\x0f\x19\x1e\x30\x0c\x03\x11\x76\x7d\xa8\x7b\x14\x35\xe4\x1c\xd5\x20\x44\x33\x4c\x86\xb9\x81\x02\x44\x27\xa7\xa0\xd1\x33\xe5\x0d\xf2\xfa\x5e\xcb\x95\xd2\x34\xbc\xd3\x1d\x14\x64\xaa\x1f\xac\x33\xd1\x69\x42\xcc\xe2\xf5\x9e\xa6\x53\x9a\x28\x59\xc9\x5f\x81\x4e\xac\xa5\x70\xc0\x23\x7e\xb5\x21\x8b\x2c\x26\x3a\xf5\x17\xc8\x20\x16\x97\x3a\xae\x63\xc8\x42\x7b\xfa\x20\x3d\xb7\x7e\xbd\x92\xea\x93\x91\xc8\x85\x22\x06\xe1\x1d\x65\x6e\xd7\x0c\xbb\x03\xd4\xc7\xcf\x6d\xeb\x31\xdc\xa6\xe7\x9f\xcf\x99\xe4\x6d\x7c\xbd\xef\x96\xdc\x10\xa1\x40\xdb\x87\xba\x65\xc9\x5c\xbb\xba\x66\x41\x42\x86\x90\xe6\xfd\xde\xa4\x99\xb9\x27\x37\x9c\x48\xce\x81\xf6\x18\x31\xe0\x95\x3b\xba\x05\xe6\xb1\x3c\xa7\x4a\x66\x9d\x0f\xa9\x3c\x93\x88\x79\x9f\xe9\xb9\x55\xb7\xb5\x86\x83\xb1\x7c\xa0\x86\xe3\x3e\x24\x7a\x0d\x07\x97\xc4\x61\xdf\x6b\x1c\x92\x08\x01\xf4\xaf\x40\x89\xbd\xfe\xdf\xec\x05\xc3\x27\xb9\x78\xa4\x9e\xee\x32\x33\x3c\x18\x3d\x02\xc2\xab\xa7\xba\x01\x3f\x52\xf8\x6e\x1a\xe1\x60\x84\x1a\x33\xe8\xca\x76\xb8\xa7\x3c\x2f\xe5\xc9\xaa\x86\x1f\x9a\xf4\x39\x84\x43\x1f\x3e\xfc\x23\xee\x8b\xa2\x18\xac\x50\xca\x66\xde\x10\x65\x71\xda\x8f\x27\x0e\xc5\x98\xd4\x3a\xae\x0e\xbe\x6f\xdd\x39\xc9\xfe\xff\x54\xbd\xc9\xba\xab\x38\xd3\x34\x7a\x41\x0c\x44\xdf\x0c\x6d\x63\xc0\xf4\xa6\x87\x19\xad\xe9\x4d\x6f\xe0\xea\x8f\xa8\xff\xad\x55\xdf\xa9\x67\x4f\x6a\xef\xb5\x6c\x90\x94\x91\x11\x52\x66\x48\x50\xd9\x3e\xc6\xe2\x0d\x5d\x37\xfe\x83\x23\xeb\x05\x7c\xd7\x79\xdb\x9b\x38\xef\x16\x1a\x89\xc5\xc6\x4a\x60\x7f\x79\x82\x1d\xf0\x3e\xbf\xe4\x05\x40\x1d\xfe\xe4\xd8\x39\xf1\x3c\x56\x26\x43\xfe\x15\x62\xe3\xb1\xb5\x12\x57\x4c\xdc\x3b\xe1\xd2\x82\x7d\xd9\xff\xd6\x2d\xdc\xee\xc5\xdc\x7e\xe6\xf6\xa0\xb1\xc3\xe1\x56\xbf\x9d\x46\x70\xd1\x42\x89\x0b\x7d\xfd\x43\xf4\x5b\xd9\x0d\xd5\x4f\x7a\xff\xb3\xb5\x7e\x7e\x4d\x82\x21\x79\x02\x10\x1c\x39\xa6\x43\x60\x62\xd7\xae\x85\xd7\x7a\xfe\x7d\xe1\x9e\x13\x03\xb5\xf5\x72\x63\xfd\xdc\xe5\xdd\xc5\xb4\xc1\x16\x42\xbe\x1b\xf5\x93\x46\x1b\x67\xc3\x02\x30\x76\x30\x82\x7e\xd6\xf6\x48\x27\x8f\xbe\x0e\x9a\x8f\x77\xc1\xfd\xce\x08\x99\x59\xe9\xc3\x4d\xcf\xaf\x28\xe0\xc7\xff\xd6\xa1\x5c\x18\xbd\x82\x3b\x80\x13\x7e\xa1\xff\xcb\x8b\x1d\xe1\x7f\x05\xff\xbc\x9c\x00\x92\xa4\xe4\x72\x90\x21\xc8\x24\x49\xe5\x2f\x96\x2c\x83\x91\xc7\x79\xf4\xee\x5f\xad\xec\xc4\x90\x32\x1c\x48\xdd\xd4\x2a\xc4\x02\x26\x42\x3e\x68\x02\x05\x5d\x2e\xa7\x5c\xc8\x7f\x8b\xfa\x08\x00\xc9\xcc\x1c\xc2\xb6\x86\x25\xd2\x6a\x40\x73\xf9\x1c\x54\x04\x58\xf9\x38\x99\xe0\x1a\x7a\xfc\x66\xfb\x13\x7a\xff\xdb\xd3\xe4\x3f\x36\x5e\xc0\xd0\x77\x0b\x1d\xa6\xfd\x31\x81\x82\xc8\x88\x41\x84\x74\x47\x64\xcd\x78\x32\x58\xcb\xaa\x27\x3e\xd6\xb0\x1c\xd7\x96\x6a\xc5\x54\x54\x07\x55\xa0\xaf\x52\x73\xec\xdc\x75\x36\xf9\x62\x31\x28\x6f\xb4\x89\x23\xdc\x17\xdb\x0e\xa9\x39\x10\xc9\x34\xcd\x6d\x26\x1c\x62\x57\x29\x1d\xb9\x36\xe0\xaf\x26\x99\xcd\x43\x6e\x0b\x29\xfe\x60\x02\x17\xef\x65\xf0\x2f\x7e\xdc\x4e\x22\x43\x39\xc8\x4f\x6b\xf6\x8b\x30\xd1\xe2\x8e\xf3\xfc\x32\x73\x73\x77\x6a\x76\xa6\x88\x7f\x8e\xef\x21\x65\x98\xf4\x3e\x9e\xd9\x17\x4e\x3d\x3c\x85\x8a\xae\xba\xcb\x4f\x27\x1c\x10\x0e\xe3\xa6\xd4\x88\xba\x38\x42\xce\x0c\x08\xa7\x9d\xb1\xa3\x86\x44\x1c\x55\x9e\x5b\x51\x88\xaa\x3e\x2c\xfa\xf9\x4a\xae\x3c\xd0\xda\x54\xf1\x82\xb9\x41\x8d\x91\x0d\x85\x42\x48\x7d\x7e\xc4\xbf\x4d\x49\xf2\xea\x89\xda\x9d\xd0\xb0\x3e\x99\xe4\x61\xbe\xd7\x4c\xa7\x79\xdc\x08\x15\x07\x59\x96\x6f\x8d\xa4\x0b\xdd\x4c\x10\x8b\x82\xb1\x54\x56\x28\x4d\x77\xc3\xe5\xfa\x4b\xae\xea\xc1\xaa\xf5\xdc\x2d\x81\xda\x1c\xb1\x2a\x23\x12\x31\x35\x8d\x9b\x35\xd2\x24\x22\xd3\x46\xab\x3d\xd8\xd8\x52\x77\x47\xba\x1e\xa2\x6f\x26\xbd\x24\x48\x00\x4d\x99\x3a\xa9\x7d\x09\xeb\xf7\xe7\xf3\x87\xff\x3a\xf8\xe5\x13\xaa\xd7\x2e\x71\xd4\xd8\x4a\xa5\x1f\x2f\x22\xdd\x9c\x66\x8a\x90\x89\xee\x8c\x45\x06\x37\x96\x0d\xb1\xcd\x1b\xf0\xf5\x39\x69\x25\xa4\x3c\xc2\x0f\xbb\xca\xc9\x27\x0e\xad\x7c\xd5\xcf\xc8\xa2\x1d\x3a\x6f\xf1\xab\x9d\x90\xb1\x21\xe9\x20\xf3\x6e\x39\x60\xa7\x7b\x46\xf1\x30\x9a\x20\x89\x7d\xf4\x3b\x9e\xcb\x57\x2f\x8e\x28\xfc\xbd\xf7\x7d\xbd\xce\x3e\x1d\x17\xd3\x0e\x9e\x9e\x9c\x38\x6d\x14\x93\x65\x94\x63\xf0\x21\x94\x3f\x0f\x1e\x19\x50\x63\x02\xd8\xe9\x43\x8e\xc2\xa5\x2a\x2e\xf3\x0d\x64\xb2\x2c\x50\xf7\x5b\xcf\x25\x90\x57\x85\x63\x3a\x52\xe8\x5b\xff\xcc\xcc\xfe\x9c\xda\xd3\x25\x74\x02\x60\x07\x76\xd5\x2a\xff\x1e\x7a\xe7\x78\x47\x19\x1c\x3c\x37\x59\xb8\xdd\xcf\xb3\x63\xde\x4a\xea\xdf\x7d\xd9\x3b\x4b\x12\x07\x7f\xeb\x67\xd1\x26\x47\x08\x22\xaf\x2a\x36\x29\x09\xed\x46\x0c\xb2\x22\x0f\xe7\x9f\x9c\xe9\x10\xdc\x19\x73\x90\xda\x18\xa7\xcb\x3e\xf2\xbb\x26\xf6\x4a\xf0\xfb\x64\x37\x1f\xc6\x17\x67\x45\xfa\x7e\xc2\x94\x5e\x20\xd9\xb2\xd9\xd4\xab\xf1\x1b\x13\x4a\xdb\x7f\x14\x44\x23\xb5\xb6\x3d\x68\x71\x17\xb5\x61\x7d\xfb\x04\x7f\xfa\x4b\xa7\xc6\x58\x65\x3f\x40\x11\xfa\x32\x40\x6a\x13\x1d\x7d\xa5\xe6\xe7\x5d\x2b\x44\x6c\x22\x76\x0c\xea\x98\x74\x79\x85\x73\x07\x25\x62\xfc\xfa\x69\xc4\xad\xd7\x8f\xf9\xaa\xb7\xfc\xda\x93\x3d\x42\xbe\x42\xbd\xe4\x3c\x22\x53\x9c\xce\xb5\x89\xad\x52\xf3\x0c\x67\x0b\x20\x08\x81\xbc\xf2\xbb\x1e\x7e\xe7\xbb\x63\x94\xab\x67\x88\xb3\xda\xdd\xff\xed\x9d\x7d\x40\x44\xfc\x69\xbc\x30\xb4\x05\x5a\x66\xd7\xb1\x7e\xd6\xc7\x78\xac\xa0\xa4\x47\x70\x90\x99\xca\x4a\x2b\x2d\x47\xec\x41\x7e\x05\x55\x3d\x1b\x3a\x12\xb9\x0b\x63\x56\xbf\xe3\x33\x85\xc4\x69\xe6\x39\xab\x9d\x2b\xe2\x93\x3d\x3e\xa4\xc1\xdf\xa1\x72\xed\xa5\xaf\x6b\x04\x12\x33\xb7\x59\x91\xe7\x81\xe7\x61\xa4\x95\x84\xaf\xf1\x98\x17\xd4\x18\x08\xed\xc3\x44\x44\xa6\x96\xa9\x7a\x51\x56\x8b\xff\xdb\x43\x30\xfb\x47\x39\xb8\x01\xf2\x7e\x07\xda\xa3\x81\x1c\x08\x17\x77\x5f\xb3\x07\xf9\xd0\xea\x37\x2b\x4a\x2d\x97\x04\x58\x01\x9a\xfd\x84\xe2\x3b\x24\x1f\x1c\x91\x1a\x9c\x04\x59\x88\xdf\xc9\xee\xc3\xa5\xfa\x94\xee\x8b\xed\x7b\x42\x51\xf5\x29\x1e\x0d\xe4\x51\xc5\x1d\x0d\xc0\xf1\xdd\x59\x02\xca\x87\x0d\x9f\x5e\x43\x1b\x10\xd1\xaa\x13\x6b\x45\x15\x71\x2e\x66\xcf\xf7\xff\xd1\xec\x9f\x87\x4a\xe5\x6a\x7b\x74\xb4\x06\xd0\x0d\xd2\x0f\x33\x47\x10\x8e\xd0\xce\xdb\xbe\xdb\x8b\x3c\x2e\x76\x77\xf4\x27\xc3\x16\x15\x02\x10\x5d\xb9\x83\x62\x15\xba\x31\x7e\x96\x2f\x38\xb5\xba\x75\x03\x0f\x72\x0a\xea\x7b\x01\xbe\xc4\xcd\x03\x49\x2d\x01\xe2\x75\x9d\x35\x7a\x9e\x22\x7e\x17\xe4\xa6\x0e\xc5\x84\x13\x80\x61\x20\xc5\xb3\x63\x81\x76\x5b\x21\x97\x37\xe4\xa3\xba\x23\xab\xbc\x1f\xe7\x5f\x0d\x9f\x5c\x4d\x57\x1d\x3e\xb1\x90\x48\xf7\x2e\xf4\x23\xbd\xba\xdd\x48\x7f\xfc\x80\x22\x07\x32\xe3\x8d\x33\x66\x54\x91\x38\x2a\x90\x1b\xee\xfe\x4a\x61\x00\x50\xef\x8c\xff\xa0\xfa\x83\x73\x21\x69\xcd\xca\x60\xf4\xec\xdf\xfc\x65\x73\xa3\x50\xe9\x91\xe6\x84\x1d\xb5\x4f\x52\xe7\xb6\x58\xe2\x7f\x77\x0e\x80\xad\xbd\x71\x47\x4a\xc8\x4d\x01\x42\xe0\x6e\xb3\x84\xe6\xb7\xbf\x72\x39\x6d\xf7\x2c\x28\x47\x81\x96\x69\x15\x15\x7a\xe6\xb6\x69\xda\x19\x40\xf4\x81\x04\xe2\xaa\xd9\x71\x5f\x5e\xf4\xdd\x5d\x44\x12\xdd\xab\x50\x18\x80\xba\x69\x50\x15\x1b\x94\x77\xc3\x9a\xea\x5e\xdd\x4a\x7e\x6b\x64\xb3\xdf\xf6\xd7\x55\xea\x4f\x00\x98\x7f\xf6\x9f\x2f\x74\xb1\xa6\xdf\x26\x6f\x7c\x7e\xee\xfd\x04\x75\x87\xc6\xdf\x21\x65\xc5\xab\x4c\x73\xae\x5e\x3f\xb7\xfd\xcd\x2c\x7d\xbf\xda\x02\x1e\x92\x13\x0a\x85\xf1\x23\x1e\x8f\xff\x6d\xbd\x6a\xbb\xe5\x63\x2b\x73\x3e\x8c\xd1\x53\x46\x9b\xfc\x04\x55\xa6\x3c\x88\x05\xe4\xf0\x65\xcc\x80\xe1\xdc\x0e\xdb\xde\x2f\xf7\xc9\x5d\xed\x55\x06\xe4\xef\x2f\x94\x52\x48\x5c\xaf\x34\x18\xac\x37\xa4\x82\x73\x33\xdd\x6f\xbf\xd8\x6c\x4c\xe4\x94\x4c\x70\x96\x3d\x27\x9b\x64\x16\x33\xcf\x5b\xc0\x71\x5a\x0a\x44\x28\x2c\x05\x3a\x5d\x06\x77\x60\xe5\xca\x01\xfe\x4f\xfb\x3d\xfe\xab\xad\xa5\xe2\x6e\x83\x80\xdb\x3f\x19\x03\x72\x1e\xe5\xf3\x4d\x9d\xe9\xf7\x41\x00\xa8\xd8\xab\x57\xe6\x04\x38\x82\xe1\x5f\x3f\x92\x1a\x69\x40\xd8\xcc\x72\xae\xdc\x41\x4e\x76\xbb\xa8\x6f\x72\x56\x19\x98\x73\x00\xc8\x7f\x01\x64\xa4\xf0\xad\x89\xa2\xe8\xf7\x38\x74\x92\x9b\x90\x30\x86\xec\xbe\xa0\xd0\xdc\x08\xab\x00\xfb\xbb\x57\xa1\x16\x16\xdf\x49\x1d\xa8\x1b\x27\x82\x89\xbe\x7d\xf8\xf2\xef\xdc\xf6\x11\x3e\xe9\xc2\x31\x9c\x0f\xa9\x98\xc6\x87\x25\xbf\xca\x9e\xf7\xb7\x0f\x94\xc3\x23\xd4\xe7\xc4\xb6\x16\xdf\x1a\x8f\x13\x74\xd4\xf2\x2a\xec\x65\x02\xec\x98\x60\x56\x8b\xe2\x7f\x67\xfe\x71\xdb\xae\x18\xec\xb0\x35\xf9\x92\x9f\x3d\xa9\x33\xa6\x04\x80\x7d\x16\xa0\x20\x05\xbd\x4a\x82\x8f\x7c\xe4\xfd\x5d\x69\x1b\xc0\x50\xdc\x02\xd3\xeb\xa7\xb4\x6b\x77\x6c\x94\xc7\x6f\x81\xb9\xc3\x9e\x46\x6a\x25\xec\x57\x65\xfe\x8b\xd3\x1a\xe4\x98\x50\xde\xd9\xb2\xd6\xb0\xb1\xf2\xfc\x91\x79\x72\x6d\xcf\x9b\x05\x88\xfa\xd9\xe7\xcc\x8c\x64\xc9\xf9\xea\x69\x31\x27\x06\xf9\xb9\x43\x34\x83\xd5\x84\xc4\x9e\x0f\x5f\x70\xed\x54\xa1\x78\x5f\xa6\xc7\xe0\xc0\xc7\x3a\xff\xa9\x09\x52\xd0\xcf\x7e\x9e\x80\x08\x20\xc4\xd6\xd4\x47\x35\xab\x1f\x54\xf4\x99\xf4\x7d\x9e\xb8\x7c\x02\x7a\xce\x8a\x49\x88\xed\xf0\xb5\xf4\x27\x9b\x88\xbb\x16\xcd\x21\x0e\xba\xbb\x72\xfc\xc5\xb1\x66\x27\xc5\x4c\x7b\xe5\xb5\x3b\x78\xb8\xc3\xeb\xd3\x02\xf0\x60\x0f\xb8\xda\x6e\x07\x0b\x50\x04\xce\xca\x26\x74\x11\x64\xb6\x2d\x7d\xe9\xf4\x97\x06\x39\x00\x47\x77\x05\x10\xec\x94\xba\xf6\x90\x6e\x8e\x92\x51\x3d\x7b\xe4\x89\xd4\x45\x55\x88\x98\xc4\x56\x6c\xa0\xcf\x60\x52\x4a\x6d\x19\xb2\x1a\xf2\xee\x63\x4b\x9c\xad\xa8\x4b\xb9\x62\x76\xbf\x14\x4e\x09\x0c\x62\x09\x74\xa1\x57\x5e\xf5\xbf\xf5\x99\x30\x83\x98\x0e\xce\x69\x5f\xf6\xeb\xb4\xd1\x77\xe1\xd6\xa2\x28\xa6\x81\x07\x7b\xf9\x66\x75\x2a\x85\x6b\x05\x4a\x92\xb8\xe5\x60\x6c\x45\x28\x9d\x7b\xca\x3b\xfc\xa8\xdf\xea\xee\xed\xdf\x6d\xef\x7b\x82\x89\xf5\xcd\xeb\xef\xd4\x87\x94\x5e\x14\x44\x26\x5a\x5e\x8c\x30\x29\x23\x88\xf5\x80\x21\x0a\x02\x72\xb7\xf2\x39\x56\x21\x94\xe7\x5a\xf5\x46\x18\x11\x65\x27\xee\x7e\xd3\x73\xe5\xbf\xf9\x29\xb8\x82\xa1\x18\xff\x03\xd5\x6d\xd0\x3d\x02\x73\x56\xcf\x93\xdb\x16\xef\x0b\xd8\x57\x8e\xe9\x49\x50\x25\x4a\xbe\x8c\x31\xe9\x27\xa9\xc4\x62\x04\x40\xfc\xe1\xae\xa4\xbd\x7e\x62\xe2\xe8\x21\x3a\x57\xa5\x81\xb8\x43\x66\x13\xc1\xaf\x9a\xbd\x75\x51\x55\x28\xeb\x9f\xe9\x3a\xdb\x83\xd5\x46\x50\x4f\x5d\x63\x51\xca\x23\xb2\x41\x3d\xd1\xfb\x08\x27\xbb\x9f\xfd\x1a\x93\x77\xc1\x8a\xb7\xff\xe3\x29\xf0\x33\x76\x1d\xca\xd2\x44\xbd\xc7\xd1\x9d\x25\x8c\xa3\x54\x4b\xbc\xcb\x60\x1e\xa4\x58\xf0\x75\x4d\xc0\xf4\x42\xd8\xb5\xb3\x20\xbe\xa4\x91\x2d\x6a\x23\xe8\xab\x01\x8a\xc1\x61\x14\xcb\x77\xf4\x90\x84\x75\xc2\x90\xd5\x69\x22\x53\x04\xc7\xcf\x8a\x58\x11\xe2\x51\x8c\xb0\x9c\xaa\x66\xc9\x06\x7e\xfd\xce\x82\xa2\x39\xde\xff\xe4\x8e\x43\xfa\xf0\x3c\x73\x72\xbc\xf1\xf0\x64\xc5\x6b\xed\xfe\xac\x4c\x82\x83\xbc\xe6\x2d\xfd\xbb\xcf\x20\xf2\x38\x05\x99\xa2\x78\xbf\xea\xdb\xd0\x4c\x4d\x15\x8c\xe1\x46\x8a\x45\x34\x44\xe4\xaa\x13\x82\x8c\x53\xe2\xeb\x38\x5e\xad\x0a\x1f\x2b\xd5\x67\xc0\xb2\x7e\x7b\x57\xca\x67\x9f\x4f\xf4\x43\xe5\x45\x25\xe3\xc7\x4c\x65\x00\x8a\x36\x05\x32\x42\x9e\xe2\xa5\x90\x18\x1e\x2f\x57\x49\x2b\x02\xe6\x44\x34\x0b\xc2\xdc\x0c\xe4\x67\xf9\xfc\x1e\xda\x29\x37\xe6\x57\x66\xd3\x5e\xb1\x2d\xc2\x7a\xa4\x7f\xb5\x5b\x7c\x24\xee\xa3\x6d\xec\x8e\xda\xf6\x04\x20\xd9\x82\x3a\x20\x77\x6c\x11\x8c\xcb\x69\xc0\x93\xde\x83\xfd\xd5\x19\xbe\x3d\xa4\x6e\xae\xdb\x1d\x48\x95\x29\x3e\xc1\x72\xec\x72\x67\x84\x6d\x41\xa9\x34\xd4\x04\xf4\x05\xb4\xcd\x06\x64\x7a\x4b\xb6\x1c\x1f\x5b\xb2\x7c\xc3\x25\x0f\xc5\x6c\xbf\x47\xe7\xb3\x05\x10\x56\x57\xa1\x37\x2d\xba\x08\xa7\x79\x3b\xb5\x5d\xd6\xa2\x5e\x66\x79\xe9\xaf\xfc\x56\x3b\x72\xa0\xaf\xce\x3d\x6b\x55\x1f\xcb\x02\x8c\x93\x2c\x36\x90\x40\xd6\xc9\x55\x38\x67\xd3\x74\x2c\x49\xe8\x72\x04\xc7\x3e\xf9\x3b\x0b\xc7\xa3\x85\xdc\x99\xe2\xe7\x60\x3b\x39\xf2\x17\xf3\x2f\xbb\xd9\xdd\xd0\x52\xb2\xf5\x0c\xd3\xd0\x03\x08\x0b\x97\x1a\x0b\xb4\xf3\x51\x26\xa4\x03\xc1\x4f\xd1\x48\x0b\x70\xe0\x2d\x5e\xdd\x3f\x30\xbe\x7f\x95\x77\x98\xdc\x7e\xb0\xf5\x4b\x31\x10\xef\x79\xef\xff\xc7\x85\xee\x1f\x6e\x7d\x9b\x66\xfd\x3a\xd1\xc6\x27\x59\x3e\xcb\x09\x42\x6a\x55\xa2\xee\xe8\x38\xf7\x08\x57\x45\x56\x0e\x20\xce\x52\xcd\x1a\x14\x0d\x89\x0e\xf5\x8a\x45\x9b\x16\x78\x5e\x15\x8e\xd5\x9d\xef\x56\x0a\xd1\x9b\x48\x71\xd4\xe2\xc1\x8b\x16\x3e\x6c\xf1\xb9\x04\x01\x81\x08\xea\xfe\x29\x24\x02\x2c\x98\x97\x7a\x93\x74\x27\xe3\x67\x1d\x06\xd4\xe7\xf5\xf8\x6d\x67\x3e\x61\x5b\x05\x73\x72\xd4\xc4\x22\x21\x98\x3c\xe8\xc5\x57\xfd\xaf\x1e\xe0\xef\xcc\x0b\x0a\x61\x6a\xd5\xe2\xda\xf9\x0e\x8a\xdb\xef\x23\x11\xd2\x7d\x08\x29\x4e\x5e\x28\xc1\xa9\xb1\xa6\x79\xc2\xb8\xc4\x8c\xf1\x3d\x41\x15\xb7\x12\x31\x92\x19\x8d\x57\x18\xb4\x51\x7e\xb1\xbc\x19\x9f\x90\xca\xd8\x28\x6a\xad\x9e\x08\x7f\x5f\xb9\xce\x69\x93\x04\x00\x61\x02\xbd\x5e\x00\xac\x4b\x24\x4b\x1b\xdf\x03\x60\x57\xa3\x30\x64\xcc\x68\xe2\xec\x60\xb0\x00\x75\x5f\xa4\x27\x17\xeb\xa3\x05\xed\x72\x9b\x4a\xff\xbf\xba\xf3\xce\x96\xc5\xb6\x0a\x1b\xd5\x78\x46\x90\x06\x9e\xef\xb8\xce\x5f\x41\xb1\xc1\xf1\x4f\xb6\x0c\x94\x39\x60\xe4\x06\x98\x0b\x91\x63\x55\x04\x72\x9b\x86\x9a\x0b\x20\x5c\x06\x9e\xc1\xc9\x4a\xdc\xca\x3a\xdf\xf0\x74\x31\xc1\xb6\x56\xea\x3d\x5a\xfd\x01\x0a\x8e\x2b\xfa\xea\x4c\x30\xdd\x86\x18\xfe\xae\xad\xf4\xcb\xa4\xc5\x41\xce\x4a\x2a\x6f\x7e\xf6\x09\x0d\x9e\x5d\x03\x43\x69\x61\x82\x6a\xae\xf3\xc1\xd5\x4d\x51\x47\x5e\xc9\x1c\x85\x69\x41\xfb\xc3\x60\x74\x76\x9e\xe5\xc3\x92\xd3\x2f\x1d\xb6\xf2\xaf\xf9\x7d\xbd\x22\xb2\xd4\x3e\x9b\x36\xc0\xd4\x0b\x90\x01\x52\x9e\x2a\x5c\xb5\x6b\xbe\xa8\x36\x51\x4d\x14\xe0\xcb\x1f\xad\xa6\x9a\xa5\xa4\xad\x62\x1f\x02\x6a\x7f\x93\x9f\x2a\x1c\x0c\xca\x6d\x56\x7e\x7a\xc5\x4a\x30\xf0\xcd\x9c\xa2\x31\x1b\xaf\xc9\xa5\x9a\x94\x28\xc0\x06\x0d\x9f\x6a\x3f\xf6\xf5\x34\x94\x09\xcb\xa7\x67\x79\x7b\x53\x16\x63\x85\x53\xb2\x67\xef\xee\xbf\xba\x65\x3f\x7a\x01\xce\xe2\xcb\x77\xe8\xdb\xb2\x0c\xb1\xb6\x78\x8d\x1b\x7c\x10\x74\x84\xeb\x34\x2f\xb6\x83\x68\x0c\xc4\xa4\x38\x04\xa3\x48\xb0\x75\x37\x9f\x47\x9c\xcb\x30\x21\x51\x32\xdd\x79\x7e\xdd\xa5\xf1\xc6\xc5\xf9\x22\x66\xcb\xec\x5a\x43\xa6\x50\x8b\x63\x01\x38\xf9\x02\xc0\xdf\x1a\xc3\x0e\xf7\x87\xd3\x18\x20\x11\x43\x88\xcd\x7f\x1c\xf7\xd9\x35\xa9\xae\x9e\x86\x7d\x5f\x87\x4d\xdc\x72\x3a\xb0\x0c\x07\x05\x67\xfd\x69\x77\x86\xb1\xff\x47\x6a\x2e\x48\x34\xfd\x47\xd4\x4a\xad\xd4\x27\x97\x01\x8a\xa1\x73\x3f\x27\x2e\x94\x4d\xc5\x60\x82\xe3\x00\x37\xbc\xd9\x25\x42\x91\xa2\x18\x18\x82\x40\x8f\x8f\x1c\xbf\x21\x12\x96\x9b\xde\xcc\xbf\x8f\xf6\x33\x29\x98\x18\x1a\xfa\x79\x23\x3d\x43\xaa\xb9\x9d\xf3\x58\xf6\xda\x2c\xc0\x6c\x0e\x0c\xc9\x3a\xd9\x64\xf2\x30\xef\x8c\x99\xc1\x27\x93\x90\x69\xa4\x3f\x72\xfb\x0b\x32\x3c\x33\x13\x82\xb3\xdb\xdc\xfa\xaa\xb3\x8e\x29\x13\x23\xb2\xfe\xff\xf5\xac\x39\x75\xc5\x3d\xed\xe4\xac\x8c\x88\xbc\x0a\x5f\xe0\x7f\x34\xa7\x06\x48\xeb\xe7\x70\xc1\x87\x81\x09\x10\x6a\x23\x72\xab\x3f\x07\x8a\x6d\xb7\x02\x51\x92\x84\x79\xc3\x4f\x0f\xac\xf8\xf3\xcc\xd0\xab\x47\xab\x39\x5a\xf1\x34\xe9\xd7\x6c\x3c\xae\x02\x90\x44\x2c\xc7\x95\x8e\xb9\x50\x95\xc3\xad\x58\x45\xf5\xea\x01\x2b\x2a\x42\xa3\x02\x99\x63\x98\x0d\x32\xd1\xc5\x3c\x4a\x4f\xf7\xa2\xe0\x88\x4f\x26\x57\xcd\x9c\x9e\xe7\x1e\x89\x3e\x42\x6a\xfe\x7b\x76\xad\xdd\xe6\xab\x4f\xec\x70\x8e\xca\xb0\x29\x83\x8d\xd7\xb5\xe7\xbc\x0e\x8b\x0b\x00\x67\x0e\x80\x27\xa4\x9a\x88\x77\x20\x71\x37\x9a\x17\xcb\x42\xf4\x29\x20\x52\x98\x3f\x45\xac\x14\x86\xc4\x5f\xdf\xa0\x07\x68\x8d\x0d\x41\xa4\x8a\x11\xb0\x84\xfa\xc7\xe7\x85\x79\x22\x32\xdf\xd2\xd2\xfd\x97\x72\x08\x94\x5e\xd7\x76\x2c\xb2\x82\x96\x65\xf1\xe5\x3a\x68\x20\x02\xac\xfa\x8c\x31\x32\x79\x04\x95\x1d\x05\x4d\x1d\xbb\x03\xb1\xca\x12\xff\xdd\xe7\xed\x1e\x7e\x42\xd8\x4c\x9f\x3e\xa3\x7a\x78\xd2\xbd\x0b\x62\x7b\xf3\x98\x0d\x29\xcc\x3e\x02\x19\x91\x31\x0c\x86\x75\x69\x0e\x30\x6b\x4b\x68\x0e\x6a\xc2\x31\xea\x8a\x1e\xa2\xeb\xf9\xc9\x39\x48\x3f\xa7\x3b\x5e\xb7\xa0\xcb\xa6\x75\xcb\x7c\xe4\x30\x59\x3b\x76\x44\x28\x6b\xcf\x10\xf7\xb6\x67\x1c\x0d\x44\xef\x8f\x84\x7f\x02\xe0\x45\x14\x7c\x55\x4e\x43\x00\x8b\xcb\x57\x1b\xb3\x03\x51\xf6\x50\x5a\x67\xf8\xa9\xfb\xd2\x36\xdb\x4f\x6c\x7e\x6c\xc5\x91\xdc\x97\xe3\xa3\xbf\x1c\x73\x8f\xba\x29\x51\x91\xf9\x83\xb9\xe4\x79\xbc\xfc\x28\xf0\xb8\x2c\xfd\x0c\xcc\xd5\x6a\x2c\x2d\x27\x20\x19\xde\x34\x73\xfe\x97\xf7\x9c\xe5\x64\xc9\x34\x36\x61\x0a\x23\x83\xf0\xb0\x9f\x4c\x08\x0e\xd4\xcf\x55\x9b\x7f\xd0\xde\x2d\x84\xe3\xf9\xc1\xe0\x08\xe3\x29\x78\x43\xdc\xa5\x90\xcc\x34\x8b\x20\xe8\x01\xf7\xb0\x88\x95\x71\xc8\xe1\xea\x07\x06\xc8\xea\x6e\x26\x20\xc8\x01\x0c\x2c\x70\x3a\x27\x91\x06\x3a\x2f\xdf\x66\x75\x15\x89\x33\x90\x37\xa4\x08\xb6\xb0\x1b\x13\xda\xc3\xcf\xf9\xaf\xc6\xf5\xd4\x0d\xc3\xe5\x7c\x5b\xeb\xe4\xf2\xbb\xdb\x80\x0a\xbb\x6d\x92\x04\xae\xcc\xfb\x89\x1e\x23\x80\x30\x86\xb4\xf0\x08\x53\x2c\x18\x62\x0f\x42\x07\xce\x6f\xd0\x51\x1d\xc7\xb1\x64\xf3\xcf\xde\x4a\x10\xe1\xd9\x2d\xc1\x15\xb5\xa5\x66\x2f\xf9\x89\xcf\x28\xf1\xf7\xfd\xed\xbf\xd8\x47\xbc\x9d\xb5\xe4\xd1\xd5\x30\x06\xed\x17\x21\x4d\x00\x46\x00\xb0\x05\x14\x26\x32\x07\x57\x8f\xfb\xc4\x00\x1c\xef\x09\x82\x30\x57\x98\x26\xd8\xf2\x29\x71\x1e\x59\x63\x57\x4d\x5b\xb5\x87\x9b\x82\x8d\x77\x1b\xca\xf2\x2a\xf2\xb0\xd8\x19\x73\x27\x43\x7f\x50\xfd\xcd\xff\xcf\xe3\x08\x3e\x3b\x49\x1d\x96\x5e\x28\xaf\xea\x3b\xd8\x40\x7e\x6d\x41\x72\x36\x0d\x97\x5d\xe7\x8e\x50\x88\x73\x2c\xc5\xe5\xe0\x98\xce\xa5\x5e\x66\x22\xc9\x46\xb7\x93\x2d\xb4\x0d\xc0\xb5\x8f\x92\x9a\xbd\xf5\xa5\xb0\x99\x89\x80\x18\xba\xbc\x90\x71\x82\xa0\x52\x10\x2b\x6a\x41\xa8\xf4\xaa\x50\x62\xc1\xc6\x6f\xea\xa6\xeb\xf5\xed\xa7\xc1\x01\x67\x83\x0f\x3b\x31\xcc\x71\x7c\x99\x20\xe0\x90\x5f\x9a\x1b\xbe\xcf\x84\x73\x90\x44\xda\x97\xe9\x63\x90\x6e\x19\x64\x96\x4c\xb6\x72\xd4\xe5\x61\x71\xf5\x80\x93\x42\x7d\xb6\x07\x95\x4f\x4a\xf5\x75\xd5\x50\xfc\x72\x4f\x52\xaf\xc9\x15\x27\x6e\x90\x54\x84\x37\x84\xaf\xff\x2f\x66\x52\x6c\x7d\x1b\x7b\xcb\x17\xcb\xf0\x2a\x44\x2f\x18\x6e\xf1\x10\xa4\x80\xe9\x4a\xe7\x0a\x20\xa9\xc8\xe7\xe3\x41\x5e\x4a\x2e\xca\x01\xcc\x33\xbd\xf6\xf8\x37\xe6\x2d\xbd\x49\xa3\x9e\x62\x3c\x93\x2c\x42\xb7\x52\xf8\x0c\xd8\xb0\x45\xda\x8f\xc7\x9f\x2c\x3b\xd0\x85\x3e\xd9\xbe\x4d\x2f\x8a\x62\x84\xa7\x27\xb0\x67\x50\x10\x17\x1b\xe0\xa4\x87\xb9\x33\x10\x59\x93\x82\xd8\x36\x0c\x0f\x84\x33\x45\xbb\x40\x6d\xab\x3d\xbb\x3c\x5b\x5a\x19\xcf\x84\xa2\xef\x5b\xa4\xff\x7f\x7a\x62\x81\xdf\x31\xd3\xa9\xe1\xe9\xdc\xda\x4c\x3b\x91\xc5\x0f\x02\x8d\x3a\x19\x9d\x72\xdd\x61\xcf\x1f\xa0\xf6\xea\xb5\xfc\x5b\x23\xf9\xb3\x71\xb2\x90\x62\x99\x6b\xaf\xfe\x8d\x12\x2e\x2c\x93\x46\xcc\x01\x01\xc3\x52\x4c\x89\x3f\x40\x12\x38\xcc\x40\xd7\x4c\xba\x1d\x16\x4f\xb0\x5d\x2d\x1d\xbf\x5e\xb7\xcd\xd9\xb0\x2c\x47\x19\x35\x9f\xe2\x23\x39\x50\x97\xf8\xc7\xcf\x8f\x2c\xee\xa9\xa4\xaa\x8d\xd4\x0f\xdd\x1a\x89\x80\xa6\xbc\x9c\x35\x09\x24\xd7\x21\x0b\x2d\x04\x38\xcb\xc5\x8a\x33\x1b\xc1\x6e\x2c\xda\xb9\xbb\xf8\xc5\x84\x4d\x53\xcb\x4c\x1d\xae\xf9\x7b\xee\xcf\xec\xd6\x8f\x8f\xda\xf3\x22\x29\xd8\xb4\xd4\x39\xef\x86\xf2\xfe\x3f\x1a\x4f\x76\xfb\xbc\xd0\xf7\x8f\xf6\x28\x91\x23\xd0\xa8\xb7\xd9\x8c\x6b\x86\xad\x15\xeb\x55\xb3\x57\x3e\xa2\x43\xc2\x38\xe0\x4e\xfd\x8b\x55\x67\xd5\x7a\x06\xc5\x1d\xea\x8c\xbd\x5a\x2e\x3f\x80\x6e\x7e\xa9\x41\x19\xad\xd5\xe4\xd2\x9b\xaa\x91\x5e\xa3\x7e\x54\xb0\x17\xcf\xff\x87\x55\xbf\xc7\x29\x4b\x52\x13\xf2\xd2\x24\xa8\x67\xd7\xc0\xf8\x8a\xea\x17\x62\x2a\xde\x7a\x23\x97\x15\xbd\xcc\x84\x0a\xf1\x48\x39\xab\x73\x83\xc8\xa5\x24\x2a\x65\x2f\xde\xfc\x77\x66\x2a\x3e\x7c\x59\xea\xcf\x34\xc2\x8c\x01\x39\x31\xa7\xd9\x35\xdb\x38\x1e\xdc\xcd\x14\xb8\x1f\x75\x95\xfe\x7b\x76\x05\xe3\x7b\xb7\x0a\xf6\x21\x6b\xfc\x7b\x46\x0c\x21\x0e\x28\x23\x30\x1e\x81\x68\xfd\xdb\x17\x19\x6d\x73\x3d\x78\x93\x2f\x1d\xa3\x77\xb2\x85\xfc\xd8\xd0\xfa\x6e\x98\x8f\xf7\xa3\x1d\x2e\x3f\x02\x2e\x6f\x4f\x18\x92\x0e\x1b\xa6\x0a\x2d\xd9\x87\x34\x75\xb3\x37\x08\xb7\xf7\xca\x83\x4e\x79\x0a\xff\x72\xe7\xab\x96\x31\xfd\xd0\x7d\x1b\xe4\x24\x4f\x2d\xbb\x31\xb4\x68\x41\xf0\x86\xf1\xd4\x17\xed\x9d\x29\xb6\xa3\x9d\xfc\x12\xf7\x05\x97\xb0\xce\xb3\x5a\xd4\xc9\x17\xef\x77\x15\xaa\x63\xf7\xff\xf9\x74\x89\x91\xfc\x42\x00\x92\x46\x5e\x4c\x46\x5c\x19\xe4\x4e\x0d\x56\x01\x55\x32\x2e\x84\xef\x42\xb2\x98\xf7\xc4\x25\x75\x4a\xa7\x36\xea\x01\x15\xb1\x07\xdd\x0a\xcc\x31\x8f\xe8\x5a\x63\x35\x3f\x3c\xef\xc9\x1f\x6f\x5d\x6a\xce\x3e\xa6\x1f\xef\xe6\x8d\xf3\x5d\xb0\x75\x9e\x95\x4f\x12\x1f\x37\x8a\x44\xd4\xa7\xde\x9d\xd4\xd7\xc0\x66\xe7\xb5\xe5\x37\x82\xd9\x0f\xe9\x28\xd8\xf3\xfd\xef\x39\x2e\xa3\xd5\x48\xc9\xe7\x50\x0b\x43\x26\xea\x8f\x11\x77\x89\x63\xa1\x18\xb0\xc2\xb5\x1e\x18\x65\x6f\xd5\xfb\x5e\x53\x58\x79\xbe\x8b\xea\x53\x16\xbf\x42\x02\x1f\x33\xff\x0f\xdf\xb5\xb2\x86\xe3\xc0\xf4\xad\x6d\xb5\x13\x96\xa9\xbb\xa1\x15\xc6\x48\x1c\xb5\xe5\x96\xb5\x49\x7d\x6c\x8f\x92\x59\x6b\x7a\xfc\x20\xb5\x00\x6d\x7f\xda\x0b\xa7\x45\x02\xf3\xbb\xfc\x52\xec\x30\xff\xfd\xd5\x2f\xab\x7a\x83\x6a\x73\x9c\x27\x1f\x4e\x1a\xfd\xcd\x63\x91\x06\x62\x65\xfe\x95\xf6\xda\x74\xc7\x6d\xfa\x20\x8e\xf9\x50\x1b\x92\xde\x29\xf3\x74\x71\x53\x79\xfb\x9b\x4c\x27\xf2\xef\xff\x97\x0f\x23\x8e\x44\x98\x36\xa0\xdc\x10\xf2\x5a\x5e\x36\x57\xfe\x7c\x3e\x74\x3d\x59\xb2\x6f\xef\x0b\x43\xa1\x42\x86\xf6\x94\xe1\x1a\x12\xf6\xa7\xf5\xf4\x94\xa9\x02\x44\xfd\x7f\x35\x40\xdb\xd9\x46\x7e\xb7\xcd\xc7\x55\x8f\xbe\x58\x63\xf1\x65\x70\x33\x32\xe5\x41\xbc\x5a\x4c\x38\xe9\x67\xea\x9e\xa5\xd5\x92\x93\x3c\x3b\xac\x2b\x7e\x6a\x50\x53\x1e\x55\xfc\xd3\x1e\xe9\xb1\x3c\x63\x7c\xfe\xf7\x39\x23\x04\xbb\xf5\x9d\x42\xe8\xaf\x5d\x33\xa2\x3d\x7b\xf4\x1e\x9a\xe0\xb3\xaf\xe6\xec\x28\x77\xf9\x19\xc2\xef\xa1\x7f\xfc\x9d\x3d\x34\xb6\xd5\x1c\x81\x2d\x68\x5e\x1b\xd7\x73\xae\x98\xf5\x32\xf6\xa0\x4a\xe2\xf1\x7f\x71\xe4\x84\xcc\x25\x78\x19\x32\xaa\xbc\xba\x48\x89\x21\x9e\x33\xdb\x38\x0f\x4a\xfa\xf5\x5f\xe2\x07\x61\x86\xd2\xdf\x5e\x91\x2b\x4c\x3f\xb0\x0e\x30\x5b\xcc\xfc\xd8\xf4\x81\x0e\xe9\x8e\xa0\x21\xec\x5b\xd8\xfe\x8b\xa3\xef\x1a\xe8\x3b\x82\xe1\xe4\xfc\xfa\x44\xfc\x2d\x3c\x9f\xd3\x26\x51\x48\xde\x97\xf1\x4f\xdb\x61\x6e\x95\xde\xb4\x5f\xf0\x77\x19\xd2\x74\xa7\x78\xc6\x8c\xa9\xac\x79\x11\x9b\x6f\xfc\xff\x70\xdb\x70\x34\x1a\xc7\x2d\x16\xae\x9d\xab\x96\x3b\xa2\x2e\x14\x59\x84\x4a\x44\xab\x57\x16\xc2\x52\x3e\x8a\xdb\x46\xdd\xf3\xf2\x7c\x99\x5d\x87\x43\xbd\xa2\xc1\x12\x6a\xb5\x13\xbc\x1d\xf4\xfb\x08\x17\x4d\xc5\xbe\xb1\xfa\xff\x7e\x9e\x5a\x7b\xfe\xe0\xa9\x2f\xfd\x9f\x77\xf4\xb8\xf7\x4f\xfd\x49\x01\xba\xf6\xc3\xc7\xd1\x77\x1c\x73\x5c\xf6\xeb\x3f\xef\xae\xd7\x46\x76\x7a\x3e\x26\x8c\x8d\x26\x53\xc0\x79\x1d\x47\xac\xc4\xaf\x62\xc7\x4e\x29\xe2\xb1\xde\xe3\xbf\xba\x17\x18\x63\x23\x17\x28\x79\xea\x28\x57\x4d\x2a\x39\x64\xe9\x9b\x67\xd6\x18\x34\x02\x12\x4e\xc1\x4b\x83\x58\xba\xd6\x0f\xb9\xca\x22\x16\xae\xab\x1e\xe8\x34\x4c\x19\x87\x5a\xe1\x67\x17\xe7\xec\xbb\xfb\xef\xf9\xf0\x48\x3b\x11\xf5\x1e\xb7\x6f\x76\x9f\x09\xfd\xb8\xce\xc1\x3a\x29\x2d\xba\x9a\x03\x9f\xfc\x85\x3d\xe4\xd5\xac\x18\xbe\xa3\x0e\x24\x3c\x8f\x09\xfb\x26\xd7\xd6\x7b\x15\x8a\xa2\x37\x5d\xbe\x2c\xd9\xd4\xa7\xf3\x07\x0d\x26\xf0\xe6\xef\xdf\xdb\xf4\xd7\x23\x0f\xf5\x6f\xff\xe4\xfc\x45\x6f\xe7\x64\xca\x12\x3c\x87\xd1\xcf\xb9\xed\x10\x07\xda\x4a\x73\x5f\x5d\x9e\x6c\x6d\x0d\x98\x38\x11\xe2\x3d\x3f\xcc\xdd\x97\xad\xed\x95\x1c\x6c\xff\xf2\xc7\x0a\x30\xbe\xf7\x84\xe4\x77\xcb\x1d\x9e\x34\xe6\xbf\x1a\xef\x7b\xa7\x1e\x50\x17\xa7\x4c\x79\xb5\xd2\x09\x09\xd7\x90\xcd\xab\x50\xaa\xcf\xf7\x09\x45\x3c\x58\x2e\xab\xc4\x9a\x7b\xfa\xd2\xbd\xa5\x7c\x6f\xcc\x82\xa7\xc5\xd0\xcc\xc7\x7b\x7f\x8b\x9f\x16\x89\x14\xa4\x5f\x76\x0a\x7f\x84\xdf\x9e\xf7\x86\xf8\xf7\xac\x80\xb9\x7c\x00\xd8\x86\xea\xb5\x63\x3f\x9b\x2c\x5e\xfa\x5f\xc4\x22\xe4\x64\xff\xbc\xef\x30\x17\xf5\x1c\x8e\x74\x81\x1d\xcf\xbb\xc5\x0d\xfa\x83\x0a\xe7\xd7\x03\xa3\x27\x2d\x39\x78\xb5\xc5\xc0\x19\xae\xca\x39\x29\x43\x2b\x6d\x4f\x79\xfe\xd3\x93\x7a\xe7\x18\xc5\x27\x14\x2d\xcc\x02\xb2\xaa\x1e\xf3\xaa\xbb\x9e\xa0\x6d\x2e\x07\x27\x3a\x1c\x83\xd9\xfc\xe2\xf2\xa7\xc9\xd3\x60\x3e\xb9\x9a\xbc\x7a\x14\x8f\x06\x38\x63\xeb\xcf\x5e\x04\x5e\xff\xf4\xfe\x69\xbb\xbb\xbd\xce\x32\x2c\xda\x75\xb8\xc3\xb8\xb6\xe3\xf6\xc4\x66\x69\xfa\xfe\x19\xb8\xfd\xf2\x2b\x7e\xae\xc2\xa5\xe4\xa5\xeb\xe7\x07\x9d\xcc\x4f\x1b\x9f\x36\xa4\x37\xab\xaf\x01\xef\x8c\xa0\x8e\x15\x0e\x2a\x1e\xa4\x4f\xf4\xfb\xbd\xe6\xf1\x0b\x6a\xd6\xad\xae\x5a\x31\xa5\x65\x84\x91\xf3\x47\x7f\x44\xd9\x17\xdb\xf4\x3c\xaa\xde\xd9\x18\x63\x3a\x02\x62\x4b\xf4\x15\xfe\xbe\x43\xa6\x9b\x41\x49\x14\x5d\x77\xde\xa4\xac\xbd\x5a\x82\xb9\x23\x37\xa0\x21\x19\xbe\x05\xbb\x45\x14\xda\xe7\x2a\xb5\xbd\xcb\xd6\x53\x70\xa7\x4c\xff\xea\xaf\x31\xd0\x9c\x0f\x2a\x4b\x4a\x50\x7e\xec\x17\xb3\xa7\xae\x8a\x96\xba\xe3\x43\x16\xb2\x10\x34\x9f\xcf\xde\x84\x8a\xb6\xcc\xf7\x44\xcd\x6e\xd4\xfd\x23\x69\xfc\x5f\x1c\xdf\x8d\xeb\xdc\x3d\xb2\x20\x21\x91\xea\x17\x09\x9e\xdf\x62\x86\x10\x3c\x92\xbb\x78\xdb\x35\x60\x5d\xe6\xed\xa5\x55\xf2\x2a\x7d\xff\x45\x4f\x66\x78\x7d\xae\x26\x82\x43\xcc\x1e\x29\xe5\xbf\x9b\x07\xff\x50\x51\x38\x7a\x5f\x9c\x0a\x1e\x4c\x54\xce\x9b\x76\x88\xfc\xf8\x72\xea\xff\x9d\xd1\xf0\xb7\x5e\xb4\xba\xa3\xcc\xc0\xaa\xe3\x79\x63\x49\x6d\x7d\xdc\x08\xf8\xd9\x13\x46\x63\x35\xbd\x16\x0f\xe1\xbe\x32\x73\xaf\xb4\x0f\x39\x40\x39\x90\xab\xc4\xa3\xbc\x1f\xd3\x36\x50\xc3\x12\x2d\x92\x8e\x92\x28\x4a\x94\xf9\x43\x69\x36\x4d\xbf\x0d\x9f\xec\x6f\x4f\x4e\x3e\x5f\x1b\x8f\xff\x56\x3a\x93\x4a\x65\x45\x48\x96\x64\x3a\x73\xa4\x70\x75\x6f\x67\x0c\xaa\xb8\xe4\xd0\x2e\x9f\xbd\x91\xf0\x1e\xd4\x33\xc1\x38\x88\x9f\x5b\xfa\x05\xe6\x64\x7f\x47\xb1\x46\x80\xd9\xcd\x38\xd3\x91\x41\x78\x24\x56\xc3\x99\x13\xbe\xd7\x62\x48\x88\xab\xfa\x21\x87\x92\x7e\xfc\x9f\xd8\x92\xaf\x3c\xdd\xb1\xf8\xc1\x67\x85\x87\xd9\xc4\xc3\xb3\xb9\x68\xad\xdf\xa7\x46\x99\x51\xbf\xe3\x9e\x0d\xe5\x50\x1f\xe4\x8a\xfb\x6a\x3e\x07\xd2\x28\x8c\x99\x0c\xcf\xf7\x33\x47\xad\xc6\x17\xfa\x44\x0a\x82\xfc\xc8\xc4\x7c\xf9\x8e\xaf\x4a\x3e\xe0\xf3\x3e\xbf\xf4\xca\x0c\x8d\x78\xac\xea\x99\x6b\xaf\xfb\x7f\xbd\x90\xd4\x01\x81\xa1\xf1\xd1\x39\x7d\xab\xfa\x0a\x89\x77\x49\x43\xb5\xe5\x43\x2e\x49\x7a\x1f\xaf\xae\x24\xdd\xe6\x9e\x4d\x34\xe3\x09\x49\xcb\x95\x2f\x61\xe7\x4c\x42\x15\x86\x4e\xef\xb2\x35\x06\x42\xbf\xed\xa5\xb9\xa4\x84\x7e\x76\xc1\xf8\xfa\xab\x29\xe1\xef\x01\xe2\x28\xe2\x4b\xd1\xeb\xf0\xda\xc2\x3a\xe4\x94\xcb\x31\x82\xb8\x3f\x33\x29\x25\xe6\x93\x55\xf1\xfb\xce\xba\xc3\x5d\xdd\x61\xee\x93\x2e\xce\x5c\xb5\x50\x8c\xf9\x0f\x32\xe6\x16\xdf\x5b\x59\x98\x24\xfc\x96\x48\xee\xc8\xf6\xae\xbc\xab\xf7\xc5\xbe\x6a\x61\x41\xd0\x40\x9c\xac\x9f\xf2\xbf\x1e\x09\x7c\xa7\x54\x9c\x89\x95\x8f\xc6\xa6\x2a\x32\xd5\x67\x2e\x3b\x4d\x06\xa3\xc7\x1f\x1c\x73\xc1\xae\xc4\xfc\x34\x5a\xd4\xd8\x96\x96\x78\xce\x0c\xf2\x0b\x0a\x98\x7b\x3a\x0e\xb2\xe6\xcd\x45\x36\x8c\x31\xc4\x89\x73\x79\x1e\x2e\xa7\x91\xf4\x5f\xa4\x3a\x42\x7a\xba\xa8\x17\xff\x57\xec\x5e\x3e\x79\xe6\x69\x9d\xff\x9d\x35\x5d\xe9\x71\xd7\xac\x27\x1e\xc6\x0c\xa6\x87\xdd\xf1\xf2\xa0\x18\xe7\xef\xd7\x19\x87\x30\xdf\x30\xa4\xb0\x7a\xb3\xd2\x5f\x72\x8e\x66\x52\xf4\x6a\xaa\x0c\xd9\xd1\x44\xdc\xd3\x70\x11\xca\xe7\xa4\xb1\x79\xbc\xe0\x4c\xbc\x97\x23\x07\x69\xab\x72\xbc\x94\x62\x29\x49\x5f\x08\x92\xdf\x97\x60\x71\xe7\x9a\x1b\xe1\xdf\xb9\xb9\xdd\x8a\x4e\xc8\x5c\x45\x5f\x42\x35\x46\x83\x7b\xd2\x8f\xd7\xe9\xd6\x9d\x89\xb6\x08\xc4\x1b\xf1\x55\xff\x39\xa9\xc1\x3e\x83\xed\x28\xf3\xef\x81\x34\xdb\xda\x97\x56\x2b\xbc\x0a\x24\x7f\xf7\x17\xd6\xfb\x5a\x1b\x30\x8c\x24\x49\x8b\x39\x64\x0f\xd9\x25\xfb\x1b\xb9\xf6\x5b\x83\x20\x7e\xf2\x2a\xfb\x42\x80\xf3\xff\x77\x96\x65\xd6\xb7\x4d\x6a\x85\xf9\x8b\xb5\xb3\x57\x89\x16\x1a\x3e\xd7\x82\x5f\xf8\x13\xfd\x52\x1c\x03\x79\x75\xde\xaa\x04\x27\xf7\xa2\x1c\xab\xbf\x48\x83\x89\xc3\x88\x50\xe5\x3a\x63\x36\x4d\xf0\x7a\x29\xa0\x19\xa9\x3c\xe9\x88\x7e\x62\x92\xf0\xe5\xa6\x74\xb7\x38\x49\xc2\xef\x1c\x4c\x0d\xce\x09\xe3\xf3\xfd\xfa\x37\x96\x3e\x37\xae\x89\xf0\x40\x5e\xe3\x05\x82\x33\x0e\xee\x5f\xb3\x4c\x31\x40\x9a\xb7\xed\x13\x8f\x67\x31\x8b\x52\xf9\x6d\xfc\x87\xc0\x6b\xf4\x55\x9d\xad\x97\xe4\x77\xf2\x21\x66\x80\x8c\x34\x5f\x2f\x97\x45\x78\x9e\xa7\xfd\x66\x50\x1f\xf9\xc4\x46\xc1\xb6\x45\x5e\xed\x86\xb5\xcd\x0b\x07\x51\x27\x0e\xca\x29\x9a\x55\x69\xea\x05\x38\x7f\xe7\xe4\xaf\xb9\x50\xb9\x60\xfc\x7d\x65\x16\x0f\xa3\x29\xf6\x51\x8f\xe2\xbe\x44\x02\x55\x8e\xd7\x5e\x0b\xa1\x3a\x2e\xaf\xc4\x6d\x8f\x06\x96\x28\x55\x1b\x9f\x6f\x59\x0a\x06\x38\x91\x68\x76\x8d\xb1\x54\x92\x88\x9c\x23\x6c\xe9\xfb\x9c\x80\xa0\xcc\x34\x4d\xed\xc8\xc1\x37\xfd\xec\x97\x05\xdd\xb9\x70\x8f\x8e\xe7\x80\xf4\x99\xe1\xcc\x69\x85\xf6\x6f\x51\xaf\x71\x73\x64\x3b\x80\xe3\x4a\x78\xc4\x42\x95\x0b\xb7\x09\x6b\x11\x6d\x05\x52\x24\x9f\xf2\xb7\xab\xca\xa5\xff\xf7\xbe\xcc\x06\x94\xd0\xf9\xb7\x28\x7c\x74\x41\x99\x3e\x22\x97\x14\xb3\x41\xd3\x59\x7c\x8e\xca\x79\x17\xad\x80\xa8\x2b\x1f\x51\x5c\x94\x23\x32\x50\x34\x94\x62\xcd\xbf\xdd\x0d\x54\xfc\xa6\xbf\x84\xc7\x9f\x87\x4a\x21\xea\x57\xc9\x2b\x99\xab\x1f\x36\x44\x3b\x1b\xd3\xf9\x50\xd6\x68\x8c\x42\x9c\xae\xd8\x54\xcb\xc2\x1a\x5e\xa2\xf3\xcb\x3a\x29\x47\x10\xd6\x19\x28\x18\xd7\x61\x6f\x4c\x23\x73\xa3\x3b\x81\x0f\x29\xad\xb1\x73\xd5\x65\x49\xb4\xef\xbf\x95\x52\x75\xf2\x52\x50\xa7\x59\x20\xd2\xf9\xae\xf1\x88\xd4\x4f\xea\xbe\xf4\xa2\xdd\xb4\x32\xd4\x33\xaf\xf0\x86\x7e\xdc\xbf\x78\xbc\xb3\x6f\x7a\xf3\x8e\xad\x61\xb8\xcb\x17\xf7\x6b\xd3\xe0\xc9\x22\x5c\x57\x0e\xb1\xdd\xab\xa4\xa6\x55\xaf\xc3\x00\x08\x09\x0a\x97\x6e\x5d\x72\xb0\x50\x73\xb9\xe1\x97\x9b\x63\x99\xf5\x0b\x37\x25\x78\xd6\x4b\xa3\xed\xc2\x5c\x60\xc4\x44\xdf\xdd\xa9\x82\x76\x14\x2f\xf2\x92\x05\x47\x9d\x61\xa7\x2f\x7f\xcc\xb7\xa2\x23\xb1\x8a\xe8\x46\xf5\xba\x3f\xfe\xea\x07\xe5\xee\x40\x4b\x35\xda\xbb\x61\x63\x18\x3e\x4a\x6e\x2a\xf7\x51\x30\xbf\x80\x2a\x1c\x7c\x5b\x09\xed\x89\x10\x63\x18\x84\x0b\x0f\x8d\x57\x04\xc5\xe8\x11\xe4\x65\xdd\x18\xc5\x9b\x22\x9d\xc3\x58\x96\x4e\xf4\x0e\xeb\x4b\x09\xbf\xe1\x1d\x00\xab\x04\xa8\xfb\x28\xbf\x60\xc8\xcd\xbd\x4c\x67\x8d\x48\x53\xee\x5e\xa7\x8f\xdf\x2d\xdb\x08\xe6\x6f\x6e\xa7\xcb\x0c\xf7\xc2\x0b\xf6\x7b\x5e\x5e\xb6\xd3\x49\xa1\x01\xd4\x92\x40\x22\x36\x42\xb2\x00\x84\xe2\x02\x14\x50\x7b\x6b\x90\x5e\x61\xa2\x3f\x1d\x94\x9a\xbe\xa9\xf3\xa9\xd8\xef\xd2\x69\xd8\xef\x2d\x3a\x9e\xf3\xf6\x5b\x67\x29\x0f\xe6\x21\xc8\x0e\x2a\x91\x98\x9a\x5c\x37\x04\x9b\x3f\x19\x54\x76\xd3\xf8\x7e\x42\xc0\x33\x86\xdb\x13\x1d\x7e\x24\x66\xfb\xeb\x6c\x63\x84\xcf\xa8\xde\x7a\xda\x5c\x0f\x1f\xf5\x77\xaf\xa5\xd4\xb1\x63\x34\xea\xb7\x2e\x68\x38\x0e\x08\x9f\xc4\x36\x75\x24\x9f\x4e\x33\x30\x10\x5a\xc2\x11\xf6\x6c\x74\x7b\x9f\x10\x6a\x05\x88\x37\x56\x3a\xda\x78\x04\x8e\xe0\x04\x01\xe8\x3b\xf7\x9b\xb1\x41\xe9\x86\xb1\xa0\xef\x37\x47\xf3\x59\xe4\x51\xbe\x91\x16\xf5\xc7\x4f\x09\x52\xaf\x00\xbe\x37\xc5\xc7\xd6\x23\x30\xb5\xaa\x26\xe0\x4c\x40\xf1\xaf\xfb\xed\x1d\xb7\x0e\xc3\xad\x28\xc1\x08\x95\x6e\x53\x99\xff\xd8\x92\xfa\xb6\x67\x7f\xda\x46\xb9\x97\x51\xbb\xe4\xb3\xbe\xd2\x0e\x07\x67\x90\xb1\xe2\xe5\xb6\x64\x0b\x6e\x3e\x64\x02\x34\x4d\xc4\x2a\xe9\x34\xd2\xeb\x06\xce\x69\xdb\xe5\xc5\x53\xe1\xcf\x9c\xc2\x60\xfa\xc6\x8e\x3c\x45\x0b\x5f\xa9\xeb\x0c\x4c\xfa\x01\x71\x03\x20\xda\xd4\x72\xb4\x00\x37\xf5\x1b\xa8\x84\x2c\xca\xd2\xd7\x62\xbf\x9b\xb9\x6b\x9a\x24\xb5\x55\x86\x21\xcd\xe8\x27\x6a\xf7\xe2\xcf\xc3\xe2\x15\xa3\xa7\x06\x89\x84\x64\x41\x94\x12\xd9\x9a\xbd\x17\x80\xbc\x21\xeb\x66\x7c\xc7\xf3\xeb\xc0\x6f\x1e\xae\xb5\x08\x34\xe3\xb0\xa6\xc2\x70\x4f\x3f\x22\x18\xae\x9d\x88\x71\x5a\x71\x15\x3e\xcd\xe3\x09\xb3\x57\xc1\x01\x07\xb0\x9b\x7d\xaa\xbd\x69\x10\x84\x34\x4d\x0c\x71\x8e\x2e\xad\xe8\xf1\x86\xdc\xfb\xee\x7d\xc4\xe9\xb1\x7b\x82\x8b\xb1\x65\x38\xb8\x77\xfe\x8f\x7f\xbf\x47\xa8\x01\x69\x64\x1a\xcf\x60\x4e\xf9\x4d\xc0\x51\x79\x5d\xbc\x09\xd0\x1e\x0c\xf9\x64\xbd\x6c\x6b\xcc\x1b\x5d\x38\x88\xc5\x15\x00\x1b\xf4\x24\xc4\xbe\xb7\x73\x39\x28\xf1\x43\x4a\x7c\xb4\x85\xc5\x46\x3b\x0d\x66\x38\xdf\x2f\x3e\x56\xeb\xb6\xae\x83\x5a\x00\xa6\x8f\x02\x66\x58\x89\x3a\xdb\x03\x70\x66\x04\x3b\x91\xda\x1d\x17\xfb\xd2\x8c\xd2\xe0\x48\x86\x4d\xdf\xeb\xef\x2b\x3d\xfe\x4a\xa3\x5c\x5c\x71\xc5\xa5\x2c\xc2\x02\x81\x63\x02\x99\xc2\xf4\x96\xf1\x15\xa0\x60\x03\x0c\x76\xd5\x7b\xb2\xf5\xef\xae\x3f\x09\xa6\xa5\x01\x12\xc3\x08\x1c\xc8\x7b\x8d\x33\x2d\xb3\x70\xbd\xaa\x20\x37\xee\x15\x6e\x02\xbb\x88\xba\x04\x08\x2d\x3a\xe1\x4c\x96\x39\x77\x8e\x8c\x31\x01\x86\xd9\x8e\x55\x79\x2d\xd3\xcd\x9a\x0b\xf1\x0e\x29\x31\xef\x6c\xa9\x1c\xe5\x73\xf8\xf3\x9f\xf4\x7f\x5e\x46\x0a\xc3\x43\x1d\xe1\x78\xf3\x03\x7f\x1e\x5d\x36\x72\x16\x6b\xe1\xe8\x57\x52\x7e\x7c\x8e\x70\x29\x7e\x19\x52\x1e\x1d\x81\x09\x6e\xc1\x94\x3d\x60\xf6\x79\x0b\xa6\xbb\x75\x26\xbb\xe1\x34\x68\x6c\x4a\xa7\xc0\x94\x41\xb2\x11\x83\xf0\x1a\x6e\xef\x02\x47\x28\x00\xae\x46\x7e\x80\x7d\x60\x02\xb8\x4a\xfc\x27\x84\xde\xb7\x22\xbd\x6d\x51\x29\x11\x13\xd6\xe1\xa2\x14\xaf\x97\x61\x00\x36\x84\xae\xf7\x54\x22\xfe\x6f\x5d\xf2\x77\x1d\xe5\xa8\x13\xf5\x26\x9e\x9f\xb2\x96\x66\xa2\x59\xaf\x96\x8f\xe4\x0f\x53\xcc\x00\x8a\xf1\x59\x08\xc5\xb6\x7b\x72\xf6\x04\x67\x90\x00\xe0\x63\x62\xd8\xce\x4c\x51\xcd\xe3\x8c\xdc\xc6\xbf\xc6\x35\xac\x58\xad\x82\xd6\x3c\x44\x65\x07\x46\x17\x6c\xbd\x13\x10\x41\x1e\x60\xb9\xbf\x2e\x31\xb1\x6c\x0c\xe0\xd4\x04\x14\x2a\xc2\x87\x3f\x18\xa2\x3e\xd8\x70\x31\xb8\xbc\x9f\xb3\x6c\xdf\x5e\x92\xf6\xe7\xa9\x7a\x73\x89\x6d\xc2\x5a\x88\xd5\x50\xc6\xed\x97\x19\x48\xfe\x83\x80\xa8\x6a\x06\xef\xce\xf1\xb6\x19\x1c\x73\x42\x16\x45\x15\xfc\xa0\x6f\x0b\x37\x02\x04\x61\x38\x18\x44\x22\xdf\x69\x86\x6a\x8d\x3a\xc3\x4d\x94\x27\x8e\x41\x3e\x37\xc1\x3b\x47\x5f\x7e\x85\x78\x70\x9d\x50\x3d\x1c\xc7\x39\x62\xa7\xe6\xbd\x14\x19\x51\x10\x0b\x43\xd0\xfd\x3c\xc9\xf6\x69\x08\x4b\x41\xe8\x92\x31\xa0\x3b\x63\x60\x1b\x25\x62\xd6\xf7\xf5\x5f\x7d\x51\xe9\x65\x99\x97\x05\x16\xd1\x31\x21\x99\x51\xe4\x9b\xdb\xb9\x5f\xe6\x62\x7a\x06\x18\xb0\x21\x73\x30\x19\xdd\x22\x16\x29\x05\xe0\xf0\x13\x1c\x20\x61\x7a\x9e\x76\x0b\x2f\xf5\xad\x20\x64\x01\x7e\xec\x5a\xe3\x2d\x24\x6d\x57\xcf\xf6\x1e\xe1\xb9\x0c\x7f\xcf\xc8\x01\x27\x66\x20\x9a\x7c\x3f\x37\x2a\xb4\xd8\x08\x3a\x21\x98\x1e\x3f\x61\x00\xb0\x67\x79\xf9\xc2\x30\x3e\x58\x35\x63\xff\xb5\xf4\xc1\xf8\x82\xe7\x41\xc6\x1e\xfe\xd5\xba\x8b\x77\x2b\x90\x08\xcc\x0b\xc3\x2c\x26\xee\x50\xe2\x38\x72\xd0\x09\x2a\x59\x98\x14\xd8\x96\x84\xe0\xf6\x1f\x08\x23\xbb\xcf\x37\x71\x18\xe1\x42\x01\x06\xaf\xbf\xd5\x02\xa6\xa7\xae\xe1\x56\x7c\xc3\x5a\x45\x0f\xc0\xb2\x38\x19\x1a\x58\x19\x9e\x4b\x19\xc7\x18\x70\x11\x25\xf9\x86\xaf\x04\xee\xd6\x44\x0f\x27\xfa\xce\x83\xb3\x07\xa0\xa3\x51\xa4\x71\xb3\xef\x9b\xc9\x10\xdc\xd8\x7d\x55\x94\x9e\xab\x4f\xd9\x30\x06\xe5\xdd\xe3\x8f\x48\xf8\x77\x2d\xf9\xf7\x4b\xcc\x60\x6a\x7b\xfc\x76\x46\xba\x6d\xdb\x64\x45\x94\x38\x7c\xbb\x2d\x32\x01\x78\x6d\x3d\xd8\x1e\x14\xee\x45\xea\x24\xca\xdb\xa6\x8c\x23\xc2\x50\x64\x72\xfd\x3c\xe9\xe5\x11\x9f\x2c\x1d\x62\x5a\xa3\xd1\x7a\x66\x72\xff\xc6\xcf\xda\x22\x11\xc5\xd4\x14\x08\x32\x7d\x87\x80\x22\x7f\x81\x4a\x9e\xdf\x0f\xe5\xbb\xfd\x40\x00\x98\x83\x00\x50\x65\x91\x13\x1b\x34\x30\x81\x8e\x90\xb0\x4f\x43\x59\x62\x2b\x13\x4d\x41\x40\xe3\x81\x07\x95\xc3\xdf\xbe\xa1\xf0\x5d\x2d\x9f\x2d\x4d\x0e\xa4\x85\x41\x44\x29\xfb\x92\x59\xa4\x36\x0a\x24\x1b\x00\xb0\xb8\x72\xdd\x83\xde\x6e\x45\x17\xbe\x37\x9c\x4b\xe6\xa4\x31\xee\x5c\x39\xb4\xaa\x4f\x2d\xaf\x19\x80\xec\x43\x62\xe7\x04\xc2\x21\xba\xdc\x35\x49\xfe\xf6\x8f\xc3\xbf\x8a\x58\x72\x82\x43\x89\x33\x08\x82\x56\x3b\xf4\x18\x59\x46\x40\xf8\x19\xc3\x9c\xa8\x33\x13\x8f\x9a\x31\xae\x79\x7c\xbc\x0a\x7e\x2f\x77\xb5\x19\xed\x89\x20\x56\xef\xee\xdc\x96\x3f\x2d\x25\xca\xd1\x1c\xec\x54\x16\xf8\x58\x18\x16\x09\xa7\xcb\xea\x67\xce\x05\xe1\xbb\xb5\xf3\x3c\xaf\x2b\x9c\x87\x3b\x4d\xb3\xc7\x66\xed\xe8\xa0\xb4\x36\xfc\xec\x2d\xe7\x10\xaa\x4f\x81\x02\xa8\xf7\x82\x9f\x19\xfc\x59\xc1\x46\x00\xa7\x3b\xaf\x23\xdf\xf8\xcf\x2b\x7d\x4a\x74\x10\x33\x1b\x98\x60\xae\x60\xda\x0d\x1c\xea\x73\xad\xb0\x79\x95\x68\x1a\x81\x6b\xf4\x25\x79\x31\x16\xaa\xe6\x4c\x3d\x5f\x9b\x14\xd3\x38\x1b\xe6\x32\xb1\xe9\xdb\x8b\xe6\xf7\xf7\x5f\x6d\x79\xa8\x0a\xaf\x66\x72\xca\x22\x4b\xe3\x6c\xaa\xfe\x69\x31\x85\xcc\xef\x15\x50\x31\x64\xff\x13\x80\x82\x2e\x00\x5b\xb2\x81\x99\x6e\xa4\x77\x37\x7b\xeb\x26\x1a\x67\x91\x03\xf6\xc6\x2b\x58\xbe\x3c\x7b\x04\x45\xfd\x12\x3d\xb8\x68\x19\x8a\xaf\x9f\x13\xd2\x49\x75\x3f\x5c\x81\x51\x62\x02\xd5\xaa\x39\x0a\x0e\x37\x0a\x07\xcf\xb6\xec\x7c\x9b\x39\x88\xc2\xf0\x2f\xae\x5b\x34\x06\x38\xbf\x11\x09\xc4\x97\xc9\x8d\x0b\x4e\x9e\x93\x5c\x59\x32\xfa\x4d\x26\x62\xce\xaa\x3b\xa6\xfd\x9d\x39\xaa\x8a\xea\x8d\x18\xd4\x86\xfa\x3b\xcc\xa6\xba\x0f\xfa\x4f\xd9\xb0\x5d\xf8\xad\x15\xa2\x40\x78\xce\x24\x7a\x92\xb4\x96\x75\xd3\x85\xf4\xc9\x4d\x39\xb1\xd1\x19\x43\x10\xdb\xc9\x00\x36\x0a\x0b\x3e\x0c\xbf\xf7\x8d\x71\x28\xca\x7d\x57\x6e\x3c\x6d\x13\x90\xf6\x2a\xc2\x99\x6c\x58\xaa\xf1\x49\xe8\x4e\x06\x10\xa2\x2f\x00\x3b\x02\x70\xb4\x07\x51\xda\x96\xbc\x6e\x04\xc7\x10\x80\x44\xdd\x6c\x5d\x0b\xd7\x77\x7f\x3f\x52\xb8\x7d\xa3\x35\x68\x59\x2a\x9c\xda\xab\x06\x6a\x92\xde\x3f\xbd\x68\xe0\x00\x35\x8a\xf7\x3f\x8a\xa4\xde\xe9\x00\x25\xba\x0f\x45\xdf\xf6\x9d\x9c\x84\xb0\x8f\x99\x29\xee\x76\xd4\xb2\xbd\xd4\xf9\x64\x22\xcd\x14\xa9\xd1\xb5\xed\x4e\x32\x79\xb7\x43\x09\xad\xfe\xd0\x62\xe2\x40\x0d\xe8\xe6\x04\x08\x0d\xf1\xb8\x63\xa0\xf4\x99\x8c\x34\xc7\xa1\x1a\x38\x39\x86\x6d\xfa\xb2\x43\x98\x26\xf2\xef\x1f\x16\xae\x1d\xac\xea\x94\xf0\x3b\x59\x59\x05\xf3\xe8\xf8\x64\x98\x6f\x2d\x85\x4d\x6e\x48\x77\x11\x88\x9c\x0a\x17\xd0\x06\x13\xdb\x06\xd6\x4d\x32\x6a\x27\x39\xf5\x57\x41\xed\x8e\x69\x5e\xc6\x41\x62\xaf\xcd\x23\xe7\x41\x82\x8c\x26\x84\x4f\x06\xc7\xbe\x6b\x7f\xb5\x0c\x2a\xd4\xa3\x90\x16\x5d\xbd\xfa\xe1\x52\xf3\xe4\xf6\x95\xee\x4b\x96\x81\x3b\xa5\xa3\xec\x6e\xf7\x57\x25\x59\x3d\x23\xec\x2a\x5e\x96\x3f\x08\xb1\xd0\x97\xa3\xe9\xdd\x42\x4a\x7c\x3d\x01\xd7\xa5\x80\x85\xdc\x81\x23\xa9\x11\x8b\x0f\x4f\xd6\x16\x91\xe2\x90\xba\x76\xd0\x5d\x77\x22\x98\xc3\x8e\xd5\xb3\x2f\x33\x21\xdf\xcd\x24\x3f\x8c\x66\x0d\xeb\x56\x00\x31\x82\xa6\x01\x1b\xc6\x57\x2a\x40\xb6\x9a\xdc\x5d\xa0\xfa\xd8\x12\xc2\x97\x80\x5c\x4c\x83\xb9\xa6\x83\xcc\x1b\x03\xc7\xb5\x27\x04\xb5\xb1\xb3\x9d\xce\x9c\x8a\x9b\x3f\xa9\xcc\x8c\x36\x4b\x48\xe2\x77\xbc\x69\x99\x38\xc3\x9e\xff\xf3\x69\x79\x91\x69\xae\x5e\x87\x7e\xdc\xa1\xf2\x7c\x90\xa8\x2b\xf9\xe1\x38\xf6\x66\x74\x23\xa5\xac\xf4\x71\x01\xa4\x73\x03\x0e\x8b\x14\x66\xf5\x7b\x3d\x35\x05\x32\x85\xab\x5f\xf2\x84\xcc\x6c\x4b\xa7\x2d\x1b\xc6\xad\x27\x6d\x5d\x92\xfa\xfa\xf7\x0d\x64\xb2\xc0\xba\x05\x83\x73\xf4\x39\x38\xd7\xf3\xfc\x28\x59\xdf\xbd\x43\x31\x2c\xfa\x06\x1b\x5c\xf3\xce\xd0\xbf\x69\x35\xad\xde\xeb\xb4\x32\x26\xe8\x06\x08\xf5\x48\x59\x6e\x5a\x66\x2f\x5f\xe6\xa3\x1e\x20\xd8\x56\x33\xc0\x69\x82\xaa\x79\x25\x9c\x8e\xe1\x3a\x44\x24\x68\xd0\xff\x5c\x23\x6a\xfe\xbc\x57\x7e\xbf\x1e\x05\xc8\x26\xee\x24\x9b\xea\x06\x77\x6e\x80\x83\xc2\xc9\xb1\xe4\x96\xf2\x09\x9c\xf1\x4e\x0a\x31\x4c\xb3\x48\xe2\x91\x66\x3d\xcd\xb1\xd2\xcb\x26\xab\x3c\x29\x76\x3f\x20\xb7\x1d\xe1\x7f\x65\x3b\x75\xcf\x5f\xb7\x01\x49\x4f\x58\x42\x3b\xe5\x44\x46\xe8\x15\x1b\x72\x17\x02\x3d\x55\x0c\xdf\x05\xa5\xc8\x43\xaf\x6b\x02\xa7\x15\x03\xe4\xe6\xf4\x8f\xdb\x75\xf8\xc5\xee\x6e\x64\x43\x1c\x6e\x69\x92\xc2\x88\x60\xda\xd7\xde\xeb\x36\x91\xb9\x52\xcb\xd9\x3b\xfb\x80\xaf\x66\x96\x67\xb9\xbb\xe8\x1c\x78\xa2\xdf\xd0\xfe\xab\x4b\xe5\xf9\xc7\xb5\x4b\xb5\xc0\x01\x24\xfc\x1f\x1e\xc3\xfc\x16\x8f\xe3\x74\xf1\xd6\x93\xed\x8e\x44\xa7\x95\x33\x3d\x35\xd3\xdc\x34\x8d\x5a\x73\xa8\xad\x3e\xbf\xd0\x10\x41\x21\xe7\xd7\xe9\x21\x78\xa3\x17\xcf\x64\x92\x1c\xe6\xec\x38\x44\x08\x8a\xa2\xb8\xa9\x59\x7c\x06\xfe\xb3\xb7\xcd\x35\x9c\xbb\x50\x27\x04\x81\x5a\x08\x20\xb7\x1a\xb5\x78\x41\xd0\xf7\x78\xe7\xe7\x78\xc2\x2d\x2b\xf5\xd0\x3d\x83\x99\xe9\x84\x39\x87\x61\x59\xd6\xf5\xc4\xde\xa2\x73\xdf\xb8\x54\x2d\x59\x89\x83\xeb\x71\xdb\x73\xfd\x08\x7f\x67\x93\xd6\x35\x44\xa3\x01\x84\x67\x66\xf8\x52\xf2\xb9\xfd\x69\xf4\xa7\x80\x70\xab\xe5\x18\x44\xb1\x6a\xeb\xfe\xc3\x18\x62\xc3\x3f\x44\xb0\xc5\xec\x93\xae\xc3\xab\x86\x47\x39\x0e\x6e\x23\x12\xb9\x65\x28\x9a\x3b\x7c\xfb\x60\x75\xf1\x26\x4b\x1e\x9a\x09\x3b\x85\x45\x5e\x00\xd7\xdb\x88\xf9\x8b\xdf\xa2\xbc\x00\xb9\xa1\xb4\x81\x14\x98\x47\x45\xec\x9a\xbe\x2e\x00\xc8\x12\xc0\xef\xa2\xb3\x95\xfd\x43\x8b\xeb\x84\xd9\x91\x75\xd9\x36\x93\x11\x97\x8e\x48\xa2\x32\xef\x5f\x0c\x52\x29\x22\x24\x82\x13\xc1\x1e\xd5\x96\x67\x1c\x86\xd9\x54\xba\xaa\xa1\x14\x15\x48\x65\x59\xc4\xaa\xe5\x9f\xe3\xd8\x7d\x85\x02\x49\x94\x4c\x4c\xc9\x9a\xe1\x1c\xdb\x1f\xf3\xaf\x56\xfc\xa5\x0b\x5f\xce\x80\xcb\x26\x84\xe0\x2f\x26\x1a\xe9\x5b\x11\x58\x5f\x81\xd9\x66\x4e\xe0\xa1\xc7\x3d\x3c\x25\x12\x72\x33\x26\xdb\x00\x36\x31\x1c\xf2\x4f\xae\xfc\xa2\x3d\x1e\xba\xfc\x37\xaf\xb7\x04\xe3\xa8\x78\xf0\x62\x2e\x5e\xfd\x60\xb3\xac\xc8\xf7\x5a\xdb\x73\x06\xf7\xd7\xb1\x08\xb1\x15\x1d\x87\x66\xca\x4f\x23\xf0\xd7\xe4\x1d\x27\xc0\x75\x8c\x68\xd3\xc3\xfc\x22\x1b\xdd\x40\xfa\xc3\x21\x4c\xb6\x12\x90\x28\x7d\xb5\x7f\xbc\xd6\xbe\xa0\x6b\xfc\x07\x4d\xac\x90\xf1\xa6\x2c\x11\x2f\xf1\x12\x4c\x10\xb1\xbe\xdf\x35\x55\xdb\x02\xb2\xa7\xe9\x4d\xa6\x9a\x09\x56\xab\xfc\xfd\x28\x98\x21\x37\xa6\xc4\xa0\xfe\x78\x76\x09\xf2\xbe\x6f\x7f\xfb\x51\x3c\x6f\x70\x75\x46\x98\x66\x80\xaa\xbf\x1f\x13\x3c\xe1\x2a\xcc\x21\x27\x5e\x91\x78\x9d\x37\xe5\x7e\xf5\xc2\xc8\x3f\x36\xf5\xe5\xab\x5f\xb8\xc9\x45\x28\x82\xf8\x77\xc8\x6b\x8c\x76\xbe\x1c\xbe\xf1\xde\x47\xe7\x7e\x3a\xce\xdf\x7d\xcf\xf3\x74\x14\xf9\x19\x25\x0b\x7a\x16\x6c\x1c\xfc\x7f\xef\x1f\x8b\xb7\x37\x81\x9d\x36\xba\xd8\x54\x38\x2b\x99\x77\x32\x2f\x4f\x87\x3a\x8b\xc6\xd7\xa5\x45\xf6\x98\x49\x11\x5d\xc2\xc6\x3d\x0f\xa2\x17\xf0\xeb\xb7\x6d\x04\x52\x15\x09\x5c\xc1\x40\x41\x71\xe8\xfc\x1b\xbd\x2a\x4b\x0d\xf8\x1c\xe2\xef\x07\x63\xb0\x69\xe6\xb6\x51\x06\xdf\x8e\xbc\xd6\xf3\x52\xbc\xcb\x13\x14\xe9\xb9\x62\x82\xdf\x79\x75\x5b\x40\xa9\x34\x06\x7a\x45\x2d\x31\x8e\x6c\x23\x3d\x4f\x47\x22\x3f\x5f\x83\x04\x00\x24\xd4\x3f\x44\x7c\x85\x6e\xc1\x12\x29\x87\xac\x93\xdf\x96\xb9\xab\xc9\xa1\xfe\xbf\xcd\xab\xfb\x47\x12\xe0\xda\x04\xfd\xc2\x90\xb4\x56\xdf\x4b\x7c\x57\xb6\x22\xe7\x3c\x5d\xe7\xa8\x1b\x95\x2e\x4f\x82\x6e\x1d\x8e\xdb\x99\xe0\x6c\x7b\xe9\xea\xeb\x7e\x23\x08\x62\x36\xca\x46\x21\xce\xd7\x3d\xd6\xf1\x06\x58\x4a\xb9\xf8\x17\x19\x67\xb3\x73\xe5\xd7\xac\xc8\x33\x51\xf9\x72\x76\x38\xba\xff\x2f\x28\xe0\xa0\x5f\x45\x51\xfb\x2f\x05\xa1\xea\x5e\x5d\x0d\xdf\x98\x46\x00\x9a\x6d\x89\x85\x04\xea\xdb\xf9\xc1\x58\x3e\x77\x99\x1d\xd8\x17\x7e\xab\x9a\xa0\x9e\x59\x3b\xd5\xf2\xfd\xb6\x56\xdd\x26\x9d\x03\x26\x96\xab\x0e\xb5\x17\x81\xfb\x38\x52\x32\x8f\xcf\xfe\xd7\x3f\xf2\xd4\x96\x20\x19\x1a\xe0\xfb\x81\xd8\xf7\xcf\x9d\x62\xc8\xd1\x17\xf4\x13\x13\x9e\xce\xc9\x60\x9c\xb1\xcf\x0d\x3f\xa6\xe6\x82\x15\x67\x89\x75\xc7\x5c\x5c\xbe\xe5\x10\xa0\x21\x7f\xbf\x0b\xdb\xb6\xf6\xe2\xb3\xff\xdc\x54\xe9\x66\xfc\xc5\xb0\x2e\x40\xad\x2b\xd0\x3d\xcb\xf5\xb8\x21\x3e\x7e\x39\x5f\x3b\xe0\x70\xc1\xa8\xb4\x4c\x8a\x66\x06\x08\x0b\x5a\x79\x1a\xe9\x19\x43\x5e\xa3\xca\x0d\x43\xb8\xdf\xf0\xdd\x42\x2e\x01\x71\x9e\x44\x5b\xf7\x9b\x64\xb3\xed\x53\x6b\xa4\xaa\x58\x2b\x51\x9e\x40\xff\x9d\x7d\x3e\x13\x47\x37\x50\x9e\x61\x40\x76\x3c\xb4\xdc\x08\xa6\x99\xf2\xb2\x7c\x28\x94\x76\xec\xb9\x0f\x29\x17\xa6\xf9\x9c\xb3\x73\x2e\x3b\xce\x4d\xf3\xfc\xf8\x85\x11\x9f\x71\x71\x26\x63\x20\x4e\x01\x02\xfa\x10\x51\xcb\xd2\xc2\xde\x2e\x15\x92\x66\x11\xf2\xca\xf7\xb0\xff\xb8\x6b\x35\x3e\x98\x11\x68\x9c\x40\xa3\x18\xfb\xfd\x6c\x49\x00\x51\x46\x17\x6a\x4f\x65\xd0\x52\x33\xcb\xfe\x3c\x51\xfb\x11\xf1\x3b\x42\x14\xcf\x6f\xfb\x94\x88\xf3\x4b\x06\x6f\xda\xb1\x5b\xe5\xa4\xe2\xc5\xff\x01\x54\xe2\x9d\xa3\xd2\xb3\x6d\x55\xe8\x71\xfc\x4e\xff\xff\xcf\x5f\x4d\x1c\xc7\x19\x2c\x4f\x30\x51\x82\xf9\x45\xa6\xe8\x10\xa6\xfa\x8a\x1d\xdd\xa6\x61\x1b\x16\x68\x65\xfd\xf5\x1e\x2f\x77\x3a\x33\xd2\xe0\xdf\x2a\xc1\x50\xbc\xe4\x7e\x35\x3b\x63\x72\x8a\x83\x52\xc3\xb0\x2c\x7c\x1f\xe3\xfe\xdc\x3c\x2f\xb3\xf3\xe8\x3d\xfe\xe7\x17\x7a\x19\xd0\x86\x50\x1c\x57\x1f\xf9\xd9\x89\x92\xf3\xf4\x2b\x0e\x00\xf2\x97\x51\x5e\x97\x0e\x79\x3e\x41\xae\x67\x67\x06\x94\x18\xc4\xdc\x1b\x41\xb2\x12\x89\x8e\x29\x92\x3b\x89\x97\x0f\xfd\xfb\xc7\x82\x66\x46\x63\xee\x7c\x0b\x4e\xa6\x21\xc8\xfa\x64\x6a\x75\x7f\xdf\x7e\xe1\x1f\x07\x14\x34\xfc\xa8\x3f\x34\x2f\x81\x0f\xae\x39\x3d\x45\x3e\x35\x33\x3a\x5f\x51\xd5\xb2\x0f\x98\x0b\xb0\xc5\xc3\x19\x0e\x7b\x48\x0f\x62\xeb\xf0\x3c\x35\xa5\x7a\x78\x4a\xee\x70\x93\xef\x10\x2b\xd9\xd4\xdc\x3b\x79\x7f\xfd\x38\xfa\xf2\x6e\xf8\xe7\x62\x85\xfe\x70\x35\xf3\xcf\xcf\x73\x27\x82\x64\xfa\xc7\x7e\xde\x0d\xf3\x39\x06\x1b\xf6\x84\x2f\x30\xda\x2b\xbd\x3b\x05\x66\x26\x10\xa6\xf9\x61\x8f\xf2\xef\x8f\xf8\xb1\xdc\xf6\x71\x2e\x63\x33\x4c\x93\x5c\x77\xec\xdd\xdb\x8f\x45\x74\xde\xe5\x92\xdc\xba\xaf\xcc\x4a\xab\x2d\x07\xc4\xd4\x93\x62\x5b\xfb\xd3\xbc\x0d\xfd\xfa\x66\x90\xd2\x43\xf2\xe0\xbd\x7e\x80\xc6\xda\x8d\xa9\x84\x48\x9f\x60\xd2\x63\xc8\xae\x00\xe1\x8f\x3e\x05\x6d\x6c\x0b\x66\xbf\x9d\x48\x34\x98\x1d\x12\xfb\xfe\x89\xa7\x69\x5e\xd0\x32\x08\x35\xfe\xf5\x21\x46\x8e\xf8\x72\x2c\xf2\xd4\x5c\xe9\xf0\xff\x6a\xed\x5d\xd1\xc6\x16\xc7\x25\x08\xc2\xae\x7f\xef\x8c\xe3\x12\x48\xb7\x89\x8d\xcb\xc2\x61\xb3\x36\x94\xbf\x9d\x1c\xc2\x3e\x8a\x41\x7f\x62\x47\x5a\x3e\x64\xcb\x60\x38\x32\xc0\xcf\x99\x31\xdc\x5f\x6f\xa1\x41\x01\x86\x93\xa0\x10\x56\xbf\x97\x70\x8c\xc6\xc5\xfb\xc2\x2c\xe8\xf0\x57\x1d\x13\x32\x9a\xcd\xdf\x59\xed\x6b\xda\xd8\xcd\x0f\x20\xf0\xef\x84\xf1\xe0\xcd\x0d\x3c\xaa\x8b\x4a\xa1\xfd\x7e\xfa\x1e\x09\x97\x88\xc4\x9d\xc8\xdb\x79\x84\x83\x15\x53\x5d\x44\x9a\x04\x30\x1f\x88\xfb\x28\x9f\x8a\xbb\x3f\x31\xe0\xf7\xfd\xc6\x08\xc4\x54\xe0\x62\x70\xa6\x10\x4b\xa8\x75\xc4\x97\xb6\x18\x6b\xe9\x6f\x4f\xf5\xf1\x64\xe5\xa7\x49\x60\x42\x8b\x40\xd5\x59\x6c\x92\x1a\x11\xc9\x46\xbe\x45\x73\xa8\x9f\x88\xb9\x31\x3c\x82\xd0\xe6\x8e\x18\x6e\xd8\x89\x70\x09\x47\x20\xd7\x01\x87\xfa\x95\xeb\x0e\xb5\x90\xb2\x08\x98\x45\xb3\x57\xbf\x9a\x89\x2f\x52\xbe\xad\x22\xcd\x61\x02\xdb\xde\xfa\xbf\xbe\xa6\xe7\xe5\x8d\x75\xa4\x48\x31\xe5\x5d\xfc\x0e\x0b\x8e\x4e\x41\xce\xa9\x24\x72\x6b\xd4\xcb\xb7\x83\xfd\xea\x4c\x81\x56\x78\x47\xe7\x3b\x5b\x3c\x0b\xc2\xdc\xf8\x94\x2f\x35\xe5\x6d\xf7\x34\xf8\x42\x0c\x62\x88\x7d\x88\x97\x7b\x09\x02\x06\x98\x59\x91\x65\xa2\x1d\x29\xe1\x6d\x78\xcb\x7f\x58\xf4\x28\x21\xad\xfa\x22\x9c\xf6\x34\x45\x09\xa4\x32\xc5\xd1\xf9\x0c\x39\x6b\x66\x15\xd1\xed\xf2\x24\x2d\x58\x56\xa5\x5e\xa5\xf4\x60\x6f\x5a\x22\xee\x50\x02\xc0\x8f\x45\x5f\x65\x1e\x4d\xeb\x02\xa9\x52\x80\xb6\x23\x91\xf0\x3c\xbd\x7e\xab\x4f\x81\x70\x65\x06\xf3\x33\xaf\xb8\x3c\xd5\xa8\x50\xa6\xc4\xdc\xfb\xfe\xbf\xf7\x79\x19\x90\xc2\xed\x86\x6c\xc1\xd4\xf1\xd1\x24\xc9\x0c\x18\xf6\xaa\xb1\x9d\x60\x2e\x73\x5e\xe2\x0d\x69\x68\x28\x62\x38\xc9\x44\xc9\xe6\x39\xd8\x95\x2b\x2a\xbb\xaf\x81\xfb\x1b\xc3\xb2\xde\xa5\x6d\xd7\x14\x9a\x99\x6b\xfa\x62\x1b\x4f\x13\xb2\x18\x6d\x63\xde\x19\x71\xfe\x6e\xff\xfc\xfb\xef\x7e\x7c\xa6\x7f\x6b\x2f\xa0\xbe\x81\x1c\xad\x80\x6b\x0a\xd3\x1d\xf4\x17\x16\xd7\xdd\x05\x2a\x25\xbc\x32\xd5\x26\x50\xac\xbc\x29\x2f\x48\x02\x00\x23\xbf\x7f\x48\xef\x56\xad\xe2\x7a\x15\x5c\x6f\xf2\xed\x64\x25\x38\xd1\xb1\xb9\xa3\x1a\xb6\xcb\x82\x32\x58\x14\x42\xe9\x62\xfe\x21\x73\x98\xfc\x6d\xcf\xc3\x76\xe4\x74\xbc\x40\xfb\xb9\x5f\xfd\xe2\xe8\xd8\xfb\x7f\x9e\x79\x0f\x37\xe7\x4f\xa4\xcf\x01\x72\xb2\x4e\x33\xc0\xd1\x0c\x26\xf1\xba\x27\x55\x32\x69\x65\x54\x26\xed\xf3\x81\xfc\x09\xf2\xab\xa3\xcb\x8b\x97\x5a\xc6\xe6\x30\xb6\x44\x92\x9d\xaf\xb6\x13\xee\x17\x76\x22\x3b\x47\xa6\x62\xf9\xc5\xcd\x92\x87\xcf\x4b\x14\xc5\x00\x8a\x70\x64\x3e\x47\xc9\xff\xe5\xa3\xbb\xa0\xc3\xec\xcd\x72\x04\x87\x40\xc1\x2c\xd4\x3c\x40\xd1\xca\x53\x8b\x35\x77\x24\x22\xa7\x02\x6d\x7f\x3c\x53\x94\xeb\x25\x7e\x5a\x56\xdc\x0d\x27\x41\x6e\x36\x07\xc1\x71\x84\x63\xa0\x26\x83\x2f\xba\x5f\xc6\x3a\x50\xdb\xd6\x77\x3c\xea\xaa\xe5\x16\x6c\xe3\x78\xb0\x9b\x01\x53\x24\xce\x10\x29\x39\x7f\xef\xc7\xf6\xc9\xff\xce\xbb\x76\xae\x48\x30\xa2\xc8\x6b\x89\x2e\x9c\x18\x0e\x43\xe0\x49\x25\x40\x1c\xc9\xc4\xa2\xc4\x67\xe7\x59\x78\xba\xff\xe6\x54\x43\x3a\x5b\x45\x79\xef\x27\x64\x1f\x53\xc2\xf4\x94\x3c\x6e\x9e\x0d\x75\x20\xb9\xd4\x3b\x49\xb2\x2c\xd2\x7e\xd8\xe0\xfb\xee\x90\x83\x0e\x68\xc2\x00\x1c\xb3\xde\xdf\xaf\x7b\xf4\x96\x9a\x3f\xcf\xfe\x4a\xdc\x36\x1f\xcc\x30\x67\x2b\xbd\x55\xf4\x10\x89\x02\x8f\x27\xc0\xf7\x43\x43\x4e\x86\xbf\x7c\xfe\xf2\xbc\xdd\x98\xcf\xfb\x07\x55\xd6\x73\xb7\x1f\x5f\x03\x5b\x78\xa7\xb8\x78\xc1\xc2\x2d\xba\x12\x1e\x0d\x5c\xff\x50\x23\x30\x38\xba\xc6\x41\x45\xf8\x25\x82\x1c\x3d\xa0\x81\xb8\x8f\x9e\x76\xd7\xbe\xfe\x9f\xa7\x90\xf8\xd9\x36\xa0\x8e\x43\x99\x15\xca\x92\x58\x17\x57\x05\x29\x7a\x41\x94\xaa\x95\x7a\x59\xcb\x74\xfe\x41\x01\xcb\x18\x85\x1c\xa9\xaf\xcf\x84\xc4\x87\xec\x53\xe9\x36\x21\x2e\x5d\x6b\x5e\x9a\x70\xf4\x24\x6d\x7b\xb0\x80\x9a\x0d\x4e\x36\x24\x52\x4c\xad\xa0\xf6\x70\x3f\xd7\x98\xb0\x55\x74\x5d\xbe\x75\x34\xca\x33\x27\xfc\x11\x23\x08\xc6\xdb\xa9\xf0\xeb\x39\x37\x47\x11\xff\xdd\x43\x7b\xde\x51\x38\x21\xc7\x68\xa1\x4c\xb6\x07\x13\xad\xc1\x45\x1b\x64\x2b\x78\xd5\x26\x85\x6b\x95\xd0\xba\x5d\x43\x40\x9d\xe6\x62\xc9\xd2\x91\x13\xa3\x2d\x08\xbd\xa9\xc1\xda\x8d\x92\x4d\x47\x8a\xc9\xb5\x7b\x94\x82\x37\xf9\x4d\x82\xb9\x3a\x8b\x74\xd3\x75\xfa\x40\x98\xf6\x09\x9f\x65\x4a\xca\x26\x12\x25\x89\x68\xd1\xb4\x57\x46\xff\x66\x90\x7f\x9c\xdc\x32\xee\xda\x7f\x9a\xee\x7d\x6d\x01\xf0\x27\x38\xe8\x17\x5c\xef\xac\x1b\x7f\x74\x6c\x05\xdc\x4d\x22\xae\xa6\x12\x77\xea\xc2\x41\xd4\xa0\xc4\x00\xc8\x52\xd7\xaf\xc3\xa8\xef\x01\x68\xc5\x06\xfc\x78\x9a\x63\xce\x6a\xf4\xde\xdb\xb0\xe7\xe3\x34\xe6\x34\xb7\x68\x46\x14\xf6\xe9\x4c\x9b\xfd\x29\x95\x48\x85\xcd\x7d\x1d\x2c\x3c\xd4\x41\x3a\x81\x92\xdf\x35\x72\xd4\x28\x0c\x89\xba\x58\xb2\x22\x4d\x4d\x54\xa4\x3e\xca\x7b\x03\x8a\x37\x61\xb7\x7f\xeb\xe2\x5e\xf2\xb3\x8d\xb7\xe9\x80\xca\x8e\xfb\xe4\xfd\x48\x2b\x37\xfd\x35\x70\x90\xaf\xbf\xff\xf1\x17\x88\xf1\xf6\xeb\x59\xbe\x20\x3e\x9a\x3a\xe0\x9c\x8c\x60\xa4\x93\x6c\xdc\xfc\xf1\xcb\xee\xd5\x26\x91\x4d\x5c\x68\x74\xd8\x6c\x2c\x4a\x87\x5b\xab\x05\xc7\xa1\x91\x53\xd4\xe9\x46\xf8\x23\x09\xc3\xf1\x31\x8e\xc6\x38\x3d\x0b\xbc\x16\x6a\x87\x5e\xf1\x05\xe1\xfd\x13\x0b\xa0\xfe\x5e\xe7\x42\x30\xd5\x54\x0d\x4b\xa0\xaa\x13\xd1\x60\xed\xb2\x46\x15\x79\x7b\x80\xed\x7f\x35\xbe\xf7\xee\xf2\xe1\x65\x98\x9e\xb8\xb6\x1e\x7e\xb6\x62\x7c\x63\xf5\x51\xb0\xa9\x64\x72\xb5\x8f\xcd\x03\x2a\x68\x0e\x4c\x5b\xa7\xd9\x13\x13\x8d\xab\x52\x5d\x11\x5f\x77\x39\x08\x24\x3a\x0b\xd6\x6d\x4d\x7b\x18\x29\xef\xe4\x78\xbb\x47\x0e\x12\xdd\xea\x3a\x98\xa0\xf6\xbf\xbc\xe5\x16\x61\x5d\x08\x83\x16\x66\x27\x87\x41\xc0\xb1\x4b\xdb\x87\x8c\x40\x3e\xd3\xfc\x17\xaf\x81\xb2\x22\x20\xb6\x4d\x36\x0d\x6f\xcc\x7f\x7d\xb7\x10\x27\xf1\x1b\x58\x37\x9f\x6b\x22\xc5\x26\x7f\x4c\x4d\x9a\x56\x91\x5d\xeb\xe0\xc2\x62\xd1\x6b\x7e\x41\x96\x13\x49\xc0\x9d\x28\x39\x6f\x42\x3e\x58\xfd\x3d\xc7\xbf\xf1\xd2\xbf\x89\xdc\xcc\xd3\xd5\x3b\xbc\x09\x6c\x54\xb6\x76\xe1\xcf\x1d\xb8\x55\xde\x11\x1d\x01\x08\x4e\x4c\x5e\x85\xf4\xa6\x86\x4b\xd7\x61\x3f\xca\x22\x5c\xe1\xec\xcf\x23\x57\x0d\xf2\x5c\xa7\x91\x32\x0b\x73\x5f\xaf\xba\xa8\xfa\x76\x3f\xff\x38\xa8\x18\xda\xb5\x1b\x5f\x99\xc3\xdc\xd9\x44\xac\xea\x59\x83\x71\x89\x21\x34\xfc\xbc\x76\x10\x2c\xa0\x08\xe2\x1d\x4d\x20\xd7\x34\x7b\xe4\x5b\x88\x3c\x3f\x57\xf2\x98\x82\xe5\xa5\x6f\xc0\x09\xc9\x23\x5e\x70\x3d\x76\x0e\x82\xde\xc1\x49\x08\x52\x6a\x28\x54\x46\xc0\x38\x45\xf1\x9a\x2d\xf8\x47\x74\x4c\x09\x1f\x33\x49\xb1\xe1\x8e\xcd\xad\xce\xe8\xd9\xbb\x85\xc9\x14\x23\xb7\x3d\x38\x9f\x3b\x6e\x45\x51\xab\xdc\x34\xf6\xcf\x03\x11\xca\x1c\x1a\xea\x5c\x84\xcf\x8f\xb4\x93\xc9\x19\x69\xa6\xc4\x6f\xaf\xbb\x6a\x63\x1f\x5f\x86\x48\xee\xe2\x2c\x54\xcd\xc4\xa6\x86\xa2\x20\xd4\x67\xdd\x9d\x30\xbc\xa7\xaa\x41\xf2\x77\x26\x20\x28\x1a\x72\x52\xa5\x14\xde\xd4\xe1\xb4\x29\x4f\x7e\x55\xa3\x8e\xb3\x88\xeb\xb6\x16\x93\xa2\x1c\x74\xff\x00\x80\xed\x9d\x33\x42\xd8\xa5\xef\x4b\x74\xe1\x2a\x94\xab\xd8\xc0\x26\x96\x04\x1f\x33\x40\xdd\x25\x4d\xea\x5f\xff\xe9\x22\x73\x14\xde\x34\x7c\x62\x66\x5f\x8b\xee\x51\x23\x0c\xe7\x5f\xc4\xb3\xa5\xaf\x7d\x37\x99\x70\x68\xdf\xca\xd5\xea\x91\x9c\x39\x13\xae\xf9\xda\x9e\xd1\x5a\xa3\x5e\x65\x45\xcd\x04\xbe\xc8\x9a\x4f\x40\xd2\xba\x91\x42\xcf\x9d\x83\x54\x62\xdc\x93\x5e\x12\x5d\x4c\x2a\x37\xc4\xef\x3a\x2c\x9e\xbf\x3a\xa1\xac\x54\x15\xf7\x3d\xb3\xae\xff\xf0\xcc\xef\xfc\xeb\xf8\x2b\x66\x00\x97\xb6\x26\x4c\x48\xca\x76\xe3\xfb\xe9\xc3\xfc\xf9\xf7\x6a\xbf\x51\xfa\x01\x70\x7e\x20\xf9\xbd\x67\xa5\x70\xdd\xcd\xc4\x48\x09\xa3\x7b\x39\xe0\x00\x54\x1a\xfb\x13\x6c\x11\xbe\xd2\x68\x6e\x48\x57\x1c\x37\x8b\x40\xa0\x6a\xe2\x39\x1b\x3b\xa6\x4b\xa1\x61\x05\x16\x75\xa6\x31\xe1\x08\xad\x47\xa8\x37\x55\x82\x18\xa3\x9b\xca\x3b\xd9\x1c\x8b\xc3\x4c\xdd\x76\xb0\xa2\x9f\x86\x5d\x07\x88\xcd\x08\x15\xa2\x29\xdd\x5b\x42\x69\x6a\xd7\x75\x98\x0c\x55\x85\xc8\x9e\xee\x3f\x52\xfd\xcf\x4b\x70\x18\x32\x73\x08\x4e\xa8\x66\x54\x8a\x43\x10\x79\x77\xa3\x41\x59\x39\x7c\x8d\x69\x1a\x41\x16\x59\xc5\x06\x81\xef\x03\x09\xa5\xd5\x67\xa0\xe3\x6c\x0e\xd3\xa7\x1f\xf1\x47\xb1\x15\x2a\x8c\xda\xef\xfe\xdc\x83\xdf\x9c\x11\x90\xb5\x84\xc4\xe3\x5c\xd9\xb3\x73\x33\x0c\x47\xc8\x69\x14\xcb\x8f\xa7\x73\x4e\xf5\xf3\x73\x80\xeb\x6a\xb6\xe2\x09\xca\x76\x2e\xf9\xd2\x8e\xdc\xdc\x83\xbe\xc8\x60\x8e\x62\x28\x51\xee\xee\xe7\x67\xfb\x8f\x2f\xb5\x0b\x91\xd0\xf5\x46\xb0\xf0\x45\x3a\x38\xb0\x4d\x25\x7c\x57\x59\x3b\x1f\xe6\x4e\x98\x8b\x7e\x19\x9b\xf1\xc4\xa6\xe4\x39\x47\xa9\xe3\x2a\x9d\x0b\x02\x64\x2f\x08\xea\x2d\x23\x0e\x00\x59\xca\xc4\xa2\x18\x42\x46\x83\xd6\x74\xb6\xa6\x89\x11\xbd\x20\x7a\xa2\xea\xe4\x17\x60\x6b\xa0\xae\x34\xfc\xfd\x09\x53\xdb\xea\x37\x50\xc7\x62\xeb\xf7\x29\x5b\x36\x42\x57\xbd\x95\x90\xad\x97\x9c\xba\x49\xcb\x15\x97\xc7\xd9\xdc\xda\xc9\xc0\x82\xd8\xd3\x6b\x77\x89\x8c\xd7\x83\xf8\xab\x55\x92\x6b\xf3\xc8\x68\xa4\x4f\x36\xfc\x34\x51\xaa\x63\x09\x9c\xdb\x22\xf1\xd5\x89\xa5\xb5\x96\xa8\x51\xd1\x1c\x25\x43\xe9\x88\x5d\xfd\x1a\x9b\x1a\x77\x93\x4d\x17\x16\x8c\xc7\x68\xc3\x93\x01\xbb\x4a\x63\xce\xbb\x94\xaf\x3e\x4c\xa0\xa3\xdf\x3b\x82\xa4\xe5\x4c\x96\xe6\xb8\x9a\xea\x50\x6f\x24\x50\x79\xe6\x2b\xe2\x79\x44\x84\x65\xee\x68\x7b\x42\xd2\x03\xc3\x69\x28\x19\xc6\x2d\x48\x66\x22\x5a\x94\x21\x74\x63\xff\xe9\x09\x5f\x53\x0a\xf8\xe0\xee\x7a\x09\x31\x94\x1f\x74\x15\x48\x4e\xbe\x69\xd4\xdf\x39\x8d\x26\xb7\x3f\xc3\x3c\xd9\x61\x26\x06\x4e\x44\x2a\x45\x20\x02\x87\x22\xc6\xc7\x2f\xe6\xbf\x1f\xcc\x6b\x57\x1f\xbb\xfc\x4b\x02\x82\x8b\xde\x04\xc6\x1d\x29\xa7\x2a\x77\x27\x5e\x82\xcd\xbc\xf6\x59\x4a\x4d\x2f\x9b\xb4\x18\x32\xd4\x01\xdc\x2b\xea\x05\x71\x11\x59\xe9\x9b\x4b\x31\x01\xd0\x24\x9e\x9c\x20\x8d\x3d\x01\x32\x88\x5e\xa2\xa8\xeb\x5e\x65\x15\x26\x3f\xc5\xe3\x7e\xeb\x4a\xc3\xd0\x25\x32\xa8\x0b\x98\x30\x37\xa5\xbb\x77\xbc\xc6\xc9\xa4\x83\xc5\xf1\xbc\x96\x22\xae\x63\x14\x3d\xe7\x1e\xf8\x2d\xff\x0f\xd7\xe2\x8a\x06\xa3\xda\x61\x48\xd4\x0d\x03\x82\x30\xac\xc9\x9b\x16\x04\x46\x44\x35\xf2\x93\x46\xa6\x41\xc5\x46\x74\x3a\xb2\xdb\xaf\x63\xd1\xdc\x24\xa8\x0a\x43\x98\xac\x24\xd9\xf4\xf4\xe3\x73\x28\xeb\xf3\xb4\x37\x22\xc8\xb0\xdd\x37\xaa\x91\x5e\x64\x90\x30\xd4\xa0\x1a\xef\x93\xf6\xba\x72\x84\x88\xea\xd9\xf0\x19\x93\x95\x94\xef\xe0\x23\xbe\x47\x01\xb2\x80\x68\x25\x36\xa2\xaf\x5a\x4b\x3d\x4b\x2c\x0b\xa0\xf6\xcb\x0b\x8a\xd2\xc4\xf1\xba\xdc\x52\x35\xb8\x4e\x7a\x4b\xc6\xdf\xfd\x42\xfc\xc3\xb9\x9d\xb8\xc4\x97\x14\x0d\x71\xf0\xcc\xa5\x92\x2c\x84\x33\x1d\x0e\x64\x1c\xa7\xe1\x80\xdc\x03\x1b\xe1\x88\x2e\x49\xa0\xcc\xdd\x89\xaf\xd6\x27\x17\x9d\xf6\xf7\x15\x8b\x8b\x73\x3d\x09\xb5\x05\x61\x10\x62\x9c\x9f\x12\x40\x53\x06\x39\x74\x33\x32\xa6\x9c\xc4\x01\x59\x8e\x36\xf2\x26\x0a\x53\x3c\x7e\xa1\x40\x58\x70\x2c\xfd\x7a\x82\xe5\x7a\xd1\xc6\x45\xcd\xdc\x37\x8d\xad\x4b\xdc\xce\x92\xa9\xe1\x7c\x35\x5f\xd8\xee\x6e\x67\x2f\xa2\x23\x37\xcd\xe3\xc3\x4e\x27\x98\x32\x6f\x24\x02\x3e\xd3\xdf\xd2\x79\xfe\xbc\xf7\x21\xa5\xfa\x9f\x77\xd0\xe3\xd7\x0d\x74\x88\x27\x04\x89\xe5\xac\x54\x44\x0f\x88\xd3\xdf\x58\x2a\x7f\x0e\x48\xb2\xa2\x9c\x15\x2e\xdc\xfa\xd3\x3b\x06\xff\xba\x85\xb5\x7b\xb0\x83\x64\xa1\xa9\xc9\xdd\x7f\x2c\xaa\x6b\xa7\xe6\x08\x03\xd1\x9b\x43\x35\x45\xf5\x42\x83\xfc\x85\x24\x61\x53\xf6\x2d\x4d\x2d\xeb\x83\x0d\x96\xa1\x70\xba\x20\x51\x9a\x30\x0b\x94\x36\x5e\xfc\x69\xe3\x19\x90\x87\x71\x6e\x8f\x9e\xd1\x4f\x28\x7e\xdd\x91\x41\x92\xb9\x71\x44\x71\x09\x84\xd3\x57\x88\x6b\x7f\xa5\xab\xd9\x8c\xf9\xc4\x60\x5f\x75\xc8\x09\x93\xaa\xbc\x1b\x8c\x79\x0b\xbd\xbf\xfa\x16\xed\x95\xcd\xfa\xb6\xb1\x8f\x83\x85\x80\x2e\x10\x20\x9d\x22\x52\x3c\x01\x9d\x19\x1d\x6d\x7a\x57\x5d\x51\x8c\xff\xe3\xc2\xf2\xa5\x5b\xc2\x23\x37\x8f\x2a\x77\xaa\xd5\x64\x98\x59\x18\x1e\xa3\x19\xbd\xda\x49\xf6\xe2\x33\x91\x4a\x4a\xb6\x3d\x65\x0d\xc0\x8b\xfb\xfc\x7b\x78\xd5\x08\x1c\xdd\xc2\x62\x04\xce\x61\x3b\x26\xb4\x15\xe3\x23\x54\x0c\x1e\x9a\x3d\xa8\x04\x5b\xce\x54\x96\x64\xc5\x38\xc9\x3d\xcd\xcf\x90\x85\x4b\xb8\x06\x05\xde\x3b\x13\x13\xbf\x8b\x87\x5b\xda\x2d\x9c\x63\x9d\x0c\x1e\x2c\x8d\x65\xb8\xba\xae\x64\x6c\xc0\xa9\x2f\xad\xcf\x5f\xdd\xa7\x76\x4b\x89\x65\x00\xa4\x56\x59\x21\x30\x59\xb2\xfb\xa0\xf8\x52\x04\x31\x39\xb8\x34\x79\xc6\xdd\x30\xf9\x97\xe3\xc9\x3f\x1b\xef\x4d\x68\xcd\x9b\xfc\x7c\x2d\x52\x61\x12\x0f\x7a\x03\xc0\x85\xef\xd8\x3b\x03\x61\x44\xfc\xab\xcd\x9a\x78\x89\xcb\x9a\xc4\x15\x2f\xb1\xee\x8b\x67\x40\x31\x89\x7f\x20\x66\x39\xba\x72\x24\x48\xad\xbb\x78\x62\x20\x92\x92\x14\x77\xe2\x82\xd1\xdb\xb3\x7d\xbe\x3d\x3b\x81\x38\x16\xd3\xeb\xec\x0d\xe9\x07\xcc\x23\x33\x5d\xce\x49\xd7\x3d\xba\xcc\x0a\x36\x93\x90\x8e\x41\xed\xd7\x1b\xd7\x2f\xdc\x10\xfb\x5e\x43\x38\xd4\x06\x45\x60\x65\x65\x19\x42\x40\x5d\xe0\x7b\xea\x63\xbd\xfd\x79\xde\x88\x37\x85\x45\xba\x39\xfd\x52\xae\xb2\x04\x09\xb6\xaf\x26\x44\x32\x92\x05\x03\x4b\x5c\xef\x50\xb9\x3a\xef\xae\xbe\xae\x3b\x1e\xb6\x4c\x8b\x35\x39\xb1\xad\x14\xd7\x5d\x4a\xce\x07\x35\x2f\xbf\x2e\x1e\xbc\x2f\x65\x6d\xd4\xb2\xc5\xc6\x85\x41\xc7\xc2\x3e\x4f\xbb\xf1\xb5\x59\x60\x10\xd8\x4a\x7c\xe3\x03\x21\x74\xe6\x33\x1f\x3f\x54\xe7\x5c\x5c\xaf\x2f\x50\x82\xbf\xc8\x85\xc2\xed\x27\x8e\x98\xd8\xf3\x69\xca\x7f\xd8\xab\x8b\x5a\xbf\x2c\x76\xf8\x92\x5c\x27\x16\x3c\xbf\x5d\x3c\x07\xdf\xbc\x66\x72\x6a\x75\xba\xbe\xea\xfb\x94\x19\x96\x75\x6d\x49\x7c\xd0\xaa\x1b\xf9\xe7\xd7\xfc\xa8\x3a\x82\xeb\xdb\x24\x03\x24\x02\x87\x97\xd4\xef\x28\x48\x79\x28\x9a\x38\x0c\xbe\xf1\xc5\x55\x3f\xee\xe3\xa3\x95\xfc\x0f\x99\xe0\x1f\x0e\x62\xdf\x73\xb4\x17\xf5\x16\x38\x8f\xb7\x3d\xb3\xc2\x27\xe5\x43\x52\x3b\xe7\xd3\xf8\xa7\x48\xa5\xa1\xcc\xfa\xb9\xeb\x8e\xef\x9d\x51\x14\xd8\xcb\x2d\xed\xcc\x8a\x1b\x31\xd6\x8e\xce\xb3\x7e\xe5\x2c\xa1\x2f\x48\x8a\xc5\xee\x51\xb0\x9b\x3a\xb7\xfb\xf5\x2d\x99\x67\xb9\xaf\xfb\xe3\x3b\x29\x00\x45\x88\xab\x29\x86\x9e\xc6\xcf\xc8\x96\x8d\x5b\x36\x7a\x59\xa5\x7d\x84\x67\xff\xb8\xb1\x5d\x57\x92\xca\x97\x0f\x25\x62\x76\x85\x89\xc0\xbf\x1d\xc7\xf1\x7b\xdd\x55\xec\xb3\x2f\x0c\xf5\xdf\x52\xf7\xdf\x3d\x4b\x16\x41\x1a\x8f\xf2\xf3\x4b\x4d\x15\xd4\x89\x85\xc6\xe2\xc5\x0f\xed\x91\x9d\x3d\xa8\x13\x99\x20\xa6\xfa\x07\x9d\x10\x79\xfc\xc3\x71\x14\xef\xe8\x68\xa8\x46\x39\x9c\x32\xf8\xf7\xb1\x4d\x4f\x10\xb3\xfb\x66\x6c\x5d\xf8\xe7\x35\x08\x2f\xf9\xae\xee\xf9\xe3\x15\x57\x64\xf4\x20\xbd\xf7\xb8\x07\x0d\x46\xed\x46\xb0\x41\xca\x59\xb4\x8f\xf7\x2f\x3b\x00\x48\x30\xc9\x2a\xc7\xb0\x95\xb2\x0a\xc6\xe2\x75\xd7\x6b\x16\x06\x45\xc8\x38\x31\x13\x78\xa6\xb7\x06\x7a\xde\x8c\x36\x95\xa3\x41\x04\x39\x65\x72\xda\x90\x77\xfa\x6f\xf8\x0d\xdf\x2e\x04\x02\xa9\xde\x63\xd5\x7a\x28\x96\xad\x3a\xe8\xb3\xbe\xcb\xcd\x10\xce\xbe\xf5\x7d\xdd\xef\x09\xcb\x40\x5e\x93\x0b\x9c\x50\x46\xe0\x7c\x74\xbe\xf1\x67\xc4\xae\x5a\x6f\xc5\x74\x20\x26\x70\x2d\xdb\x6f\x21\xb5\x9e\xb3\x23\x71\x60\x83\xca\x1f\xbf\x75\xbc\x97\x0c\x8f\x82\x39\x4b\x23\x6b\x63\x20\x19\x75\x46\xab\xdd\x1d\x47\xd8\x7a\xef\xef\x85\x52\x8d\x38\x8c\x6d\xb2\x7f\xd3\x2c\xd1\x59\x8f\x09\x80\xb2\x5c\xd7\x86\xfe\x74\x47\xb9\x2c\xe5\xff\x7c\x82\xdf\xcb\x4a\xe5\x38\xdb\x31\xd8\x99\x50\x40\x27\xb2\xc7\x71\xe2\xfe\xe9\x3e\x91\x3c\xac\xa5\xf2\x49\x9b\xf9\xe2\x1f\xa7\xc9\x29\x7b\x6b\xd4\xb7\xe2\x6a\x0d\xc4\x13\xd5\x30\x35\x7d\xaf\x58\xf7\x30\x1d\xfd\x64\xf4\x72\xa7\xbf\xcd\xf1\x77\x76\x71\xbf\x07\x09\x87\x0c\x6c\x21\xca\x9f\xe9\x70\x09\x9f\xd9\x68\xa1\xbe\x2e\x43\x1e\x94\x99\xd9\xd1\xe1\xe9\x55\x89\x15\x13\xbc\x34\x8b\xf8\x27\xee\xc6\xf6\xa3\x6e\x8f\x55\xa9\xe6\x09\x12\x8c\xe4\xff\xe3\xea\xba\xb6\xde\x44\x96\xee\x03\xe9\x42\x80\x00\x49\x97\xe4\x9c\x33\x77\x88\x9c\xb3\x08\x4f\xff\x37\x1e\xfb\xb3\xcf\x7f\xd6\x9a\x75\x3c\xb3\x2c\xe8\x50\xb5\x6b\xef\xa2\xbb\x8a\x75\x9c\xe1\x90\xe6\x04\xa7\x6b\x47\xf5\x5f\x76\x52\x12\xd9\xdf\x3c\x3a\xd3\x38\x78\xf3\xbe\x3d\x66\xe9\x26\x48\x87\x2c\xa7\xc8\xb2\x7c\xae\x73\xd4\xe8\x1c\x06\xbd\x95\x70\xf5\x33\xf4\xaa\x87\xe3\xc4\x06\x3d\x4c\x59\xca\x1b\x5c\x19\x50\x2c\x12\xc1\xde\xb0\x02\xe7\x8d\x67\xcf\x9d\x08\x09\xce\xf1\x2e\xc1\xcf\x64\xbf\xc1\xa6\xdb\xde\xe7\x23\xff\x9d\xf7\x26\x95\xab\x4e\xa1\x48\x4a\x60\xec\xef\xeb\x8e\xed\x12\x21\xcb\xa7\xf7\xc3\xac\xaf\xcc\x59\x4b\x18\x8c\x7b\x28\x1e\x7e\xab\x3e\x76\x89\x7f\x4a\x7b\x0c\x41\xc8\x27\x00\xca\x67\xcb\x78\xda\xcf\xe3\xfe\x42\x4f\x83\x27\xd1\x84\x33\x5f\x69\xaf\xfc\x9b\x23\x60\x8c\x53\x79\x6a\x6f\xf1\x3e\x7b\x78\xec\x27\x9f\x0e\xe0\x35\x96\x7d\x9e\xd1\x47\x6b\x45\x5d\x3b\x86\x59\x9b\xac\x49\xea\x3d\x55\x7c\xa6\x5e\x25\x61\x39\xe5\x33\x24\x6b\x7a\xa4\xd9\xe1\xd4\x06\x44\xc1\x0d\xe8\xaf\x41\x79\xf5\xf6\xdf\x67\x5a\xcf\xf7\x13\x77\xfd\xf8\x78\x99\x0d\xe7\x2c\x53\x88\xa4\xe3\x23\xaf\xe4\xc7\x5b\x8e\xb5\x33\x5b\x35\x7d\xbd\x77\x7d\xd9\x15\xd2\x90\xa1\xa8\x0c\xb7\x1e\xb7\xaf\xc0\xaf\xae\xab\x1d\x21\x4b\xeb\x1c\xd5\x27\xa4\xc9\x2f\x96\x18\xd7\x3f\xfd\xaa\x8c\x73\xec\xec\xbb\xa9\xd8\xf5\x16\xc4\xa3\x14\xb5\x0b\xd8\x19\x3f\x51\xa0\x28\x7f\x26\x41\xd7\x22\x21\xfe\x20\x49\x0c\x91\x56\x39\x7b\x24\x0d\xf9\xea\xc4\xcc\xc6\xdd\x03\x99\x64\xad\xdc\xfa\x9c\x5f\xae\x68\x44\x19\xa9\x0d\x93\x67\x43\xf1\x3f\xb9\x48\x8f\x96\xc3\x27\x88\x91\x7a\x10\x24\xe7\xda\x40\xb2\x2b\xfa\x3e\x56\x69\x65\xc6\x47\x01\xa2\xc2\x66\xf1\xdc\x0b\x47\x9b\x14\xb8\xa3\xb8\xf0\xd7\xf9\x92\x2b\x7e\x20\xef\xfc\x49\x3f\x97\xeb\x4c\x4c\x4d\xeb\x46\x3a\xe8\x4a\x6f\x34\xc8\x7f\x26\x91\xb3\xa5\xc6\x57\x90\x57\xc5\x91\xa2\x4b\xc2\x7c\x40\xb0\x7a\x5e\x9d\x55\x3f\xc2\xec\xdc\x5f\xc7\x1b\xb0\x57\x64\xdc\x57\x47\x59\x93\x3c\xed\x88\xfb\x0c\xf4\x44\x8f\x9d\x11\x10\x60\xf0\x72\x75\xd4\x48\xbe\xb1\x9e\x76\xdf\x09\x03\x62\x5b\x25\xf1\xfe\x7d\x18\x7f\x6d\x59\x10\x06\x06\xcd\x34\x33\x70\x8c\xe7\xf2\x86\x13\x28\xe9\x22\xec\x61\x62\x6d\x1f\x1e\x2a\xd9\xc1\xcf\x5b\xb3\x2a\x5a\x12\x9c\xba\x99\x98\xb1\xb8\x55\x0c\x51\xfc\xfa\x3b\x3e\xf5\xac\x68\xec\xe1\xbe\x3f\x19\xc2\x7b\x84\xe4\x70\xcf\x9f\x33\x58\x44\xd5\x19\xf1\x51\xba\x56\xe1\x4f\xb8\x34\x8e\x0b\x18\x8a\x6a\x1b\xb3\x97\x98\x3c\xea\xb0\x5b\xbb\xe1\x8b\xd5\x3a\xde\x3d\x54\x18\x12\x4d\xfd\x4e\x1c\xe7\x7e\xe9\x51\x03\xe6\x9c\x66\xf8\x78\x83\x33\x7f\xca\x47\xf5\xfe\xaf\x33\x6f\x9d\x04\x07\x66\xb8\x4d\xf5\xfd\x83\xfd\x94\xe0\x53\xd7\xb7\x4d\xd3\x7c\x73\xd7\xf7\xbe\x39\x0b\xbf\x46\x5f\x9d\x8a\x86\xa1\xe8\xa3\xf2\xfb\x02\x2d\x47\xe8\xab\xf3\xf0\x4e\x8f\x3e\xc7\x3d\xae\x4e\x00\xeb\x74\xa4\x13\xcc\xf2\x5b\xf3\x39\x58\x76\xfd\xdb\x1f\x4f\x40\x21\x1e\xa8\xba\xdb\x5c\x56\x0c\xd0\xab\xfa\x07\xa1\xab\xc8\x6a\x70\xd8\xaf\x1e\x09\xcf\x4c\x1f\x36\xbd\x43\x49\x96\x42\x76\x60\x4f\xd8\x76\xe5\x5b\x49\x93\x8d\x3c\x0c\x44\xdb\x61\x6c\x5a\x17\x88\x33\x1e\x84\x12\x3c\xd5\x97\x87\xfe\x95\xc8\xd7\xac\x6c\xbf\x73\xec\xc6\x06\x58\xd7\x53\xa1\xf3\x1a\x16\xe9\x56\x1d\xa4\x27\xf0\xa5\x76\x78\x6f\x35\xf4\x1a\xe5\x02\x8e\x17\xa8\x9f\x3b\x68\x1d\x64\x13\x0e\xad\x90\xcd\xe7\xa6\x1f\x01\xba\xe1\xeb\x67\xb8\xfb\xe2\xdb\xea\xe9\x62\x7b\x4d\xc2\xb2\x8f\xbb\xb0\x11\x7f\x6b\x88\x0b\x97\x1f\x53\x62\x25\xfc\xb7\xcf\x9f\x14\x51\xcb\x5a\x22\x86\xd3\x65\x43\xa4\x6b\xfb\x0f\x7d\xbc\xa5\x19\x5d\xfc\xea\x78\xac\x58\x67\x05\xf9\x0c\xb7\xed\x73\x45\x0e\x59\x98\x91\xa5\xa2\x50\x9f\xfc\x3e\x8f\xae\xa5\x38\x8f\xfa\xf9\xf6\xc0\x6f\x36\x83\xe9\xb4\x80\xeb\x14\xdd\xbe\xd7\x0a\x89\x73\x86\xa3\xda\xa3\x4e\xbc\x06\x7b\x7e\x25\xff\x90\x5f\x6a\x1b\x04\xaf\x55\xb4\xe7\xe1\x73\x96\xa6\x38\x8e\xed\xc0\x66\xc7\x29\xd9\x80\x4f\xb7\xe9\xe9\x59\x81\x8c\x05\x7f\x0e\xe6\x93\x46\x46\x00\xa8\xcb\xeb\x9b\xd1\xb4\x5e\x73\x60\xcb\x87\x03\xa4\xe2\xdd\xcd\x27\x9b\x86\x1a\x6d\x5b\x10\x9d\x84\x7e\x52\xf9\x99\xce\x6f\x63\x63\x72\xc3\x14\x36\xc7\xcd\x3d\x64\xf7\xeb\x79\x6e\xe2\x8b\x50\x6b\x1d\x9a\xa6\xec\x9e\xd0\xd9\xdf\xe0\xf0\x8f\x9c\xff\xb9\xcb\x44\x49\x9f\xff\xe2\xea\xeb\xb1\xbb\xf4\x7f\x98\x83\x24\xef\xcc\x7e\xe8\x4f\x6b\xb3\xcf\x1d\x0b\xbc\x17\xd5\xea\xc0\x94\xef\xd8\xd3\x9e\x5c\x0b\xd6\xa5\x16\xc4\x8e\xeb\xe3\xd0\x33\x0d\x3e\xe9\x07\xdd\x9f\x1f\xd4\xd2\x79\x84\x91\xb4\x78\x26\x8f\xdf\x18\xd1\xcf\x03\x46\x17\x10\x04\x79\x40\x81\x5e\x16\x0c\x64\x07\x7e\xf7\xd1\x7b\x0c\x67\x07\xd9\x06\xd4\x6d\x4b\x3f\xd4\xd7\x1d\x0b\xe7\xf1\x09\x22\x49\x36\x1b\xd7\xbd\x0e\x1e\x2e\xef\x77\x16\x44\x62\xb1\x23\xd2\x5e\x3f\xe1\xb7\x4d\xbe\x25\xfe\x0f\x97\x94\xa8\x40\x2c\xd3\xce\xac\x33\xde\xa6\x93\x19\x70\x33\x40\x1c\xa7\x0f\x88\x0b\x0b\x9d\xa7\xb6\xa7\x0e\xa9\x26\x03\xec\xb6\x60\x22\xeb\xc4\xd7\xa4\x3d\xd1\x94\x7a\xc0\x32\x1d\xa7\x15\x9e\x5e\xdf\x78\x8a\x3e\xe6\x14\xfe\xec\x31\xe0\xb3\xbd\xbb\xa6\x29\x5d\xf7\x3f\xe7\xbf\x7a\xb1\x52\x16\xbf\x7b\xf1\x14\xee\xaf\x0f\x35\xc4\xde\x52\x63\xed\x2e\x1b\x58\x40\x73\xf9\xb6\xb3\x7c\xe0\x87\x17\xa2\xdf\x7e\xfd\x5a\x33\xfa\xdd\x16\xe6\x26\x9c\x5c\x74\x2e\x9f\xe8\xaa\x12\x8c\xb4\x59\x5a\x90\x09\x7b\x11\x9a\x07\xcb\x6a\x22\x54\x07\x7f\x30\xb3\x6f\x87\x36\x44\x42\xce\x74\x3e\x57\x27\x02\x96\x08\xfd\xec\xf1\x02\xa4\x97\x9b\x99\x6c\x15\x62\xe0\x23\x9d\xf0\x6a\x0a\xeb\xb8\xc5\xee\xfb\x6b\x3d\x2a\xc2\x1c\x0e\x56\x59\x43\xb6\x59\x23\xee\xea\xd2\x75\x1e\xa9\xbc\xb7\x77\xb8\xd6\xf8\xb3\x93\xc8\x4e\x72\xd4\xef\x4f\x5f\x5c\x93\xa7\x81\x92\x67\xcc\xdb\xfa\x0c\xa3\xeb\xd8\xb1\x9d\x24\x19\xa7\x2b\x8e\x85\xd4\x5f\x1e\x46\x76\x94\x7b\xeb\x61\x6a\xaa\x05\x1c\x9a\x7b\x27\xe4\x96\x2b\x02\x9d\xe7\x3e\xde\xd7\x99\xa3\x75\xb2\x56\x8e\xf1\xaa\xda\xe0\x6e\x79\x1a\x78\xa1\xb1\xfd\xfd\x9e\xc9\x32\xc2\xc0\x91\x79\xcc\x5a\xb7\xbe\x86\x6c\x6f\x19\xa3\x66\x44\x26\x55\x5f\x92\x4a\xbb\x8b\x5e\xf8\xf9\xbc\x12\x08\x96\xbd\xed\xf9\x78\x54\x26\x1b\x6f\xf6\x70\xc7\xa1\x35\x7b\xb8\x0f\x13\x06\xc3\xf0\xd5\x57\x79\xf8\x4c\x7f\x87\x6f\x4c\xb5\x63\x45\xdc\xd0\xf4\xcf\x39\xed\xd8\xdc\xb0\x74\xda\xea\xee\x7e\xb6\x31\x00\x0e\x64\x01\x00\xf6\x9e\x01\x79\x1b\xcf\x82\xb3\x0e\x78\xbd\xfe\x68\x91\x29\x65\x16\xe9\x0d\x0e\xd4\x0d\x80\x9b\x87\x3f\xc2\x77\x7b\x9c\x80\x6f\x8b\x80\xaf\x5b\xeb\xad\x6b\x31\x3c\x54\x52\xd5\x6e\x04\x16\x13\x8a\x3f\xee\x63\x92\xc2\xc0\xf7\x4f\xeb\xdb\xec\x4f\xec\xaa\xdd\xd8\x80\x1f\x01\x3d\xf0\x55\x6f\x48\x7e\xeb\x38\xfd\x1e\x68\x3a\x91\x50\xb4\xff\x7c\x00\xe1\xaa\x0c\x4c\x3b\xa7\x8f\x06\x0c\xf7\x78\xfb\xd7\x09\x1c\xcf\x5d\xe5\xc7\xf6\x2e\xa8\xaa\x10\xff\x9e\x6d\x17\x04\x5b\x7c\x5c\xfd\x94\x4e\xf1\x8e\x81\xe7\x3c\xaf\xa2\x21\xeb\x75\x1f\xa6\x4e\x30\xcf\xeb\xbd\xe4\x09\xaf\x1f\xe8\x0d\x96\xfb\x44\xf1\x5b\xb2\x0e\x5e\x5d\x6c\x9a\x09\xac\xe4\xea\x0d\x57\xbc\x16\xf7\xf6\x45\x9c\xeb\xdc\x74\xd8\xa6\xb4\x4d\x0f\xd2\x4f\x6f\x38\x85\xec\x3d\x17\xb0\xf1\x48\x7a\x64\xfc\x33\x2d\xfb\x81\x70\xe1\xec\x01\x8d\xae\x6c\xc5\x9d\x3a\xb5\xb7\xe3\xb6\x90\xc2\x76\x07\xbc\x73\x6a\xe9\xe8\x29\xe1\xa6\x0a\x4b\x95\xa2\x17\x11\xd7\x0c\xde\x27\x9a\xa1\x9b\xbe\x37\xca\x5b\xcf\x32\x1b\x8d\xa3\x20\x15\x7f\x7a\x20\x91\xf9\xa2\x3f\x6d\xe2\xc9\xa2\x5f\x69\xbf\x85\x4c\x6b\x11\x3d\x2f\x4d\xe3\x13\x0c\x3e\xe4\xda\xd7\x83\xd3\x3c\x32\x3d\xef\xde\xdc\x79\x19\x58\xd9\x24\xcc\xbc\x02\xa5\x4c\x67\x12\x1d\xbc\x9b\x71\xaf\x49\x92\xf6\xb0\xc7\xbb\xef\x22\xe8\xfd\x06\xb4\x03\x81\x36\x75\xdd\x29\xc4\x10\x24\x7f\xdf\x21\xcb\x49\x71\x14\x22\xb4\xec\xe9\x6b\xfe\x70\xe2\xb4\x26\xdf\xd5\x6a\x55\xe5\xe6\x49\xfe\xb4\x9e\x6e\x9e\x2b\x43\x26\xc3\xc9\x14\xc1\x0b\xb7\x9f\xda\x17\x6e\xda\x98\x55\x86\x46\xf1\xfc\xc7\x4a\xde\x3c\xfa\x0f\xa6\x06\x52\x29\x02\x25\x30\xe0\x61\x7d\xc8\x90\x78\xa5\x02\xba\x10\x4e\x64\x0b\xff\xda\x78\x6a\x39\x8a\xf8\xc0\x74\x5e\x3e\x37\x41\x48\xb1\xbc\x26\xaf\x9e\x76\x40\x0e\x6b\xd7\x3f\xf3\x3a\xb6\x71\x83\x02\x81\x73\x3a\x49\x08\xdb\x44\xe9\x71\x7f\x9f\x5b\x55\x22\x84\x59\x05\xdd\xa4\xd3\x33\xad\x02\xb8\x79\xa6\x68\xc6\xa3\xb8\x03\xd0\x47\x14\x11\x16\x7d\xc2\x1d\x42\xca\x40\x8e\x4c\xf1\x2b\xf3\x19\xad\xb0\x19\xc4\x1a\x68\xfd\x31\xbb\xdb\xca\x6e\xde\xee\x51\xc7\x9e\xf2\x7b\x1e\x0b\x39\xde\x2b\xd6\xcf\x3d\x9c\x4a\x54\x05\x91\x88\x44\xf7\x81\x7f\x00\x16\x8f\x9f\x6b\xd3\xaf\x7a\x78\x44\x21\x30\xf3\xfb\x50\x85\xf8\x61\x77\x06\x8b\xa2\xd8\xe3\xd6\x02\xe9\xe3\x87\x8a\x09\x35\xce\xe9\x8c\x1e\x70\x86\xf1\xea\x80\x88\x65\x26\x99\x56\x4b\x34\x49\x34\xf4\xa3\x6d\x84\xd3\x46\x1e\xf3\x58\xbf\x60\xab\x78\xa6\x27\xb2\x5f\x87\x22\x1f\x72\x83\xdf\x7a\xe0\x0a\x6e\x18\x78\x14\x45\xe1\x6e\x6d\xc7\x89\xd7\xf9\xe9\xfd\x18\x3d\xa8\x41\x6f\x6b\x2f\x58\x2d\xd8\xde\x28\xf3\x61\x3a\x5e\x01\xa9\x28\x41\xf8\x27\xdd\x26\x90\x5e\x8f\xa4\x42\x53\x9a\x70\xfa\x1c\xed\xc5\x9f\xef\x71\x74\xd5\x69\x45\xf3\xbc\x71\xac\x24\x0c\xd6\xd5\x57\x2b\xd3\xbb\x43\x04\xba\x76\xee\x58\x37\xe6\xbf\xb8\x07\x45\xf4\x77\xca\xee\xb7\x63\xe1\x9b\x57\x6a\x71\x5f\x67\x67\xb1\x6b\x4f\xaf\x22\x28\x00\x91\xe5\x11\x47\xda\xbe\x91\xa7\x6f\x1e\x66\x5b\xdd\x3c\x38\x87\x55\x9f\xbf\xb3\xc0\x14\x4d\x0b\x37\xc5\x2c\x45\x13\xff\xd2\xeb\x17\x5f\x3e\xd3\x75\xb6\x0a\x04\x1f\x1f\x44\xe3\xa7\x8d\x67\x15\x1e\x4c\xc1\x22\xc2\x78\xd2\xa6\x4b\x9a\xbd\xd0\x07\xc0\xdf\xcc\xaf\x95\x7e\xa8\xfa\x6f\x12\x01\x71\x14\x2c\xe3\x71\x7e\x3f\x0f\xfa\x79\x4f\xec\x1a\xc4\x76\xd8\x8f\xf1\xfa\xd5\x18\x24\x66\x28\xfa\xf4\xbb\xf6\x01\x4d\x0a\x1f\xe4\x95\x99\x71\x29\x5e\xb5\x07\xd7\x37\x32\xb8\x3c\x10\x94\x80\x34\x45\xe5\x98\xd8\x8d\x62\xf7\xe6\xf6\x19\xcf\x79\xf7\x97\x25\xd5\xfd\xa9\xf5\x61\x14\x5d\xe8\xd1\x0e\x6d\xad\xa4\xbc\x32\x72\x9b\x26\x64\x8d\x9c\x09\xd9\xb6\xe5\xaa\x46\x1c\x1a\x81\x26\x20\x5d\x3d\x03\xc4\x21\x46\x8f\xb4\xce\xe0\xd7\xab\x36\x02\x4c\x88\x13\xfb\x54\x30\x70\x59\xa0\xc6\xa8\x73\xe1\xf7\xb5\xde\x48\x01\xfe\x1c\x3d\x1f\xa6\xc9\x48\xca\x1d\x9a\x54\x1f\xf6\x91\xc7\xc6\x63\x9b\xf8\x24\x97\xbe\x2f\x83\xb2\x3e\x6c\x11\xbb\x6b\xf0\x32\x7d\xd4\xc5\x15\x0a\x9e\xbd\x05\x35\x90\xfd\x2c\xc1\x34\xf9\xfd\xf1\xe7\x3b\x69\xf5\x16\x1f\xe3\x79\x17\xeb\xb3\xda\x85\x7a\xb5\x01\x35\x83\x6f\xd9\x21\x99\x2d\x98\x4e\x27\xe2\x69\x58\xad\x18\xc5\x84\xed\xdd\xff\x3e\xdb\xf7\xdd\x86\xb9\x74\xf7\x40\xac\xfe\xe4\x7e\x09\xd1\xc6\xc2\x10\x39\x43\x0c\x9e\x64\x14\xa3\x37\xa1\xad\x78\xf8\x04\x8a\x82\xb1\x49\x84\x2b\x11\x6c\xfc\xbb\x61\x2f\x61\xa6\x4b\xf3\xf5\x28\x02\xe8\xe3\xeb\x40\x16\xb7\x4e\x15\x1a\xd0\x80\xdc\xd8\xa8\x4b\x09\xee\xc3\x97\x9c\xd9\xfc\xd8\xe3\x0b\x28\x40\xeb\x5e\xe8\xd5\xf2\x81\x6c\xd8\x35\x69\x95\x8d\x26\x38\xcd\x4e\xd7\x35\x98\x9b\xb6\xb3\x44\xda\xe2\x8f\xe5\xeb\x2f\x0f\xc0\x1e\xea\x91\x64\x6a\xe2\x77\x4c\x24\x83\x44\xd4\x6c\xe7\xc5\xe6\x25\xdd\x3b\x10\x7b\x7c\x28\xf1\xae\x37\x10\x0e\x9c\x3d\xfd\xf5\x0f\xfa\x65\xd0\xd0\x6a\x25\x24\xac\xaa\x77\xaa\x26\x09\x1b\x98\x55\xa2\x0f\x54\x6e\x8c\x77\x1d\x95\x46\xcc\x47\xb6\xde\xf7\x93\xdb\x04\x01\x31\x3d\xa5\x7e\xb0\x59\x2d\xf3\xc6\xac\xe0\xfc\x35\x0f\x8e\xda\x9f\xc9\xf8\x7e\xbf\x6c\xd1\x5f\xaf\x7b\xa1\xd2\x8e\x00\x42\xf9\xbe\x52\x79\xd4\xe8\xf6\x45\xcf\xd5\xc7\xe6\xa1\x85\x4b\x22\xdc\x86\x7c\x01\xf7\x70\x4c\xde\x50\x05\x78\x94\xa5\x61\x9a\x26\x7c\x9c\xa6\x88\xd3\x66\x7a\x46\xe8\xd7\x7f\x9c\x9f\x2d\x62\xcf\x7d\x7c\xf9\xbd\xac\xe9\xfe\xab\xa2\x60\xfd\x78\xe1\x09\x3c\x30\xdc\x34\xda\x78\xeb\x36\x50\x71\x90\x4e\x27\x2f\xc5\xa8\x8a\x34\xe9\xcb\x5f\xf1\xa1\xec\x67\x79\x48\x58\x41\x0d\xb0\x0d\x7f\x38\xaf\x5b\xd5\x48\x68\xda\x10\xff\xd5\xd6\x50\xa8\x92\x2b\xd0\xd4\xb2\x22\x1b\x56\x98\xed\x33\x01\xe4\xcf\xae\x1a\x35\x3d\xc4\x11\xa7\x76\x2a\x07\x63\xd4\x1c\x15\x0f\xc6\xe8\xb9\xe1\x4b\x1f\xee\xd9\xf3\xa1\x3d\x75\xd7\xa6\x03\x01\xbc\x15\x6b\x65\x19\x13\x01\x95\x96\x09\xf8\x6f\x8e\x47\xc6\xdf\xf6\x90\xf5\x43\xfe\xa5\x15\xf5\x98\xf4\xf0\x43\x13\xe8\x75\x24\xef\xfa\x4e\x05\x1e\x66\x72\xad\x19\xbe\xbb\xf1\x9d\x4d\xe0\x79\x59\x28\x30\x35\xb2\x95\x87\x96\xd8\xf9\x4b\xa1\x2b\xe0\xc6\xae\x20\xb5\xe4\xcf\x79\x87\x9c\x89\x5c\x6b\x4c\x81\xf0\x4f\x07\xc3\xfc\xb5\xcf\xb7\xef\x4b\x9f\xa7\x79\x69\x66\x89\x04\xd1\x29\x84\xd4\xc2\x91\x42\x5b\xf8\x48\x1b\x6f\x38\x66\xc6\x63\x19\x8b\x7f\x4f\xe0\x77\x0c\xba\xca\xa8\x0a\xc6\x03\x38\x4b\xab\x3f\x29\x23\xaf\xff\xb3\x68\x61\xe9\x62\x9e\x0a\x24\x36\x30\xae\xfc\x0c\x76\xd7\x9f\xe0\x67\x09\xfc\xd2\x0b\x48\xdb\x67\x85\x2c\x63\x3b\xca\x6c\x97\x88\x28\xe8\xb4\x55\x40\x22\xb1\x8c\xc6\xfd\x03\x72\xe0\x82\x16\x10\x75\xc0\x14\xb1\xab\x1d\xa9\x3e\xd4\x3f\xd8\x3e\x0b\x15\x4e\x6e\x41\x9f\xb7\x79\x6d\x65\x22\xfa\x25\x71\x1d\x46\xc4\x90\xeb\x61\x2e\x07\xf6\xa6\x90\x96\xb2\x23\xa2\x43\xd6\x52\x32\x80\xb8\x06\x5d\xbd\x88\x27\xe8\xd6\xbe\x60\xce\x88\x2d\xe7\xf4\x02\x9e\xec\x7f\x7d\xfb\xed\xc9\xf8\x90\x7f\x9e\xcb\x96\x16\x40\x8c\x1e\xa1\x0b\x98\x11\x3b\x1b\xf7\x0d\xbc\xf3\x81\x42\x8c\x9b\x5a\x29\x0c\xa9\x70\x44\x12\x19\xac\xaa\x04\xfa\xe6\xaa\x2d\xc7\xf7\x77\x1f\x8c\x57\x50\x26\xce\xa5\x32\x43\xa7\x45\x4a\xdf\xde\x87\xcf\x3b\xfd\x7f\x73\x67\xf3\x3a\xdf\x54\x5a\x94\xe0\xb6\xf7\x9a\xe8\x17\x04\x7a\x5e\x33\xad\xab\x69\x71\xc6\x2a\xa1\x77\x1e\x85\x0d\xae\x84\x10\x4b\x14\xc0\xac\x33\x16\xd5\xc1\x5c\xc0\x48\x6b\x41\x0b\x0e\xbd\xc2\x4d\x8b\xb2\x03\x74\xbb\x9f\x3f\x9c\x87\xda\xbc\x76\x5c\x83\xda\x32\x45\x60\x47\x9f\xa7\xff\xf1\xe1\x77\xda\x39\x63\xb7\x4d\xa8\x69\x8d\xa6\xcd\x1a\x06\x7f\xe5\xa1\x1e\xc8\x4d\x47\x56\x15\x5a\x97\xe3\x94\x59\xc5\xaa\xe7\xa9\xbf\xfd\xda\xf8\x25\x94\x24\x00\x6b\x3f\x3a\x81\xf1\x4c\x9b\xfa\x00\x93\x4f\xfb\x1c\x6f\x81\x68\x1b\xae\xf6\xd1\xa6\xe3\x71\x40\xcb\x49\xe2\xce\xee\x16\xdf\xb7\x4c\x1a\xf5\x1d\x5b\x7f\x6c\x55\x4c\xa6\xe7\x17\x97\x3d\xd8\x75\xa9\x46\x88\xae\xbb\x61\x47\x9c\x14\xfe\xdf\x5e\xf4\xac\x62\x1b\x2f\xa3\xd3\x5c\xa7\x95\x4e\xc4\xdb\x10\x0f\x71\x9b\x21\x76\x4b\xcb\x32\xac\xda\xf9\x55\xcb\x93\x11\x5a\x1e\x69\x80\xdf\x9f\x3b\xe0\x63\x17\x76\xc3\xdb\xaa\x7c\x79\x4b\xa5\xd1\xbd\x75\x8e\x46\xa5\x02\x1f\xab\x8d\x1f\x3c\x01\xee\x45\x6f\xbb\x55\xb8\x0a\xdc\x60\x01\x4b\xfc\xf7\xbc\xc8\x86\xbc\xbc\x66\xfa\x86\xeb\x31\xb0\x7e\xd2\x73\xd2\xbe\xce\x10\x63\x42\xad\x5d\xb5\x79\xde\x0a\xfc\x7e\xdc\x24\xe3\x3b\x38\xe8\x24\x87\x4f\x95\x36\x62\x66\x39\x19\xdc\x23\x38\x9f\x63\xff\xab\x3b\x43\x38\x7e\x19\xd9\x9c\x09\x85\x83\xf1\x6c\x0c\x55\x81\xec\x44\x7f\xdd\xf3\x51\xde\x43\x59\x0d\x47\xdd\xb4\x74\xdb\x8f\x14\xd5\x72\xc7\x94\x84\xae\x7e\xd7\xe2\x7e\x8a\x4c\x5b\x8a\xad\xdb\xd4\xfc\x16\x0f\x7f\xf3\x27\xfd\x57\xe4\xcd\xd9\x37\x5a\x63\x7f\x48\x55\xe2\x8e\xc9\x67\x7e\x7f\xa6\xa4\x7b\x8e\xb7\xc1\xa5\xfa\xa8\x8a\xc3\xf2\xaa\x03\xc0\xf5\x5f\xc0\x89\x36\x4b\x74\x4c\xd7\x0d\x32\x5a\x31\x53\x41\xdb\x37\x4d\xed\x5b\x7f\x05\xca\x7e\x76\xb6\x76\x7b\xa8\x5e\xe0\x84\xf1\xf7\x77\x80\x28\xec\x84\x89\x77\x37\x90\xaf\xeb\x46\xdd\x76\xeb\x5e\xaf\xc7\xfb\x9d\x38\x52\xd1\xaa\x7b\x2a\xed\x3e\xce\xee\xeb\xa7\xe9\xdb\x15\xe0\x15\x09\x69\xeb\x4b\x25\x05\x01\x3b\xaf\x6f\xa0\x57\xe7\xe9\xa2\x0f\x71\x2b\xe7\x01\xcc\xf7\xdc\x7f\xf6\x54\xbe\x82\x70\x9c\x50\x0e\x76\xdc\x4c\x1b\xda\xf9\xfe\x1c\x9f\xf9\xab\x86\x3a\x3e\xf8\x82\xf5\x14\x31\x61\x27\x35\xd1\xa4\xb7\x74\xd8\x6f\xf2\xd5\x6c\x16\x6c\x14\x02\x7c\xe9\xea\xc9\x3d\x27\x7d\x96\x80\xb9\x45\x53\x68\xb0\xec\x49\x40\x4a\x2d\xdc\xe8\x4a\xf9\x39\x87\xc3\xaa\x95\xf3\xe6\x8d\x17\x3f\xc6\xda\x4a\x93\xa1\x7b\xf5\x35\xbe\x7a\x09\x7e\x95\xef\xd5\xe7\xfb\xba\x22\x01\x21\x0d\x5b\x3b\x5a\xe1\x50\x79\x50\xf1\x4c\x29\x7f\x70\x6c\x47\xae\xc2\x9a\xf8\xf3\x01\x76\x2c\x2c\x5c\x76\x49\x9a\xf9\x43\xbc\xf9\xa9\x8f\xf8\xd5\x82\x24\xe7\x26\x96\xbf\xdd\xb6\x57\x58\xc1\x92\x85\xe3\xba\x11\x30\x7a\xe5\xe1\x81\x09\x68\xab\x11\xbf\x86\x45\x1f\xae\x9e\xe1\x54\x9f\xd1\xbd\x4b\xa0\x4c\xde\xf2\xdb\x8d\x05\xeb\x12\xc9\xf8\x67\xd0\x56\xf3\x43\x44\x13\x00\x08\x07\x07\xbe\x02\xef\x77\x2c\xc2\xbe\x29\x4f\x06\x5c\xb1\x45\x42\x3e\x06\x1e\x5b\xce\x49\xa5\x3c\xa5\xf3\x0e\xdf\x01\x17\x90\x95\xfc\x9f\x79\x6d\x2f\xa2\x60\x37\x41\x16\xe7\x6a\xf3\xab\x66\x9e\xd9\xda\x35\xef\x3c\x7e\x7f\xdc\x5e\xf7\xdb\xb6\x40\x7e\xf0\x06\xda\x8a\xed\x55\xe0\x43\xa6\x96\x30\xc2\xc2\x06\x57\x2e\x18\x8a\xd8\xa6\x02\x63\x8d\xd1\xbb\x9a\xd0\x6d\x02\x50\x53\xc6\x7c\x59\xbd\xc7\x6c\xb1\x60\xb7\xe1\x99\xac\x7b\xb8\xef\x98\x7f\xdf\xf9\xcb\xaf\xb4\xe6\x44\x7f\xf3\x2a\xb6\x61\xf2\x7a\x68\x93\x76\x24\x14\xef\xc9\xc2\xf6\xa5\xbf\xcf\xb6\x53\xe2\x3a\x18\x9b\x60\xe0\xfa\xf7\xaf\x77\xa8\x7b\xa1\x89\x29\x7d\xa4\x2d\xb7\x6c\x00\xa7\x78\xf4\xce\x3a\x52\xe3\x44\xdc\xeb\xd5\xfc\xea\x6f\x7e\xe5\xa9\x3d\x0e\xcc\x7b\x47\xd6\x17\xdc\xce\xef\xe6\xf6\x4e\x76\xa5\x78\x5d\xf5\x04\xd0\x19\x77\x43\x37\x28\xe5\x3a\xf4\x0b\x34\xe4\x9b\x87\xf8\xf0\x88\xc3\x0c\x12\xeb\x77\xee\x58\x92\x28\x13\xb2\x59\x00\xd4\x44\x76\x8b\x2c\x68\x1c\x27\x3c\xa3\x9f\x99\x76\xdb\x73\xd8\x77\xde\x2d\xb0\x5d\xa6\xef\x98\x87\xfe\x96\xef\x75\x8f\xff\x4a\xb8\xcf\x8d\x23\x0d\xb0\x34\x24\xe2\x79\xc7\x58\xe0\x9b\x5a\x68\x2b\x51\x50\xc3\xad\x25\x32\xae\xc9\xb2\x8d\xe7\xb2\xd7\xff\xbb\xae\xea\xfe\xfa\x9f\x09\x7f\xea\x7b\x84\x0d\xed\xed\x74\x55\xe8\x34\x55\x0f\xdd\x8b\x99\x7f\xc5\x69\x08\x18\xf1\x95\xc7\xef\xd4\xa4\xce\xa9\x13\x55\x84\xdf\xf8\x58\xd6\x50\xc2\xec\x65\x4f\xbe\x24\x65\x28\x0b\x6f\xe9\x96\xe6\xa1\xdf\xe1\xf9\xb8\xc6\x54\x43\x4d\x07\x74\x08\xa4\x75\xf3\xed\xd6\x1c\xd4\xb4\x2e\x67\x86\x55\xcf\xf6\x30\xc5\x7a\x76\x4a\x2b\x14\xd9\x7a\x04\xda\xab\xbe\x4f\xc8\xab\x94\xfa\x72\x94\x64\x65\x39\x9f\x9f\x9b\x6c\x0f\x42\xed\x85\xc1\xd9\x1a\x5b\x27\x98\x41\x3b\xde\x96\x2a\xb8\xa9\x72\x53\x99\x06\x35\x14\x03\x14\x31\x7f\xf8\x15\x25\x14\x6f\xfe\x2a\x42\x95\x54\xbc\x3c\x97\xa7\x3c\x37\xc1\x6d\x77\x63\xf7\xd5\xf1\x75\x80\x98\xbf\x1a\xbd\x63\xad\xd4\xfc\x3e\xf8\x47\x18\x43\xad\x92\xad\xbe\x6b\xbc\x4b\xe8\x85\x85\x07\x64\xba\xdf\x88\x31\x51\x42\xca\xbf\x2e\x5d\x94\x39\x79\xfe\xd4\xa8\x25\x0d\xa5\x7d\xa5\xa6\x8e\x79\xc2\xd2\x57\x2c\x76\x0b\x98\x57\xa1\x68\xc5\xa1\x9b\x12\xef\x11\xe5\x3f\x77\x73\xc3\xce\x52\xba\x40\x17\xd8\x9d\x5d\x9c\xe0\xab\x9f\x46\x57\x7f\x4d\x72\xeb\x77\xab\x35\xfe\x7c\xef\xa5\x72\xe5\xe1\x49\x61\x2b\x02\xce\x33\xe7\x36\xe3\x41\x7b\xf9\xba\xb7\x59\x6a\x2e\x19\x7f\x50\xc2\x4c\x32\x3f\xf9\x40\xc1\xd9\x95\x13\xb1\xad\xd1\xeb\x89\xbb\x54\x1c\xb2\x50\x5b\x89\x55\x78\x6a\xf9\xaa\xee\x87\x5a\x07\x77\xda\xfd\xcb\x51\x58\xc3\x8a\xa8\x3b\xd5\xcc\x7c\xf9\x1a\xd5\xf5\x55\x65\xcf\xcb\x3e\x81\xd4\x20\xd2\x80\xfc\x73\x76\x4d\x22\xb6\x7d\x4e\x06\xbd\xc7\x5e\x75\xfc\xf2\x1a\x5c\xe8\x9f\xea\x9b\x27\xc2\x88\x56\x3c\xdc\xdf\x2a\xfb\xef\xfd\x55\x9b\xd5\x5e\x0f\xbe\xae\x32\x34\x35\xa3\xb8\xb7\x09\xfe\x50\xed\x90\xd4\xf3\xa7\xfd\x53\xef\x82\xb4\x01\xab\xda\xe6\x33\x06\x6b\x84\x3e\xde\x28\xb4\x91\x27\x77\xa3\x32\x12\x6c\xdd\x9f\x5e\xb0\x54\x49\x1c\x41\x3d\x94\x3d\xfd\x1a\xa3\x81\x63\x82\xfe\x45\x9a\x80\x0b\xe9\x82\x5b\x3a\x76\xf5\xb2\x0b\x38\xa7\xda\x1f\xcd\x47\xb5\x64\x59\xaf\xc1\x28\x11\x34\x5e\x9d\x0a\x2b\x89\x2e\x9b\x87\x6b\xab\x10\x7f\xef\xa4\x13\x60\xdd\xfb\x83\xee\xf5\xe3\x49\xb0\x80\x0b\xf4\x3b\x25\x13\xf5\xad\xce\x99\xbf\xcf\x79\x15\x9e\xbe\x1f\x1a\xd8\x27\x97\xe8\x0a\x33\x5c\x9a\x41\x94\xfa\x51\xb9\xaf\x4a\x4f\x71\x78\xb4\x95\x7b\x90\xfc\xe9\x19\x97\x8a\xe7\x9b\xca\x05\xad\x79\xc9\x8a\xf1\xad\xd1\xa3\x64\xda\xb0\x03\xbe\x1b\xca\xbc\x45\xdc\x7e\x72\x38\xf2\x15\xb4\x83\x81\xf8\xca\xfc\x76\x36\x6c\x4f\xe5\xd2\x7a\x2f\xcd\x2f\xb2\x21\xda\x09\x9d\xc6\x0e\xe5\xfa\x88\x3d\x7e\xc7\xe6\x97\xed\x20\x76\x85\x2b\x84\xaa\x47\x7a\x89\x32\x0b\x46\x55\x0a\x34\x53\x8b\x83\xe5\xe4\x9f\x5c\x99\xc0\xde\x6d\x08\xd9\x2c\x93\x60\xfb\x27\xf9\xf2\x43\x4a\x42\x9d\x80\xa5\x5a\x4e\x1c\x72\xf2\xdf\xf9\x08\x52\xe1\x4a\x03\x0b\xe6\x73\xef\x8b\xc6\x0c\x6b\xe1\xd3\x58\x39\xa3\xe6\x77\xba\xf9\x8b\x97\x18\xe7\x59\x24\x61\xb0\x7d\x3b\x31\x73\x2f\x2a\x24\x1d\x8f\x0e\x41\x17\xb1\x58\x3e\x87\x1d\x60\xc8\x9f\xf7\x52\xaf\x57\x6e\x40\x6c\xf0\x71\x23\xd6\x6d\x5b\xba\x14\xf3\xfb\x99\x4b\xc6\x92\xc1\x78\xd8\x84\x78\x4e\x9b\xee\xfe\x96\xfe\x5b\xa1\xeb\x5e\xf3\xb9\x93\xdb\x48\x62\xe5\xa4\x90\xce\xb0\xe7\x29\xc1\x49\xb5\xc9\xff\xc9\xe5\x1c\xc4\x17\xf0\xdb\x81\xea\x9f\xad\xa4\xb0\xa6\xdb\x58\x20\x82\xf5\x04\x4b\xac\xde\x4f\x3f\xfb\x99\xa7\x4c\x4b\xb4\x91\xb9\xcc\x85\x57\xc7\xb5\x04\xee\xf1\xc0\x56\xca\x9f\xb3\x30\xd4\x16\x77\x18\xcc\xf7\x26\x2d\x28\x05\xd4\xeb\x31\x6b\x48\xe2\x57\x75\xf2\x54\xf8\x7b\x71\x93\xdc\xa0\xa7\x3e\xd3\x8e\x59\x30\x4a\x2e\xa9\x05\x02\x09\x4c\x4c\x86\xb2\x1e\x06\x34\xc9\x80\xfd\x3a\x7e\xee\xc8\x2a\x02\x1b\xa2\x8a\x43\x18\x6e\x21\xec\xef\x4e\x6b\x28\x29\x6c\xea\x56\xa0\x3f\x3f\xb5\x8e\xb6\x19\xe2\x28\x1b\x33\x08\xa1\x9f\x3d\x1c\xae\x59\x42\x2c\xb4\xf3\x1d\x88\x0d\xd1\x7a\xfc\xfc\x9b\x0d\xac\x17\x97\xad\x50\xa3\x80\x0d\x1d\x85\x38\xa4\x9d\x03\x5a\x05\x86\x87\x52\x54\x28\xe9\x06\x72\xfe\xd4\x2b\x20\x8d\x91\x33\x9a\x26\x19\xb6\xa7\xd0\x41\xc8\xe9\x18\x16\xf0\x5d\x69\x96\x88\x01\xfc\xf6\x19\xe8\xdb\x93\xfc\x39\xfb\x4e\x46\xc2\x34\x09\x3d\x7b\xd9\xc7\x99\x0f\x1f\x8a\xe5\x05\xc7\xaa\xfe\xe3\x34\x50\xfe\xd3\x57\x5c\x21\x28\x32\x50\x8a\xb2\xa7\x28\x94\x6b\x0d\xa1\x46\x25\xf5\x80\x0d\x4a\x1e\x57\x08\x11\xd8\xbf\xb5\x90\x89\x19\xc4\xf6\x78\xc8\xf3\x9e\x52\x60\x2e\xdb\xfd\x22\x56\x15\x8a\x74\xe7\xd9\x28\x37\x8f\x21\xb3\x1f\x0d\x92\x07\xf9\xcb\x21\x49\x6f\x84\xbd\x06\xfe\xb8\xa8\x2a\x4e\x54\x0f\x53\x32\x69\x27\xb6\x90\x09\x91\x49\xfc\xd6\x15\xc4\x6c\x8b\x5f\x91\x10\x12\x9a\xcf\x1f\x0d\x59\x5a\x2f\xef\xc1\x1c\xec\xf6\xb7\x67\xb1\xcc\x04\x30\xa7\x00\x72\x49\x07\x6e\x1e\x60\xb7\xa3\x06\xbc\xbd\xf6\xbc\x50\x2b\xc9\xfb\x66\x12\xfa\x88\x52\xe8\xdf\x7e\xf7\x0b\x19\xef\x8e\x53\xf6\x8f\x16\xbd\x89\x1a\xed\x7e\x05\xc7\x00\xf6\x29\x18\xa5\xc1\xfe\xad\xbb\x56\x58\xf4\xd7\x90\x18\x63\xcb\xfb\x97\x9a\x1c\xb8\x41\x70\x35\xe0\x83\xa8\xce\xa0\x89\x40\xfd\xdd\x3f\xa3\x37\x2a\xc0\xaf\x7b\x9a\x11\x83\x38\x4a\x39\xb8\x8a\xfb\x1a\xc4\x6e\xab\x60\x72\xf1\x4f\x5e\x57\x21\xa9\xab\x76\x9f\x63\x94\x87\x4c\xad\x40\xb3\x3f\x98\x5d\x82\x64\x96\xb8\x2a\x4d\x31\xf3\x8f\xbd\x30\x82\x91\x8c\x44\x6e\x71\x34\xdb\x15\x70\xf4\xc0\x89\x6d\x95\x1c\x29\xf8\xdb\x43\xdb\xcb\xf3\xbb\x0c\xb0\x47\xd8\x21\x9f\x7b\x76\xa8\x43\x4d\x89\x23\x58\xe7\x0f\x36\x9d\x83\x04\xb8\x27\xd0\xc4\x39\xd8\x7f\x0c\x7e\xf9\x3a\x01\x78\x0b\x60\x26\x04\xb9\x8e\x8e\x18\xfc\x68\x01\xc0\xf6\x2d\x7b\x30\x80\x2d\x96\xee\x13\xe8\x08\x3f\x92\x08\x36\x50\xff\xcd\xe9\x9e\xa3\xb4\x73\x0c\xf0\xf7\xd2\x14\x83\xef\x0d\x45\xb9\x92\xc8\x51\x49\xd8\x53\x60\xd3\x9e\xf0\xc3\xfd\x30\xa0\x55\x44\x13\xe0\x78\x04\x82\x68\x0d\xc2\x84\x49\x84\xf7\x2b\x71\xa0\x36\xb3\x5a\x63\x0c\x5d\xfe\xad\x83\x19\x17\x91\xfa\x72\x1a\x8c\x25\xe8\x70\xbc\xe7\x90\xfd\x51\xa3\x32\x78\x1b\xa5\xe0\xd1\x1c\x3e\x1b\x4c\x11\xff\xfe\xb6\x43\x6b\x25\xdd\x18\x8c\x6e\x21\x6a\xee\x7d\xec\x48\x11\x24\x85\xa6\x0c\x4f\x59\x29\xe1\x4f\x1e\x94\x32\x14\x44\xd0\x58\xc2\x7e\xee\x10\x74\xd8\xc9\xc9\x19\x04\x6f\xb4\xc4\x52\xfe\xe8\x28\xcd\x52\x54\x60\xe3\x94\x20\xfa\x31\xb4\xd9\xc8\x7d\x37\x29\x1a\x00\x2c\xf2\x3f\xe3\x4f\x6d\x98\x60\x30\xa6\x01\x54\xa4\xf5\xc6\x40\x47\x57\x01\x21\x89\x12\x8a\xaf\x5a\xa0\x3f\xf5\x0b\x28\xe2\x71\x71\x8b\xc6\x19\x4c\xf2\x66\x89\x58\x39\xb4\xc1\x47\x1d\xea\xd2\xfc\xf5\xef\xbf\xc6\x7f\xff\xfb\x77\x43\x10\x7e\x29\x79\x40\x5a\xc1\xa9\x2d\x1b\xfc\xcd\x53\x33\xee\xef\x89\xbc\x6a\xad\xff\xbc\x5c\x24\x3e\x4a\x8e\x3a\x24\x0b\x3d\x6d\xda\x0d\x31\x4d\xcd\x9f\x0e\x39\xfc\x1d\xbf\xd1\x76\x2d\x7d\xd7\x88\x89\x40\x2d\x22\x53\x5f\xef\x1a\x31\x21\x87\xf0\x1b\x49\x14\x15\xdc\x0d\xc8\xbf\xb6\x2d\x37\x62\x2d\xbc\xaa\x0f\x30\x07\x08\x3e\x83\xa7\x70\x7f\xe1\x9f\x31\xb5\xa9\x68\x20\x20\x93\xfe\x8b\x95\x10\x49\xde\xe5\x4e\xe0\x5e\x30\x0b\xf4\x6d\x38\x39\x16\x18\xd0\x17\xb3\x74\xf2\x95\xf3\x45\xcc\xd5\xf4\x9f\x77\x1b\x31\x45\x7e\xd5\x66\x98\x5a\x01\xd1\x25\xc1\xbe\xa5\x3a\x22\xe5\x26\xf3\xbf\xcf\x92\xfc\xf3\xfe\xdc\x13\x7a\x48\xde\x3a\xdb\xcd\x70\x93\xc0\xd0\xf2\x3c\x09\x2f\x56\x5a\x42\x7b\x7e\xea\x5c\xf8\xb9\x97\x44\xae\x0c\xd0\x8f\x87\xf0\x02\x9a\xbe\x83\xe6\x17\xd6\xce\x90\xab\x23\xb1\x64\x96\x94\x29\x0e\xf6\xa3\x8d\x9f\x74\xc3\x1f\x5b\x26\x31\xdd\x8f\x3f\x3e\x64\xf2\xce\xf3\x9d\xa5\x52\x48\x16\x2e\x51\x34\xe4\x1e\xdd\x83\xbd\xf0\xf0\x73\xb7\xa1\x5d\xd3\x0a\x48\x83\xd0\x47\x58\xa7\x5a\x70\x62\x7c\xb7\x6c\xca\x25\x11\x42\x9b\x65\x98\x52\x08\x7f\xec\xa5\x85\x2d\x29\x27\x54\x2c\x4e\xad\x37\xf3\xee\xbe\xef\x0d\x52\xe9\x3d\x69\x5e\x12\x0b\x4c\xeb\x3e\x02\x0b\x0e\xa2\xf8\x2c\x66\xf1\xe9\xc2\xc9\xc9\x67\x74\xa8\xba\x1e\xd8\x97\x75\x63\x8f\x2d\x91\x7e\xfa\x17\x83\x21\x91\x80\xaa\x39\x77\xf4\x59\x03\xab\x59\xbc\x2e\x42\xd4\x12\xdd\x2c\x55\x17\x45\xad\x0a\x10\xcd\x6d\x0c\xce\xae\xfc\x06\xca\x81\xcd\xde\x14\x8b\xc4\x02\xa5\x34\xe8\xbf\xb5\x2c\x1f\x92\x69\x45\xc1\x48\x64\x74\x35\x93\x41\x11\x8e\x78\x3f\x86\x48\xd8\xe5\x2f\xce\x08\x62\x5d\x0b\x27\xe5\xca\xf4\x00\x50\xeb\x59\x15\x8d\x77\x14\x2b\xee\xd1\x4d\xec\x8d\x00\x7d\x35\xe8\x0b\xba\xd9\x25\xf3\xf3\x0d\x5b\x29\x54\x0d\x20\x54\xd5\x7b\x76\x18\x7d\xd5\x61\xf5\xef\x5a\x13\x4d\x4b\x34\x1e\x71\x57\xd4\x22\xf7\x74\xe2\xe3\xc5\x17\x68\x00\xf4\xcb\xf2\xeb\x28\x5e\x95\x35\xf3\x93\x04\xfc\x75\x2a\x01\xfd\xf8\xc7\x47\x07\x52\x1a\x1e\x2e\x88\x21\x60\xc4\xf2\xfa\x0e\xc8\x66\x32\x03\x37\x6b\x56\xef\xfa\x7e\xa4\x88\x93\x1e\x6c\x3b\x9a\x75\x5b\xc9\x0b\x57\xaf\x1c\x2b\x88\x63\xd8\x2b\xfc\x85\x2c\x16\x68\xb5\x76\xba\x05\x31\xfa\x6b\xfb\x9b\x5f\xfe\x70\x59\xcd\xc8\xcf\x14\xbd\x63\x4a\x12\xae\xf4\x43\xa8\x4b\xdb\x75\xd9\x2b\x9f\xd1\x62\x7e\x22\xc9\xe2\x9e\x4b\xb6\xf3\xdf\x3e\x56\xaf\x64\x99\x2a\xe6\xc9\x13\xb8\xbe\xc3\x5a\x0f\x3f\xcd\x68\xb2\xa3\x4f\xe5\x2b\x01\x85\x7d\x4a\x14\x8a\x0d\xfa\xaf\x9f\xf1\xad\x71\x0e\xe4\x57\x2e\x13\x32\x3a\x4c\x34\xf3\xf1\x07\x83\x3e\xc5\xab\x4f\xb8\x39\x7f\x44\x86\xeb\x00\x1e\x17\x7d\xc2\xcb\x20\x4a\x03\x4e\x04\xe3\x71\x18\x7b\x38\xb1\xdf\x91\x0f\x1e\xc9\x1c\xa5\x4b\xb6\xcd\x05\x3d\x01\xfd\xf0\x69\xf2\xa8\x15\xdc\xf8\xb4\x74\x21\x32\xf5\x98\x12\xf7\xa9\x5d\xfb\xe8\x3a\x0b\x73\x35\x73\xd0\xf6\x79\xbe\x09\xd4\x89\xa4\x27\x81\xb2\x57\xad\x29\x17\xd7\x09\x27\x5e\xcd\x8e\xd7\x85\xd8\xc3\x00\x1d\x4a\xe0\xbc\xf8\x6b\xf3\x84\xa6\xac\xe7\xcd\xd8\x9f\xb3\xda\x7c\x49\x0e\xce\x9f\x9d\x81\x5f\x97\x17\x77\x8f\x09\x39\xf3\xea\x19\xc3\xb1\x59\xc6\x91\x9b\x24\x36\x57\x17\x28\xc7\x4f\x28\x15\xe1\x82\x18\xb8\x87\x19\xef\x23\x0d\x08\x76\x53\xfc\xc5\x0c\xfa\xdd\xbf\x2a\x1e\x7d\xb2\x96\x9b\x5c\x67\x2c\x1b\x2b\x9c\x3e\x2a\xfc\x20\x30\x18\x07\xc6\x07\xf3\x42\xc1\xc9\xbb\x2b\x17\x6f\x64\x1d\x8f\x21\x5f\xd8\x7e\x2d\x25\xad\x2f\xbf\xd4\x1e\x18\x01\xf9\x3f\xfb\x62\x3c\x47\x52\xa7\xf3\xe4\x9c\x5d\xd4\x73\x1e\x36\xd0\xb6\xd9\xee\x89\xe2\xe0\x0a\x74\x8e\xba\xd8\x13\x80\x1e\x27\x8e\x71\x3b\x89\x81\x2c\x0b\xb3\x0b\xbb\xae\xb2\x7e\x32\x9b\x12\x3f\x87\xc2\x48\x79\x21\x52\x7f\xf1\x80\x07\x7b\x21\xed\xa9\xca\x8e\x09\x70\x1c\xf8\x8a\xf0\xd4\x69\x46\xbc\x59\xab\xea\xbd\xf3\xcb\xc0\x2a\xd3\xab\x1e\x66\x7d\x77\xe1\x80\x0b\xd9\x1a\x41\xc2\x9c\x2e\x4f\xb7\x3d\x70\x39\xc1\x18\x02\x83\x78\xe7\x3d\xde\xbe\x0e\xe1\x08\x3f\x53\x06\x51\x44\x0f\xcb\x9a\x62\xe7\xb0\x9d\x0f\x38\x8d\xa8\xaf\x1c\xb7\x6e\x13\x68\x4f\xfd\x2a\xa0\x70\x5d\xa0\xa0\x1e\xf8\x60\x53\x1f\x5b\x3f\xa9\x00\xf0\xa5\x6b\xce\xe3\xd8\x73\x12\xf5\xd5\x54\xcd\xa5\xf6\x54\xd7\xfb\x44\x94\xf4\x1c\x72\x98\xe1\xe7\xde\x31\x65\xe4\xc8\xe1\x4d\xfe\x3b\xe8\x15\x7f\x3d\x60\x06\x50\xe0\x52\x52\xbe\x59\x87\x86\x1c\xab\xdf\x93\x23\xe6\xf2\xbe\x71\x26\xf5\xfe\x69\xf1\x75\x9c\x72\x7a\xb7\xde\x9b\x58\x54\x61\x51\x9e\xc3\xd8\x49\xd3\x2b\x56\x30\x19\x17\x6a\xe1\x4d\xcb\x3f\x75\x19\x89\x38\xe4\xbd\x92\xb6\x4e\x23\xf8\x66\x4d\x4d\x59\xc3\x3a\x0d\xe3\x73\xbe\xe1\xd3\x95\x97\xa5\x9e\x79\x10\x50\x17\x4e\x98\x16\x6f\xaf\xe7\x23\x7a\x3e\xd2\x0c\xe6\xaa\xae\xdd\x0c\x4f\x4b\x93\x53\x50\xdc\x6f\x60\x00\xad\xc4\x16\xd7\xd9\x9a\xf2\xe7\x9b\x57\x4d\x80\xd0\x68\x1d\x01\x11\xbf\xe1\xb7\xde\xbc\xae\x9a\xdd\xe0\xb9\x43\xc2\x0f\x5b\x40\x53\xdd\x07\x7b\xa9\xe4\x98\xb6\xc3\x7c\x7f\x2d\x9f\xa8\x45\x7a\xea\x60\x39\x59\x71\xb6\x48\x6f\x9d\x04\x0a\x56\x4e\xa6\xf4\x07\x2f\x98\xd5\x4f\xac\xa7\x81\x52\x9d\xaf\x40\x51\x74\x76\x23\xe9\xed\x24\x10\x28\xd7\xaf\x6a\x25\x9c\xda\x6b\xff\x56\xaf\xd8\x0e\xfd\x2b\x87\xb0\x3d\x3e\xa2\x8b\xa0\xca\x67\x55\xb8\x8f\x26\xdf\x53\x35\x67\x1c\x6e\xf8\xd1\x64\x9a\x45\x75\x60\x2d\x19\x31\x93\xa3\xc4\x22\x7d\x0a\xf7\xf1\xd7\x9e\x0d\x48\xd2\x86\xed\x27\x05\x6b\xe8\xb7\xce\xde\x06\x3c\xbd\xd9\xbc\xd0\x59\xae\xa8\x26\x1f\x8f\xdc\xad\xce\x69\xb9\xeb\x99\x64\x91\x9c\x8b\x51\xf6\xb3\x30\x6e\x15\xf3\xa3\x5d\x95\x9c\xdc\x8c\xc0\xdb\xe7\x3c\xd9\x9f\x0e\x0c\x7b\xf1\xbd\xe7\xc5\x3a\xa1\x0d\x2f\xc5\xb2\xce\xcf\x51\xa0\xad\x3e\x58\x53\x44\xf2\x9e\x66\x27\xe2\x1d\x51\x9d\x39\xd8\x03\x2b\x2a\xa1\xbf\x85\x72\x6a\x82\x71\xb2\xff\x8e\x93\x89\x09\x45\x0e\x52\xc3\xe6\x3d\x08\xf8\x70\x3a\x87\xb0\x3d\xae\x15\xba\x69\x80\x82\x0f\xef\xfb\x80\x43\x09\xbf\xe3\xb2\x89\x8b\xed\xfd\xea\x47\x80\x8f\x83\x94\xdf\x96\xf3\x5b\x31\x7a\x69\xef\xed\x80\x2e\x2f\x5e\xda\x0a\x89\xf0\x7f\x30\xdd\x27\xc9\x45\xe0\x03\x1c\x43\x5e\xd7\xbf\x12\x96\x63\x92\x2e\x9f\x20\x80\x28\x7b\xa1\xa5\xe9\x1e\xab\x26\x80\x6c\xdd\xc4\xaf\x79\xdd\x4f\xa2\x73\x48\xc7\x6f\x66\xff\x3c\x15\x94\x1b\xf0\xa8\x3b\xef\xb8\x7f\xd4\x40\xd8\x29\x30\x7d\xd2\x6e\xfb\xee\x6f\xb4\x0b\x7c\x3f\xf7\xff\xfa\x7e\x9e\x43\x73\xae\xea\x83\xf2\x2d\x85\x72\x14\x18\xa9\x9c\xb4\xfb\x90\x04\x32\x1d\x1c\x5a\xf7\x01\x32\xd2\xaf\x5e\x97\x8f\xf9\xda\x5d\x71\x49\xb3\xa1\xc6\x30\x7a\xfd\x97\x37\x3b\xa6\x5a\x65\x0b\x2e\xf8\xe9\x0b\x44\x90\x81\xaf\x61\xe5\x5b\x93\xfa\x89\xde\x1f\xd6\xdd\xbf\x7a\x5a\x41\xa7\x72\x84\xdf\x17\xfa\x7e\xdc\xa5\x98\x4e\x26\xd7\xfd\xdc\xe0\x32\x9c\x77\xff\x41\x46\x7e\x78\x7e\x08\xe5\xf8\x39\xc3\x58\x0b\xda\xd9\x95\x84\x70\xea\x5a\x5c\x87\x27\x8b\x2b\x6e\xb1\xb8\xe3\x24\xcd\xef\xe5\xb0\x21\x5c\x2b\x3e\xef\xb7\xaf\x7c\xc9\x2d\xe2\x9d\xb1\xcb\xa2\x2f\xb9\xcc\xef\xee\x95\x35\x2f\x33\x42\xbc\x55\xf9\x2c\x57\x4c\x63\x7d\x92\x98\x27\x4a\x30\xa8\x7f\xb0\x9d\xc9\x19\x0c\x00\x2b\xa4\x09\x03\x8c\x34\xa6\x03\x56\x43\xd5\xee\x4b\x96\xb0\x50\xc6\x93\xbb\x04\xd6\xb0\xea\x71\xb5\xd3\xdf\xef\xc3\xae\x61\x38\x01\x30\x1f\x46\xc2\xae\x61\xd0\x2a\xe7\x95\x90\x9a\xdc\x1e\xcf\x18\xf1\xd7\x2f\xc9\x38\xeb\x11\xe7\xc6\x38\xd6\xea\x33\xee\x62\x7c\x79\xe4\xa6\x57\x09\x3d\x25\xf0\x23\x19\xd3\x6e\x6a\x1f\x3c\x83\x77\x1e\x88\x22\x04\x4c\x47\xed\xd4\x6a\x20\x26\x3b\x71\x0c\x60\x07\xf8\x68\x1c\x84\x55\xb1\xf9\x4c\x26\xee\x14\x1f\x6a\x4e\x2e\xfc\x7a\xec\xa6\x1f\xbb\x6f\x5a\x98\x04\x54\xc5\xf3\xcb\xa1\x9d\xf1\xe4\xb5\xec\x16\x58\x63\x96\xdd\x87\xeb\xa0\x9a\x47\xb9\xca\x59\x75\xeb\x2d\x88\xd0\xf9\x1d\x16\xf1\x72\x88\xfc\x09\x40\x23\xa2\x3e\xec\x66\xfe\x7e\x4e\x3c\x93\x3c\x8a\x31\xb6\x19\x46\xf2\x77\xf6\xd0\xe1\xfb\x49\x0c\xc4\xca\xe0\xe3\xeb\xb8\x6d\x79\x56\x22\xe0\xbe\x74\xfd\x05\xce\x51\x30\xc4\xf9\x5b\x4f\x11\x40\xd0\x6f\x99\x09\x61\x31\xd1\x19\x73\x9c\x54\x8b\x3f\xde\xbb\xad\x4d\xe0\xc5\xa0\x92\xfd\xa1\x64\x31\xec\x9b\xfb\x95\xcf\xe6\xcc\x10\xab\x4e\xfe\xce\xb6\xcb\x20\x32\xc6\x53\x04\x72\xe9\xf7\x62\xdf\x2c\x45\x36\xa0\x67\x1c\xac\xdb\x77\x1a\xdb\xf5\x3b\x53\x4b\x07\x98\x69\x11\xf5\x63\x3f\xb8\x2b\xdf\xaa\x9e\x69\x96\xdd\x71\xeb\x6a\x5d\xc9\x5e\x75\xf0\xa6\x57\x1e\x38\xd2\xef\x5c\x21\x56\xbf\x5a\x64\xa6\x5e\x56\x28\xd4\x96\xfe\x52\x5d\xd7\x99\xa4\xef\xd9\xe9\xb8\xdb\xac\xd1\x38\x3a\x33\x3d\xb6\x9e\xaf\xe4\xd5\xe9\xb0\x52\x18\x9a\x72\x25\x52\x33\xbf\xe9\xc8\x6f\x9d\x4b\xd7\x39\x32\xd3\x2f\x24\x85\x91\xd8\xc1\x83\x71\x9e\xa4\xd7\x86\xb7\xe3\x38\x58\x08\x81\x2c\x43\x91\x9f\x72\x5c\x9a\xdb\x36\x51\xbc\x1b\x09\x05\xa6\x58\xff\xf9\x04\x2d\x4f\x18\x5f\xa3\x58\xfe\x58\xa0\x4a\x1c\xad\x53\x6e\x42\x8f\x8c\xef\x98\x09\x3d\x0d\xe9\x0b\xdf\x03\x62\x7a\xd2\x2d\xeb\x15\xfb\xb8\xf5\xe5\x02\xaf\x18\xb2\x01\xd7\xad\x94\xb4\x19\xac\x3f\x35\xe9\xef\x54\x5b\x73\xd7\x33\xde\xf3\x02\xf3\x55\xfa\x98\xb4\x27\xc0\x6c\xe9\xc5\x64\x5a\xd7\xde\x15\x38\x92\xd4\xd6\x0c\xa6\x96\x8a\x6f\xb9\x61\xfc\xd5\xd1\xbc\x8c\xa9\xae\xdc\xb2\x50\xa7\x94\xd7\x9d\xf8\x69\x51\x47\x8a\x15\xeb\xc6\xb4\x7d\xdf\x6f\xa7\x0d\xe7\xb7\xdb\x77\xa7\x58\x8c\x73\xd0\x3d\x5c\xc8\xb9\xf8\x55\x47\x9f\xb1\x5f\xfc\x19\x39\xff\x4d\x9e\xd8\x32\x7c\x2c\x1d\xc2\x56\x0a\x28\x13\x4e\xd5\x9e\xde\x21\x36\x90\x8d\x08\x28\x0b\x22\x59\x7d\x7f\x0f\xfb\x2c\x99\x3a\xb2\xd9\xe8\x7d\xeb\xc0\xae\xfd\x68\x39\xf2\x00\x5c\x85\x4a\x0b\x15\xb6\x7d\xf6\x2a\xd9\xca\x06\xff\x7d\x5f\x62\x36\xeb\x64\xef\xba\x17\x3d\x66\x4e\x6b\x77\x63\x6a\xf3\x73\x9d\x19\x92\xfe\x6b\x37\xaf\xe1\xbb\x40\x02\x77\xce\xcb\xb8\x7c\x86\xd8\xae\x78\x1e\xbb\xc8\x89\x89\x3d\x6c\xdf\x83\xcb\xb4\x1f\xee\x43\x31\xcc\x81\x8c\x4d\x16\x5d\xa3\x3b\xfd\x5d\x24\xe3\x77\xfe\x93\xc6\x6a\x1c\x44\xf8\xb7\x17\x81\x78\x3b\x90\xd6\x93\xc0\x7c\x4b\xba\xab\xa7\x2c\x1a\x90\x9a\x57\x37\x0f\x7a\x98\x15\x58\x8f\xd8\x27\xbb\x6d\x5a\xf2\x3b\x9d\x73\x7b\xb6\xff\xc6\x0d\x72\x89\x26\x8d\x4c\x52\x7b\xa7\x9e\x47\x80\xf8\x76\xbe\xde\x87\xbc\xb1\x7c\x01\xeb\xc2\x13\x0b\xf4\x96\xc0\xff\xe1\x64\xdb\x16\x12\xbe\x08\xb4\xb5\x6f\x7f\x24\x46\xa3\x1e\xbb\x45\x32\xca\xcc\xf3\x9f\x3e\xe7\xbf\x7f\xf5\x85\xca\x20\x15\x25\xe7\x44\xf1\x52\x8a\xe3\x14\x61\x89\x4e\xd6\xe5\x0d\x62\xcb\x5d\x2d\x9e\xba\x78\xe5\x10\x8b\xbf\x3d\x9d\x45\x5a\xef\x51\x39\xd8\xdf\x7b\x1a\x8a\x0d\x92\xb2\x9b\x43\xa4\x5b\xa6\x90\xf1\x3f\xba\xaa\x00\xc4\x66\x3d\x19\xf5\x6c\x3e\x52\x92\xb6\xb8\x8a\xb2\x88\x47\xdf\x01\x06\x08\xc9\x0f\x8f\xe0\x36\x41\xf3\x05\x3a\xf9\x8c\x19\x1b\xab\xdd\x91\xd2\xe0\x51\x66\x12\xe9\x53\x8e\x1a\xf4\xf9\xbf\x5a\x86\xcc\x72\xd1\x62\x96\x00\xec\x39\xc4\x09\x2c\x0b\x6f\xb7\x55\x86\x24\xf4\x9f\xf9\xf6\x48\x8d\x94\x3d\xf9\x40\xbf\x9e\x55\x61\xd9\x83\x8a\x09\x95\x69\xf6\xfc\xf6\xa1\xcc\x0a\x52\xd0\xbf\xb5\xcc\x81\xd6\x4b\xed\x2a\x95\x92\x33\xbf\x05\x23\x16\xa0\x1e\x26\x57\x86\x18\xcb\xdc\xa5\xe7\xfe\x99\x6b\x25\xdc\x68\x42\x3b\x88\xcf\x55\xcc\x88\x9e\xd6\x44\x5b\xe9\x25\x64\x1b\x8f\x15\x1c\xfc\x7f\xb4\xc9\x35\x46\xed\xce\x60\x77\xd7\x22\xaf\x0b\x81\x86\xee\xd1\x43\xce\xff\xe4\xef\xe8\xe4\x65\x90\xcf\x4e\x3f\xd9\x7e\xca\x25\x79\xf7\x00\xe7\x93\x1b\x35\xff\xea\xc5\x0c\xf8\xf9\xbf\x3a\xf8\xea\xff\x0b\xf8\xfe\x98\xf3\xda\x96\x9a\xfb\xe9\x32\xee\xae\x15\x27\x58\xe6\x74\x83\x1e\x39\x0f\xc4\xff\x9f\x5e\x5a\xb5\x39\x08\xb5\x9d\x68\x3d\xf1\x7a\x16\x43\x34\x73\x59\xa7\x1c\xb1\xac\x30\x18\x2e\xec\x7a\xfc\x8f\xee\x24\xdb\x8f\xf1\xe0\x57\x29\x65\xa1\x97\x66\xbc\x3b\x8d\x87\xd3\x6f\xe9\x50\xf1\xb3\x88\x01\x1d\x35\xa0\xbf\x73\xe9\x48\xf6\x44\xc9\x73\x66\x5f\x9f\x10\xcc\x15\xd1\x86\x87\x43\x7c\x6e\xef\x98\x27\x2b\xd6\xfa\x27\x0f\x20\x00\x4e\x85\xa4\xb6\xa8\x74\x53\xff\xa9\xa5\xac\xff\xea\xfb\x01\xd9\x33\x4f\x13\xe4\xdf\x7c\x13\xd6\x3f\x5f\xd2\xb9\x86\xc8\x8a\x98\xe1\x90\xa3\x68\xfb\xca\x96\xa5\x99\xc4\xce\xa7\x91\x6d\x66\xf8\xea\x20\xca\xa9\xf9\x93\x67\x39\x76\xda\x24\xbb\xd7\x9b\x8d\x49\xef\x5d\x2d\x6e\xff\xe6\xab\x04\xbe\xb2\x91\xa6\xfc\x0e\x1c\xe3\x3f\xdc\x37\x24\x3c\xb6\x5b\x41\xbb\x0b\xfd\x7c\x20\xe8\x43\xb1\x2a\x2d\xdf\xe7\x4e\x63\x54\xf7\xfa\x4e\x32\x1a\x0a\x63\xfe\xa9\x4d\xa5\x94\xe1\xf1\xf2\xec\xf7\x9d\x98\xae\xde\x10\xbf\xd6\x56\x57\x13\x89\x3d\xa4\xbe\x21\x78\x8f\xda\xbc\xe1\xb5\xb0\x8c\x45\xb4\x3f\xb9\x63\x05\x3c\xbf\x4c\x4d\x49\xfb\xa0\xa9\xb1\x55\x8f\xa2\xd1\xf1\xd8\x88\xd5\x47\xe2\x0a\xd6\xf4\x37\xe7\x53\x9a\x62\x3f\x28\xf3\xf5\xfd\x6a\x68\xbb\x6f\x42\x85\xf5\x0c\xd7\xa6\x39\x54\x62\xc8\x0c\x4f\x2a\xb7\xae\x82\x77\x1d\x8a\x40\x54\xf9\xf2\x4b\x91\xbc\xf1\xe3\x3f\xb9\x38\x23\x98\x5d\x8f\xc2\x83\xac\x19\x17\xb8\x21\x50\x5f\x3d\x0b\x31\xd4\xc5\x8a\xac\xf6\x57\x2a\x98\x5f\x05\x8f\x86\xaa\x8e\x93\x05\x1d\x62\xba\x09\x95\x92\x1e\xdd\xd0\xb0\x7e\x63\xa0\x97\xcb\xc0\x08\x4a\x33\x59\x79\x40\x52\x95\xb5\x70\x54\xae\x44\x90\x0d\xe1\xb6\x83\x5b\x68\x11\x15\x25\x20\x54\xb2\x68\x2f\xcc\xcd\x2b\xd1\xef\x0d\xdd\x09\xf7\xa7\xee\x1f\xc5\xc7\x9f\x2a\x61\x25\x5e\x59\x9b\xbb\x4e\xd9\xf0\x1b\xd2\x8a\xa3\x88\xa9\xd2\xb4\xc8\xb0\x49\x19\x9d\xde\x1e\xd8\xdd\xb3\xac\x33\x5f\xb2\x10\xd8\x76\x34\x19\xa6\x21\x93\x1d\xc0\x35\xc2\x69\x8e\xff\xec\x60\x63\x44\x94\xa2\xbf\x52\xb7\xdc\xbb\xec\x9d\x7e\xc7\x68\x9c\x79\xa0\x7c\x55\x19\xe3\xdf\x4b\x85\xae\x52\x38\xb0\xe8\xf3\x6b\xa1\x9d\x90\x7c\xc2\x68\x32\x51\x7d\x79\xeb\x52\x0b\xd6\xee\xc1\x4a\xec\xfc\xcf\x7a\xa0\xd6\x67\x93\xda\x9b\xd4\xcf\x5b\xf7\x56\x0d\xe8\x4c\xdd\xe3\x57\xcd\x3a\xbb\x45\x02\x2a\x87\xb4\x53\xfd\x5c\x37\x75\xf4\x45\x29\x52\xf1\xd1\xc5\xc7\xcc\x8a\x57\xfe\x41\x59\x5e\x45\x4e\x95\xe8\xf2\x1b\x6b\xa9\x83\x29\x5e\x08\x81\xa5\x0f\xaa\x8b\x33\xdd\x6d\x60\x97\x0d\x1e\xec\xd5\x67\xa1\x32\x9b\x40\x18\x98\x80\x2f\xf0\x01\x08\x9e\x79\xc1\xd0\x54\x00\xf3\xc3\x7d\xb3\x6f\xe7\xe8\x59\x7c\x1d\xea\x2f\xe6\x93\xb9\x60\x9a\xec\x9c\x7c\x17\x18\x0c\xf5\xf4\xdf\xfc\x4c\xfd\x17\x2f\x8f\xb8\x1d\x02\xaa\x84\x10\x49\x97\x42\x5a\x7e\x13\x28\x20\x85\x80\x73\xb9\xa2\xfd\xa9\x88\x22\xc5\x4e\x79\x20\x83\xfb\x89\x7e\x55\xee\xdf\xde\x25\x79\x92\x5b\x9e\x1c\xc6\x36\xd0\x1c\x63\xa6\xdf\x6f\xf3\x40\x18\xac\xe7\xa0\x80\x83\x9a\x94\xb4\x8f\x84\xf2\xe1\xc9\x41\x03\x7a\x12\x86\x5d\xbf\xd1\xac\x57\x09\xbf\xbb\xab\x5b\x90\xb5\xf3\x2b\xbf\x1b\x82\x41\xff\xd4\x08\xa5\xc8\xeb\x73\xb4\x69\x15\x3a\x6b\x7a\xd8\x12\x6a\x9e\x28\x01\xdd\x55\x8e\x9f\x33\x0b\x74\x9a\x0b\x8e\xd6\x71\x22\x38\xa9\x82\x94\x32\xac\xd8\xce\x63\xbe\xbe\x85\xdd\x50\x97\x30\xdc\x7a\x61\x74\xe3\x25\xe8\x13\xca\x45\x98\x96\x39\x59\xfc\x9b\xeb\xce\xe4\xed\x25\x05\xe3\x91\x13\x74\x84\xdd\xf5\xf0\xf3\x09\x1d\xa9\x72\x50\x55\xde\x82\x7e\xeb\xb9\x1c\x03\xea\x7e\x07\x76\x0f\x34\xd3\x3a\xec\x9d\x79\x33\xf0\xdb\xb1\xa0\x40\xb0\xca\xa4\x45\xc4\x3f\x79\x5a\x42\xda\xc5\x0f\xf1\x92\x3f\xc0\x50\x19\x58\x5d\x62\xb7\x2c\x1d\xa3\x0c\x10\x85\xcd\xfa\xb0\xd6\x45\x14\xec\x45\x0b\x74\xef\x9e\x56\xaf\x0c\xe0\x91\x8d\x91\x44\xf3\x09\xf1\x8c\x0e\x3e\x7a\x98\x12\xa9\xcb\xc1\xae\xd9\x71\xfe\x7d\xea\x6d\xe1\x6f\x6e\xfa\x5b\x07\xd0\x92\xdf\x42\xa6\x1e\x63\xe9\xbe\xb1\x8f\xab\x8f\xb2\x8c\xf9\x62\x28\x8b\x9f\xeb\x64\x58\x88\xea\x77\xfd\xd1\x41\xfc\xd2\x70\xd9\x7d\xd3\xee\xe3\x07\xe9\x3e\x6e\x97\x9e\xbd\x3d\xd7\xa4\x65\x31\x6c\x48\x1d\xaf\xa1\x9c\xee\x9f\x8f\xe1\xae\xf9\xa9\x0a\x9e\x24\x9a\xdf\x3e\x3b\x08\xe8\x0b\xfe\x5b\xcf\x68\x49\xcf\x79\x3b\xd1\x84\xa1\xa8\x31\x22\x67\x99\x85\x46\x28\xf5\x52\x8a\x05\x72\xca\x55\xfb\x10\x8d\x97\x86\x43\xf7\xc7\xcd\xa1\x39\x09\x48\x53\x24\x11\x45\x0d\xfa\x7e\x61\x17\xb7\x81\x66\xd1\xcf\x5b\x9a\xd7\x7a\x96\x62\xd8\xad\x36\x22\x2c\x41\xbb\xf1\xfd\x58\x63\xb9\x50\x98\xd6\x82\x57\x20\xb3\xa9\xe7\x5b\x23\xd7\xbd\xa0\xcf\x27\xca\x6c\xa3\x45\x9e\xc7\x9f\x7b\xe3\x00\x62\xaa\x02\xe8\xfa\xfa\x55\x1b\x05\x7e\x5c\xe7\x23\x82\xa2\xef\xb0\xf3\x06\x21\x11\x6e\x8a\x01\xac\xd9\xda\x4e\x18\x03\x9a\xd4\xdf\x68\x2e\x58\xa2\x37\x49\x8e\x81\x38\xce\x98\xcb\x93\xb3\xe2\xe1\x84\xb5\x02\x56\x85\xbd\x75\x7d\x97\x8c\x49\xcb\x00\x2e\xfe\xfb\x43\x1a\x41\x09\xbc\x29\x64\x48\x1c\xd6\xaa\xf2\x39\xb1\x87\x84\xe9\xb2\x14\xa8\xe4\xa6\xc1\xcf\x85\xc1\x29\x7e\x48\xaa\xec\x99\xd1\x38\x25\x70\x65\xb4\x34\x95\xc2\x51\x94\xb8\x63\x6d\x29\xc9\x70\x5a\x01\x4a\x28\x75\xc0\xd7\xb7\x64\x30\x1e\x68\xfc\xfb\xa1\x44\x00\x14\xa9\xe4\x0d\x82\xb9\x8d\x98\x2f\x79\xd2\x82\xe2\xdb\xe9\x8d\x85\x24\xf4\x79\x09\x06\xe8\x6a\xef\xb1\xe4\x12\xdb\x6f\xdf\xfc\x75\x44\x14\x53\xdf\xed\x8c\xb6\x2d\x6e\x57\x0f\xd9\xdc\x34\xeb\xe0\xb5\x57\x94\x9e\x83\xb9\x77\xfd\x9b\x09\xbc\x64\xd6\x3c\x47\xd2\xab\xad\x35\xd4\xd5\xfe\x83\x15\x04\xd0\x8d\x9c\x4c\xf8\xaa\x38\x7f\x50\x16\xe0\xba\x42\x9c\xf6\xba\x55\x09\x76\xd7\xb0\x47\x8c\xec\x1f\x2b\x36\x28\xda\xc2\x1e\x21\x7b\x9f\x8f\x7d\x62\x5a\x3d\x93\x84\x69\x7c\x6a\x83\xf4\x09\x29\x5a\xb7\xa1\x17\xff\x7a\xe6\x9a\xb2\x04\x6a\x23\xa4\xfc\x47\x6e\x56\x81\x7f\x69\x4c\xfe\x79\xad\xca\x9f\xe9\x18\x2b\x56\x7c\x54\x47\x8e\xae\xb3\x4a\xd3\x9e\x76\x76\x2f\x87\x1f\xad\x5f\x82\xe5\xe9\x3d\xd6\x27\x0c\x78\x01\x2f\x2a\xf7\xf3\x1d\xe1\xdc\x63\xf5\x53\x77\x5c\xd8\x89\xf2\x45\x95\xb9\x14\x52\x30\x9b\x26\x0a\xc2\xf7\xfc\xd4\x5a\xe7\x50\x27\xbd\xfa\x30\x92\x7f\x8e\x47\xe1\x52\x93\x39\xe4\x42\x4d\x7f\x9b\xfd\xcf\xcb\x4a\x11\xd6\x26\x5c\x35\xa4\x92\x79\x72\x04\xc4\xcd\xbe\x6c\xb0\x8c\x1b\x9e\xea\xdd\x99\x39\xec\x58\x37\x8d\xdc\x64\x0a\x81\xd4\x79\xaa\x81\x86\xbc\x6c\x23\xe8\xd9\xaa\x71\xe5\x10\x49\x9c\x90\xd6\xa3\x5a\x54\x72\xb5\x0a\xa0\x12\x2e\x0f\xeb\x23\x9e\x00\xb4\xdd\x58\x9e\x93\xa7\x54\xac\xc0\xc3\x13\x81\xbf\xcb\x7f\xce\x55\x12\x0c\xbd\x46\x7d\x65\x46\x74\x2a\x19\x2f\xa7\xb4\x54\x61\xc4\xb1\x25\xe9\x55\xdd\x5a\xa5\x1c\xe1\xb7\xbb\xb7\x16\x23\xe3\x3f\x3c\xf0\xee\x43\x7b\x0b\xa5\x3e\xab\xe3\x8a\xca\xef\xb0\x54\x97\xf4\xe9\x2b\xed\xd7\x4c\x9e\x31\x54\x4a\xf6\xe1\x0f\x7e\xc6\x25\x48\xc7\x40\xad\xf0\xc6\x3c\xc4\x20\xe0\x95\xa1\xf1\xfa\x4f\x0e\x01\x70\x8b\x55\xa2\x19\xab\xfa\x18\xb8\x6f\x97\x58\x0b\x89\xf9\x44\xb2\x18\x90\x4a\x8f\x5a\xb7\xf0\xbb\x87\x2c\x8f\x05\xff\x20\x3d\xc4\x0d\xae\x24\xa6\xb8\x76\x78\xc6\xb1\xb8\x53\x53\x8e\xb7\x0e\xf3\x49\x38\xe1\x43\x5c\x4f\x9e\x3d\x96\xe0\x21\xef\x25\x6f\xa2\x0d\x1c\x4b\x67\x68\x62\x72\x21\x43\x97\x8c\x3f\xdc\x84\x10\x28\xb4\x54\x05\x9f\xb1\x6c\xad\x13\x68\xf7\xdb\x8c\xaa\x39\xba\xd6\x7b\x79\x42\x37\xff\x78\x67\x16\xc1\xa3\xf9\x8b\xe1\x86\xf5\x96\x1a\xbb\x58\x57\xd1\xa4\x9a\xdc\x17\x46\xc6\xfd\x06\x5c\xf6\xba\xa5\x83\x09\xc6\x83\x23\x36\x44\xad\xc2\x50\xe6\x22\x20\xf8\x85\xfa\x8a\xf7\x20\xc6\x44\x7a\x49\x10\x03\x41\x63\xf1\x1f\x57\x12\x72\x19\x2f\xcd\xfa\xab\x98\x6e\xf9\xfc\x84\x1f\x95\x79\x20\xef\xf9\xed\x5f\xe5\xba\x88\x04\x48\xfd\xdb\x98\x6c\x2d\x05\xf1\xab\xee\x8f\x60\x04\xbb\x6e\xdd\xfa\x5b\x1b\x01\x7c\x83\xd5\xeb\x3c\x38\x1f\xb6\xc0\xa3\x5e\xd5\x9e\xb9\xb7\x77\xc9\x29\x51\x30\x33\x7b\x79\x3f\x8b\xa7\x48\x92\xc0\x0f\x38\xa3\xd4\x15\x52\x20\xe1\x63\xb5\x4f\xfc\x01\x08\xb6\xaa\x31\x1b\xf9\x67\x23\x79\x66\xe7\x74\xb3\x87\x42\xa0\x04\xa8\xd0\xce\xa7\x68\x76\xa9\x02\xd2\xda\x07\xa4\x07\xb0\xfa\xf9\xbe\x08\xdd\x32\x93\x77\x84\x1a\xfb\xdd\x4f\x07\xaa\x92\xa2\x8a\xe9\xde\xac\x77\xd2\xaa\x1e\x20\xa4\xa1\x90\x85\x12\xf9\x4d\x42\x07\x47\xee\x58\x0b\x49\xdd\x04\xbe\x7c\x50\x16\xa9\xa9\x0a\x34\x25\xd9\xf4\xd2\x9f\x52\x40\x17\x4f\x20\xfb\xc8\x9b\xcf\xfc\x60\x08\x05\x3d\x6c\xad\x40\x2c\x9f\x6c\xe4\xde\xa5\x7a\x38\x9a\x98\x4f\xf2\x6e\x97\x50\x34\x31\x38\x66\x0c\x9f\x76\xd7\x67\x71\xd3\x2d\xeb\xd3\x2e\x40\xd9\x9d\x77\x9c\x9f\x74\xb1\x51\x09\x0a\x06\xeb\xe9\x8d\x88\x17\xd3\x45\xec\xde\x80\xd7\xd7\x77\x19\xf5\x86\xf5\xb3\x76\xeb\xb3\x09\x86\x26\xe9\x99\xf7\xb3\x75\xc3\xe1\x54\xc5\x42\x13\x67\x64\x0d\x0f\xd4\x2e\x51\x8c\xd0\xfe\xb5\xab\x94\x6c\x54\x4b\x10\x6b\x59\xd6\xc3\x46\xa5\x97\xf9\x38\x3f\x03\xaa\x66\xa5\xa6\xc6\xef\xe8\xd9\xa7\xe7\x96\x7e\x9e\x5f\x9e\x01\xcb\xb1\x9d\xa4\xe8\x89\xe3\x08\xdf\x66\x37\xee\xea\x9e\xe5\x05\x58\xa5\xc2\xf2\xf6\xc6\xb5\x6a\x89\x10\x75\x14\xb3\x7b\xa8\xcf\xa5\xad\xcb\x33\xe0\x65\xec\x7a\x3b\x6c\xc1\xbf\xde\xe9\xfd\xcf\x3b\xd9\x46\x09\x73\xa3\x10\x5e\x4d\xad\x34\x8f\x12\xc2\x62\x6f\xc6\x00\x8e\xa5\xc5\x75\x96\xf3\x0e\xbd\xb3\xb7\x90\xc1\xb7\xec\xfe\xbe\xd5\x4d\x24\x8b\x76\xdb\x8c\x08\xa0\x0b\x10\x63\x3c\x92\x47\x72\x02\xaf\x79\xdf\x7a\xb0\xa9\x92\x09\xe3\x95\x1d\x01\x9b\x37\x6d\x39\x1d\x30\x49\x89\x71\x51\xdf\x18\x6a\xac\x29\x4b\xdc\x02\x0f\xca\xf5\x0d\xfd\xb3\xd5\xbb\xb2\xcc\x86\x29\xd4\x06\x94\x79\x8d\x70\x98\x95\x6d\xd3\x4f\x5e\xed\xd6\x57\x56\xbd\xfc\x1c\xab\xc6\xe5\xa1\x3a\xf6\xa3\x2c\x01\x51\x28\x71\x9f\xdb\x4e\x1c\x63\x4c\xe0\x22\xd1\xd5\x3b\x8e\x12\xd8\xe9\x83\x4c\x5b\xc2\x7b\xe2\xd2\xac\x19\x96\x0e\xf1\xc4\x13\xb8\x2d\x72\x20\x06\x87\x3a\x80\x6a\x23\x0c\x51\x37\x9e\x16\xb6\x7f\xb1\x4f\x59\x27\x47\xf5\xea\xdb\x25\x18\x68\x9e\xc5\xe5\x9f\x6f\xab\x84\x21\xef\x90\x57\x3e\x0e\x41\x6c\xf9\x30\x69\xeb\xc5\x79\x41\x5c\x00\xcd\xc7\x3d\xc2\xe6\x57\xb7\x4c\x23\x32\x61\xb8\x88\x9b\x4e\x50\x2f\xa2\xdb\x64\x8f\xcf\x27\x3b\xc0\xd8\x4e\x0f\x23\x36\x16\x20\xa9\xef\xad\xfb\x40\x81\x88\x45\x32\x4c\x44\x1b\xc9\xe7\x5b\x78\xc9\xa7\xa3\xe0\xd6\x17\x28\x2b\xb7\xa9\xb9\xa6\xf0\xbf\x3e\x4d\x10\x26\x4a\x4f\x38\x4d\x9e\xb6\xa8\x87\x9a\xc8\x74\x56\x38\xf9\xd0\xea\x2a\x46\xc1\x51\x1b\x88\x60\x60\x09\xc5\x41\xd5\x86\x7a\xaf\x99\xb5\x81\x62\x1c\x12\x3e\x34\xea\x8f\x3e\x25\x43\xf8\x23\xc5\x5a\x20\x2c\x78\x86\x30\x55\x68\x0f\x65\xa7\xd3\x04\xa8\x3f\x4e\x67\xe8\x02\x7e\xa2\x08\x7a\xf3\x08\xc0\xac\xef\xbf\xcf\x2b\x82\x2d\x96\xb6\x56\x24\xa4\xc3\xca\x95\xed\xb0\x96\xa2\x6e\x99\xab\xe7\xa0\xa4\x60\x49\xb1\xac\xe9\x8d\x8d\xbc\x7b\xd2\xce\xf7\xe3\x41\xf3\xc6\xc8\xe2\x0d\xa4\xbe\xbc\x53\xc2\x6f\x70\x1f\x21\x37\xfd\xae\x2e\xb3\xfa\x75\x06\x4a\xc4\xe1\x38\x0e\x23\x74\x3b\x5f\x8e\x42\x05\xc6\x30\x10\x59\xf1\x13\xe0\x99\x40\x0e\x72\x36\x14\x43\x02\x9b\x98\x3d\xd5\xde\x4f\x2d\x1d\x77\xe9\xe1\xe3\xa6\x21\xa5\x99\x54\x6d\x36\xa5\x1c\x5e\xa9\xdc\xd5\x6f\xf7\x7a\x76\xc9\xf9\x61\x17\xa0\xde\x85\xb7\xfe\x21\x42\xb6\x45\x12\x6c\x15\xe6\xeb\x24\xf8\xd8\x3a\xa9\xfa\x6e\x68\xb1\x51\x80\x84\x1c\x18\x23\x11\xa8\xd7\xdf\xfd\xca\x89\x7c\x1e\xdd\x5c\xa4\xb6\x8e\x52\x84\xd3\x8c\x98\xea\xf6\xc2\x07\x67\xac\xd9\x48\x0d\x85\x3a\x4a\x61\x9f\x3b\xcc\xe1\xe4\x02\x7b\x3b\x29\x33\x7b\xa6\xf0\xf2\x58\xdf\xdb\xed\xe9\x1e\x99\xfa\xba\xf8\x05\x4f\x60\xfc\x07\xf8\x44\xb3\x5a\x59\x1e\x92\x47\x27\x41\x1e\xf5\xc6\x70\x2e\xd6\x24\x20\x55\x0c\x7d\xf8\x39\x3e\x02\xe4\x29\x7b\xf3\x1b\xc9\x39\x3c\x93\xe1\x69\x91\xb6\x8a\x48\x37\xef\x06\xb2\xdd\xce\xef\x24\x43\x4d\x7d\x76\x74\x7f\x5b\x58\x55\xee\x92\xdc\x21\x73\x8f\xfd\xf6\xcf\xb8\x11\x19\xc1\xa4\xfa\x2b\xc1\x48\xd5\x71\x90\x77\x9c\x77\x9d\xbf\x76\xad\x1e\x90\x9c\xc2\xe9\xf2\x91\x42\xe8\xa0\x78\xa4\x7f\x00\x08\x04\x31\x8b\x2c\x98\xa2\xb5\x54\xbf\x7c\x19\x65\x68\x73\x1f\xa3\xc3\xfd\x35\xcd\xc4\x8f\x97\x85\x9d\x4a\x0e\xc0\x3f\xbb\xfa\x71\x63\xb7\x55\x7d\xba\x8a\x6e\xa6\x9d\x03\xaf\x09\x6e\x74\xe1\xcb\xc0\x24\x6c\xaf\x43\xec\xd8\x71\xba\xa8\x90\xeb\x9a\x26\xc1\x5b\x64\xf6\x37\x46\x0a\x04\x7a\xf1\x81\x70\xf3\x76\x0d\x49\xe5\x9d\x52\xbe\xfe\x69\xd3\xfa\xaa\xaa\xe5\xb3\x7b\x77\x54\x19\x62\x2e\x8b\x3d\x71\x60\x63\x5f\x17\xfb\xa6\xcf\xb5\x7b\xe3\x21\xd7\x63\x3c\x65\xb4\xb5\xb8\x17\x8d\x7c\xd0\x1a\x6d\x53\xa1\x1c\x77\x49\x96\xf3\xf9\x3f\xee\x4c\x97\x8a\xf8\x55\x01\xed\xcc\xda\xb4\x55\x43\xb7\xad\xb6\x90\x8e\x32\x8f\xec\x91\x76\x3b\xcc\xe4\x55\xd5\xb8\x7b\x9b\x0e\x09\xe2\x6a\x18\xe2\xa0\x36\x3b\xdf\xd9\xe7\xf3\x50\xf2\x7b\x4d\xe5\x73\xda\x7e\x76\x8c\xa8\xa5\x90\x6b\x96\x44\x52\x14\x08\x3f\x43\x83\x90\xa7\x5c\x23\x16\x41\xf8\xca\x3f\xb6\x7c\x15\xbe\x16\x95\xb0\xd0\xcb\x5a\x0d\x66\xb6\x53\x47\x16\x7d\xf3\x26\x9d\xd1\x22\x51\x51\x80\x23\x48\x41\xf4\x2a\x3f\x74\xf8\x79\x2b\x0f\x24\xb9\xce\x70\xef\x8f\x7e\x33\x4f\x7d\xbd\x0d\x49\x5e\xd2\xd0\x63\xd4\x7d\xfc\xe6\x02\x3d\x61\xa6\xe5\x66\x57\x13\x6b\x8c\xe4\xad\x4e\xa8\xb6\x23\xab\x55\xb8\xcc\xe8\x1f\x5f\xa5\x4d\x4c\x2d\x16\x8a\x91\x71\x6e\xcc\xdb\x24\x93\x4c\x51\x6d\x3e\x67\x83\x0f\xae\x36\x42\xde\xda\x5c\xed\xdf\x0c\x9c\x37\xbb\x27\xf3\xae\xea\xf7\x7c\x37\xa4\xb7\xe6\x3e\xa1\x69\xe7\xb9\xb7\x7a\xb4\x52\xdd\x58\x60\x03\x3b\x8e\x73\xbe\x02\x84\x41\x09\xbf\x59\x86\xfb\xaf\x7d\xa9\x4c\x2e\x87\xb2\x37\x91\x81\x88\x59\x8e\x9a\x4e\x70\x2c\x97\x99\x26\xeb\xf5\xc2\x7c\x82\x13\x86\x6b\x39\x5f\xa9\x31\x79\xf0\xd7\x49\x70\x44\xbd\xca\xfb\x74\x77\x48\xf7\x3e\x36\x97\xae\x30\x93\xa6\x67\x3d\x7f\x1b\x6d\x80\xb4\xe7\x2b\x86\x06\xd7\x18\x6f\xd8\x7e\x05\x76\x14\xfb\xd1\x18\x24\xa1\x52\x51\xe5\x58\x17\xfe\x3d\x87\x51\xbf\x1d\xb8\x68\x9d\x48\xb4\x5f\x6d\xac\x1b\x97\xe9\x17\xb7\x3c\x65\xae\x87\x3b\x58\xab\xb5\x38\x3c\xa6\x47\xe1\xbe\x81\x8e\xa9\x3e\x59\x82\xf6\xeb\xbb\xe0\x94\xb0\x56\xea\x61\xc3\x29\x27\x08\xb1\xaf\x2b\x0c\x88\xa4\x55\xc4\xbc\x0a\xbd\x00\xe5\xcf\xbf\x5c\x9f\x22\xda\x75\x43\xdc\xf0\xad\x59\xa4\x98\x0c\xd1\xdb\x1e\x1f\xe4\xf1\x54\x15\x15\x04\x9a\x65\x68\x7b\xfc\xb6\xdf\xb2\x87\xfa\x78\x24\xc5\x5b\xff\xbe\xef\xd9\x17\x41\x2e\xdd\x54\x88\xea\x44\xb9\x81\x78\x34\x10\x15\x7b\xc1\x77\x13\x0c\x1e\x8d\xa1\xfc\xf1\x3f\xcf\x16\x99\xcc\xaa\x9d\xa8\x72\x01\x54\x30\x0b\x60\x20\x55\xd3\x5b\x29\x12\xac\xee\xeb\x81\x74\x91\x0e\x88\xcf\x1e\x17\xbb\xff\x44\x46\xe1\x39\xff\xf2\xc3\x58\xae\xe2\xe0\x2d\x4a\x09\x41\x4a\xca\xfc\x72\xcb\x66\xfd\x0c\x24\x99\x33\x56\x28\xa0\x26\x00\x32\x72\x8b\xa3\x1f\x37\x64\x01\x3b\xbf\x0e\xbc\xe0\x86\x5f\x97\xe6\xe2\x8e\x16\x54\xcc\x70\xad\x5e\x77\x87\x6f\x99\x26\x4e\xe9\x73\x19\xf1\xb4\xbc\x4d\x22\x17\x30\x02\xfd\x4e\xc2\x13\xa2\x88\x9d\x6c\xd5\xa2\xce\xb1\x14\x25\xa0\xfc\xfb\x37\xce\x95\x4c\x0b\x6c\xa5\x82\x71\x09\xf1\xed\xaf\x89\xf3\xae\x18\x29\x60\x65\xa0\xf6\xb3\x20\x6f\xd6\x01\xe3\xcb\x15\xb5\xea\x6c\x60\xbb\x43\xc2\xf5\xcc\x87\x2f\x00\xf0\x29\xf7\xf8\x4d\xe4\xa2\xdd\x60\x69\x90\x53\x22\x89\xfc\x8d\xd9\x04\x51\x5b\x2c\x5b\xd7\x41\x5f\x4e\x62\x19\xf9\xda\x9c\xd0\x63\x62\x8c\x0c\x8a\xbd\xd4\x59\x2d\x8c\xa4\xcc\x5d\xb1\x5e\xc2\x5b\x78\x90\xc4\xd1\x89\x67\xac\x53\xbc\xaa\x6f\xb1\x49\xfc\x71\x24\x92\xf0\x99\xd2\x1c\x48\xee\x44\x62\x53\x58\xe2\xf0\xe1\x55\x45\xb7\x78\x1e\xd8\xad\xc4\x08\xf8\xe6\x56\xe9\x06\xde\x81\x21\x19\xe4\x69\xe5\xb5\x54\x28\xe4\x64\xba\xa6\x6f\xd1\xff\xf0\x6e\x81\x96\x4e\x24\x00\x73\xf2\x5a\x12\xf8\xfc\x49\x59\x5e\x8a\x02\xc3\x1a\x6d\x23\x3a\x1d\xfa\x6e\x61\x42\x0d\x62\x33\x7f\x04\x4f\xf7\x8d\xd4\xa5\xfa\x4a\x35\x81\x21\x00\x62\xfd\xd5\x59\xbb\x90\x30\x96\x3b\x6e\xc0\x16\xfb\xa1\xe8\xef\xb7\x17\x59\xa8\x62\xab\xc8\xca\x9c\x9b\x3a\x6b\x48\x83\x0b\xd6\xac\x8f\x06\x81\x7b\x7d\xd9\x8d\x21\x12\xc1\xfc\x47\xd7\xe4\x7a\x1f\x57\x34\xc4\x19\x9a\x7c\xad\x9f\x3a\x32\x41\x86\x5e\x7c\x3b\x87\x9f\xd9\xfd\x81\x47\x43\x09\xb7\xca\x4d\xb0\x75\xec\xab\x5a\x0d\x2b\x04\x4e\x1d\x6d\x27\x81\x25\xe3\x09\x15\x4f\x8b\xc9\xb7\x3f\xe7\xed\x28\x41\x3e\x32\xfe\xac\xc8\x40\x2d\x97\x04\xc4\xe5\x68\x8e\xc3\x4c\x27\xa3\x69\xf0\x5f\x14\x8c\x08\xbb\x80\xcf\x13\xd5\x87\x45\x2c\x85\x24\x3e\x27\xaf\x15\x85\x39\x71\x53\x05\xfb\x2c\x94\x9f\xf8\xa4\x17\x7d\x39\x8b\x91\x51\xd6\x27\x97\xef\x47\x6b\xec\x3b\x43\x2c\x00\x78\xa0\x71\x8d\x97\x5a\x19\x15\xf2\x6b\x0c\x6c\x70\x0a\x61\x18\x96\x3b\xd3\x87\x53\x51\x92\x6f\xc1\xfe\x7d\x47\xe9\x1a\x49\xc0\x42\xa5\x67\xec\x34\xa7\xc1\x5e\x41\xf0\x31\x80\xff\x61\x2d\x26\x71\xdc\x3d\x0a\x19\x9f\x25\x9a\xd7\x56\xb8\x1f\xf5\x71\x48\xfd\x57\x3c\xe2\x1d\x80\xbd\x1a\x8b\xd5\x0f\x91\x26\x09\x61\x05\xb6\x33\x52\x68\x41\xdb\xe1\xc7\x0e\x94\x2a\x2d\x84\x7a\xdd\xde\x38\x4e\x3a\x52\xc3\x7f\x7c\xdf\x1c\x81\x71\x77\x06\x6c\x35\x07\x17\xc1\x33\x75\xc8\x1a\x43\x45\xdb\x1c\x17\x7f\x9e\x22\x12\xb6\x3c\x83\x65\x78\x63\xc6\xd5\x29\x94\x15\x39\x8d\x02\xfc\x1c\x5f\xdd\x5d\x63\x04\x3b\x09\x6b\x07\x62\x72\xae\x4b\x46\x5b\x6c\xc3\x9b\x2e\x00\x9d\xb4\x55\xbf\xef\xee\x5d\xbe\x34\x3a\x84\x65\x6a\xa2\xe0\xd4\xc7\x8e\xe2\x48\x47\x34\xf5\x0c\xb7\xd7\xf1\x00\x6b\x74\x8c\x1e\xfc\xb6\xc9\x2d\x4b\xe8\xcb\x82\xd7\xc7\x61\x30\xec\x49\x0f\x02\xe3\x6f\x48\x9c\xed\xe2\x90\xdc\x81\xeb\x38\x83\xee\xbf\x21\x40\x78\x9e\x8a\x5c\x73\x04\xec\x2b\x26\x82\x32\xbf\xfa\x4e\x43\x52\x61\x90\x47\xbd\x21\xf8\x79\x34\x64\x4c\x26\x42\xf8\xd7\x3e\x28\x43\x22\x4e\x1a\xa3\x48\x5f\x22\x9b\x63\x8d\xf7\x59\x2d\x19\xad\x0c\xc2\xd3\xe8\x5b\xaf\xc5\x34\xfa\x31\x66\x16\x0a\x74\x9c\x56\xb2\xc2\xe7\x1f\x9e\x61\x10\x82\x8b\xd1\xb3\x41\x0a\x9d\x60\xb8\x81\xa9\xf4\x22\x25\xd8\x71\x58\x05\x25\xcd\xaa\x04\xd4\xa5\x6f\x22\x36\xdd\xff\xf7\x1b\x19\xf8\xab\x77\xd0\x82\x82\x0e\xe2\x69\x06\x2c\x55\x48\x74\x58\x53\xe3\xd7\xdd\x46\xa9\x2d\x36\xbb\xc6\xd6\x60\xd3\x14\x91\x6e\x6b\xf5\xf6\xe3\xd0\xa4\x24\x0c\x6b\xf3\x92\x29\x56\x57\xc3\xb0\x01\xfb\x35\xa1\x39\x11\xe6\x87\x0d\xa2\xea\x16\xef\x14\xdf\x94\xf9\x18\x53\x84\x54\x6b\xb7\x7f\x72\x07\x32\x23\x51\x18\x4b\x58\x1f\x3e\xe6\xe9\x85\x15\x0c\x85\xe0\x1c\xaf\xb9\x4a\xf0\x90\xb3\x51\x14\xa9\x79\xa4\xd6\x53\x73\x6a\xb0\x2f\x78\xfc\xe3\xb7\xa2\xf8\x51\xa3\xc6\x1b\x5c\xa1\xa0\xc7\xa2\x82\x52\x10\x04\x2a\xbb\x20\xc8\x02\xfb\x7c\xd8\xd0\xf1\x9c\xb6\x20\xda\xf8\xe6\x15\x03\x41\x02\x99\xf4\xcf\x38\x57\x46\xcd\xf2\x61\xab\x64\xa5\x8b\x9e\xb4\xcf\x11\x15\x63\x9a\x2e\x87\x6a\x70\x79\xeb\x9e\x33\xa5\x45\xa8\x92\x2b\x28\x5a\x53\xc4\x0f\xb5\xa9\xbd\x86\x2d\x88\x40\x32\x98\x09\x4c\x3f\x2a\x67\xa2\x68\x94\xc9\x0d\xc2\xca\xf9\x30\x42\xd6\x40\x20\x94\x8a\x75\x90\x82\x1f\xbe\x85\x3f\x3f\xb2\xe8\x72\x71\x5b\x60\xff\x24\xc5\x8b\xb4\x12\x55\x5e\x0f\x4b\xcb\x42\x14\x93\xfe\x99\x68\x29\xa4\x79\x56\x98\x07\xb9\x14\x72\x83\x54\x72\xfd\x6f\x8c\x10\x09\xc5\x92\x82\xfa\x3a\xb3\x37\xbf\xd7\xb9\x24\xd4\x5a\x17\x85\xfa\x75\x17\x0f\xc7\xc8\x9f\xad\x57\x4a\x5b\xe3\x92\x35\xcd\xfd\xa3\xb3\xc9\xfa\xe0\x63\x3c\xd4\xca\xba\x39\xb6\xda\xb2\x47\x43\x09\xac\xb9\x77\x8d\x5e\xe6\x82\x13\x1d\x08\x28\x0d\xd0\xd7\xa4\xb6\x7c\x75\xe5\x56\x7e\x1c\xd5\xa0\x6d\x97\x61\x71\x55\x0a\x65\x36\x92\xcd\x88\x35\x04\x00\x6f\xba\xb5\x79\x33\x2c\x0d\x26\x79\x58\x3d\x6e\xa1\x0c\x03\xd6\xe9\x7f\x7e\x67\x8a\x96\x53\x9b\xf9\x40\x30\xd2\xe0\x4b\x1f\x3a\x6a\x32\x3a\x46\xab\xfa\x8b\xe9\xbd\x4d\x07\x0e\x63\x28\xdd\x8a\x32\x69\x92\x56\xd3\x1e\xb7\x75\xd4\x4a\x37\x06\x8a\x26\x1f\xf8\x9c\x12\x0b\x9c\x9e\x8f\x3f\xeb\x4b\x8a\xc1\x42\x4f\x8e\xa1\x14\x40\xc8\x44\x09\xf0\x7b\xab\x65\xf5\x54\x44\xf5\xf7\xd7\xaa\x93\xe2\x86\xaf\xd3\x7c\x7e\x67\xb0\x2d\xcb\x21\x03\x9c\x7e\x3e\x02\x9c\x36\x24\xc9\x6d\x8a\xa0\x02\xb1\x45\xfc\x57\x0f\x62\x54\x43\x07\xa5\x7f\x15\x7e\x39\x39\x21\x32\xb7\xe1\x29\x60\xbe\xf4\x85\xf7\x59\x2b\x60\x0d\x26\x0e\x68\x19\xde\xce\xe8\xc6\x91\xae\x69\x42\x6c\x47\x77\x9b\xcb\x40\x0c\x20\x62\xab\xc0\x81\x5c\x2d\x05\xc7\x45\x39\x65\x2b\xff\x0c\x90\x32\x94\xcf\xd5\x2c\xee\x79\x35\x2f\x16\xb3\x21\xc2\x1e\x4f\xf4\xd0\xcf\x57\x06\x05\x98\xfa\xad\xd4\x2c\xfe\x10\x07\x43\xe4\x39\x2b\x34\xb9\x52\xd4\x30\xe0\x21\xd0\x7b\x4e\x73\xf5\x99\x47\xdc\xf0\xc0\xaa\xd5\xb8\x2f\x40\xbb\x0f\x56\x29\x01\x3f\x99\x39\x3e\x63\x34\x77\x00\x3a\x17\xca\x28\x60\x29\x86\xb9\x19\xcc\xc8\x13\x6d\x70\xd7\x3a\x91\x2c\x7e\xe6\x23\xd0\x0a\x94\x74\xe6\x2b\x4b\xef\x77\xeb\x61\x9e\xa7\x88\x9f\x64\x55\xef\x88\xca\xd5\x9e\x29\xc6\x29\x5f\x08\xf0\xab\x60\x25\xd1\x06\x28\x82\x8c\xb0\x6b\xad\x87\x65\xcf\xd6\x29\x2f\x93\x15\x2f\x4d\xbf\x1c\xfe\x9e\x66\x07\xb9\xad\x93\xb7\x0c\x72\xde\x5b\x68\x90\xc6\x01\xc6\xd5\xa3\x51\xc9\xb7\xb7\x63\x3b\x90\x04\xbf\xcd\x6e\x96\x65\x10\x4c\x80\x2d\xae\xc8\x87\x72\x7e\xcc\x98\x38\x5c\x33\x72\xea\xbd\x49\xeb\xae\xc7\x24\x75\x40\x56\x5e\xa8\x11\x6a\xf9\x44\x5f\xf6\xa1\x61\xc3\xf3\x56\xcd\xb6\xda\x9f\x71\x75\x7e\xc7\x2e\x09\xe5\x2b\xd7\x8d\x07\x21\x5a\xec\xaa\x3c\x64\x0d\xa2\xb2\x84\xd3\xed\x6d\xfd\x6a\x7a\x15\xf0\xdf\x9a\xfb\xd7\x6e\xa9\xda\x29\x47\xb7\x6a\x0c\x27\x9f\x8b\x39\xfd\xb4\x98\xac\x2c\x52\xac\x24\x7d\x5b\x45\x9f\x53\x40\x54\xdb\x69\xa7\xe4\xc6\x8d\xc9\x9b\x51\xfa\x77\x36\xcc\x6d\x4f\x09\x0a\xf6\xc6\x75\x17\xcf\x37\x2e\xf4\x45\x4e\x95\xa8\x37\xcb\x50\xf4\x29\xd0\x7f\x4d\xf4\xb0\xc3\xc3\x24\x5b\x4a\xa0\x24\x19\x89\x4e\x73\xa4\xbc\x67\x7a\x44\x76\x1d\x7d\x86\x74\x48\x65\x6c\x57\xd3\x27\x2e\x0d\x47\xfa\x38\x6f\xb8\xeb\x85\x5b\xb8\xdb\x7d\x1d\xaf\x10\x52\x38\x1a\x8d\x0a\x24\x10\x3c\x83\xa7\x3b\xd8\x0a\xd4\xcc\x5f\xbe\x9b\x73\x06\x90\x66\xc0\x52\xf7\x66\x67\x04\x20\xe6\x1d\xec\x80\xd3\x0e\x04\xa7\xce\x8a\x26\x1e\x7a\x03\xbe\x46\x1b\x90\x98\x59\x92\xbe\xbf\xbf\xeb\xcb\xcb\xa1\x5f\x24\x35\x70\x4e\xc2\xe7\x57\x1e\x23\x5f\x26\x8c\x7b\x6f\xae\x50\xf3\x82\x6d\x06\xcb\x94\x02\x88\x69\xff\xe5\x14\x4e\x4b\xd7\x25\x2f\x30\x82\x8f\xce\xc7\x39\x1d\xf1\xe8\xdd\xbb\xc7\x08\xb8\x0d\x6b\x24\x7c\x02\xa2\x47\xfa\x10\xb5\x7c\xb8\xf3\xd8\xbd\x7e\x2f\x6a\xdd\x9a\x88\x5c\x60\x7a\x30\x6c\x74\x64\x9a\x5d\xd3\x3a\x49\xea\x77\x02\xde\xf7\xd6\x11\x4a\x96\x00\xc2\x80\x52\xc8\xff\x62\x0c\x75\xf9\x65\xe5\x44\xb4\xa6\xd8\x70\x8d\xe1\x65\xa7\xb7\x5a\xc2\xd6\x29\xd0\x36\xdd\xd5\x58\x2c\xf1\x2d\xe1\x01\x69\x16\xfa\x2c\x70\x17\x60\x22\xc5\x83\xf7\x97\xb8\x1f\xde\xb5\xd9\xe2\x8f\xd8\x4f\x6b\x37\x7c\xba\x91\x98\x31\xb2\xac\x8a\x94\xe5\x33\x26\xd0\xab\x02\x81\x18\x80\x38\x6c\x97\x60\x83\xa0\xf7\x33\xf5\x9b\xab\xd4\x07\xec\x3e\x92\x4f\x84\x7f\x75\x0c\x8c\x39\x13\x48\x52\xb8\xb9\xe8\xb2\x7e\x81\x64\x4d\x75\x3e\xf0\x8d\xab\xcf\x5a\x60\xf6\x50\xff\x78\x2e\x5f\xfd\x26\x18\xf3\xfb\x88\x3b\xda\x96\xc8\xe8\xeb\x4a\x3d\xcc\x3d\xae\x82\x21\x49\xe5\x88\x62\x26\x9b\xea\x7e\x1a\x26\x3d\xfa\x06\x14\xef\x30\xe3\x84\x1f\xb7\x4e\x8f\x00\xd2\x66\xf4\x58\x9d\x83\xd4\x48\x8d\x41\x3c\x43\x22\x85\xeb\x38\x25\x84\x02\xc2\xca\x81\x18\x0d\x61\x3d\x00\x99\x5f\xdc\x96\x24\xd2\xb1\x5c\x46\xb7\xbb\x41\x99\xb4\x78\xcf\xcc\x83\x17\x53\x88\xf5\xa4\x3d\xc5\x43\xfc\x2f\xf9\xb0\xfb\x8e\xcb\x93\xbd\xa5\xf2\x77\x1d\x25\x8c\x82\xa1\xcb\x77\x3b\x43\x48\x67\x47\xd8\x1b\x60\xfb\xf2\x58\x8e\x57\x4c\x2f\x99\xbb\xa2\xa3\x4c\xcd\x6e\x74\x4b\x9e\xf5\xe7\xfb\x79\xde\x0d\x60\x79\xcc\xce\xc9\x3c\x07\x98\xb1\xf2\x46\xbf\x07\xfc\x55\x8f\xd8\x61\x6e\xba\x8e\x52\x95\xed\x9c\x3c\x3e\x0b\xd4\x95\x5e\x05\x9c\x05\xec\x3d\xe4\x5e\xdb\x32\x7a\xcb\xfa\xe9\x9e\xe5\x2b\x4e\xbe\x5f\x1d\xe7\x92\xf7\x1b\x33\xb1\x49\xbc\xf2\x9b\x39\x59\xdc\x6b\x57\x76\x0e\x5e\x74\x84\xe0\xc6\xba\xe3\xa2\xee\x18\x30\xb6\xa9\x89\xa7\x77\x7c\x65\x6f\xa4\x32\x09\xe9\x79\x79\x5c\xf9\xa7\x17\xc9\x30\x1b\xcd\x29\x48\x6b\x13\x0f\x46\x4b\x4f\xa1\xae\x0f\xfd\x7d\x27\xd1\xaf\x29\xd2\x44\x32\xd6\xc5\x06\x33\x79\x32\x1e\x5a\x21\x56\xbf\x18\x13\x29\x20\x11\x9e\x68\xc8\xed\x79\x0b\x43\x38\x7a\xc7\x62\xde\x93\xfd\xb5\x56\x58\x59\x0f\x72\xf8\x91\x43\xa1\xa2\x67\x2a\x77\xca\xc9\xee\x0f\xbf\xf1\xdc\x7e\x65\xfb\xb2\x04\xc4\x73\x7c\x66\xe9\xb3\xc5\xaa\xf2\x81\x7d\xf5\xe7\x03\xfc\x79\x7a\x26\x73\xd5\x6e\xe1\xf5\xee\xa0\xc8\x5b\xfd\x7d\x23\x2d\x5b\x8c\xab\x6e\xe3\x81\xe9\x10\xe1\xac\x92\x17\x0f\x30\xe4\xfe\xf6\xf8\x4c\x30\x6a\xc4\x99\x31\x36\xcc\x75\x6f\x26\x20\x76\xb5\xc1\xb5\xf9\xe9\x53\xdb\x55\xd1\x2d\x01\xda\xba\x8d\xd0\xea\xac\x88\xb6\x3e\xf9\xe3\xf9\x8c\x90\xa4\x7d\xc5\x8f\x87\x82\x56\x9d\x86\x71\xa5\x38\x51\x9a\x79\xb4\x31\x9b\x97\xfc\xfd\xa1\x09\x98\x9c\x06\x57\x9d\x24\xfa\x45\x1d\x4a\xcd\xaf\x89\xe3\x58\xb9\x73\xe1\x0b\x0e\xe4\x9a\x65\xe3\x96\xa8\xa4\x0a\xd7\xd7\xa8\xc1\x85\xf4\xaf\x3c\x10\x43\x95\xd7\x59\xb3\xec\xfb\x08\x50\x9c\x35\x28\x89\xf9\x85\xbf\x6e\x83\x79\x52\xab\x86\x3b\xc7\x0a\xdf\x1b\x33\x1c\x43\x9b\x75\x37\xb4\x59\x66\xa8\x75\x6e\x6f\x19\x00\xfc\xb1\xbf\xc3\xc1\x27\x29\x06\xe0\xca\xa4\x62\xf0\x32\xc3\x03\x8b\xd8\x69\x8a\xa1\x57\xef\x9d\x56\xb5\xe1\x04\xd8\x4a\x2e\xfa\x54\xc7\x6b\x81\x07\x79\x35\xc4\x7d\x81\x54\x3f\xe2\xaf\x5a\x26\xf6\x48\xc4\x55\x7d\xc2\xd1\xaf\x78\x63\x08\x02\x63\xf8\xd5\x58\x5a\x31\x8d\xff\x22\x21\x64\x98\x73\x7e\xf8\xfa\x0a\xc7\xae\x71\xb1\x25\xca\x4a\x72\xb3\x45\x2c\x13\xa1\xec\x60\x1c\xd3\xad\x67\x6c\x2e\xef\xd7\xdd\xd1\x6f\xb4\x92\xd8\xbd\x2b\x3e\xa3\xb5\x1f\xc9\xe3\x83\xb8\x80\x4b\xf5\x8d\x7b\x87\x98\xb5\x79\xac\xef\x47\x47\xa0\x9d\x34\xe5\x8b\x6c\xc5\xc0\x7e\x1c\xce\xbc\x77\x30\xe0\x22\x80\x97\x56\x4c\x90\x3a\xbd\xb9\x9f\x7b\x8f\x26\x17\x97\xda\x7f\xf3\x3b\x43\x98\xbc\xc9\x85\x9f\x4f\x35\xdf\xf7\x6b\x38\xb2\xcc\x94\x24\xdb\x28\x8d\x51\xe8\x58\x1a\xf3\xf2\x12\x4d\x31\xae\x00\x7d\x01\x71\xfc\x34\x9d\x7d\x42\xf5\xfe\xe4\xbf\xf8\x41\x58\xa6\x14\x98\xc2\x23\x7d\x0c\x0b\x02\x8c\x43\xce\x0d\x18\xcf\xf1\xb5\x50\x2c\xb7\x78\xf9\x23\x00\x6d\xdf\x54\x45\x48\x8d\x1d\x80\x05\x6f\x20\xa2\x23\xa9\x7d\x57\x35\xfa\xea\x04\x35\xad\x1e\xff\x47\xd3\x75\x2c\xbb\x8d\x2b\xd1\x0f\xe2\x82\x39\x2d\x25\x31\x07\x31\x07\x71\xc7\x28\x66\x31\xa7\xaf\x7f\xe0\xf5\xbc\x99\x72\xb9\xea\xda\x96\x48\xa0\xfb\x04\xa0\x81\xae\x80\x78\x33\xff\x5b\xe3\x1e\x82\x69\x6c\x1e\xcd\xdf\x9c\xcc\xbb\xab\xe9\xce\x6b\x2f\x25\xd2\xf5\xe3\xb9\xdb\x6d\xc5\x5b\xd4\xa5\x1f\x19\xb8\xa5\xb0\x0b\xca\x81\x58\xea\x33\x80\x91\xec\x9b\xf6\x28\xfc\x3e\x1b\xaf\xf1\x52\x64\x2a\x81\x12\xb5\x01\x3a\x18\xca\xd5\x7c\xe1\x86\xfb\x66\xe2\x92\x24\xac\xb4\xd7\x32\x7b\x9d\x75\x7f\x32\xad\x55\x69\x59\x68\x3a\xc2\x97\xe1\x96\x86\xfb\xf7\xdd\x9c\x72\x5f\xdf\x64\x4a\xf5\x2e\x1b\x37\x2f\x3e\xa3\x21\x39\x19\x5f\x26\x5a\xf2\xa1\xef\x37\x17\xcc\x57\xcf\x85\x83\x2d\xfe\x88\xde\x70\x27\x20\x61\x7c\x9b\x94\x5f\xa2\x91\x5e\x1e\x02\x22\x64\xbb\xd7\x48\xe3\x29\x90\xb7\x8e\x0d\x2a\xba\xcf\x00\x2e\xda\x58\xd4\x21\xb1\xf4\x60\x68\x6a\xc0\x03\xe7\xe8\x10\x7f\x91\x1c\x10\xcc\xa3\x17\xdc\xf7\xbc\x14\x8d\xc5\x0b\xd5\x21\x37\x38\x29\xf6\x28\x25\x9d\x86\x68\x09\xff\xad\x87\x34\x24\x5b\x1d\x80\x65\x81\xc2\x68\x6e\x2c\x77\x38\xdd\xd0\xc5\xda\x73\xd2\xbc\x34\x07\xd6\x8c\xe8\x24\xd6\x0b\xb1\x65\xa9\xde\x43\xfa\x71\x95\x86\xd7\x43\x66\x8b\xb0\x60\xe5\x5f\xf3\xd2\x95\x7b\x2d\x40\x89\x0d\x52\x45\x68\x37\x8a\x44\x72\x4e\x1e\x3f\xf1\xcb\x34\x4a\x19\x6f\xb9\xed\xbe\xf5\xef\xa2\xda\xcd\x0f\x05\x7e\x84\xf7\xfc\x9c\xd3\x23\x96\x2f\x20\xf1\xb4\x8d\x00\x9e\x45\xdd\x7a\xce\x5d\xf8\x92\xf7\x5b\xc4\x3f\x1d\x02\x23\x4f\x79\x07\x78\xa9\xbc\x84\x73\x5e\x54\xcf\xa0\xbe\x1c\xf0\x95\x04\x53\x6b\x57\x66\x87\x03\xfa\xf8\x65\x02\x1f\xdd\x9a\x90\x6a\xb1\xd5\x0a\x07\xf9\xee\xce\x6e\x3b\x19\x16\x47\xd3\x4a\xbb\xcc\x60\x0c\xa6\xe2\xbc\xdf\xc8\x96\x6e\x02\xb3\xb7\xc5\x92\x71\x1e\x69\x26\x24\x9c\xc4\xbc\x5f\xe4\x41\x3a\x1c\x6e\xdd\x89\x9f\xfd\x2b\xf7\xc0\xfb\x12\x58\x63\x4d\x5a\x35\xf0\x45\x98\xc8\xd2\x5c\x99\x7c\xff\xa3\xf5\xef\x4d\x39\x4f\xc5\xe6\x05\xef\xf6\x33\x0e\x4f\xfc\x50\xf9\xfe\xe9\xf3\xf1\xde\xc8\xc7\x10\xd7\x97\x67\x10\x58\xd5\x8c\xed\xd9\x17\x4d\x54\x44\xd3\x22\x34\x0b\x62\xfb\x82\x55\x89\xeb\xb6\x90\x28\xda\xe4\xd8\x92\xf8\xf4\x66\xe3\x36\x8b\xd6\x7a\xf4\x1b\x54\x5f\x18\x39\x85\xef\xa6\x23\xd3\x5c\x1e\xbf\xf7\x28\x2c\xe4\x51\x52\xe6\xc2\xe2\xf7\xcd\x7e\x1e\xd5\x38\xb9\xa4\x28\x73\xaf\x06\x8f\x28\x6b\x5e\x03\x6a\xf2\xcb\x58\x0f\xf7\xf3\xce\xc1\x5b\x94\x2d\xca\xb2\x7d\x06\xe6\x1f\x77\xec\xbc\x06\xcf\x19\x8f\xec\x01\x28\x48\x53\x3c\x2f\x10\x9f\xe6\x64\x50\x9e\x9e\x1c\x85\xc7\x0d\x97\x94\xcb\xe1\x0f\x8d\xe3\xb6\x0a\xde\x76\x6f\x52\x7c\x3d\x30\xf0\x9a\xe0\x12\xb6\x0d\x85\x49\x16\x3a\xb2\x68\x99\x84\x9f\xa2\x33\x23\x41\x29\x53\x1a\x3d\xfc\x89\x82\x05\x88\x82\x0c\x4f\x71\x45\x05\xa2\x80\xa3\x61\x0f\x5d\xdf\x48\xe7\xbc\xc7\x79\x79\x86\xc2\xda\x34\x4e\x3a\x78\x8f\xb5\x3d\x3c\x82\x21\xf9\xaa\x3e\xbf\x9b\xc6\x60\x7b\x38\xee\x8f\x2f\xf2\x5f\x9e\x4b\xda\xa9\xf7\x58\x7b\x1f\xbc\xdf\x5f\x9c\xd8\xbb\x4c\x60\xf9\x8f\x51\x78\xdc\x05\xb9\x47\xbe\xbc\x37\xed\x53\x83\xef\xf6\x56\x6c\xc1\x67\xa6\xef\x58\xca\x91\xa3\xbf\x5c\x7f\xd3\x48\x25\x53\x47\x10\x1f\x8a\x21\x2d\xd5\xec\xff\xe4\x6f\xb0\x6c\xb1\x51\x4f\x3c\xcd\x86\x4a\xea\x5f\x4d\x96\xf7\xa8\x01\xb8\xaa\xfd\xc9\x44\x4e\x59\x4e\x74\xb6\x80\xa0\x5d\x03\x16\x0f\x12\xd9\xd1\x97\x36\xdc\x17\xfc\x36\xaf\x27\x26\xc9\xea\xfc\xcf\x93\x3a\x3a\x25\xf3\xce\xbb\xd1\xcb\xbe\xba\x41\x00\x73\x1a\xfc\x20\xa9\x81\x76\x2a\xc9\x51\x05\xcb\x50\x70\x83\xd6\x7b\xd7\xb3\xed\x56\x2f\xd2\x25\x61\xf1\x06\x30\x27\xfb\x08\xd4\xc7\x67\x69\x55\xc0\xaf\x3d\xea\x44\x25\xce\xda\x63\xeb\xc5\xb5\xf2\xad\xaa\xd9\xeb\x9b\x70\xc0\x5e\xf2\xdb\xa1\xc5\xba\x32\x7e\x67\xad\xc6\x13\x10\x3e\xd1\xde\xde\xb7\xa2\x82\xcf\x8c\xfa\x4a\x2e\x0c\xec\xe3\x8d\x93\xc0\x2d\x20\xe2\x9f\xc8\x17\xeb\x57\xf0\x7c\x5c\xeb\x64\xb9\xc6\x8f\x91\xd1\xdf\x97\x06\xc3\x1c\x55\x5c\x10\x53\x6c\xd2\x42\xb0\xcb\x13\xe8\x5b\x98\x65\x83\x20\x9d\xad\xdc\x3a\x03\xd7\x1d\x1a\x18\xce\x8c\x25\x28\xef\xb9\xd7\x34\xf7\x30\xa5\x7e\x42\xd7\xfb\xe4\x51\x67\x2c\x1f\xe0\xcf\x1e\xbf\xd7\x70\x91\xef\xfb\x3a\x34\xa2\x7b\xdb\xcd\x3b\xc9\xf1\xf9\x27\x18\x23\xab\x90\xea\xaa\x39\xc4\x98\x71\x39\xfe\x7c\x28\x2c\xcf\x1a\x4a\x8c\x85\x51\xcf\xa0\x23\x9d\xd3\x58\x99\x9a\xe5\xda\x0f\x61\xea\x8b\x65\xf0\xf2\x88\x6e\x39\xd6\x8d\x65\x4d\x5e\x76\x95\x88\x3f\x62\xa3\xd5\xd4\x34\xfa\xc8\xad\xaf\x0d\x97\x7e\xf7\x35\x63\xcc\x92\x31\xa3\x0c\xfe\x96\xac\x34\x64\x71\xd0\x28\xe6\x4f\xff\x62\xe7\x03\xe6\x86\x07\xf3\x84\x93\x2d\x44\x07\x7b\xce\x71\x37\xb9\xa3\xe9\x53\x8b\x96\x16\xb1\x6b\x87\x07\x47\x02\x92\x9e\x78\x0a\xe8\xc9\xbe\xfe\xb8\x52\x53\x03\x77\x4c\x27\xd5\x69\x20\xcf\x0f\xb2\xc4\x61\xd3\xd1\x7f\x78\x02\x57\x5d\xa9\x86\xc8\x4e\x24\x63\x23\xed\x9b\x0a\x72\x1a\x04\x42\xe5\xe3\xca\x13\xd3\x0c\x71\x8b\x3f\xbe\x9d\xb1\xd5\xb1\x89\x56\x80\x27\x63\xc3\xb5\x38\x72\xde\x28\x1b\x75\x2d\x7f\x29\x37\xd4\x12\x94\x6c\x1f\x1f\x24\xcd\x07\x00\xe2\x29\xcf\x94\xf3\xf3\xf5\xdf\x2b\xc2\xc9\x25\x74\xe3\xee\x7c\xe5\xba\x84\xa4\xce\x43\x68\xa4\xea\xb2\x9e\xcd\x28\x1e\xbf\x5c\xe8\x59\xf6\xa2\x89\x03\xce\x96\x30\x79\x07\x95\x2b\x3d\xd1\xfc\x88\x1e\xdd\xcd\x9e\xd6\xa1\xfd\x5d\xb7\x9c\xa7\x0f\xe9\x2f\x86\x82\x7c\x65\xe6\xd8\xb8\xa6\x6c\x04\x13\xdc\xeb\xd7\x6a\x13\x25\x4f\xf5\xbe\x33\xd1\xcb\xd7\x9d\x7b\xda\x79\x47\x52\xe5\x6e\x22\xc0\xea\xd3\x3b\xb5\x05\xcf\x4c\xc0\x26\x29\x79\x24\x80\x56\xd8\xa4\x2f\x2e\x14\x9d\x31\x05\xef\xf9\xbb\x36\x62\x4c\x90\x68\xa6\xd0\x6c\x38\xf5\x0d\xc5\x68\x0d\x6f\x44\x29\x91\x13\xc6\xe0\xb9\x17\x9d\x55\x10\x01\x47\x80\x63\x56\x36\x3e\xb2\x97\x6e\x3b\x74\x06\xa1\xe7\xea\x9f\xf2\x63\x07\x8a\x4d\x86\x59\xa8\x17\xd9\xfd\xf3\xf8\xd3\xa4\xd9\xa0\x29\x91\x08\xd2\x40\x1f\x73\x94\x5a\x9c\xd1\x1a\xcf\x6d\x7b\x1d\x57\x38\xad\xeb\xa6\x8b\xdf\x8b\x26\x15\x84\xf8\x94\xb5\x18\xd5\x8a\x00\x2f\x74\x80\x02\x6a\xa2\x3e\x0b\xe1\x1d\xb8\xb8\x4e\xf8\xf2\xbd\x05\xb0\x75\x8e\x10\xcd\x37\xd8\x35\xa8\x95\xff\xfa\xaa\xbd\xd0\x79\xf2\x98\x0e\xf1\x76\x12\x0c\x2c\xd9\x0f\xb6\x51\xa0\x50\x7c\x1c\x26\x18\x1a\x36\x92\xa4\x9e\x22\x46\x6a\xd6\x7e\x76\x55\xa5\x5c\xc5\x4c\xa2\x3c\x10\xdf\xe7\x83\xe7\x6d\xc3\x9d\xe9\x2d\x84\x4f\x90\x41\xf7\x79\xcc\x9b\x7e\x57\xbf\x8d\x80\x71\x30\x87\x39\x57\x41\x52\x59\x89\x92\x7e\xe4\xaf\xff\x1a\x5b\xbf\xde\x3e\x6f\x12\x6a\x96\x44\x9b\x2f\x6c\x3f\x59\xff\xa3\x24\xd8\x9f\x3e\x7a\xaa\xad\x36\xaf\x78\x7e\x64\xe3\x2f\x88\xf9\x99\xbc\x9f\xcd\xd3\x2b\xed\xf5\xdd\x3e\x34\x08\x61\x23\x54\x9a\x3c\xb6\x80\xc2\x7d\x04\xb7\x17\x92\x65\x69\x8c\xbb\xb5\xc8\xcd\x2b\x84\x1d\xd6\xff\x32\xe2\x12\x68\x44\x6a\x59\x86\x6c\x48\x70\xba\xbe\x0b\x90\x79\xf9\xeb\xfb\x05\x42\x0d\xa0\xfc\x5c\x3e\x15\x5e\x01\x60\x50\x71\x0a\xf7\x82\x80\x5b\x31\x87\xdb\xd3\x80\x98\x8a\x2c\xcc\xb9\x82\x6f\xaa\x94\x59\x3b\x3b\x8b\x4f\x85\xbf\xb1\xd2\x9e\x11\x48\x3c\xb8\x4c\xb5\x3a\x47\x53\xee\x82\xa5\x07\x8e\x2c\x75\xc3\x6e\x1b\xdc\xa1\x65\x38\xfa\xd6\x10\x3e\x3e\x25\xe6\x96\x5a\xed\xed\x9d\x7a\xee\xf3\x69\x56\x2d\x2b\x8e\x68\xbe\xb9\x3f\xcf\x2e\xd7\x53\x98\xe4\x7a\xd7\x1b\xc4\x64\x69\x76\x69\x65\x1b\x97\x3f\xc2\x0f\x96\x66\x5c\xe2\x9e\xf7\xd2\x9b\xaa\x22\x8b\xe9\xbe\x33\x96\x82\xe8\x22\x49\xc8\x50\x26\x7f\x5f\xa0\x29\xde\xbd\x98\x70\x1f\x5f\x38\xfc\x8e\x79\xcc\x88\xf8\xc1\x8c\x4d\xd8\xf5\xec\x05\x45\x2e\x97\x58\xb6\xf5\x9e\xd3\x76\x89\xd8\x2e\x45\x44\xc3\x2e\x48\xa4\xe5\x7e\xfe\x8b\x1d\x31\xe1\x53\x00\x4f\x75\xd7\xbb\xe4\xfd\xb2\x0d\x53\x62\xcd\xa4\x5b\x6b\x9c\x37\x9f\xc7\x7d\x23\x08\xd0\xe6\xdf\x03\xaa\x23\xbd\xab\x55\x7d\x88\x1e\xdf\x32\xc7\x24\x0c\x98\x61\xf5\x6b\xe9\x92\xb9\xc0\xb4\x91\xcb\x96\x88\xbb\xc3\x53\xae\x3a\x10\xff\x2b\x94\x75\xac\x8a\xc6\x4b\x61\xbc\xca\x27\x95\xe9\x7d\x34\x45\x38\x43\x00\x9d\xc1\x51\xa2\x54\x40\x81\xd4\x89\xda\x42\x01\xc3\x8b\x62\xeb\x8e\x72\x38\x97\xce\xe1\x55\x70\xf4\x13\x5a\x5b\x15\x3a\x17\xc4\x6b\x97\x10\x81\x42\x0c\x4a\xae\xd0\x3c\xa1\xe2\x5a\xc9\x21\xc9\x3b\x7c\xcc\xb4\x35\x2c\x28\xd5\x4a\x23\xea\x3e\xe1\x32\xee\xbb\xda\x06\xe3\xa5\x9d\xa8\xdb\x03\x73\xf7\xbe\xd2\x8b\x53\x9b\x77\xb8\xa5\x1f\xeb\x21\xf3\x42\x30\xa1\xa7\x22\xeb\xee\x5c\xed\xef\xe2\xee\x69\xd0\x46\x71\x20\x97\xd6\x63\x0b\x6d\x0a\xfe\x20\x38\x1e\xba\xb5\xeb\x02\x5f\xb2\x00\x87\x2d\x71\x23\x09\xa6\x7b\x40\x60\xba\x08\xa9\x02\x3f\x52\xfd\x29\x9a\x9f\x8f\xb8\x4c\x14\xf3\xf3\xd5\xe3\xf9\xb9\xd7\x6e\x0c\xa5\xd5\xdf\x1d\x9d\xe6\xe1\x86\xd1\xf3\xda\x08\x48\xe0\x44\x22\x65\x84\x31\x1c\x7e\xf0\x8b\xfe\x61\x7d\x9c\x70\x31\xba\x28\xa7\xb1\xb5\x7a\xd9\x22\x73\x19\x3e\xff\xd5\xa9\x40\xe1\x09\x9d\x3a\x86\xb1\x7d\x2c\x10\xcb\x4e\x0b\xab\x4c\xf8\xcc\x1b\x06\xee\x5b\xb4\x17\x76\x5c\x1c\xce\xa0\x3e\x41\xa5\x8a\x19\x54\x74\xef\xda\xbb\xae\x2c\x70\x02\x39\x8a\x2a\x85\x67\xa2\xba\x78\x49\xda\xbd\x2e\xde\xbc\xaa\x3b\xef\x45\xde\x50\xec\x39\xac\x95\x0b\x87\x8f\x17\xd0\x92\xe9\x3b\x2a\xd0\x07\xf5\x77\xef\xcb\xa1\x75\x19\x71\xef\x2f\xfc\xad\xa3\x3f\x87\x5f\x72\x5f\xdb\x15\x63\x5a\x3f\x91\x89\x3f\xd6\x71\x36\xda\x2d\x99\x0f\x31\x2a\x08\x1f\x37\x8e\x4c\x03\xcb\x3d\xc1\x76\xe5\x76\x51\x47\x52\xe0\xef\xb5\x42\x05\x81\x7d\xf6\x0d\xf4\x9c\xa4\x69\xc0\x1f\x3c\x85\x9f\xae\x7d\xdb\x67\x41\x13\xc3\x3a\x8b\xd6\x29\xb6\x5d\x60\x47\x97\xcb\x78\x0b\x11\xb6\xc4\xaa\x62\x6f\xb3\xc7\xe8\x77\xf7\xcc\x50\xbc\x6f\x6b\xff\xf5\x6b\x9f\x65\x7e\x4a\xc6\x38\x3d\x5e\x0e\x7f\x41\xd9\x14\x77\xc3\x4b\x32\xd4\x83\x5c\x0d\xd3\x4b\x90\xec\xdf\x92\x98\xda\xb9\x0a\x2d\xeb\x4a\xb7\xef\xaf\xc5\x39\x8f\x5a\x61\x52\x09\x0d\x02\x71\xb9\xef\xd1\x8a\x27\x9f\x67\x9b\x7b\x1d\xa5\x44\xd6\x85\x4a\xbe\x15\xe7\xad\xe8\xc9\xb1\xc6\x30\x27\xe2\x4f\x7d\x3e\x54\xf6\x8d\x75\x31\xbd\xe2\x57\xe5\x56\xbd\x4c\x6d\x42\x33\xe4\x49\x73\x34\x6d\xac\x1f\x9d\x87\x37\x91\xb6\xfc\xc4\x7b\xff\x4c\xe6\xa4\x18\x5b\x7e\x56\xc9\x95\xc0\x45\xe5\x1b\x14\x7e\xdf\xc4\x7f\xdb\x40\x4f\x5e\xfc\xa1\xf9\x04\x3c\xcb\x61\xb0\x68\x5e\x7a\xd5\xa8\x55\xfb\xef\x5a\xa2\x93\x5a\x4d\x9b\xda\x3c\x79\x55\xf6\xea\x05\xf4\x1b\x0d\xc2\x01\xc5\x18\x6a\x46\x9e\x88\x9a\x16\x21\x3a\x7d\x05\x48\xd4\x22\x7a\x0b\x72\x8f\xa0\x9f\x9f\x4b\x71\x3c\xb1\x12\x54\x23\x25\x9d\x7e\xd8\x85\xab\x3f\xe3\x61\x31\x29\x3f\x7b\x78\xef\x30\x54\x15\x79\xef\x1e\x7f\x75\x69\xaf\x17\xa7\x29\xcc\x43\x8e\xd7\xcf\x26\x54\xcf\xff\x96\x09\xe5\x26\xd6\x55\xce\x88\x6a\xa3\xa3\x61\x7c\x64\xb7\x91\x7b\x74\x39\x41\x2e\x81\xa3\xa2\xe6\x64\x51\xb8\x0d\x70\xff\x70\x0c\x26\x3e\x27\xbd\x25\x8e\xd6\x45\xa0\x02\x7d\x27\x7d\x5e\x94\x70\xcb\x6c\x6b\x1c\xe8\xc4\xef\x75\x06\xb7\xb6\x7b\x3e\x7a\xce\x78\x38\xa3\x07\x5e\x68\xd0\x29\xa2\x7a\x4b\x35\xaa\x0e\xac\x5f\xa9\x0f\x5e\xbe\x7d\x00\xdf\x38\x13\xe2\x3c\x64\xc6\x5d\x20\x58\xaa\xdb\x16\x65\xaa\xff\xdf\x91\x9d\xa6\xa2\x77\xe6\xdd\x27\x3c\x23\x05\xe9\xa8\x2b\xf2\x8e\x77\x39\xda\xf6\xc8\xfa\x71\xed\x7d\xd4\xc9\xb9\xe8\x19\xe8\xdb\x22\x8e\xaa\x9c\xde\x24\x02\x96\x30\xfc\x7b\x0a\xd6\x16\x00\xb1\x39\x9c\x76\x5b\x2d\xfe\xb7\x07\x0f\xd0\x4b\x40\x7c\x7f\xda\x0a\x19\xb5\xf7\xab\x21\x31\x16\xfe\xb1\xfc\x9e\x2f\x96\xcc\xbd\x94\xc7\xd3\xbc\xf7\xd2\xda\x7b\xbf\xef\xde\x69\xf3\x04\x5d\x74\x0e\x6f\xfe\x7f\xc3\x38\x19\x31\x3a\x84\x24\x98\xac\x01\xf6\xf1\x6e\xda\x89\x90\x5d\x81\x56\x5b\xe1\x31\x75\x79\x2a\xef\x0e\x0f\x3b\xf5\x57\x5d\xdd\xd6\x85\x7c\xc7\x02\xfd\x72\xb1\x0f\x4e\x78\x79\xa1\xda\x7a\x4e\x1f\x93\x53\x07\xb0\x4d\x02\x1e\xd7\xed\x2f\xc9\x8f\xb4\x6e\x40\xe3\x9f\x08\x3c\xde\x62\x0d\x86\x80\x48\x8c\x8e\xd2\xa2\xc3\x3f\x1c\x85\xbb\x0e\x12\x33\x65\xdd\xde\x08\xe2\xf3\x96\x7c\x62\xfb\x7f\x8c\x00\xfd\x28\xb6\x6a\x68\x5b\x6d\x2e\x58\xad\x90\xfa\x6a\x2d\x22\x43\xfb\x71\xdc\x4e\x88\x2e\x2b\x0e\x94\xf8\xbd\x55\xb9\x23\xac\xe9\xdd\x33\xe7\x50\x6d\xe0\x95\xfa\x8e\x71\x53\xcd\xdf\x22\x7e\xac\x3f\x85\xf0\xe9\x93\xce\x60\xb5\x1f\x32\x24\xd7\x41\xd0\x36\xe5\x3f\xa3\x67\xfe\x48\x4e\x99\xe1\x14\x7d\x04\x63\x8f\x89\xb2\xee\x6c\x03\x95\xf5\xc7\xe7\xe7\x57\x8f\x7f\xfb\x37\xac\xf2\xc3\xb2\x50\x2d\x36\xd5\x42\xee\xf4\xfb\xcd\xea\x6b\x79\x97\xe0\xcf\x05\xa5\xa9\xa3\x09\x27\x2d\xfc\xc0\xf9\xde\x65\x7d\x24\x93\x5c\x64\xf5\xa1\x09\x8d\x2b\xcf\xf9\x5a\x8b\x87\x35\x48\xb7\xaa\x95\x75\x37\x03\x2d\xd0\x6c\xf1\x7f\x8b\x8c\xc4\xde\x27\xfd\x3e\x7e\x15\x7f\x6b\xb6\x5f\x4a\x41\x0c\xd2\x59\xa7\x6c\xd1\x47\x80\xc6\x87\xf0\xdf\x15\x3f\x5f\x81\x18\xdb\x60\x7a\xe5\x7c\x5b\x4c\x7c\x0b\x1c\x0e\x99\x27\x1d\x65\x48\xe9\x72\xea\xe4\x62\x0c\xa8\x37\x42\x54\xc4\x1b\x1f\x7a\x4a\x19\x36\xd2\xa1\xce\xfa\x38\x5a\x7b\x3e\x70\x87\xa2\xe1\x38\x3a\xf3\xde\x8d\x30\x7d\xbf\x17\x67\xa8\xee\x0d\x3e\xb5\xa9\x78\xb5\x84\xf4\x3e\xcb\x4e\x1d\x84\xf0\x3a\x8d\xec\x0a\xbe\xb1\xa8\xfe\x5b\x23\x67\xab\xfb\xe5\xc8\x8b\x44\x96\x1d\x6f\xbd\x21\x0a\x05\xe7\x87\x42\xcd\xee\xbe\xfb\x47\x34\x05\x19\x73\xf1\xe2\x17\x25\xba\xe6\x14\x02\xf1\xc3\x34\x67\xb6\xa7\x39\x4a\xe6\x53\xe7\x68\xab\x07\x45\xe6\x53\xcc\x90\x2f\x47\xdd\x35\xac\xb2\x2c\xae\x6b\x11\xc7\xab\x5f\x18\xb6\x7d\x55\x3e\xc1\xaf\xfd\xbf\x5a\xff\x7d\xa8\x00\xf4\x60\x93\x17\x8f\xfd\x72\x33\xc4\x99\x14\x7d\x38\x08\xf5\x82\x89\x8f\xf9\x67\xab\x43\x06\x94\x8a\xac\x33\x5f\x55\xfd\x2d\xc6\x56\xbc\x38\xbe\x76\x6e\x6d\x91\xf5\xa9\x7a\x52\xfe\x87\xdf\xf2\x66\x95\xab\x88\x26\xb8\xcf\x6e\xef\xed\x57\x47\xad\xef\xcb\xf2\x34\x16\x62\xe6\x2e\x9a\xb1\x4f\xc9\xf5\x52\xbc\x75\x68\xe2\x20\xb3\xf6\xff\x38\xda\xec\x4a\xec\x5c\x92\x55\x1b\x5f\x21\xfd\x7c\x09\x5f\x14\x4c\xe9\xda\xd0\x9c\xb1\x3e\x00\x0e\x21\xd2\x92\x4b\xa3\x70\xfe\x24\xef\xe8\x79\xb4\xd3\xcc\x76\x9e\x3d\x20\x89\x6c\x13\xc0\x9e\x00\xdf\x45\xa1\x80\x42\xc7\x65\x5b\x4f\xa7\x42\xf2\xb7\xf4\x12\xb3\x2f\xf1\x34\x06\x12\x08\x3a\xfb\x12\x5f\x06\x37\x27\x28\xc5\x3f\x5e\x9c\x8d\xb3\x63\x91\x43\x12\x09\xc3\xfd\x93\x85\x45\x5f\x7d\x12\xe9\x81\x63\x48\xf6\xec\xff\x1b\x6f\xce\x76\xf9\xa4\x86\x02\x53\x72\x44\xc1\xbc\xf7\x3a\xa6\xe1\xb8\x3a\x47\xdf\x16\x38\xcd\x2b\xc6\x4f\x7d\xa3\xe6\x27\xe2\x39\xcb\x8a\xa9\x70\x8f\x84\x0d\x0a\x48\x8b\xec\xe6\x5a\x5b\xa5\xbd\x5c\xeb\xa7\x39\x78\x40\x25\x8e\x7d\xdf\x2d\x55\xd7\x40\x18\x80\xb4\xbb\x48\xf7\x15\x39\x04\xe2\x86\xec\x84\x7d\x3d\x42\x7a\xf0\xfa\xd3\x6c\x8f\xaf\xee\xc0\x97\x53\x8f\x36\x5e\x64\x6c\x4e\xd2\x30\x3d\x31\xc0\x49\x35\x01\x01\x42\xa7\x26\xe3\xe5\x77\xf5\x79\xfa\x5f\xda\xab\xea\x5b\x12\xba\xbc\x25\x57\x77\x2f\xd1\x6f\x10\x26\x2a\x29\x37\x97\xb6\x8d\x41\xf8\xa2\x37\x06\x65\xe2\x3a\x8e\xe7\x45\xa8\x6d\x1a\xa7\x65\x53\x88\x35\x32\x3e\x43\xbd\xfd\x2e\x42\x7b\x88\xcd\x03\x41\xc4\xcd\x8f\x70\x68\x0f\x2a\xbc\x37\x7a\x7d\x51\xab\xdf\xe2\xac\xf8\xea\x2a\xbf\x2b\xa4\x58\xde\x7e\x00\x7c\xfc\xcb\x3d\xbe\x3d\x9c\xb4\x77\x37\x7c\xe9\xd0\x68\x34\x7b\xb8\x7e\x37\xf7\xad\xcf\x45\xf8\xd3\x03\xd3\x43\xc6\x35\x50\x45\x6f\xd1\x1c\xac\x48\x16\x4c\xfd\x7f\xef\x4c\x89\xd5\xd7\x4e\x51\x47\x21\xfa\x91\xd9\xb2\xa5\xea\x1e\x69\x05\xf8\x4e\xef\x3b\x46\xd5\x18\x0d\x33\xdd\x6f\x46\x2f\x0a\xa1\x4a\x87\xd4\x21\xa6\xb5\x98\x1f\x9d\xbc\x02\xad\x9a\xc5\x7d\x8a\x5b\xac\xe2\x2a\x3c\x56\xbc\xb7\x57\xe9\xd7\xae\x08\x38\xe7\xe6\x9d\xf9\x70\xc1\xe4\xed\x82\x12\x7c\x55\xd7\xa1\xe0\xb0\x58\xf3\x71\xa4\xd1\x03\xf5\x73\xbb\xf3\xd1\x3c\xc4\x21\xc6\xbc\x3b\x77\x7e\x84\x87\x55\xbe\xdd\x15\xbb\x7b\xc8\xb7\xd1\x45\x0d\xf6\x27\x38\xe7\x51\xdd\x26\xbb\x86\x58\x8a\x55\x72\x98\xef\x79\xb3\x3d\x8f\x5c\xdf\x56\xc7\xb9\x5e\xda\x7f\xdb\x5b\xf1\x49\xcb\x61\x58\x97\x0b\x01\x54\xff\x99\x5c\xa9\xf7\x8a\xdd\xda\x66\xf1\xb0\x97\xec\x35\x79\x1b\x02\xef\xf9\x42\x5d\x25\x01\x42\xe0\x6f\x3a\x6f\x60\x6e\x86\x15\x99\x8e\x22\x53\x45\x72\x44\x4e\x51\x7c\x35\xaf\x20\x12\x02\x4e\x4e\x6c\x9f\x37\x6c\x8a\x2c\x41\x28\x3e\xd3\xf5\xc4\x54\x28\x4b\xd9\x39\x08\xdb\x2c\xf4\x07\x52\x21\x25\xee\x11\x73\xb7\xa6\x4e\x9f\xf2\xc3\xda\x8d\xdb\x33\xf8\x6f\xe5\xf7\x56\x86\x67\x4e\x22\xbd\x1b\xfa\xfe\xf2\xa9\xff\xf4\x3f\x39\x63\x45\x01\xb5\x6d\x4b\x20\x1f\xa3\xd0\x3e\x3e\x0a\x29\x4b\x8a\xb1\x39\x9c\x78\x68\xe6\x91\xbd\x47\xeb\x7f\x9b\x5a\xcf\xef\x2e\x00\x45\x6a\x16\x18\x1d\x1d\x1a\xab\xbd\x00\xb5\x79\xce\x4f\x49\x83\x2f\x8a\x40\xb1\x21\xd1\x26\xde\xe3\x4a\xee\x0e\xfd\xd6\x99\x55\x69\xf2\x2a\x18\x58\xc0\x7d\xd5\x2c\x00\x43\x1f\xf8\x45\x4f\x8c\xda\x39\x90\x4f\xc5\x51\x54\xa0\x4b\x11\x20\xbc\x30\xbb\xc3\x46\x54\x6c\x53\x5d\xd9\x05\x2e\x53\xa7\x97\x8d\x76\xa5\xe9\xed\x23\x2c\xda\xca\x57\x3f\x4c\xac\x35\x81\x26\x02\x53\xd8\x5f\x64\x03\x90\x42\xb7\xf6\x2b\xcf\x55\x7e\xff\x6a\x3d\x3e\x33\xe6\xbd\x51\xa0\x88\xbc\x79\x37\x6e\x2c\x33\x28\x56\x06\xa4\x3b\xbe\x0f\xc7\x1c\x80\x77\x7f\x72\xfc\x3c\x7a\x3e\xd1\x13\x7a\x01\xe5\x23\x7d\x3c\xf8\x39\xe4\xec\xbd\xcb\x0b\x28\x42\x3f\xdd\xe1\xf1\xbf\x40\x53\x9a\x6d\x5b\xb7\x03\xae\xff\xf5\x83\x7d\xdb\xea\xd3\x09\x43\x9c\x17\x88\xe1\x25\xdc\xf8\x88\xb1\x53\x3c\x52\x83\xa9\x6c\x76\x84\x8a\x93\x7f\x1f\x1b\x4b\x7b\x73\xd6\x8b\x73\xb1\x47\x64\xd5\xce\x75\x18\x63\x1c\x87\xc2\xfd\x33\x11\x67\x83\x42\x5b\x02\xb4\x0f\xb7\x3b\x4f\xa5\xe9\x3f\xb3\xd4\x30\x7b\xb9\x71\x5d\xba\xc2\x3f\x28\x40\x1a\x26\x45\xc8\xe1\xe4\x86\x58\x0d\xb6\x64\xd4\x37\xfe\x50\x52\x97\xad\xbe\xe8\x35\xa7\xb9\x6d\xa1\xb4\xa1\x01\x8b\xf2\x26\xaf\x32\x08\xa5\x1a\xa7\xd0\x48\xac\x8f\x43\xa1\x4e\x6b\x51\x9a\x05\xe4\x80\xaa\x00\x3d\xfe\xf4\x1f\x3a\xa1\x28\xe4\x6d\xa3\xbe\xe2\x5f\x0f\x52\x3b\x3a\xbe\x64\x96\xe6\x63\x6b\x4c\x67\x2a\x7f\x56\xca\xf7\x89\x91\xb6\x24\x1a\x3d\x5b\xef\xee\x94\xf8\xd1\xff\x9d\x3f\xfd\x25\xac\xc6\x33\x40\xf1\x29\x1e\x9f\x0c\x58\x4b\x5d\x4a\x69\xfb\x0c\xc5\xca\x53\xd2\xe4\x0f\x97\xd3\x55\xaf\xb5\xed\x58\x13\x5d\x24\xd1\xd1\xa0\x19\x7e\x43\x3e\x90\x46\xad\x61\x73\xa5\x7e\x1c\x6a\x1e\x40\x98\x99\x17\x60\x27\x8b\xb0\xec\xe7\xb9\x47\xa1\xb4\xf9\x9f\x00\x9a\xda\xd7\xc8\xe3\x96\x87\xea\x5e\x17\xe5\x21\x81\x5b\xd4\xa7\xa9\x0c\x18\x4f\x35\x85\x6b\x81\x69\xf9\x4e\x24\x7a\xe6\xc8\x9b\x7e\x11\x0c\x51\x88\x0c\xfc\x7c\x55\xaf\xe9\x6f\x0f\x50\x77\x44\x36\x5f\xef\x73\xb0\x3c\x6e\x70\xcc\xf3\x3e\xdf\x43\xa1\xc2\xef\xf3\x9d\x95\x67\xae\x81\x71\xcd\x66\x89\x60\xcb\xef\xbf\x0d\x31\xa8\x7a\x2b\xcc\xa8\x6c\xae\xb7\xf0\xde\x67\x4b\x71\xe5\x24\x7d\xf4\xc0\xf0\xa1\xb6\x97\x27\xb0\xd0\x00\x5f\x69\xd9\x13\xdc\x5f\xa4\xec\x45\x98\xc6\xab\xb8\xf7\x05\x64\x36\x30\xc8\x2d\x38\xeb\x45\x9a\xfd\xc8\x99\x5d\x62\xbf\x6f\x7a\xdf\x0d\x36\xb2\x7c\x43\xd7\x3b\xe0\x4d\xf7\xc9\xbf\x29\x10\xa1\xc6\x8c\x70\x93\xf5\x38\xdc\xb2\x9b\x34\x4b\x83\xc3\xb2\x8f\x65\x78\xf1\xf7\x55\x3d\x9b\xe1\x3d\x2c\xfa\xa7\xd9\x7d\xf4\x73\x6a\x5b\x1d\xd6\xfb\xda\xc4\x75\x51\x49\x93\x0a\xe2\x75\xe0\xeb\xb3\x16\xfc\x87\xfc\x91\xef\xf5\x68\x59\xf9\xac\x7c\x62\x10\x4e\x27\xd8\xc8\xc7\x51\x78\x7c\xd9\x34\x20\xd0\x9c\xf7\xe5\xeb\x76\xa0\xb5\x18\xf7\x6f\xf3\xd6\x78\xcd\x11\xa7\x45\xb5\xbc\x76\x33\xa4\xb6\x7d\xef\x51\x74\xbc\x47\x02\x43\x31\x94\xb0\x55\xe4\xf4\x42\x82\x06\x25\x03\xaf\x39\x29\x20\x50\xf7\x69\x91\xd8\xf7\x51\x20\x9b\xc1\xd7\xc5\x6a\x7e\x0b\xd8\xdb\x45\x08\x4d\x0f\xc8\x63\xaf\xc3\xda\x4d\xcc\x96\x93\xdf\x9e\x22\x6e\x93\x1a\x4e\x4b\x1a\xb6\x24\x34\xc1\x27\xc7\x30\x8b\x94\xbe\xbc\x5a\x58\x5e\x69\x92\xdf\x57\xc7\x78\x4c\xd8\xdc\xfd\x47\xa2\xf8\xd3\x3a\x3f\xfb\x79\x74\x38\x60\x03\xc0\xe5\x6b\x78\xa5\x50\x9e\x1f\xda\x6b\x0b\xde\x33\x02\xc4\x21\xc0\xd1\x4b\x30\xc1\xbb\xfd\x61\x4b\x22\x15\x0c\x64\x4a\x60\x48\x7e\xf6\xfb\x2a\x61\x78\xbb\x7e\x1d\xe2\x0b\x36\xf0\xb3\xee\xa1\x1c\x10\x19\xf8\xed\xbd\x61\x98\x9a\x8f\xbf\x1a\x12\xfd\x19\x51\x61\x40\xc5\x99\xd1\x79\x3d\xbf\x21\x3e\x27\x93\xb7\xf7\x1d\x58\x20\x88\x3c\xb2\x8a\x5b\x7b\xe7\x9e\xba\x13\x8a\x25\x1e\x44\xef\x4c\x45\xfc\x6e\x7b\xf8\xa9\xc4\xfc\x38\x0e\xd9\x04\x68\x32\xf9\x8a\x84\x72\xa4\x37\x3f\xe7\x55\xee\xe9\x6e\xbf\x88\xa9\x57\x14\x5b\x1c\xdf\xee\xb1\x12\x05\x86\x69\xf7\xbd\xd7\x3f\x90\x76\x38\xa4\x50\xde\x4f\xad\x19\xf8\x22\xfb\xcd\xe1\x9d\xcd\x21\xc6\xca\xfe\x21\x33\xcc\x80\xfc\x20\x9d\x40\xd0\x73\xb8\x88\x7c\x35\xcf\x44\x01\x61\x45\x97\xc7\x9e\x44\x82\x18\x37\xa7\x6b\x5a\xbc\x7c\xd4\x55\x0b\xf2\x7a\xb9\xec\x76\x25\x62\x45\x24\x20\x7a\xe7\x1d\xe6\x5f\x7f\x9f\x8f\xf8\x04\x8c\xd9\x00\x8e\x3b\x35\x28\x65\xa2\xb2\x6c\xe8\x68\xb3\xf1\xad\x36\x70\x10\x32\x0d\x92\xb4\x46\xc7\xa0\xb1\xd7\xee\x77\x9f\x78\x67\x91\xb0\x08\x11\xb4\x98\x21\xab\x1c\xbf\x24\xf9\x03\x39\xaf\xf1\xe4\x10\x93\xef\x78\x3d\x7c\x3f\xa0\xf1\x4a\x67\x89\x7e\x94\x9b\x41\xb6\x68\xf8\xaa\xc2\x2a\xf7\x62\xdf\x69\x87\xdc\x17\x1f\x98\x58\x6a\xc4\xba\xfa\x3b\x94\x67\x2a\xbf\x86\xfa\x7a\x32\x2c\x7e\x48\xd7\xa7\x49\xa4\x79\x7a\x36\xa1\x5a\x3a\xbf\xc2\x62\x76\x53\xaf\xcc\x07\xe6\xa0\x1f\xee\x45\x64\x33\x12\xf3\x6e\x46\x9c\x71\x10\xda\xdc\x70\xd9\xd3\x42\xb0\xdd\xa9\xd9\xe9\xfe\x2a\xc4\x2d\x9c\x8c\x7e\xa5\xe7\x64\xff\x6f\x6e\x1e\x20\xb4\xb5\x4f\x55\xc1\x0e\x6b\x22\x95\xa9\x9e\x23\x4d\xb0\x11\x74\x7e\x3c\xeb\x78\x2b\x40\x19\xfb\xce\xd0\xe6\x7e\x37\x9c\xc1\xd7\x2b\xd2\xf9\xfc\xc5\x5e\xc3\xca\x36\xf3\xe2\x43\xd1\xcf\x85\x5a\xe8\x09\x72\xf8\xa2\xb2\xc4\xaf\x48\x3c\x2b\x05\xb7\x2e\xa6\xa3\x4a\x92\x58\xfc\x6a\xb7\x28\xeb\x9c\x1b\x1d\xc5\x40\xb1\x00\x6b\x95\x34\xd7\x8c\x8f\x19\x94\x68\xf0\x5d\x7b\x89\x7e\x46\x51\x96\x4b\xfa\xbb\x55\x2f\x5b\x08\x8b\x6a\x89\xdd\x31\xe3\x36\x9d\xff\x68\x95\x25\xed\x05\x70\x6f\x5b\x30\x3d\x03\x5c\x87\x72\x46\x27\xd6\x89\x35\x69\x7d\x95\x92\x3c\x73\x64\xa8\x62\xe1\x0d\xc6\x6b\x34\xfe\xee\xc5\x3f\xbd\x75\x54\xb0\x56\x5f\xbd\x4e\x33\xbf\x82\xc0\x86\xb1\x76\x9a\x55\xdb\x42\xae\xed\xf7\xad\xbe\x80\xd7\x6e\x26\x9a\x6a\xd4\xb7\x56\x9e\xe0\x33\x63\x27\xe3\xb2\x67\x20\xc1\x43\xea\x07\xbf\x84\xc8\x9f\x4b\xc1\xfb\xb3\xc1\x3b\xcf\x81\x35\x0f\xe0\x1b\xbf\xa1\x31\x7f\xf9\xec\xa0\xf1\x1a\x92\xa0\x16\xe0\x80\x76\x22\xc3\x32\x02\x89\x08\xa0\x34\x56\x76\x94\x60\x14\x2d\x62\x98\x38\x1f\xdf\x61\x53\x39\xbd\xab\xdc\xb5\x67\xcd\xe1\x58\xcf\x0a\xb2\x6d\xf1\xf5\x78\x9d\x58\xa6\xb6\x9f\x32\x0a\x55\x67\x1f\xbb\xba\x1e\x68\x35\x14\x49\x06\x2b\x5c\x62\xa5\x1e\x6a\xf6\x42\x15\xea\x9f\x5e\x54\x5e\xf6\xd0\x60\x59\xa1\x13\x3c\x8f\xe0\x6e\x14\x78\x2d\x0e\xf7\x58\x0f\xd2\x4a\xa9\x2a\xbf\x2a\xdd\xf5\xbe\x6a\x56\x73\x98\x0d\xcd\x3b\x84\x09\x20\xe0\x77\x9d\x17\x22\x83\x39\x09\xf9\x0f\x66\x49\xcf\x08\x92\xf1\x8f\x4e\x3d\x5a\xb1\x7f\x85\x8c\x8b\x95\x7b\x04\x55\x57\xc4\xa4\x6a\xb9\x49\xa4\x0c\x92\x19\x6f\x23\x27\x18\x4c\xe7\xf9\xd1\x8c\x48\xd3\x06\x82\x84\x20\x35\xca\x86\x6d\xe9\x1f\x0c\x54\x80\x79\xbf\xf7\x6f\xa2\x6f\xf9\x48\x94\x47\xf1\x64\xca\xfc\xa0\x09\x2a\xdb\x6a\x4b\xb6\x01\x4c\x8b\x70\xbe\xc9\x12\x74\x62\xf1\x75\x45\x5f\xd2\x62\xdc\x7e\x1c\xa9\xd1\xe8\x6f\x57\xfb\xb1\xff\xcd\x43\x42\x1f\xde\x62\xeb\x27\x4c\xb5\x8b\x40\xb0\xb3\xf6\xd4\xf4\xd5\x90\x84\x16\x42\x81\x0f\x70\x87\xdf\x1e\x8e\xbe\xe7\x74\xa2\x24\x46\xbf\x55\x93\x1e\x54\x6f\x51\x62\x15\x2c\x47\xf5\x41\x8b\xe9\x49\x76\xa2\x35\xbe\xe4\xc7\x55\x6a\xd1\xf7\x6a\x38\xab\x91\x83\x8a\x77\xaa\x15\xc6\x75\x1a\x3e\x0e\x3b\x9f\x8e\x67\x4a\xc2\xbb\x1b\xd9\xa7\x7f\x98\x06\x51\xec\x67\x7b\x6a\x64\xaa\x54\xf3\xaa\xcd\x97\x76\x45\x82\xdc\xa3\x41\x82\x86\xda\x31\xc9\xf3\xba\xe1\x0e\x26\x9f\x2c\xfe\x13\x90\x58\x8f\x95\x19\x55\xbf\x76\x27\xf0\x8f\x39\x84\x09\xf9\x6b\x3d\x82\x60\x8b\xbc\x5a\x0c\x3f\xfa\xd2\xcc\xe3\xba\x6e\xdd\x68\x3d\xcf\x23\xcd\x4c\x2c\xb8\x02\x05\x22\x7c\x8a\x02\x90\xc5\xbf\x6c\x7d\xaf\xff\x6b\x15\x89\xc9\x6c\x5e\x0e\xcd\x1d\x03\xef\xee\x82\x17\xda\xb8\xe6\xcd\x37\x06\x4f\x71\xc2\x7b\x4d\x4c\x98\xf4\x59\x65\x04\xf6\xbd\xd6\x40\x46\x84\x22\x9a\x71\x1f\x24\xe3\xed\x9d\x64\xa6\x12\x04\x1c\x8b\xf1\x7a\x41\x81\xc1\xc6\x54\x05\x2d\x9f\xe5\x31\x39\x4f\xfb\x6d\x48\x26\xb3\xb5\x78\xa7\x02\x6c\x12\x70\x68\xec\x9c\x68\x9b\x28\xae\x9b\x46\x2c\x83\xb5\x52\x49\x6d\x53\x93\xe0\x4f\xe9\xc5\xae\x09\x8c\xd2\x36\x81\x37\x21\x1f\xcd\xe8\x46\x91\x7e\x29\xb3\x37\x37\xfa\x41\xbf\x23\x4e\xc9\x33\x43\x42\xee\xa3\x74\x13\x98\xbe\x51\xed\x16\x02\xef\x20\x96\x86\x54\xa0\x81\xfb\x9a\x9b\x0b\xfd\x6e\xb4\xd5\x7e\x81\x47\x7d\xb5\xb0\x44\xc3\x58\xed\x4f\x76\x76\x7d\x03\x77\xb9\x31\xe3\x8b\x7d\xc1\xcb\x90\xdf\xb0\x10\xf1\x78\xd5\xfb\x9a\x09\x1e\xbf\x3f\xcc\x10\x9f\x7b\x3a\xf5\x0c\xd1\x36\x60\x1a\x6d\xf5\x5b\x3d\x75\x65\x35\x90\x17\x15\xa5\x59\x16\xf8\x3f\x24\x7e\x37\x62\x74\x9a\xb2\x52\x52\xba\xfa\x82\x1f\x4a\x0f\xf7\x8f\xa9\x19\x0c\x9e\x30\x9e\x79\x45\x09\x62\x4a\xd8\x1d\xa4\x6e\xc6\xe3\xf3\x99\x4a\x18\xfa\xca\xa6\x5d\xf5\xd0\xad\x2d\x38\x35\x95\xfc\x92\xd2\xba\x0a\x91\xf4\xbb\xae\x0a\x9e\x30\xfb\x95\x92\x97\x19\x43\x46\xe8\x3d\x2c\x7c\x17\x84\x97\xdf\x1e\x69\xf7\x5a\xa3\x28\x7f\xf7\x43\xe6\x8f\x03\x72\xe6\xf9\x3b\xc0\x49\x82\xc8\x74\x74\x2c\xbd\xe7\x83\x6f\x72\x58\xee\x2e\xa0\x98\x3a\x00\x65\xda\x59\xac\xd6\xf7\x69\x49\x51\xbc\xe0\xd1\x92\xe1\x39\x5e\x3d\x67\x26\xc6\x0a\xc3\x2c\x3f\x73\x68\x96\x70\x01\x8f\x6e\xa0\x33\x9f\xd7\xcf\x0f\x0a\xcd\x65\xd8\x7a\xdb\x76\xf1\xfb\x77\xff\xfe\x6e\x3c\xef\x4b\x5d\xe6\xc0\x35\x5e\xa6\x8b\x02\x7f\xdc\xbd\xb3\x76\xdd\x50\xe0\xff\xa9\xf9\xd3\x2d\x4c\x51\x0b\x96\x5d\xaa\x12\x5b\x71\x22\xeb\x94\xe3\x52\x15\x4d\xd4\xae\xea\x98\x75\x35\xfe\x79\x10\xf6\x58\x84\x55\x2f\xf7\xa7\x2a\x7f\xe5\x12\x59\x8e\x77\x9f\x43\xa5\xf6\xdd\xdd\xd7\xbc\x1f\xe2\x4b\xbe\x36\x86\x56\x35\x9b\x6e\x1e\xd9\xb4\xf7\x93\x9a\xdb\x08\x75\xd4\x7b\x22\xeb\x2c\x30\xac\x9e\x32\xf5\x3c\xfc\x7e\x19\xa8\x58\xb4\xfa\x64\x3a\x05\x75\xdf\x25\x3c\xf9\xb1\x76\x05\xa3\x9d\x76\x1f\xa6\x6b\xe4\x52\xba\x80\xc7\x32\x6a\x5b\x3e\xe6\x58\xdc\xcc\x33\x6d\x5a\x5d\xfd\xbc\x88\x4f\x81\x10\x96\x12\xc5\x6a\x37\xc0\x27\xc2\x53\x29\x12\xd3\xd4\x30\x4e\x32\x96\x93\x76\x38\xfb\xbf\xed\x13\xfe\xe9\x61\xf9\xa1\x0f\x8b\xf0\x43\xaa\x99\x94\x1a\xc9\xcd\x34\xa2\x9e\xe8\xea\x67\xbd\xa8\x90\xcb\xf9\xb0\xf8\x41\x19\x84\xa7\x8c\x4b\xa5\x16\xf5\x4d\x28\x8d\xf4\x77\x80\xf2\x08\x45\x83\xe7\xa5\x8e\xb4\x74\x63\xc6\x3d\x10\x28\x31\x1e\x70\xf6\x71\x21\x63\xd2\x7a\xa9\x45\x89\xf7\xf9\xf9\x70\xb2\xaf\xa7\x46\x71\x26\x24\x7d\x7d\xe2\x0b\x08\x11\x85\xb2\xaa\x2e\x35\x56\x83\xb5\xe4\x6a\xdf\xf5\xed\x35\x11\x15\x34\xfa\xf1\x70\xef\x51\xd3\x5c\x34\xad\x95\x2b\x6d\x78\x77\x35\x98\x03\xc9\x04\x53\x35\x36\x21\xf1\x86\xfe\x2e\x01\xd2\x44\xaa\x58\xdb\x04\x93\x9b\xe1\xe0\x1d\x0f\xc4\x40\x86\xe6\xea\x1a\xaa\x5f\xa1\xeb\x3c\x11\x9f\xc1\xbf\x71\x48\xd1\x7a\x66\x5c\xaf\x7f\x19\xab\x70\x40\xcf\x0f\xe8\xcd\x65\x57\x10\xb7\xa3\x2e\x39\x1f\x27\x82\x1e\xa7\x81\x1c\xc5\x9b\x9f\xde\x9c\x03\x23\x94\x23\x1b\x77\xd1\xe0\x40\x4b\x6d\x20\xd4\xb0\x0b\x87\x48\xb2\x0b\x72\x04\x25\xfb\xb0\x1d\x1c\xf7\x34\xf2\x70\xa7\x49\xe1\x75\xa1\x8f\xdc\xb1\xd6\xec\x88\x25\xb8\xb5\xb6\x15\xef\xe7\x9f\x6c\xd7\xc0\xca\x55\xbc\xdd\xe0\x84\xcc\xf3\xd6\x9b\x47\x68\xe0\xfb\x35\xe7\x37\x35\x69\xdd\x8b\x4f\x87\xfb\xb7\xd6\x2c\xe3\x7c\xe8\x1e\xd0\x35\x83\xa9\xb0\x3f\x6b\x50\xb9\x6b\x8c\x76\x67\xfe\x68\xc4\xff\x0a\x9b\x4f\xa9\xe9\x9c\x6c\x58\xd1\x49\x3d\xbc\x91\x15\x53\xd8\xe2\xf9\x04\x12\xc3\x03\x6e\x66\xed\x2d\xe5\xe4\x41\xa9\xaf\xa7\xbf\x6b\x6c\x45\xc0\xfb\x11\x23\xd7\x35\xbf\x4c\xf4\xad\xd9\x97\xa0\xeb\xc2\x77\x3b\x4e\x21\xaa\x71\x18\xcb\x1e\x85\xbb\xcf\x59\x19\x0b\x7d\xec\x68\x3b\x6b\x63\x2f\x55\x5b\x4a\xa0\x01\x11\xf1\x8b\xd4\x36\xe9\x44\x2e\xff\xd1\xc1\x28\x59\xb7\x5f\x8f\x5e\x62\x71\xd1\x60\x9a\x5d\xa0\xef\xf0\xda\xb8\x80\x84\x38\x7e\x7b\xa6\xe3\x13\x12\x3f\xc5\x02\x4e\xc0\x98\xb2\xc7\xfa\x26\x3e\x7f\xf5\x50\x0f\x4d\x7d\x86\xaf\xcf\xa4\x56\xbf\x9f\x26\x71\x6a\x24\x61\x49\x05\x4d\x1c\xb0\x3f\xb8\xf9\xdc\x57\x6f\xfd\x96\x2f\x97\x18\xa3\xf4\xe1\x97\x03\xed\x32\xc9\x2a\x32\x6a\xc6\x14\x6b\xb5\x91\x0f\xee\xcd\xed\xbc\xfc\xad\x5f\xe2\xb2\x9f\x78\x0a\x62\x68\xd4\xe1\x1a\x2e\x13\x72\x39\x9f\xce\xab\x99\x37\x5a\xc7\xcd\x77\x26\x83\x07\xe5\x9f\x5f\x95\x81\xe9\xc7\xe3\x7b\x52\x17\x9b\xcb\xb8\x49\x1e\xef\xe3\x8b\x98\xc3\xf5\x6c\x97\x6f\x5c\x6a\xa7\xd4\xe5\x21\x1a\x3f\xd5\xf5\x5f\xf1\x72\xc3\xfb\x88\xb1\x62\x32\x53\xab\x09\x6a\x2b\x59\x32\x87\xfc\x74\x78\x83\x5b\x3c\xdf\xc2\x67\x61\xe8\xca\x7f\x43\xfa\xc3\x82\xd1\x47\xf7\x7e\xd6\x5c\x77\xf1\x14\xe6\x3d\xca\x55\xd2\x08\x96\x18\x38\x97\xcc\xf9\xbe\xaa\xbf\x70\x57\x97\xfe\x65\xf0\x2c\x7b\x5d\xef\xf1\x43\xb1\x56\x04\x8d\xa7\xc8\x7c\xcf\x97\xac\xbf\x5a\x47\xa3\x96\xbd\x31\x9f\xd0\xb7\xe1\xf9\xaf\xfa\x35\xcd\x2f\x27\xeb\xab\x86\x2d\xaf\xfd\xa7\x3d\x0f\x35\x62\xc8\x5f\x0a\xb2\x02\x09\x46\x54\x5e\x69\x8e\x59\x43\x2d\x8f\x68\xe9\xfc\xab\x37\x78\x3e\xd8\xea\x3e\xab\x41\x01\x72\xce\x7d\x2a\xf4\x28\x80\xa9\x8d\x35\xe9\x54\x21\xd4\xa9\x2d\x8b\x7e\x48\x25\xfd\xb2\x03\x89\x09\x86\xc8\xf9\x1e\xef\xb2\x61\x98\xef\x0c\xd7\x61\x05\x6f\x79\xca\xa9\x7e\x50\xbf\x9e\xac\x5b\xee\xf8\x00\xe5\x27\x0d\x78\xa3\xfe\x86\x16\xbd\x4a\xfb\x65\x1b\x60\xfe\xf5\xc6\x01\xd8\xb3\xdf\xa8\xf4\x26\x7d\xaa\x7f\xd9\xac\x59\x99\xe9\x84\x4c\xb3\x60\xed\x0d\x08\x10\x18\x7b\xbc\x9e\x60\xfa\x48\x04\x7a\x97\x61\x48\x74\xc4\x1e\x02\x13\xbe\xe3\xb8\x0b\xd9\x27\xe4\xfb\x61\x78\xe2\x95\x39\x39\xb9\x39\xe1\x24\x4f\x5e\xf0\x5f\xad\xa5\xfc\x9a\x65\xd2\x38\x9e\x56\x48\x2a\x8e\x2f\xf8\xfd\x18\x06\xef\x20\x92\x51\x6f\xf6\x75\xf5\x90\x0c\x60\xba\x42\xd8\x17\x40\x56\x5b\x5b\x68\x49\x08\x63\xcc\xec\x4f\x1c\x9e\x91\xc2\xf0\x41\x19\x31\x38\x43\x6d\x64\xeb\x35\xd5\x4b\x87\x85\xe9\xec\xe7\x1c\x7d\x54\x7e\x04\xa3\x49\x94\x7c\x47\xb2\xea\x41\x8c\x13\x34\xbb\x0b\x12\xd5\xf8\xb4\x62\xe3\x89\xae\xfc\x1e\xc8\x63\x23\xd3\x0f\x37\xcf\xdd\x39\x50\x0a\x42\x7e\x98\x16\xd1\xd0\x8a\xf8\xbe\x6c\x85\x2f\xf2\xe6\xf3\xed\xa8\xec\xbf\xb1\x6d\x5b\x75\xf2\x5f\xd1\x59\x9f\x55\xc2\x7f\xbf\x9d\xab\x7f\x7f\xf2\x6a\xe9\xf0\xc7\xfb\x7e\xa6\x56\xf4\x8e\x02\x2a\xcc\x87\xa4\xf3\x8e\xd4\xfa\x6c\x20\xf4\x13\xb2\x29\x64\x72\x7d\xb7\x5c\xd7\xa6\xbe\xdc\xc3\x14\xa6\x3a\x9e\x3f\x4a\x89\x4a\x81\xf3\x2b\x21\x80\x2d\x44\xbd\x3c\x0b\x1c\x7e\x7f\x3c\x7c\xa9\xe1\xed\xb0\x5f\x89\x7b\x98\x49\xae\x01\x25\x66\x13\xe6\x29\x70\xf4\xc7\x85\xd5\x7d\xff\x3d\x78\xeb\x6b\xee\x94\x65\x27\x23\xbd\xb2\xf9\x16\x9c\x70\xf5\xec\x80\xcc\x03\xfc\x51\x43\x5e\x5a\x34\x42\x49\xe4\xd6\xe0\x21\x6e\xda\xe0\x58\x41\x53\xeb\x30\xa6\xbc\xf5\x57\xef\xcf\x3f\xb0\xd7\xe4\x59\x70\x65\x54\x89\xdc\xf4\x28\x30\xdf\x81\x09\x40\x7d\xe4\x8f\xa5\xc2\x7e\x3b\xe9\x71\xb0\x9d\x29\xa5\x88\x32\x47\x5a\xe5\x3d\x14\xed\xf4\x39\x71\x07\x52\x95\x25\x08\x2e\xbb\xab\x43\x86\x84\x02\xb6\x3e\xe3\x9d\x66\x81\xce\xff\xb6\xee\x0b\x49\xdf\x9b\x34\x95\xb5\xaa\x48\xaa\x10\xba\x39\xff\x2e\x72\xca\x7f\xe5\x24\xd1\x0f\x48\x63\x3c\x0d\xd8\x9f\x2c\x87\x7c\xd8\xcf\x4c\xc2\x0c\xdd\x0a\x1e\x2f\xc3\x95\x1e\x89\x26\x77\x3f\x06\x66\xb7\x8d\x95\x3b\x10\x19\xdb\x2e\xe8\x05\x0c\x02\xdf\xd3\xec\x6c\x77\x2d\xfb\x31\x0a\x9d\xae\x18\xff\xd6\x80\x9b\xe1\x43\x02\x90\x79\x1a\xa9\x1d\x18\x6f\xed\xcd\x8f\xa4\x5f\x48\x9b\x1e\xb4\xba\xa6\xcc\x2c\x6d\xf2\x03\xe5\x20\x2a\xbc\xe0\xd2\xea\xf1\x5c\x9d\xc0\x44\xbe\xe0\x9a\xcc\xd0\xb5\xa7\x0f\x9d\xdb\xa6\x06\x63\xae\xde\x4b\x25\x80\xb5\x73\xed\x22\xcf\x99\x0f\xcf\xbf\xa7\x0a\x7f\xf0\x1c\x8c\x75\xf2\xf5\x0c\x17\x36\xb4\x8a\x43\xf9\xbe\xac\x87\x7b\x12\x3b\xb0\x13\x46\xe3\xe8\x9f\x75\x12\x9e\x56\x00\x74\x26\xa3\xe6\x1f\xb8\xc7\xc3\xe3\xf8\x3b\xd9\xef\xb2\x40\x11\x8e\xbe\xfb\xf8\x1c\xaf\xef\xdf\xdd\x1d\xd6\x3b\x19\xb0\x6a\x0b\xda\x7e\x90\xc1\x00\xe1\x61\x67\xb7\x19\xb6\x03\x03\x9d\x3a\x53\x88\xaf\xed\x63\x7d\x0f\x2e\x06\x7b\xbf\xd0\xf4\x32\xe9\x75\xa8\x0c\x5e\x66\xc2\xc7\x91\x47\xcf\x9a\xbc\xd1\x54\x8f\x49\x00\xaf\x4c\x37\x8c\xfa\xcb\xa9\xa4\xf2\x80\x0b\x42\x1d\x4d\xe1\xca\xe7\xf0\xd2\xe8\x27\x2f\x7e\xb7\xef\x0f\x8c\x24\xf6\x7d\xbc\x1e\xb4\x2f\x44\x41\x5f\x7f\xcb\xa8\x15\x61\xf1\xf6\x66\xe3\x7b\xc8\x17\x9a\x81\x1c\x6d\x75\xb1\xac\x27\xe9\x11\xa5\x2e\xee\x1f\x78\x29\x4f\xf4\x50\x67\x6f\x8f\x78\xea\x01\xb3\x43\xff\x5c\xed\x97\x83\xb2\x49\x19\x4b\x7d\xa7\x99\x9b\xa4\x7f\x8d\xec\x48\xde\x6f\xf1\x2d\x47\x5e\x2c\xd3\x2c\xba\x4a\xec\xeb\x65\xf1\x3d\x7b\xe6\x2a\x61\x92\x74\xb3\xd7\xfc\x76\x2c\x87\xd0\x35\xa4\x05\x3d\x9a\x6f\x11\xef\x77\xbd\xc5\x5d\x77\xfa\xe2\x85\x17\xe3\x5e\x45\xbe\x0d\x48\x8a\xac\xf7\x7a\xcb\x42\xad\x40\x31\xae\xf7\xff\xd3\x4a\xad\xf7\x1e\xa0\x5c\x6a\xb3\x23\x58\xf5\x65\x96\x88\x5c\xf6\x5f\xe6\xe2\x74\x7d\x7f\xf3\xb8\xcb\x01\x3b\xca\xa9\x5b\x30\x0a\xde\xbf\x66\xc8\xd5\xe0\x1b\xd3\xdd\x87\xdb\x8a\x5d\x27\xbe\xb0\xf4\x3c\x35\x55\x56\x67\xbf\x0d\x66\xdf\xe5\xa7\x34\x4c\x3b\xd7\x8c\xb3\xc2\xec\xb7\x42\xa2\xa8\xe3\x92\xaa\xc4\x0f\x05\x6f\x0d\x42\xc9\x5c\xde\x76\x39\x55\x32\x2e\x11\x58\x8b\xbd\xe9\x1c\xeb\xb7\x88\xd8\x04\xca\x1c\xee\xc6\xa2\x50\x81\x43\x21\x0e\xf5\x03\xf1\x3d\x60\x9e\xb9\x50\xdd\x3b\x13\x79\xde\xe9\xe7\xb9\xde\x3d\x19\x68\x7d\x1e\xd9\xf8\x07\xbe\x9a\x43\x02\xeb\x14\x3f\x98\x5d\x9c\x5f\xef\xd5\xfc\xbb\xff\xa7\xd9\xc0\x8b\x91\xba\x8c\xca\x23\xaa\x87\x1d\xa1\x16\x54\x23\x3b\x06\xc2\xe2\x91\x33\x3c\x5a\xd8\xcb\x4b\x7c\x92\x9e\x54\x25\xb1\xda\x0b\x45\x82\x62\x08\x92\xed\xcb\x73\xea\xd9\xc7\xe9\xeb\xea\x3f\x4f\xb7\x14\xcb\x0d\xb6\xec\x37\xdb\xa1\x15\x6d\x59\x7d\x85\x5a\xf3\x9b\x85\xae\x34\xd4\x85\xb1\x9a\xf7\xa0\x62\xd0\xce\xa3\x5a\x4f\x14\x83\xc7\x24\x87\xcc\x2a\x56\x71\x37\x0c\x63\x8c\x4d\x13\x75\x97\xf6\x40\x40\xc8\x43\x63\x02\x7e\x66\x2c\xb4\x83\x2c\x74\xaa\x7d\x2b\xae\x9a\xb1\x0a\x0d\x86\x2d\x23\x7b\xae\x31\x8e\xd3\xe8\xdf\x7b\x5a\x32\x6f\x3b\x10\x1c\xaf\x27\x59\xb3\xe9\xca\xe6\xf1\x33\x07\x30\x2b\xf9\x2c\x10\xc0\x64\x76\x75\xe0\x9c\x41\x97\xbc\xbb\x22\x51\x80\x03\x29\xe9\x2c\x77\x77\x22\x7e\x4b\xf5\x6f\x8f\x4d\xfb\x57\x73\x6b\xc6\xd8\xa8\x93\x8d\xdc\x70\x10\x7d\xfd\x1e\xa3\x89\xfa\xeb\x40\xb8\x8d\x1d\x90\x86\x79\x3f\xd0\xc4\x82\xed\x67\x57\xa8\x99\x3b\xa6\x17\x4e\x8a\x45\x4f\x42\x45\x88\x1e\x8e\xd7\x2a\x8e\xb5\xe8\xc8\xe7\xdf\x7d\x58\xd5\x1d\x13\x93\xfa\xd7\xbe\x72\x98\x62\x68\x6a\x60\x2f\xdd\xcc\xf7\x0b\x49\xe2\x99\x6f\xac\x9f\xd1\x08\xd2\x64\xdb\x58\xb9\x11\x73\x7d\x8e\xa7\x1e\x5b\x9b\x6f\x5e\x54\xb4\x0d\xd4\x37\x7d\x99\xa1\xda\x7e\xab\x24\xfe\x40\xb4\x1f\xaf\xb6\x97\xc7\x5d\xfc\xd0\x9e\x36\xaf\x76\x8f\x6f\xa3\x29\x04\xb5\xb1\x7c\x0e\x2d\xdb\x05\x11\x30\xbc\x30\x1b\xd5\x8c\x2d\xd2\x8d\xd7\x7d\x57\xdf\xdd\xc4\x7e\x17\xfa\xaf\x06\x78\x54\xad\x26\xf5\x4a\xb1\x56\x7d\xdb\xd9\x43\x2f\x99\x53\x86\xa5\xca\x28\xc8\x7b\x3f\x5e\x72\x59\x0c\x36\xeb\xe3\xc3\xe4\x90\xd1\x27\xf7\xfa\xd4\x4a\x77\x76\xfa\x58\x92\x08\xbb\x5b\x96\xfa\x2d\xfa\xab\x26\xca\xfd\xf9\x2f\xcf\xbf\x5b\x13\x0d\x41\xd0\x2a\xb1\xd1\x25\x7a\xf7\x16\xea\xa3\x7b\x3c\x65\xd8\x39\xf2\x25\x1c\xad\xd7\xe3\x4b\x7c\x93\x9a\x4a\xf7\x28\xc9\xc5\xaa\x74\xb4\xee\xd8\xbb\xd7\x28\x54\x27\xf9\x96\x24\x89\xc9\x65\x0b\x86\x38\x76\x90\xb8\xf2\x5c\x61\x80\xb6\x0c\xf4\x7e\x95\x16\x91\x26\xe1\x8b\x3c\x5c\x94\xc6\xee\x8e\xc7\x77\xc7\x4f\x03\xae\x05\x81\xc6\xf1\xd3\x08\xcf\x66\xd1\x1c\x2f\x7e\x03\xd1\xfa\x05\x0e\xf0\xba\x8e\x21\x36\x45\x59\xfa\xab\xea\xfe\x1a\xe2\x78\x6f\xe2\xdf\xc8\x4d\xcc\xee\xc1\x33\x99\x29\x71\x2c\x36\x69\x18\xbb\x15\x39\x2c\xcc\xbb\xca\x3b\x5a\x7b\x30\xa1\x6a\x9a\xd1\x7a\xe8\xe7\x86\x7e\x12\x9c\xe3\x16\x53\x4e\x9c\x69\x27\xfd\x0c\x35\x9b\x4f\x46\xb4\x56\x39\x02\x5a\x71\x62\x20\x03\x50\xb4\xe9\x91\xca\x7d\x95\x02\x66\xb7\x0e\x6f\xe0\xd4\x87\x34\xd7\x0e\x65\xf8\x62\x82\xe0\x65\x04\x4f\x39\x46\xdd\x05\xd1\x19\x92\xc1\xcd\xc9\x4c\x9a\xfd\x03\x51\x14\x6a\xcd\xa9\x80\xc7\x1c\x82\xb0\xc5\xcc\xf2\xc5\xbc\x76\xf0\xe8\x48\xaf\xee\x50\x5e\x28\xcd\x92\x6d\x4b\xd2\x7f\xf0\x1e\x23\x07\x23\xc4\xa9\x85\x63\xc0\x90\x7d\x5e\x20\xdb\x1e\x24\xde\x45\xae\x1a\x59\xaa\x62\xab\x83\x37\x2e\xcb\xb2\x2d\x77\xef\xf7\x6c\x9a\xd9\x0b\x02\x22\x33\x54\xee\x9d\x0f\x1b\xd9\x80\x39\x28\x84\x92\x31\x37\x36\x3c\x68\x86\x99\x5f\x4f\xb8\xd8\x70\xda\x65\x4f\x48\x7b\x11\x58\x1a\x11\xcf\x87\xfa\xfc\x21\x77\xbd\x21\x4a\xbd\x25\xd5\x1d\xd6\xae\x22\x46\x15\xcc\x71\x66\x74\x5c\x79\x9c\x83\x35\xbc\xa7\x39\xfb\xec\x99\xa6\x9e\xae\x77\x63\x4b\xab\x02\x7a\x23\x56\x35\x6e\xa8\x8c\xef\xb6\x02\x1d\xd1\x0c\x50\x0d\x4d\xb3\xd9\xef\xfd\x2c\x11\xfe\xe1\x96\x94\xc2\xd7\x2b\x9e\xac\xd8\x84\xd2\x2c\x24\x70\x25\xaa\xa0\xc8\x83\x00\x52\x38\x35\xa4\x8b\x3c\x21\x89\x6b\x86\x96\xda\xfa\xcb\x26\x99\xd5\x1a\x1a\x2a\x35\x33\xb1\xbf\x0f\x70\x7e\x1f\x7c\xcb\x5b\xbe\x7d\xd7\xdf\xe8\x17\x7e\xff\xe8\x29\x6b\x94\x60\x8d\xa6\xa6\x69\x70\xb1\x60\x68\x41\x46\x79\x50\x9e\xf3\x68\xd4\x3f\xea\x29\x0d\xed\x24\x8c\x98\x38\x37\x8f\x5d\x79\x49\xea\xd9\x9e\x8e\xfc\xf8\xde\x17\x5a\x49\xc5\x99\x63\x1b\x9b\xaa\x4f\xfa\x27\x93\x7a\xde\x5a\xb5\xa4\xab\x3b\x47\x21\xb2\x65\xc6\xf3\xbb\x60\x54\xfb\xb3\xb1\x02\xdf\xc1\x4f\x6a\x09\x39\x23\x81\x55\x49\xfd\x32\xd9\x58\x5f\x08\x7e\x7d\x7f\x82\x61\x8a\x35\xc9\x20\x71\xa6\x36\x67\x64\x4a\x7d\x9d\x06\x6b\xa8\x3e\xe0\xbb\x15\xec\x0e\x7c\x91\x50\x92\x8c\x3e\x73\x10\x9c\x16\x26\x4e\x31\x23\xb5\x4d\xbd\x01\x9d\x1f\x8e\xfb\xb1\xe1\x4f\xf9\x8e\xd5\x6a\x74\x3a\x3a\xf3\x71\x2d\xba\x3e\xc5\xbe\xab\xe3\x43\x65\x70\x0c\x8f\x20\xa5\x74\x17\xfa\x91\x5c\xb1\x5d\xe9\x5d\x6f\x9f\x75\x57\xb2\xf5\x66\x1f\xa1\x4c\x0a\xf1\x1a\x6f\xcd\x9d\xb2\xc3\x6f\x06\xfd\x74\xe3\x58\xbe\xfd\xf3\x62\x63\xb7\x7c\xf1\x08\xd4\xa5\x7a\x1f\x8e\x8b\xd1\xbb\x43\x83\x15\x53\x6b\x8d\x7a\xfc\x8c\x28\x7d\xe5\x9e\xf0\x9c\x46\xb9\x82\xe0\xc9\x35\xd9\xef\x2b\x86\x1f\xe1\x05\xc3\x8e\x64\x12\x23\xba\x78\x8f\xef\x2c\x4d\xfe\x58\x2e\xeb\xf6\x94\xea\x7e\xba\xbb\x3d\x3c\x7b\x03\x8f\x66\x08\x76\x5d\x3a\x5b\xb1\xfb\x5e\x92\x31\x07\xa8\x00\x6d\x6c\xf4\x36\xba\x53\xf4\x5c\x7f\x5c\x50\x72\x0e\x2e\xf0\xb7\xa0\xc8\x54\xbd\xb3\x28\xa9\x7f\xec\x69\x3f\x41\xfe\x40\x85\x91\x1b\x17\x98\x6b\x58\x05\x9e\x90\x19\xbe\x3a\x57\x79\x26\xd3\x1c\x15\x1e\xf9\xd2\x2b\x24\xec\x77\x67\x58\x6f\x99\xb7\x72\x47\x80\x1b\x5e\xd1\x1d\xd2\xf2\xe4\xd4\xe4\xe1\xf2\x54\x9e\x2d\xa7\x1d\x0c\xcc\x3f\x37\xf8\x17\x31\x33\x8f\x2d\xb0\xa1\x90\x5f\xa0\x37\xf2\xd7\xd6\xef\x78\xbd\x3e\x2d\x91\xc3\xa7\x16\x03\x6e\x09\xa9\x5e\xbc\x5a\x7a\xc2\xbe\x27\xd9\x20\xe8\x27\x45\xc5\xfa\x47\xaf\x98\xe0\xe5\x58\x5a\xa4\x3d\x77\xc3\xc7\xc9\x08\xca\x3a\x43\xca\x40\xf4\xdd\xf5\x20\x5a\xf9\x41\xb1\x01\xcf\xc2\x70\xc1\x93\x77\x4f\x93\x04\x9b\xd0\x38\x39\x34\x71\xdd\xb9\x11\x8b\xfd\xce\x68\x3e\x29\x92\x55\x14\x1e\xd5\x8f\x47\xd1\x1f\x0f\xe8\x8e\x31\xfa\x09\xed\x74\x64\x9a\x78\x40\xe3\x41\xcf\x5a\x77\xe3\xe4\xfb\xd7\x10\x05\xbe\xf6\x98\x0d\xbc\x3f\x49\x79\xe9\x2e\xe5\x7b\xc4\x58\xb4\x26\x1d\xed\x64\xd5\xe3\xc3\xe9\x53\x7b\x2f\xdf\x0a\x4f\x05\x67\x92\x52\x57\xa6\x8d\x12\x6b\x81\xfe\x08\x24\x7b\xb9\xc1\x06\x6f\x9e\xcf\x67\x05\xe6\x57\x47\x0e\xcc\x23\x21\x7c\x7f\xe2\x97\x05\xcf\x9a\xad\xc4\x27\x35\x31\xf0\x7b\x9b\xe2\xb8\x49\x08\x43\x1c\x54\xbf\x40\xa3\xda\xcf\xc6\x3b\x1b\xca\x40\xe9\x3b\xd8\x30\x25\x31\xe0\x2c\x17\x05\x47\xb1\xfa\xda\x79\xc8\x5f\x30\xa7\xf7\xd2\x1e\x8d\xcc\x5f\xc7\x55\xb9\x1c\x69\x84\x2f\x23\x22\x81\x92\xee\x98\x99\xcd\xe5\x2c\x84\x3f\x79\x8f\xae\xe4\xed\x8c\xac\xf7\x09\x9f\x0f\xe1\x82\x4d\x90\x93\x78\x02\xeb\x7d\x37\xf9\x2b\xf6\xe6\x52\x9c\x83\x0b\x13\x80\xd1\x33\x1d\x21\xd9\x13\x57\xde\x62\x27\x60\x73\x2a\xfc\xf7\x7c\x8e\x8e\xa7\x3c\x5e\xa1\x3a\x14\xaa\x6c\x33\x0e\x41\x79\x9f\xc0\x7c\xae\x65\x85\xb8\x64\x60\xad\x5a\x73\x40\x0d\xe1\xfc\x66\xe9\xf1\x13\x97\x80\x8e\x66\x3c\x51\x05\x45\xef\x6c\x19\xc9\x00\xb0\x6c\x58\x0f\x26\xd2\x28\x77\xe3\x52\x3e\x08\xb1\x15\xf4\x50\x1c\x89\xa5\x0a\x96\x63\x9e\xb8\x9c\xc2\x97\x81\x17\x2b\xae\x3d\x57\xf8\x43\x2f\xd8\xa9\x6b\xfb\xd3\xe8\x47\x6a\x99\x08\x00\x93\xe2\x95\xcd\x85\x21\x92\xe4\x49\xb1\xb4\xa6\x4e\x13\x8d\x76\xfb\xcf\x52\x7e\x25\xdd\x12\xfc\x79\xd7\x5f\x26\x28\x06\x7f\x66\x89\x64\x01\xdb\x6b\xe5\x84\x21\xde\xab\x42\x52\x10\x95\xbd\xbb\xe0\xf0\x2a\x09\x02\xc3\xd0\x34\xbd\x93\x29\x04\x9e\x67\x4d\xd5\x1f\xcb\xff\xa0\x52\x47\x57\x16\x05\xec\x0e\x47\x73\xf0\x96\x32\xdf\xf7\xef\x06\xe4\xea\xd3\x71\x80\x11\x13\x7f\xb4\x88\x4c\x92\x3b\xa2\x8f\xa5\x0b\xeb\x5d\xeb\x8f\x5e\x41\xdf\x7d\xb4\x86\x12\x67\x97\x3c\x0e\x12\x7f\xe6\x5d\xa0\x2d\x97\xf7\xef\x2d\x99\xdd\xf5\x6b\x53\xba\x7a\xa9\x1e\x95\x19\x74\xb1\x30\x3d\xfa\xf5\x3f\x3c\x47\x71\x3d\x79\xa4\x6f\xc0\xce\x36\x18\x16\xae\xee\x07\x7f\x75\xc8\xc2\xa7\x7c\x8a\xfc\xcc\xa1\x26\xbc\x46\xd3\x86\x0c\x6c\x02\x79\xbf\x64\x59\x5e\xb2\xf2\xf4\x73\x07\x06\x82\x41\x0c\x5f\x34\x41\xe5\x93\x73\x43\xc3\x2d\x0c\xe8\xf1\x9c\x3f\xdc\x0b\xe8\x2f\x09\x39\x1b\xc7\xb9\xfb\x84\xa0\xc1\x88\x5d\x3f\xf5\x05\xde\xdc\x66\x6c\xb3\x43\xc0\xd7\xdf\xe7\xb1\xa8\xed\x03\xf2\x50\x2b\x7b\x16\x22\xb9\xf6\x03\xb8\x1b\x58\xf9\xd0\x0f\xef\xe2\x9a\x92\x85\x17\xb2\x9f\xa1\x47\xe5\x15\xee\x22\xa8\xc3\xfb\xf9\xd5\x95\x38\x68\x41\xc4\xb5\x24\x89\xc2\xf8\xe0\x0c\xde\xa5\xd3\xb1\x4d\xe8\xcf\xad\x58\x31\xdf\x24\x41\xd4\xdf\xff\xa1\x7e\x14\x4a\x04\xd3\x7d\x90\xfc\xe2\x22\x4e\x5d\xc2\x69\x16\x6d\x34\x97\x11\x82\xe7\x9e\x6c\x04\x6d\x62\x02\x30\x09\xcf\x8d\x17\x49\x21\xd4\xc4\x43\xee\x57\x2b\xbf\x5f\x52\x45\x35\xa7\x7c\xdf\xfb\x65\xb0\xc8\x02\xed\xfc\x14\xfa\x32\x7b\xb0\xc3\xe1\x38\xf6\xa1\xe7\x91\xf8\x4c\x03\x55\x76\xdc\xcf\x8a\x99\xc1\xe8\x0a\x3f\x0a\x58\xd7\xc3\xe2\x65\x5f\xdb\xd9\x09\xf8\xe2\x03\x61\xa3\xf9\x4a\xd7\xd0\xd8\x3a\x6e\x93\x12\x2e\xaa\xb1\xa6\x54\x03\x6c\x9b\xae\x01\xa3\xe5\x89\x11\x6e\x3e\xba\x75\x54\x6b\x92\xdb\x37\x63\x20\x86\xd9\xfd\x94\xa2\x2c\x72\xa2\x17\x08\xbf\x8a\x7b\xed\xf5\xdd\xc3\xa7\x13\x6b\x2e\xb1\xe1\x64\xa1\xd1\x72\x02\x15\xce\xbc\xc8\x34\x0d\xb4\x42\x55\xb7\x97\x2d\x76\x95\x83\x25\x0f\x0d\x01\x02\x48\xaa\xd8\x11\xcd\x17\xb8\xab\xa3\x79\xd0\x7b\x17\x4b\xcc\x91\x8a\x86\x7c\x9e\x3c\x35\xcb\xd2\x1c\x42\xda\x16\x25\xc6\xb3\xed\x86\x7b\xf0\x50\x18\x3e\xae\x23\xd4\xda\x1d\x3a\x6d\xb9\xaa\x46\xa5\xbb\xa2\x85\xbc\x68\x1a\x37\xbe\x5f\x45\xdf\x5e\x2e\xc1\xee\x69\x01\x9b\x92\x60\x12\x15\xb1\x47\x59\x51\x04\xe1\x49\xea\x7d\x45\xaf\xae\x0d\x78\x18\xce\xe1\x39\x93\x3b\x7a\x9f\xe7\x79\x2b\xa0\x24\xc2\x31\x09\xd1\xd1\x25\xf4\xd9\x7c\x6c\x9d\x35\xf4\x9d\xeb\x7d\x1a\x26\xb6\x02\xc6\x9e\xc8\x05\xc7\x6d\xff\x22\xe7\xb2\x99\x67\x8b\x3d\x61\xa0\xb1\x30\x0a\x66\xdd\xf8\x58\xb6\x18\x76\x61\x16\xbb\x96\x93\xe4\xbf\x17\x90\xd3\x68\x62\xe2\x35\x0c\x17\x38\xcd\x76\xa1\x99\x91\x84\xc2\x9f\x49\x9a\x2e\xeb\x02\xf0\x0f\x0a\xcc\x91\x0e\xda\xc5\x65\x20\x82\xa6\xa9\x23\x59\x4f\x32\xd3\xb6\xd9\x92\xdd\xf5\xeb\x09\x07\x74\xd8\x01\x8e\xe3\xad\xf4\x09\x84\xf2\xce\x31\x6a\x9c\xc6\x8c\x25\xa1\x9c\x05\xfc\xe8\x19\xf3\x4b\x91\xd6\xfb\x78\x79\xae\xd5\x19\x5d\x7a\x85\xe6\x43\x68\xda\xf9\xf5\x07\x33\x99\x00\xdf\x60\xc7\x67\x8f\xe9\x5b\x6a\xf2\x23\x78\xca\x3c\x30\x8a\x2b\x10\xf8\xb8\xc8\x87\xbf\x09\x1f\x5f\x0a\xbd\x0e\x73\x5a\x66\x4d\xf5\x8c\x83\xf2\x40\xdd\x72\x82\x34\xd3\x7a\xbe\xf8\x58\xcd\x34\x11\x9d\x94\x4d\xfb\x4e\x2f\x1a\xdf\x81\x60\x50\x84\x36\x41\x52\x8e\xd7\x53\x56\xd4\x45\x6b\x0e\xb4\xe1\x8b\x15\xee\xaf\x73\x99\x69\xc1\x34\xba\xde\x42\x98\xa5\x60\x83\x05\xcf\xb6\x2e\xc4\x83\x67\x20\x3d\x0b\x01\x3b\xfd\x1b\xbf\xf3\x16\x8d\xfe\xf9\x22\x48\x66\x7b\x6f\x2b\x8c\x63\x31\x05\xd1\xef\x99\x9a\x95\x25\x36\xf9\x1d\xe8\x13\xa1\x66\xfa\x1d\x00\xe4\x9b\x48\x5f\xbf\xe0\xa4\x93\xf0\x32\x35\x76\x22\x29\x32\x33\xf0\x3c\xba\xf2\x18\xe0\x50\xdb\xe1\xdb\x41\xae\x61\x4b\xea\x01\xbc\x20\x14\x9a\xf4\xf8\x74\xbe\xa1\x2c\xdd\x8e\xc6\x00\x6e\x61\xc6\x27\xa5\x86\x08\x0a\x60\x0f\xde\x0f\xc3\xb2\x1d\xdf\x43\x5f\x44\xcf\x77\x90\x30\x0d\x1a\xe1\xf9\xcd\xff\xd5\x8b\xd8\xf7\x62\x7e\x90\xcc\x98\x6e\x48\xdc\xaf\x43\x77\x10\x80\xef\xfb\xae\xa3\x61\xd8\x91\x9a\xe4\xd0\x2c\xf1\x0a\x93\x83\xa0\x03\xda\xe0\xa5\xde\x58\xac\x18\xe3\xeb\x22\x0e\x3b\x95\x36\xb8\xae\xc8\x04\x62\x32\xdd\x78\xbf\x4f\x8a\x29\x06\x21\x18\x99\x80\x38\xc8\x88\x85\x74\xc4\x75\x21\x80\x46\x27\xa3\x6d\xec\x0c\x5e\xec\xf9\x25\x66\x47\x01\x0a\xf0\xac\xdc\x73\x08\x27\x53\x60\xe0\xa3\x08\xf1\x89\xc4\x0f\x96\x69\xc0\xc8\xbe\xf7\x8f\xfd\x7a\xd8\xc1\xd4\x56\x7f\x75\xae\x09\x3d\x91\xe4\x00\xa7\x70\x66\xea\xaa\xda\x78\xaf\x5f\x08\x31\x6b\x0a\x6b\x70\xbb\xa7\x5e\xbc\x82\xf1\xb2\x50\x38\x59\x30\x32\x63\x56\xa9\x0e\xaf\x01\xa9\xb6\x96\xfd\x39\xc3\xb5\x34\xaa\xe6\xeb\x15\xff\x86\x8d\x84\x58\x18\x59\x0e\x07\x3b\x6c\xac\xc3\xb6\x7f\x72\xe8\x3c\x9b\xa1\x7a\xcb\x8f\xb6\x2e\x63\x0b\x0a\x22\x02\x47\xdc\xcc\x09\x81\x07\x70\xa5\xd4\x9f\xb1\x84\xa5\xce\x3c\x34\xf2\xfd\x12\xee\xbd\xef\x89\x9c\x61\x97\x0a\x9d\x8f\xc5\xf4\x21\x00\xbb\x73\xa3\x59\x32\x9e\xe1\x15\xb7\x2a\xe1\x65\x40\x84\x0c\x10\x3f\x37\x21\xce\x05\x38\xcb\x6e\x2e\xe2\x88\x93\x14\x9a\x21\x7a\x5d\x38\x4d\x9b\x1b\x0c\x2d\x29\x6b\xc2\x5b\x34\xc9\x4b\x7f\x14\x94\xd2\xd0\x3e\xa7\xee\xf5\x4b\x21\x67\x0c\xce\xb7\x2c\xc3\x67\x9a\x0f\xf2\x0b\x50\x40\xb0\xb0\x24\xc3\x90\x18\x8e\x93\xc4\x91\x42\x9f\x65\x61\x91\xd8\x3a\xc4\x02\xc4\x3b\x05\x51\xcc\xb6\x5d\x17\x82\xe0\xe2\x5d\xd3\x6b\x16\x70\x59\x5b\x88\xc9\x7d\x77\x86\x2d\xcd\x6f\x7f\xfd\x00\x0e\x32\x76\x16\xf4\x5b\x06\x4b\x8d\x82\x2d\x81\x50\x1d\xb1\xda\x3d\xe1\xde\x10\x69\xd2\x66\x56\x18\xba\xe0\x62\x3f\x2e\x59\x17\x80\x7e\x34\xeb\xa0\xc3\x60\x10\xb7\x04\x3b\x05\x8b\xc8\xa1\x68\x12\xb0\x2b\x88\xaf\xeb\x64\xdb\x65\x0b\xdd\x6c\xc3\x67\xf0\x2c\xe2\x79\x61\x17\x2f\x95\x23\x75\xce\x9b\x5a\x42\x07\x2b\xc3\xa5\x0f\x23\x13\x18\x1f\x98\xa0\x93\x69\x63\x59\x9c\x25\xd2\x54\xe3\x2b\x5f\x4b\x16\x08\x38\xd9\x5f\xb1\x16\x10\xf7\xf8\x5a\xef\xc8\xb8\x7e\xe9\x41\xe3\xf4\x55\x2f\x52\x7d\x1c\x24\x61\x31\xdb\xd0\x83\x51\x94\x29\xa3\xfe\x16\xeb\xba\xc3\xc5\xf8\xe0\x45\x20\xad\xc4\x9b\x9b\x98\x9c\x31\xe1\x16\x4d\xbc\xd3\xa4\x8e\xbe\x39\x36\x20\xa3\x96\x48\xa9\xd8\xa2\x6f\x1c\x55\xa7\x34\x5d\x3e\xbe\x8e\xfc\xea\xb8\xc6\x91\x3f\x95\x67\x1c\xb2\x5c\x56\x36\x65\x2b\x13\x16\x89\xfa\xd4\xd9\x5b\x31\x48\x01\xee\x59\xdd\x3b\x20\x40\xf6\x14\x8a\xa6\xd1\x38\x74\xe1\x6c\x9e\xb3\x28\xfa\x66\x59\xca\x41\x48\x83\x5b\x23\x07\x29\x77\x38\x5b\x8f\xfb\xec\x4a\x82\x2f\x94\xe1\xe9\xee\x30\x1f\x08\x0d\x6f\xe1\xba\xc1\xc0\x43\x38\x66\xdb\xc7\x20\x6f\x43\xbc\x01\x22\xa9\x77\x23\x9a\xd9\x65\xdd\x6c\x65\xe6\xc3\x67\x00\x97\xdb\x04\x92\x85\xee\x04\x62\xe3\x05\x59\x33\x00\xd1\x60\x63\x04\x0f\x0a\xea\x6f\x8a\x4f\x43\x7b\x12\x2c\x0c\xa9\x7a\x51\x6c\x8c\xd4\x5d\x30\x19\x19\x25\x90\x05\x40\x07\x0f\x59\x91\x57\x9d\x18\xa3\x20\xa6\x19\x11\x06\x00\xd7\x4b\x9e\x05\xa5\xa9\x0d\xa2\x9d\x3a\x27\xad\xca\x8c\xf8\x9d\xe9\x41\x6e\xac\x62\xf8\x6e\x4f\x34\xab\xb6\xc1\xee\x72\xf7\xda\xc2\x6d\x83\xf2\x3e\x33\xe1\x0b\xe2\x68\x90\x6b\x5d\x17\x28\x7a\x46\xdf\x75\xf2\x2c\xcb\xd2\x09\x23\x02\xc5\xc6\xc0\x2c\x7a\x24\xf1\x39\x77\x3b\xfa\x02\xf9\x27\x55\x5b\xbf\xad\x57\x9e\x34\x39\x6f\x03\x4c\x4f\x39\x96\x45\x61\xd6\x28\x6d\x27\x47\x7d\xf5\x69\x53\x0c\xb0\x51\xf3\xd5\x00\x8b\xb7\x6d\xf8\x84\xc0\x05\x54\x97\x8b\x40\x5e\x92\xb5\x8b\x34\xbd\xe1\x11\x5c\x8a\x9c\xcb\x11\x24\x5c\x26\x09\x4d\x90\x34\x39\x80\x61\xa9\x57\xc8\xb3\x9a\xdb\x3f\x53\xcf\x4f\x5d\x67\xd7\x20\x60\xd8\xb0\x34\xaf\xfd\xf9\x92\x5e\x2c\xfe\x72\x08\xe0\x0c\x14\x59\xee\x8f\xa0\x95\x5c\xb9\xb5\x8f\x6b\xaf\xd0\xe3\x82\x0e\x66\x20\xa8\xe3\x81\xf5\x3c\x2d\x0a\xd6\x00\x00\x06\x2e\x24\xfc\xdc\x63\x93\x7a\x0d\x24\xcd\x5c\x71\x0b\x54\xce\x2b\x6b\xc6\xd7\xf1\xcb\xa5\x7c\x85\xd8\x67\x5a\x1f\x06\x60\xb6\x75\x33\xc3\xae\x3b\x00\x61\xe0\x94\xa2\x30\x19\x4d\x83\x01\xbe\x95\x0b\x94\xe1\x61\xd8\x37\x68\xb9\x2e\xee\x7c\xce\xb0\xf4\xa5\x24\x1f\x3f\x91\xe2\x2d\x31\x4f\x87\x61\x58\xfc\xe4\x4e\x22\x20\xcd\xe1\xb1\x71\xc0\x97\x92\x8e\x01\xaf\xf7\x67\xdd\x98\xd9\x5f\xc6\xf3\xca\x69\xdc\x81\x20\xc6\x5c\x3f\x3d\xb4\xf9\x1b\x4d\x3a\x40\x9d\x09\xdd\x2b\x7b\xd9\x48\x21\xdd\x39\x5b\x25\xf5\x13\x8b\xb2\x54\xee\x08\xd5\x20\x87\x5b\x67\x8f\xdd\xb8\x08\xb8\xf8\x74\x3d\xf6\xd6\xd1\xf3\xce\xb9\xda\x43\x40\x59\x86\x89\x80\x24\xeb\x2f\xdc\xc5\xa9\x58\x1b\x60\xf5\x95\x2a\x47\xa8\x87\x95\x62\x6d\xdd\x15\xc2\x4b\xeb\xe7\x20\x59\xe6\x43\xb7\x3e\x36\xf7\xf8\x14\x70\xea\x6d\x7c\x1c\xe6\x3d\xe6\xc0\xf9\x6a\x85\xf7\x41\x52\x63\xda\x90\x16\x38\x29\xe8\x33\x73\x21\xf6\xfc\xc9\x1b\x88\xcb\xc2\x00\xc8\x82\xb0\x45\x51\xc0\x1c\xcd\xc2\x4c\x5a\x97\xfb\x51\x4a\x5f\x99\x87\x6a\x96\x04\x60\x81\x92\x28\x7a\xd1\xe7\xbc\xc0\x6e\x50\x01\x52\x9e\xfd\x84\x00\x06\x71\x68\x90\xd8\xf3\x93\xc0\x93\xdd\xcf\x80\x15\x43\xfd\xd2\xee\xb9\x79\x0b\x5a\x32\xf8\xa7\x3b\x9b\xbf\x8b\xed\x4b\x96\x56\x8c\xe6\x47\x2e\x33\x5b\xd9\x5b\xdd\xf3\x29\x0b\x4b\x23\x9a\x14\x79\x66\xbe\xb7\x1e\x1f\xc7\x39\xe6\x9f\xcd\x39\x1c\x4f\x5e\x20\xe8\xb7\x24\x99\x12\x8f\x98\x1f\x80\xc5\x74\x51\xa4\xd9\xb6\xd4\x30\x7d\xfa\xa8\xd7\x23\xd5\x51\x1c\xb8\x94\x8a\x14\x70\x36\x73\xbe\x2c\x3b\x8e\xbf\xb0\x5f\x50\x64\xc0\xd5\x69\x30\x34\xac\xcb\x96\x1b\xc9\x30\x90\x6b\xdc\xd5\x5c\x58\x52\xda\x68\xbf\xbd\xad\xd8\x68\x99\x85\x28\x02\xe8\xe6\x1e\x38\xb1\x73\xd6\x60\x98\xce\xe1\x83\x7c\x3d\x88\xba\xdf\xda\x21\x4a\x6d\xda\x03\xfe\x39\x54\xfd\xf5\x81\x9d\x64\x85\x7d\x7a\xf6\x91\xf5\x13\xfb\x7d\x78\x9d\x9a\x5b\x2a\xfc\x69\x1a\x61\x68\x84\xf8\x9f\x5f\x32\x71\x13\xe7\x42\x0e\xa7\x3e\x65\x11\xd4\x4f\x80\x19\xcf\x37\x49\xc0\x85\x27\x30\x50\x0c\xc3\x14\x8c\x7b\x46\x86\xcb\x22\xc4\x42\x71\x84\x18\x73\x24\x5b\xc1\xbb\x26\x8e\x75\xdb\x4e\xca\x06\x89\x0e\x88\xba\xae\x60\xfc\x94\xad\x4f\x0f\xb4\xcd\xb2\x0d\x50\x47\xd5\x20\xb3\xb8\x0a\xfc\xf3\x97\xa1\xcb\xfc\x13\x26\xc2\x27\x11\xa7\xa1\x53\x16\x66\xb7\xc1\x97\xe3\x1c\x40\xf5\x7e\x5a\x68\x5d\x13\x2c\x97\xe0\xb0\x80\xbf\x4a\xcc\xc6\x5a\x5b\x42\xfd\x53\x92\xc6\xdf\xcf\xb5\x35\x04\x39\xad\xd1\xfe\xd5\x11\x4e\xcc\xe0\xc3\xa0\xc7\x11\x5b\xce\x4b\x26\x59\xc8\x2d\x31\x23\x5b\x3f\x99\x31\x38\x8f\xf2\xd8\x4c\x66\x1c\x82\x29\x69\x4b\x04\xce\xa1\xa2\xd8\xf9\xb0\xac\x12\xf9\x5c\xbd\xc9\x56\xaf\xac\xeb\x10\x83\x7e\xc3\xf0\xef\x80\x19\x46\x95\x68\xe9\xaa\x31\xd4\x2f\x06\xe8\x6e\xdf\x42\x2d\x30\x64\x22\xc5\x66\xf6\x94\xc8\x98\x04\xa9\x8f\x22\xe2\xa2\x14\x6b\x54\x66\xb1\x71\xdc\x71\xb0\x2c\xa7\x41\xc1\x07\xe7\x9a\x53\x91\xe8\x02\x4f\x8a\x2d\x2c\x0a\x0f\x45\x7d\xbc\x60\xe1\xcd\xa7\xb7\x83\x5a\xee\xbd\x49\x0f\xb8\xe1\x6d\x02\x86\xd4\xa2\x4a\x61\xc1\xed\x41\xbc\x17\x2c\x0d\x30\x66\x15\xf4\xc9\x7e\xa2\x2c\xb2\x17\x89\x05\xf9\x1b\x08\xb0\xcf\x2b\xef\x65\x0a\xf6\x20\x98\x3d\xae\x85\x65\x4f\x8a\x00\x3e\xeb\x10\xdf\x33\xe3\x4a\x04\xdc\xc1\x26\x50\xfc\x80\x6b\x56\x33\x79\xc2\x26\xa5\xd9\xe5\x5d\xf3\x03\x17\xf7\xc6\x99\x51\x38\x17\x74\x11\xa9\x13\xf8\x1c\x4c\x96\xcb\x16\xb5\xab\x32\x48\x66\x65\x18\x34\x80\x39\xd2\x3c\x2e\x14\x66\x08\x04\xf7\xf4\x9f\xfe\xd3\x60\xd3\x84\x61\xa6\x06\xbc\x95\x43\x74\x14\x21\x50\x61\x0e\x58\x1a\x51\xc7\x52\x57\x5b\x99\xab\xa3\x62\xb4\xdf\xf6\x33\xb2\x5f\x24\x8b\x69\x47\xe2\xde\xe9\x92\x8c\x72\x8c\x56\x89\xf3\x4b\x85\x35\xe7\xbe\xd4\x47\xae\x7d\x8d\x98\x87\x71\xc5\x74\x4d\x5c\x7e\x61\x66\xa3\x5a\x20\xd7\x33\xb0\x75\x38\xc4\xe8\x6f\xe1\x75\xc4\x10\xc3\x26\x49\x60\xca\xd5\xda\x83\xec\xb3\xb3\x67\xc5\x0b\x9a\xc3\xcc\x6e\x7d\xc1\xd0\x7d\xfe\x31\x2b\x5e\x9a\xab\xd5\x56\x03\x19\x84\x8f\x82\x64\xcc\x80\x0e\xc3\xda\x29\x3e\x36\x95\xb8\x74\xc6\xbc\xcf\x8e\x6d\x14\x3d\x90\x30\xd4\x5f\x2b\xdc\x1d\x5d\xdd\x21\x0a\x9d\xad\x10\x40\xb0\x08\x68\x39\x78\x5d\x5d\x0a\x0d\xb9\x6c\xc1\x9f\x36\x17\x44\x0c\x04\xf2\xec\xb3\x61\x44\xf6\xad\xce\xf5\xbe\xea\x0e\xfd\x94\x31\x56\x1d\xc7\x3d\xf4\x9a\x7f\x22\x8e\xee\x2c\xf7\x59\xd4\xc1\xf6\x3f\xd6\x40\x42\xea\xf0\x99\xd7\x90\x7e\xee\xbf\x49\x70\x20\x19\xde\x44\x07\xbb\xd7\x10\x7a\xf6\x42\x09\x96\x81\x58\xdb\x5a\xa5\xdf\x89\x65\xe9\x1c\xf8\x42\x32\x5c\x10\x8c\x73\xc0\xc0\x38\xb2\x46\x14\x1a\x55\xb6\x22\xad\x59\x77\x6d\x96\xb7\xd2\xb6\xf4\x96\xec\x3d\x33\x3e\x16\x88\xd4\x2c\x89\xa1\xa5\xda\x8a\x1e\x20\x3f\xce\x9e\xb7\xa6\x8b\x38\x7a\x63\x8a\x91\x40\xfa\x7d\xf3\xd3\x72\xb6\x17\xde\xb0\x02\xe1\xb5\x28\x7b\xed\x62\xbf\x63\x74\x9c\xaa\x64\x76\x37\x46\x8d\x39\x17\x52\xe1\x14\x3d\xde\xb2\x9f\x70\xe0\xc8\x34\xe6\xd6\x33\xaa\x7c\xbe\x3c\x50\x86\x03\xfc\x7d\x3d\x23\xd8\x64\x61\xc0\xd7\x2c\xca\xec\x04\x9e\x30\x61\x33\xf6\xb7\xff\x61\xe3\xef\x69\xce\x7b\x6a\x5f\x38\x09\x30\x03\xbf\x7b\xa9\x26\x23\xda\x45\x71\x8c\xd1\x6f\x9a\x85\x80\x4e\xa9\x01\xb2\x05\x41\xd4\x3f\xd9\x82\xc9\xa4\x53\x3c\x3e\x6b\xb0\xd1\x76\x5a\x1d\x2e\xbf\x16\xc9\x2b\x65\x81\xeb\xa5\xce\x9b\x5f\x6a\xf2\xb3\x50\x34\x00\x48\x92\xce\x88\xe6\x8a\xc2\x64\xb6\x3f\xa1\xa8\x74\x47\xd6\x05\x45\x0c\xf2\x85\x35\xf6\x8e\x36\x3b\xae\x77\x93\x29\xd7\xf2\xe3\x78\xd4\x35\x30\xeb\x1c\x8b\xd1\xd2\x82\x17\x5b\x41\xc2\x70\x96\xf2\x23\xc9\x5f\xf7\x26\xb1\x7a\xc4\x6b\x3e\x8a\xe5\x67\xad\x6a\xe6\x88\x92\x15\xca\x37\xab\x7e\x3d\xde\x8c\xe1\xa1\xf0\x13\x66\x38\xe8\x71\x7d\xbb\x9e\x0c\x43\x02\x69\xcf\x77\x83\xe9\x48\x76\x9a\x88\xe5\x00\x55\xa8\x09\xd5\xb0\xac\xab\x24\xd5\xe5\x0f\x57\x0a\x68\xe0\x94\xb3\x59\xd1\x32\xf8\x05\x3b\x6d\x61\x3b\x71\x3e\x7f\x28\x71\xf8\x21\x1f\x53\xbf\x81\x18\x86\xb6\x12\x8c\x87\xf6\xe4\x8e\xf3\xfb\x2a\x1c\xde\x7f\xc4\xbe\xfc\x7d\xbd\xe4\x8f\x5c\xc2\x74\x87\xa9\x44\x18\xfc\x80\x34\x1b\xd6\x44\xf1\x79\x6b\x3c\x31\xe0\xc9\x6e\xdd\x46\x90\x86\x58\x28\x10\xa6\x36\xcc\x89\xa5\x4c\xd6\xbf\x74\x75\xa7\xdf\x15\x44\x40\x9f\x24\xe9\x2f\xb4\xf5\x0b\xa6\xe8\x59\x71\x9b\xb9\x00\xa1\x8a\x3f\x9d\x51\x5d\x00\x4f\x84\xbd\x08\x87\xee\xb7\xe7\x01\x45\x52\x19\x6e\xc2\x26\x82\x90\xf7\xca\x7b\x3d\x11\xeb\x34\x03\xb0\xc1\xba\x0c\x66\x49\x3e\xc3\xd1\xcc\xf5\xf8\x87\x7d\x40\xca\x83\x90\xa2\x0e\x00\x64\xf7\xc2\xe4\x89\xd4\xd9\x6d\xc2\x8b\x4b\x89\xfe\xd6\x30\xa4\x19\xb3\x62\x4e\xb6\x5a\xda\x6d\x45\x6f\x7d\x6c\x3e\xc6\x6e\xc9\x1b\xc3\xd3\xf2\xd5\x94\x45\x2c\x58\x94\x06\xbc\xf7\x86\x83\x27\x60\x85\x9e\x4e\x3f\x77\x6d\xb8\x69\x6e\x3a\x7d\x50\x0c\xbc\xf3\x9e\xee\x58\xf2\x6f\xfa\xc5\x66\xc4\x48\x55\x73\xa0\xe7\x56\x94\xa4\xde\x8e\x9c\xee\x3c\xf6\xb8\x81\x3a\x9f\xa0\x7b\x29\x61\xbb\xef\xc3\x81\x78\x69\x66\x5d\x9a\x21\xf8\xb7\x09\x43\xec\xe6\xe1\xc1\x0b\x3f\x98\x66\xa3\x4e\x23\xca\x7c\xcc\xbe\x0a\x72\xdf\x96\xf3\x5b\xbd\x10\x75\x6e\xb3\xbd\x52\x2d\xfd\x47\x5b\x1f\x3c\x52\x9e\x3c\xf3\xcb\x91\x2a\x09\x84\x99\x46\x9d\xd2\x50\xc6\x11\xf7\x9a\x05\x95\xe1\x90\x37\x8f\x90\x1b\x5b\xf3\x44\xcb\x21\xf0\x4a\xa0\x51\xba\x50\x73\x81\xb5\xfe\xbe\xbc\x8d\x09\x96\xd9\xfa\x85\xfe\xaf\x50\xa8\xcd\x63\x18\x78\xab\x80\xe6\x82\x0a\xc6\x0e\x4c\xe3\x43\xd3\x70\xa1\x6f\x7f\xef\xb3\x7f\x86\x88\x74\x9e\x50\xc1\x9b\x78\xbf\xc1\x2d\x88\x05\x7c\x5a\x7a\x0e\x8a\x28\x62\xbd\x0a\x00\x88\x58\x80\xdd\x21\xbe\xc0\x3c\xb5\x45\xb1\xf3\xb0\x62\x29\xa6\x79\xbf\x3a\x26\xe1\x3c\x7e\x63\xde\xdb\x8c\xf5\xbe\x1a\x76\xbf\xeb\x10\x50\x06\x4b\x8e\xeb\x59\x85\x6b\x1b\xcc\xe1\xf7\x18\x7e\x2e\x7f\xef\x9f\xd0\x3a\x0d\xe6\x18\xae\xd9\x2c\x3f\x04\x8e\xcf\x0d\x3a\x02\x42\x32\xe8\x3a\xca\xb7\xac\xd3\x14\x70\x58\x07\xe9\x76\x8a\x33\xf6\x2b\x82\xb5\x63\x6d\x89\xd1\x0e\xe4\xa1\x1f\xc6\x7b\x70\x69\x3d\x6a\x03\x82\xe6\x14\xe0\xc2\x90\x84\x66\x17\x14\x3b\x29\x3c\x31\x37\x04\x59\x92\xf5\x28\x1a\x66\xc6\x49\xa8\xc8\xbd\x0c\xc2\x9a\xd9\x06\xf6\xd9\xa5\x00\x7c\x95\x08\x84\xf8\x87\xd5\x30\x97\x48\x2b\xba\x2f\xd5\x40\xa4\x7b\x04\x9f\x7b\x83\x55\x91\x26\xfd\x7d\x23\x5b\xbc\xe0\xb0\x62\x9a\x12\xe5\x09\x66\x13\xd0\xd0\x97\x3d\x4e\x3f\x34\x8b\xf0\x5e\xf5\x8c\x48\x98\xc4\x5d\x04\x06\x92\xe7\xf8\x59\xd2\xa5\x05\xf1\x12\xc8\x1f\xf8\x6d\x00\x6c\x9a\x00\x05\x97\xf3\x39\x51\x9c\x2a\x73\x64\xbc\xac\x17\xd4\xb3\x78\xcf\x90\x38\xfb\x3d\xc7\x9a\x59\xdf\xc0\x51\x01\x65\x0d\xf4\x72\x0f\xd3\x04\x78\x97\xef\x57\xeb\xf2\x98\x43\x58\x60\x9e\x98\xe3\x62\xf9\x49\x09\xa3\xef\x68\x7c\x2a\x11\xa6\x87\x40\xcd\xb3\xfe\x43\xf5\x91\xd1\xbb\x7c\x1f\x5f\xc3\xf6\x26\x7f\x4b\x7f\x1d\xd1\xf1\xbd\xbd\x39\x57\x46\xb5\x1d\x68\x08\xf0\x06\x18\x04\x33\x17\x9e\xc3\x3e\x81\x1c\xfc\xcf\x04\x5c\xd6\xb7\x32\xcd\x12\xd4\xdc\x17\x9c\xe9\x0c\xfd\x8e\xca\x60\x18\x74\xe3\x35\x0f\xad\x32\xd7\xaf\xcf\x65\xec\x0f\x93\x2f\x69\x89\x7b\x88\x7d\x7f\x7b\xde\xd4\x80\x33\xf6\xb2\xf0\x37\x95\x31\x2e\x9b\x2c\x9f\x64\x94\xf2\x20\x64\x02\x6c\xfb\x68\x56\x01\x75\xa7\xda\xd8\xfc\x4f\x7f\x4a\x03\x6f\x30\x34\x7d\x7a\x8a\xae\xf3\xc0\xce\x37\xb1\xb6\x38\x5d\xed\xaf\x55\x96\x5f\x52\x9d\xeb\x72\x68\x88\x06\x94\x14\x67\x9a\xe7\xd5\x46\x9e\x14\x98\x94\x03\x08\xc4\x74\x2b\x03\xb7\xde\xa4\xc2\xec\x81\x5e\xd9\x02\x3c\xc3\xa6\xe0\x93\xd6\x82\xc1\xa9\x27\x61\x0c\xf9\xbd\xf0\x26\x49\xf8\xf5\xab\xd2\xb4\x48\x30\xd8\x5c\x27\xcf\xc8\xf1\x64\x03\x84\x61\xd2\xf5\x34\xf9\x59\x1e\x35\x07\xb0\x02\x59\xdb\x2f\x00\x93\x4f\x8a\xca\xd6\x8b\x0b\x11\xd4\x0a\xab\x55\x94\x49\xd3\x60\xf3\x7b\x85\x10\x09\xd3\x8f\x24\x53\x29\xf2\x71\x17\x64\xee\x01\xbe\x03\x50\x83\x9f\x87\xf2\xf8\xd6\x4c\x06\x9c\x30\x8e\x6f\x9b\x13\x6e\x84\xfd\x92\x3d\x9b\xb3\x9f\x10\xb0\x31\x78\x06\xec\x33\x73\xef\x39\x65\x13\xc9\x7c\x59\x51\x36\xc2\x67\x90\x03\x81\x39\xa1\x8a\xe9\x8e\xdd\xfa\x56\x43\x97\xa2\x39\x30\x66\x1d\x4f\xc2\x6d\x5f\x6c\x1b\x22\x01\xda\xff\x22\xf6\xa9\xfb\x28\xc4\xcc\xe6\x7b\xa7\xbe\xe1\x0c\x8c\x1e\x03\xfd\xce\x3c\x87\xdf\xfc\x0b\x7e\x99\x3f\x8b\xb0\x46\x26\x48\x8a\xd6\xfb\xbe\xae\xe7\x5b\x31\x3c\x69\x6a\x7f\x0e\x15\x9d\xae\x21\xe2\xc4\x49\x6e\xc8\x2a\x97\x10\x03\x61\xfd\x27\xff\x18\x24\x6b\xfb\x11\x91\xea\x6f\xd3\x47\xf9\x24\x67\xb1\xac\x8d\x89\xbc\x71\xd9\x12\xcf\x42\x8f\x65\x0a\xc0\x79\xf0\xe6\x79\x64\x1b\x73\xd7\x78\x00\xb2\x39\x92\xf0\x6d\xa9\x17\x19\x17\x9b\xfe\x7e\x53\x09\xd3\x8d\xa9\x67\x6c\x89\x7f\x0b\x26\x86\x4f\x17\xcd\x41\x59\x7a\x86\x78\x60\x42\x08\x49\xa2\x07\xe0\x3f\x49\x42\x03\x52\xe0\xb4\x77\xc2\xe5\x78\xb8\xe7\xa7\xb8\xc6\xac\x44\x8b\x91\xcf\xd8\xc9\x01\xf6\x8e\xd8\x75\x98\xa6\xa6\x3f\x1d\xf2\x8b\xe4\xbe\x62\x7b\x11\xd0\x53\xe8\x75\x31\x69\x4e\x4c\xbc\x3d\xb2\x2b\x9c\x64\xe7\x62\xc4\x55\xa4\x27\x1e\xfe\x66\x69\x98\xde\x2c\x7c\x42\xb1\xa2\x8c\x4f\x66\x55\xd3\xff\x91\x74\x5e\xcb\x8e\xe2\x40\x18\x7e\x20\x2e\xc8\xe9\xd2\x04\x93\x33\x36\xe1\x8e\x8c\xc1\x24\x93\x79\xfa\x11\x67\x6a\xcb\x3b\x35\xb5\x67\x7d\x08\xdd\x7f\xff\x9f\xd4\x92\x22\xd1\xd2\xd6\x0f\xb1\xb8\xf2\x38\x39\xaf\x33\x22\xb8\xa7\xeb\x75\xd8\xeb\xa7\x12\x9d\x66\xa8\x9d\xb7\x45\x82\x40\x30\x80\x61\x7f\xef\x0f\x14\x3e\x55\x9a\x2d\x52\x79\x9e\xd3\x40\x09\x42\xd6\xec\x71\x0b\xb6\x62\xd4\x0d\xdd\x15\x01\xa2\xa2\xbc\x31\x62\x20\xb5\xe0\x83\x96\xde\xfa\x5e\x99\xa4\x26\x1c\x83\xfc\x1a\x71\xa3\x24\xbd\xdd\x5a\x1f\xb6\x47\xe8\xc7\xb2\xf5\x9c\x37\xa6\xbf\xda\xf3\xbf\x1e\x39\x19\x38\x4d\xa0\x23\x4f\x77\x03\x09\x31\xf4\x6b\x41\x1f\x70\x29\xd2\x28\x69\x6d\xe7\x40\xbf\x7b\x5b\xe3\x65\xe5\xa2\x01\x93\x5c\x64\x23\x4e\xf3\x9b\x7c\x0e\x13\x9a\xac\xeb\x6a\x07\x18\x41\xb2\xb9\x73\x5d\x99\xdc\x94\x3e\xf1\xdb\x03\x48\x98\x6d\x8e\xb6\x95\x1d\x86\x61\xb5\xeb\x7b\x88\x9e\xa8\xf9\x77\xbe\x4c\xff\x8d\xe6\x38\x28\x68\x10\xd2\xff\x3a\xcd\xb6\xf0\x8b\xb8\xbd\x36\xe0\x21\x5a\x27\xff\xc6\x0b\x0f\x51\x29\x5b\x4e\x89\x9c\x54\xb4\x8a\x7b\x5c\xe7\xce\x63\xf0\xd3\x97\xd9\xc9\xab\xb8\x29\x2b\xf8\x2a\xb4\xbf\x18\x23\x49\xe4\x9c\xbf\x6e\x7f\x47\xd3\x34\x21\x2f\x85\xe8\x9d\x6b\x79\xd9\x25\x3d\x44\x30\x8c\x1f\x17\x7c\xd8\x2a\xfb\xd6\xf1\x4b\xfb\x6a\x6d\x04\xa7\xa6\x1c\xaf\xd3\xeb\x6b\xc1\xc2\x3d\x16\x1a\xc4\xe9\x33\xb0\xbd\xfe\x35\x7d\xa5\xe6\xa0\xf2\x70\x9b\x41\x4c\x2b\xed\x57\xb0\x78\xda\xf4\x01\x91\xe2\xb6\x8f\xd3\x14\x16\x11\xf9\x6b\x59\x0f\xe7\x01\x93\x27\x9b\xbd\xe0\x55\xa8\x36\xba\x53\x72\xb6\x38\x1a\x18\xcd\x91\xa4\xa4\x32\x7c\x0b\x61\xac\xdc\x7e\x96\xf5\x39\x7f\x33\x5c\x4e\x85\x4c\x57\x24\xe7\xb5\xef\xa7\x2b\xbe\x39\x81\x3f\x66\xce\x17\x1f\x5a\xb8\x85\x41\x6f\x01\x81\x5b\xe9\x6f\xaa\x8e\x47\x41\x3f\x0e\xf1\xf1\x72\x39\x8e\x73\xaa\x27\xd7\x55\xe2\xdf\x06\x59\xcd\xc5\x06\xa1\x5b\xd6\x97\x71\xb2\x06\x54\xb2\x9b\x9d\xc6\xa1\x1b\x01\x50\xa6\xfb\xfe\xf7\x3d\xe8\xad\x2b\x10\xd6\xdb\x66\x04\x14\x65\x19\xe1\xd0\x85\x8f\xdf\x4c\xc1\xc0\x65\xd3\xc4\xe7\xf9\x68\xaf\x0a\x91\x06\x5c\x20\x82\x7a\x4a\xc6\x2a\x92\xe8\x60\x9f\x53\xf0\xea\x1a\xe7\x34\xfa\x0b\x20\x11\xee\x5c\x10\xfb\x8c\x56\x6d\x21\xf7\x73\x10\x92\x76\x10\xc3\xf5\x83\x85\x6f\x33\x90\x31\xb7\xdf\xd6\x8d\xf2\x76\xd7\x79\x1f\x14\x78\x88\xe5\x70\xd5\xf3\x50\x68\x3c\x9c\x9f\x6f\x25\x3e\x01\x1d\x57\x02\xf9\x99\x16\x3b\x1b\x80\x88\xf8\xde\xd7\x9b\x69\x0b\xdf\x3e\x90\x2d\xf7\x17\x89\xcb\xa7\x7d\x3e\x21\xd2\xb0\xc0\x0b\x12\x69\xfa\x7b\x41\x74\x1a\x4e\xa6\x84\xa7\x2c\xca\x6b\x34\xbd\xc3\x1b\x78\xb0\x6f\xab\x47\x57\x56\xf3\x56\x9c\x29\x9e\x63\xd2\xfd\xa0\x0d\xa7\x2c\x39\x90\x29\x45\x91\x19\x3f\x07\xe0\x9c\x6a\xb3\xe6\xbd\xe8\xee\x67\x40\x0f\xc7\x31\xde\x4f\xce\x79\x70\x89\xf1\x19\xae\x07\x73\x2a\xdc\x43\x79\x7e\xae\x62\x0b\x3a\xc1\x5d\x0f\x23\x3e\x5a\x4b\x96\x19\x08\xe8\xf8\x0b\x0a\x26\x77\xe2\x52\x50\x3d\xb5\x73\x1e\x09\x4a\x87\xb8\x13\x0a\x31\x7a\x31\x65\xaa\x66\x05\xe7\x25\x72\xf9\xac\x89\x97\x25\x24\xd3\x51\x08\x7b\x02\xec\x3a\x9b\xbe\x90\x5e\x45\x72\xc3\x6d\x6a\xa6\x4a\x6d\x8e\xdc\xc8\xcd\x89\xef\xc6\x0b\x40\x2d\xc4\x54\x30\x31\x42\x47\xe3\x53\x2d\x61\xeb\x61\x13\x43\x54\x61\xc9\x91\xe3\xef\xc3\xbf\xc3\xbb\x85\x2d\xad\x53\x2b\xbc\x69\x8f\x0f\x9a\x09\x20\xc8\x49\x4d\x79\xe0\x1b\x7e\x91\x33\x9b\x40\xd4\x6c\xc3\xe9\x8a\xf7\x21\x49\xcc\x81\xb1\x40\x7d\xd4\xbe\x58\xc3\xe0\x2a\xe3\x19\xbc\xbf\xf7\x2c\x8b\x71\xd9\xfe\xf7\x83\xcd\x40\x94\xe7\xe6\xb1\x9b\xa8\x19\xbe\x03\x7e\xef\x1c\xf7\xd1\x37\x24\x14\x19\x61\x98\x7c\x2f\xfa\xf9\x3d\x20\x61\x2b\xdc\xce\x40\xc2\x8d\x87\x1a\xf9\xd7\xb8\x85\xc1\xf7\xcd\x46\x41\xa9\x4c\x6c\x23\xc0\x63\x50\x22\xd1\xde\x7e\xd5\xdd\xfb\xeb\xfb\x9a\xfc\xb3\x82\xf4\x39\x63\x49\x64\x4a\x50\xb0\x90\x5a\xe8\x06\xe6\x12\x75\xe4\xd2\xf0\x65\x0f\x03\x56\xcc\xb7\x30\x45\xbb\x5f\x07\x00\x50\xd0\x9b\x80\x25\x3a\x98\xc4\xce\x44\x7f\x86\xc8\x82\x6a\xf1\x5e\x6e\x78\x78\x91\x83\xff\xc8\xc2\x8e\x5c\xc3\xda\x11\x0b\xe7\x67\xe4\x92\x73\xbd\x5f\xad\xad\x76\x97\xdd\x8e\x9a\xd7\xe3\x34\xeb\x18\xaf\x52\xb5\x12\x68\xd3\xbf\x1e\xb1\x3b\xd4\x5b\x8d\x03\xff\xdb\x60\x9b\x73\x19\xe9\x73\xa8\x3d\x97\x6c\x37\xae\x75\x56\x9e\x68\x0e\x06\x3e\xe7\x1e\xba\xf7\xe0\xbb\x50\xb1\x61\xd2\x1a\xae\xe0\x59\x11\xd0\xf7\xfb\xd5\x7b\x3a\x08\x7a\x7c\xa7\xf4\x86\x3e\x0c\x1f\xef\x4c\x76\xb2\x1b\xf5\xc1\x24\xf6\xce\x58\xf2\xc9\xbd\x19\xbb\x87\xad\x9f\xf9\x55\x75\x94\x72\xa0\x97\x05\x95\x46\x16\x2d\x6f\xff\xc0\xb8\x77\xf0\x2a\xfa\x52\x45\x57\xa8\x12\x6b\x63\xa4\x18\xfa\xd8\x9e\xd9\xd0\x83\x6c\x8d\x58\x7d\x33\xe1\xde\x3c\xdb\x0b\x84\x8f\x57\x60\x0a\x91\xb4\x63\x55\xe0\xf2\x46\xe6\xd0\x78\x91\xba\xdd\x93\x4c\xa7\x2a\x5e\x69\xfd\xbe\x18\x9a\x8c\xe3\xeb\x4c\xb6\xf0\x27\x33\x89\xd8\x28\xbf\x78\xc6\xe7\x46\xb9\xe6\xfc\xf3\x41\xee\xc3\xcf\xf9\xd7\xd7\x0d\xd0\x45\x77\xcd\x46\x01\xaf\xee\x44\xa3\x25\xcd\x2e\xc3\xb7\xc1\x0b\x7d\x83\xc8\x29\x56\xf8\xaf\x47\xe7\x8d\x53\x28\xa9\x2e\x01\x9d\x43\x8b\x3f\x34\x0d\x49\x05\xce\x5e\x52\xc2\xc3\xe5\x44\xb1\xb4\x66\xdf\x80\xcd\x36\x76\x34\x5e\xf1\xc2\xc6\x6e\x49\x92\x7b\xd6\x4a\x09\x9b\xfd\xf7\xf4\x5e\xad\xea\x76\xac\xc0\xd8\x21\xee\x1e\x36\xb4\x7d\x94\x56\x0d\x3b\x9b\x89\x26\xf3\xf3\x12\x7f\xe5\xdc\xe4\x2b\x5e\x0a\x4e\x6b\xc1\xb0\x60\xf9\xc3\x36\x3b\xe5\xfa\x43\xee\xf9\x9b\x5a\x54\x6a\xd5\xa7\x96\xcf\x30\x69\xe3\x98\x04\xf3\xbd\xeb\xd0\x78\xaf\x9a\xd3\xbc\x61\x52\x00\xdf\x2d\xb5\xf1\x6e\x0d\x75\xb0\x9f\xb1\x29\x8f\xb9\xf6\x74\x34\xce\x51\xa1\xf0\x80\xc2\x00\xc9\x9b\xbf\xf3\x38\xea\xf7\xfb\x1d\x7e\xe3\x20\x00\x9f\x37\xb0\x1e\xe1\x97\x2c\x42\x62\xba\x5b\xe9\x14\xa6\xb4\xb3\x9f\x7a\x3a\xe2\xeb\x6b\x1f\xed\xb5\x4d\x06\xc3\xed\x5c\x71\x50\x76\x33\x1c\x33\x9e\x0e\xe8\x31\x74\x88\x66\x34\x76\x7f\x7d\x59\xb7\x8d\x25\x6e\x6b\x61\x6d\xb4\x55\xd4\x4c\xc1\x93\x13\x5e\xef\xa7\x79\xcf\x13\xfa\xef\x77\x1c\xc4\x3f\x39\xd2\xb9\xf4\xe7\xa1\x90\xb2\xfe\xa0\xf1\x97\x7c\x06\x8d\x87\xb6\x89\xaf\x36\x1d\xa6\x99\x35\xe5\xab\xca\x38\x84\xa7\x49\xb1\xc5\x95\xad\x8a\x2c\x5c\xe8\x07\x59\x82\xb9\x7e\x6a\x08\x90\x3f\x18\xd6\xbf\x27\xdd\x57\x23\x61\x6b\x11\x56\x6c\x1b\x2d\x7a\xb1\xa9\x30\x9d\x04\x6e\x1d\x61\xdd\xe1\x54\xf8\x07\x0c\x7c\x9f\xf6\x6e\x13\x53\x7e\xa5\xbe\x73\x66\xb4\x95\x6e\xbc\xa3\x04\xee\x6f\x8f\xf6\x8a\xe8\xec\x85\x6a\x5e\x6a\x73\x40\x3e\x8c\x5b\xc1\x9b\x7d\x02\x41\x54\xac\x43\xeb\x12\xe9\x73\x5f\x52\xa5\x25\xdc\x00\x74\x6b\xd0\x3e\xcb\xce\x55\x74\x9d\xe9\x63\xa9\x46\x8d\x78\xcf\xb5\x0a\x9e\xfb\x10\x43\xe6\x11\xf2\xaf\x17\x5f\x25\x7c\xb7\x4c\x49\x96\xa3\xd3\x13\x63\xea\xba\x92\xca\xa6\x73\xbf\x24\xcb\xd1\x98\xf1\xf8\xfe\xb6\x81\x27\x5a\xf8\x23\xf8\xca\xfb\xa1\x18\x35\xc3\x9e\xf4\x55\x1e\xb6\x72\xef\x77\x30\x47\x9d\x7a\x77\xaa\xcd\xa9\x74\x0c\xb1\x74\xb4\xa9\x78\x78\x39\x21\xb6\x3b\x92\x34\x59\xfc\x31\xd2\x36\xd3\x87\x52\x27\x42\x85\xe4\xbf\xfb\x53\x18\x4a\xb6\xc7\xa1\xe9\xa7\x1d\x33\xbd\x5e\xf1\x27\x63\xfc\x0d\xc7\xda\x15\x64\x3e\x89\xbe\x84\xbf\x33\xc9\x44\xd1\x59\xc2\x2b\x69\x5b\x2b\x73\x70\x36\x98\x71\xe6\x30\xe3\x70\xef\xb6\xa7\x39\x1e\x0e\xd6\x51\xd8\x32\x50\xd6\xbd\x3d\xd7\x1d\x32\xe0\x73\xce\x3f\x43\xaf\x67\x9d\x95\x2c\x14\x7e\x3c\xf7\x4a\x84\xf5\x89\xea\xfe\xde\xcc\xef\x64\x36\x4d\x63\x36\xfd\x44\x80\x6b\xf2\x89\xe0\xf9\xe6\x3a\xf1\xbb\x55\x8c\x91\x3f\xe0\xc8\xda\xb0\x34\xc3\x06\xf3\x07\x48\x6c\x73\x4a\xc4\x66\x8d\xd4\x3a\xaf\x11\x81\xbf\xb8\x52\x38\x84\xc5\x0b\xd0\x0e\x57\x13\xe3\x95\x19\x04\x14\xaf\x20\xd8\xa2\x71\x7f\xe8\x70\x7a\x50\xf9\xcc\x2d\x3c\x2a\x04\x67\x6e\x08\x07\x80\xe9\x57\x39\x8d\x2b\xbb\xcc\x26\x02\x6a\x20\x1e\x46\x13\x61\xa6\xa0\xbf\xee\xb9\x17\xf0\xe9\x32\xa1\x36\x5b\xf7\xa5\x70\x46\xf8\x3c\xee\x46\xa6\xe8\xf5\xe4\xee\x30\x75\x41\x4c\x18\x97\x75\xcd\xb4\x76\x19\x97\x7e\x32\x16\x63\x95\x9a\xdd\x1d\xe1\xe4\x43\x29\xa3\x0e\xa5\x37\xb6\x48\xba\x5b\xc1\xef\x4d\xb1\x59\x5f\xca\xc0\x57\x37\xa5\xce\x85\x45\x8c\xbd\xcd\xee\x02\x20\x41\x3a\xdf\x4b\x04\x2f\xe1\x8e\xfe\x35\xed\xc8\x2e\xed\xe2\xe9\x6e\x0a\x1b\xa9\xe2\x9e\xc4\x1d\x70\xe7\xce\x2a\xa8\x6c\x8e\x08\x8d\xbb\xf8\x2f\x4b\xee\x3f\xc7\xa4\xd8\x00\x73\x41\x5e\xfc\x7b\x0a\xf7\x3c\xfb\xeb\x13\x9b\xe0\x17\xe1\x0d\x6d\xed\x33\x03\xcb\x12\x19\xea\xe1\x0f\xf0\x69\x91\xe9\xe2\xdd\x5e\x0c\xdb\xd1\xa8\x7d\xa6\x35\x48\x8b\xe0\x84\x02\x8f\x3c\x4d\xb3\xbf\xda\x46\xf5\x42\x12\xcd\x96\xb0\x90\x1d\xa5\xea\xea\x5f\x0c\x97\x29\x4d\xb3\x3e\x0b\xdb\x76\xdf\xcc\xbd\xed\x21\x8b\xea\xbd\x9e\xc2\xf9\xfa\x30\x84\xf7\xac\x55\x4a\xff\x9c\x76\xcd\xa1\xa6\xf3\x12\x1e\x87\xe9\xbf\xae\x04\x8b\x41\x48\x69\x55\x8a\x71\x55\xa2\xf1\x37\xa6\x7d\x7f\x09\xd6\xb2\xca\xf6\xc5\x2d\x06\x12\xb3\xb0\x97\x36\x91\xfb\xcc\xcb\xb8\x52\xc6\x1d\x2b\x7b\xf5\x06\x76\x11\x39\x3a\x53\x73\xd5\x45\x7c\x54\xa7\xf1\x33\x2e\xf0\x81\xed\xc1\x7f\xba\xaf\xf7\xfd\x36\x80\xa3\x68\x6c\x1f\x65\xed\x10\x65\x1f\xbb\x21\xe4\x0e\x62\x16\x6f\x60\x43\x35\xdb\xc5\xa4\x3d\xa8\x19\xb4\xce\xd8\x2a\x13\xc6\x0d\xc4\xaa\x46\xca\xc2\x8f\x45\x09\xda\xac\xe9\x93\xe9\x7c\xb3\x43\xb7\x12\xd3\x8e\xac\x30\x7a\x06\x98\x04\x3b\x23\xc5\x24\x02\x6a\x00\xcb\x64\x86\x5b\xd1\x65\xaa\x57\xab\x97\x32\xb1\x90\x30\xc1\xac\x70\x57\xed\x2e\x0a\x42\x00\x7c\x5e\xd8\xbd\x15\x22\x9a\x83\x2c\xb6\x7d\xef\x07\x24\xad\x9d\xb5\xfb\xf8\x4d\x50\xd4\x40\xc5\x5a\xfd\x96\xa4\x59\xf2\x3b\xfe\x50\x72\x87\xec\xc3\x93\xeb\x9d\xc1\xd5\x4b\xdd\x3d\x2b\xa0\xd9\xa3\xc2\x41\xbd\xea\x6b\x0b\x6e\x7a\xfd\x4d\x11\x11\x79\xb0\x4e\xf0\xac\x86\x9e\x5e\xca\xf7\xd3\x43\x72\xfb\x59\xf2\x4e\xab\xbe\x85\xef\xcf\x2b\xa5\x71\x4d\x13\x2c\x9f\x0b\x2c\x8d\x57\x3c\x9d\xde\x51\xf9\x05\xc9\xc0\x1f\xe9\xbc\xf9\x1a\x99\x6d\x6d\xe1\x68\x38\xe0\xd6\x74\x99\xb0\x7c\x89\x30\x14\x7c\x80\xa4\x4b\xae\xa5\xa7\x7c\x24\x70\xc8\x3d\x0e\x92\xcb\x1e\x34\x95\x5b\xc3\xc0\x77\x90\x80\x10\x42\xa1\x7e\x6b\x49\xb3\xdc\x5e\x93\xe9\x07\x6f\xad\x03\xef\x21\x7c\x3a\xe1\x73\x37\x2c\xec\xe0\x82\xd1\x20\x29\xc8\x80\xa2\xca\xad\xca\xdf\xd9\x81\x8b\xc8\xb0\xb4\x3a\xf0\x2f\x11\xe9\xae\xd2\xd1\xe0\x6f\x54\x09\xff\x82\xb6\x92\x02\xfe\x0c\xee\x53\xb8\xa0\x9d\xb0\xd2\x7c\x42\x92\xe0\x0d\xde\x71\xd2\x71\x1f\xed\xf7\xbf\x13\x89\x2c\x60\xc4\xcd\xc3\x2f\x55\xb4\xe3\x05\x1e\x7e\xe8\x11\x48\x61\x87\x67\xf4\xf5\x52\x74\x8c\xfb\x37\xca\xa6\x57\x9c\x1d\xd1\x16\xe4\x2a\xec\xc8\x50\xdc\x5c\x43\x2a\x91\x8b\x19\x5c\xa9\xdd\xf9\xef\xf4\xfa\xda\x6d\xc8\x93\x38\x01\xc5\xe6\x5f\xe3\xa9\x3d\xbe\x52\x21\xa6\x29\x3a\x5e\x10\x2a\xb6\xfc\x10\xcb\xb5\xb5\xe8\x0f\x80\xf5\x41\x87\x17\xeb\x10\x7a\x06\xb2\x92\xa1\x45\x61\xbd\xbf\x74\xfe\xb8\x5a\x5a\xa8\x8a\x4b\xfb\x35\x7c\xf3\xc4\xf3\x93\x55\x6d\x90\xef\xed\xa8\x2e\x14\x9b\x00\xcc\x05\xb5\xf2\x25\x96\xce\x12\x50\xe6\x87\x80\xb7\x55\x24\x46\xfa\xd4\xdc\xfa\x21\xf6\x0e\xe5\x13\x42\x03\x0f\xea\xb3\x3f\x4a\x90\xca\x23\x78\xc1\x2a\xf8\xd8\x23\x5e\x86\x3f\x0a\xfa\x2c\xc1\x2f\xf7\x5d\x34\xf9\x6b\xbc\xba\x2f\xef\xf7\x4b\xd6\x65\xa2\x6c\xcd\xdb\x7c\xd8\xab\x7d\x27\xf0\x76\xac\x63\xd0\xcf\xcc\x7e\xe7\xe7\xb0\xb1\x36\xf9\x23\xdc\x95\x43\xbd\x79\x9a\xbb\x10\x66\x02\x6a\xfb\x50\xf5\x98\x90\x3c\x16\x00\x73\xea\xa7\xdd\x46\x3e\x80\x0e\x52\x1b\x03\xc7\xc5\x91\xbf\x1b\x83\x1d\xde\x45\xc9\x75\xcb\xd9\x21\x68\x26\x8a\x86\x63\x48\x0c\xb4\x2d\x97\x10\xa0\xdf\xb4\x84\x31\xd5\xe3\x7d\xaa\xed\xbe\x6a\x31\xca\x08\x6d\xf6\x7e\xa3\x67\x31\x10\x68\x52\xf3\xe6\xdb\x61\xa1\xd8\xaa\x7c\x4b\xf8\x7d\x65\x8c\x71\x31\x08\xec\xa0\x79\x98\x2f\x61\x69\xb3\x26\xd4\x93\x6b\xd9\x9f\xec\x0a\xe1\xc4\x0a\x2f\xb8\x0e\xc2\x0a\x14\xd8\x3c\x83\x95\xf7\x92\x04\x79\x9f\x60\xdf\x31\x0a\x6a\x50\x0d\xdc\x36\x91\x92\x69\x9c\xbc\x76\xd2\x1a\x05\x84\x17\x65\xb3\x74\x07\x24\x15\x59\xec\x32\x44\xa9\x3d\xb3\xe9\x29\x6b\x47\xa4\x39\x75\x0e\x85\x4d\x98\xcc\xdd\x2a\x31\x6d\x13\xbe\xe0\x8b\x92\x99\xad\xd5\x61\x74\xaf\xd8\x50\xfa\xf9\x7c\x72\xf9\xf9\x8a\x81\x27\x69\xb1\x2b\x7e\xf7\x63\x4d\x6e\x4c\xd6\x1e\x88\x87\xdc\xeb\x55\x2d\x83\x4a\x1b\xdf\x08\xc2\x90\xf4\x83\x2b\x5e\x1d\x4a\x9d\x51\x6e\x4b\xf7\xac\x11\x81\x77\x0c\x12\x39\x22\x07\xc1\xf9\xe6\xe4\x4e\x66\x16\x05\xee\x02\xa9\x1b\x5d\xea\x0d\xcc\x9a\xa1\x3f\x5e\xbf\x19\x4a\xa6\xa4\x1f\xa9\xac\x52\x1a\x2e\x56\x5b\x50\x5c\xac\x0d\xc7\xa7\xbb\x7f\x28\xf0\x08\xaf\xf8\x25\x57\x06\x74\x3b\x0b\xa0\x32\xdc\x54\x94\xd5\x03\x20\x5b\x4c\x01\xff\x90\xbf\x36\x37\x0c\x2e\x35\xaf\x1a\x5a\x4d\xb1\x81\xe5\x62\xe1\x41\x81\xeb\x9d\x48\xdd\x9a\x13\xb1\x71\xc6\x23\x1a\xe7\xd6\x9a\xda\x02\xfd\xe5\xe5\xdd\xf1\x40\x98\x5e\x3b\xb7\xf1\x87\x14\x0a\x3e\x85\x5a\x52\xeb\x20\xa8\xbe\x00\xe3\xda\xf7\xf5\x81\xd2\x16\x70\xfd\x7d\x36\x7b\x6a\x62\xc8\x7d\xd8\xa1\xe4\x6c\xc5\xa7\x32\xb9\x61\xe1\x9f\x42\xcd\x50\x85\x45\x94\x66\x3c\x6f\x0f\x7a\xf1\x5f\xa8\x75\x15\x8b\x37\x9f\xb6\xa8\xad\xdf\xe6\x56\xfd\xa9\xd8\x70\xc7\xd5\x61\x1f\x58\x9e\x7b\x0b\x3a\x80\x82\x3b\xf0\x40\x6d\x73\x18\xb4\x10\xa7\xf6\x86\xb1\x35\x42\xe7\xc5\x2f\x9a\x62\x0b\x94\xa6\x77\x94\x4c\xda\xf3\xfb\xf2\x3e\xfc\x29\x33\x47\xaa\xc6\x7d\x2c\xc7\x8b\x0a\x79\xfd\x67\xb8\xf7\x24\x79\x78\x80\xfe\xde\xb2\x08\xfc\x86\xe1\xc9\x0d\x84\xbd\x75\x22\x21\xcc\xf4\xd5\x16\xdc\x73\x4c\xbd\x9a\x3f\x42\xf2\x31\x57\xb9\xf0\x18\xd4\x74\xe9\x26\xd4\x67\x2f\x9e\xd0\xa8\xb5\x19\xa0\x8d\x02\x7f\x7c\x61\x19\x40\x36\x5e\x7e\x91\x3c\x3c\x85\x8a\x81\x5b\x9e\xf9\x9e\x11\x25\x3b\x54\xc5\x3c\xef\x3d\xf5\x67\x72\x2c\x61\xe3\xdd\xcd\x30\xcc\xc8\x59\xe1\x7c\xfa\x86\xa5\xcd\x0d\x80\xfb\x5d\xaa\x7c\x98\x94\x1d\xe4\xfd\xca\xbd\xc9\x1b\x5e\x9d\xae\xea\xf0\x4b\x74\xd2\x6d\x6d\x52\xd6\xc1\x2e\x97\xcd\x09\xb6\xab\x23\x71\xb6\x27\x45\x13\xa7\xd5\x09\xdc\xbb\xef\xcb\x3f\xb4\xe2\x30\x21\x36\x3b\x61\x48\x6e\xbf\x67\x03\x12\xb4\xcc\x28\x66\x2d\x88\x42\xee\x6b\x08\x6e\xda\x2f\xa8\x49\x3f\xc0\x34\xf0\xf3\x60\x6d\x24\x83\xe0\x6c\x03\x0a\x0f\x38\xc1\xb4\x2f\x9c\x73\x74\x8e\xfe\x62\xb4\x5f\xef\xb4\x3f\x4d\x74\x82\x01\xa7\xc3\x94\x77\x7f\xae\xd5\xf4\x20\xba\x9a\x60\xd7\x34\x8f\x98\xac\x66\xc6\x52\xdb\x6d\xdf\xa2\xd7\x51\xe2\xdb\xe0\x29\xc7\xd8\xfa\xe3\x1e\xbe\x2a\x42\xbb\xb3\x7f\x35\x1c\xa2\x43\xe9\x88\x4f\x6e\x78\x6f\x40\x80\x51\x9a\x95\x85\x19\xb7\x3b\x20\x75\xa3\xda\x5b\x40\x0e\xaa\xbb\x89\x09\x82\x72\x7f\x83\xee\x8e\xc1\xb9\x51\x35\x59\xd2\x8d\xe6\xca\x5c\x16\x93\x85\x47\x56\x02\x35\xfe\x44\xb5\x98\x3f\xdb\x4e\x82\x77\x7b\x1e\x69\x20\x4e\x13\x66\xf5\x7e\x5d\xed\xed\x2a\xa3\x14\x5b\xfa\x25\xc9\x4c\x78\x6a\x39\xe3\x14\x77\xf6\x55\xe0\xa0\xcc\xe4\xa0\x44\x53\x10\xfe\xd6\xce\x29\x00\xde\x93\xcc\x37\xfe\xb3\x48\x85\x82\x48\x1d\x1e\xf4\x42\x57\x28\x17\xfa\xb5\x1b\xd6\x12\x15\x57\x51\xf5\x11\xb0\xef\xa5\x12\x67\x59\x6c\x72\xdb\xd8\x28\xc3\x26\xc7\x9a\xbe\x80\x17\x15\xdc\x8a\x68\xed\x53\x3f\xbf\x50\x3f\x2a\x8e\x58\xb3\x27\x59\xbe\x17\xa8\xf8\x18\x67\xf7\xba\x00\xf6\xe3\xec\x03\x3e\x61\x2f\x4f\x95\x07\xf7\xdd\x0c\x44\x15\x9c\x0e\x48\x04\x4a\xfa\xaf\xd3\xb0\xeb\x43\xbf\x08\x58\x17\x3a\x20\x83\xa3\xff\xce\xc3\xe7\x37\x5e\xc3\xd5\x96\x17\xec\x1e\xf9\x9f\xf1\x67\xeb\xa5\x70\x71\x7d\x6b\xbe\x2c\xa7\xe0\xe5\x9a\x5d\x31\x3f\x88\x2e\x91\xe1\xde\x42\x7c\x72\x48\xbd\x2c\x7f\xe1\x0c\xaf\x94\x1f\x0c\x7c\xaa\x27\x93\x95\x23\x53\xc2\x57\xcb\x0f\x6f\xe1\x41\xc2\xc6\xf3\x51\x3d\xcb\x1b\xbb\x6b\x51\xab\x09\x80\x1b\xbc\x03\x3c\xee\xab\x1a\xc4\x61\x12\x9d\xe9\xe9\xa8\x9c\xa2\xc2\x30\x45\x7b\xbc\xe3\x89\x11\xb8\x5f\x5e\x87\xbe\xd8\xc3\x85\x0b\xa8\x98\x60\x1a\x46\xa0\x7b\x5c\x02\xb5\x46\x18\x66\xcd\x63\xca\xdd\xa9\xf4\x29\xe7\x92\xbe\x34\x3c\x84\x30\x4d\x21\x20\x41\x4f\x40\x46\x92\x72\x94\x74\xb4\x79\x2e\x47\x40\x85\xc0\xc1\xf4\xef\x94\x16\x2e\x89\x2d\xbd\xc2\x32\x49\x68\x9e\x14\x03\x17\x46\x10\xad\xa5\x21\xeb\xef\x1f\x83\x4b\x43\x2f\x00\x75\x84\xe1\xab\x73\x81\x5e\x19\x2a\xd1\xff\x00\xc1\x9f\xe0\xf1\x80\x1a\x4b\x03\xc0\x3d\x9f\x45\x1f\xac\xf8\xa9\x8e\x2c\xd4\xfb\xe5\x2b\xb6\x8e\xd8\x46\x4a\x26\x4f\x81\x59\x90\x77\x84\x86\x3e\x4e\x5d\x85\x0a\x2a\xa5\xd0\x4b\x86\x21\xe7\x4b\xe7\xfb\x9e\xe9\x14\x8f\x7d\xda\x0f\x82\xe8\x1d\x4b\xb1\x10\xec\xaf\x08\xbb\x3d\x10\xfd\x31\x5e\xb8\x24\x0b\xf7\x08\x0d\x33\xfb\x2c\x55\x2e\x88\x26\x0a\x66\xa9\x37\xf7\xb8\x01\x3a\xef\x30\x80\x76\x12\x58\x2b\xd3\x38\x3e\x86\x0e\xb4\x35\x05\xb1\x12\xea\x23\x9a\x60\x4a\x9a\x25\x6d\x25\x3e\x9a\x15\xa7\x17\x9c\xc9\xf4\x27\xe0\xb7\xb5\xd5\xad\x27\xfa\xcd\x76\x20\xe4\x62\x40\xb6\x31\x42\x01\x9c\x68\xa9\xdc\x9c\x71\xf9\x7b\x80\xca\xba\x00\x95\x14\x59\x5c\x60\x00\xfe\xf8\x77\xd5\x28\xd6\x90\xc8\x0e\x65\x17\x81\x37\x36\x7a\x3f\xae\x23\x6d\x7a\x1d\x14\xee\x50\x5b\xb4\xf8\x4f\x3c\xb3\x9b\x93\xb4\xfc\x5a\x85\x16\xa9\xaa\x9c\x49\xfe\x1b\x77\x79\xb9\xa2\x0b\x6e\x24\xff\x32\xc3\x07\xa7\x7a\x7f\x6c\xbe\x58\x3e\xfa\x24\x2c\x37\x6c\x25\x1f\x3b\x8d\x93\xa0\xb0\xaf\x38\x15\xdc\x2e\x8a\x2d\x01\x8d\x7f\x3d\x94\xc1\xef\xd5\x19\x2f\xa0\x9c\x3c\x32\xeb\x40\x60\x7f\x57\x4b\xe6\xc0\x53\x1b\x93\x1d\x92\x27\x32\xea\x04\x64\x6f\x00\x94\x49\x06\x68\xf6\x02\x31\xa7\x01\x88\xeb\xec\xdc\x86\x2c\xb7\x10\x21\x25\x09\x94\x2d\x92\x81\x52\xb3\x23\x57\x7c\xfe\xbd\xd1\xac\x57\x3d\x2e\xf8\xfd\x5c\x91\x98\xb4\x73\x2e\xff\x8c\xc8\x7d\x32\x4a\x49\x63\x34\x20\xda\x03\xd4\x84\xf9\x3b\xbe\x9a\xed\x7b\x58\x1e\xf0\xfc\xa1\x7c\xd6\x4a\xeb\x95\xdd\xd8\x19\xdc\x07\xfc\x84\x53\xd8\x92\xa7\x64\x6c\xb1\x8a\x1d\xce\xbd\x55\xd3\x54\x1f\x4c\x57\x3f\x70\xbd\xc0\x75\x93\x8f\xd7\x86\x7b\xda\x0d\x8c\xc3\x27\xe4\x69\xae\x91\xcc\x23\x46\x41\xab\x12\x45\xeb\x8b\x9f\x7e\x8f\x9e\x22\x21\x6a\x23\xb3\xb2\x6f\xd9\x09\x4d\x3f\x47\xb6\x26\x9d\xa0\xbf\xab\xc0\xd2\xe4\xe3\xf9\x4d\xe3\x44\xa1\x99\x70\x70\xf3\xb8\xc0\x34\xe8\x4a\xc8\xdd\x52\xcf\x02\xa8\x49\xc3\x81\x7b\x20\x94\xc8\x5d\x4a\xe8\x0c\x45\x3b\xfc\x5c\x5c\xcc\x99\xef\x78\xf4\xda\xbf\xba\x15\x9a\x27\x39\xa1\xc5\xea\x09\xa5\x69\xf4\x34\x5f\xdb\xa2\xaf\x62\x02\x62\x0e\x1e\x0f\xdb\x17\xa8\xee\xe2\xa8\x65\xfd\x66\x2c\xe4\x4d\x0a\x01\xf0\x9b\x8e\x7d\xe0\x09\x03\xfe\x1b\xee\x2f\xf8\xfb\x73\xa4\xfe\x90\x4e\x01\xf7\x7a\x7f\x4b\x42\x80\x2a\x26\xb7\x97\x8b\xdf\x2b\x55\x7c\xf1\x0f\xa7\x17\x46\x92\x99\x79\x08\x0e\x74\xf6\x37\x7e\xbd\xa8\x21\xfa\x9e\x81\x4a\x13\x2b\x56\x52\xb5\x9b\x00\x68\xa3\x43\x64\xa6\xec\xc7\x73\xa7\x51\x40\x8f\xdf\xf6\x03\xa4\xd5\x40\xad\xba\x87\x66\xe1\x17\x3c\xf2\x4f\x6f\x1e\x59\x2a\xbb\xc6\x0d\xe5\x61\xdd\x7d\x05\xfc\xa1\xe2\x77\x43\xe1\x09\x74\x6a\xe9\x62\x09\xc8\x4a\x2e\xba\x99\x85\x2b\x3d\x78\xda\x36\x8e\x53\xa3\x86\x2d\x4d\x20\x36\xef\x06\xbc\x4a\x41\x58\x16\x16\xfa\xb6\xf5\x11\x02\x3e\x4b\x0c\x00\x4b\xbc\xc8\xda\x46\x86\x89\x95\xa2\x5a\xe3\xbd\xc9\xc1\xfd\x81\xca\x2f\x39\x24\x72\xcd\xe4\xd2\x81\x54\x44\x44\x2f\x20\x48\x28\x64\x11\x7c\xf2\xf3\x6a\x2f\x83\xb6\xa9\x20\xb0\x38\xe7\xc9\xdd\xe3\x00\x20\xae\xf1\xdd\xb6\x2e\x34\x61\x73\x2c\x35\x67\x4b\xda\x4d\x5a\x80\xae\x30\x61\xd4\x85\x1b\x51\xe9\x85\x72\x2f\xd8\xd4\xb0\x86\x55\x65\x17\x7d\x9b\xbf\x12\x7a\xc0\xdb\x8b\x26\x60\x93\xd8\x0c\x10\x73\x9f\x08\xfb\x10\x33\x21\x3b\x04\x84\x84\x38\x7d\xd5\xb8\x29\x6d\x17\x55\x65\xef\xcf\xcd\x69\x6d\x30\x10\x53\xe7\x5a\x7b\x03\x72\x28\x5c\xa9\xb5\xa7\x59\xef\x0e\x6c\x50\x0a\xd5\x57\x2f\x91\xea\xa9\x7f\xae\x95\x80\x77\xae\x18\x47\x49\x9a\xb1\x9e\xe5\xda\xbe\x7b\xa9\xde\xfb\x1b\x65\x86\x74\x8d\x13\x2b\x55\xec\xe4\x9f\x62\xd6\xee\x0a\x1c\x7d\x45\x7c\xa2\x61\xb8\x45\x9e\x3c\xa3\x4f\xa7\x00\x79\xc4\xee\x72\xf3\x03\x4b\x56\x1b\x57\x82\xf3\xda\x49\xa1\xf1\x44\x09\xc8\x90\xfe\x1d\xf6\x4c\x93\x7e\x50\x30\xfd\xa6\xe7\x62\x67\x68\x6c\x27\x92\x4b\x25\x63\x9f\x94\x10\x91\x5e\x20\xce\xdd\x7e\x25\x80\x1c\x23\x1a\x0f\xe3\x07\xa4\x6f\x4a\xcf\x8b\x8c\xd7\x67\x9a\x4e\xd1\x25\xf8\x35\x9d\xa2\xef\xfd\x83\x1a\xf2\x44\xb8\xf7\x26\x5b\x30\x16\x64\x35\x28\x79\xc0\x6c\x86\x7e\x0d\xdb\x8d\xc2\x10\xc0\x9b\xe5\xa8\x4e\x4a\x4a\x66\xc9\xb5\xa3\x70\xaa\xd5\xf9\x46\x14\xc1\x2d\x8b\xb0\xa5\x27\x15\x74\x65\xab\xec\x09\xc3\xd3\x5f\xaf\xf8\x34\x55\x23\xc3\x27\x36\x8d\x48\x92\xf7\xb3\x0d\xe7\xf3\x72\x64\x76\xbd\x9b\x14\x27\x60\xcf\x7e\xe5\xbe\xa8\x9f\x46\xcd\xc3\x1b\x99\x22\x75\x96\x8d\xba\x32\xee\x25\x50\xcf\xa3\x08\x9f\x80\x4b\x55\x1d\x25\x94\x24\xb2\x7d\xca\x76\x4f\x95\x28\x9f\xfb\xf4\xfc\x1c\x11\x48\x6a\x7f\x1f\x3c\x07\x4f\x16\xe0\xaf\x13\xa8\x4c\x61\x86\x7b\x50\x0d\xb4\xd8\xbd\xd9\xe7\xc9\xdd\xc5\x2a\x37\x2e\xcd\x32\x86\x24\xcc\x26\xbf\xd7\x46\x61\x33\xe5\x3e\x18\x87\xf3\x7e\xe6\x18\x9b\xed\xb9\x33\x3f\xc1\xed\xd5\x43\x22\xad\x7e\xbc\xbb\xa0\xb2\xee\x02\x48\x12\x40\x74\x57\xd4\xc5\xcb\x45\x30\x6e\x45\x02\x93\x30\x2f\xb2\x2f\xa1\x52\xe7\xc9\x47\x01\x48\x9a\x80\xb2\xd5\x57\xee\x31\x9e\x7b\x28\xe3\x65\x54\xab\x73\x5a\x8d\xe4\x9b\x3d\x57\x39\xd2\xad\xcd\xd4\xe2\xab\x2d\x14\x7e\x49\x57\x4f\x59\x2d\xd0\x99\xef\x46\x9e\xd2\x63\x7f\x03\xb0\x2d\x3f\xdf\xd7\xbd\xe6\x2a\x2f\xf4\x28\xcb\x84\xc7\xb3\x9a\x9e\xc0\x00\x14\x10\x66\x63\xba\x70\x8c\xe5\x03\x0a\x4f\x0c\xfd\x04\x63\x6f\x93\x28\xf0\x15\x8f\x1e\x7b\xe1\xe1\x8c\x1a\xdd\x91\x61\x19\x63\xfd\x18\xad\x66\x8c\xfa\x3a\x47\xc3\x8c\xdb\x15\x6f\xcb\xc7\x1a\xea\xe4\x67\xf6\x0b\x35\x01\x97\x17\xe1\x07\x53\x0f\x64\x31\x7a\x9f\x61\x52\x10\x96\xfd\x56\xfc\x57\x46\xdb\xcf\x87\x84\x72\xdb\xa6\xda\x33\x4a\xcf\x57\x74\x2e\x30\x14\x1a\x92\x37\x98\xa0\x22\xae\xf1\x70\x7e\xc6\x71\x77\xcb\x48\x92\x03\x8f\x84\x24\x81\x23\xe6\x50\xdf\x7e\x6f\xdd\x92\x50\x95\xd9\x21\x39\xae\x58\x5a\x66\xc8\x05\xad\x7d\x16\x86\x49\x26\x06\x1c\xb6\xf5\x14\x78\xf2\x03\x56\x1a\xa5\x5c\x3c\x07\x5d\xd4\xc3\x2f\x2b\xa0\x6a\x31\x40\xe2\xef\x30\xaa\xfa\xe1\xc9\x82\xc5\xa7\xaf\x9a\xa7\x48\xef\xf5\x15\x63\xa2\x18\xe8\x9d\xd5\x0f\x9a\x64\x68\x17\xd1\x85\xfe\x22\x59\x1d\x6e\x0c\x51\xf6\xfb\xbf\x73\x41\x00\xe7\xef\x6d\xcf\xfc\xad\xd8\xd3\x62\x76\xeb\x98\x0b\xfc\x0c\x0c\x07\xbf\x6a\x50\xbc\x27\xf0\xe3\x50\x73\xaf\xa7\x08\x1b\x02\xea\xdd\xeb\x89\x19\x69\x70\x98\x3e\xb2\x6b\x92\x00\x28\xbc\xb0\x7a\x9d\x98\x85\xba\xb0\xb1\x7a\x4a\xd4\x07\x6b\xd3\x24\x45\x66\x23\xf0\xe4\xac\x96\xca\x36\x28\x11\x69\xa3\x0e\xd7\x86\xa6\x33\x0e\x95\x0b\x6a\xd6\x3f\xf9\x1a\x91\xdc\xc2\x73\xa8\x8b\x5d\x24\xb2\x19\x8e\x4f\x59\xc2\x31\x7c\x11\xcb\xab\x6b\xb6\x18\xa6\xa6\x67\x10\xd3\x2f\xcb\xea\xcb\x65\x9a\xa0\x4d\xb8\x3e\xb1\xe2\x47\x94\xfa\x79\xec\xad\xba\xb3\x26\xe6\x3d\x6e\xcf\x68\xa5\x76\xbf\x01\xc7\x1c\x8e\x4a\xfa\x7e\x73\x0e\x63\xa7\x07\xe3\xd2\xbf\x81\xe2\x2b\xe7\x29\xff\xed\x9d\x7c\x20\x50\x66\x18\x69\xaa\x5d\xd5\xa0\xd9\xd7\x2b\x89\x55\xfc\x50\x55\xbb\x13\xcf\x6e\x21\x60\x7b\x01\xf5\xe2\xe1\xdf\xbd\xea\x0a\x7f\x54\xc1\x04\x78\xb3\xd9\x0a\x0e\x24\x5b\x56\x6c\x42\x31\x94\xc4\x03\x96\x86\xb9\x62\x06\x53\x51\x85\x89\x28\x69\x46\x34\x67\xff\x9b\xfd\x50\x66\x93\x71\xa9\xf9\xbc\xe5\x11\x60\x9c\x69\xb2\x56\xcc\x23\xf5\xa7\xa7\x5f\xd9\x88\x8d\x6e\x5d\x5b\x6a\xe8\x01\xd3\x75\xc8\xd4\x6b\x10\x0f\xd2\xaf\x62\xff\xbd\xee\x7b\x69\xcd\x9f\x75\x9a\xc3\x3a\x43\x9a\x03\x66\xbb\x0b\xc2\xe5\xce\x0c\x68\x1e\x05\xcf\xc9\x3f\xdb\xb3\x9a\xe0\xe7\x2f\x45\xfc\x55\x15\x54\x72\xf1\xfd\x14\xfd\x25\x20\xc0\x61\xb2\x21\x9c\xc4\x23\xd9\x8a\x7a\xdb\xfc\xf1\x81\x7e\x6c\x0d\x1e\xda\xbd\x5e\xa9\xdc\x66\xea\x6d\xa8\x29\x8e\x97\xf8\x7d\xee\x68\x5f\x20\x28\xf0\x2a\x31\xdc\x53\x4c\x43\xc2\x5b\xdf\x70\x7b\x0b\xd8\xaf\xed\x97\xa4\x95\x1a\x2b\x2c\x17\x0b\xd4\x32\x88\x8b\x96\x00\x19\xbb\x0c\x02\x9e\xe3\xc7\x2d\x69\xba\xcc\x67\xae\x7b\xc8\x57\x8d\xb2\xd0\xd2\xc9\xc9\xb5\x04\x08\x4f\xe6\xd2\xcc\x70\xa1\x57\x53\xf1\xde\x42\x72\x2b\x7a\xd8\xb2\x7b\xff\x72\x57\x84\x29\xa5\x17\x65\x95\xd4\x1b\xed\xae\xe8\x2e\xf5\xd9\x16\x40\xdb\x37\x7e\xbd\xfb\x6f\x32\xf8\xdd\x61\x08\x1a\x9f\xcc\xe9\xf3\xa8\x09\x22\xf7\xd2\x40\x30\xb9\x71\x91\xa4\x46\xbb\x07\x82\x1f\x7a\xfa\x91\xa7\xde\xfe\x74\xa1\x1e\x9e\x4e\xe7\x75\xc7\x75\x73\x21\x66\x0b\x75\x9b\x3f\x5d\xe2\xcc\xad\x41\x22\x4f\x98\x5f\x80\xdc\x4f\xb0\x4f\x22\xa0\xf8\xbc\xc8\xcc\x7c\x54\x45\x5a\x45\xaf\x88\x04\xa1\x62\xd6\x19\xdb\x32\xf2\x0a\xb7\x8c\x6b\x0e\xba\x50\x7d\x5a\xaf\x32\xd6\x9f\xa9\x51\x6c\x02\xa4\x64\x44\x1c\x89\x71\x5d\x99\x22\x32\x78\xb5\x38\x93\x06\x91\x07\xbb\x70\xe8\x8a\x90\xe1\xaa\x2d\x52\xbf\x8e\xb6\x6e\xc4\x20\xfe\xf1\xc9\x22\xd4\xf2\x68\x57\xd3\x97\x17\x1f\x2e\x17\x1f\xb6\x46\x3b\x4d\x53\xbc\xfc\x9f\x07\x43\x89\x6c\x43\xfc\xa7\xb3\x9b\x65\xeb\x27\xd9\x07\x06\xb4\x5a\x1b\x7f\xd6\x5a\x95\x2f\x6d\x18\xbc\xc2\x81\x99\xcf\x73\x1a\x87\x0c\xce\xcf\x22\x85\x23\xbb\x58\xb8\xe2\x67\x98\xe0\xd9\xe4\x42\x35\x78\x09\x1d\x8c\x6f\x9d\xbf\x66\x76\xa5\x4b\x16\xbe\xc7\x51\x12\xe0\xe7\x6a\xe2\x85\x02\x61\x4c\x17\x5f\xda\xe7\xfa\xe7\x33\x99\x75\x01\x3d\xfd\xfa\xe5\x68\x7e\xb2\x05\xf8\x0f\xdc\x74\x3c\x9b\xef\xf4\x78\xfe\xb6\xc7\x05\x7b\x75\xd6\x8f\x10\xbf\xbf\x1e\x8b\xce\xa3\x4d\x2c\xd4\x08\xd5\x0a\x19\x5c\x82\x7a\xf9\xfc\x1d\x5f\xf2\x01\x22\x83\xab\x9b\x4d\x47\x80\x26\xd9\x99\xed\x5f\xed\x2f\xa6\x5f\x7b\x06\x50\xc4\x6c\xdc\x22\x84\xad\x11\x8d\xb6\xc7\xe4\x40\xb7\x7f\x84\x60\xa1\x7e\x50\x42\x35\x03\xc7\xe0\xa5\x9f\xd4\x21\x22\xab\x8e\x51\xf3\xc9\xb5\x6e\x95\x89\x8d\x00\x32\x87\x7b\x02\x0d\x6f\xdf\x9f\x0e\x10\x78\x82\xcf\xad\x65\x35\x76\xed\xcc\xc8\x92\xba\x2d\x90\xb7\x5c\x8e\x31\xf8\xfb\x21\xc8\xcc\xfa\x54\x63\xf2\xfa\x72\x75\x30\x12\xb2\x46\x0e\x4c\xf6\x40\xa1\x58\xac\x95\x3c\x7c\x7f\x93\xcf\x42\x0b\xd9\x2a\xd3\x4d\xf9\x8e\x82\x9f\x96\x6c\xdb\xc5\x24\x9f\x93\x3b\x8f\xa2\xf3\x55\x06\xd4\x52\x2a\x59\xb7\x0e\xd8\x84\xed\x95\x9a\xa4\x8a\xe0\x63\x30\x89\x98\x74\x74\x34\x47\x7b\xba\x0b\xbb\x4b\x05\x2b\xd8\x69\x89\xf8\x0f\xe2\x44\x1b\xdd\xe0\x64\x2a\x4e\x03\x3b\x92\xf9\xfb\x1e\xdc\xdd\x75\xeb\xab\x5d\x43\xa0\x4d\xd0\x05\x32\xe6\x7d\xa8\xab\x83\xda\x85\x71\x44\x05\x01\x3f\x12\x3b\x2a\x69\xd1\x40\x57\x84\x78\x9d\xc0\xb2\xa3\x2d\xf6\x6c\x80\x1e\x61\xc2\x8e\x28\xa1\x0e\x7f\x75\x8f\x50\x6d\x8d\xd7\xdc\xc4\xb0\x28\x36\xe2\x72\xcf\x95\xbd\x7d\xb5\x8f\xe7\x07\x8d\x66\xd9\xa6\x85\x4d\xb0\x28\x07\x17\xcf\x19\x78\x07\x16\xe0\x34\x88\xfa\x6f\xc8\x75\x30\x3f\x4b\x5c\x15\x01\x8e\x40\x4f\xda\xda\x15\x35\xf9\x4c\xd3\xf2\x7b\x1f\x51\xd0\x52\xc5\xa3\xf7\xc9\xbb\xdf\x36\x2f\x1e\xf5\x32\x21\x89\xfe\x6c\x63\xa1\xba\x6b\xd8\xd9\x0a\xef\xa8\xb0\x2a\x24\x68\x56\xb9\x26\xfa\x1d\x81\x43\x99\xb2\xc4\xd7\xa3\x8a\xfb\xf9\x88\x65\x04\x35\x2f\x97\x60\x8b\x5d\xd1\xec\xfe\x47\x68\x7c\xd6\x73\x90\x21\x7f\x7f\x0b\xa8\xa5\xa7\x73\x0a\x6a\x5b\x7d\x1e\xaf\xa7\x1b\xf6\xd7\xc8\xe2\xaa\x50\x2b\xc1\x37\xff\xf2\x39\xdf\xa5\xf9\xea\x0c\x98\x04\xfb\x25\x92\xe7\xb3\xa2\x22\xad\xc3\xb8\x04\x0a\x8c\x68\x24\x3d\xb5\x73\x98\x1e\x15\x7c\x6f\x13\x5c\x7b\xaf\x59\x7d\xb8\xc1\xac\x77\xcf\x3a\xd8\xe1\x8b\x37\x14\xa6\x42\x81\x74\x7f\xed\xbe\xd9\xdd\x1e\xa7\xc0\x7d\xdd\x00\x5d\x59\x05\xce\xfc\x96\x4f\x2e\x09\xad\x88\x14\x22\x96\x4e\x33\x70\xef\xd7\x9c\xee\x5a\xe2\xf7\xda\x69\x63\xf6\xd7\x19\xbe\xa0\x9a\x18\x67\x62\xa4\x16\xb1\x72\x4d\x25\x16\x8f\x67\x06\x8b\x75\xda\xa1\x82\xd1\xbf\x91\xe5\x97\x0a\x7e\xf3\x8d\x95\xe6\x3b\x30\x96\xb0\x4f\x62\xb5\xc9\x18\xa4\x36\x69\xd8\x30\x70\xa7\x3f\x3f\xe7\x0b\x33\x2a\xd1\xe5\x7f\x80\xb6\x1c\x11\xaa\xf2\x6c\xc5\x47\x53\xfb\x6e\x21\x6a\xba\xd9\x2c\xd5\x35\xa5\x4b\xcd\xeb\xcb\x7a\x53\xe2\xb5\x8b\x14\x02\xe5\x7a\x0a\xf5\xc0\x0f\x45\xf9\x25\xee\x31\x41\xe3\x4b\x89\xf3\x02\xc1\xe1\xc5\x6d\xdb\xaf\x29\x6b\xe1\x11\x35\xb7\x77\xaf\x77\x95\x4f\x93\x63\xce\xe4\xad\x53\x93\x00\x5d\x7e\x28\x45\x26\x5b\xa8\x48\x4f\xd2\xf4\x3e\xb3\x2e\xec\x61\xbf\x33\x03\x2f\xc4\x6a\x6f\x07\x07\x66\x89\x1c\xc5\x27\x1e\xef\x69\xcd\x70\x01\x5d\xd0\x5b\x07\xa5\x0b\x66\x0a\x75\x55\xb0\xa6\x95\x06\xb1\x43\x8b\xfe\x71\xa1\x52\xa3\x72\xe4\xfb\x68\x8d\x7a\x82\xca\x10\xa9\xa3\xc9\x72\xc2\xc4\x53\xe0\xd5\x9d\x85\x86\xc6\x7c\x15\xa1\x81\x3b\xf5\xaa\x05\x7d\x30\xc5\x56\x0d\xf7\x38\xff\x7b\xb1\xc3\xeb\x28\x4c\xd7\xe5\x49\x62\xfd\xbd\xa7\x53\x73\xd7\xc7\x94\xc0\x8e\xc1\xe7\x2b\x1d\xdf\x8b\xdc\xf5\xc8\x96\x90\xf8\x23\xd2\x13\xb3\x2c\xfa\x0f\xf1\x85\x6d\x95\xfb\x38\x00\x3a\xc7\x57\x01\x50\x68\xbd\xdf\xf0\x1f\x26\x88\xbf\x8b\x6c\x84\xef\xd2\x21\xaa\x4b\xbd\x18\x1f\xbf\x9c\x04\x09\xf6\xef\x9e\x06\x8e\x4c\x32\xc0\x0e\x05\xa0\xb6\xd7\x07\x03\xf4\x95\xac\x23\x0f\x5b\x37\x80\x6b\xbf\xd8\x80\x99\x87\x0c\x4c\x63\xab\xfc\x00\xfa\x55\x8f\x90\x86\x8c\x05\x03\x2e\x0a\x6b\xa9\xbe\x20\xa0\xfd\x63\x30\x5a\xaf\x0f\xb3\x24\xb6\x05\x60\xb9\x48\x78\x04\x70\xfa\x26\xf6\xc9\x53\xfd\xdc\x39\x8c\x26\x05\x0e\x52\xac\x79\x10\x62\x50\x29\x25\xdd\x38\x00\xc3\xc2\xdc\x5f\xee\x53\x68\x0a\x7c\xea\x1b\xb8\xcd\x99\x2e\x57\x45\x94\x4d\x2e\xec\x71\x10\x5a\x73\x6e\xc9\x12\xfb\x8b\x89\x3c\x78\x29\xc1\x15\x63\x2e\x63\x74\x39\x8b\x2d\x7d\xba\xb3\x64\x04\x20\xf1\x69\x06\x84\x23\x94\x0a\x5b\x0a\x24\x4c\x44\xda\x93\x2c\x00\xee\x2c\x84\xd3\x32\x5d\x66\xf7\xb6\xd4\xf7\x28\x2d\x38\xbb\x49\x66\x79\x71\xf3\xa8\xb0\x67\x32\x54\xf6\x34\x71\x05\xba\xaa\x5c\x07\xbb\xaa\xe7\x1a\xf1\x3c\x78\xce\x5f\xe4\x2d\x13\x47\x45\x19\x88\xc5\x55\x81\xf8\x14\x1c\xc6\x82\xe0\x72\xaa\x67\xa7\xfa\xbc\x41\xca\x16\xdf\xb7\x91\x5f\x9a\xfe\x85\x77\x14\x4a\xb3\x71\xfe\x1e\xfc\x04\x2d\xfa\xcc\x8d\x59\xa6\x19\xe4\xac\x6f\xf8\xe1\xdd\x0c\x5e\x9f\x6d\xe7\xb3\x2b\xe0\x30\x71\xe0\x43\xf7\xf4\x3a\x83\x3e\x02\x4d\xa5\xe0\xeb\xf0\x21\x46\x47\x3c\x87\x68\x77\x1c\xa9\x07\x61\x8c\x85\x05\xdd\xe2\xa5\x1a\xe8\xbc\x71\xab\x50\xe3\x5a\x7e\x6e\x75\xbe\xfa\x75\xd7\x38\xe6\x01\xba\xea\x99\x47\x36\xb2\xf0\x05\x46\x8a\x9a\x31\x57\x25\x88\x8d\x2a\xc8\x19\x4b\xe9\x6b\xd9\x23\x93\x66\xa0\xd7\xa8\x79\x9d\x77\xc5\x39\xf0\xc7\x0e\xf0\x88\x98\x72\x76\x11\x4e\x13\x37\xf7\x75\x80\xd2\xcb\xcd\x3b\xc9\x1c\xf1\xd9\x21\x45\x31\x96\xe8\xee\x5b\x39\x45\xe0\xaf\x5e\x9a\x85\x53\x33\xc8\x0c\x0c\x02\x6f\x74\xcf\x30\xa3\x5f\x28\x00\x58\x0b\x0b\x97\xe8\xae\xd7\x17\x29\x02\xde\x99\x7d\xc9\x51\xae\x5a\xb1\xd4\xfe\x92\x30\x4e\x3f\xef\x1a\x3f\x91\xc5\x1a\x4d\x1c\x67\xe8\x6b\x9f\x2e\x80\xb4\xec\xe7\xe6\xbe\x84\x07\x61\xb3\xf5\x4e\x52\x45\xb8\xe9\x03\x70\x55\x5c\x07\xea\x23\xcd\x2e\x78\x2a\xe5\x0b\x3f\x33\xe4\x63\x44\xf3\x32\xb8\x87\x74\xb9\xa4\x26\x74\xeb\x9c\x16\x79\x50\x4e\x77\xd3\x7e\xa4\xe2\x89\xdc\xb3\x36\x65\x16\x3a\x20\x39\xd2\x9c\xc2\xd3\xee\xb9\x6b\x93\xfa\x6e\xbb\xf4\x8e\x75\x33\x91\x00\xe2\x4a\x42\x9c\xa2\x4f\xfe\x29\x7c\x7d\x2e\x46\x35\xa1\x44\xb9\x51\xea\x34\xb8\xd7\x3e\xf5\x8a\xeb\xbb\x3a\xab\xc6\xcc\xf4\xb6\x75\x18\x49\xf1\x71\x65\x5d\x31\x4a\xcf\x5b\x26\x4d\xd4\x68\xdb\x9b\xc3\xbd\xa3\x2e\x1c\x0a\x3d\xf7\xc3\x73\xb7\x63\x6b\x5c\xab\x21\xc5\x34\xed\x79\x05\xe1\xb2\x75\x26\x2b\x46\x8a\x4c\xb9\x3f\x71\x50\x71\x41\xec\x18\xaa\xce\x93\xf7\x80\xe0\x3d\xb6\x24\xb4\x66\x1e\x4f\x40\xb7\x41\xfc\xe6\x10\xc5\x95\xe5\xfc\x9d\xd1\x84\xb6\xbb\x1d\x2b\x20\xbd\xf5\x02\x59\x6e\xe8\x00\x4d\x90\x25\x29\x89\xc8\x90\xd3\xf1\x60\xa8\x58\x22\x2d\xf2\xbe\xfe\xc9\x0c\xd6\x39\x4d\x00\x8b\xf1\x2b\x49\x6f\x61\x73\x8d\x94\x69\xe1\x4b\xf0\x53\xe7\xc8\x0a\x7e\x2d\x3b\x22\xf4\xac\x6c\x8a\x4f\x09\x3e\x95\xc2\x2c\xbc\x6d\xd3\x12\x2c\xaa\x29\x2a\x39\xe4\xca\xf7\x10\x92\x0e\xc3\x95\xfb\xe2\x1e\x0c\xee\x98\x16\xbc\x8b\x42\x64\x18\xa7\xd6\x28\xde\x83\xea\x47\x5b\xfe\x11\x94\xe5\xa9\x22\xa4\x17\x9f\xd1\xba\x32\xb6\x39\x22\x1a\x08\xc4\xa6\xce\x4b\x62\x35\xd1\xfd\x77\x90\x70\x0b\x93\x0c\xed\xf5\x2b\x22\x1c\xad\xea\x3d\x0a\x9f\x75\xa2\x41\x07\xb0\xd0\xd5\xe7\x49\x37\xe7\x7a\xd7\x67\x88\x69\x67\x4e\x94\xa1\xf3\x5e\x43\xc5\xf0\xe9\x74\x01\x7d\xb4\x5e\xbf\xf7\x55\x91\x27\x52\xd4\x8b\x11\x3d\xf6\x4d\xc0\x81\x60\x5c\x73\xd5\x37\x6b\xe4\xc7\xdd\x87\x89\x79\x2f\xf1\xd7\x00\xb8\xaa\x06\xe0\x2a\xa6\xcf\x9f\x78\x0b\x41\x80\xa6\x66\xb7\xbf\xa8\x33\x3a\x99\xf5\x93\xfa\xb8\x86\x85\xf2\x63\x59\xd2\x5a\xc7\x04\xa6\x0f\xbe\x4c\xdd\x58\x99\xaf\x3f\x11\x64\xa3\xd0\x1c\xa3\x8c\xbe\xf9\x6d\x18\xf5\x09\xb8\x34\xc6\xf4\x0f\x63\xae\xc3\x4f\xe5\xde\xdf\x38\x18\x54\x18\xfe\xc5\x2b\xae\xea\xf0\xf8\x06\xe2\x17\x65\x85\xcd\x45\x44\xaa\xd2\x62\x01\x0d\x58\xf7\x21\x6d\x7f\xf0\x2c\xf9\xca\x2e\xa3\x5c\x45\x2b\x44\x17\xfa\xa0\xa8\x9c\xf5\x60\x4d\x35\x26\x3b\xc6\xc0\x65\x6e\x6f\xc3\x4f\x4a\x3f\x66\xa0\xd8\xc0\x36\x4b\xd6\xf6\x47\x52\x7d\xd6\xed\xbd\xdb\xb2\x40\xb5\x2e\x43\xc6\x54\x55\x73\xf7\x36\x3d\x05\xf3\x6c\x8c\xb1\x13\xea\x51\x60\xa1\x37\xeb\xbe\x72\x69\xd9\x8e\xb5\x8a\x4c\x4d\x7f\x5e\xcd\x63\x54\xba\x17\xb8\xac\x25\xd0\x63\xa3\x7c\x20\xd4\x06\x3d\xae\x7c\xbd\xba\xdf\x7b\xa9\xea\x53\xf5\x9e\x12\xb8\x80\x14\x91\xd9\xdf\x86\xd2\x04\x1b\x78\x5c\x9e\x87\x39\xc2\x3d\xf6\x92\x4f\x86\xe4\x59\xb7\x1d\xa4\xb5\x3e\x26\x7f\x9e\x2b\xbe\xab\x50\x59\x57\x6c\x5c\x5d\xd6\x29\xbe\x40\x0a\xd8\x07\x48\x03\x82\x1c\xfd\x12\x78\x3d\x23\x1c\xf6\x59\xb2\x0f\xcb\x7c\x2e\x96\x21\x93\x08\x43\xa5\xc1\x37\x00\xd8\xb0\x56\x4f\xd4\x66\xe2\x9a\x31\xe3\x19\x23\x96\xdf\x68\xf8\x34\x8e\xd2\x49\xd1\x95\x0c\x94\xe8\x2b\x7c\x1f\x7b\x17\xe9\xfc\xe3\xca\xd6\xce\xa2\xd7\x21\xea\x9c\xcc\xb6\x98\x8d\x7d\x00\xe9\x1b\xaf\x74\x42\x37\x04\xca\xb5\x41\x12\x09\x12\xbc\x2a\x14\x62\x8b\x21\x28\x5e\xe4\x00\xd2\x11\x32\x99\x1d\x56\x2e\xe3\x7c\x31\x72\x12\xfb\x56\x22\x7e\x5c\xc3\x06\x7c\x98\xfd\x9e\xed\x35\xf5\xf5\x17\xff\x1d\xe4\x69\x4a\x3b\x12\xd8\x12\x2c\x15\xdb\x13\xc4\x00\xe5\xdf\xc7\xf2\x7d\x7d\x15\xc2\xd3\x85\x82\xe1\x8c\x56\xdb\xcf\xf0\xe6\x89\x68\xfc\x9e\x78\xcb\xf4\xdb\xc7\xa2\x7f\xca\xfb\xbc\x50\xb9\xc9\x9c\x2d\x30\xac\x63\xd1\x1d\xe6\x29\xfb\xe2\xbe\x28\xfc\xcf\x7b\xd4\x5c\xd9\x93\xb7\xff\x7c\x1c\xfe\x8c\x4f\x06\xad\x16\xa4\x8c\x27\xb2\x4c\xb4\xef\x86\x0f\x7b\x1f\xd3\x8f\x83\xa0\x72\xbb\x67\xbc\xfe\xc2\xb4\xe3\xfb\x21\x4b\xbb\x0f\x29\x53\xba\xa8\xb7\x09\xf9\xb1\xb7\x06\xf0\x45\xa2\x5a\x3f\x7c\xc2\xf0\x62\xe1\x80\x2f\xd3\x50\xbd\xb2\x89\xcc\xb6\xe1\x92\xcc\x21\xd8\xdb\xa7\x10\xe5\xfb\x7e\x77\x40\x14\xfd\xc7\x76\x82\x87\xe7\x9a\xac\xee\x57\xc5\xdc\xdf\xe2\x46\xad\x06\xfd\x5e\x49\x06\xb5\xa3\x16\xc4\xe9\x07\xc4\xa9\x4b\x4d\x94\x98\x35\x0b\x7f\x45\xaf\x1d\x70\x22\xf2\xf9\x88\xb3\x70\xdc\xdb\x23\xb0\x70\xf8\x02\x56\x97\xed\x34\x32\xac\x69\xe5\x22\x83\x1f\xfa\x43\xc5\xd0\x67\x99\x32\x1b\xee\xf9\xfe\x30\x65\x57\x64\xf4\xd5\x82\x3b\xe0\xfd\x5b\xc1\x38\x86\xd0\xcb\x74\x8f\x13\x7c\x51\x0d\x7f\xa3\x79\xc8\x2c\xc1\xf7\x78\x03\xfb\x2b\xbd\xc8\xfc\xca\x8a\xec\xbe\xb6\x76\x33\x65\x60\xbe\x62\xb9\x1a\xc0\xa3\x77\x6b\x7b\xcd\xc7\x8f\x30\x64\x20\xc7\xa3\x52\x45\xa8\x92\xd9\xd2\x03\x4a\xa9\xa0\x37\xb6\x6f\xde\xab\x48\x7f\x73\xd2\xd8\x11\x33\x6e\xf7\x17\x6a\xbe\xdf\x25\xde\x3d\xc9\xaa\xc5\x22\x1c\x80\x2e\xd7\xce\x29\x9e\x44\x3f\x3b\xa6\xae\x78\x6e\xd5\x02\x4d\x35\xe1\x9e\x8d\x99\xf1\x14\x86\x9b\xa3\xbd\xc2\xdf\xbd\x21\x3b\xdc\x12\xed\x35\x4b\xd1\xf3\xf1\xe0\x2b\x22\xb5\xeb\xdd\x5b\x4f\x62\x4c\xde\xdf\xe0\x5a\xe9\x27\xf1\xad\x5c\x1f\x09\x75\xf4\xcc\xac\x1e\xa1\xf2\xda\x9c\x64\x3d\xdf\xf0\x14\xc4\x66\xac\x13\xac\x1a\xbc\xbe\x66\xb2\x86\x2c\xac\xce\xae\x99\xc0\x99\x01\x9c\x15\x9a\xf7\x6f\xa0\x23\x9d\xee\x27\xdd\xb7\xbe\xc7\x1e\xef\x81\x76\x4c\x03\xb1\xf8\xe4\x76\xfb\xca\x70\x56\x8f\x8f\xa7\xe5\xf7\x21\x7d\xec\x8f\x77\x7c\xd5\x5a\xd6\x87\x9f\x87\xe3\x3e\x48\x95\x3b\x30\x65\x4c\xce\x79\x93\x85\x43\x69\x3a\xb4\x9d\xbe\x1c\x65\xb7\x7e\xb1\x11\x26\x2c\x87\xc0\xab\x03\x2b\xb1\x2e\x38\x55\xa8\x4f\x41\x54\xf7\x6b\x4e\x0a\x31\x2c\x74\xae\x46\xf2\xde\x03\xb1\xf8\x1d\xe3\x80\xb2\x53\x18\xe9\x6f\xf4\xb3\x64\xbf\x65\x32\x26\x35\x70\x75\xcf\x98\x00\xf9\xea\x57\x8e\x33\x4c\x62\x96\xf7\x7a\xce\x21\x6a\x84\xe8\x69\x8d\xf8\x42\x16\x08\x94\x18\x75\x87\x35\x89\x27\xde\x7d\x29\x9d\x1f\x37\xd0\xcf\x89\x91\x7b\xba\x7d\x9f\x35\x7e\x9a\x7e\x13\x0d\xb0\xff\x9e\x91\xbe\x97\x73\xcd\xcc\x05\x4f\x2e\x21\x91\x02\x06\xea\xb5\xeb\x10\xe5\x33\x7f\xbd\x3b\xe3\x5b\x2c\x41\x64\xab\xcc\x2b\x69\xee\x1f\x8b\xd8\x62\x7d\x6f\x7a\xce\x90\xf9\xcc\x2b\x21\x6f\xd0\xf2\xa3\xbd\x5a\x3a\x9f\x54\x83\xaf\x55\xcc\xeb\xf2\xf7\xdb\x7d\x13\x76\xfb\xb6\xee\xc1\x73\x5c\xe7\xac\x46\x31\x4b\x53\x78\xa1\x00\xcc\xd2\x0f\xd3\x1f\x3d\x24\x04\x1b\x0c\x77\xe9\x7b\x06\x7a\x91\x3f\x61\x7b\x07\x75\x61\x6d\x8c\x46\x39\x41\x79\x67\x3e\x59\x84\x35\x77\x23\xec\x6c\x41\xfa\xed\x79\x12\x5b\x6a\xc4\xb8\x01\x12\x63\xd1\x38\xa7\x79\xc8\xf0\xe0\x52\x94\xd9\x04\x60\x77\x4d\x21\xe2\x36\x3d\x45\x4d\x90\xb3\xf8\x8b\x61\xa6\x0d\x78\xec\x7b\x83\x0a\xf5\xf9\x53\x97\x21\xed\x9e\x87\x65\x55\x8a\x3a\x67\x69\x33\x74\x23\x55\x48\x95\x42\x27\xcb\x11\x2f\xa3\xe5\xe6\xa0\x46\x01\x8f\x0a\x55\x18\x33\xc2\x03\x78\x34\xa0\x26\x9b\x34\xb5\xb9\xe3\x57\xa4\x2c\x14\xc9\x39\x27\x79\xde\x67\x87\x80\xa2\x07\x8a\xeb\x75\x37\x09\x97\xf0\x85\xab\x04\x55\x94\x00\xdd\xf5\xfa\x5e\x2b\x77\x3c\x7d\xe8\xe8\x1e\xfb\x9d\xcf\xf8\x84\xd2\x26\x71\xa1\xe3\xc4\xb7\xa3\xee\x36\x28\x42\xce\x8b\xa8\x14\xc4\x0a\x17\xba\x57\x81\x0b\x77\x5a\x18\xf3\x2d\x68\xf3\x27\xdc\x5d\xb1\xe7\xeb\x78\x71\x7a\x1c\x25\xce\x45\xb3\x10\xf1\x0e\xb1\xe2\xad\xa3\x18\x16\xd0\xee\x50\xf9\x34\x2c\x8b\xb9\x7c\x50\x20\xe7\x9a\xfc\x13\x34\x19\xcf\xf2\x4d\x24\xdb\x7b\xa1\x5c\xd5\x20\x29\xe8\xc2\x49\xc1\x77\x4c\xc5\xc3\x48\xf9\x04\x70\xae\x79\x0f\x53\xbb\x18\xe3\xba\x26\x31\xe8\xfc\x2e\xbe\x25\xeb\xc2\x3c\xe3\x3e\x08\xe1\x5d\x4f\x56\x3f\xb2\x45\x9f\xa2\x30\xf2\x70\x79\x17\xf0\x27\x73\xbe\xb5\x83\x5d\xbe\x03\x4a\xd1\xf9\xbd\x24\x21\x97\x9f\x14\xe6\x41\x1f\x10\x16\x50\x0c\xc4\x54\x6f\xe9\xcf\xaf\x88\xb3\x0d\x8f\x41\x38\x88\xee\x3a\xe0\x0c\xa7\xe6\x2b\x1e\x11\x85\x0d\xa5\x15\xc1\x0b\x36\x20\x36\xd8\x3e\x88\x58\x2c\xfb\xee\x72\xe7\xe3\x93\xc1\x0c\x41\x30\x50\x59\x2e\xd5\x4f\xc8\xf2\x38\x08\xbf\xbf\x7c\xc5\x92\x60\xf9\x0d\xc7\xbb\x55\xf8\x88\x92\xbe\xbc\x29\x8e\x06\xb9\xc1\xfd\xa3\x22\x32\xeb\xe1\xba\x86\x8f\xb0\x70\x5b\x56\x3c\x01\x4d\xa1\x27\xa2\x80\xec\xfd\xb4\xd8\xef\x71\x77\x8c\xe5\xe0\xd8\x4f\xb8\x8f\x92\xeb\xd2\x3d\xde\x00\x65\xe0\x62\x75\xf2\x15\xc0\x95\xc8\xcd\x8a\x32\x9e\x59\x6b\xcb\xb7\x05\xc4\xa1\xf7\xdd\xd0\x74\x2b\xd3\x8e\x92\xbf\x52\x3e\x18\xe4\x59\x89\xed\xcb\xd2\x9c\x27\x7c\xf7\x29\x7b\x64\x39\x77\x23\xd3\xd8\x92\xa3\x52\x13\xc1\x8a\xb5\x98\xb5\xaa\x17\xa8\x3e\xf0\x72\x33\x64\x63\xa1\xbf\x1e\xa1\x66\x1e\x99\xf0\xc9\xfc\xf7\x8c\xb1\xb8\x8b\x3e\x73\xa6\x03\x6c\xa1\x2d\xdd\x95\xd4\xcf\xa8\x81\x8f\x84\xcb\x80\x47\xc7\xd3\x9a\x6c\xa9\x29\x92\x20\xcd\x97\xcf\xbe\x3f\x80\x6c\xc3\xfd\x51\xdd\xdd\xe3\x9f\x88\xb9\xf7\x56\x93\xb3\x0a\x28\x29\x55\xe0\xe9\x6a\x48\xdd\xfb\x3b\x39\x6f\xfc\x64\x60\x1b\x38\xb6\xd9\xd6\xc4\xcf\xfb\x8c\x01\x6c\x15\xf4\x2a\x34\xf3\xac\x34\xca\xe7\xd1\xda\xbf\x2f\xfb\x61\x32\xd7\x9c\x39\xf8\xdc\x80\xce\x0d\xb4\x80\xed\x38\xe3\x8b\x9c\x88\xae\x96\x06\x74\xc1\xec\x8e\xe4\xc8\xa0\x6f\xfb\x79\x7e\x27\x34\xc9\x43\x15\xa9\xcd\x97\x61\xf7\xbb\xd8\x94\xc8\xb7\x10\x8e\x7b\x63\x33\x7f\x56\x7f\x2c\x6e\x9e\xbb\x50\x91\x1c\xc9\xd9\xd1\x17\x03\x1a\xe2\x5e\x0e\xf2\x85\xbe\x3d\x40\x19\x7d\x81\xb8\xe1\xc7\xef\x99\x09\x15\x76\xa1\xfb\x34\x9b\x80\xb7\x9e\x2c\xc1\xd5\x66\x02\x78\x6b\x09\x57\x19\xc7\x38\xa2\xc9\x9e\x19\x32\xcf\x43\xfe\x1b\x18\xf2\x0f\x0e\xd1\xe0\x8b\xa4\xad\x95\x78\x64\xd5\x07\xf5\xe1\x84\x96\x8f\x70\x1e\xb8\x7f\x1c\xc4\x06\x0a\xc8\xe6\x43\x58\x64\x42\xac\x7a\x63\xf6\x70\x24\xca\x92\x9a\x06\xc0\x63\xd8\xbd\x4f\x98\x65\xfc\x58\x67\xa0\x49\xce\x24\x3a\x2f\xf5\x31\xb5\x57\xff\x8b\x30\xae\x42\x8c\x60\xe4\x29\xa1\x6a\x8a\x2d\xbc\xf7\xbf\x31\xd2\x21\x39\xd5\x50\x7f\xef\x9c\x3c\x9a\xb1\x7c\xef\xd9\x82\x31\x44\x7e\x4f\x0b\x25\xb6\xb6\x21\xf3\x84\xa1\x51\x6c\x4a\x80\x8f\xcd\xef\x50\x17\x8e\xc2\x57\xaf\x4d\x01\x05\x84\xfe\x7e\x3e\xc5\x8f\xfc\xcc\x62\x6d\xbc\x85\x70\xb6\x46\xd6\x1e\xcb\x8d\x84\x12\xfe\x04\xff\x64\xf7\xa4\xca\x23\x01\x5c\x62\x22\xb9\x5e\x1e\x40\xdc\xf2\xb4\x78\xe4\xcc\x6f\xd7\xb9\x2f\x02\xa5\xf7\x59\x05\xc7\x27\x2c\x57\xa4\x0b\xcd\xf5\x17\x46\xfa\x41\xb4\xe4\xc6\x26\xeb\xcf\xc5\xe5\x4b\xc4\x6c\xf6\x43\x94\x95\x65\x1f\x88\xf5\x6b\x13\x88\x28\xe8\x4a\xae\x23\x07\x59\x18\x5e\x47\x6d\x78\x85\xa9\x80\xa0\x73\x70\x23\x28\x43\xe8\x64\x72\x14\x1a\xf0\x29\x1f\xb4\x5c\x1d\x15\x8b\xb9\xf4\xac\xdf\x52\xe3\xa2\xe6\xd0\x6a\xf6\xac\xb8\x8e\x76\x31\xfe\xbd\x78\xd1\x2a\xc9\xcb\x74\x09\x50\x46\xb4\x75\xf9\xf9\x28\x4d\x56\xbb\x14\x3c\x2c\x16\xfb\xa1\xd7\x78\x7d\x5e\x4f\xd7\x79\x81\x18\x4c\x93\x4e\xe2\x86\x9d\x48\x3e\xaf\x7b\xbd\x30\x90\xa7\x7b\x6e\x5a\xfa\x3c\x6b\xfd\x9e\x94\xa0\x96\xde\xc5\xe6\x78\xe3\x5d\x45\xf0\xb0\xca\xa9\xc4\xea\x4f\x4f\x9f\x53\xbe\xc2\xee\x7e\xb8\xa9\xcd\x4b\x8a\xac\xb2\xef\x87\x19\xbe\x50\xfd\x61\xad\x8d\x1c\x2d\xfa\x83\x7b\x4b\xb6\x46\x1d\xbf\x01\xc0\xe4\x0a\x62\x1b\x0a\x5f\xd7\x87\x76\x91\x0c\xed\xe0\xac\x32\xbe\x87\x26\x55\x08\xb6\x69\x6f\x0d\x3d\x81\xdd\x5d\x08\x7c\x2e\x6c\xf9\xee\x33\x51\x1c\x48\xd9\x5d\x4e\x03\xb2\x07\x14\xf5\x2a\x16\xaa\x2c\x31\xf5\x00\x82\xd6\x76\x2e\x5c\xce\xd8\x8a\xdf\x73\xef\x07\x29\x17\xb3\xd4\x36\x7a\x63\x84\x32\xce\xac\xa1\x22\xfc\x46\x60\xbe\xee\xb9\xc5\x88\xcf\x3e\xaf\x6e\x3e\x63\x1c\xcb\x7a\x75\x37\x04\x07\xe1\x38\xc0\x01\x43\x23\x3f\xa4\x56\x15\x0b\xbb\x91\x9b\x03\xae\x7f\x48\x8c\x40\x7f\xd7\xb0\x02\x53\x60\x58\x26\xf1\x2a\xec\x70\xb3\x20\xc9\xe8\xa0\x0f\x47\xee\xfa\xea\xd8\x74\x0d\xdb\xd7\x0b\x7d\x46\xe8\xc2\x5b\xc0\x66\x45\x05\x00\x73\xc4\xa9\x9f\xd0\xc3\x3e\x26\x5d\x91\x15\xfd\x4b\xcd\x8f\x89\x8f\x5e\x7c\x2e\x7b\x6e\x25\xa4\x49\x0b\xfc\xf2\x5b\xb4\x6c\xf0\x3e\x6a\x7f\xc5\xe9\x83\xf7\x0b\x65\x0e\x74\x3f\xde\xf0\x48\x1d\x1f\xef\x0f\x64\x3e\x41\x32\x00\x7f\xde\xd9\x2e\x30\x2a\xc3\xb7\x59\x33\xa2\x7e\x8e\x11\xc6\x7e\x44\xf9\x81\xf8\x14\xa6\x3c\x3f\x1f\x0d\x85\xe5\x86\xbf\xb7\x9a\x3e\x04\x13\x64\xd3\xb3\x2c\xc9\x2e\xee\x0a\xa9\x7e\xba\xec\xdd\x22\x55\x28\xb4\x74\x80\x27\xa2\x7c\x86\x9d\x7f\x4b\xc6\xd9\x39\x06\xb0\xf2\xda\xf0\xf4\x9d\x24\x8d\x2b\x3a\x96\x00\xee\xa8\x67\x76\xcf\x49\x44\xca\xc5\xf6\xf7\xfc\xe1\x28\x54\xa2\x2c\x0e\xf0\x95\xa2\xec\x3d\x13\x4d\xc9\x82\x1f\x94\xed\xf4\x14\x8b\x41\x9b\x7f\xad\x92\x56\xa4\x75\xb4\xa9\x63\xc6\x94\x17\x79\x9f\x94\x17\x37\x45\x12\xeb\x28\xe5\xf9\x66\xc4\x72\xa0\xce\x43\xf5\xfa\x1b\x9f\xfc\x10\x0a\xff\x44\xf9\x65\xd5\xaa\x48\x0f\x10\x51\x9d\x92\xae\x92\xee\xe6\xd1\xf1\xa4\xa4\xe7\x9c\x8b\x87\xe4\x0e\x11\xf1\xbd\x9b\x27\xfd\x1c\xc0\xcd\x54\x0d\x0a\xcf\xf1\x15\xa5\x1f\xf9\x44\xc4\xa1\x71\x31\x81\x87\x80\xff\x61\x62\x57\xa0\x89\x5e\xaa\x1b\x10\xd1\xd8\x0f\x42\x06\x96\x18\x33\xdb\xe8\xb7\xb5\xf9\x04\x95\xf7\xee\x65\x89\xee\xe0\xe9\x30\x4b\x12\x60\x96\xeb\x58\x95\x21\x0d\x71\x06\xde\xb8\x43\xeb\x2b\x96\x2c\x52\x6e\xfb\xa6\x23\x4a\x23\xf4\xd8\x31\xaf\x1a\x78\x0f\x5e\xaf\x3e\x00\x13\x1b\xd1\xb0\x67\x52\x25\x88\xfc\x3e\x47\xe1\x11\x67\xb9\x25\x7d\x9c\x8b\xfd\x1c\x09\xcf\xbc\x66\xa8\xb4\xa8\x9c\x3f\x14\x78\xa8\xa2\x0c\xb0\xbe\x04\xe7\x9b\x0a\x9e\x73\xd4\x4b\xf0\xb8\xa7\x28\x05\xc1\x17\x33\xf1\x68\xe9\x5f\x02\xc2\x01\xff\xe0\x15\xaf\x77\x1c\x70\x5f\x5f\x2f\x6c\xf0\x5e\xc1\x7d\x8f\xe0\x96\x5f\x16\xea\x2d\xa9\x87\x90\xb6\xe0\x2e\xf7\x52\xdd\x95\xe7\x1e\x98\x4e\x55\xdd\x95\x6f\x2d\xaa\x7b\xfb\xda\xbc\xc5\x73\x98\xb4\x1a\xf8\x8a\xf8\xed\x20\xa6\x20\x5b\x40\x98\xbe\xac\xea\xbd\x48\xa9\x85\x02\x67\xc3\xd7\xe9\x52\x61\xbb\x5d\x72\xe8\x05\x43\x6a\x6e\xeb\x0d\x0b\xe9\xdb\xa7\x30\xe8\x24\x88\x3b\xb3\xdb\xac\x54\x38\x07\xb1\xe5\xee\x9d\x91\xab\x41\x94\x87\x8a\xf0\xd4\x26\xea\x9f\xb7\xfe\xbf\x40\x99\xa3\xa1\x56\x83\x7c\x62\x86\x57\x32\x67\xc4\x90\x9a\x5b\xf7\x1b\x17\xc1\xd8\x9e\x25\x17\xdf\x82\x58\x94\xac\xe5\xc2\x4b\x9d\x9e\x08\x02\xb5\xbf\x37\x05\x7b\x48\xfe\xe4\xb4\xd3\x53\x93\x93\x0d\x31\xeb\xfd\x03\x9a\xba\x9b\x42\x15\x81\x1a\x40\x0e\xf9\xe3\x17\x7c\x27\x50\x2c\xf0\x62\xf0\x11\xf0\xde\x85\xb3\xd1\x29\xee\x91\x08\xc9\x1d\x9b\x88\xa9\x4a\xbb\xf5\xdc\x87\xe7\x34\xef\x3c\xbd\x0f\xd5\x0f\xe4\x17\xf1\xd3\x87\x18\x08\x1f\xdf\x23\xe4\xbd\x82\xa5\xb3\x5e\x58\xf9\x6c\x34\x10\xb6\x71\x25\xf5\xc4\x28\x2a\x8d\xfc\x9e\x3e\x6a\x7b\xdc\x73\x56\x4d\x35\x3f\xe5\x75\x82\x8d\x92\xf4\xbd\x31\x05\xf5\x2e\xe0\x26\x5a\x8d\x05\x2d\xfc\xbd\x4f\x4e\x48\x1f\xed\xb1\xf2\xb5\xc3\x3e\x44\xcf\x53\x1c\xde\xa0\x0a\xdb\x99\x87\x44\x02\x1e\xcd\xe8\x5c\x66\x32\x83\xa8\x04\x00\xf5\xf0\xf8\x4e\x6a\x66\x67\xa3\xb6\x5a\x65\xa8\xf0\x4d\x16\x02\xe0\x8c\x11\xb8\xbd\x7c\x43\x28\x5b\x0e\x80\xe1\x97\xea\x19\xb8\x77\x6d\x3c\x23\x55\x7a\x32\x70\x89\xd6\x9c\xc7\x96\xeb\x76\xd5\xfb\x9e\x21\xec\xc2\x12\xf0\xbd\xff\x48\x3b\x68\x3f\x2d\x86\x15\x2e\xb1\x95\x1d\x94\x85\xeb\xf5\xc0\xd0\x17\xec\x85\x15\x6f\x5d\xa8\x52\xf6\xc2\x8a\xd5\x6f\xf1\xa0\x24\xa1\xa2\x8f\x58\xa5\x92\xcf\x73\x50\xaa\x47\xa5\x08\x7d\x8c\xe5\x86\x5f\x7d\x2b\x19\xf8\xf2\x2f\x28\xa0\xae\x25\x67\xb3\xde\x1c\x27\xe4\xb7\x0b\x57\x43\x01\x40\x1a\x51\x02\xff\xa2\x1f\x42\x1f\x38\x5e\xe2\x39\x32\xc2\x42\xdf\xf2\x42\x4e\xd7\xdc\x83\x80\x29\x65\x6c\x0f\xb4\xd7\xf7\x6e\x8f\xaf\xc6\xd3\xf8\xd8\x50\x89\x81\xda\xf7\xdc\x55\x83\xac\x99\xe9\xa1\x07\xf8\x82\xdd\xfd\xd9\x95\x02\x50\xaf\x53\x9f\x40\x9f\x25\x09\x2e\xef\xa9\xfe\x0c\xd6\x45\x3e\x14\x62\x2c\x04\x95\xdc\x4e\x42\x57\xa7\xbd\x6b\x21\x20\x45\x78\x38\xa0\x6e\xb6\x70\x7e\x51\xfb\x9b\x88\xef\x75\x10\x81\x58\x29\xd2\xb6\x6c\x95\xc2\x0a\x89\x44\x02\x62\x08\x9f\x5c\x84\x3e\x45\xc3\x89\xf4\x01\x7e\x90\xb0\x05\xe0\x0b\xd3\xbe\x4d\xc4\xb7\x46\x8b\x98\xdc\xb4\xbc\x21\xb8\x60\xba\x38\x77\xe5\x8a\x28\x9e\xa2\xee\xb8\xfc\xbd\x0f\x54\x61\x48\xed\xc7\x9d\x52\x51\xb2\x10\xd4\x6d\x2f\xb7\x80\xfc\x5d\x4c\xdd\x50\xee\xf8\x0b\x2b\x8d\x50\xb7\xeb\x1f\xe5\xea\xd1\xf2\xf3\xce\x4f\xed\x9f\x04\xc4\x35\xdf\xc7\x87\x37\x04\xe3\x92\x2e\xf6\x78\xd4\xa4\x05\xbe\xe9\x78\x9d\x19\xe2\x04\xfa\x03\x6d\x5e\x57\x97\x1d\x5c\xb5\x97\x7a\xdd\x58\xbb\x5a\x78\x40\x84\x31\x2a\x2f\x8d\xe0\x58\x36\xbc\x57\x56\x5d\x23\xe4\xd5\x36\xa9\xa5\x80\x33\xee\xb1\x17\x9f\x05\xd2\x05\xfb\x7a\x3c\xf0\xe3\xd0\xc5\x2a\x11\x88\xc2\xd0\x71\xb1\x85\xe9\xee\xc8\x6e\xef\x59\x6c\x33\x0b\xd0\x4a\xe5\x23\xa6\xdc\xb1\x1f\x05\x95\x6b\x3d\x3b\x1f\x5e\x7c\xf8\xf7\x41\xe0\x3f\x47\x0f\x15\xe6\xd1\xec\x9e\xd3\x9f\x7f\xef\xaf\x4e\x82\x67\x8b\xbc\xa8\xe2\xf7\x89\x2a\x21\x31\x94\x92\x01\x8f\xf8\xd5\x0b\xbb\x15\xb2\xde\x07\x04\xe1\x11\xdb\xed\x29\x88\xb3\x3a\x63\x82\xeb\x34\x08\x6b\x83\x67\x5f\xc0\xf2\xf1\x43\x21\xd8\xed\x97\xaf\x74\xa1\x2c\x5c\x22\xb2\xb0\x1f\xb8\x4c\x90\x81\xc9\x71\x2a\xc9\x94\x17\x03\x9b\x80\x1b\x77\x55\x6f\x16\x1c\x6e\xae\xd9\xf0\x58\x00\xcf\xf1\xc4\xc7\xdf\x60\x17\x88\x07\x0c\x92\x27\x5d\xe9\xc6\x25\xb9\xf8\xa1\x8d\x36\x39\x9d\x36\x46\x08\xd0\xbd\xc8\x05\xd0\x88\xdb\xfa\x9f\x2f\xb3\x17\x0f\x1c\xbb\xdb\x76\xe6\x2d\xd0\x1d\xa7\x71\x5f\x3f\xe1\x11\x37\x54\xf4\xfb\x06\x3c\x53\x79\x4e\x64\x4b\x89\xb6\xfc\x1c\x64\x08\x9e\x4b\xfa\x21\x02\x60\xfd\x3d\xa6\x30\x2f\xe7\xd4\x6a\x1b\xa7\xc9\x41\x57\x94\x8a\x13\xa5\x7b\xa1\x89\x5e\x9c\x20\x6f\x3b\x67\xec\x19\x56\xbe\x7d\xb0\x96\xc2\x2c\x3a\x3a\xf0\xd5\x39\xa7\x8a\x60\xb1\x2e\x41\x5d\x1f\x75\x2a\x5c\x5e\xa4\x41\x37\xf3\x0e\x24\x30\xb6\x52\xb2\x7d\x29\x03\x40\xb5\x2d\x48\x29\xc3\x1f\xf2\xbb\x33\xe4\x59\x6b\x1a\x6b\xb4\x7b\xef\x32\xa5\x33\x60\xe2\xe2\xe4\x30\x7a\x36\xa7\x77\x0d\x50\x59\x01\x83\xe2\x71\x9c\xd8\xd3\x24\x7b\x43\xe9\x2e\x19\x63\x11\x3c\x52\x49\xea\x86\x84\xe2\xbf\x30\x12\x1b\xfe\xe3\xb0\xc8\x6d\xc7\x9f\x9c\xf3\xc2\xed\x1f\xce\x1d\x2e\xd3\x8e\xfc\xc3\xf4\xe9\x32\xe3\x61\x08\xdf\x80\x4d\xc1\x44\x74\x44\xa8\x12\xd4\x9e\x83\x16\x6b\xf6\x32\x70\xf3\x80\x7f\xd4\x50\x31\x5e\xc5\xbc\x3f\xf7\xdc\xc7\x03\x65\xf8\x61\xd2\x75\xaf\xdd\x5c\x0c\x1e\x5b\xc0\x12\xf9\x56\x05\x0c\xda\x01\x4b\xa1\xcb\x9f\xc2\x26\x45\x51\xf1\x34\x4c\x7f\xff\x56\x39\xfc\xde\x7b\xcc\x2b\x0f\x4e\x75\xc5\xe7\x8b\x3b\xd7\xa8\x1d\x4f\x26\xdf\x5e\x89\x69\xc7\xe1\x1d\x07\xc8\x08\xa0\xea\x9e\x37\x99\x39\x2c\x9a\x1c\x91\x28\xe4\x9a\x50\x27\x81\xab\x58\x10\x9c\x91\xf9\x40\x95\xc9\x12\x2a\xa2\xe1\x9a\x91\xf7\x48\x9a\x02\x1e\x7f\x9f\x55\x1e\x94\x70\x6c\x30\x9f\xc3\x7d\xa0\x13\x86\x97\xeb\xeb\x69\xfa\xce\x95\x43\x7c\xd4\x42\x5c\xf5\x79\xee\x3f\xb3\xbf\x66\x6e\xca\x7e\x7d\x46\xf9\x66\x4f\x28\xd2\x8b\x9f\x93\x0a\x0a\x9f\xa6\x1e\xee\x39\x1c\x18\xe2\xa3\x95\x33\x29\xbe\x0c\xc8\x37\xab\x80\x3a\x15\x57\xd3\x07\x4d\xbd\x3c\xc8\x61\x3e\x0a\x21\x80\xe8\x5e\x91\xd4\x9b\x2f\x39\xa4\x95\x06\x85\x1e\x1b\x25\xb9\x62\x39\x54\x46\xbe\xb3\xb6\x24\x6c\xee\x4d\xea\x2d\xa5\xc5\xcc\x10\xe4\x4e\xab\xf3\xd1\x9b\x4d\x93\xf3\x0b\x7c\xe2\xc0\xab\xd4\x0b\xe4\x01\x89\xb3\xd8\x09\xec\x31\xb9\xfa\xdd\x4c\xfe\x3a\x62\xe5\x81\xc7\xa5\x2c\x7c\x03\x75\xd0\x75\xb6\xbb\xfb\x66\x3b\x38\x26\x33\x7a\x0f\x58\x20\x32\x2b\x37\x90\xe7\xe1\xa7\x6e\x88\x44\xe2\xa6\x38\x1b\x8d\xf5\x85\xe3\x34\x40\xb1\x42\x46\x0b\xff\x82\xf2\xa7\xfb\x02\xa9\x09\xf4\xff\x33\xfc\xd4\x7b\x7c\x58\x7d\x9d\xa9\x9f\x08\x2e\x42\xa0\x85\x9b\xc8\x34\x13\xf6\x07\x73\xaf\x5b\xfc\x59\xe9\x60\x04\xe6\x7d\xe6\xe9\xee\x88\xc3\xd3\x06\xdf\x32\x49\x21\x2d\x3c\x22\xe1\x8b\x6d\xac\x74\xcf\xa8\x7f\xf6\x55\xaf\xa2\xd7\x57\xc1\xd5\xde\x7e\x8f\xe9\x22\x67\xf8\x42\x14\x6c\x25\x01\x27\x11\x49\x11\xc4\xe8\x80\xe3\x98\x55\x86\x37\x7b\xf5\x9e\x35\x88\x0f\x16\xca\x19\xf3\x19\x7f\x66\xb3\x9f\x83\xd4\xec\x07\xe7\x8e\x8f\xed\xdb\xd4\xc3\x25\x7d\xa3\x0b\x36\xfd\x71\x9a\x86\x89\xb5\x23\xfd\x1e\x83\x7b\x9e\x6c\x56\x99\xaf\x8c\xb8\x5e\x92\x05\xbf\x6a\xfe\xa9\x95\x32\x00\xbd\xdd\x7f\x03\xcf\x76\xa2\xd9\xd6\x6a\xf2\x23\x84\x3d\xfc\x41\xf4\x12\x60\xeb\x8a\x89\xad\xd5\x0b\xd3\xe6\x25\x3c\x2a\xa0\x75\x5f\x62\xae\xf1\xf8\xf9\xd1\x9e\x44\x69\x25\xb3\x8d\xba\xef\xb7\x2f\xbe\xc6\xe8\xc3\x57\xb3\x9e\x15\xa1\xcd\xc5\x81\xd5\x44\x30\x87\xa8\xe2\x8c\xa4\x2c\xc1\x68\x82\x23\xba\x0c\x72\xb7\x7b\x76\x07\x03\xf1\xe8\xfc\xf0\x38\x4d\xea\x7e\x0d\x1d\x08\x64\x61\x7a\xc7\xbd\x7d\x8d\x35\xa4\x97\x8a\x9d\x36\x82\x0f\x1f\xa5\xc6\x81\x89\x45\x3a\xdf\x82\x7e\x1f\xe1\x3b\xf2\xe1\x37\x7e\xe7\x5b\xa8\x3c\xef\x67\x40\x32\xb4\xb4\xe7\xf1\xc8\xd6\xcc\xbe\x03\xef\xc7\x0f\xd8\x5b\x7d\x02\xa8\xe5\xc6\xb0\x20\x5e\x48\x33\x02\x7e\x98\x65\xcb\xf5\xaa\x4d\x27\x18\xa3\x01\xfe\x66\xc3\x05\x06\x93\xe5\xc8\xfc\xdd\x93\x29\x20\x1d\xea\xff\xfa\x00\x90\xff\xbd\xd2\x79\x94\x4e\xdb\x87\x98\x62\x0b\x2a\xf0\xfb\x7c\xed\x21\x33\xec\x3a\x13\x2a\x1d\x3c\x2f\x00\x2a\xb1\xe9\xb0\x23\x0d\xd8\xe2\x9d\xac\x10\x07\x87\x7a\x94\x8f\x7b\xf5\x51\x34\xbe\xda\x3e\x74\x0e\x72\x95\x2e\xf0\x05\xa2\x3b\x32\x72\x79\x8f\x08\xd2\xe2\xcc\xdb\xf8\xfd\xb3\x86\x49\xac\x32\x64\x17\xdd\x29\x17\x7c\xb4\x7c\xef\x19\xc7\xbd\xaa\x96\x80\xda\xf7\x01\xee\xf0\x1e\x5b\x92\x59\x88\xe6\x93\x08\xc7\xe5\xbd\x21\x61\xe5\xc7\x6a\xc5\x9e\xc9\x22\x87\xa7\xe8\x84\xbb\x17\x07\x79\x7d\x8c\xb3\x2a\x2f\x72\xaf\x27\x1f\xfc\xcd\x53\xd2\x41\xa8\x41\x07\xe4\xbe\xd2\xea\x6b\x50\xb0\x15\xc2\xab\xac\x3d\x92\x8e\xc1\x0a\x4b\x6e\xbd\xf5\x33\x92\x63\x4b\x95\xf5\xba\xcd\xaa\x92\x00\x34\xd7\x69\xde\xe2\x18\x8a\xe8\x9b\x03\x7f\xe6\x3c\x22\x3a\x71\x12\x7c\x6f\xce\x9c\xd5\xa1\x71\xfb\x7b\xd5\xd8\xf4\x59\xf6\x0f\x8f\x1a\xa5\x87\xfc\x34\xb4\x50\x49\xa7\x6f\x00\x63\x35\xb6\x44\xc1\x00\xa2\xb1\xe6\xd4\x59\xe9\x97\x43\xb0\xdf\xba\xcf\x1f\xb8\xb6\x1f\x09\xa5\x18\xec\x35\xf3\x3d\x87\xd5\x1c\x03\x5b\x00\x5e\x86\x5f\x62\xbd\x87\xc0\x28\x6c\xea\x88\x14\xef\xfb\x6c\x3e\xbd\x0a\x5a\x44\xea\xe3\x40\x71\x60\x3f\x6e\x8f\xde\xe0\x3e\x7b\x57\x67\x5b\x28\xba\xcd\xe4\x50\xb9\x3f\x32\x4c\x9c\xfd\x12\xb6\x98\x5f\x4f\xce\x77\x9a\x24\x7d\x7c\xcd\x4f\x40\x2f\x27\x24\x94\x4b\x36\x52\xd3\xc4\x2f\x0b\x22\x49\xad\x18\xc6\x67\x0e\x2c\xfc\x9e\x17\xd7\x4b\xcc\x70\x46\xb9\x7b\x21\x3d\xcd\xe5\x9f\xdc\x4e\xd9\x5c\x6d\x74\xed\xab\x62\xc4\xc8\xe8\xdd\x21\x7b\x3e\x9c\xaf\x24\x9c\x13\x5a\x00\x2b\xdb\x62\x66\x13\x9f\x32\x48\xbd\xfe\xba\xcc\x93\x99\x85\xa7\xec\xe3\x8c\x29\xf8\x08\x63\x6d\xcb\xea\x1d\x4b\xfa\x46\x6f\x9d\x2b\x35\xa7\x66\x3a\xc8\x60\x4a\x45\xb3\xf1\x20\x39\x20\x93\xe3\xdd\x28\x7c\x92\x90\xfa\x29\x5f\x99\xf9\xd6\xad\xc6\x47\x59\xaa\x77\xd1\xdc\x07\x4e\x45\x2d\x75\xd9\x47\x3b\x41\x8c\xe6\xea\x23\x94\xc4\xf5\x9d\x48\x63\x0d\x75\x26\xa8\xc3\xa7\xea\xcd\x9b\x60\x73\x39\x4a\xe7\x36\xdb\xb0\xdd\xc1\x52\x7a\xca\x1b\xd5\x69\xba\xbd\xbd\x90\xc5\x2f\x39\xc9\x57\xf5\xb1\xef\xb5\x31\x9a\x27\x7e\x49\x74\xb9\x97\x2c\xfc\x26\xa0\x39\xe4\x53\xad\x9a\x8f\xd8\x7b\xeb\x8c\x01\xea\xfc\xa0\xe9\xf2\x52\x1b\x2f\xd2\xc8\xb5\xec\x9c\xe1\x65\xd6\x1d\x91\x96\x1b\x5e\x6c\x3f\x6d\x37\x20\x28\x77\xee\x85\x74\xdf\xe2\x9e\xdb\x19\x48\x8b\x12\xdf\xfe\x2b\x07\x11\x6c\x87\xbf\x4a\x83\x15\x97\x21\x01\x8c\x40\xf2\x28\x52\xb2\xbf\x60\xef\xa7\x19\xa6\x94\xa6\xb4\xa3\xe2\xb1\x6d\x43\x29\xe1\x0e\xc1\xe8\x91\xc9\x20\xac\xef\xd5\x2a\xf7\x20\xf2\xcf\x1c\x50\xdc\x30\x72\x76\x40\xa9\xf8\xe1\x62\xc6\xc9\xaf\xe1\xaf\x35\x26\x03\x68\x4e\x7a\xc9\xd0\xc4\xff\x90\x59\xd9\x76\x8e\x35\x5b\xee\x5e\xf9\x38\xc1\x28\x7f\xa2\x8a\xbb\xb3\xc5\xd7\xb7\x30\xc4\x3f\x0b\xfd\xda\xff\x46\x94\xa3\xcc\x92\xf6\x88\xf6\x8f\x37\x27\xaa\x5d\x7d\xfb\x2d\x9c\xcd\xc6\x07\xae\xff\x48\x10\xeb\xfd\x07\x94\x6d\x16\x0d\x83\x77\xa7\xa6\x40\x94\xef\x95\x8c\xea\x27\xea\xde\x4b\x1a\xac\xfd\xe3\x9a\xbd\xda\x3c\x96\xd5\x58\x74\x07\x71\x44\x51\xaa\x2e\x20\x81\xad\x83\x7c\xbf\x8e\xd8\x3c\x56\x51\x8e\x73\xef\x8d\x66\x72\x3f\x7d\x05\xd5\x48\xc2\x7a\xb5\x22\x59\xc9\x79\x67\xfb\x1e\x8c\x15\x4d\xf2\x83\xec\x47\xf3\x0c\x5f\xaa\xc8\x99\xe3\xcc\x0e\xf3\xf7\x0d\x5b\x77\x95\xdb\x41\x76\xe0\x4c\x5f\x6f\x61\x8a\x5f\x10\xcc\xb5\x08\x7f\x71\xaf\x1a\x40\x28\x70\x3d\x3f\xa2\x72\xc9\x34\xad\x4f\x2a\xd5\x32\x9b\x22\x94\x3a\x53\x52\x14\x63\x1e\xfc\x16\x5f\x19\x63\xa9\xe7\x57\x17\xd1\x25\x0a\xa6\x4f\x1b\x20\x35\xc7\x1c\x03\xf9\x35\x3e\x00\x52\xd6\x37\x0c\x58\x17\xc2\xe5\x2f\xb9\x34\x4e\xa7\xfd\x26\x64\xe1\x5c\xa7\x35\xbe\x6d\xb1\x2d\x44\x44\x81\x84\xb3\xd5\x6d\x24\x3e\x8f\x2c\x7a\x7e\x70\xc7\xb3\x8f\x7d\xa6\xb2\xce\x27\x5a\x4d\x94\xd9\x95\xd9\x34\xef\xcb\x5d\xe4\x53\xca\xe0\xde\x53\xdf\x0d\x87\xf7\x38\x15\xf1\x6c\x33\x4f\xd2\x3d\x56\x0d\x79\xd0\xa5\x91\xd9\x32\xe8\x5c\xc8\xd5\xab\x5d\x79\x7c\x05\xf7\xdb\x83\x18\xd2\x04\x7b\x7e\xf9\xdd\x67\x21\x68\xfa\x02\x76\x20\xf5\x1e\x14\x8b\xc3\x7f\x7d\x89\x24\x18\x27\x68\xfb\xd1\x43\x84\xc0\x7e\xe5\x8a\x0f\x04\xee\x64\xe1\x68\x3f\xd2\x4e\x9b\xb3\xe2\xcf\x6b\xee\xe5\x61\x88\x42\x69\x7d\x31\xf5\x09\x7e\x3f\x01\xd5\x21\x2a\x54\x4c\xd8\x20\x0d\xdb\x34\x07\xa6\xab\x6d\xb3\x4a\xaf\xd8\xfe\xc1\xd0\xe3\x91\xf2\xc9\x90\xc9\xdc\x2c\x62\xb8\xa6\xb8\x0f\x45\xa8\x21\x9a\xfb\xcc\xf1\xc6\x70\x0f\xdc\x3b\x88\xc3\xe2\x15\x1b\xb6\xee\x9e\x23\x21\xc2\x8c\x43\xc7\xde\x77\x9b\xb9\x42\x64\x16\xf8\xb5\xf7\xee\xcf\x3c\x77\x0f\x46\xa6\xdc\x85\xb8\x22\x49\x64\x54\x8e\x11\x1c\x90\xcc\x5f\x7e\x7b\xde\xd0\x7b\xd5\xdb\x46\x42\xb3\xf5\x0a\xf5\x43\xf1\x4f\x66\xd3\x91\x77\xa5\x39\x49\xe9\xab\x30\x24\x09\x59\xf9\x8c\xb4\xa3\x35\x37\x7b\xdf\x1d\x33\x72\x8a\x13\xf6\x5c\x02\x68\x89\x17\x80\x44\x70\x57\xd9\x40\x2a\xe6\x19\x6d\x92\xa7\x7e\x86\x41\xc3\x36\x60\x68\x0a\xb8\xb4\x71\xfc\x7c\x3e\x05\x67\x7c\xcf\x78\x07\xbc\x47\x10\x03\x29\x4d\x87\xa8\x4a\x49\xae\x89\xa6\x17\x75\x76\xf9\x82\xb1\x1c\xde\xdd\x47\x29\xb3\xdb\x7d\x9e\x78\x88\xe1\x23\xb1\xfa\x73\x2c\x71\x55\x25\x90\x0a\x53\xb7\xd2\xb2\xb2\x7e\xde\xa7\x18\x20\xe5\x90\xcc\x6d\x83\x01\xec\xfd\x3c\x9c\xd7\x2e\x90\x79\x63\x03\x93\x83\x44\x4a\xb5\x5d\x32\xc2\xfc\x5a\xed\x6d\xb4\x33\x85\x27\xd8\x32\xde\x8c\x6a\xf6\x5b\x2f\x57\x32\xb9\xde\x8b\x11\x37\xfc\xf7\xbd\xf7\x9e\xe0\x5c\x82\x1f\x79\xc0\x70\x76\x73\xa4\xe5\x98\x3a\xa2\x7c\xcf\x85\x1c\xdb\x88\x65\x77\xe3\xd1\x2a\xfb\x3f\xee\xd3\x28\x24\x00\x4b\x5c\x86\x1e\xc7\x57\x79\xde\xe3\xc8\x4d\x3c\xe3\x90\x53\x56\xd4\xb9\x10\xaa\xea\x94\xe5\xce\x27\x32\x06\xc7\xf3\xe7\x65\x5d\x9e\xf1\x06\xd6\xcd\xba\xe7\x42\x98\x69\x1e\xb3\x66\xca\xed\x15\xb6\xa1\xbc\x9a\xa9\x1c\x52\x1a\x00\x90\xba\xab\x64\x64\x43\x82\x04\xda\x53\xe1\x37\xa5\x34\x4b\xdd\x67\x19\x23\x53\xbe\x4b\x44\x0e\xdc\x11\xf2\xa5\x13\x95\x93\x0c\xdc\x8f\x0c\xc1\xe5\xa2\x11\x24\xa7\xde\x60\x54\x15\xfc\x24\x47\xc1\x3f\x6a\x9d\xd4\x4a\x20\xed\xd5\x0f\xcb\x2d\x74\xc4\xa6\x3d\x76\x3f\x1d\xaf\x08\x50\x9f\xd2\x10\xd4\x7b\x0e\xbd\xdd\xcb\x18\x2d\x37\xc3\xf5\xfe\xc9\x1f\x05\xc9\x16\x2d\x1d\xe5\x17\x01\x40\x1c\x3b\xb2\x52\x8e\x08\xf6\x24\xf9\x52\xac\x58\x0a\x11\x77\xbf\xb6\x5c\xfd\x27\x66\xbd\xfe\x51\xa5\x62\x7f\xb0\x6c\x0e\x51\xd5\x84\xba\xe4\xdc\x54\xaf\xdc\xf0\xc8\x04\x2d\x10\xa7\x3e\x14\xa5\x81\x8a\x96\xb4\xfc\x8e\x34\x04\xcd\xac\x61\xe2\xf1\x60\xb2\xce\x6b\x7a\x72\x4b\xef\xf9\x7f\x96\x9b\x18\xef\xf9\x35\xfd\x00\x6f\xc8\x16\x8b\xc6\xad\xc5\xef\xe9\x9e\x6b\x78\x62\xec\x28\x2c\x7f\xe3\xcc\xbe\xda\xf2\xd6\xa9\xf4\x53\x03\x84\xbf\x35\xf6\x2d\x8f\x83\x88\xef\xd3\x1a\x68\x6a\x0c\x7e\x7a\x6b\xde\x6a\x65\x09\x75\x75\x76\x08\xd4\x03\x2b\xee\xef\x3c\xcc\xf7\x48\xf0\x79\x54\x6b\x3f\x52\x21\xf0\x70\x64\x84\x4b\x18\x9b\x6d\x30\x01\x69\xfb\x12\xdc\xbb\x46\xca\x90\xe1\x3b\x31\x2f\x19\x16\x78\xde\x6f\x2d\x06\x85\xb7\x67\x48\xb3\xd8\x1e\x95\xce\xc7\x08\xcb\x10\x0c\xf4\xfb\x61\x8c\x3b\xb0\xf1\x1a\x1e\x24\xa4\xf5\xbe\x7e\xa8\x25\x23\x57\x8c\xcd\xd3\xca\x1b\xa2\x8b\x2a\x3b\x6d\xe9\x98\xd3\xe8\x10\xd3\x2e\x7c\xee\x99\xc2\x2f\x74\xcf\xee\x30\x4d\x67\xcb\x0a\x35\xa2\x8a\x64\x72\x04\x89\x9c\xba\xc6\x5d\x22\xbe\xa3\x56\xf1\x7c\xa6\xb1\x1d\x79\x11\x0d\xb5\x37\x40\x70\x51\x44\x2c\x36\x4a\x80\x27\x4b\x85\xd0\xe5\x7c\xd9\x38\xca\xba\xaf\x52\xec\x37\x26\xee\xe6\x7b\xdd\x01\x4e\x9c\xb0\xe0\x41\x6c\x39\x92\xca\xf4\x78\xe5\xa2\x67\xa7\x22\xdc\xfd\x14\x68\xea\xbe\xd3\xbd\x4f\x29\xc7\x05\x70\xf1\x50\x29\xcf\xab\x5f\x85\x8d\x13\xc6\x64\x26\x4d\x8c\xc0\x51\x54\x2c\xca\xc0\xca\x01\xfa\x8b\xb7\x14\xdc\x8f\xf7\x38\x74\x8f\x59\x57\xfd\x43\xed\xdd\x2c\x9f\x6f\x44\x29\xa4\x7a\xe7\x35\xf6\x43\x66\x58\x9e\x35\x4a\x55\x79\x0f\x03\x38\xbf\x24\x08\xd4\xe2\x5d\x22\xc6\xf0\x94\x12\xa6\x0c\xe7\x95\x5e\xae\xee\x5e\x02\xd1\xd4\x70\x39\x21\xb9\xed\xe3\x85\x7d\xaf\x19\xa3\x41\x12\x92\xf0\x49\x66\x67\xaf\x9e\xf7\xaa\x83\xf0\xd3\x92\x9c\x55\x83\x92\x48\xc0\x42\x57\x29\x66\xd4\xb4\x23\xd0\x9c\x3d\xe3\xa7\xfb\x48\x92\x7b\x01\x63\x22\xfd\x62\x29\x31\xbe\x6c\x81\xc9\xf9\x7a\x98\xe9\x33\x8a\x5e\x63\x25\x21\xed\xd6\xee\xc2\x5b\x16\x06\x60\x08\xd7\x1f\x41\x8a\x8d\x0a\x7c\xc6\xf4\x35\x21\x98\xc1\xd3\x03\xde\x56\x3c\x9d\x6d\x7a\x61\x6d\x3f\x44\xfd\x10\x58\xfd\xd7\x5b\xe6\x88\xf0\x5e\x13\xec\xcc\xbf\x64\xa7\xf2\xf5\x37\x60\xd3\x1c\xca\xb3\x0c\xab\xc2\xe0\x15\x8d\xd2\xb3\xea\xf1\x33\x56\xe3\xd8\x57\x9b\x87\x4a\xd3\x49\xee\xf5\x98\x41\xfe\x89\x60\xbc\xfd\x31\xa0\x0e\xfe\xa3\xe9\x3a\xb6\x1c\x45\x96\xe8\x07\xb1\x40\x78\x58\xe2\x84\x11\xde\x48\x88\x1d\xde\x1b\x09\x61\xbf\xfe\x65\x56\xcf\x5b\xd4\x99\x9a\x3e\xd5\xd5\x28\x09\x73\x6f\x64\xc4\x0d\x70\xcc\x95\xf2\xe1\x10\x34\x15\x98\xeb\x49\xd1\x16\x0e\xa8\xa2\x2d\xeb\x48\x23\x1d\x0e\xef\x48\xe0\xbd\x22\x2a\x83\xb1\x7d\x24\x92\x6c\x96\xdb\x63\x12\xca\xbb\x09\x62\xd5\x27\x04\x79\x5a\xfc\x20\x5d\x44\x6a\x88\xd7\xf8\x82\xb6\x1f\x63\xcb\xc4\x2f\x97\x95\x5a\x04\x00\x30\xdd\x99\x38\x5e\x33\xdb\xbf\xf1\x8d\xeb\x4b\x01\xef\x4d\x23\x15\x0a\x78\x1f\xcb\x9f\x12\xc1\x40\x01\x7f\x15\xaa\x04\x64\xf6\x44\x59\xe1\x20\xfc\x38\xd1\x8b\x6e\xb3\x37\x47\x3b\xe6\x2d\x7c\x9a\x22\xa1\x5d\x6e\x72\x25\x18\x5a\x12\xfe\x93\x72\xbc\x8b\x66\x72\xe2\x3a\x18\xfe\x95\x32\xce\x78\xe6\xc9\xeb\xb9\xb6\x8b\xef\xcb\xd7\x2b\x45\xd7\x88\x17\x18\x61\xf1\x28\x2d\xd7\xc8\x0e\x8a\x4a\x3d\xbb\xf2\x7b\x30\xed\x41\x91\xb8\xdc\xd8\x9f\xf9\x9b\x54\x9a\x2c\xb1\xee\x96\x25\x92\x76\x99\x14\xcb\x15\xfb\x7b\xa2\xad\xc7\x6f\xa0\x01\x00\xdd\xf6\x37\x6e\xcc\x96\x82\x2f\xe9\x70\x01\x8c\xf6\x14\x45\xf3\xa9\x7a\xdb\x08\x62\xbd\x70\xf3\x4f\x93\xbb\x56\x09\xa0\x9c\xe0\x85\xb5\xe3\x23\x38\x1f\xa6\xfc\xfd\x62\x99\x45\x53\xa5\x44\xd4\x46\x5b\xee\xd9\x0b\xdb\x52\xa9\xbe\x31\xfa\x24\xae\xa7\x5b\x21\x72\xe3\xa2\x48\x29\xbb\xb4\x6d\x1c\xd6\x40\xa4\xf8\x37\xdf\x5a\x4a\xd1\x35\xb3\xda\x96\x57\x10\x9b\x33\x7b\x44\x13\xe0\xf0\x49\xc0\xd5\x22\xdc\xce\x03\xbe\x00\xf2\xdc\x3e\x5f\xd4\x3d\x3e\xd6\xfc\x51\xea\xe9\xdf\x2c\xf2\x38\xff\x2d\x82\xb0\xbf\xf0\xf2\x13\x7c\x3f\x82\xef\xe1\x7c\x72\xcb\xa2\xf6\x7d\xdb\x2b\x00\xc6\x3e\xa5\xeb\x25\x0e\x24\x8e\xf8\xd2\x6a\xe2\xfd\xd6\xdb\x29\x3c\x56\x10\xcc\x2a\xd9\x3e\xc7\x2f\xc2\xe8\xdd\x98\xdf\x7f\xd7\x6c\xf7\x53\xf2\x5a\x41\x24\x12\x91\x3c\x5e\xf0\x44\x0b\x65\x59\xfd\x21\x9b\xf1\x38\xcd\xd6\xbc\xe4\xdb\xc7\xf2\x3e\x8e\x70\xad\xf3\x5d\x16\x34\x5f\x3e\x42\xeb\x71\xd5\x26\xba\xbe\x9b\x62\xba\xf6\x97\xf1\xa3\xa5\x38\x48\xea\x9d\x2d\x81\x1f\x30\x14\x72\x2d\x86\xc4\x2a\xf1\xf0\xec\xf9\x28\x25\xe9\x22\x98\x1a\x1e\xdf\xfc\xf7\x2b\x01\xbe\xfa\x7d\x02\xd0\xbb\x8d\xa7\xfe\xec\x1a\xb3\x52\x15\x61\x71\xc6\xa3\x06\xbf\xb6\xbf\xf5\x3a\x3b\x8a\x0c\x9c\x10\x96\x94\x25\x77\x3d\x09\x79\x49\xa7\xad\xc9\x4d\xfb\x9d\x49\xf0\xe0\x67\x61\x8e\x77\x90\xff\x43\xac\x0e\x68\xdc\x17\xdd\x8f\xd1\x90\xc0\x8f\x29\x00\x40\xbf\x18\x87\x72\x4f\x28\x94\x00\xef\x10\x5f\xc0\x13\x9e\x58\x19\xed\xa6\xc0\xff\x27\x25\x50\x06\xf0\xeb\xc6\x3a\xf9\x47\x73\xb4\x96\xaa\x1e\xf4\xba\x03\xbc\xf9\xc9\x6d\xb4\x50\x03\x1e\x95\x7e\x6b\x23\x90\xf7\x06\x99\xae\x79\x10\xce\x48\x51\x0c\xa7\xa5\xb3\x4e\xdf\xad\xd7\xe7\xde\xc7\x2f\x68\x93\xb6\x50\xbb\xb8\xff\x06\x39\x32\xd9\x2d\xb2\x12\x64\xf9\xad\xd4\x00\x30\xbc\xe0\xdd\xb0\x77\x65\xdc\x4a\x95\x21\x20\xdf\xee\x2b\x7c\xab\x9e\x3c\xdf\xaf\xfe\xc0\xd8\x6e\xab\x84\x90\x46\x1e\xb2\x4c\x50\x9a\x77\x64\xa3\xce\x9e\x8e\x7f\x68\xc0\x69\x33\x3c\xcd\xa7\x4e\x0f\x95\xf5\xc3\x2f\x88\xfc\xf5\x66\xfa\x48\xe2\xdf\x4e\xc3\x7a\x91\x7f\xab\xb5\x71\x12\x79\xed\xd6\xd6\xc9\x4f\x69\x8e\xf7\x2f\x7a\x38\xc0\x79\xa1\x6e\xc6\xf2\xbd\xab\x50\x33\x01\x7e\xc1\x2a\x2f\x81\x5e\xac\xcf\xbd\xa8\xf1\x4b\x23\x50\x27\x00\x7e\x4d\xb1\x5a\xf7\x04\xea\x82\x58\xaf\x4e\x55\x71\x76\xe5\xf5\xb9\x27\x62\xb2\xec\xbf\x42\xfb\x0c\x42\x86\x95\x63\xfa\x5c\x09\xf7\xd3\x73\xc8\xe6\xcf\x70\x13\x18\xc0\xa9\x51\xeb\x87\xcf\x5c\x9a\xa4\x20\xe6\xdf\xef\x05\x71\xa0\xe5\xf0\xf4\x8c\xd1\x9a\xfb\xe5\x04\x39\xa6\x20\xef\xa2\x5f\xfd\xfc\x16\x45\x17\xf1\x06\xd8\x33\xb9\xde\xaf\x15\xfa\x14\xe0\x4c\xb4\xe4\x3f\x49\x98\xa3\xa1\x26\x0f\xbd\x6e\xdf\x93\x1c\x84\x87\x3f\xea\x20\xbe\xe4\xf6\xb5\x35\x4f\xea\x07\x20\x57\x3a\x97\x8e\xc4\xf3\xa5\x27\x80\x03\x02\x20\xed\x42\xde\x47\x52\xbd\x01\xdc\x2a\xa1\x7e\xd3\x0c\xde\xa6\x7b\xa6\x3d\xf8\xef\x33\x45\x30\xa3\x6a\x10\xb6\xcd\x1d\xbe\x93\x5d\xf7\x7e\xd2\x79\xf9\x6b\xb9\xcf\x65\x29\x57\xa1\x7b\xa2\x16\x13\x0b\xbe\x3d\x8b\x6c\x3e\x4b\x84\xd4\x71\xf7\x1c\xfe\x66\xf8\xdf\x83\x0e\x4c\xda\x0a\x40\x3c\x0f\x64\x38\x5e\x88\x59\x79\xf4\x04\x66\xc0\x77\x02\x54\xd4\x78\xf1\x4e\xc4\x9a\x92\x4b\x58\x57\x46\x78\x4f\x10\x7f\xdf\xb0\xa2\x31\x80\xa7\x8d\x6f\x96\x1e\x37\xaf\x7e\x4a\xa9\x2c\xf4\x0b\x39\xfa\x21\xe8\x9d\x50\xec\x9b\x88\x01\xbf\xde\x1d\x92\xd1\x6c\xeb\xee\xfd\xd5\x87\xf7\x3d\xd6\x66\xce\x96\xb6\x72\xe7\xcd\xd3\x11\xc9\x48\x1c\x1e\xed\x74\xa6\x80\x7b\x78\x0e\x11\x8e\xc8\x8d\xff\x16\xde\x0f\x27\x07\x7d\x34\x9e\xe8\x4c\x7e\x7e\xca\x15\x77\xcb\xd6\xb3\x63\xc5\xfe\x64\xbd\xb1\xd5\xf2\x97\x0c\xd8\x0f\x2d\x52\x4b\x39\x6b\x01\xb0\x45\xc0\x58\x7d\x36\x59\xb0\x8f\x12\xbc\x7f\x86\xe8\x86\xbf\x5e\x41\xba\xf4\x7e\x30\x17\xcd\x99\xde\xe4\x09\x4a\xf7\xd0\xae\x9d\xf3\x00\x7c\x3c\xcf\x77\x1c\x50\x2a\x2a\x4b\x74\x39\xc2\xed\xe5\xe0\x8b\x45\x24\x04\x4d\x58\x94\x52\x1f\xd4\x0c\xce\x61\x88\xd7\xf4\x85\xc1\x69\xeb\x39\x7e\xf5\xf5\xfb\x6d\xc6\xd9\xfb\xe3\xf7\xb3\x0b\x5e\x4c\xd1\xbe\x79\x1f\xef\x65\x9e\xcc\xed\x4a\x02\x6c\xd0\x09\x6e\xab\xf7\xd9\x03\x5f\x2c\x35\xe7\xcd\x22\x4e\xf9\xe5\x9e\x1f\x4b\x75\x01\x4a\xa4\x73\xd5\x23\x2f\x4f\x8b\xa9\x9e\x52\x3c\x44\xda\xbd\xd0\x10\xbf\x0d\xb9\x65\x73\x93\xc2\xb3\x4c\xed\xab\x62\xcb\x52\x93\xfd\x4d\x80\x3a\x2d\xb2\xef\x99\xb1\x64\xf5\x25\xd9\xb8\x7e\x93\xd3\xc3\x46\x3e\xfd\x04\xdf\xa2\xfb\x17\x4d\x74\x2d\x10\xde\x86\xb7\xe0\xde\x03\x7f\xfb\xd1\x39\xa2\xd5\x1d\x11\xb9\x64\x11\xe0\x3c\x0d\xb0\x35\x6e\xdc\x74\x6a\x78\x0f\xcb\xa7\x8b\x5c\x00\x9f\x3d\xc0\xd1\x35\xe9\xc9\x09\x1d\x73\x6f\x17\x49\xe3\x5b\x3f\x97\x0e\xb5\xa8\xb5\xe6\x16\xa7\xd6\x80\x84\xbb\x57\x92\x9c\x23\x30\x5b\xf0\xfa\x7e\x06\x2e\x08\x7d\x14\x65\x9a\xf4\x71\x2e\xd3\xab\xf7\xde\xcb\xcb\x78\xae\x37\xf0\x93\xe7\x33\x5c\x80\x5d\x58\x37\x3f\xbc\x78\x6a\x29\x53\x3c\x5f\xdb\xd9\xf3\x9b\x31\xc2\x99\x41\x69\xf6\xdb\x2b\x9a\x93\xa2\x9f\x1e\xbe\xe1\xf8\x0f\x01\x51\xc5\x1d\x25\x3e\x47\x6c\x9e\x20\x3e\x07\xc7\xd0\xf0\x7b\xa0\xba\x37\x76\x88\x6c\x12\x95\x09\x80\x49\x50\x55\xe4\x51\x1e\x55\x6b\x00\x1b\x15\x8b\xe6\x72\x86\x43\xba\x96\x65\x98\x9e\x5a\xdf\x62\x5f\xbf\x88\x74\x72\xa8\x2c\x36\xfc\x75\xb8\xa5\x97\xc6\x19\x8a\x95\x17\x5b\x78\xa6\x56\xb4\x96\xbd\x1b\xf6\x0f\xc1\x7d\xb8\xa4\x2e\xdd\x1b\x94\xf2\xcf\x14\xce\xc9\xdc\x14\x1d\x75\x04\xc0\x92\x00\x9f\x2b\x40\xa6\x76\x8f\x46\x11\x35\x51\x20\xdb\xfa\x33\x4f\xc9\x70\x64\xdb\xf0\x18\xc0\x77\xb9\x6d\xa6\x90\x9f\xca\x33\x3b\x96\x1f\x82\x09\x9f\x80\xe7\x7f\x93\x23\xc9\x57\x3c\x0d\x36\x26\x1f\x88\x1f\xe3\x88\xb5\x3a\x8b\xb0\xbf\x5a\xc0\x72\x70\xbe\x64\xf1\x0a\xab\xf6\xcd\x1d\xfd\xe6\xbe\x4c\x1d\xbc\x21\x15\x2e\x06\x18\x2f\x0e\x15\xe6\xd3\xc1\xd8\x0f\x7e\xf7\xc8\xdd\xd3\x12\x78\xf5\x46\x65\x3c\x75\x9a\x9f\x02\xea\xfa\xd4\x80\x16\xac\xe9\x87\xc9\x5e\xc3\x3c\xc7\x50\x12\x8a\x3f\xc8\xfb\xf4\x31\x1b\xdd\x57\xc1\x19\xbc\xe2\x26\xa9\x86\xef\xcb\xb2\x22\x9a\x39\xdf\xc0\xc0\x5d\x90\x62\x94\xfb\x64\xe9\x9f\x72\xe3\xd0\x07\xe5\x2f\xbc\xe5\x73\xc5\x2a\x09\x90\x33\x73\xc3\x73\xd3\xe1\x62\x6d\xa5\x5e\x02\x9e\x5e\x28\xc0\xab\x8d\xe3\xa5\xd7\xaa\xa8\x69\x7c\x17\x6d\xce\x78\x33\x25\x9e\x18\xaf\x98\x0a\x9e\x77\x5f\x4e\xb7\x53\x86\x3d\x1e\x7f\x5a\xcf\xe3\x46\x5b\xa2\xff\x9e\x2c\x67\xee\x41\xc8\x06\xcc\x08\x07\x29\xef\xc6\xfc\xc4\x43\xa3\xe8\xd7\xb0\xb7\xd5\x42\xd1\xb0\x16\x50\x77\xde\x3d\x01\x1f\x13\x84\xc6\x08\xa4\x8c\xa7\xe1\x77\x33\x8f\x39\x46\x67\x2b\x08\xaf\x69\x3e\x40\x8a\x0e\xa5\x5e\xac\xf8\xf9\x0d\xb7\x44\x93\x55\x49\xbf\xd7\xdf\x1e\xe7\x5e\x3d\x55\x48\x4d\xfd\x8e\xee\xd7\x42\x17\xb4\x70\x54\xc6\xc9\xd8\x63\x90\x23\x68\x71\x96\x57\x38\x34\x27\x49\xf6\xef\xa4\xcd\x13\xb6\x88\x6c\x53\x55\xf5\xe6\xfd\x52\x04\xbd\xab\x8a\x1f\xca\x70\x12\x42\xa2\xac\xa0\xae\xc2\x34\x3a\xd4\xc1\x5a\x52\xbc\x70\x39\x49\x9b\x4a\x14\xd1\x18\x5c\x3b\x34\xcc\xbc\xfb\x87\x21\x33\x67\x13\xdf\x8d\xc8\x3f\x4c\xa8\xc3\x12\xca\xed\x1e\x91\x4b\xb4\xa3\xb1\xd6\x2b\x8a\xec\xae\x4a\x14\x37\xe7\x18\xcc\x4c\x97\x7d\x87\x5c\x15\x80\xe5\x5e\x5f\x22\x57\xff\xf6\xe4\xdc\xb3\x63\x16\xa2\x81\x2c\x00\x90\xe8\x7b\x3f\xa2\xfd\xa0\x83\xd8\xd0\x57\x5b\x56\xe9\x0a\xe3\x28\x74\x16\x2d\xb9\xd4\xbd\xc9\x42\x24\x97\xbd\xbc\x09\xb7\xb7\x43\x1a\xc3\xc1\x12\x66\xa6\x6b\xa7\xb6\xfc\x64\xef\xf6\x6a\x45\xcf\x25\x03\x5d\xf1\xcc\x2f\xe2\xa8\xa8\x86\xb8\x32\x14\xdd\xaa\xa6\x87\x58\x57\xb8\x2e\x06\x31\x6c\xbb\x95\x77\x78\x87\x5f\x2b\xfc\xa9\xb4\x08\xf7\x7e\x99\xf8\x15\xb3\x80\xe7\x1e\xa5\xd1\x75\x0b\xab\x36\x28\xcb\x29\xfd\x3b\xc8\x10\x4f\x43\xef\xb7\x5a\x14\x41\xec\x94\x9e\x37\x38\x83\x44\x70\x3c\x48\x23\xb6\x85\xb7\x32\x5e\x32\xf0\xce\x0d\xf0\x4f\x36\xa6\xad\x18\x45\x7f\x07\x05\x20\x45\x51\x2b\xf8\x57\x2f\x4d\x4d\xd0\x0c\x71\xef\xb4\xc9\x0a\x7f\xc6\x83\xf1\xc3\xac\xaf\x63\xd7\x23\xb1\xdd\xcc\x79\xe1\x21\x67\xbd\xf9\x71\x06\x6a\xab\xf9\xd0\xea\xfa\x34\xdf\x88\x13\x00\x28\x4d\x46\x3a\x1d\xbd\x28\x96\x31\x4a\xbd\xd4\x25\xa2\xaf\x72\xbf\x82\xf2\x0c\x6f\x93\xf6\xef\xfb\x0b\xde\x0e\x34\x80\x32\xeb\xe3\x69\x89\x35\x9c\x75\x5e\x9c\xe1\x2e\xb3\x85\x7d\x52\xfa\x1d\xe2\x3e\x18\x31\x2b\x0d\x16\x55\x3f\xad\x37\xa1\x22\x2e\x9b\xae\x77\xdf\x1d\x2c\x0a\xe8\x59\x1c\x02\xee\x60\xde\x06\x6a\x7f\x25\xf3\x29\x47\x4f\x22\x87\xba\x6e\x14\x8b\xe4\x16\x2d\x96\x38\x99\x62\x34\x23\x3b\x59\x65\xce\xa7\xc9\xaa\xe5\xc3\xaa\x88\xfa\x6c\x7b\xe2\xcb\xc7\x4b\x87\x94\x66\x2d\xf9\x87\x4a\x6d\xb1\x6f\x3c\x83\x1b\xea\x1c\xe8\xbe\x87\x71\xf4\x3c\x32\x47\x11\x1f\xdf\x43\x91\x0e\x5b\x7e\xc1\x42\x28\x99\x3b\x4a\x93\xda\x6c\x4b\x3e\xfa\x34\x3a\xd0\xe0\x4b\x7b\x8a\x0a\xc8\xf8\x6d\x92\xac\x78\x42\x0f\xa5\xb2\xbf\x8a\x17\xc6\x62\xbe\xd6\x3e\x39\xc1\xf3\x6a\x0f\x92\x11\x12\xd8\x56\xd9\x1f\xcf\xc0\xc5\x5a\xe9\x26\xbb\xcb\x4b\x1f\xe3\x23\xc7\x51\xab\x91\x1b\xcf\x89\x53\x29\xa1\x6f\x41\x0b\x82\xe3\xa7\xd1\x9a\x07\xe7\x91\x48\x6c\x0e\xe3\xc9\xbd\xb6\x48\xe0\x35\xa1\xd8\xb4\xc0\x19\x09\x5a\x78\xd4\x43\xa2\xb5\xd6\x41\x0f\xea\x94\xc8\xf5\x24\x7c\xab\xac\x72\xe5\xc9\xbb\x9a\xeb\x8d\x44\xa5\x48\x0b\xdd\xfc\xe0\xf6\xa7\xa9\xb1\xf3\x0b\xce\x60\x18\xe0\x1c\x5a\x09\x73\xeb\x47\x67\x28\x2f\x7a\xe7\xad\xe1\xeb\x02\x28\xa6\x56\xa2\x7c\x09\x55\x4c\x56\x0f\x5f\x3a\xc8\xca\x5b\x34\xec\x05\x07\x41\x02\x8a\x65\x75\x6f\x1b\x46\x89\x23\xfe\xe6\xf3\xee\xa2\x0b\xfc\x9f\x42\xa2\xba\xc5\x44\x59\xd3\x2a\xe5\x1d\xd8\x09\x29\x16\x96\x53\xc7\xe8\x4a\x21\x89\xc2\x3c\x93\x64\xff\x02\x27\x3c\x4a\x64\x7d\x49\x64\xf7\x50\x00\xa4\xbc\x43\x3f\x98\x4e\x1e\x11\x94\xe5\x22\x39\x1c\xaf\xb5\x38\xb6\x42\x1e\x7d\x77\xc9\x67\xff\xa0\x99\x5b\xdf\x3f\x1a\x47\xcd\xf9\xb3\x4a\x01\x52\x36\x02\x70\xf4\xa4\xf6\xb5\xb2\x35\x3a\xa9\xe9\xa3\x89\x65\xc2\x3f\xe0\x9d\x62\x30\xd2\xcf\xd6\x28\x13\x29\xbc\x47\x12\x57\x72\x9d\x30\xe5\x6a\x70\xf0\xb7\x0e\x6e\xa0\x55\xbb\x87\x2d\xe0\x2a\xec\x11\x7e\x6b\x79\x22\x76\xbf\xbd\xd3\xa5\xb7\x1b\x31\x12\xd2\x6c\x00\x34\x4a\xe1\x3b\xab\x1a\xd3\xdd\x4d\x09\x24\xae\x51\xbf\xfb\xf7\x66\xea\x18\xf3\x6a\xc3\x58\x72\x8f\xd9\x72\x43\x55\x18\x7b\x9c\x01\x18\x3a\x2e\xd6\x60\x27\xb3\xef\xc3\x6f\x83\x4e\xc1\xc5\x6b\xc8\x6b\xbc\x25\x01\xd4\x2f\x3a\x61\x1c\xdc\x3f\xdc\x61\x22\x86\xdd\x92\xe6\x8f\x03\x58\xe6\x28\xff\x9e\x19\xfa\x6a\x2d\xe6\x6e\xe3\x8f\xc9\x98\xeb\xc9\x13\x18\xec\x1a\x3f\x23\xa9\xae\xd2\xce\xeb\x6e\xb9\x44\x49\xa1\x22\x3d\x87\xdf\xe3\xd1\x68\xeb\x21\x2d\xd5\x99\x0d\x03\x53\xac\x8e\x0c\xeb\x01\x6e\x67\xde\xab\xd6\x89\xae\x9d\xa8\x25\x59\x0e\xce\xd7\xbd\x4f\x53\x6e\xc0\xad\xe2\x22\x97\x92\x94\x84\x55\xe0\x19\x31\x2e\x48\x9e\x59\xf0\x8b\x5b\x58\x9d\x6f\xeb\x1d\x35\x50\xe1\xac\x22\x22\x54\x40\xfc\x8c\x5f\xde\xd0\xf6\xda\xb4\x0f\xe1\x0e\xc2\xce\x6b\x6f\xc4\xaf\x80\x4a\x55\xb3\x91\x15\xe3\x60\xa4\xc2\x55\x00\xf7\x7a\xb1\xec\x75\xbd\xe1\x13\x1b\xc6\xd6\x11\xed\x8a\x38\xac\xdb\x36\x26\x8d\x21\xdb\xae\xe0\x56\x97\x3f\xef\x21\x9a\xcf\x7c\xb2\x7d\x9f\xba\xec\x85\xd1\x9d\xc8\x4c\xe9\xb9\x39\xe4\x52\x40\x0d\x9c\x57\xf8\x6b\xc2\xee\x21\xd4\xaf\x45\x06\x21\x1f\x60\x3c\x5b\xac\xde\xae\x27\xce\x6f\x00\x6c\xd6\x28\xa0\x80\x19\xbf\x69\x78\xf9\x7e\xbf\x8c\x5b\x1d\x3c\x4e\x16\xf0\x65\x6b\x83\x53\x2d\x07\x59\xee\x77\x90\x23\x8d\x38\x79\x56\x88\x97\x64\xe0\x1d\xe6\xbc\xc6\xe6\x6f\xfe\xed\xfc\x3f\xef\x81\xb7\x4c\x69\x07\x08\xa2\xc1\x91\x34\xf2\x29\x1e\x85\x15\xd6\x66\xd9\x8e\xef\xd5\xe8\xd8\x3e\x07\xa0\xe8\xc7\x3e\x1a\x90\x78\xbf\x9e\x3b\xc4\xe1\xd3\xe1\x79\x80\x6f\xb6\xf4\x64\xed\x7a\x37\xa7\x97\x13\xcc\x37\xae\xbb\x62\xba\xfe\xfa\x26\xec\x43\x00\x5e\x01\x82\x9c\x25\x7c\xad\x8b\x63\x4b\x6d\xc7\x04\xf9\x31\xb4\x1f\x3a\x23\x92\xec\xdb\xe1\x46\x73\x0d\x4c\xfe\xcb\x0b\xe2\xd9\xb0\x5b\x3f\x35\x85\x05\xe7\x87\xdf\xce\xe8\xcf\x6f\x15\xe1\x7d\xd8\xc7\xc0\x5b\xbb\x5e\x36\x70\x7a\x35\x72\x45\x07\x90\x9c\xdf\x77\xe1\x78\x4a\x28\x0f\x6a\xc9\x84\x8b\x2b\x3e\x08\x7f\x3a\xa7\xa8\xc1\x39\xd4\xf3\x08\xb7\x89\x07\x8e\xd3\x4e\x9f\xd7\x15\x57\x32\xf3\x64\xcd\x01\xfd\x49\xbb\xa9\x8e\x19\x32\x34\x9f\x24\xc4\x0a\xb3\x02\xe9\x1e\x6f\xa7\x97\xc2\x1b\xb1\xd6\x05\x32\x2c\x84\x1c\x15\x75\x52\xf9\x17\x90\x5f\x33\xd7\x5c\x41\x54\x8d\xe5\x2a\x72\x66\xbd\x96\x4d\x49\x73\xbc\xfb\x01\x64\x7d\xe4\x1b\xcd\xa0\x15\xaf\xec\x0b\xf5\xed\x6b\xc4\x8b\xbe\x67\x02\x60\x8a\x80\xb1\xc7\x9b\x4a\x99\x7f\xf5\x6e\x3d\x79\x55\x20\x0a\x1d\x75\x59\x5e\xc0\x54\x59\x4e\xb0\x3d\x02\x5f\x6e\xcf\x8c\x89\x54\xf5\x54\x3c\xdc\xf7\x4e\x2a\x5b\xc9\x97\x67\x37\xf3\xe3\x39\x94\x5d\xa7\x85\x2a\xce\x4d\x20\x02\xf7\x7d\xbb\x3c\xab\xf7\x63\xf0\x95\x23\xd3\x95\x0e\x33\x94\x83\xc8\x96\xd4\xd8\x1c\xb8\x8a\x35\x32\x66\xb2\x7b\xcf\xaf\x4d\xa6\xf4\xa2\xbc\x26\x39\x01\x90\x9f\xe4\xd1\xa3\x6e\x00\x2e\xf2\xe5\x1d\x51\x21\x0b\xcc\x57\x80\x14\x0e\x7f\x8d\xa4\xe3\x46\x39\xe0\x1f\xd5\x9d\x0d\x67\x4a\x65\xa5\xe3\xcc\x15\xa7\x17\xcc\x9f\x37\xa5\xb0\x9f\x83\x5e\x4d\xbf\x33\x0d\xb1\x49\x7d\x6a\x88\xc6\x69\x71\xb4\x51\xec\xdd\x56\xa3\x13\x18\x3f\x2d\x86\x3c\x03\xce\xb9\x04\x04\x9f\xd4\x37\xd4\xd4\xdc\x9a\xea\x7e\x6e\x1c\x03\x76\x6b\x76\xa6\x3c\x8f\xae\x86\xc0\xe8\x32\x7e\x67\x5d\xaa\xa8\xa6\x6b\xe1\x3a\x60\xd8\xc7\x79\x54\x56\xa6\x7c\x17\x31\x94\x10\xb3\xc0\x13\xbc\x8c\xbe\xfd\x8d\x69\x81\x97\xb9\x61\xcb\x59\x32\x3d\x82\x1c\x17\xe8\xa3\x94\xad\x06\xbc\x66\xc0\xa9\x72\x20\x08\xa2\xc5\x81\x11\x5d\x80\xde\x3f\x60\xcf\x83\x40\xb5\xbe\x0c\x05\x30\x1e\x9e\x39\x32\xf9\xe7\x08\xcf\x2a\x3c\x57\x75\xe5\xf1\xf7\xf5\x0a\x4f\x36\x49\xb2\x4f\x6a\x54\xea\xb7\xfd\x9a\x2d\x30\x03\x54\xa9\x16\x62\x33\xb1\x48\xa7\xef\x80\x9f\x56\xb7\x50\xef\x5a\x0b\xe0\x47\x3d\xe8\x62\xc7\x17\xd6\xdf\x89\xe4\xc9\x0a\x80\x62\x6d\xf8\xb7\xf5\x95\x57\x5f\x9c\x7e\xeb\xf6\x8c\xdb\x59\xe7\x7c\x8e\x51\x53\xa3\xe7\x0a\xa5\x62\x39\x82\x04\x26\xb6\x3f\xb8\xe2\x39\xa4\x03\xcc\x09\x91\xba\x61\xd3\xcc\xeb\x0c\x63\xff\xf5\x7e\x8b\xc9\x36\x37\x14\xa1\xca\xae\x5f\xdf\xef\xfb\x8a\xd1\x77\x09\x70\x5b\x40\xf1\x18\x36\xc1\xa9\x35\xed\xe6\x33\xfb\x7d\xd2\x9f\x04\x72\xf2\xf7\xa0\x58\x3a\x9d\x6e\x67\x71\xa3\x2d\x74\x8d\xde\x88\x52\xfb\xe1\xa8\xd3\x00\x03\xde\xd2\x82\x68\x16\xad\xf6\x1f\xac\x7e\xf3\xa6\x8c\xe7\x32\xfe\xdb\xb3\x17\xe9\x56\xd1\x21\xb4\x65\x7d\xe2\xa8\x1f\x0e\x2f\x4f\x8a\xb5\x3d\x31\x80\x5f\xd9\x23\x00\x6a\xed\xbb\xd3\x55\x29\xb7\xe7\x0f\xf9\x98\xf8\xe8\xfe\xd2\x2c\x3e\xdb\x78\xbe\x73\xa1\x62\x09\x06\xab\x24\xc5\x4a\x4c\xcf\x50\x32\xc9\x87\x5e\x27\x48\xa9\xec\x37\x49\x7a\xf7\x84\x05\x48\x26\xa0\x2a\x0b\xf9\x8e\xdc\x46\x0c\x85\xac\xd5\x4e\xb3\xd5\x68\xa7\x28\xcb\x19\x64\x70\x10\x5f\x2e\x64\xdc\xc2\x9e\xe1\x4e\xb2\x85\x3a\x35\x51\x96\x30\xf9\xd1\xc5\xb0\x3e\x43\x5b\x7a\x04\xb5\x1f\xc8\x35\xbb\xf2\x05\xa7\x7f\x09\x91\xfe\x74\xa5\xdc\xdc\x84\x4d\xd9\x9c\x71\xbf\x67\xa9\x33\x92\x25\x35\x46\xd9\x48\x2a\xad\xb8\x3b\x9c\x91\x09\x9a\x97\x50\x24\xa5\x41\x81\xb8\xc5\x77\xfe\x00\x2f\x5b\xb7\x88\x35\xf4\x51\x77\x47\xab\xfd\x2a\xce\x09\xf7\xd9\x33\x95\xe9\x35\x2e\xb6\x47\xcb\x3b\xcc\x4f\x96\x17\x3d\xc1\x41\xf9\xca\xde\x40\xb8\x54\x73\xb3\x96\x65\xd6\x7f\x63\xdc\x93\x61\x1d\x1f\x4e\x63\x7c\x97\x12\xe4\xa3\x3d\x0b\x8d\x3b\xce\x63\x4b\x54\x65\xae\xc7\xc7\xb0\xef\x6d\xa2\xac\x76\xbe\xd1\x36\x2c\x76\xcf\x20\xc9\x1a\x8e\x95\xc7\x1d\x65\xe7\x80\x91\x44\xb0\x79\x0a\x7e\x3f\x50\xf6\xb7\xdd\xc7\xcb\x85\x73\x06\x20\xfd\x7f\x0f\xf2\x7c\xa2\x55\x9b\xfd\x34\x91\x5a\x2c\x0c\x6b\xda\x5f\x9d\xa0\x71\x54\xa1\x2d\x8e\xe1\xb2\xda\x2b\x9b\x82\xa8\x10\xfb\x61\xc6\xb2\x94\x3a\xa2\x9f\x42\x13\xc1\x06\xcd\xef\xe3\x90\x55\xba\xb6\xe1\xb2\x69\xd4\xc2\x19\xe3\x87\xd3\x64\x44\xe0\xed\x0d\xcd\x11\xe5\x13\x10\xb6\x88\xf5\xbe\xc7\x3e\xa2\x04\x29\xd0\x6c\x9d\x94\xd4\xed\x7c\x2b\x3c\xdf\x48\x69\xab\xef\xcc\xaa\x7d\xa8\xc5\x08\x78\xd3\x60\x65\xef\xb0\x6a\x94\xb3\xfd\x7c\x00\x0a\xfe\x50\xbf\x17\xb3\xe2\x5c\x04\x30\xe6\x73\x88\xc1\xe3\xa7\x23\x85\xa2\x6c\x01\xa0\xa9\xc8\xa1\x08\x55\x97\x1d\x54\x8c\xca\xcd\xb1\xf0\x2b\x12\xca\x14\xbe\x98\xb8\x4b\x5e\xf7\x7a\xca\xd0\xf7\x52\x6a\x2e\x7f\x3b\xc9\xe3\x67\x63\x85\xcc\x69\xaf\xd7\x54\xd3\x6c\x76\xc0\x9c\x6a\x1c\xc1\xa3\xc5\x6d\x5f\x88\xe5\x79\xfa\xd8\xcd\x8d\x0f\x62\x4d\xd2\x9a\x70\x4e\x4f\xf2\x06\x05\x6e\x85\xcf\x5f\xad\x45\xbc\x77\x42\xc5\xba\x45\x09\x6b\xa2\x92\xd5\x9e\x05\x07\xfe\xf9\xdb\x99\x3b\xb8\xb4\x62\xfa\xb6\x5a\x80\x79\x84\xc7\x2d\x93\xf2\x63\x49\x69\x24\xd7\x27\x8b\xdf\x3f\x82\xac\x76\xf2\x5f\x5d\x0f\x00\xcc\xf3\xf7\xa5\x71\x0e\x31\xea\x87\xde\x4c\x2b\x00\xb5\xe0\x95\x1c\x21\x78\xca\x18\x79\x6c\xdf\xdb\x27\x15\x77\xd6\xb2\xc7\x3f\xbd\x84\x1a\xfc\xb9\xca\x20\xa8\xd0\xef\x52\x6c\xdd\xe0\xbc\x24\x2c\x00\x53\xf7\xe8\x3a\x3a\x24\xd3\x1c\x5b\x55\x18\x29\xf9\xd1\x0f\x56\x35\x58\xe4\x69\xe0\x65\x7d\xfd\x70\x43\x7a\xa7\x68\x18\x74\xf7\x4d\x1d\x0e\xac\x5b\x9e\xe3\x13\xb3\xde\x75\xa8\x07\x8c\xa4\x5d\x86\x0c\xb5\x39\x30\xab\x98\x69\xcd\x5a\x58\x1b\xa4\x72\x06\xea\x41\x01\xdb\xe7\xc6\xb7\x1a\x46\x2e\xe0\x6e\xb3\xef\xf7\x8a\xa8\x43\x85\xdf\x9f\x24\x03\xd4\x4e\x5f\xf1\x0f\xd6\xa5\x1d\xb9\x27\xf9\x4f\x15\xab\x82\x27\xa3\xdb\x41\xc2\x7b\x81\xd0\x29\x1e\x11\x27\x79\x37\xaf\x23\x13\x41\x50\xee\x00\xa9\xf9\x2a\x06\x79\xde\xbf\xc5\x9e\x75\xea\x4d\x4b\x44\xa0\x54\x04\x78\x4f\xf6\xba\xdb\x6e\x84\x3a\x44\x34\xb3\xba\x53\x44\x3d\x30\xc0\x11\x2e\xb1\xa5\x60\x88\x7a\x5a\x57\xe9\xee\x99\x73\x5b\x9b\x5b\x06\x0e\xf7\x44\xe3\x1a\xea\xf9\xd6\xb3\x21\xe6\x5b\x0a\x5e\x89\x1b\x32\x9a\x6c\xfc\x7a\xed\xe1\x26\xcd\x1d\xe6\xec\x48\x24\x23\xfa\x37\x30\x5f\xe1\x2c\x49\x4f\x8d\x35\xf7\x63\x1c\x78\xa8\x4d\x4f\xfe\xad\x7a\x11\x87\x30\xfe\xbc\x7c\x65\x06\x72\xe3\x4a\x99\xfb\x38\xae\xca\x9e\x2a\x99\x24\x09\x66\x81\x77\x95\x7d\x4d\x55\xf5\xc2\xd8\x41\x7f\x64\x84\xa1\x3f\x1f\x9c\xb1\x9a\x13\xaa\xda\x04\x41\x5b\x8f\x73\xe8\x99\x8c\x60\xf4\xa3\x86\x9a\xb7\x78\xc8\x3e\x4c\xbd\x53\xea\xe9\x0d\xbe\xd2\x12\xa5\x0b\xa8\xc3\xb4\x8c\x3a\x54\xff\xbd\x16\x8e\x1b\x37\x62\x78\x75\x33\x1d\x01\x0f\xc8\x83\xf7\x27\xb3\x99\x16\xa9\xbe\x8f\x9d\x4d\x36\x6f\x52\x02\x6a\x87\xb2\x2d\x99\x54\xfe\x06\x05\x15\x10\xa2\x17\x83\xf0\x66\xc1\xf7\xc5\x61\xe0\x91\xc7\x10\x7e\x5c\xb1\xaa\x1e\x6f\x96\x08\xe7\xf1\xc3\x7a\x4a\xa2\x7c\x3e\xeb\xf7\x31\x67\xdb\x54\x9d\xc7\xc1\x2d\x67\xec\x3f\xcd\xe1\xbc\xc5\x80\x2a\x63\x03\x54\x61\x76\x83\x48\x35\x4e\x72\x3d\x36\xbe\x32\xd9\xe7\xbd\x00\x0c\xc0\xd3\x0a\x5b\x7d\x61\x00\xe0\x52\x34\xe2\xce\xae\x89\xd4\xda\x4d\x8b\x2d\xe5\x36\x30\xe7\xa5\x7a\x37\x90\xa3\x85\x17\xdc\x12\xfe\x95\x9c\x7c\x3f\xfa\x9a\x97\xdd\x44\x72\xb1\xdc\x09\xb0\xdc\xba\x32\x55\x22\x91\xd9\xf9\xbb\xda\xfc\x19\xc1\xed\xe7\xf8\xc0\x48\x2e\x60\x3b\x2e\x01\xfe\x52\xc7\xbc\x4e\xa4\x2c\x16\x90\xd5\x08\x8e\x69\x31\xfa\xb4\xbf\x1e\x9f\x1d\x03\xbb\x8d\x2c\x20\x5d\x68\x82\x83\x53\x32\x8f\xa0\xa1\x1e\xbe\xbc\xf0\x9b\x66\xa7\xaa\x1c\x81\xd8\x61\x75\xd9\xf3\xf9\xda\x53\xae\x84\x5a\x2f\x47\x22\x2a\xe7\xbf\xd8\x25\x45\x5d\x63\x75\xab\x88\x50\xf9\xf6\xfc\xc0\x59\x2d\x3c\xaf\x72\x09\x04\x32\xf0\x3f\x24\xac\x33\x9b\xd2\xa5\x5d\x26\x30\x0c\x4e\x96\xc3\x55\x2e\x65\x49\x20\xb8\xfa\xe0\xf7\x00\x78\x06\x5e\xb0\xd7\xab\x5e\x6f\xf1\x29\xdb\xe7\xe2\x8a\x32\x48\x44\x3b\xfd\xa5\x83\xfe\xd4\xf5\xd2\x38\x42\x41\x94\x79\xd7\x53\x61\x6b\xf0\x06\xaf\x4f\x57\x02\x65\x7e\xe8\x13\xc7\x7e\x00\x0d\x87\xd8\xc9\x95\xfa\x17\xa3\x91\x52\xef\x6f\xdd\xcf\x7f\xc6\x99\x51\x67\x8f\xbe\x3c\x6f\x94\x5c\x1f\xe6\xb5\xfe\xaa\x1b\xa9\x5a\xc0\x58\x7b\xea\x75\x47\x46\xd5\xe8\xa8\x22\x16\xbc\xd9\xa5\x01\x0e\xf3\x90\x77\xb8\x02\x5f\x7b\x3e\x53\x01\x00\xda\x91\x94\x34\x54\x13\xdb\x3b\x80\xe7\x8d\xc8\x08\xf2\x13\x00\xe5\x0b\xa1\x1f\xed\x67\xff\x11\xf4\xc2\xa8\xb8\xc8\x5f\x2a\x2a\xdf\x85\xa5\xdf\xe9\x3c\xb5\x6e\x3f\xcd\x0f\xef\x7c\x27\x4f\xa1\x2c\x50\xf7\x2b\x3e\x91\xcc\xd9\x91\xd4\xeb\xef\xe1\x53\xd8\xa9\xa2\xf6\x14\xf9\xad\x55\x8d\xe8\xd5\x0b\xd7\xff\x98\x7c\xa6\x8b\x68\x05\x49\x61\xc1\xad\x95\x5a\x52\x0b\xe0\x9d\x70\x43\xe8\xdf\xba\x7d\x99\x0f\x6d\xd7\x1d\xa2\x02\x3b\x46\x08\xa7\x70\x1e\xed\x43\x62\x1e\xf5\x94\x74\xfa\xc7\x79\xd7\xc6\x8e\xb6\x43\xa4\xb3\x08\x2f\x50\x98\x14\x84\xac\x1b\xea\xda\x17\xd1\xec\x8b\xb5\xb9\xed\xad\x27\xdc\xee\xe2\x85\xf4\xfc\x60\x7f\x79\x5b\x50\x71\xdf\x39\xec\x42\x4f\x39\x04\xe9\x41\xea\x31\x03\x09\xc0\x20\x03\xe0\x6b\xe2\x0e\x3f\x47\x51\x56\x95\x27\x31\x2c\x5f\xe9\x95\x00\xa8\xf7\x1a\xcf\xc6\x39\x70\xcd\x4b\xa9\xde\x5f\x5b\x82\x12\x62\xc0\xb0\x43\xe0\x44\xd0\xc6\x7c\x6d\x9c\x99\x62\x32\x01\x2b\xa1\x8f\x24\x2f\xd5\x07\x95\x8b\xad\x47\x80\x1c\xf0\x8b\x0a\x62\xa6\xec\xf9\xb6\x1d\x1a\x83\xa1\x28\xc1\xf4\x6c\x1d\x9e\x74\x9a\x20\x5b\x4b\x57\xaf\x2d\x65\x52\xfe\xa8\xce\x59\xc9\xa5\x68\x0c\x39\x9e\xb8\xdd\x00\x57\x48\xeb\xfb\x56\x1e\xcf\x9f\xfa\xba\x4d\x9f\xc2\x68\x48\x78\x4b\x52\x27\xe0\xfd\x65\xe6\x14\xf8\x3b\xc0\xf1\xa6\xfe\x73\xde\xb8\x50\xe7\x69\xe0\xc2\x5b\x59\x1e\xcd\x21\xe7\x35\xc6\x6b\x66\x47\x9e\x79\xbf\x15\xa1\x16\x7d\x98\x5c\xa6\x59\xd6\xea\x8f\x55\x2f\x77\xc5\x85\xec\x7b\xe4\x5f\xf2\x3e\xce\x44\x52\x12\x80\xf0\x30\xbc\xce\xe1\x02\xaf\x0b\xbe\x2a\xed\x7b\xf7\x32\x7c\x03\x6a\x80\xa2\x19\xd4\x34\x16\x04\x0f\x04\xdc\xb6\x70\x5a\xf2\xed\x00\x16\xa4\xd9\x81\x80\x2f\x69\x82\x2f\x31\xfd\xd5\xb9\x2d\x7b\xaa\xde\x15\x2f\x04\x9c\xf7\x46\xd7\x6b\x0e\xc9\x3b\xaf\xe9\x2f\x23\xe8\x00\xf3\xe6\x6b\x27\x38\xfa\xeb\x25\xc3\x2b\x20\xcc\x92\x5e\x13\xfb\x26\x66\x1a\x1c\xe1\x8f\x0a\x6b\xc7\xdf\xf3\xd0\xbc\xdc\xd3\xed\x16\x6f\x0d\x5f\x00\x08\xcb\xb0\x52\x3b\x3d\x92\xbb\x3b\xe8\xaf\xa7\x90\x6e\x93\x22\xcb\x5d\xa0\x3c\x7b\x2a\x8e\x8c\x4e\x37\xa9\x28\x5a\x01\x4a\x6f\x30\x71\xc2\x7e\x16\x9c\x8d\x00\x91\x91\xf3\x3f\x21\xbe\x00\x7f\xa3\x63\x7b\xa4\x93\x6a\x92\x05\xec\x75\x3b\xcc\x00\x10\x58\x38\x87\x94\x0e\xe4\xba\x2d\x61\xad\xe3\x68\x40\xd0\x9a\xae\x6b\x9e\x32\xa1\x23\x8d\x24\x37\xc5\x49\x73\x90\xa7\x73\x04\xd5\x5c\x7d\x1d\xc5\x5f\x47\xcd\xb6\xaf\xf2\xda\xd7\x16\xf9\xca\x85\x1c\x2d\x3c\x4a\x18\x47\xc2\x46\x83\x3a\xf1\x2b\x59\xa8\x2b\x59\xaa\x3d\xd5\x71\xd9\xab\x6c\xc3\xf9\x11\xe8\xe5\x1e\xc3\x19\x04\x26\x3f\xb1\x0f\x09\xbb\x07\x0e\x2a\xc1\x85\x8a\xd7\xc3\x32\x20\x56\x09\x89\xd4\x4f\x17\x93\x4a\xfe\x0b\xa6\x5c\xfa\x2e\xcd\x5f\x9d\x21\x6d\xa2\xa2\x92\x11\x84\x78\x14\xfa\x2a\x08\xfb\x59\x5b\x42\x69\x8f\x48\x79\x14\x9a\x28\x02\x03\x73\x3c\xac\x48\xab\x6d\xd1\xa4\x9b\x88\xc1\xba\x20\xd4\xe1\x3b\x27\xfe\x17\x0f\xf1\x00\xe2\xfe\x76\xe3\xcc\xe3\xb6\x54\xba\x0a\xa9\xd9\x20\xb9\xae\x44\xb8\x36\xdd\x40\x8c\xd8\xbe\xc3\x52\x5f\x48\x53\x6f\x0f\x54\x8a\xbb\xf7\x5b\x32\xe3\xb7\x83\x21\xa6\x0a\x75\xf5\xf5\x47\xfb\xfd\x30\xab\xf9\xd2\x65\x58\x8b\x5b\x62\xc7\x0c\xd9\xe9\xc1\xf3\x7c\xc5\xcb\xbd\xec\x3e\xdd\x91\x90\x73\xf2\x21\x4e\x1f\x7f\xb8\x02\x58\x7c\x48\xb0\x62\xeb\x02\xcc\xe0\xdd\x1f\x92\x11\x3a\xdc\xc0\xf7\x31\xe5\x69\x16\x34\x54\xe5\xb1\xe3\xf8\x3c\xec\xef\x89\xf3\xfb\xed\xfe\xfc\x67\xbb\xfd\xee\xd8\x12\x62\xf7\x2f\x52\xfb\xbd\xef\xbf\xef\xa0\x7f\x92\xf5\x5b\x91\x9a\xb8\x5a\x55\xa8\x0a\x7b\x09\xf0\xec\xed\x6f\x67\x85\x36\x04\xfc\xfd\x67\x0d\x97\xcb\x33\xd3\x17\x10\x22\x4f\x6b\xdb\xf8\xaa\x26\x5f\xfe\x49\x7c\x2a\x09\xcc\xfc\x04\xcc\xc9\x0c\x80\x1d\x01\xd8\x81\xcb\xc6\x41\x12\xc6\x13\xce\xd1\x8e\x55\xc3\x6b\x6e\x23\x2f\x86\x78\x0d\x57\xcc\xa1\xdc\x76\x52\x9f\xdc\x1e\xfd\xd7\x41\x01\x98\xa8\x4a\xb0\x51\xe4\xe4\xda\x00\x0a\x93\xde\xee\xba\xf8\x8e\xc4\xf9\xe1\x76\x92\x4c\x7e\x88\x6c\x07\x30\x55\x06\xf8\x42\xbb\x12\x32\x79\x69\xdb\xc3\x84\xf9\x17\xbc\x40\xa5\x92\x87\x17\x06\xf2\x50\x61\xf2\xae\xdf\x23\xdc\xad\x53\xbe\xb0\xb7\x4a\x25\x93\xd5\xaa\x31\x22\x27\x72\x1e\xce\x6c\xfc\xf4\x32\xdc\x68\x2c\x7c\xde\x5d\xd9\x90\x9f\xba\x3f\x9e\xc2\x3b\x8c\xed\x0e\x60\x5e\xf0\xfc\x1b\x9c\x89\x84\xfb\xc3\x04\x21\xe8\xd8\xa8\x1a\xdb\xfa\x36\xee\x34\xcd\x05\x5d\x4f\xa1\x76\xe5\x4d\x80\x4a\x7b\x9b\x83\x71\xac\x0d\x78\x3f\x0f\xec\xe2\x78\xf8\xdd\x84\xbc\xd9\x5c\x19\xc9\x21\xdf\x70\x51\x88\x85\x89\x61\x2c\xe0\x5c\x74\x32\x78\xf3\x9b\xfd\x01\x96\xc3\xf7\x1e\xf0\xb7\x3d\xae\x9b\xd7\xdd\x57\xcf\xc2\xb7\xe6\xb7\x5b\x4b\x0f\x2d\x67\x58\x1b\xe4\x06\x21\xbd\xec\x77\x12\xa6\xee\x30\x34\x13\xad\xf1\xd8\xb3\x5a\xb0\x45\x10\x2a\x4e\x7a\xce\xad\xb5\xb3\x22\xff\xc7\xef\x15\xa1\xf3\x1e\xae\x8d\xff\x94\xba\xe6\xcf\xd7\x13\xde\x7f\xdb\xbc\xfb\xac\x7c\x0d\x75\x18\x04\x0e\x8c\x72\x9a\x08\x10\xe0\x50\x98\xfd\x51\x2c\xf1\xe0\xc9\x1e\xf0\xc7\x39\xf7\x08\x29\x3d\xc8\x4d\x83\xf7\x33\xe1\xd3\xf9\xfd\xe9\x95\xb8\x77\x90\x70\xcd\xfc\xe0\x0a\xd9\xbb\x61\x8e\x1f\x9b\x18\xd4\xae\xf1\xe9\xef\xfb\x21\x56\x3d\xd4\x46\xf8\xf8\x05\x96\xbe\x26\x67\x3c\x66\xaa\x2a\xe7\xc3\x70\xc6\x96\xbc\x3f\x0d\x47\x5e\xcf\x5e\xde\x3e\x8a\x51\xec\x8e\x65\xc4\xb3\xe4\x83\x00\xfb\x34\x0e\x86\xdb\x69\x47\x09\xf5\x3b\xc4\x3b\xb0\x6e\x2d\x34\xed\x7b\xc2\x73\x07\xf0\x70\xcc\x32\xd2\x19\x36\xb1\x71\x36\x13\x28\x98\xb4\x23\xdf\xe7\x37\x0e\x05\x29\xfb\xf8\x5a\xf0\x5e\x5e\xe1\x5d\x83\x2d\xf7\xc0\x8b\xfc\xac\x34\xf9\x17\x2b\x1a\xcd\x6e\x5a\x97\xa0\x9c\xc9\x04\xeb\x47\xdb\x15\x26\xc5\xb8\x62\xce\xba\x7c\xef\x0b\x91\xb2\xfa\x07\xa9\x22\xf2\xcd\xb8\x15\xfc\x3c\x2a\x9c\xcd\x2f\xa2\x9f\xea\x91\x4f\x3c\x42\x79\xde\xb8\xaf\x0f\x10\xfe\x21\xf7\x08\x94\x98\x35\x2f\xf9\x00\xc9\xcc\xad\xee\xba\xe1\x77\xc0\x29\x1e\x2d\x9f\x3c\x5c\x19\xfa\x4c\xf3\x1e\x2a\xae\xb0\x5e\xfd\x5a\x7d\xb4\x05\xd1\x9c\x80\x5b\xd3\x1f\x99\x85\x3c\x51\xc6\xa7\x16\x52\x99\x46\x91\xe6\x90\xed\x8c\x48\x89\xf5\x25\xb9\xcf\x75\xf9\x37\x1f\x80\x31\xfd\xfa\x29\x7e\xca\x18\x08\xbd\xf4\x43\xbf\x18\xa3\x28\x71\xc7\xef\xec\x03\x79\x82\xdc\xe9\xb8\x99\xe5\xe9\x20\x60\xfa\xba\xcc\xf0\xd1\x84\xb1\xbd\x21\x79\xe6\x43\x70\x45\xf1\x1b\x7f\x31\x16\x20\xb7\x8a\x6e\x05\xb8\x96\x50\x8a\xdd\x27\x96\x97\xb0\x76\x80\x41\xfd\x51\xc3\xc7\x8e\x14\xf6\x68\x7d\x1e\x1f\xb3\xd6\x5e\x81\x61\xe1\xcb\x3b\xf1\xa7\xaf\xf3\x27\x1e\x70\xa0\x6d\x27\xc0\xe5\x15\x62\xf5\xfd\x90\xb6\x0f\x77\xe5\xc4\x0d\x6c\xcb\xfa\x36\xd2\x21\xcd\xe0\x8d\x55\x8d\x04\x37\xd3\x04\x56\xa8\xeb\x6f\x7d\x05\xae\xdd\xbc\x6d\x35\x98\xaa\x07\x25\xde\xd2\xd9\x52\xb8\x06\x43\x52\x51\x7a\x3d\x9e\xe2\x03\x44\x50\x7d\x36\xf5\x7c\xfd\x2a\x4f\xf1\xd2\x65\xfe\x73\x6f\x0f\xaa\x41\x83\xea\xae\x48\x18\xfd\x57\xc3\xfb\x08\x15\xa0\xc2\xfa\x5d\xe6\x5c\xc1\x0d\xef\xff\xfa\xa7\x23\x99\x1c\xe5\xbf\x0f\x30\x91\x6b\x70\x43\x95\x40\x87\xfd\x96\xd3\xac\x3b\x97\xc6\xf2\xa3\xf8\x99\x72\xff\x48\xb8\xcc\x0e\x6d\x62\x1d\xf3\xe5\x5d\xc5\x41\xc5\xcc\x38\xd3\xc9\x1c\xfa\x7d\x4e\x82\xb3\x01\xa0\x2f\x84\x5e\x41\xd0\xac\xf7\x5e\x5f\x20\x66\x3a\x72\xad\x77\x74\xf8\x51\x4e\xbe\xdb\xe4\x9e\xeb\x62\xc5\xe5\xc5\x55\xef\x82\x51\xca\x9c\x60\xe7\xb1\xf4\x71\x2d\x20\x04\x95\x72\x3d\xbb\x57\x95\xb5\x15\x96\x89\xa8\x71\x03\x89\x29\x23\xee\xbb\x69\xa2\xc6\xce\x99\x43\xc0\x6e\xfa\xc9\x69\x2a\x0b\x4e\x71\x96\x22\xb3\x94\x3e\x3f\x8a\xb1\x6b\x2f\x79\xdf\x64\x5b\x55\x17\x5b\x11\x6b\xf9\x26\xbb\x58\xfb\xc6\xa3\xf8\xcc\x4c\x99\x74\x05\xf9\xde\x49\x00\x6e\xfe\x8a\x1b\x93\x13\x2d\x55\x68\x3f\x69\x33\x20\x3f\x82\x13\x8b\x46\x7b\x7f\x1d\x08\x6a\x32\x3f\xfb\xd2\xf0\xbd\x77\x87\xbf\x80\x89\x63\x6f\xf0\x3e\x0b\xb5\xc7\xee\x94\x70\x1d\x1c\x96\xcf\x29\xdc\x18\xc5\x9f\xfd\xb3\xef\x63\x31\x58\x45\x1e\xe4\x48\xde\xa9\xbb\xab\x53\x24\x01\xbc\xa7\xc5\x09\xbe\xcc\x1e\xa7\xb3\xd0\xdf\x51\x7f\xc8\x61\x1f\x2a\xdf\xfb\x4c\xb6\x75\x67\x5d\x03\xa6\xa9\x9d\x6a\x75\xcd\x24\x82\x36\x3b\xfe\xba\xde\xb3\x2c\x66\x96\x3a\xf3\x50\x79\xff\x08\x5d\xa9\xa7\x19\x06\x29\x7f\x75\x2d\xf2\x5a\xb5\x54\x1f\xa8\x31\x87\x4c\x7b\xbc\x20\xa9\x39\xff\xee\x13\xcb\x73\x53\xf7\x94\xcf\x37\x05\xc8\xba\x87\xe7\xd2\x9c\xbe\x3f\xc9\xe7\xc3\xcf\x6c\x58\x4d\xc2\xc5\xb1\x64\x8e\xcb\xcc\x91\xaf\xf8\xfe\x3a\x6e\x0d\x43\x56\x9c\x73\xa3\xdb\x1b\x70\x4d\xbc\xd2\x1e\xd1\x17\x3b\xef\x2e\x9b\xba\x8d\x0a\xeb\xf4\x6b\x44\xda\xd9\x65\x0d\x9c\xb7\x23\xd9\xc5\x0f\x36\xec\x48\x85\x58\xd9\x35\x55\x72\x25\x32\xc8\x29\x67\x26\xec\x55\x8f\x3d\x9d\xf3\x7c\x8b\x55\x21\x81\x1f\xde\x26\x1e\x8b\x5c\x80\x31\x13\x8b\x0f\xc8\xf1\x55\x4f\xbe\x58\x2f\x32\x2a\x2a\xb2\xca\x7c\x60\xd7\x84\x95\x88\x15\x9c\x28\x4c\x68\xae\x50\x44\x19\x02\xcd\xf3\xca\x6a\x6f\xc2\x53\x67\x74\xcd\x15\xf6\xea\xbc\x00\x11\xd6\x85\xe5\x05\x35\xe8\x5f\xd8\x2c\x06\x7d\xc2\x66\x0e\x29\x0a\x35\xa3\x57\x2f\xec\x7d\xe0\xee\x89\x33\xde\xaf\xa1\xc9\x26\xab\x28\x10\xf4\x57\x7e\x2c\x2d\x9c\x64\xdf\x56\x6a\x28\x62\xa8\xb5\xf0\x3e\x46\xf8\xf6\x92\x74\xc6\x47\xc3\x8f\xf1\x43\xa7\x50\x00\x97\x60\xb3\xbd\x5b\xa7\xe0\x10\x84\xe4\x9c\x4b\x6a\x43\xac\x36\xc4\xee\x99\x6d\x4a\xd6\x5f\xbd\x0a\xde\x2f\x72\x93\x20\xb4\x65\x84\xd5\xf6\xcd\x18\x00\xf6\x2e\xb6\xd1\xd3\xbb\xef\xc6\x93\xe8\xdd\x1e\x2f\xd2\xfa\x20\x63\x6b\x63\xef\xec\xfe\x0e\xc1\xf3\x0b\x70\xd7\x0c\x70\x62\x92\x5d\x1d\x94\xff\xd4\xe1\xb7\x3f\x8f\x62\x53\x19\x80\x90\x31\x58\x6f\x63\xb3\xc7\xfd\xfd\xfc\x3d\xe6\x5e\xb1\xe5\x19\xcf\xe1\x7d\xd4\x32\xf7\xfc\xf4\xf7\x33\xcb\xf1\x16\xac\xdf\x8f\xb1\x81\x9d\x1c\xe8\xc9\xb6\xd2\x0e\x52\x6c\xfd\x7e\xa9\x2c\x11\xd5\x80\x73\xc4\x3f\xbc\xa9\xe6\x47\xa2\x1c\x8d\xbe\xb7\x4d\x79\x90\x2f\x4e\x7c\x2a\x1f\xc0\xf5\x5d\xb6\x70\x4c\xbe\xad\x31\xfe\x8e\xcb\xfd\x04\x7b\x86\xd5\x60\xc6\xbd\x7b\x79\xaf\xd2\x97\xf5\x7b\x61\xdf\xd3\x0c\xff\xe6\xaa\x7b\x95\x8e\x0f\xfc\x71\xbc\xcd\xac\x39\x73\x8d\x7e\x76\x53\x10\x94\x04\xb5\x94\x0f\x00\xfd\xee\x02\x41\x50\xdc\x3b\x78\x4a\xd5\xcd\xec\x8a\x66\x30\xdb\x86\xfc\x81\x90\x19\xc2\xbd\x4e\x6a\x20\xec\x9a\x09\xf2\x6f\x23\xee\x8e\x8a\x82\xe4\xcd\x2c\xb6\xeb\xd0\x6b\x86\x97\x36\x82\xee\x53\x68\x1d\x31\xcb\x81\x73\x02\x98\x17\x04\x31\xda\x6c\xbc\x38\x5c\x5f\xd2\xba\xa3\x9a\xc5\xa3\xa4\xf3\xfe\x8d\x77\x72\x12\xfc\xd8\x1a\xf2\x93\xf2\x8f\xfc\x1d\xe4\x15\xb6\xfd\x1e\xfd\xe7\xf6\x8b\x5c\xe9\x55\x87\x42\xe5\xa9\xd3\xdd\xf3\x30\x88\x97\xad\x3a\x66\x3b\xb2\x62\xdf\x4e\xd5\xf3\xa1\x5f\x04\x2a\x9c\x33\xb0\xbd\xdd\x9e\x44\xc0\x17\x2e\xcd\xb3\xd3\xaf\x5e\x6e\xef\xc5\xbc\xcc\x20\x54\xa5\xc9\x14\xf7\xe2\x7e\xda\x7b\x78\x41\x89\x83\x6d\x23\x1e\x29\x2e\x53\x9e\x61\x1d\xc0\x3c\xb2\x35\x32\x7a\x10\xfc\x5f\xca\xdb\x8f\xcb\x8c\xb0\x2e\xb5\x3d\xe8\x5a\xa2\x02\x09\x24\xf9\x72\x31\xc2\x09\xd6\xb2\x14\xaf\xf3\xe9\x93\xfc\xc8\x7c\x0d\x40\xca\x62\x83\xf7\xdc\x33\x2e\x96\x86\x24\x5b\x35\xfa\x11\xbc\x9e\x23\x85\xd1\xc6\xbd\x3b\x73\x73\x53\x1d\x86\xfb\xb2\xfd\xd8\xb9\x4d\x58\x3e\xbe\x4f\xd4\x19\x2e\x7e\xdc\x59\x16\xb5\xaf\x2e\x0d\x74\xf3\xf4\xe3\x70\x03\x06\xef\xf2\xc2\x13\xd0\xfe\x3c\x7a\x61\xcb\x47\xb1\x61\x0d\xef\x2e\x4b\x4c\x26\x50\xdc\xb2\xc7\xea\x84\xa8\x61\x98\x8b\x7f\x12\x1c\x82\xd5\x5c\xfd\xed\x70\x48\xb2\x92\x97\xc1\x81\x1a\x6f\x05\x07\xdb\x9b\xcb\x86\xa4\xc7\x02\x17\x0a\x4f\xc6\xa5\xaf\x75\xef\x00\x6e\x80\xe3\x49\xe0\x37\xe7\x0a\x13\x1c\x50\xf7\xec\xc9\xef\x7e\xf3\x78\xde\x4e\x66\x35\x2a\x3e\xfe\x88\x20\xf1\x7d\xed\xc3\xf4\x9a\x41\x1e\xa2\xf0\xcc\x9d\x06\x3c\x2b\xa7\xdd\xcf\x41\x1f\x62\xae\x68\x63\x19\x7b\x5f\xb4\xc3\x7b\x67\x74\x91\x22\x52\x3a\x14\x52\x8e\xfc\x0e\xfe\x5a\xb2\x38\xd9\x81\xd8\xe1\x5b\xae\x44\xc1\x83\x55\x30\xe4\x4d\xdc\x52\xa7\x59\x7a\xb8\xc2\x62\xb7\xca\x0d\x6a\x50\x27\xfa\xad\xbb\x01\x1c\x35\x3a\x06\x93\x92\xa2\x08\x73\x3f\xbc\x12\x3d\xdf\x6f\x0a\xde\x45\x88\x69\x70\xf7\xe1\x45\xf9\xcb\x95\x7b\xe0\xc6\x5d\x6a\x8d\x57\xfd\xb7\x2e\xe4\x01\x05\xb6\x61\xbf\xc8\xc4\xc8\x9a\x3b\x97\x66\x3c\xf0\xb0\x28\x04\xf1\xd7\x14\x3d\x0a\xa7\xd3\xf1\x13\xc4\x91\x14\x3b\x15\x06\x1f\xa3\x2f\xd1\x63\x92\xbb\xc3\x8e\x18\x36\x93\xaa\x1c\xdf\x4b\xa6\xf5\x48\x76\x8a\x9e\x34\xc8\xf0\x6f\x05\x67\xd1\xf1\x70\xd4\xd6\x96\x05\xb1\x99\x7d\x90\xdf\xb5\xaf\xb8\x7e\x1b\xf5\xe0\x79\x1c\x67\x18\x38\xcd\x22\x9d\x91\xbf\xd8\xd4\x94\x08\x0d\x80\xe1\xb5\xa7\xa1\xc8\xb6\x95\x8b\xd9\x9c\x7a\x4c\xee\x21\x62\xee\x47\xfd\xe6\x1b\x91\x6f\x1e\xfe\xb4\x77\xe1\x3d\xdb\x3d\xf9\x6c\x44\xd9\xe3\xef\xad\xb2\xd9\x76\x51\x2c\x2b\xfd\xc6\xf4\xdb\x3e\x4d\x00\x33\xdb\xbe\xf9\xf9\x68\xe2\xa3\x12\x6b\x4f\xf0\x5d\x47\x52\xd5\xaa\x5c\x85\x8c\xc1\x28\x22\xf7\x9e\xdf\xe2\x3b\x33\xe8\x97\x75\xa8\x6b\x74\xec\x67\x9b\xa3\xcf\xd8\xca\x89\x27\xf6\x4c\x6f\x00\x1e\xcd\x93\x5c\x09\xfc\x67\xc9\x90\xbc\x7c\x84\x23\x02\xd2\x4b\xec\x03\xc2\xf4\xd9\x3b\xf9\x96\xe6\x92\x24\x6a\x52\x46\x68\xb8\xd5\x56\x55\xa4\x1c\x4b\x72\xea\x6d\xc3\x8d\xd1\x1a\x18\xa5\x70\xdb\xc5\xe1\x4c\xd2\xa0\xc2\x6e\x5d\x27\xaf\x7a\x4a\x39\xd1\xa7\x7d\x5d\x23\x2f\xec\x76\x0e\x87\xe2\xdd\x7e\xbb\xd7\xf1\x0d\xad\x8c\x17\xb2\x4b\x56\xe4\xd2\x68\xa0\xa6\xba\xda\xea\x57\xb8\x08\x2d\x2d\x88\xa2\x86\x89\x70\xe7\x83\x89\x52\xb5\xfa\xfb\xac\xf9\x18\x63\x96\xf5\xeb\x68\x54\x0f\xf8\x05\x29\x77\x5a\x71\xd7\x07\xbe\x7c\xc9\x7e\xdd\xd4\xf6\x77\x3e\xad\x0f\xdc\x46\x6d\xab\xa9\xc1\xb4\x8f\xe1\xf3\xa9\xc8\xd2\x74\x8d\x1f\xef\x0a\x1a\x60\xa7\xf4\x95\xe5\xf4\xec\x3f\x42\x5f\xf4\xbf\x4f\x9a\x7a\x00\x53\x51\x24\x71\x94\x48\x54\x66\x01\x87\xd4\xef\x4b\x93\x20\x85\x99\x49\x4b\x31\xbb\x7b\xf6\x9b\xfa\x75\xa1\xec\xa8\x7f\x3f\xdf\x0d\xf1\xf6\xd5\x1a\x36\xd8\xc5\xf2\x6f\x01\x94\x1c\xad\xaa\x85\xd7\x8a\x93\x8d\x64\x10\xbd\xec\xd3\xbf\x12\x80\x28\xa7\x55\x5b\xcc\xf7\xed\xfe\xd3\x44\xb3\x1b\x92\xa1\x9e\xf0\x07\xc5\x15\x37\xef\x89\x4f\xa7\xd5\x16\xb8\xce\x54\x39\x66\xfb\x67\x76\x0b\x96\x94\x5b\xdb\xb8\x43\x76\xf6\xf2\x6d\xb5\xc5\xf9\xc7\x1a\xee\xe1\xfd\x28\x4a\x9b\x58\x5e\xd9\x8b\xbf\x39\x04\x87\x2e\xd5\x0b\x29\x1c\xb9\xd1\x9b\x58\x01\x47\xc0\x92\x5b\xa5\x83\x3f\xa3\x0b\xa2\x71\x09\xb7\x32\x78\x3b\x00\x58\xa7\x56\x37\x4a\xfb\xcd\xdf\x13\x60\x30\x22\xc9\xdd\xaa\xed\xcb\xef\x8d\xbe\x2d\xfb\x0f\xeb\x15\xaf\x89\xbf\xda\x07\x18\xae\x25\xa5\x78\xdc\x2f\x43\x58\x38\xaa\x78\x9b\x1f\xa1\xf2\x9d\xc8\x11\xee\x9d\x92\x90\x1d\x71\x8d\xdc\x81\xa5\xd8\x8c\x10\xce\x43\x28\x04\xd7\x6a\x19\x9b\x8c\x44\x8d\xa0\x0f\x47\x70\xbd\x6a\x73\x51\x17\xdb\x80\x8f\x40\xc6\x5d\x55\xaf\xc6\x3c\xb3\x5e\x54\xd2\x39\x05\xe9\xd7\x6e\x87\x36\xde\xcc\xf6\x9d\xc0\x3e\x47\x82\xf9\x81\xf3\xdc\xaa\xda\xa4\x1c\x80\xae\xb4\x0b\xb3\xe4\xd6\x03\x79\x76\x27\xfc\x1f\x73\x07\xce\xf9\xb3\x95\x54\xef\xfd\x31\xd4\x0a\xd5\x7b\xde\xf3\xe1\x53\x40\x2d\x3a\xec\xac\x37\xf0\xc2\x78\xcd\x8e\xc8\xe5\x89\x70\x02\x9b\xa0\xe5\x48\xa0\xc4\x88\xc9\x1d\xc8\xfb\x9f\xd0\x49\x7f\x1f\xef\x81\xa0\x6d\xcd\x53\xab\x78\xa3\x39\xc0\x39\xb4\xfb\xbd\x0e\x5f\x6a\xdb\xb3\xca\x03\xb7\x01\x5a\xcb\x25\xb3\xb5\x2e\x3f\xca\xe3\x56\xa0\x54\x5b\x40\x3f\xc2\x52\x32\xb7\x27\xed\xd0\x97\x33\x5e\xac\x3a\xb6\xb8\xfa\xa8\x3c\x5a\xfb\x2e\xef\x36\x43\xc7\x15\xea\x52\x3c\x6a\x7f\xba\x95\x8e\x3a\x04\x44\xe1\x72\x43\xa1\x3e\xd2\x2a\x09\x52\xe2\x0b\x9e\x9d\xfd\xc2\x32\xb0\xff\xd1\x21\x7e\xc1\x6e\x6a\x37\xbc\x70\x53\x8a\x08\x92\x5b\xaa\x37\xdb\x6a\x87\xe9\xcb\x1f\xef\xf6\x5b\x72\x60\xec\x32\xb5\x9b\x20\xe4\xdd\x32\x15\xf0\x53\xbe\x81\x8d\xa4\xda\x69\x69\xa9\xc4\x71\x66\xe8\x1a\xca\x3a\xf4\xb2\x95\x0a\x98\x7e\xef\xe3\x22\x92\x0f\x6e\xef\x1f\x32\xec\xc9\x4a\x00\x4d\xf7\x8c\xd2\x61\xd7\x4c\x34\x39\xd5\xbf\xd9\xf3\x68\x9c\x59\xa7\xdb\x72\x47\x4e\xee\x5a\x5e\x08\xba\x99\x95\x78\x08\x49\x2d\x11\x20\xec\xc2\x16\xbf\xd5\x8d\xea\xda\x5b\x00\x4f\x64\xa3\x26\xf4\x27\x2f\x11\x53\xf0\x1e\x45\xb8\x07\x41\x16\xcf\xfd\x45\xe4\x1d\xf5\x71\x6d\x36\x61\xbd\x2f\x14\xde\x9e\xd7\xf0\xb0\x4e\xfe\xa7\x10\xd1\x77\x18\x83\xb9\x72\x8d\xcb\xdc\x0c\x9b\x08\x2a\xed\x3e\x25\x7d\x14\x03\xac\xae\x4e\x65\xc4\x54\x22\xdc\xb4\xc4\xfd\x86\x2b\x6b\x5e\xf0\x9e\xd1\x7c\x0d\x59\xb2\x3c\x52\x0b\xbb\x03\x36\xa6\x2d\xa1\x7c\x17\xf6\x57\x69\x26\x86\x2b\xf0\x22\xdf\x93\xeb\x5d\xd2\xd6\xa7\xec\x44\xf8\x23\xce\xb0\x70\xf9\x26\xb8\xde\xd7\x49\xd9\x93\xc8\x40\x6a\x57\xee\x54\xfb\x52\x3d\x5f\x20\xdb\xfd\x08\x83\x17\xbe\x21\x33\xfc\x06\xa6\x70\xc7\x53\x0c\xcb\xac\x70\x02\xe9\xc7\xdb\xbc\xa1\xce\xa1\x9a\x11\x61\xef\x00\xd2\xaa\x0b\x5a\x8e\xa8\x26\x9a\xd4\xea\xa4\xb7\xfb\xf2\x7d\x7c\x3e\xcd\x20\x82\xfc\x42\xe4\xf2\x33\xfc\x14\x51\x4d\xb2\x6a\xd5\xa5\x24\x27\xdc\xc9\xc7\x5b\xf5\xc4\xa6\x60\xe1\x7e\x81\xe3\x8a\x59\x04\x29\xd1\xac\x30\xde\xb7\xa4\x3d\xcd\x96\xe1\x4e\xa4\x0d\x9a\xbd\xae\xd1\xf9\x51\x04\xc0\x4e\xc9\x7e\xb8\x3d\x2e\x69\x53\x75\x92\x01\x87\x83\x7f\xfd\x99\xef\x12\x9e\x17\x5d\xb9\xce\x52\x9f\xf6\x33\x38\xa7\x49\xfb\x84\x5c\x45\x6c\x83\x9c\xfb\xf4\xc0\xcb\xe7\xb4\xa4\x08\xbf\xbf\xb5\x3a\x7c\x9c\x71\x40\x1b\x65\xfd\x2e\xc0\xd1\x29\xfa\xcd\x22\x18\xb8\x6b\x04\x61\x0b\xf6\xf5\x50\x5b\xaf\xb1\x71\x5e\x67\xdd\x62\x24\x57\x0d\x04\x7c\x58\x07\xfe\x75\x67\x45\xda\xa2\x5c\x03\x6c\x10\xab\xe6\xf3\x39\x27\x8f\x3a\x31\x5e\x51\xec\xf5\x37\x6d\xed\xd6\x5d\xd4\x5a\x73\xa4\xbc\x29\x55\x0c\x8f\xc8\x45\xef\x4d\x1a\xaf\xef\x13\x2e\x86\xa3\xba\x54\xb6\x72\x81\x67\xfb\x81\x4e\xce\xf5\xfb\xa3\xcf\xc4\xb3\x12\xa5\x0a\xe1\xac\x20\x9e\xe6\xc3\xc3\x36\x04\x1d\xc3\x99\xfc\xd2\xea\x21\xfc\xc0\xbd\x46\x32\x52\x07\x3b\x67\x14\x44\x41\xa4\x8b\x2c\x22\xde\xb9\x26\x16\x57\x3e\x55\x86\x97\x79\x77\x0f\x51\x6c\xf0\xba\xb8\x11\xf3\x5e\x19\xea\xaf\x7c\x9e\xbf\xf6\x8e\x6f\x80\x9c\x09\x6f\x4d\xfc\x8a\xe8\xbd\x41\x39\xc0\x3d\x6e\x94\x2d\xfd\x3e\x45\x20\x80\x1c\x09\x8c\x6a\xd3\x9e\xc0\x47\x01\x01\x80\x77\x68\x55\xb5\xed\x42\x11\xb6\x13\xf7\x4d\x94\x2f\x4e\x5b\x83\x94\xea\x9d\xdf\xbc\x82\xeb\x98\x70\xd8\xb7\x30\xf9\x7b\xaa\x5f\x0b\x89\x94\x2b\xe0\x0f\x8e\x1c\xac\x63\x39\xe3\x9f\x1f\xd3\x52\x4c\x0e\xbe\xff\x61\xea\x08\x7b\x57\x60\x5b\x22\x9b\xa3\xf9\x0a\xef\x04\x26\x9a\x5d\x21\x66\xab\xf0\x2a\xc2\x5f\xf8\xae\x70\x93\xc9\x05\xa7\x52\xe8\x20\x4a\xc7\xc5\x13\x8d\xa2\x5e\x1c\xed\x76\x4a\xe8\x95\x69\x3f\x2e\xcb\x3f\x2a\x38\x1b\x3a\x4a\x20\xcc\x34\x98\x85\x6f\xe9\x4a\xcc\xb6\xd0\x13\xe9\x8b\x2d\xa3\x4b\x7f\x6e\x7f\x5a\x3d\x0e\x41\xb0\xbe\x21\xf1\x00\x2b\xd9\xdd\x88\x27\x39\xf2\x0d\x4f\x40\x1b\xf8\x3e\x74\x78\xde\x83\xa0\xc0\x7b\x74\x73\xd8\x4a\x37\xf4\x93\xd8\x0b\x38\x94\xfd\xe7\x00\x57\x9c\xd3\x7b\x8c\x04\x5a\x17\xed\xc8\x88\x03\xf4\x9e\x45\x77\xb8\x9b\xc2\xfd\xad\x41\x13\x3d\xbf\xd8\xad\x6f\x7b\xf4\xf4\xa2\x99\xd6\x8c\x4c\x2a\x59\xbf\x42\xc6\xdf\xaf\x62\x7f\x3f\x19\xe0\x69\x0c\xe9\x3d\x9e\xb7\xc1\x1b\x89\x00\x8d\xa1\xb2\x2d\x0a\xe6\x6e\x71\x56\xc4\x89\x7e\xed\x7b\x78\x20\xb9\x9c\x7d\x1e\xe7\x16\xdc\x38\x4b\xaa\x26\x13\x3c\xf0\x82\xa6\x66\xeb\x2e\x77\x5e\x31\x10\xfe\x21\xfa\x49\x3c\x4d\x00\x0b\x1d\x26\x70\x29\xb7\xbc\xa5\xbd\x71\xc7\xb0\x3c\x7a\x6b\x77\xa1\xca\xee\xe6\x35\x55\xe3\x0f\xb0\x02\xa7\xc8\xc8\x88\x07\x7c\x2d\x5d\xbc\x4c\x2b\x3f\xd1\xf7\x40\x9d\x91\xda\x65\x09\xd8\x31\x46\xdb\xd7\x92\x02\x8c\xe3\x1b\x86\x08\x5b\x94\xbb\xc6\xb3\x3b\x7f\xdb\x00\x89\x75\x9e\x1b\x4a\x02\xff\xe9\x5b\x5f\x65\x7d\x9e\xe7\x29\x80\x08\x9e\x5e\xc4\x5f\x11\x9a\x58\x20\xbc\xc5\xb0\x07\x7d\xcf\x75\xd2\xe1\x5f\xaf\x23\x2b\x2a\x3f\x36\x91\xb2\x5c\x40\x10\x79\xd3\x8f\xea\xd3\x1a\x3f\xd7\xd8\x22\x5f\x67\xb4\x07\x6b\x77\x37\x53\x2a\xa1\x2e\x23\xba\xf3\xdb\x81\xb6\xbb\xfd\x68\xb9\x52\x99\xde\xf8\xb3\xf7\xa2\xe3\x5d\xa1\xec\x1a\xb0\x80\x2b\x44\x4f\xff\x55\x00\x3b\x89\x00\xf6\x05\x58\x6e\x0c\xde\xf0\xae\x7d\xe3\x90\x11\x89\xc5\x78\x7d\x31\xd6\x50\x45\x17\x35\xbf\x42\x40\x9b\x56\xb3\x5a\x1e\xe2\x52\x21\xbb\x31\xe3\x34\x0d\x70\x0b\xdf\xd5\xa8\x2a\x94\x43\x91\xe1\x85\x24\x09\xfc\x0f\x41\x8b\x23\x0b\x40\x66\xcf\x2a\xc9\x9b\x6f\x53\x40\xf2\x1f\x09\xde\xe3\xf4\x27\x95\x04\x65\x36\x08\xc6\xcd\x6d\x6e\xc9\xf4\x7c\x50\x03\xa2\x55\x05\x92\xbf\xcd\x66\xfc\x74\xa7\x23\x9e\x19\x66\x9f\xdd\x6d\x57\x40\x54\x4a\xeb\xc4\xc2\x87\x20\xfb\x01\x07\x94\x36\xe8\x2f\xf8\xfb\x4c\x4e\x93\xd3\x69\xf7\x17\x39\xcb\x60\x0e\xcb\xf4\x39\xd7\xdd\xe8\x12\xa4\x54\xd1\x3b\x65\x00\x1e\x10\x73\x48\xb1\xa5\x8a\x0c\xa8\x9c\xaa\xa2\x2a\x1c\x61\x87\xfb\x4a\xf5\x09\x71\x8f\x6d\x00\xa7\x12\x6a\xfc\xe0\xe0\x8a\x57\xde\x6a\x8f\xbc\x15\x41\x7a\x99\xb0\x5e\x7b\xcf\xd6\x57\x47\xdc\x62\x9e\x7c\xc0\xd2\xd5\x10\xc4\x03\x9d\xb2\x68\xa1\x52\x5c\x9a\x15\xe8\xba\x45\x77\x04\x5d\x40\x6e\xc9\x4e\xfa\xb6\x49\xae\x69\x3c\xa4\x32\x6b\xcd\x47\x68\x4b\xc2\x77\xf5\xa2\x78\x7f\xcb\x4b\xb0\x18\x3a\x0e\x32\x05\x95\x19\x73\xbe\x0c\x2f\xb4\x21\x09\xb4\x5c\x3c\xdb\x0a\xbc\x19\x7c\x8e\x5a\xcf\xec\x90\xbc\x69\xb8\xf1\x39\xb7\xd8\xf2\x69\x38\x39\x20\x53\x53\xf8\xbc\x1f\x79\x09\xbc\xa2\x2e\x98\x7b\x5b\x9a\x45\x75\x54\x0a\xff\x15\x3e\x7a\xad\x08\x33\x20\x7d\x77\x51\xec\xfb\x53\x21\x33\x1d\xe3\xbd\x45\xe4\x64\x0f\x98\xd1\x06\xe0\xaf\xde\x53\x0b\x9c\x4d\xec\xa6\x97\xc1\x6e\xce\x79\xe3\xab\x59\x13\x1e\x00\x53\x51\xa5\xa6\xe1\xd8\xe3\xaf\x1f\x1d\xb0\x88\xa9\xda\xf7\x7b\xde\x99\x12\x53\xe0\xcc\x40\x54\x6f\x59\x00\x71\x32\x90\x6b\xbb\xef\xd2\x90\xf7\xef\x9e\xd5\x7d\x50\x87\x86\x4e\xaf\xa3\x5c\x4d\x0f\xf3\x27\xb2\x86\x2b\xa1\x97\xaf\x12\xb8\xc7\x93\x66\x7d\x49\xbb\xe6\x9b\x12\xe8\xeb\x2d\xef\xe2\x3e\x88\xeb\x09\x4b\x7e\xfe\x9c\x9d\x85\x28\xe4\x34\x92\xc7\x9b\xf7\xbd\x21\xb0\xcd\x3b\x5f\x41\x0e\x89\xd6\x0b\xe4\x63\x29\xfd\xe1\x74\xbd\xc5\xf2\x33\x73\x8c\x6e\xdf\x33\x47\xe6\xb3\x17\x89\x3a\x14\xd1\xd2\xad\x28\xa1\x62\xd5\x59\xc0\x5d\x9c\x1b\x92\x09\x7c\xd5\x03\x0c\x26\x55\x59\x72\xfc\xbe\xf3\x4e\xe6\xa1\x6d\xf2\xae\x52\x94\xce\x88\x89\xb2\xd8\x5e\xf4\x2f\xfc\x56\x9f\xe7\x4c\x33\xc2\xf5\x29\x18\x52\x2c\x6c\x9d\xb9\x19\x00\x2f\x09\x67\x46\x98\x91\xf1\x3c\x35\x2c\x46\xfd\x67\xff\x4b\x57\xdc\x88\xd9\x0a\x89\x87\x5c\x9b\x4a\xfb\x24\x17\x77\x7a\x88\x55\x75\xfe\x77\x0e\x36\x89\x2a\xac\x37\xf6\xc6\x84\x78\x7f\x73\xed\x6b\xb4\xdf\xfb\x70\xfa\xca\x2e\x5b\x06\xf3\xb4\x4f\x39\x95\x1f\x33\x88\x15\x07\xc9\x00\x64\x3a\xdf\xd1\xed\x76\x3e\xed\xf3\xba\x84\x8e\x9a\x5d\xaa\x3d\xef\x92\xa8\x83\x38\xfc\x0c\x9f\x79\x33\x84\x37\x57\x8e\x2d\x5c\x11\x2d\x2b\x6d\xbe\x4f\x9c\xa3\x60\x0d\x0f\xaf\xb7\x59\x3a\xed\xd6\x3a\x89\xf8\x44\x9b\x5d\xfd\x48\x44\x7e\x4b\x2d\xa5\xe6\x17\x53\x04\xa6\xa7\x81\x5c\xc9\x80\x70\x05\x97\x6c\xbf\x04\x6a\xaf\xb7\x22\x40\x15\xec\xc8\x01\xb1\xe1\x6f\xdc\x49\x52\x4a\xa8\x54\xdf\x19\xbd\x1e\xba\x5e\x25\x20\x9f\x5a\x2f\xbd\x87\xab\x44\xdb\x6c\x5c\xef\x65\x7f\x4f\xe5\x6b\x19\xfa\xd7\xf7\xe6\xd2\x7d\xb2\x6d\xaf\xf4\xcd\x36\xda\xc7\xf3\x96\xef\x70\x07\x67\x2a\x54\x87\x50\x57\x2a\xe2\x5f\x71\x2c\xa5\x93\xa9\xd2\xc8\xf8\xf5\xa1\xb0\xa4\xb7\xe0\x9d\x03\xdc\xd6\x40\x1b\x02\xbc\x6a\x58\x7e\x97\xc9\xed\xbe\x61\x86\x46\xbf\x85\x00\x07\xc8\xbf\x35\xda\xa2\x53\x44\x5f\x84\x2b\x90\x1c\x8a\x8f\xed\x24\xb4\xc2\x6c\xd4\x49\x73\x08\xc2\x0a\x97\x7f\x46\x2a\xf5\x92\x79\xfb\x01\x98\x76\x39\x14\x16\xcf\xcd\x12\xb5\x2b\x23\xf5\xef\x6f\xd8\xcb\x70\x70\xfb\xb6\x3c\x0d\x5d\xf6\xa3\xd6\x35\x39\x58\xbb\x69\xd1\xe0\x04\x20\x75\xa8\x33\xe9\x82\x57\xf4\x5c\xc9\x8c\xf7\x9b\x25\x36\x53\xb3\x76\xad\x7c\x5a\x2b\xe3\x2d\x67\xf9\x51\x2a\x61\x62\x36\x00\x1b\x6f\x07\xf5\x7e\x29\xf4\x68\x1f\x4b\xd5\xff\x2a\xb8\x40\x10\xfe\x9e\xe5\x7a\xbe\xe0\x9e\x04\x58\xa7\xbc\x35\x2d\x85\x83\x50\x81\xa0\x25\xd7\xe4\xef\x49\x4f\x72\x10\xca\xa6\x52\x11\x9b\x7e\xff\x94\xce\x20\xdf\xd9\xfd\xb6\xf3\xf9\x2c\x59\x88\xd1\xc0\xf6\x07\x68\x3b\x7d\x18\xe9\xc0\xa7\x23\xd6\x8e\xec\x63\x97\x89\x01\x36\x69\x43\x5c\x04\x68\x76\xca\xf5\x6c\x39\x9d\xdd\x66\x30\xa8\x56\x8b\xea\x1d\x35\x4e\x56\x40\xcb\x0d\xe4\xe9\x1d\xb6\x8e\xe3\xed\x44\x27\xf2\x72\x52\x37\xea\x26\xa2\xcd\x9f\xa6\xa0\x33\x7e\x65\x5a\x13\xcc\x41\xf2\x74\xe5\x03\xe8\x38\x63\x9f\xd4\x42\xc7\x0d\xea\xbd\x36\x62\x6a\x4f\x40\xa0\x9c\xc8\x7c\xc9\x94\x99\xba\xe8\xcd\x54\x83\xc4\x64\x1e\xeb\xe6\x8b\xee\x63\x1d\xc5\x1a\x30\xe8\x97\x36\x2b\x99\xd4\xd6\x77\xae\xd2\x39\x6f\x42\x95\xd7\xb1\xf3\x26\x6f\x04\x36\x51\x9b\x72\xe4\xd6\x8d\x22\xad\xd9\xd3\xbc\xcc\x23\x55\xfd\xee\x67\x34\x44\x85\x33\x27\x02\xc8\x4c\x7f\x3a\x1b\xcf\x2a\x8d\x77\x60\x34\x55\x10\x25\xa1\x1a\x4d\xf7\x64\x7e\x7e\x5d\xd1\x76\x20\x93\x9a\xc9\x3e\xb8\xae\xff\x1a\xaf\x03\x90\xf2\x40\x9a\x9d\x09\x85\xf2\x34\xdd\x15\xc3\xd6\x72\xda\xc2\xe3\xe4\x45\x7e\x94\x16\x6f\xf5\x2e\xba\x6a\x8b\x89\x7e\x34\x9a\x93\x28\xf2\x3c\x6e\x89\xd2\x4d\xa4\x49\x67\xaa\x39\x3a\xfe\xde\x89\x84\xfb\x86\x3a\xdc\x3e\xc3\xbd\x77\xbb\x01\xcc\x9d\x8c\xc5\xda\xa5\x9f\x5e\xb6\x5d\x5f\x6c\xdf\x00\x76\x2d\x65\x8a\x98\xbe\x86\x8f\xe7\x76\x44\x28\xc7\xce\x96\x32\xff\x05\x44\x3b\x19\x80\xb9\x91\x99\xa1\xf7\x63\x8b\x71\xf3\x48\x95\x9f\x0f\x83\x70\x5e\x19\x83\x94\x02\xc7\xf0\xa4\x88\x4f\xaa\x1e\xc4\x40\x39\x61\x38\xc0\x99\x85\x4e\x4a\x3c\x5f\xf0\x4c\xcb\xc2\x39\x25\xd9\xd4\xe3\xea\xb2\x76\x2e\x88\x1f\x05\x28\x70\xec\x3e\x08\x86\xc2\x68\x24\xda\x33\xc9\x33\xaa\x95\x29\x56\x28\xf5\xfb\xfa\x88\x11\x29\x21\x41\x0f\x5e\x71\x9e\x64\xb8\x0b\x7c\xdf\x28\xb5\x54\x3d\xb3\x13\x79\xda\x43\x7b\xc4\xfe\xf4\x1a\xe7\x47\x60\x0e\xad\x22\xa5\xea\x34\x21\xf2\x7d\x23\x57\x4b\x6d\x51\x58\x19\xac\x8e\x1d\xb0\x6a\x3d\x45\x5a\x74\x2f\x1c\x00\x11\x23\xe0\xef\xc3\x5b\x91\xc0\x71\x36\x1a\xd5\xb9\x2a\x6c\x32\x21\xa2\xed\xa6\xdd\xeb\x8a\x7a\x58\x6a\x70\x47\x04\x9b\x48\x59\x9b\xbf\x59\xd2\x6b\x08\x51\xa9\x3a\x61\x63\xef\xfd\x55\x63\xdc\x53\x80\x7b\xc4\x09\x6c\x3d\xbb\x43\xf6\x65\xf7\x47\x9b\x9c\xa3\xc1\x55\x58\xb2\xc8\x5e\xce\xc5\x70\xe1\x17\xbb\x02\x1d\x40\x35\xcd\x39\x5e\x0e\x3b\xa5\x48\x62\xf2\x95\xd8\xc3\xc1\xe2\x42\x6f\xc2\x5a\xea\x75\x8c\xb2\x84\xba\x0b\x6b\x79\x31\xa5\xc1\x88\x3f\x97\x8d\xc3\x9c\x35\x19\xf7\x06\x0f\x6f\xdd\x67\x81\xfb\x61\x60\x0e\x27\xd2\xe3\xe0\x4f\x3c\xc0\xe4\xad\x59\x9a\xa7\x31\xc7\x25\x93\x6b\xe7\xf6\x65\xd4\xd0\x99\xdf\xfc\xc2\x0b\x4e\xbd\x94\x2b\xfe\xc1\xbf\x13\x65\xdf\xbc\x4a\x28\x81\x8d\x72\x31\x97\x2e\xe7\x32\x3f\x30\x49\x79\xba\x93\x2e\xe9\x13\x5d\x76\xfa\xeb\xe9\xa5\x57\xb7\x59\x47\x66\xf7\x28\x49\x02\xea\x05\xe7\xac\xe4\x06\xb8\x8d\xa4\x5f\xb7\x69\x54\x65\x1e\x11\xe7\xb0\xeb\xba\x69\x13\x2e\x8b\xbe\x47\xb2\x25\xbd\xa9\xe3\xc6\x2d\x6d\x03\x62\x3a\xf1\x05\x9e\xbe\x12\x93\xf5\xfa\x61\xce\x27\x39\x97\x51\xe2\x46\x66\x5a\x22\xe3\xe0\x1f\x76\xe2\xcf\x9f\x60\x7c\x8f\xa5\x40\x4f\x98\x29\xcc\x04\x85\xeb\x59\xc1\xad\x44\x1e\x84\x98\xa9\x8f\x93\x0d\x7b\x79\x0e\x7a\xd7\xf8\x4e\x87\xc2\xdf\x13\xe0\xce\x6c\x25\xfd\x1e\x41\xaf\xd7\x72\x79\x77\x06\x0c\xd0\xdb\xe5\xa2\x56\x38\xd7\xcd\x63\x47\x36\xdf\x7d\xd2\x03\x2f\x6c\x79\x5d\x54\x84\x95\x88\x0b\x70\x96\xe7\xa2\x2b\x81\xb1\x7b\x4a\x50\xb0\xd7\x25\x3c\xdb\x0c\x20\x3a\x15\xe3\x6e\x76\xc6\xa7\xb4\xa4\x73\x9b\x74\x51\x37\x34\xba\xc1\x7b\xf0\xcf\xdd\x21\x50\x3c\x75\x52\xf3\x05\x9b\x85\x92\x7a\x10\xa7\xf6\x4e\xf6\x50\xe3\x97\x49\x16\xf9\xfe\x20\x4e\xf7\xd1\x14\x29\xa3\x35\xb4\x4c\xab\xfc\x38\xb2\x6c\x59\x3f\x02\x3f\xb7\x1e\x34\x88\xaf\xb0\x46\x21\x0a\xef\x44\xa9\x5b\x9d\xbb\x53\x4a\xbd\x93\x31\x48\x18\x3f\xe3\x53\x4a\x80\x2a\xf2\xf0\x91\x23\xec\x97\x34\x4c\x89\x6b\x10\x87\xc0\xb9\xde\xee\x8e\x63\x3c\x7b\x35\x56\xf6\x49\x53\x85\xfd\xd8\xe0\x95\xf9\x5b\xdb\x8f\xe8\x34\x1e\x24\x9b\xeb\xc4\xcf\xdb\x6f\x85\xfd\x56\x55\xdb\xe2\x85\x6a\x76\x4b\x60\xfe\x96\xe5\xed\x5e\x09\x07\xf3\xbe\xc0\x10\x5a\xfb\x0a\x5f\xc0\xb7\xd0\xec\xad\x08\x9b\xe6\x6e\x1e\xf0\xf1\xcb\x9b\x6e\xb2\xf0\xa8\xc3\xa5\xeb\x5a\x28\xb1\xf9\xdc\x28\x6f\x0c\xd7\x68\x6c\x8f\x8f\x76\x17\xe9\x90\x58\x63\xc7\xa0\x7c\x00\x90\xe5\x2a\x51\x12\x97\xc7\xe5\x40\x21\x11\x0b\xb8\x6b\x8a\xa9\xed\xf3\x51\xac\x4f\xd5\xbb\x3d\xad\xf1\xfa\xfc\x7e\x86\x1b\x5a\x3e\xf6\x84\x9a\xc1\xd3\x75\x72\xe8\x77\x06\x00\xfc\xa3\x86\x77\x33\xb8\x6d\xe9\x09\x0b\xaa\xda\x41\x22\x3a\xf4\x8d\x93\xca\x3b\x7d\x08\xd2\xdf\xa9\x07\x8d\xea\x9c\x2c\xce\xe5\x68\xb6\x2e\x07\x5b\x38\x16\xc3\xd6\xee\x8f\x74\x94\x8e\xf3\x44\x5a\xad\x69\x2e\xdb\x2a\x9d\xe9\x4a\x76\x5c\x9e\x15\x20\x74\xa9\xf9\xe7\x13\x42\x70\x7e\xef\x50\xcb\xc6\x1f\xeb\xf9\x46\x96\xdb\xa5\x6e\x98\xcc\x35\x24\x6d\x97\x28\x9e\xd0\x32\xf8\x8f\xc1\x7c\x00\x76\x0e\x5f\x06\x87\x47\x3e\xcd\xf5\xcc\xed\xc4\xec\xc4\x52\x30\xcb\x0f\x97\xe6\x85\x27\x4f\xe3\x7e\x0d\xc0\x9e\x92\x81\xfa\x68\x7d\x43\x3f\xa3\xb2\xc3\xac\x2b\x4b\x31\xe5\x46\x66\x0e\x49\x2b\xaf\x0a\x3c\x4e\x26\xc3\x9d\x9f\x11\xf1\xfd\xa7\x93\x71\x98\x8d\xc7\x8d\x8f\xfd\xc9\x1b\xd5\x1d\xbd\x77\x65\x95\x20\xe8\x48\x2a\x41\x3c\x6b\x5f\xf4\x24\x71\xab\x9a\x3b\x82\x31\x2e\xf6\x27\xc5\xe1\x4f\x82\x98\x8c\x69\x39\x3c\x88\x49\x00\xea\xaf\x55\xeb\xd1\x3a\xfb\x8e\x74\x5b\x3e\x67\x85\xf4\x77\x9f\x74\xaf\x8c\x99\x5a\xf3\x2c\x39\x38\x14\x0e\x98\xf5\x24\x8b\xfb\x4e\x9b\xda\x7d\x5e\x8a\x0e\xce\x8a\x31\x35\x59\xdc\x9a\x0d\x85\x79\x8d\x45\x52\xf3\xfb\x44\x0a\x57\xea\xbd\xf0\xce\xef\x45\xf1\xe8\x68\xbb\x9e\x6a\x5e\x57\xda\xa3\xb7\xf2\x7e\x76\xbd\x2e\x55\xda\x62\x41\xd7\x8f\x39\xb1\xd9\xd8\xc2\xbf\x0f\xeb\xc7\x9f\xfb\x9b\x7f\x03\xf8\x5f\x14\xf4\x82\x3f\x5b\x21\xb0\x92\xb9\xd2\x24\xc3\x61\x86\x0f\x1d\xe6\x37\x9a\xa3\xac\x72\x30\xde\xbf\xe7\x42\x7c\x5e\x4c\x05\xec\x13\x90\xb7\x92\x18\x17\x80\x53\x6e\xd3\xfc\x3b\xbd\x94\xc9\x07\xae\xe0\x1c\x05\x98\x40\x2e\x0f\xde\xfa\x0e\xa8\x1e\xef\x7d\x59\x59\x79\xf4\x8c\x28\x16\xee\xe9\x2c\xca\xe1\x41\xe5\x8f\xb4\x36\xdb\x3a\x83\x33\xbb\xdb\xc1\xa1\x4f\xa3\xd8\x6e\x39\xd7\x1d\x11\x6a\xff\x98\x28\x26\x02\xfe\x8c\x1d\xbf\x84\xb7\x3d\x7a\xad\x3d\xbc\xae\xea\x12\x92\xc7\xf3\x67\x07\xef\xf2\xdb\x8e\xb2\x93\x3b\x76\xd3\x0e\xf7\x51\x5c\x0b\x23\x9f\xd7\x8e\x00\x56\x02\x87\x07\x03\x1e\x35\x30\x7b\x0c\x94\x36\x5f\x0d\x83\x38\xd5\xdb\x53\x46\xa5\xf8\x08\x41\x7c\x97\x9f\xdf\x0a\x72\x4b\x56\x51\x45\x5c\x95\x75\xd1\xed\x34\x01\xf0\x30\x55\x03\x38\x25\x6b\x8b\xe9\xaa\x32\x28\xc1\x79\x10\xf4\xd4\xa3\xd1\x70\xe5\xe6\xa8\xdf\xb3\x1d\x6a\x90\x16\xd1\xcc\x4c\x21\x29\x54\x0f\x10\x94\xeb\xc7\xcb\xe8\x69\x31\x0c\x75\xff\xdb\x23\xcc\x6f\x5b\x9d\x28\xf3\x0d\x2c\x57\xbd\xa4\x70\x2a\xed\x5e\x78\xa3\x04\x52\x2a\x9c\x8b\x7e\xba\x8e\xec\xed\xa1\xa3\xa0\xb6\x6a\xdc\xdf\xad\x9a\x32\x23\xec\xef\x9a\xdf\x6b\xd4\x69\xec\x0f\xed\x50\x04\xf3\xe1\x92\x95\x27\xf0\x4b\x79\xe7\x55\x44\x26\x59\x5b\xc7\xd5\x72\xdd\x42\xed\xa2\xee\xbe\x13\x7a\xf0\xb8\xe1\x8c\x41\xf1\x56\x7f\x2f\xb7\x9b\x0d\xff\xca\x37\xbc\x05\xe9\xfe\x62\x29\x3b\x1e\xc4\x1d\x24\x18\xfc\x6d\xe3\xd3\xbb\x66\xef\x72\x87\xab\x48\x57\x59\x78\x30\xcc\xe2\x70\xbe\x68\x78\x49\xf9\x56\xa2\xbd\x6e\x8a\x6e\x97\xf9\x45\x6d\xe6\x70\x25\xa3\x07\x73\x93\x6a\x15\x45\xda\x10\xc9\x1c\x2a\x48\x95\x6b\x79\x49\x28\xda\x6a\xbb\x59\xf3\x0f\x44\xb1\x9d\xd1\x27\x12\xdc\x8d\xf4\x93\x9d\xb8\x65\x56\x57\x91\x7b\xac\x39\x7d\x13\x22\xf5\xb5\x9f\x42\x25\x98\x20\x14\x0a\x15\x0d\x8e\x03\x17\xd3\xf5\xce\x11\x14\x9a\xfe\xa0\xa6\x87\xef\x9b\xe3\xe5\xf2\xd1\x7d\x0f\xef\x42\xda\x3d\xe6\x8e\xaf\x5e\xc6\x13\x6f\x53\x5f\xf5\x1b\xb3\xf0\xb6\xc6\x61\x43\x6c\x44\x5b\xb7\xfa\xc0\x7a\x68\x0e\x67\x28\xac\x95\xf8\x56\x35\xe3\x82\x58\x12\xa4\x4f\xc2\xda\x33\xde\x2d\x49\x39\x38\x93\xd1\x2c\xbb\xc7\xd3\x82\xbb\xd0\xfb\x62\x6a\x7c\x70\x04\xb1\x89\x67\x39\xca\xa8\x7a\xe8\xf0\x39\x46\x73\x39\xc0\x56\xb7\x97\x23\xde\x35\xe5\x33\x78\x70\x29\x8a\x26\x4b\x02\xa7\xe1\x4a\xa3\x0a\xfb\xdb\xdd\xb0\x0a\x8f\xed\xd7\xf0\x01\x4c\x61\x88\x25\xcb\x8f\xbe\x3d\x3b\xb8\xaf\xb4\x66\xbc\x2f\x41\x30\x6f\x56\x01\x67\x9d\xf9\x2a\x00\x4d\x07\x3a\x38\x3a\xb3\x19\x4e\xa2\x28\xf5\xfb\x69\xa1\x03\x76\xb8\xa1\x26\xb8\xbb\x05\xb8\xc2\x3c\xe3\x4c\x18\x93\x9f\xb2\x39\xa6\x5b\x81\xa2\x7b\x16\xd3\x45\x4f\x30\xdc\x5e\x17\xb2\x7b\x17\xde\x4f\xcf\x69\xe9\x29\x70\x85\x6a\xfd\x01\x80\xdf\xe0\xd9\xb6\x4b\xe9\xe1\x60\xc9\x13\x1d\x1f\x7f\x79\x36\x95\x37\x93\x2a\x0d\xd5\xf7\x23\x06\xbb\x40\xec\x2c\x4a\xf3\xb5\x0e\x3f\x0d\xf1\x87\xf9\x0b\x90\xce\xaa\x46\x46\x54\xca\x5b\x74\xfb\x14\xe8\x64\x86\x83\xde\xe4\x1a\x12\x2a\xdc\x48\x1d\x72\xeb\x9d\x46\xc5\x4b\x88\x66\xac\x4e\xfb\x77\xf7\x0f\xb0\x26\xd4\x22\xed\xd7\xd9\xd3\x05\x43\xdf\x5a\x8c\xb9\xb3\x67\xda\x02\xf0\xcb\x95\xe6\xe0\x6c\x34\xd1\x80\x4f\x6f\x60\x78\xe2\xe1\x6a\x32\xc0\x75\xfd\xdd\x8c\xd5\xe8\x5c\x76\xb1\x1d\xb0\x67\xd5\x54\x83\x28\x8c\xc1\x4c\x1c\x1f\x97\xb2\x37\xb3\xb2\xa7\x67\xa6\x0b\x7a\xbe\x11\x49\x2e\xbc\x94\xd8\x1e\x71\x7a\x88\x87\xf8\xc9\x73\xde\xab\x9f\x00\xf7\x65\x32\x1e\xdd\x08\x1f\x37\x45\xf9\x0d\xfb\xe7\x9e\x3f\xe2\xeb\xcd\x44\x3c\x61\xb0\x5f\x02\x91\x08\xd1\x81\x7d\x59\x94\xfc\x63\x9d\xd7\x17\x83\x75\x49\x82\x19\xa5\x1b\x5d\xd8\xb2\x8a\xbf\x89\x7e\x8b\xf1\x32\x71\x36\x57\xe0\x55\xe6\x51\x81\xdf\xa5\x93\x7b\xda\x53\x76\x50\x61\x52\xe8\xb2\x92\xde\xc1\xc0\x16\xeb\xfe\x6d\xd1\x81\x57\x4f\x98\x15\x3c\xfc\x8b\xe5\x6d\x80\x89\x97\x08\x45\x91\x5b\x4b\x3d\x60\x8b\x3e\x6a\x8c\x57\xf9\x43\x8e\x90\x9e\x67\xfd\x18\xc6\xf9\x93\x0e\xbb\xc3\x70\x26\x5d\x3a\x0f\x71\x5a\x7a\x27\x39\x2e\x91\x30\xfb\x93\x2a\xeb\xb9\x92\x00\xe6\x2a\xca\x90\xb9\xdf\x96\xf9\x73\x7d\x4f\xea\x2e\x5c\x13\xf1\xc3\x19\xa2\x31\xb9\xf1\xe2\x98\x76\xfd\xa2\x99\xc7\xa2\xe5\xbd\xa1\x0b\x6d\x40\xbf\x1c\x62\x50\x54\xa0\x04\x7e\x15\xa2\x6d\xdc\x8b\x03\x21\xc9\xe3\x7b\xee\xed\x4b\xf4\x5f\xc0\xcf\x8c\x01\xee\xcb\x81\x9a\x59\x9e\x21\xf1\xe4\x43\xab\xee\xef\xe7\xdd\x0f\x7b\x10\x4a\x5c\x24\x83\xbd\xc3\x1e\xe0\xaa\x63\x3b\x53\xcb\xef\x02\xb4\x9f\x21\xc9\xcc\x22\x51\x46\x5e\x70\xfd\xad\xce\x66\x09\xef\x69\xf4\x9c\x4f\x0c\xe6\xb6\xd7\x28\x1c\x0b\xc4\xb8\x08\x6d\x74\xd2\x10\xe9\xc8\xe6\x66\x42\xb2\x27\x8f\xbf\x57\xad\xe9\xab\x5e\x4a\x5e\xdb\x82\x97\x8e\x0c\x68\xab\x4e\xdd\x35\xec\xc3\xa5\x3f\x14\xc4\x21\x10\x5b\xef\xc1\xfd\x73\x29\x35\xd5\x6e\x62\xa3\xbf\x97\x9f\x21\x9e\x5d\x19\x07\x10\x0f\x01\x6e\x8e\x38\x5c\xe9\x18\xbe\xcc\xa9\x1f\x24\xde\x6d\xa8\x1f\x10\x83\xf8\x27\x1d\x27\x2d\xf1\x77\xfb\x64\xf5\x3a\xd3\xad\x17\x93\x00\xab\xaa\x2a\x86\xe7\xd1\xb6\x2b\xbe\xcb\x31\x76\xd4\x9a\x36\x74\x67\x58\xdb\x6b\xfc\x50\xe6\xc0\xa0\x5c\xfd\x84\xba\x53\xde\x26\x70\x7f\x7d\xd2\x4c\xb9\x29\x52\xcf\x1e\x26\xc8\x09\x74\x53\xae\x41\xcf\x51\xd3\xa9\x48\xde\xe6\x9b\x17\xec\x1c\x79\xd5\x53\x22\xcb\x22\x7e\x65\xab\x71\x0f\xea\x9d\x9a\xb2\xd1\x1d\x64\xbe\xa5\xb9\x95\x53\x17\x93\x27\x00\xfa\xd7\x53\x0e\x20\x38\xe9\x01\x85\xe8\xc3\xd2\x16\x58\x40\x36\x97\x5e\x2f\x09\x34\xda\x08\xea\x41\xfc\xa2\xb4\x67\x8b\xd2\x9d\x54\x3c\x68\x6b\x07\xed\x6c\x2e\x29\x11\x0d\x5d\xe3\xe7\x95\x6d\x28\x55\x82\xcf\x98\x6b\xdf\x35\x9c\xa0\x3c\xdf\xaf\xea\xe5\x5d\x7a\x73\xed\xe3\x39\x5c\xbf\x1f\x3b\xbb\x10\x2f\xb6\x36\xaa\x01\xbb\x5f\x53\x1b\x1f\xc5\xc3\x12\x41\x38\xf7\x88\x46\x7a\xdb\xd2\x06\x77\x35\x69\x59\x0c\x7b\x14\xe1\xbe\x04\xbc\xff\x26\x98\xb5\x7f\x4d\x5f\xf6\x04\x74\x0b\x21\x67\x8c\x8d\xcb\x4a\xf8\x7a\xf7\x95\xd6\x31\x08\x80\xbb\xcd\xd9\x16\x92\xf2\xc2\x10\xa6\x9c\xf1\x5b\xc6\xc8\xe2\xc2\x23\x4e\xda\x64\xb7\x12\xb9\x8b\x62\x4b\x0d\x19\x80\xb7\x70\x28\xb9\xd2\xcd\x71\x0b\x73\xda\x99\x56\xdb\x6b\x37\xf2\x89\xc1\x2e\x0d\xb8\x76\xe2\xbe\x2b\xc4\x85\x5f\xc2\x10\x97\x72\xbd\x33\x3f\x5b\xbd\x96\xee\x03\xf3\x57\x2c\x9a\x17\xa0\xf6\x87\x22\x3d\xe4\x54\x53\x97\x41\x36\xec\xa9\xe4\xa5\x98\xa0\x10\x74\x3b\x81\x9d\x24\xbf\xd7\xbd\xf7\xc3\x46\x73\x82\x84\xde\x17\x55\x12\x36\x67\xf8\x3e\x69\xda\xef\x90\xf5\x1e\xe1\xde\x96\xde\x50\xf6\x57\x42\x95\x1a\x10\x93\x8f\xbc\x14\xbf\xbd\xc6\x75\x22\x52\x7e\xe9\xc9\x05\x71\x6a\xa4\x60\x67\x85\xa3\x06\xe4\x1e\x53\xa5\xfd\xbb\x48\xcc\xd5\x4f\xad\xd9\x97\xd2\x78\xd1\xb3\x47\x8e\x0f\xea\x46\xc7\x8e\x4b\x57\xa9\x85\xd3\x6c\x5e\xfe\xf0\x64\x7d\x83\xb7\x5e\x44\x20\x06\x5f\x1c\xaa\x22\x6f\x88\x9f\x56\x77\xc7\x04\xe0\x37\x7a\x4b\xe3\x88\x67\x29\x57\xec\x62\xb3\x0d\x7e\x9a\x47\xe2\xdf\x4d\xc0\x78\xe7\x77\x2c\x05\x5c\x65\x43\x30\xbf\xda\xbe\xb2\xdc\x94\xa6\x22\xe8\x62\xf9\x80\x77\x99\x16\xf8\x28\x27\x82\x8b\x68\x84\x3c\x61\x77\x7f\xfc\x7b\x7d\xa6\x82\x2c\xee\x2c\x5d\xf6\xd8\xf3\xa5\xe4\xbf\xe1\x7a\x35\xc8\xfb\x19\x6b\xb2\x0d\x68\xa6\x66\x2a\x6f\xe2\xcc\x78\x1f\x40\xe5\xfb\x07\x4f\xe5\x61\xdf\xe1\x1c\xca\xd7\x1a\x08\xd5\x11\xa6\xee\x05\xa8\x4e\x1a\xaa\xf6\xba\x3d\xb0\x5c\x91\xea\xcd\x6e\x2b\x22\xdb\x4e\x93\x35\x94\xab\x5b\x6c\xb8\x57\x88\xb9\x07\x3b\x87\xa8\xce\x3d\x3f\x05\xee\xee\xa8\x9f\xb4\x77\x82\x27\x4a\x54\x88\x79\xe7\x97\x7b\x6d\xb2\x7e\xbd\xa8\xf5\x11\xcb\x0c\x4d\xf2\xbc\xe1\xfb\xa3\xbe\xb3\x50\x83\x09\x72\xa8\x7b\x1d\x3e\x35\x6f\x2e\x1f\x3e\xbb\x11\xcc\x4c\x9d\xdc\x11\x2f\xf4\x0b\x1c\xd1\x49\xb5\x8c\xf5\x5b\xf0\xb7\x66\x6b\xa5\x94\xe4\x09\x8b\x27\x13\xf6\x21\x3a\xb6\xe9\x12\x39\x82\x59\xbf\x70\xfa\xad\x04\x7e\xfb\x72\x19\x89\xf0\x5e\xb0\xca\xf7\x76\x38\xe4\x02\x31\x7e\x3a\x87\xac\x0b\x46\x05\xe3\xf2\x1f\xab\xf0\xb7\x94\x14\x68\xd2\x52\xf7\xd1\x09\x30\x2e\xcd\x17\xe2\x96\xc6\x71\x37\x40\xbf\x8a\x76\xd6\x56\x8b\x6a\xa7\xf2\xd5\x9f\x46\x25\x7b\xf7\xb7\xaa\xcb\x71\xa6\x84\xf1\xa6\xf9\x15\x5a\x17\x97\x92\xc1\x2e\xfb\xf0\x4e\x8e\x26\x1b\xf1\x31\x58\xbb\x2d\x26\x8e\x2f\xdb\xea\xd7\x44\x9b\xad\xe8\xbd\xdf\x8f\xd2\x1e\x63\x31\xee\xce\x31\x6b\x42\xb2\x36\x4e\x76\xdb\x08\x83\x32\xdb\xa5\x99\x68\xb8\x47\x6e\xfc\xde\x97\x39\xc9\x06\x6a\x65\xb6\x47\xef\xd3\xb9\x0d\x88\x71\xd1\x2f\xe9\xe3\x87\x80\x40\xc5\x16\x5b\x94\xe2\x43\xe8\x4c\x3a\x00\xe2\xfd\x28\xcd\xb7\xc5\x50\x0e\x2d\xff\x05\xf6\x98\xde\xf0\x7b\xb1\x95\x9a\x3a\xf2\xd5\x80\xde\x5e\xea\x69\xf3\xe2\x1e\xbd\xc0\xe3\x17\x4d\x1f\xf2\x08\xb1\xbf\x33\x47\x1d\xc5\xc2\xd9\x01\x3a\x17\x79\xde\x0f\x3d\xe1\x29\x4e\xdf\xc7\xcd\xe2\xe9\xf6\xe0\xd8\x5f\x90\xde\x90\x0d\xb6\x1b\xf8\x04\xe0\x9c\x0f\x21\xb0\x07\x29\x34\xf8\x12\x69\x5e\x68\xb9\xde\xf0\xd2\x9e\xec\x63\xc7\xf2\xe8\xc9\xfb\xb9\x23\xd5\xec\xc9\x99\xdf\xfe\xa4\xaf\x32\x5d\x23\x85\xf3\x36\x09\x90\x2b\x26\x5b\xab\xbd\x0f\x2d\xb3\x2c\x37\x0c\x7d\x11\x8f\x58\xf2\x96\xca\xf9\xd6\xb7\xd2\xbe\x0d\x6d\xbe\x6d\xe3\xd5\x8b\x0d\x1d\xf9\x5c\xe7\x1d\x2f\xe3\x18\xd1\x0d\x97\x4a\xf3\x9d\xad\x2a\x5b\xa4\x8f\x34\x09\x74\x31\x18\x53\x9c\x7c\x03\xe3\xe1\x0b\xca\x78\x7e\x76\x60\xc4\x1f\xff\x9b\x38\x1f\x3a\xb6\x06\x84\x29\x56\x3a\x17\xaa\x3d\xbe\xb5\xbf\x06\xae\xf1\xd0\x98\x46\x26\x71\x01\xe0\x0f\x6f\x68\x7f\x84\xb5\xc1\x99\x81\xaa\x7a\x9d\x8f\xc2\x6e\x60\xef\xee\xdc\xe0\xe9\x27\xdb\x15\xf9\xb8\x3d\xa9\x20\xf2\x33\x64\x1b\x8c\xfc\x51\x64\xb2\x1f\x43\x05\x10\x68\x67\x6d\x3d\xf6\xf2\xb1\x04\x0d\xc5\xa6\x18\x8f\x1e\x8f\xc2\x03\x01\x0a\x45\x10\x12\x20\xa2\x53\xae\xbd\xd0\x47\x09\x28\x0b\x0a\x4b\x0f\x1f\xa3\xe1\x65\xbe\xe8\xf5\xe4\xa5\xb6\xc7\xbe\x9b\xd6\x2f\x33\x41\x3e\x85\xda\x28\xa5\x96\x35\xd3\x69\xb6\x4e\x0f\x10\x13\x38\xb4\xed\x29\xc5\xcd\xfb\x5e\xa3\xbf\xdf\x39\x78\xa6\xef\x7c\x1f\x20\x3f\x38\x28\x71\x6f\x1f\x05\x33\x7d\x7b\x9a\x3a\x7f\x5b\x40\xa3\x34\x87\xd0\xbb\x99\x14\x7e\xeb\xe1\x16\x5b\xea\xef\xdf\x2b\xd4\x71\x83\x4b\x51\xec\xf1\xfc\x62\x08\xe0\xbc\xb4\xae\xf3\x9c\x9b\xb6\x4c\x3c\x62\x5f\x2b\xfa\xe2\xdd\x35\xf7\x16\x7b\xd3\xcf\x6c\x7c\xe0\xe9\x6f\xdf\x63\x46\x64\xa4\x32\x7c\x4d\xcf\xbb\xee\x67\xeb\xd8\x1c\x39\x3b\x04\xa3\x96\xda\xc0\x33\x2b\xd7\x04\xd9\xbf\x3b\x9d\x33\x4c\x15\x6a\x81\x3b\x74\x61\xfd\x58\xbb\x46\xe5\x0b\x72\xab\xae\x51\x9f\x38\x84\x43\xda\xc4\x2a\x9b\x6f\x88\x03\x1f\xb0\x4e\x2e\xf0\x3d\xc8\xb0\x14\x8b\x16\x2c\x9d\x20\x86\x37\xe1\x91\x41\x9d\xf3\x2b\xfc\xe6\x69\x97\x49\xed\x13\xcb\xc3\xe8\x9a\xd9\x92\x5e\xa9\x23\x73\x58\xa1\x0b\x5b\x99\xb0\x78\xe0\x6d\x11\xb7\x46\x65\x69\x6a\x6c\x3d\xc5\xb9\xd8\x65\xa1\x51\x76\x11\xa1\xb6\x84\x79\x99\xff\x63\xef\x4b\x76\x5e\x65\x96\x2d\xe7\xf7\x31\x6a\x56\x62\x40\xdf\xa9\x54\x03\xdb\x18\x30\xa6\x33\x3d\xcc\x68\x0d\x98\xbe\x07\xa9\xde\xbd\x32\xbf\xbf\x06\xe7\xd4\xec\xce\x8f\x25\x6b\x6b\x5b\x9f\x1b\x92\xc8\x88\xb5\x32\x22\x56\x5c\x2f\x73\xab\x80\x23\x5e\x72\x9e\xe7\x9a\xe7\xdc\x0d\x2e\x53\x28\x5d\x7d\x6b\xeb\xdd\xb8\x6d\x8f\x5f\xff\xd6\x6b\xfe\x38\x29\x12\xa7\x44\x36\x5b\x51\xe0\xcf\x08\x6f\xe1\x36\x14\x6c\x47\x81\x58\xbc\xc9\x7c\xe5\x66\xff\xb8\x86\x7c\x59\x89\x24\x4c\x35\x39\x1c\x25\x1e\xe3\x1c\xe5\x47\xa5\x5a\xf0\xfa\x1d\x9f\x8c\x47\x11\x36\x43\xd5\xe6\x3a\xd0\x89\x9e\x7d\xb0\x7d\x1e\xaf\x2a\x9c\xdf\x14\x97\x00\x58\xf8\x3c\x34\xfb\xed\x50\x98\x81\x65\x72\x06\xa0\x18\xd4\x99\x7c\x09\x84\x20\xde\xb7\x42\x18\x8b\x4e\xc9\xc9\x85\x2d\x41\x9c\xac\xbf\x9f\x70\x34\xfd\x2b\x7b\x17\x9d\x80\x7e\x53\x79\x65\x7f\x86\x24\xc0\xc2\x1a\xdf\x8b\xa6\x70\x79\xf6\xbf\xd4\x7a\x42\xbd\x35\xf2\xe7\x3e\x6d\xc9\x39\x94\xad\xc0\x46\x9a\x47\x30\x3c\xd1\xc7\x75\x1c\xe7\x69\xbc\x3f\x40\xd8\x87\x42\x83\xf3\xf4\xa4\xb6\xf7\xfb\x31\x33\xa4\xc2\xcb\x32\xc0\x26\x36\x1a\x25\xc0\xb0\x6c\x17\xdc\xfd\xac\x82\xe7\x7a\x50\x7b\xde\xbe\x7d\x30\xb9\x35\xa5\x76\x82\xb3\x1b\x5d\xd8\x4f\x55\xa5\x20\x76\xe6\x2e\x4e\xdf\xc2\xd4\xe7\x5b\x40\xc7\x8c\x98\x36\x85\x0f\xe1\xe8\x9d\x54\x3b\x1f\x64\xa6\x0a\xee\xfe\x71\xe1\xfc\xe1\xbf\x5a\xea\x1b\x70\x16\xfe\x32\x31\x63\xd6\x4d\x34\xeb\x44\x1c\x0b\xc8\x11\x26\x37\x9f\x14\x96\x46\xf3\xe0\xda\xfe\xde\x6b\xbe\x42\x83\x2b\x54\x62\xd8\x7e\x71\xf3\x46\x7f\x74\xee\x67\x8f\xef\xf7\xf5\xf8\x8c\x6d\xae\xfa\xf8\x3a\xf5\xcc\x6e\x73\x6f\x23\xfb\xd1\xef\x1c\x2d\x70\x26\xdd\x7a\xc0\x99\x61\x8e\xf8\x79\x2b\x7f\xb9\xc9\x77\x1d\x2f\x81\x38\x05\x3f\x5e\xda\x77\x69\x09\xa6\x9d\xc6\x24\xc6\x1e\x7a\xeb\x19\x49\x6e\x43\xd8\x83\x7d\x54\x6e\x6b\x76\x35\x6e\x45\xe1\xfe\x15\xfb\x4d\x85\x6b\x11\x76\x4f\x3c\xc4\xb3\x84\xee\xa8\x56\x2f\x6f\x03\xb0\x9f\x31\xe3\x8d\xfa\x6e\xd3\x81\x05\xa2\x59\xff\xfe\x67\xbc\x38\x94\x23\x5d\x2a\x6c\xfa\xd3\xc8\xa2\x60\xcf\xa0\x39\x66\x4a\xbe\x06\x9f\x1c\xf8\xf7\x08\x4b\x5b\x95\x57\x12\x44\xab\xae\x85\x67\x36\x87\xcf\xd1\xbc\xef\x6e\x23\x64\xba\x74\xb8\xb9\xe3\xa2\x66\x5b\xeb\x78\x5d\xd6\xb4\x91\x61\x5a\xf6\x5b\x0b\xe4\xa2\x20\x47\xbe\x38\xe9\x94\x02\xf0\xf7\x19\xeb\xd2\xe2\x93\xc5\x85\x48\x64\x3f\xff\x9e\x73\xab\x33\x7c\x2a\x38\xc3\xa1\x39\x60\x73\x9f\x9f\x2e\x24\xf8\x65\x23\x92\xc8\x83\x1a\xe7\x6a\xd4\xf0\x60\xe3\x9d\x52\x76\x39\xa1\xd8\x9b\xe5\x73\x03\xf0\x95\x47\x00\x0c\xbf\x04\xa3\x19\xec\x1a\x3d\xb0\x99\xed\x0c\x32\xe8\x35\x19\x4e\xfc\x03\x21\xa4\x16\xf8\x14\x3f\x60\x89\x15\x3c\x3f\xcb\x4d\xf5\x0b\xc0\xa9\x36\xed\x2c\x29\x6e\x80\xc5\xe3\x7e\x60\xfd\x2a\x8f\x33\xc7\xa0\x48\x5e\xc0\xd1\x54\xaf\xfa\x45\xe8\xf9\x01\x6b\xbb\x4f\x16\x50\xe7\x45\xba\xae\x8b\xf7\xb0\x77\x89\x69\x57\xfa\xb7\x93\x34\x36\xdf\x5a\x03\x84\x23\x70\xa5\xe3\x81\x96\x50\xa0\x0c\x0e\x3e\x76\x5d\x3e\x8f\x60\x41\xa2\x73\x02\xf8\x0f\x5c\x15\x1f\xe9\x5f\x24\xb8\x90\x34\x91\x2c\xc8\x36\x00\x20\xd3\xbf\x54\x96\x1f\xdf\xd0\x17\xef\x04\xae\xf1\xb0\x56\x92\x72\x0d\x39\x92\x15\x38\x23\xb4\xa1\x2f\xd6\x80\x0d\x3c\x3d\xc9\xbd\x87\x26\xdd\x02\x9a\x32\x4d\x19\x65\xf1\x8a\x1c\x17\x34\x3c\x75\xc1\x4e\x35\x7f\x6b\x37\xa1\xb9\x18\x4b\xd3\x61\xaf\x24\xd8\x56\x8e\x7b\x19\x17\x5d\xc1\xfc\x72\x1d\xce\x6e\xeb\x28\xeb\xd7\xc7\xf1\x45\x77\x52\xfc\x53\x9f\xcf\xc2\x24\xcf\x2f\xca\xfc\xd6\x20\x61\xb5\x2c\xbf\xdf\xbc\xfb\x8f\x1f\x62\xfb\x67\x09\x34\x23\x9a\x1c\x63\x56\x41\x53\x04\x43\xbc\x96\xc7\xfa\xa9\xbe\xe6\x02\x6c\x10\xbc\x17\x7c\x30\xa9\x13\x75\x85\xa5\x81\x75\xba\xc0\x2f\xfd\xa8\x7c\x52\x2b\x6a\x64\x16\x33\x69\x7d\xba\x8b\xfc\xfb\x97\x32\xd4\x91\x18\xb3\xad\x63\x22\xc9\x5a\x77\x15\x51\x01\x3f\xc2\x5e\x5b\x10\x4c\x2c\x5f\x91\xde\xe7\xa0\x53\x76\x0c\x17\x28\xe0\xc7\x50\x61\x01\xc8\x45\xd1\x67\xf1\x1a\x74\x1a\x6d\x8a\x87\xaf\x30\x8f\xb2\xcf\x65\x98\xb5\x5b\x29\x9f\xfe\x25\xda\xe9\xf6\x32\xc9\x20\xa6\x58\x9d\x9a\xbf\x63\xba\xc0\xa1\xf2\x11\x75\xae\x39\xe1\x23\x41\xb2\x00\xd9\xbc\xed\xa8\x20\x7d\x32\x1f\x40\x2c\x1f\xe2\x10\x0a\xba\xf9\x0d\x0d\x02\x5c\xfe\x06\xae\x75\x60\xd5\x53\xbc\xef\xf1\x55\x84\x11\xe7\x76\x61\x08\x29\x0b\x88\x3c\x97\xee\x4f\xd9\xca\xe6\xf5\x4f\xd1\x57\xff\x92\xbc\x27\x30\xbf\x7c\x15\x9e\xd4\x5b\xac\x08\x9a\x7f\x00\xbf\xa3\x83\xc0\xbf\x91\x8c\xee\x5f\x4e\x34\x13\xbc\x82\x70\x48\xc1\xaf\x42\x1a\x88\x18\x3c\x6c\x74\x91\xba\xab\x69\xde\x9e\x09\x22\xd9\xfc\x2f\xe0\x15\x54\xc8\x27\x5a\x9f\x1a\x92\x1b\x74\x9f\xda\x74\x30\xd8\x53\x79\xfa\x20\xf6\x34\x09\x55\xc8\x0c\x9c\xf5\x28\xd5\xe5\xb2\x45\x2d\x2b\x9d\xdf\x75\x06\xef\x79\x99\xf2\xb6\xee\xbd\xab\x8a\x06\x8a\x2b\xcd\x02\x90\x43\x88\xf4\x00\x6d\xf3\xa4\xd4\xd2\x48\xb7\x10\x6a\xc2\xc3\x1c\x95\x56\xef\xf7\xf8\xd8\xa6\x9b\x4d\xad\x30\xc6\x63\xbc\x6a\xf7\x8d\xf7\x83\x62\xdb\x13\x4e\xf0\xe0\x52\x66\xf3\xf1\x1b\x6c\x3b\xec\x42\xe9\xa8\xe6\x16\xec\xb0\x5e\xe5\x0a\x88\xef\x13\x6b\x21\x47\x72\x66\x9f\x09\x8d\xc8\xce\x82\x97\x1e\x7f\x90\x13\x71\xf5\xba\x00\x10\x65\xf8\x31\x0d\x07\xd7\xcd\x40\x60\xa9\xf0\x5b\x06\x77\x5d\x76\x58\x7c\x85\xb3\x6b\x19\xae\x0a\x79\xf9\x6d\xd8\xc0\x7d\x2a\xe7\xc4\x33\x3c\xaa\xe5\xba\x76\x7d\xb0\xc8\xcc\x3d\xac\xd3\x39\xf4\xb6\x25\xd1\x4c\x32\x3c\x60\xb2\x53\x30\x93\x37\x2a\x42\xdf\xc0\x2e\xde\xdd\x44\x51\x9a\x0c\xf5\xc2\xc0\x3a\x31\x1e\xfe\xd9\x17\x93\x44\xd1\x2a\xe1\xf5\x7d\x44\x59\x8b\xb8\xa2\x45\xe8\xfa\xfd\xeb\x46\xdd\xf7\x11\x9c\x04\x19\x8d\x8d\x8f\xa2\x1b\x0e\x03\xf2\xf2\xc9\xf2\x21\x48\xc1\x42\x27\xc0\xb7\x27\x34\x4d\xa1\x23\x08\x7e\x3c\x04\xf4\xbf\xfc\x01\xc8\xfd\x8f\x49\x80\x21\xdd\x7f\xdb\x93\x49\xc1\x96\xf3\x00\x07\x2e\xca\x3d\x6a\x6d\xcf\xec\x77\x71\x7e\x95\xb7\x57\x67\x6e\x04\x57\x98\x57\x4c\x1c\xdf\x97\xb2\xb1\x02\xae\x21\x31\x57\x72\x3f\xc3\x55\x13\x9f\x5c\x00\x11\x62\x0d\xd2\xdb\xe3\x65\x5d\x65\x87\xe8\x3c\xc4\xe9\x68\x16\xf8\x31\x6a\x85\xfd\xd0\xf4\x33\x32\xc2\xdf\x53\xb8\x4e\xc0\xfc\x90\xad\x07\x91\x8b\x9e\xf1\xe1\x64\x8c\x88\x81\xf8\x54\x16\xe0\xa4\xc2\xed\xd3\x0b\x76\x61\xb9\xd8\xfd\xfe\x49\x65\x95\x20\x37\x9b\xd6\xf9\x50\x2f\xbf\xd6\xf3\x00\xa1\x73\x69\x4e\xe0\x98\x01\x60\xdf\x12\x00\x8d\x59\xab\xc9\xcc\x9a\x4a\xba\xa5\x23\x27\x7c\xbe\x5f\xdf\xe4\xc5\xdf\x2f\xa6\x60\x91\xfa\x47\xa8\x38\x5b\x73\xc0\x57\x71\x25\x41\xd2\x3e\x08\x8a\x6f\x99\x3f\x50\xb0\xf9\xb7\x0e\xaa\xf1\x01\x6f\x25\xb6\xd1\x18\xb3\x4b\x4b\x7a\xf8\x22\xd3\x04\x6e\x3f\x07\x52\x3e\x50\x34\x00\x4e\xf7\x03\x22\xd3\xd8\xa4\x57\xac\xbd\xd2\x16\x36\xaf\x92\x9f\x1c\x2c\x0a\xcb\xb5\x29\xd5\x19\xc1\xb6\x76\xc6\xb3\xb6\xc6\xc7\x19\x3f\xc0\x66\x26\x8b\x86\x2b\x03\xe8\x35\x5e\x65\x76\x55\x1c\xda\x21\x20\x38\x33\x48\x31\x5f\xb1\x98\x7c\x2e\x46\xa5\x11\xf3\x1b\xc0\x7c\x7b\xe7\x0c\x78\xba\x4e\xe1\x9e\xb1\x79\x57\xb5\x75\x78\x7f\x2b\x34\x3c\xfb\xe0\x65\xcb\x8d\x9e\x56\x8d\x33\x68\x51\x91\xc9\x2d\xb5\x81\x15\x0c\x0b\xc9\xfe\x04\x13\x01\x1c\x9e\xdf\x1a\x84\x44\xd0\x07\xeb\x81\x95\x8e\x1c\x9a\x63\xc0\xcd\xb4\x7d\xdc\x17\x00\xad\x05\x31\x7a\x73\x76\xb4\x37\x5e\xe5\x8e\xd4\x3d\x63\x0e\x9a\xa2\x7e\x7a\xc0\xff\x17\xb0\xf3\xc2\x30\xbc\x97\x9c\xae\x38\xcf\x2b\x9d\x03\x2f\x71\x9e\xbb\xf6\x99\x9f\x0f\x78\x2e\x44\x9d\xb1\x26\x5f\x78\x2b\x98\x2e\xff\x7c\x30\xc2\xb0\x91\x1b\xc1\x9a\x24\xa2\x8a\xf5\x62\xf4\x94\xde\xa2\xd6\xf6\xc4\x92\xf2\x88\xe1\x41\xcb\x4c\x78\x0a\x84\xa6\x7e\x84\x03\xcf\xba\xbd\x88\x37\x44\x58\x76\x57\x3a\xae\x92\x06\xf7\x63\xa1\xa9\x0e\x75\x91\x74\x0d\x22\x18\x43\x93\x66\xd3\xa0\x00\x68\xdf\x54\x47\xe4\x34\xdf\x5c\x5a\x16\xc0\xc1\x92\xa5\x41\xae\xf8\xfe\xd1\x1e\xc6\xb9\xff\xcc\x07\xbf\x52\x45\x0f\xf0\xe2\x26\x50\x9f\x06\xc0\x7d\x74\x83\xe7\x37\xc4\x52\x7f\xb8\x05\xce\xc7\xfc\xfa\xb9\xe9\xe6\xb2\x86\xc8\x47\xae\xe1\xc9\x22\xdf\xb1\x4c\xba\x92\xad\x21\xd5\xa6\x22\x06\xc6\x03\x8b\xa8\xbc\x03\x15\xe7\x90\x8a\x1a\x10\xb0\x16\xca\xc9\x56\xc1\xdc\xe1\x2a\x2d\xdf\x28\xb1\x0c\xfd\x15\x2d\x00\xcd\xdb\x0e\xad\x55\xb8\x4e\x33\x4b\xc6\xd8\x80\x23\x1d\xd9\x01\x30\x9d\x61\xfd\x9e\xe8\x78\x02\xf8\x87\xce\xe4\x53\x2e\xd2\xcf\x73\x51\x63\x5c\xa5\x7c\x29\xe4\xb1\xcf\x04\x90\xa9\x32\x33\x89\xd9\x9b\x4d\x27\xc6\x77\x69\x01\x78\x0c\x27\xf0\xd0\x41\xe5\xb6\xa4\xad\xf2\xdc\x6a\x8a\xe4\x39\xe0\x45\x76\xa8\x12\xba\xb0\xf9\xb5\x24\x12\xbe\x00\x1e\x50\x21\x4f\x6f\x4d\x5a\xf6\xd1\x5e\xc5\xc1\x15\x70\xce\x07\x2b\x1f\xa9\xaf\x1c\xfe\x8b\xe9\x14\x5f\xaf\x53\x02\xce\x14\x8e\x38\x6e\x10\x5a\x00\xff\x84\x03\x63\x72\xe5\x86\xbc\x30\xbf\x1d\x46\xb0\xab\xa6\x6c\x22\xe3\x48\x97\xf6\x54\xae\xb6\x54\x05\x9e\x6a\xcc\x37\x16\x50\x46\xc0\x42\xe0\xa0\xb6\x05\x75\x62\x6b\xe9\x45\xbc\x08\x94\x74\xf5\xa1\x26\x9f\xae\xa7\x2a\x80\xba\x90\x9a\x09\x57\x9f\x3e\x88\x67\xda\x76\x24\x42\x5d\x7a\xef\xd3\x48\x5d\xbe\xd0\x0d\x45\x15\x43\x52\xb8\xa4\x49\x7b\x42\xab\xc1\x52\x4f\xe9\xbe\xa8\xff\x54\x90\x6a\x17\xe4\x8f\x71\x80\xad\xb1\xb1\xcf\xc2\x8d\x57\x1d\x8c\x37\x6d\xac\x36\x6d\x0d\xd7\x73\x6f\xc1\x96\xc5\xec\x2e\xea\x48\xba\xb9\x86\x61\x1a\xca\x68\x09\xc1\x27\xb1\x40\xe0\x69\xce\x23\xce\x0c\xc8\x4d\x8e\xd5\xb8\x1f\x46\x8e\x15\x72\x17\xa0\xdc\xd5\x2b\x1d\xb3\x82\x7b\x47\x03\xbb\xa8\xd4\x4b\x73\x53\x06\x03\x11\xc4\x94\x05\xea\x27\x3c\x17\xc0\x68\x93\x0d\x41\xcd\x1e\xcb\x0d\xcc\x18\xff\xc4\x21\x13\x65\xc6\x67\x02\x6f\x63\x42\x07\x3f\xb1\x69\x88\xc4\x1a\x5c\x5c\x11\x6e\x02\x08\x3c\xd1\x0f\xe2\x31\xc5\x86\x1a\xd7\x3e\x5a\x91\xa7\xcd\xe5\xae\x7e\xe0\x33\xb9\xc5\x7a\x7b\xd2\x49\x08\xe8\x2d\x32\x7b\x44\xf0\x46\x84\x4a\xde\x79\x39\xc0\x2f\x80\x3e\xde\x15\x51\x7f\x69\x84\x71\x90\x66\x53\xaf\x34\xc9\x81\x6b\x98\x95\x47\x3e\xb0\xf9\xa0\xf3\x08\x87\x06\xe4\xe7\x0a\xac\x83\xc9\x4d\x19\xd0\x01\x24\x5d\x76\x19\xf7\xbf\x2d\xac\xbd\x64\x88\x1a\x75\x22\x9d\x4f\x0d\x8a\x2b\xa4\x0d\x7f\xb8\xd1\x3c\x3d\x30\x4d\x80\x59\x2a\xb0\x2b\xa4\xda\x3e\x34\xe1\xf6\x55\x5f\x26\x7a\x75\x11\x61\xfd\x60\xeb\x66\x24\x81\x5b\x19\x03\x20\xb7\x05\x20\x3c\x43\x11\xeb\xe7\x83\x7c\x0a\xee\xa1\x0b\x30\xb1\xf5\x00\x76\x1e\x21\xa7\xe9\xed\x86\x73\x70\x3b\x3b\xe1\xd9\x7d\xb9\xa0\xee\xa1\x13\x12\x1a\xb4\xa3\xc9\x27\x60\xb3\xca\xec\x3c\x71\xbd\x02\x18\x1f\x1e\xaa\xc4\x50\x96\x07\x36\x62\xfd\x94\xea\xf3\x03\xbf\xbf\xe9\x63\xc1\xcd\x62\x18\x53\x3a\xe7\x7e\xbc\x9a\x7e\x28\x39\x4d\x31\x64\xf1\xe4\x19\x3a\xab\x6e\xda\xc4\xe7\x64\x90\xf1\x7e\xac\x47\x4e\x1e\x5a\x5f\x72\xfa\x4d\xa6\x81\xba\xe8\x1b\xd8\x14\x70\xd2\x7f\x03\xd0\x12\xdd\xee\x7f\x2e\x2d\xc8\x90\x77\x5b\x50\x96\x17\x60\x4a\xe7\xaf\x55\x03\xcf\x62\xf1\x33\x9a\x25\x5a\xe4\x4d\xe7\xfd\x49\x54\xc1\x47\x16\x54\x5c\x00\xa3\x14\x70\xf5\x4a\xf5\x73\xbf\xbf\xe7\x10\x00\xec\x9d\xb4\xb4\xe4\x74\x91\x51\xb8\xd0\x47\x84\xc1\x20\x2c\x20\x42\xf8\xac\x78\x2a\x85\xcf\x32\x50\x38\x0a\xe2\x84\xdb\x8f\x6c\x2b\xc0\xef\x94\xa9\x37\xc9\x70\x9e\x79\xf4\x67\x92\x58\x4c\xe7\x8d\xe7\x37\xe3\x9b\x18\x8f\x1a\x20\x91\x03\x20\x38\x25\xff\xb1\x80\x2b\x6c\xcc\x65\x70\x6c\xc6\xab\x44\x9f\x9a\x1d\x07\x91\x4c\x34\xc7\x92\xe3\xad\xd3\x1b\xf9\x13\xe0\x1d\x78\xe4\xfb\x85\x32\x7c\x63\x2c\x0d\x73\x1c\x18\x64\x92\xf1\x8c\x0d\xcb\x32\x98\x9c\xf5\x7b\xb6\xa4\x96\x67\xe9\xba\xa2\x61\xfd\x68\xc4\xe2\xae\xb9\x63\x1a\xc5\x07\xc4\x77\xb4\xba\x46\x8c\x7c\xb7\x13\x62\xe4\xf2\xb7\x0c\xce\x97\xde\x50\xb3\xc9\x01\x3c\x37\x6b\xf9\xc6\xca\x67\xda\x0c\x34\x43\xa1\x9c\x60\xa2\x7e\x62\x67\x3e\xf3\x68\x87\x0e\x96\x44\xee\xbd\xf8\x7e\x1b\xf1\xfb\x4d\x2c\x5d\xcc\xa1\x7c\x19\x4c\x38\x55\x8a\xe6\x9d\x4c\x91\xc2\xec\xaf\x52\x7d\x0a\x7e\x68\xd6\x2c\xe2\x5c\x7b\xee\xc0\x43\x08\xc0\x53\x03\x26\x2f\xeb\xbf\xa1\x00\x31\xf1\xf7\x6f\x1f\xb7\x25\x40\x22\x63\x15\xb9\x70\x3e\x93\x7b\xb8\x2f\xef\xf6\x79\x98\x03\x88\x9a\xef\xfb\x87\xa7\xf9\x02\x1d\xf1\xe7\x6b\x6c\x00\xf0\xc1\x36\x78\x06\xa3\x32\x5c\x3f\x9d\xdf\xe1\x6d\x49\x5e\xf5\x1c\x9e\xaf\x41\x7c\x79\x62\xf9\xf1\xc5\xbf\xaa\xaf\x4f\x47\x43\xc6\x03\x0b\xe0\x91\xc2\x41\x35\xdd\x14\x60\xdd\x03\x83\xa0\x03\xca\xa2\x8c\x93\xa8\xf2\xd2\x56\xc1\xc4\x64\xba\xf4\x28\x9d\x4f\x51\xdc\x6f\xef\xd2\x05\x9b\xee\xb6\xeb\x82\xb5\x0d\x7a\x3b\x85\xb3\x24\x0b\x65\x4f\x60\x70\x4e\x80\x2e\x04\x2e\xfc\xf9\xa5\xfb\x82\x87\x93\xa2\x95\xba\x9b\x93\x10\xeb\xcf\xcb\x7c\xef\x55\xbe\xed\x75\x62\xb8\x27\x78\x3d\xe2\x2f\x73\xcd\xe0\xfa\x2a\xd7\xd6\xed\x94\xab\x33\x7e\x39\xe9\xe4\xb9\xd1\x85\xc9\x54\x4a\xb8\x64\x81\x48\x5a\x66\xfd\x4b\xaf\xde\x64\x79\x28\x83\x18\x66\x5a\xfb\x38\x89\xdc\x68\xed\x8f\x4f\xaf\xcd\x9d\x30\x4e\xce\x91\x8e\xd7\x97\xe5\x5d\x1e\x8f\xfc\x61\x8a\x91\xe0\xe7\x9d\xd8\xe7\xf1\x88\xb4\x4e\xa8\xed\x93\x36\x99\x2d\xb4\xc0\x75\x4b\x32\x41\x3c\x2c\xfb\x65\xb3\xd7\xbd\x80\x1c\xb5\xfb\x52\x3a\x96\x05\x7e\x94\xef\x8d\x2a\x9e\x08\x0d\x27\x4f\x8d\x9b\xba\x81\x48\x16\x99\xbe\xfa\xb3\xe5\x31\x27\x28\x72\xd2\xf9\x78\xf6\x7f\x81\x39\xe7\x5a\x91\xb7\xd6\xb9\x7a\xfb\xda\x30\x92\x2a\x02\x9c\x2b\x5f\x34\xcb\x0e\xe7\xc6\x4e\xa4\x26\x95\x68\x97\x0a\x15\x70\xcc\xb4\xb8\xce\x4c\x01\xeb\x7f\x99\x35\x64\x7e\xaf\x98\x57\x06\xee\xe8\xa1\x80\x4b\xd8\xbf\xfb\x1e\x55\xa9\x5c\x84\x9a\xc1\x92\x6c\xdc\xa6\xbf\x1e\x9c\x28\x5d\x21\x96\x98\x91\x93\x21\x84\x14\x09\xbe\x1c\xd4\xe5\x83\x75\x93\xb3\x4f\xf9\xc0\x3a\x57\x96\xe5\x04\x44\xf9\x1e\x66\x02\xd0\x3a\xd4\xa1\x6d\x2f\xfc\xf2\xea\x04\x10\xa4\xeb\xc8\x85\xdd\x5f\x64\x03\x8e\x81\x2d\x31\x2e\x82\x13\xf9\xea\x28\x78\x51\x30\x6f\x68\xea\x4e\x76\x3b\xb7\x9c\x78\xe2\x8e\x7d\x6e\x10\x7c\x36\xb9\xc5\x01\x8a\xe6\x3d\x56\x34\x59\xf8\x83\x63\xc6\x77\xbe\x5d\x14\x35\x4e\x0c\x00\x7e\x91\x79\xe7\x52\x26\x33\x68\x8e\x97\x91\x7a\x60\x6d\xdf\xf1\x04\xa4\x6c\x4e\xba\x4c\xcd\x7d\xfa\xd3\xe7\xe5\x98\x22\x42\x58\x9a\x26\xac\x8e\x64\x19\x91\x04\xae\x34\xdb\x26\x37\xce\xa6\xdc\x1d\x00\xa9\x32\xd0\x78\xc5\x72\x67\x1f\x3e\x42\x24\xc8\x98\x1c\xa9\x2a\xed\x32\x99\xd9\x92\xc6\xa6\xfe\x66\x5b\xd5\x89\x37\xd8\xe0\xc5\xaa\xa1\x36\x86\xeb\x49\x5a\x7f\xfa\xe0\xc3\xbe\x09\x60\x8a\x2e\x6f\x3a\xfc\xc7\x98\xb2\x5b\xf9\xb2\xb6\xcf\xef\xf9\x05\x56\xcf\xe9\x9f\xe3\x08\x6d\xfb\x6d\xcd\x12\xbf\x6f\x32\xa0\x7b\xdd\x86\x90\xaf\xe2\x9e\xda\x2a\x60\x8a\x04\x9c\x33\x62\x1d\xb3\x74\x67\xac\xe2\xf1\xed\xa2\x35\x02\xc8\x9e\xd7\xac\x43\x78\xd1\x68\x9a\xb3\x9a\xff\x39\x8d\x19\xa7\x2d\x60\xf8\x94\x24\x03\x4c\xf3\x8e\x56\xd3\x3b\x48\x98\x74\x62\xa8\x9b\xbf\xef\x5f\x46\xb0\xd6\x95\x64\xcb\x92\xa1\xd8\x05\x78\x0b\x66\xae\x47\xb9\xe5\xd3\x03\x5c\xfa\x12\x26\xcd\x45\xef\x0c\x21\x17\x48\xc7\x02\x0b\x22\xf4\x32\x24\xa0\x53\x89\xc8\x0c\xf3\x75\x19\xc6\x78\x57\x34\x5d\x58\x2f\xd6\xb2\xd1\x2c\xe5\x41\xbd\x53\xac\x5a\x85\x84\x62\x65\xd3\x2d\xdf\x04\x8c\x6f\x14\xcb\x8d\x65\xef\x9d\xfc\xb4\x4c\xf3\x56\x6e\xb2\xed\x6e\x88\xfd\x4e\x39\x35\x43\x7b\xa0\x6b\x17\x5c\x4a\xff\xba\xd5\xd2\xbd\x4d\x3a\x76\x3f\xa5\xe7\x8f\x7f\x44\x2f\x1b\x5b\x26\x9c\x66\xb3\x45\x24\xd2\x77\x95\x31\xfc\x3a\xe0\x88\xf1\xb5\x74\xe3\x44\x57\xd2\x39\x5e\xfd\xeb\x2b\x10\x6c\xde\xbf\x29\x79\x5f\x05\x17\x6a\x0d\xfb\x13\x80\x6b\xf7\xae\xa1\x38\xe3\xf1\x08\x9e\xf3\xb1\x16\x57\xb9\xc3\xa0\x5b\x97\x85\xc6\xe7\x9b\x6f\x51\xd2\x0a\x22\x06\x0c\x16\x71\x65\x14\xe8\x44\x71\xbe\x6e\x38\x5f\x5a\x70\x2e\x8a\x50\xca\x10\x47\xde\x7c\xd5\x4d\xc8\x97\x43\x7e\x00\x68\x34\x27\xa2\xd7\x16\x60\x38\xc6\xf8\x68\x06\xed\x72\x71\x33\x50\xe7\xb7\x36\x13\xca\xab\xd5\x2b\x57\xd6\xf1\xd1\x04\xc8\x22\xa2\xb4\x37\xc9\xdc\x6b\x7a\x46\xfc\x44\xe8\x1b\xce\x97\xc7\x6e\x77\x7c\x10\xe7\x24\x79\x25\xdb\xba\xd8\x5b\x0f\x10\xbb\x89\xb2\xd7\xcd\x9f\x8a\xb4\x30\xf5\xc7\x1e\xba\xc6\xf3\x5b\xed\x30\x07\x1a\xa5\x44\xbc\xc1\xf1\x7a\xaf\xfb\xed\x2b\x2d\x16\xd9\xc6\x91\x01\xd6\x14\xa1\xf6\xf0\x89\x22\x3c\x60\xee\xef\xb3\x55\xd1\x45\x40\x8f\x8f\x70\x7e\x90\x0d\x20\xc9\x6a\x18\x6a\x2d\x59\x92\xdd\x30\x0f\x38\x8f\x07\xf0\x16\xe1\x5e\x59\x24\x40\x45\x04\xa0\x37\xf9\xe3\x56\x85\x1a\xc1\xad\x11\xb0\xa0\xc2\x5d\xda\xa8\x0a\x5b\xa9\xe3\x55\xeb\x17\x4a\x1f\x8e\xe3\x7e\xac\xd8\xa9\x1b\xc6\x38\x71\x41\x4b\x76\x3f\xbd\x19\x3e\xdb\x20\x75\x51\x9b\x22\x2d\x3f\x42\x9a\x80\x40\x7f\x0d\x27\xaa\x54\xd6\xec\xc8\xea\x54\xcd\xbc\x69\x11\x9e\xbf\xa3\xb9\x39\x9a\x3d\x47\x9a\x13\x9b\x9f\x5a\x27\xb5\x58\x4e\xde\x7f\xd4\xf0\x7c\x03\xec\x61\xd9\x02\xc0\xe0\xb3\x7d\x56\x10\x17\xff\x54\x7d\xee\xbb\x69\x7f\x49\xc0\xa7\xe1\x0d\x89\x25\x34\xaf\x4b\x5b\x81\x72\xce\xcd\xce\x97\x24\xde\xad\xc7\xdc\x87\xd2\xbd\xe6\x72\x5f\x40\x47\x5d\x0a\xdd\xed\x81\x67\x78\x7d\x28\x75\x0e\x35\xb5\xd0\xc2\x2c\x6f\x57\x22\x87\x9c\xde\x72\x11\x83\xe4\x37\x3f\x33\xe0\xb8\x8c\x1e\xe9\x3e\x16\x62\x4a\xb5\x93\xcd\xc4\x54\xb2\x24\x4e\xc1\x51\xfe\x4c\xf7\xe4\x94\xac\x64\x51\xbd\x11\x0f\xcd\x33\x4d\x59\x0f\x18\xc8\xaf\xaf\x57\xad\xcd\x77\x59\x80\x50\x03\xd7\x9c\xcf\x53\xf4\xa4\x06\xc6\xea\xfe\x8c\x34\x3e\x5b\x42\x23\xd3\x9e\xe8\xb5\x33\xc0\x4b\x7a\x6c\x8e\x9e\xfb\x8d\xe9\x6e\x6d\x70\x1e\x64\x6d\xec\x21\xfe\xa9\x8b\xfe\x1d\x4a\x1c\x19\xac\x30\x27\x03\x6b\x8d\xad\xf9\x3c\x01\x9d\xba\xed\x59\x31\x62\x03\x80\xfa\x6f\x1b\x4a\xe5\x0d\x36\x9e\x39\x2f\xc6\x14\xac\x9e\xa6\xf3\xa0\xa9\xef\xce\x2e\x77\x66\x07\x42\x76\xcd\x7a\x7d\xeb\xa9\xa5\xf1\x2e\x66\x53\xa3\x90\xb1\xb6\x77\x45\x69\xa2\x02\xea\xcc\xcd\x06\xab\x70\x7b\x6c\xbf\x8b\x0b\x2b\xa6\x9f\x8d\xeb\x6a\x4c\x0e\x1a\x91\x3e\xef\x0d\xd9\x63\x89\xd6\x4d\xc9\xa0\x8f\xca\xb0\x85\x39\xb3\xdd\x97\xe0\xfd\xad\x47\x7c\x4e\x5c\xdd\x90\x89\xb7\x57\xcf\xa8\xa6\x10\xd1\x5a\xb4\x56\x88\xa5\x60\x85\xf0\x90\x60\x77\x0f\x78\xd6\x6d\xb8\x24\x64\xeb\x6c\x2a\x09\x92\x81\x58\x02\xf7\xba\x5d\xde\x27\x01\x1c\xbc\xa3\x23\xce\xc4\x59\x15\xc0\xf5\x00\xd6\xc2\xba\xaa\xae\x0d\x04\xa0\x95\x61\xb1\x92\xb9\xbe\x0f\x74\x26\xaa\x74\x73\x29\x5f\x3c\x05\xac\xc4\x80\x73\xe7\xad\xa7\xfe\xb6\x9e\xef\x32\x5d\x82\xa9\xa9\xae\x64\x24\x35\x0f\x79\x0a\xd8\xdb\x30\xed\xe6\x69\x96\x02\x99\x4c\x9d\x44\x07\x26\x72\x84\x3b\x97\x1a\xb0\xbe\x25\xa4\x24\xe5\xae\x3d\xbe\xe9\x1d\x9e\xbb\x7f\xab\x53\x84\xc5\x86\x18\x71\x69\x77\x84\x7f\x1c\x5a\x0d\x7c\x51\x24\x27\xac\xb5\x5a\xa1\xe7\xf8\x06\x25\xde\x66\xa9\x56\xa8\x16\x63\x97\x55\xc3\xf9\x2c\x2f\xbe\x27\x40\x95\xf5\x41\x50\x53\xd5\x34\x96\x9f\xb4\x57\x86\x20\x66\xe0\x0d\xcf\xd6\x21\x67\x86\x8f\x02\x2a\xee\x2f\x11\xd0\x1c\xce\x08\x1f\x77\x5f\x59\x1c\x71\xb9\xc6\x76\x66\x73\xd2\x24\x9f\xe3\xfe\x16\x17\x9f\xb2\x1f\xe1\x8f\xca\x8c\x61\x57\x4c\x03\xd6\xd8\xdf\xda\x5f\x69\x06\xab\xbb\x06\x1a\x25\x77\xf7\xa9\xa2\x5e\x77\xa7\xe8\xa1\xd4\x95\x2d\xbc\x5c\x0b\xf1\xc6\xef\x73\x5a\x46\xb7\xf9\xcb\x49\x85\xed\xed\x7b\x03\x10\xad\x55\x64\xc3\x1e\x87\xf1\x5d\x52\x79\xf7\x03\x08\xc3\x32\x5b\xa1\xb2\xba\x92\x83\x15\x94\x61\x28\xe4\x4c\xc1\xf8\xfd\xa8\xd5\x69\xb6\xeb\x2a\x88\x43\x2e\xa5\x22\xe7\xd2\x26\xf9\xd5\x3f\x32\xa3\x4b\x91\xfc\x62\x3f\x50\x13\x13\xcd\x2f\x60\x72\x66\x40\xb2\x5e\xc7\x33\x3b\x3d\xe3\x1d\x8a\xa8\x80\x0e\x02\xbc\xc6\x3b\x85\x84\x63\x08\x61\xb2\x12\xdc\xd3\x44\xac\x3f\x1f\xa2\x2b\x0a\xe2\x10\xfa\x8f\x9b\xc2\x55\x4c\xec\x8b\xd5\xd6\x55\x53\x34\xe2\xe1\xf0\x32\x12\x10\x39\x67\xe0\xe0\xda\x6f\xe7\x19\xea\x85\x24\xbc\xde\x26\xd7\xb6\xcb\xac\xf6\x1d\x5e\x1e\xe4\x28\x96\x3b\xfb\x80\xef\x5d\xc4\x7e\x53\xac\xb4\xce\x62\x2f\x5f\xfc\x04\xc7\x01\xed\xd0\xa4\x62\x30\xa3\x35\x0e\xc5\xc7\xbc\x2d\x8f\x7a\xfe\x26\xb7\x3d\xf9\x23\x06\x2a\x4a\xa8\xcf\xce\xa1\xf9\x91\x4c\x7a\x5c\x1a\x0c\xec\xf1\xb1\x1f\xae\x43\x21\xaf\x58\x0a\xa2\xf9\x8c\xed\x42\xa7\x15\x17\xac\xed\xf8\x40\xd0\xb9\x45\x32\x7f\x6b\x01\x4e\xe8\x71\xed\xa9\xe8\xc5\x77\x5b\x48\x37\xbf\x68\x29\xfa\x79\x22\x40\xd1\xeb\x1e\x1b\x52\x71\xdf\xf9\x10\x60\xdb\x4a\xee\xd0\x51\x0c\x24\xb7\xe6\x10\x9a\xa3\x44\xc0\xeb\xbd\x1a\x4d\x7d\x38\x10\x96\x9c\xdb\x55\xb4\x37\x44\xc4\xf7\xf6\x9a\x16\x82\x39\xb7\xdb\xd3\xda\x36\xa6\x2f\x93\x7e\x0c\x09\xe1\x86\x46\x55\xd9\xa2\xc4\xaa\xec\xa9\x1f\x34\x99\xec\x0c\xb8\x22\x2a\x06\x4f\x53\xbc\x33\x70\xbc\x46\x92\xad\xf0\xbc\xe4\x3e\x1f\xa2\xa8\x63\x29\x42\x7f\x1e\xdb\xc4\x84\xde\x43\xbc\xc0\x9a\xe2\xc6\xa1\x53\x57\x07\xbe\x4d\x38\xee\xc5\x26\xe3\x97\x4f\xee\x94\x76\x53\x69\x74\x23\x18\x2a\xeb\x51\x38\x47\x65\x5f\xe7\x9c\xd6\x1c\xf9\xf3\xe3\xc7\x00\x05\x2e\xbe\xf6\x5f\xf7\x3e\x91\x10\x8e\x9d\x65\x74\x41\xba\x80\xea\xaa\x5f\x03\xf3\xd6\xc5\xc6\x22\x22\xa7\x3f\xe0\x7c\x45\x7c\xbc\xdf\x6f\xe8\x58\x70\xd2\xcd\xcc\x78\x27\x36\xd9\x86\xcd\x05\x81\x9a\xe2\xa8\xb6\xb8\x3d\x42\xa2\x4c\xb6\xb5\xdc\xa8\x15\xf6\x17\xf9\x59\x97\x5d\xd7\x97\x36\x4e\x3a\x85\x1c\x4a\x7c\x24\xe8\x81\xad\x39\x3b\x3b\xb7\x8f\x08\xc5\x48\x1d\x38\x25\xa0\x44\x16\x3c\x0d\x3c\xb1\x1f\xc4\x82\x36\xb6\x4e\x61\x16\x81\xe0\xa7\x78\xe9\xb2\xb9\x3e\xc7\xaf\x82\x7b\x1e\x1e\x01\x8e\x56\x3d\x0d\xee\xcd\x49\x02\x6c\x85\x5a\xd7\x73\x06\x57\xb1\x54\xd2\xae\x8c\xcd\x84\x33\x14\xc0\x5b\x7f\x05\xbf\xf7\x57\x2a\x0a\xe5\x4e\x0a\x29\x36\x30\x90\x6b\x0e\xbf\x33\xcb\x37\xc5\xbd\xdd\xcd\xc0\x9e\xde\xde\x3c\xa9\x67\xf9\xfa\x39\x00\x0c\xb0\xe0\xbe\x24\x3a\x66\xd7\x72\x33\x01\x4e\x87\xf1\x69\x70\x59\xbf\x19\x6a\x04\x8f\xaf\xa3\xe7\x12\xea\xd5\x2f\xb1\xe1\x3c\x42\xb9\x18\xef\xe3\x41\xb1\x37\xba\x49\x88\xa2\x4b\x8f\xc2\x70\xe8\x1f\xe3\xd9\x5f\xb7\x6f\x25\x2b\x6c\xad\x9f\x2e\xa3\xe5\x77\x11\x54\xca\xd2\xd1\x96\xb3\xbf\x2d\x5b\x09\x5f\xcc\x84\xb7\xef\x53\x04\x68\x30\x37\xfe\xd4\x81\x5f\xaa\x6d\x05\x07\x67\x6f\x1f\x3d\x95\x94\xe4\xc4\xbd\xab\xd0\x51\x7e\x78\x85\x34\xc1\x9e\xab\x57\xf9\xc2\xc2\x67\xf0\xb9\x0e\xde\x7c\x57\xfe\xf5\x12\x90\xe5\x3e\x10\xb2\x30\x70\x6d\xc0\x02\x5f\x8f\x69\xc0\x05\xb3\x1e\xe0\xeb\x82\x23\x21\x66\x5b\x31\x1d\x62\x25\x80\xa7\xb3\x16\xde\x68\x07\xa0\x16\x6e\x76\xa1\xab\x29\x51\x43\xa8\xa2\xbc\x23\xed\xa1\x2c\x32\xb4\x29\xa1\xe0\xf3\xc4\x72\x4e\xda\x13\xdc\x85\x4c\x00\x4c\x68\x41\xc9\xa1\xb9\x22\x68\x17\x5c\x51\x73\xd9\x9d\x3a\x8d\x29\x9e\xb2\x15\xc4\xef\x8c\x3f\xfa\xc3\x0f\x25\x83\xf0\xdf\xe1\x15\xeb\xca\x8f\xe3\xc3\x05\xf0\x78\x66\xe7\xfa\xb7\x44\x08\xc8\xa8\xc5\xba\x04\x6b\x31\xf3\xe9\xd6\x87\x26\x45\x36\x9a\x19\x2c\x6c\x2e\x19\xbe\x53\xf2\x33\xd2\xb8\xab\x2c\x7a\x31\x70\x44\xdd\xfa\x7d\xf4\x30\x5f\x16\x11\x3b\x16\xb3\x5a\x52\xa6\xca\x1b\x4a\xac\x4c\x23\x2f\xbf\x98\xbe\x50\xe9\x04\x80\x30\x65\x3f\x62\x3e\x01\x94\x4a\x9f\x5b\x80\x8c\xa9\xf9\x7c\xc1\x1e\x36\x2a\x16\x4b\xc8\x46\xc7\x27\x66\x94\x8c\xf1\x1b\x54\x6b\x41\xd0\x50\x22\xbe\x58\x58\x58\x3e\x71\xf9\x07\x30\xf3\x1a\x61\x72\xad\xf3\xa4\x6f\x16\xc0\x66\xcc\x8d\x64\xe6\x55\x8f\x01\xf7\xf3\x3a\xa7\xa7\xf8\x1c\x2d\x36\xc6\x7a\xf2\x26\x9b\x21\xc0\xb6\xfc\xc5\xda\x64\xc0\x79\x19\x81\x27\x58\x1d\x26\xe3\x7b\x3c\x46\x63\xd5\xca\x83\x8e\x0e\xdd\xe7\xfd\x32\x9b\x7d\x2d\x8c\x8e\xe0\xbb\x84\x4a\x25\xce\xd8\x30\xbe\x70\xb7\x92\xca\x9c\x42\xbc\x39\x4f\x1a\xa0\x6b\x24\xad\x11\xd9\x6e\xc7\xb8\x53\x68\xd4\xa8\xbb\x5f\x08\x38\xe1\x43\x84\x97\xb5\x0c\x18\xeb\x0b\xe7\x84\x65\x8e\xa6\x3e\xa8\x95\x85\xc3\xbc\xd0\x80\xa5\xc9\x1d\x29\x78\x42\xe2\x03\x00\x3c\x1b\x94\x6f\xe4\x09\x63\x01\xf4\x5c\x83\x0c\x12\xba\x31\xae\x7a\x46\x53\x91\x35\x0f\xb7\x36\xe6\xe3\x85\x3b\x7e\xbc\x54\x6f\x21\xa6\x9c\x65\x1f\xcb\xec\xf3\xc6\xd5\x21\x02\x68\x56\xda\xc0\xc3\xf5\xd7\xa9\x16\x80\x59\x96\x5a\x57\x2b\x0d\x12\x8f\x9e\x57\x7e\xa3\xe9\x44\xee\x9f\xb7\xe0\x7d\x8c\xed\x8e\x7e\xd2\xd7\x3d\xdc\x8a\x3c\x29\x16\xf2\x29\x36\xdf\x9f\xb1\x06\x02\xb1\x3f\xf6\xfe\xed\x0c\x14\xf5\x0c\xf6\x72\x04\x44\x53\x7e\x93\xcb\xc0\x33\x41\x70\x8b\x99\xfc\xbb\x47\x61\x5b\xf6\xa7\x69\x4d\xb9\x15\x02\x4f\xbe\xb5\xd3\x6b\x7c\x3f\xea\x76\xc3\xd8\x29\x2f\x54\x10\x4a\xbd\x66\x57\xe1\x49\x4e\x6e\xf2\x07\x13\x77\x03\x02\x96\x6a\xc2\xe5\x7a\x27\x12\x7d\x52\xce\x37\x17\xbb\x00\x2a\x0b\xf7\x9d\xcd\xd7\x80\x60\x87\x31\x92\xba\x71\x09\x61\x96\x10\xea\x99\xc3\xf9\x64\xc3\x2b\x1c\xc9\x2a\x6c\x90\xa0\x32\xc3\xd9\xc6\x01\x38\xcc\x4d\x3f\x88\x3d\xf3\xd2\xec\xe8\xb7\x27\xdd\x91\x26\x8f\xd3\xb3\xf0\x13\x49\x67\xf7\x26\x32\xe7\x33\x0a\x6f\xde\x49\x47\xb0\x4e\xdc\x4b\xc3\x07\xc3\xae\xef\x76\xf2\x66\x66\x0e\x48\x3e\xf2\xe8\x9c\xac\xbf\x28\x8a\x21\x05\x53\x9b\x51\x38\x33\x5c\x9e\x1a\x92\x00\xcf\x1c\x19\x00\xd3\x23\x8c\x06\x0b\x01\xe7\xbf\x51\x08\xf3\xfd\x23\x91\xe0\x6d\xa8\x55\xf1\x54\xe3\x72\x76\x65\x7f\x38\xd5\xb8\x28\xc8\x13\x19\x74\x3b\xaa\x18\xc3\x96\xe4\xc3\x6d\xce\x21\xe7\xdd\xf4\x3e\xb3\xf8\x85\x4d\x11\x9c\x13\x74\x4b\x29\xe9\x75\x43\xd7\x7e\x7c\x03\x90\x62\xe8\x64\x4e\x8c\x8e\xdd\xa9\x0d\xf7\xd2\x81\x77\x60\x91\x12\xd0\xdd\xef\xc9\x3d\x45\xc0\x56\xfa\xa5\xe1\xef\x14\x2a\xc7\xfc\xba\x76\xe1\x3a\xd9\x14\x92\x9b\x91\xef\x36\x62\x79\x05\xd6\xd3\x7a\xa6\xb3\xaf\x1e\x92\x7a\x04\x4a\x32\x43\x4d\xcf\xdf\xea\xab\xbe\xe7\xf0\x3d\xca\xa1\x26\x88\x9f\x44\x8c\x56\x21\x12\xd0\x07\x02\xae\xe8\x71\xaf\xe8\x70\x8e\xb6\xfc\x81\xb1\x80\x55\xdc\x4d\xb9\x6e\x00\x71\xf8\x61\x86\xb7\xbf\x41\xfc\xfe\x6a\x69\xb9\xfd\xd8\xdc\xbc\x70\xdb\xc6\x03\xce\x76\xb9\x40\x34\x13\x86\x8b\x34\xa2\xa8\x56\xf7\xfa\xc0\xbe\xf4\xf9\xfc\x69\x23\x3c\xc6\x5e\x04\xf1\xf9\x3e\x5f\x11\xf5\x57\x23\xb6\xb4\x57\x28\xde\x77\xb7\x16\x65\xc5\x78\xdf\xed\x35\x98\x56\xff\x9c\x8e\x50\x1b\x6c\xeb\xe7\x88\xfc\xb9\xd8\x85\x54\xa9\x1d\x17\x94\x17\x3d\x63\x80\x10\x3b\x7d\x8d\x1e\x07\x3c\xf2\x41\x52\xe1\xf6\x7b\x0b\x5f\x38\xdc\x5d\x7f\x63\x05\xfe\x56\xc4\x07\xce\xa3\x1b\x3c\xab\xaf\x6e\xee\x25\x7a\x8e\x4b\x9a\xd7\x31\xe3\x00\x2b\xa7\xce\xf3\x78\x59\x02\x1c\x82\xe3\xf2\xdb\xc4\xc9\x60\x8f\x94\x8d\xbd\x24\x39\x70\x22\x06\xd8\xce\xf7\xc6\x19\xe6\x7e\x8c\x61\x1f\xb2\x90\x8f\xa9\x21\xdb\x5f\x44\x6d\xb2\xb5\xc5\x45\xd1\x4a\x7d\xef\xc4\xc1\xfe\x74\x5a\x07\xf8\xea\x37\x54\xaf\xd3\x2e\xe3\x42\xbf\x9a\xc4\xdf\xb7\xcf\x86\x4b\xb5\xb5\x5e\xf3\xfd\x9d\x77\x09\x3f\xee\x9a\xd3\x33\xfe\x97\x9a\x16\xda\xcf\xc8\x54\x11\x2b\xbe\x22\xc3\x44\x7c\xbe\xea\x06\xa3\x0c\x01\xe6\xf6\x7f\xa9\x3c\x1a\x75\xcf\x1a\x0d\xd4\x6a\x9a\xbe\xda\x4f\x31\xa7\x2b\x65\x0d\xb3\x2b\x88\xc4\xa8\x45\x1b\xce\xd6\x28\x94\x7d\xcb\xa6\x98\xf8\x81\xfd\x7c\xcc\x4c\xa2\x7c\xb1\xe7\x90\xd8\x05\x79\xa4\x01\x9c\xf6\xb3\xec\xf4\x69\x7e\x7f\x42\xac\xcb\x88\xfd\x69\xdc\xcd\x46\x90\x81\x77\xd4\x97\xb8\x26\x0b\x43\x71\x69\x61\x90\xa4\x7e\xa6\xb0\xc8\x36\x77\x7e\xb4\x6a\x7d\xb1\x54\x95\xee\xdf\xe4\x4c\xb9\x56\x2c\x43\x6f\xf2\x46\xe2\x9d\xdf\xeb\xe3\x45\xf2\x73\x24\xd9\x18\x9c\x2b\x6d\xb0\x6b\x41\xa0\x8a\xfa\x1a\x64\x80\xca\x31\x56\x11\x6a\x0a\xd6\x3d\x4b\xda\x44\x8b\x00\x80\x1c\x30\x3e\x7e\xb1\xc2\x88\x15\xe0\x97\xe2\xd7\xbd\x9d\xb9\xa2\x50\xb1\x0b\xac\x90\x73\x50\x68\x33\x23\x5e\xaf\x82\x5b\x5c\x19\xbc\xa9\x90\x2c\xff\x14\xe3\x5b\xd5\x2a\xb9\x59\xee\x27\x93\x40\xc1\xe1\xe8\x71\xf3\x98\x97\x8a\x3c\x2a\xa2\xb8\x60\x7d\xe1\xa7\xe2\xf3\xb5\xdb\x3a\xa1\x89\x79\x78\xd6\xc9\xe7\x97\x37\x62\xf9\xd6\x41\x41\xd4\x4e\xb1\x79\x1b\x98\x0a\xec\x25\x5b\xad\x52\x9d\xda\x77\xd5\x0f\x4e\xb9\xb3\xeb\xe7\xda\xd3\x28\xb2\xfd\xda\x1a\x0b\x93\xe4\x0c\xe1\x3b\x32\x69\x8e\x33\x51\x1b\xb6\x0c\xb2\xba\x27\x12\xc4\x84\x0e\x90\x90\x3a\x52\x20\x50\xf7\xe5\xbe\x61\xb0\x4f\x69\xa2\xac\x42\x98\x86\xfd\x9b\x06\x85\xf1\xc6\x97\x49\x20\x24\xe1\xde\x7d\xa9\xea\xcd\xd7\x72\x8b\xc9\x16\x1f\xb8\xe2\x1d\xf0\x86\xb7\x38\x22\xdb\xad\xf8\x9a\xcc\x8b\x90\xbe\x0d\xd4\xe0\x09\xb6\x63\xef\x5d\x57\x7e\x96\x89\x7f\xcd\x3f\xfe\xae\xb4\xf6\x25\x02\x78\x6f\xdb\x27\x21\x96\xf0\x7c\x3e\x9d\x18\xb2\x29\x76\xa8\xaf\x0d\xf0\x6a\x46\xc8\x88\x52\x26\x04\xb7\x75\x87\x44\x65\xb0\x86\x28\xd5\xc1\xdb\x5f\xf6\xb6\xb9\x32\x02\x00\x15\x09\xc8\x5b\xfe\xd9\x33\xae\x9a\xd5\x10\x2a\x30\x57\x8c\x5c\xc2\xe1\x72\x93\x87\xb4\xec\xb8\x37\x91\x74\x70\x9f\x47\x70\x0b\xcd\x94\x54\x6d\x7c\x01\x3c\xc2\xdb\x26\x8c\xcb\x4d\xf1\xf7\x5a\xa0\xbf\x86\xd2\x28\x67\xaa\x62\x8f\x6f\x7c\x37\x49\x16\xae\xcd\x01\x67\xb9\x7f\x10\x1e\x04\x26\x2f\xc0\x71\xda\x9d\xc2\x28\x7b\x04\x80\x4d\xd6\x00\x51\x3f\x99\x76\x1a\xc9\x62\x20\xe6\x20\xdb\x19\xbd\x19\xf1\xf8\x34\xbe\xb9\x56\xa3\xbc\x19\xfb\xdd\xb0\xc4\x80\xa3\x80\x75\x2a\x40\x7c\x5b\xbc\x4b\x84\xfa\xef\x84\x13\x5f\x2c\xd4\xc7\x01\x51\xce\x74\x01\x13\x34\x9c\xcb\x29\xfb\x42\x46\xb9\xd5\x28\x9a\x8c\x9b\x60\x93\x1c\x02\x73\xbd\xa7\x56\xcb\x4e\xc6\x94\x01\xb0\x64\x1f\x9e\x41\x82\xdf\xe0\x61\xd9\xf3\x58\xae\x07\xb9\xa8\xef\x73\x49\xbc\x06\x3b\x43\x1a\x3d\x7f\x30\x71\x3f\x68\x85\xcc\xaf\xe8\xdf\x3c\xd8\xe6\x35\x48\x14\xf0\x82\xdc\xf4\x3c\xec\x17\x21\x03\x10\xdb\xed\x60\x27\x7a\x5e\xe6\x3f\xe3\xdf\xbb\x84\x67\xfe\x97\xa6\xda\xfb\x14\x45\xda\x01\x6b\x56\x4e\x3e\xb8\x0e\x54\xee\xfa\x81\xd7\x60\x32\xfb\x50\xd4\xc7\xd3\x7d\x6c\x1b\xce\x5e\xe8\xeb\x4a\xc9\x37\xf1\x9b\xe2\x03\x1b\x54\x9b\xd1\xdb\xd2\x74\x58\xd1\x6c\xdf\x37\xa8\xb9\xe3\xf9\xf7\x65\x8a\x0d\x68\x6a\x2d\x78\x26\x8e\x9e\xd0\xc6\xa3\xda\x5f\xc7\x80\x91\xca\x95\x32\x1e\xdf\x68\x92\x40\x86\xb9\x2e\xbd\xe8\x5e\xc3\x33\x28\x37\x06\x6e\xf3\x75\x12\x6c\x3a\xb0\xb8\xfe\xec\xdb\xf7\xb1\x3e\xf7\x59\xfd\x05\x52\xce\x24\x75\x3a\xd5\xef\xf7\xdc\x83\x7b\x01\xeb\x10\x46\xa4\x68\x35\xc8\xaf\x55\x1b\x83\xb7\x64\x9b\xbf\x9c\x53\xa6\xba\xea\x60\xb0\xa6\xe1\x30\x73\xe5\x0e\xf6\x27\xd4\x04\x06\x86\xfd\x86\x4d\x53\xf8\x12\xfb\x53\xb4\x62\x4c\xac\x7f\x8e\xf5\x71\xa7\x46\xa5\x4a\x3a\x02\xe7\x03\x28\x37\x1e\x9c\x85\x44\x74\x00\x5b\x10\x0b\xce\xf2\xdd\xfd\xc8\x52\xff\x99\x3a\x8d\x05\x0f\x83\x69\x14\xb0\x2d\x3c\xdf\x4c\x10\xde\x23\xc3\xaf\x4b\x6d\x6b\xe0\x7c\xe4\xb1\x41\xa1\x8e\x06\xcb\xc7\x1a\x70\xad\x77\x8e\x49\x6c\xc0\x4a\xdd\x91\x0e\x70\x58\x04\x1b\x7f\x5c\x09\xf1\x61\xce\xbf\x8c\x02\xcf\x4b\xc1\xdb\x9c\xf9\xeb\x7c\x0e\x5d\xf8\x5c\x1a\x6b\x40\x39\x89\x73\x19\x12\xfa\xf6\x5d\xb5\x9a\xe4\x16\xe5\xda\x58\xc8\x68\xe0\x7c\x92\xc2\x0c\x46\x31\x5c\x85\x9e\x91\x4a\x2c\x63\xad\x19\xd6\xc4\x96\x18\x9b\xf9\xd6\x61\x77\xfd\xed\x77\xd7\xab\xb9\xa8\xfd\xcb\x9b\x61\xef\x15\x2a\x96\xd8\xf2\x73\x84\xf3\x43\x55\x55\xdf\xaa\x90\x9e\xa5\x08\x0a\xd0\x6b\x32\x07\xd1\xd2\x3f\x6e\x37\xe1\x55\xfd\xcd\xda\xad\xa8\xf5\x55\x90\x32\x7f\xa2\x19\xc6\x23\xcf\x99\x9d\x00\x98\x01\x17\x2d\xd5\x39\x85\xae\xfc\x5f\x9f\xd5\x9b\x34\xcd\xb3\x83\xb9\x03\x9f\xcd\x56\x60\xdf\x84\xea\x00\x54\x51\x62\x4e\x51\x61\x8b\x5a\x00\x28\x91\x6f\x30\x12\x23\x5b\xcd\x8e\x22\x75\x3f\x34\x81\x45\x1c\xb0\xe4\x86\xf5\x34\x5f\x07\x2d\x5b\x35\xa3\xd6\x6d\x22\xab\x53\xf6\xe8\xb3\x07\x92\xe5\x33\x21\xb4\x64\xbc\xb4\xb8\xbc\x27\xd6\x13\xfc\x9e\x11\xe2\x68\x52\xc5\x2f\x1e\x05\xfe\x8f\x43\xaa\x1e\x36\x49\x21\x0d\xba\x7f\xdf\xf7\x5e\x32\x3a\x18\x1b\x01\xf8\x4f\x87\xcf\xd6\xb6\x37\xf0\xd0\xaa\x8b\x07\x77\x1c\xd6\xe7\x58\x4f\x4f\x34\x03\x94\xa8\x65\x9c\xf6\x1a\xcb\xf5\x60\x7e\x2f\x9b\x59\x38\xd4\x14\xd3\xe4\xbf\x33\x05\xc1\xe3\x19\x96\x96\x40\x90\x05\x3e\xd9\xfc\x50\xda\x00\xc5\x2b\x58\x93\xe6\xff\x9a\x77\x9b\x98\x06\xf0\x26\xd9\xde\x1e\x00\x04\x37\x33\xb9\x23\x66\x89\xfe\xb0\xef\x2f\x05\x16\x85\x79\x32\x4c\x0b\xc3\xf9\xff\xfc\xbb\x9a\xa7\x90\x1b\x23\x8e\xfc\x72\xcf\xc3\x80\xa5\x12\x50\x97\xd5\xea\x7f\x81\xfa\x77\x94\xbf\x7d\x29\x61\xbf\x9f\xfd\x74\x72\xa8\x01\xf8\x38\x9c\x1b\x24\x93\x27\x22\x8b\x92\xf5\x8d\x97\xeb\x87\xc3\xbc\x39\x34\xc3\xfb\x9e\x4a\xe5\xe4\x6a\xc9\x7d\x2f\x34\xf1\x9b\xde\x6e\xaf\x07\x0a\x07\xf4\x00\x8c\x60\xd6\xd4\xaa\xc3\x9a\x21\x3c\x5d\xa9\x86\x3b\x80\x03\x59\x87\x01\x2a\x41\xf0\xc5\x7b\x1a\xfe\x46\x0f\xe9\x93\x4d\xc0\xf3\x98\x66\x9f\xb2\x97\xa2\xa8\x61\xab\xd7\xdd\x45\x33\x50\x2f\x9c\xc3\xd3\x25\x58\x34\xcc\x3c\x10\xf3\x80\x33\xf4\xc1\xbd\x1b\xc8\x64\xd0\x5b\x34\x36\xea\xa1\xfe\xde\xe6\x9b\x21\xdd\x51\x94\xf1\x36\x02\x36\xcf\x07\x1c\xb8\xc0\xb4\x90\x15\x10\x1b\x87\xd1\x6f\x31\x7f\x32\xd5\x3b\x2c\xef\xd2\xfe\x69\x9c\xc7\xe6\xc9\xde\x61\x29\x17\x78\xf2\xe7\x7c\xfb\xc0\x9e\x66\x05\x7e\x95\xc5\x21\xaa\x78\xb2\x15\x85\xeb\x96\x0b\x9c\x75\xe9\x89\xba\x33\x43\x4c\x23\x91\xfe\x24\xb1\xa4\x3b\x8a\x9f\x4a\xee\xef\xb0\x20\x54\x86\x09\xa7\x82\x84\x6a\xfc\x64\xc2\x73\xad\x62\x87\xcd\x46\x12\x09\xd4\x1e\x02\xce\x8f\x52\x87\x7c\x1a\x19\xb0\x47\x41\xa0\x82\x29\xcf\xc8\xc7\x9b\x90\x30\x04\x29\xf1\x3e\x26\xec\x48\x80\x33\x0b\xfb\x53\x05\xa6\xf7\x86\xc0\xc3\x36\x2f\x8a\x0a\xf5\x99\x60\xcf\x16\x6c\xb3\xa5\x0e\x09\xbc\x76\x09\xb5\xa9\xc8\x19\x5c\xb3\xd4\x96\xfb\x8d\x9f\x65\x0a\x79\xa3\xf9\x02\x18\x43\x4e\x17\x1c\xdf\xe2\xb0\xcd\xa8\x85\xa5\x49\x7f\xe9\xbf\x2a\xc4\x9f\xdc\x0e\xbd\x28\x1e\x4b\xba\x77\xff\xde\x6e\xf7\x27\xad\x58\x4f\xd1\x85\xfd\x5d\xbc\x69\xc7\x52\xf9\xc3\x75\x1f\xb8\x4f\xbd\x76\x4f\xfd\xfb\x92\x70\xec\x7e\x93\x8f\x02\xd6\xcc\xc3\xb1\xfb\x04\x67\xc3\x31\xac\xe0\x69\x93\x71\xdc\x0c\x58\x53\xbf\x20\x09\x80\x19\x9a\x5e\x6a\xc0\x4e\x87\x6d\x2f\xd0\x8a\xe6\x24\x3e\x61\x26\xef\x53\x40\x33\x2e\x1a\x78\x18\xd9\x8c\xf6\x6f\x80\xa5\x52\x92\xd5\x0d\x0c\x08\x0f\xf0\x77\xc1\x4f\xbb\x7f\x3e\x92\x37\xa1\x11\x67\x36\x3c\x3c\xfb\x3b\x3e\xb9\x29\xd5\x1f\x2c\xd6\x09\x00\x27\x75\xe7\x43\x68\xce\x13\x9e\x7f\xbf\xee\x0f\x80\xd7\x1e\x14\x9c\x58\x38\x80\xd7\xe0\xbc\xa8\xbf\x49\x6c\x71\xde\x44\x00\x33\xd3\x88\xf3\xb3\xdf\xe8\x1d\x6a\xd6\xc3\x99\x98\x7f\x13\xfc\xc0\x6f\x69\xe9\x2a\xf6\xc5\x25\xa1\xb0\xd9\xbc\x19\x4b\x59\x28\xc0\x6e\x01\x8f\xe8\x34\xa4\x48\xc1\x6e\x44\xb7\x9d\xd6\x2f\x0e\xa6\x61\x49\xef\xfc\xd8\x4d\x41\x9b\x7f\xa3\x23\x5d\x00\xd2\x8b\xa0\x80\x3d\xfc\x72\x8f\x74\xb0\xe3\xfe\x6f\x70\xf5\x1b\xce\xe7\x05\x6b\x78\x53\xbc\xaf\x0b\x5e\x83\x75\x7b\xef\x6a\x1c\xe1\x54\xd2\x3a\xf9\x24\xcb\xfd\x36\x52\x52\xdb\x34\xb1\x70\x6f\x46\x3d\x93\xe1\xfa\x3a\x1f\x6e\x07\xe6\xff\x7c\xfd\x9e\xad\xd7\x46\xf2\xc5\xf0\x8f\x5f\x67\x9c\x29\xab\x5c\x33\xaa\xb2\x48\x0f\xcf\x08\x66\xf1\xee\xba\xcd\xab\x15\x87\xdc\x6b\xfe\x02\xde\xfc\xfb\x81\x5b\x22\x55\x4c\x30\x32\xf6\xcf\x93\xf3\xfa\x9f\x03\x50\x05\x18\x9f\xe0\x62\xfa\x3f\xe6\x8a\x2d\x0e\x7c\x82\x30\x99\xf8\x9a\x5f\x56\x20\xbe\x81\x10\x93\x99\x02\xf5\x14\xe1\x3d\x38\x1b\x10\xfb\xf2\xe0\x47\x4b\x16\x94\x0b\x6a\xe8\x12\xd8\x3d\x00\x70\x78\xe0\x75\x8f\xdf\xf2\x7c\x75\x62\xe4\x47\x4d\x18\x98\x79\x01\x3f\x3e\xb3\x88\x64\x9d\x68\x9d\x4c\x90\x25\x3f\x16\xcf\x15\x85\x2f\x87\x76\xef\x77\xe7\xbb\x9e\x67\xb9\xf0\xda\xff\xb4\x55\xbc\x3b\x4c\x20\x66\xe3\x03\x20\xec\xf7\xfd\x0e\x28\x33\xb8\x5e\x0b\x93\x6a\x6f\x84\x81\xa8\x8e\x31\xf6\x13\x26\x20\x12\x03\x80\x3b\xa9\xa3\xd5\xe0\x67\x3a\x29\x97\x89\x80\x58\x65\xf9\x6f\xeb\x01\xae\xb6\x91\x33\xee\xb9\x34\x51\xec\x3d\x5f\x63\xfb\x4f\x81\xe2\x38\x4d\xc7\x66\xd2\xe8\x83\x17\x54\xf8\xdf\x9f\x8a\x1b\x3f\x05\xcf\x42\x80\xb3\xac\x99\xc0\x5a\xd2\x9d\x61\xff\xe4\x17\x4b\x18\x40\x78\xe0\xdc\xeb\xd7\xfc\xba\x71\xdf\xa4\xa6\x60\x5d\xf6\xff\x7b\xec\x4f\xd8\xcf\x11\x50\xdd\x4d\xbb\xc1\x21\x1c\xe9\xe7\xf6\x2f\x8f\xc7\xc7\xba\xce\xe7\xed\xdf\x1e\xc2\xef\xa9\x25\xf2\xed\x5f\xff\xee\x79\xcb\xc3\x60\x4f\xff\xed\xcf\x8c\x8f\x75\xcc\xe9\xfd\x5f\x5f\xfa\xdc\xe9\xb2\xb8\xef\xff\xf6\x67\xf4\x5d\x96\x8e\xfd\x5f\xbf\x02\x6c\xa9\x56\xe4\xe4\xff\xff\x3b\xd3\xff\x7c\xe7\x7f\xbe\xf3\xbf\xf1\x9d\x1b\x56\x4c\x48\xd9\x04\xc6\x22\xb7\xc4\xef\xef\x55\x1b\xa0\x02\xeb\x4d\x3f\xc2\xd7\xeb\x7f\xff\x8f\xff\xf9\xbf\xfe\xeb\xff\xfc\xd7\xff\x0d\x00\x00\xff\xff\x45\x0c\x20\xc8\xb7\x06\x02\x00") +var _pagesAssetsStylesContainersCss = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\xfb\x59\x93\xa3\x58\xb6\x2d\x8c\xbe\xef\x5f\x11\x77\x6f\xbb\x66\xe7\x1c\x2a\x8a\xbe\xcb\xb4\xfb\x40\x23\x44\x27\x1a\x09\x01\xe2\xe5\x1a\x3d\x48\xf4\x9d\x80\xb2\xfd\xdf\xbf\x25\x77\x0f\x8f\xc8\xcc\xa8\xcc\xaa\x7d\x3e\xb7\x54\xb8\x0b\x56\x33\xd7\x5c\x73\x8e\x39\xc6\x82\xfc\x8f\xbf\xe7\x6d\x9b\x57\xe9\xd7\xa5\x1c\xe7\xb0\x2a\xf7\x70\x2a\xdb\xe6\xeb\xd4\xb6\x55\x14\x0e\xff\xc8\xda\x66\xfa\x3a\x96\x7b\xfa\x0b\x8a\x20\xff\xdf\xff\xfe\xd3\xc6\x5f\xfe\xf4\xee\xd7\x74\xed\xda\x61\xfa\x5a\xbe\x37\xfa\xdb\xff\x0b\x43\x25\xe1\x14\xfe\x5f\x8d\x53\x4c\x75\xf5\x35\x6e\x93\xf4\x1f\x75\x38\xe4\x65\xf3\x75\x28\xf3\x62\xfa\xe5\xef\x68\x5a\xff\xf9\x52\xbf\xf7\x7c\xd9\x52\x85\xcd\xdb\xdd\x77\x6f\x3d\xd3\xb7\x41\xa2\xb6\x4a\xfe\x62\x90\xf6\xf1\x35\x9a\xa7\x09\x74\xec\xc2\x24\x29\x9b\xfc\x17\xac\x5b\xff\xa2\xcf\x34\x94\x61\x03\x6e\xff\xa3\x6b\xc7\xf2\x75\xe7\x97\x30\x1a\xdb\x6a\x9e\xd2\x5f\xdf\x8d\x47\x7e\x9d\xda\xee\x17\xe4\x2f\x86\x89\xc3\xee\xfd\x7b\x18\x81\xb1\x9e\x65\x32\x15\x6f\x3b\xfc\xeb\x37\x4b\x90\x5f\xdf\x5d\x02\xfe\x88\xda\x21\x49\x87\xcf\x3f\xc0\xb2\xab\x2a\xec\xc6\xf4\x97\x6f\x7f\xfc\xc5\x5c\x63\x1d\x56\xd5\xd7\xa4\x0c\xab\x36\xff\x98\x8a\x44\x90\xbf\x5c\x69\x54\xe6\xbf\xed\xc4\xfc\x0b\x9d\x7e\x9c\xeb\xcf\x43\xe3\xc7\xf1\xff\xe8\xcb\x28\x8c\x1f\xf9\xd0\xce\x4d\xf2\x5a\x6e\x3b\xfc\xf2\x5f\x31\x9a\xb0\x59\xf6\xcd\x19\x68\xb7\x7e\x01\x4d\xcb\xe4\xcb\x7f\xe1\x21\x49\xd3\xc4\xa7\xe3\x98\x7f\xcb\xc6\xaf\xd1\xbf\x6e\x26\x68\xfb\x8f\x3f\xda\x95\x24\xc9\xaf\x7f\xb4\xff\x2d\x06\x7e\xad\xd2\x6c\xfa\xcb\x50\xf8\x8d\x39\x53\x39\xfd\x55\x6e\xfe\x68\xd1\x5b\xf3\x9f\x18\x95\x22\x69\x92\xa5\xbf\x7e\x7c\x43\x10\xe4\xd7\x78\x1e\x46\xf0\x77\xd7\x96\xcd\x94\x0e\x3f\x7a\xeb\xbb\xf5\x43\x5a\x81\x99\x96\xf4\xd7\x1f\x50\x07\xeb\xa6\x5f\x7f\x9f\x56\xbf\x2e\xe9\x30\x95\x71\x58\x7d\x05\xc6\xe5\xcd\x2f\x75\x99\x24\xd5\xbf\x13\x85\xc0\x4c\x60\x45\x33\xfd\xeb\x0b\xfd\xe8\xf0\x93\xa5\x66\x20\x28\xbe\xad\x86\x00\xab\xf9\xd1\xd8\xa6\x1d\xc0\xac\xbf\xb6\xc0\xde\xac\x6a\x9f\xbf\x84\xf3\xd4\xfe\xdb\xbb\xf1\x35\xae\xda\xf1\xdf\xdd\x93\xf7\x4e\x3f\x98\xfb\xcb\x34\x84\xcd\xd8\x85\x03\x58\xc5\x97\x79\xa8\xfe\xd7\x5b\x83\xff\x7f\xd4\xae\x7f\xcf\xcb\xec\x7f\x7f\x69\xda\xaf\x43\xda\xa5\xe1\xf4\x65\x8c\x07\x90\xd7\x5f\xe2\xf4\x6d\xa3\x8a\xf7\x95\xa0\xe4\x8f\x1b\xf5\x3b\xc8\x41\x41\x5e\xbe\x45\xdc\x6b\x37\x3f\xb0\x84\xfc\xf7\xd2\xe0\xc3\xbf\x5f\xca\x6c\x08\xeb\x7f\x63\xb1\xbf\xed\xf7\x23\xba\x7c\xb3\x9c\x7e\xfb\xf2\x87\xb4\x8d\x2a\xe0\x9a\xff\xfe\x7b\x5c\x84\xc3\x34\x7e\x2d\x9b\xaa\x6c\xd2\xaf\x51\xd5\xc6\x8f\x7f\xfc\x31\x1e\x93\x72\x04\x20\xbf\xfd\xf2\xb5\x6e\xf7\xcf\xb6\xed\xfa\x79\xfd\xc7\xee\xff\xfd\x7f\xbe\xbc\x8a\xc3\x97\x9f\x0d\xfd\xb7\xff\xf3\x4b\x56\x0e\xe3\xf4\x35\x2e\xca\x2a\x81\xfe\x69\xbb\x7f\xfc\x76\xe0\x4f\x33\xeb\xb4\x99\x7f\xdc\xd3\xb7\xe0\xfb\x8e\xca\x6f\x30\x15\xc7\x5f\xfe\x8b\xa2\xa8\x8f\x7f\xc0\xd7\x6f\x0d\xc6\x69\xab\xd2\x5f\xde\x56\xff\xed\xd2\xc7\x5e\x01\xff\x7c\xa4\x67\x92\x66\xe1\x5c\xbd\x67\xdc\x47\xf4\x7e\x41\x71\xe0\x34\x0e\x94\x9d\xea\x6f\x23\x08\xa1\xaf\x63\x3a\x94\xd9\xf7\xea\xd0\xce\xd3\xcb\x46\xd0\xba\x49\x7f\x4c\x84\x2f\xc8\x4f\xe2\xe5\xe5\xbd\x24\x5d\x7f\xc1\x00\x24\x20\xbf\x59\xd6\xb7\x4a\xf8\xe3\xea\x00\xb4\xbd\x85\x2a\x0c\x8f\x63\xf5\xf7\x7c\x9c\xc0\x6e\xc4\x7f\x8f\xdb\x1a\x4e\x93\x72\x6a\x07\xf8\xbd\x0f\xc0\xc5\xbf\x77\x4d\xfe\xbf\xbf\xbc\x07\xf0\xd7\xf5\x0b\x88\xc5\x2f\x2f\xec\xfb\x5e\xba\xfe\x39\x12\x55\x25\xd8\x8f\x77\xdf\xbc\x2d\xe1\x63\x61\xa0\x12\xff\x7c\x69\xa0\xbe\xa6\x2b\xe0\x1e\x69\xdc\x0e\x6f\x61\xf9\x7e\xfb\x9f\x40\xd2\x1f\x57\xf8\x15\x8c\x0a\x5c\x0f\xc2\xe7\x6f\x3f\xbb\x5b\x36\xcd\xfb\xdd\x7f\xfc\xf3\x6d\xfb\x58\x4c\x18\x86\xbf\x9f\x16\x2c\xfc\xcf\xe7\xfc\xc7\xef\xaa\xfa\xf7\x10\x78\xed\xd7\xb7\x25\xfe\x74\x8c\xef\x96\x7d\x1b\xe3\xcb\x57\xf4\x33\xb5\x3e\x06\x42\xbe\xbc\x2e\x7d\x1b\xe8\x15\x39\x20\x14\x7e\x9f\x12\x3f\x1f\xf5\xad\x58\xbd\x46\xfc\xb3\xe6\xc3\xf4\xf3\xeb\xdf\x17\xf8\x39\xcc\x07\x38\xbd\x61\xee\xff\x60\xc4\xef\x86\xfd\x38\xce\x3f\xcf\xdf\xbf\x5c\xd4\xbf\xd6\xf5\xaf\xcd\x79\x1b\xf2\x77\xeb\xfb\xe5\x97\xa1\x6d\xa7\x9f\x75\xfc\xc7\x1b\xaa\x7c\x60\x21\xf2\x27\x0d\x7f\x74\xe1\xbf\xda\xe5\x07\xa3\xfe\xd5\x2e\x1f\xc4\xf3\x37\x1d\xde\x81\xe6\xcf\x7a\x25\x43\xdb\x25\xed\xf3\xa7\xdd\x7e\xda\xbe\x1c\x5f\xc4\x36\xf9\xb1\x5e\x97\x75\x98\xbf\xe7\xf2\xff\xa7\xac\x5f\xfa\x21\x6c\xa6\x5f\xdb\x2e\x8c\xcb\x69\xfb\xe5\xef\xf8\xaf\x6f\xe0\xfe\xc3\xf7\xac\xac\x80\x43\x7e\x09\xab\xae\x08\xff\xd7\xc7\xf5\xff\x1f\x8e\xfc\xef\x3f\x9d\xf0\xcf\x3d\xfb\xd3\x8c\xff\xd3\xae\x9f\x1e\xfe\xf7\xbb\x7e\x78\xfa\xdf\xef\xf8\xe9\xec\x0f\x9c\xc1\x71\xfc\x07\x8f\xfd\x16\x83\x58\x96\xfd\x7e\xef\xcf\xd2\xec\xdb\x8c\x7f\x56\x02\x7f\xba\x83\xdf\xf1\xf8\x05\x2d\x3f\x18\xf2\x89\x56\xbf\xbd\xfe\xd3\xed\x29\x5e\x14\xec\x7f\xb0\x37\xff\xbc\xdf\x1f\x70\xfa\x9b\x43\xe2\x0c\x94\x5e\x36\xfd\xf8\x87\x0e\xb3\xbf\x30\x2d\x8c\x5f\x14\xe3\xa7\xb3\xb7\x5d\xda\xfc\x84\x71\x46\x51\xf4\xa3\x3e\xf9\xac\xb2\x51\x0b\x7a\xd5\x6f\x85\xef\xa7\x33\x65\x6d\x3c\x8f\xff\xa3\x10\xfd\xb3\x9e\xff\xc4\x11\xa0\x38\x36\xf9\xcf\x0b\xe0\x37\x08\xf8\xbe\x81\x6f\x74\x01\x14\xa0\x7f\xb1\x9a\x7d\x06\xe8\x8f\xe4\xf4\xbd\xfe\xd0\xaf\x82\xf4\x9d\x42\xfc\x29\x7b\x78\xff\xf5\x41\x2a\xdf\x19\xc4\x77\x16\xfc\x15\x67\x98\xb7\xa2\xf8\x2f\xda\xf4\x4d\x0b\xbf\x1f\x21\xfc\xd4\x8b\xbf\x6d\xf2\x3f\xd8\x86\x7f\x61\x80\xdf\x17\xe9\x8f\x13\x8d\x9f\x57\xf4\xcf\xf1\x5e\x21\xf3\xe7\x33\xbe\x5a\xfc\x45\xd5\xf8\x98\xf0\x9b\xe6\xfc\x1f\x8d\xf6\x07\xf3\xdf\x47\xfb\x06\x3a\xdf\x4a\xdf\x37\xe9\x0d\xe8\xef\x5f\x4f\xf4\xd3\x06\x45\x1a\x3f\xfe\xd5\x80\xfe\xfd\xac\x80\x96\xfe\x66\xd6\x72\x4a\xeb\x7f\xfc\x40\x30\xff\x9a\x3c\xff\x13\xce\x89\xfc\x86\x3f\xd3\x69\xfd\x96\x18\xd8\x9b\xaa\x2a\xc0\x2c\x5f\x81\x7e\x8b\x5f\x5d\x9e\x43\xd8\xfd\xc1\x84\xdf\x7f\x7f\x51\x89\x6f\x39\xf6\xbe\x06\x30\xe2\xb7\x19\x3e\xe2\x02\x7b\x3b\xad\xf8\xd1\x09\x4d\xfb\xe6\x1b\xb0\xfc\x2f\xbf\x1f\xf0\x6f\xbf\x6b\x58\x02\xf1\xf5\x87\x46\xbf\x9d\x11\xc5\xfe\x38\x7e\x18\xc7\x69\xf5\xcf\xfb\x7d\x18\x86\xfc\xae\xe3\xdb\x8a\xbe\xa9\xf0\x7f\xc7\xd9\x7f\x1c\xe5\xa7\xc5\xef\xed\xce\x9b\x69\x7f\xfb\x37\x3a\xfc\xce\x20\xa0\xb6\xfe\x09\xda\xff\xc5\x38\x2f\x57\xfe\xe3\xff\x96\x8b\xbc\x8d\x54\x00\xf7\x55\x7f\x80\xa0\xf7\x5b\xaf\x62\xf6\xb3\x13\x24\x2a\x65\x33\xe6\x77\x85\xfd\xb7\x17\xdf\x63\x35\x01\x05\x26\xfd\xa3\x78\xfc\xae\x1c\xbe\xbe\x97\xa0\x17\xef\xff\xbc\xf4\x3a\x17\xc0\x7f\xba\x99\x1f\x71\xf6\x47\x43\xdf\xbc\xf1\x83\x9d\xef\x90\xfc\xcb\x27\x38\x7f\x1e\x4a\x50\x60\x9e\xb7\x38\xa3\xfe\xe4\x74\xe2\x45\x90\x7f\x2e\xcf\xbe\x9d\x55\x50\x3f\x33\xef\xf7\x44\xfc\x2f\x6c\xfe\x69\xf3\xb7\x85\xbc\x19\xf8\x66\xc4\xbb\x3d\x3f\xce\xd6\xbe\x9f\xc2\x8e\x69\x95\xc6\xd3\x4f\x03\xec\xf7\x13\xfe\x65\x8f\xdf\x39\xef\xff\xa6\x04\x92\xaf\xf4\xfd\x82\xfc\xd1\x37\x6f\x79\xf2\x8f\xef\x14\xf0\xd7\xa4\x1c\x80\x39\x2f\xe7\x57\xd3\xf0\xeb\xf7\x15\x7f\x2f\xf1\x7f\xb6\x43\x1f\x92\xfa\x7d\x6b\xde\x2e\xfd\x8b\xdb\xf1\x6e\xc7\x47\x8d\xf8\x61\xb7\x7f\x18\xee\x0f\x6c\xe8\xad\x63\xdd\xa4\x75\xdb\x94\x31\x48\x17\x90\xbd\xbf\x17\xf4\xc0\x6d\xe9\xf0\x87\x83\x97\xdf\x76\x1c\xd3\x2e\x04\xcd\xdb\xe1\x47\x37\xfc\xe6\xdc\xf2\x7b\x0a\xbc\x19\xf8\xd2\xc1\xff\xf1\x1f\x7f\x7f\xed\xc1\xd7\x2a\x8c\x00\x04\xfe\xe3\x3f\xbe\x80\x9f\x3f\x1c\x6e\xfe\xc7\x7f\xff\xc7\xdf\xe7\xa6\xfc\x6d\xab\x8f\x49\x98\xb7\x9f\x5f\xbf\x77\x7c\x4f\xcc\x72\x02\x8b\x8d\xdf\x7a\xbe\xd3\xc9\xaf\x71\x37\xff\xd3\xf1\x7f\x18\x0f\x79\xfb\x79\xeb\x58\x36\x7f\xe8\xfa\xbb\x49\x41\xa3\x21\x7c\x7e\x7d\xad\x60\xfc\x71\xf0\x2c\xac\xcb\x6a\xfb\xe5\xcb\x7f\x0a\xed\x3c\x94\x80\x2f\x1b\xe9\xf3\x3f\xdf\xa7\xf9\xb1\x6c\x7d\xe9\x86\xf4\xeb\xab\x72\xbd\x4f\x07\x22\xe0\xe3\x54\xef\x75\x5e\xf9\xdb\x19\xa5\xb7\x9f\xb7\x76\x1d\x10\x6d\x40\xf0\x85\x60\x47\xbe\x14\xe8\x47\xb3\x27\x40\xa0\xb7\xa1\x7e\xf9\x12\x0d\x69\xf8\xf8\xfa\xba\xf0\xd6\xfc\xed\x79\xc6\xd7\xa1\x7d\xfe\xd4\xc0\xf8\xdd\xc0\xff\xfc\xdb\x97\xff\x04\xbb\xd8\xbe\xd9\xf5\x9f\x3f\x7a\xf3\xb5\x75\x5f\xde\xe8\xe4\xdb\xc5\x1f\xe2\xe8\xcb\x5b\x78\xbd\x5f\xfe\x1d\x98\xbc\x8e\x9b\xde\x6f\x7c\x1c\x37\x7d\xf9\x1c\xe0\x47\x16\xf3\x05\xff\xdd\xd5\xf7\x80\xfd\xc3\xe5\x17\x60\xfe\xe1\xe2\x07\xb0\xbe\x5f\x07\xeb\x1c\xe7\xe8\x55\x7b\xc2\xf2\xc5\x55\x3e\x4e\x0b\x01\x73\xe9\xe6\xe9\x63\xe1\xbf\x99\x99\xf8\x36\xda\x3b\xe0\x7d\x21\x90\xf7\x61\xfe\xab\x6a\xf3\xf6\xa3\xc3\x07\xa6\x7e\xc1\xde\xce\x4b\xff\x60\x10\xf6\x79\xf5\x8f\xc0\xfc\x1d\x33\xfe\xd0\xe2\xdd\xa3\x1f\xa6\xfe\xe1\xee\x27\x20\x7c\x3b\x6d\xfe\x7d\x83\x77\xcd\xfe\x82\xb0\xff\x7c\x3d\xec\xfb\xe5\xed\x3b\x0c\x70\x0a\x90\xfc\x31\xa5\x88\xbf\x95\x2e\x6f\x9e\x9f\x88\x76\xcc\x5b\x0e\xfc\x18\x97\x6b\x71\xb8\xe6\x1c\xc7\xd3\xd7\xd7\xd7\x52\xe0\x14\xf0\x5b\xe0\x31\xbb\xc3\xc1\x1f\xda\xc5\xab\x44\x1b\xe5\xf7\xeb\x23\x11\x94\x43\x25\xd9\xfb\x6d\x35\x9d\x1b\xa6\x3b\xca\x7c\xb2\x39\x2e\x35\xfa\xe4\x8a\x27\xb7\x07\x1c\x7b\xd6\x04\xe3\x81\xcd\x7a\xf6\x74\x7f\x8e\x41\x32\xe6\x36\x57\x2a\xd4\x53\xd9\x78\x3e\x68\x0b\xe1\xc2\x1d\x8f\x87\x03\xaf\x72\xeb\xcd\x53\x84\xea\x76\x95\xce\xc7\xf8\x22\xf9\x87\x7c\xba\x6a\x17\x15\x53\x88\x9e\x6b\xe7\x63\xc2\x97\x6d\x11\x96\xa8\x1b\x9b\x26\x91\xe1\x5a\x8a\x66\xfe\xb0\xd0\x29\x4e\xa3\xf0\xcc\x90\xe4\xde\xc0\x27\xf0\xef\x13\xe2\x0e\x67\xa5\x7e\xa4\x61\x19\xe6\x1c\x79\x6d\xaf\x8c\x39\xe5\xd9\x1d\x61\x95\xf5\x54\xb3\x39\xa7\xb8\x17\x93\x3b\x28\xbc\x58\x6f\x8c\xda\xf0\x31\x58\x9f\xc5\x89\xa9\x5f\x40\x89\xce\xc1\x30\x77\x5c\xa2\x27\x27\x70\xb2\xe8\xea\xa5\x7d\x59\x21\x19\xce\xe9\xce\x56\xab\x98\x53\xd4\x03\x47\x08\xca\x85\x7c\x8e\xfc\x43\x52\xb8\x4d\x20\xaf\x1b\x6f\x73\x1b\x9f\x73\xa3\x64\xee\x01\xd7\x72\x15\x70\x4e\x24\x57\x8c\x5d\x2a\x5c\x9f\x23\x1c\x6d\x9d\x55\x2b\xbf\x72\x98\x56\x3b\x38\x1f\x83\xdf\x4a\xdc\xdb\x39\x77\xb7\x0f\x5c\x7d\x29\x64\x95\x53\xb9\xf9\xc9\xe7\xee\x4d\xba\xe8\x9c\xce\x3d\x73\x21\x1f\x0e\x5c\xa9\xe7\x0e\x37\xe4\x47\xce\x8b\x6e\xdb\xf9\xa9\x71\x8b\x7d\xe5\x92\x96\xbc\x3d\x38\x96\xbb\x01\xf3\xea\xab\x32\xee\x1c\x97\x9b\x60\x5f\xec\x95\x70\x76\xfb\x04\x7a\x98\xf9\xc9\xd0\x60\x42\xab\xb2\x58\xf1\x88\x0b\x77\xe0\x9e\xa7\xd9\xdd\x83\x44\x47\xee\xa7\xeb\xac\xfa\xf6\xb1\xc9\x36\xc6\x14\x4b\x25\xd5\x85\x48\x97\x84\xdb\x39\xee\x0e\xc7\x9b\x4a\x0a\x5a\x5c\x91\xe3\xfd\x80\xdc\x1b\x0e\xd9\x4d\x11\xac\xe3\xb8\x34\xe7\x67\x46\x10\x16\x29\x36\xe4\xec\x14\x64\x1d\x35\x91\x09\x23\x6b\xa8\x43\x21\xcc\x2f\xca\x9d\x28\x98\x04\x86\x16\xe5\x29\xf0\x1c\x67\x3b\x23\xbc\x60\x15\x5c\x91\xc9\x4d\x8c\x4f\x31\x3f\xca\x1e\x1c\x52\x55\xc4\x19\x9d\xc7\x1d\xef\x19\xe4\x22\x3b\xf6\xac\x73\x2f\x1f\xec\x74\xa9\xf5\xd4\xb9\x33\x36\x4f\xa5\xad\x2b\x2a\x16\x8f\xc4\x42\x3e\xea\xf4\xc5\x2d\xdb\x08\x79\x12\xc4\x08\xc1\xbb\x55\x44\x90\xa0\x67\x4b\x04\xda\xd1\x10\x86\x0f\x4f\x4e\x3e\x86\xb6\x5a\x4f\x4f\xcd\x14\x61\x5f\x2a\xa2\x26\x9c\xaf\x2d\xdd\x6c\xcf\xb3\x70\xf2\x68\x9c\xdc\x2c\x68\x25\x5c\x18\xbe\x11\x1d\x92\x2a\xc8\xe8\x3e\x47\xe9\x36\xac\x9e\x52\x13\x57\x41\x35\x56\xbc\x26\xaf\x9d\x74\x50\xe2\xda\x25\x0a\xbd\xcb\x76\x7d\x95\xc9\x88\x15\x02\x03\x17\x6d\x61\x2c\x1e\x30\xe7\x0c\x37\x79\x8a\xa7\xf1\x29\xd3\x33\x67\x6b\xba\x58\xdd\x2f\x49\xce\x73\xd9\x72\x9a\xee\x7c\xab\x3f\x6c\xce\x0e\x76\x7b\x4b\xb3\x98\xe3\x54\x13\x86\x6e\x2c\xa7\x3d\x0f\xdc\x1e\xa4\x0f\xe2\xc9\x71\x8b\x99\xdf\x7c\xad\xbc\x4a\xc8\x7e\x14\x80\x1f\xcf\x9a\xc0\x6b\x03\xcf\xf3\xcf\x9d\x97\xb4\x9d\x13\xbb\x9d\x97\xa3\x9d\x93\x9e\x6a\xc1\x3f\xce\x9c\x28\x38\x9c\xc5\xf3\x02\x3f\x5f\x38\x99\xeb\x8b\xa3\x1a\xf0\x47\x17\xec\xe6\x94\x1f\xa6\x88\x13\x8f\x3d\x77\xae\xe7\x83\x3d\x9d\x0e\xab\xc9\xe1\x0d\xc1\xab\x71\x9e\x4e\x4f\xe9\x19\xe4\x47\x95\x16\x8e\xfa\x76\x14\xec\x33\xbf\x71\xb9\x73\xbb\x1c\xa8\x92\x97\xca\xfb\x94\x97\x7b\x9e\xfb\xf5\x8d\x38\x28\xb5\xa4\x18\xaa\xc6\x75\x82\xd8\x95\xfc\xf9\xac\x8c\xfe\x2b\x08\x85\xfe\xaa\xf6\x0f\x17\x55\x14\x58\x99\xe2\xc2\x26\xef\xee\xca\x41\x9d\x18\x6d\x02\xb7\x95\xcb\xa6\x2d\x87\x78\xad\x94\xe3\x76\xb5\xad\x2b\xd7\xb8\xdc\x1c\xe6\xd9\xb1\x1d\x8e\xad\x6c\x9d\x13\xd1\xb6\xfc\x9b\xe0\xb5\xf5\x72\x3e\x82\xed\xb4\x6e\x02\xd6\xf6\xd9\xf9\x02\x15\x68\xc2\xf1\x6c\xd9\x92\xf7\xdc\x38\xac\x62\x1d\x9e\x30\x4f\x8a\xef\x4a\x22\xdd\x94\xea\x76\x2c\x23\x59\xaa\xad\xca\x13\x5d\xef\xbe\xbb\x77\xd9\xcd\xf1\xa4\xb8\x46\x4f\x95\x2c\xe8\x67\xfe\x00\x99\xce\x1d\xa0\xa7\xe2\xb7\xb6\xfd\xac\x37\xe1\xa1\xf2\xb2\x77\x58\x6f\x36\x95\x57\xb4\x60\x22\x87\xa1\x55\xdc\x67\x2d\x16\xa2\x2c\xa8\x9b\xe6\xf4\x07\x08\x51\xfd\xf6\x02\xc5\x67\xe2\x76\xef\xd7\x87\x54\x1c\x07\x21\x9a\x95\x33\x51\x34\xa5\x9b\xaa\x4f\xc2\xf1\x49\x43\x51\x39\x5a\x7d\xcc\x67\x53\x28\x0f\xd5\x43\x54\x55\x01\xa9\x86\x8b\x31\x29\x7a\x78\x76\x3a\x91\xbe\x1c\x8e\x75\xec\x08\xd1\xf0\x38\xe2\x2a\x3e\xdb\xca\xd8\x0a\xa3\xa2\xa6\xe7\x89\xe4\xac\xc7\x01\xba\x40\x4c\x23\x92\x7a\x7c\x35\x47\x4f\x21\x1e\x4f\xb5\x2d\xcf\x97\x4e\xb5\x2f\x97\xbb\x5b\x59\xd0\xf5\xd0\x05\xcc\x66\x77\x75\xde\x57\xb2\xd1\x07\xf4\x55\xd0\x7a\xc5\xec\xd8\xf0\xe2\x61\x79\x52\x71\xcb\x95\x48\xbb\xc3\x7e\x46\xeb\xd2\x37\xea\x35\x10\x37\xca\x9e\x5a\xd6\xb7\xeb\xba\x6a\xc2\x2c\x69\x75\xa8\x42\xe6\xbc\x49\xf2\x95\x94\x2a\x56\xf0\x91\x7a\x69\x79\xa8\x69\xa8\x9b\x85\x24\xcf\xa7\x51\xe4\x98\xb8\x22\x45\xa9\xf1\xd5\x70\xf4\xc7\xa0\x5b\x4b\xfc\x78\x81\x02\x47\xbb\x49\x08\x99\x06\x9b\x64\x3f\xd1\x5d\x89\x6a\x2f\xbd\x89\x64\xb1\xb8\x6e\xde\xb3\x65\xc7\x48\x81\xac\x1d\xba\x2b\x55\xb9\xa1\x9b\x75\x7e\xd3\x57\x67\x37\x46\xaf\x30\xea\xd7\xbd\x80\x5e\x06\xd7\x86\x06\xbf\x0a\xd8\xee\x11\xb8\x23\x2a\xde\x7b\xbb\xb9\x4a\xfd\xe2\xf6\x67\xd4\x9d\xa9\x07\x36\x8c\xe4\x25\x41\x35\xeb\x7a\x62\xcf\x3e\x65\x42\x3e\x8c\x09\x50\x7d\x32\xc6\x36\x94\xce\xbd\x70\xbc\x68\xc6\xf5\x46\x67\xc7\xe3\x0d\x29\xa4\xf1\xb6\x05\x99\x74\xb3\xa7\x60\x73\x73\x6b\xd0\x8f\xf3\xcd\xf1\xd4\x68\x5c\x9a\xd1\x91\x6f\x12\xb4\x4e\x98\x8e\x4f\xa7\x2b\x62\xec\x7d\x1d\x82\x45\x48\x80\x06\x06\xeb\x6e\x1f\xcc\x75\x90\x73\x46\x6c\x82\xe6\x30\x98\x4a\x4c\x18\x7b\x33\x4e\xdc\x86\xc0\x7a\x24\x7b\x61\x8f\xd6\x83\x4f\x4d\x06\xdb\x51\xd8\x40\x87\xb7\x19\xdd\xe8\x73\x34\x51\xec\xb0\x24\xbe\x90\xd8\x2a\x32\x36\xd9\x95\x8a\x9c\x01\x4f\xec\x9a\x32\x86\xee\x3c\xb7\x1e\x85\xe1\xbe\x45\xdd\x69\xe7\x06\x4d\x24\x65\x37\xe8\xb6\x5c\x4d\x2a\xc1\xcf\x67\xd8\x9d\x58\xcd\x42\x25\x68\x58\xd0\x19\x3e\xcb\x7b\xfc\x34\xb8\x1c\x7b\xf0\xd5\x78\x72\x8a\x3b\x73\xda\xec\x1b\x54\x0c\xf5\xb1\x26\x90\x4c\x38\x10\x61\x7e\xde\xb0\x92\x7a\xc4\xe7\xb6\x65\x25\xb5\xdd\x52\x42\x9d\x29\x39\x80\x4e\x68\xca\xc7\x50\xd0\xaf\x8b\x7c\xd4\x46\xc3\x20\x2b\xfc\x38\x32\x37\x4f\xed\x4e\xd3\xfc\x58\x35\x47\x22\x75\xa2\xdb\x83\xf3\x50\xd7\x21\x85\x44\x8e\x93\x9c\xf6\xd3\x26\xec\xf1\x60\x94\xe3\x96\x6e\xa6\x99\x78\x71\x48\x82\x0d\x9b\x6a\x06\x83\x37\xa3\x08\x5d\xa9\x39\xb9\x5a\xb9\x87\xfa\x4a\x46\x61\xd5\xec\x3a\x1f\x04\x46\xb5\xa4\x63\x2d\xdd\x20\xb7\xa9\x3c\xd6\x8d\xfc\xe1\xd0\x78\xbe\x39\x8e\x60\x91\x9e\x8b\xad\xf6\x11\x4d\x23\x51\x1d\xa9\x9a\x99\xb1\x5e\xc3\xa2\x21\x3e\x63\x35\x86\x67\x92\xa9\x5c\xef\x5b\x73\xd1\x32\xd7\x89\xa6\x76\xa5\xad\x7d\x14\xe6\x2d\xa4\xb9\x68\x32\xb3\xa0\x60\x4b\x1f\x8b\xb2\xc8\x92\xe3\x67\x7c\x28\x70\xcf\xc4\x6d\x3a\x93\x55\x24\x89\x57\x2c\x92\x05\x86\xa2\x9c\xc2\x38\x99\xdd\xaa\x35\x22\xe5\x26\xcd\x11\x4b\x8b\x98\xc4\x77\xe3\x9c\xd6\x17\x52\xd4\x0f\x5d\x82\x55\x6b\xe2\x44\x61\xaa\x75\x18\x95\xa5\xe3\xec\x92\xe7\x61\x9e\x27\x0d\x45\x60\xef\x5e\xd3\x73\x84\x6b\x78\x10\x25\x4e\xb2\x8b\xb8\x94\x85\x0b\xed\x5c\xa8\xe8\xc8\x54\xc9\x73\xc7\x17\x3b\x73\x9e\x2c\x7a\x2f\xe3\x78\xbf\x37\x61\x1a\x75\x8c\xbe\x3f\xcc\x78\xf1\x9b\x20\xf5\x5c\x9a\x5e\xce\xa4\x35\x92\xcf\xba\x99\x6e\xcf\x28\xbe\x47\xab\xb4\xe4\x4b\x3c\xd1\x37\xb1\x85\x2c\xcf\xa7\xf6\xf9\x21\x5a\xe3\x0d\xe2\x3a\x96\x6a\x88\x14\xea\x06\xa2\xc4\x77\x0c\x52\x70\xda\xcb\xba\x0a\xe2\xe1\x2d\x85\xf6\x85\xda\x60\xcc\x82\x74\xb8\x48\x33\xc5\x63\xae\x84\x74\xe3\x64\x9e\x4b\xaf\xfc\x72\x3b\x84\x79\x74\x12\xc3\xe7\x29\xe3\xd5\xc7\xa1\xb3\x63\x94\xbf\x21\xd2\xfc\xbc\x2d\xa2\x48\xb8\x76\xfe\x54\x45\xf7\x91\xc5\x9d\xb1\x3c\xf9\x6c\x3b\xc2\xd5\xfd\xc4\xae\x8d\xae\x0e\x67\x29\x6e\x95\xe6\xec\x86\x47\xb8\x7d\xee\x42\x70\x92\xa7\xdb\xf9\xde\x46\x96\x60\x30\x76\x56\x43\x35\x74\xdd\xbb\x5d\xbf\x29\xa5\x09\xe0\x5e\x29\x09\x19\x7b\x04\xf5\x39\x23\xb3\xb3\xdd\x69\x77\xad\xd7\xe7\xee\x3c\x49\x06\x12\xfb\x0e\xae\x1b\xe1\x48\x4a\x0d\x1d\xd0\x98\xc9\xdc\xa0\xee\xae\x3f\x68\x0c\xeb\xb1\x18\xa4\xc4\x70\xec\xc6\x6b\xbd\xde\x69\x75\x26\x72\xbd\xec\x67\x45\x22\x0a\xb8\x90\x98\x20\xbe\x24\xfc\xe9\x21\xa4\x98\x4a\x9e\x9c\xdb\x2a\x62\x2a\x81\x9f\x04\x12\xdb\xc2\x13\xb9\x3f\xea\xea\xe2\x25\x47\x73\x26\x93\xad\x9c\xcf\x59\x4d\xc5\xb4\xde\x34\x31\xe3\x39\x6e\xf0\x90\x9f\x44\x11\xe4\x97\x8a\x56\x60\xf2\x76\xca\x6d\x80\x51\xc7\x03\x5c\x75\x18\x69\xc8\x67\x6b\x2b\xd4\x59\x72\x10\x0f\x6a\x5b\xac\xbc\x46\x47\x7c\x3e\xb4\xcc\x63\x0e\x13\xb7\xf3\x31\xd3\x40\xe8\xec\x6a\x51\xa1\x12\x58\xe7\xc6\x3f\x9e\x9e\x95\x75\x2d\x27\xf2\x71\xae\x2f\xf3\xc5\xda\xc1\xf0\x07\x74\xa2\xc6\x9d\xad\x56\xec\x82\x90\x95\xba\x5d\x1b\xcd\xb8\x88\x5e\xed\x4d\xc2\xe2\x9f\xf4\xb8\x9d\x10\xb6\xd6\xb6\xd9\x11\xd3\x33\x49\xd6\xb8\x76\x24\x4d\x79\x5b\xb2\x87\x02\x57\x3b\xc3\x8e\x6e\xa4\xb8\x27\x24\x34\x91\x6b\x4f\xda\x62\x11\x9c\x74\x2a\x1f\x52\x00\x30\x1e\x5e\x12\x17\x1d\x55\xbc\xc9\xde\x71\x2c\x82\xa8\xe5\x71\x17\x08\xc5\xcb\x74\xcc\x1e\x25\x81\x18\x75\xeb\x36\xcb\x45\xc0\xa4\x5c\xb9\x20\x1e\x2d\x95\xa6\x7e\x5d\x13\x5c\xbf\x4b\xc9\x75\xe8\x1e\xe9\xb1\x79\x22\x0d\xae\x87\xa7\x79\xab\x16\xd4\x26\xaa\xe2\xe2\x66\x6a\x9f\x26\xfb\x76\xaf\x34\x11\xe9\xbd\xca\xde\x66\xc1\xdd\x2f\x6e\x1f\x38\xea\x86\x51\x33\x2b\xf5\xe4\x6d\x75\x8b\xca\x3b\xbb\x34\xd6\xfb\xa8\x3b\x79\xd9\xd6\xfa\x95\x0b\x8d\xb1\xb6\xb5\xc3\x52\x3e\xcf\xc3\xbd\x26\xaa\xc4\xf4\x59\x97\x61\xfd\x6a\xc2\xa6\x21\xbd\x0c\x99\x46\xa7\x93\x02\x72\x68\x88\xfa\x1d\xf7\x22\x68\xb9\x0c\x68\x6f\x27\xbe\x5d\x2c\x9c\x31\x9c\x97\xf5\x9e\x5e\x23\x1f\x43\x35\xbc\xb9\x14\x69\x3d\xa0\xf7\x11\x43\x5e\xe8\xc0\xed\x6e\x61\xa4\x68\xb4\xeb\xe1\x88\xc1\x5a\x61\xf4\x16\x96\x76\x28\xec\xc7\x13\x20\x55\xd8\x30\xd1\x74\xa0\x4e\x83\xb7\xb0\x28\x9e\xc2\x27\x33\x5f\x11\xd7\x64\xe9\xa5\x32\x37\x66\xba\x4c\x84\x8b\xcd\x00\xb0\x71\x34\x9a\xf4\x39\x9f\x30\xeb\x58\x2b\xd1\x3c\xc0\x75\x36\x61\xc4\x19\x4f\xac\x35\xa0\xac\x94\x72\x69\x1e\x0e\x24\x1a\x9a\xfa\xe4\xc8\x8e\xb8\x06\xc1\x0b\xad\xa8\x91\xab\x60\xf7\x33\xa9\x98\x8d\x58\xd5\x04\xbf\x60\x1d\x40\xa7\x26\x45\x63\xa9\xed\xc5\x51\xe5\xc9\xf8\xd0\xe0\x14\x70\x31\x64\xd8\x94\x26\x9b\x4f\x76\x17\xf7\x04\x0a\x32\x3a\x43\x05\x73\x52\xd2\xcb\x72\x31\x07\x16\x1d\x04\xec\x1e\x85\x1c\xdb\x46\xf8\x42\x29\xdb\xbd\x39\xa3\xa9\x7c\x4d\xa1\x09\x66\x21\x7a\x97\xef\x37\xdc\x97\x8d\x1b\x0b\x8a\x92\x90\x68\x22\xbe\x42\xe9\x45\x78\x40\x66\x13\x68\x69\xda\x5c\x09\xd8\x4a\x2e\x01\x2e\x37\xb8\x63\x6d\x41\x88\xa2\x67\x3f\x42\x1b\x9b\x81\x52\x6b\x4d\x10\xfa\xb1\xe1\x3e\x9c\xa9\x0c\x4b\x37\x77\x14\x7f\x2e\xb2\x88\x28\x4b\x52\x62\x9b\x87\x5f\x28\x84\x1d\xee\xa8\x9c\x35\x22\x4b\x5c\xcb\xc5\xc3\xe0\x21\xc8\x32\x9d\x76\x63\x66\x68\x1c\xc4\x49\x47\x1a\x49\x61\x27\x83\xbb\xfe\x69\xb8\x3b\x0a\xdf\x7d\xbd\xc2\xb2\x14\xd8\xb9\xce\xcf\x08\xb8\xa8\xc6\xcf\x1b\xa1\x46\x03\x0a\xc9\x11\x46\x9f\x13\x5c\x98\xc9\x13\x2e\xa1\xd4\x1d\x2f\x17\x58\xa7\x43\x38\x6d\x65\x28\x87\xfb\x8c\x76\xa0\xd1\xf3\xb9\x28\x15\x89\xdb\x89\xcf\x77\xc6\x08\x44\x88\x31\x85\x5b\x0a\xf4\x95\x03\x23\x44\x56\x20\x8f\xec\x74\x66\xaf\xf7\x73\x69\x1a\x77\x12\xc9\xe4\x75\x34\x8e\x03\xbe\x05\x27\xca\x21\xc2\x74\xeb\x56\xcb\xda\x1a\xd2\x83\xf1\x66\x88\xa9\xa5\xc1\x61\xbc\x84\x90\xc5\xf2\xac\xfd\xc6\x70\x0b\x59\x32\x10\x3c\x34\x75\xc7\xe0\xfa\xd2\x53\xf5\x62\x8e\xf1\x7d\x5d\x21\x66\x6f\x1e\x2c\x13\x46\xcc\x10\xd3\x51\x96\x42\x04\x4d\x0f\xd9\x4a\x23\x59\x7d\x01\xbc\xda\x22\x6d\x86\x95\xa9\x1b\x93\x36\xc8\x01\xc6\xad\x39\x61\xe0\xe5\xb9\xb0\x40\x2a\x40\x08\xac\x2a\x01\xf3\xd2\x79\xc7\xdb\x63\x92\x01\x03\x85\x39\x8b\xe1\x60\x4a\x60\x3b\xf2\xf4\xba\xae\x82\x62\x10\xc4\x80\xcb\xea\x25\xf8\x2e\x10\x77\xce\x2f\x2b\x0b\xbf\xbd\xee\xc9\xc9\xa1\x32\xce\x76\x96\xf2\xb9\x7d\x51\xee\xd6\x9d\x9b\x5f\x4a\x91\xcb\xb9\x43\x75\xb0\xdd\x33\x81\xcd\x7b\x92\x60\x7c\x84\xe2\x0d\x1e\x7b\xca\x59\x39\x1c\x2e\xaa\x7e\xc7\xbb\xf2\x6c\x46\xb7\xd7\x69\x85\x1f\x54\xb3\x3d\xa5\x71\x7b\x1f\x03\xec\xe1\xc5\x98\x89\x6c\xc1\x44\xd0\xe7\x05\xc1\xcf\x0f\x73\xac\xa3\xae\xae\x8e\x04\x8d\x56\x1e\x63\x84\xe8\xc0\xd5\x05\x72\xd6\x64\x41\xa9\xe8\x3b\xc2\x3f\x72\x9e\xbf\x2b\x0b\x0e\x0a\x12\x24\xdb\xac\xa4\xb4\x12\x2d\x12\xe2\x42\x3e\x21\xfc\x71\xa9\x63\x72\xa7\x1b\xe6\xa4\x33\x44\xc6\xc7\x55\x92\x0d\xa2\xfd\xb6\x26\x4e\x11\x72\x42\xe6\x28\xf1\x79\xe5\x32\x4e\xb1\xc7\x99\x45\xd2\xe3\xb9\x52\x65\x42\x18\x3a\xc0\xa3\xbe\x35\xba\xba\xa8\x03\x01\xc7\x46\xe8\xa3\x51\xeb\x5c\xca\x25\xd1\x41\x58\x8b\x2e\x60\x96\x9c\x07\x73\xa8\xd1\x1b\xe7\x22\xb0\x04\x37\x87\xb7\x2e\xb6\x21\xdc\xea\xa0\x21\xef\x2b\xcc\xae\xa6\xbb\xe9\x2e\xb6\xa5\x06\x46\x4d\x8e\x7c\x46\x32\xfb\x60\x1b\xe2\x40\xa5\x08\x9b\x5a\xbc\x7d\x01\xc0\x70\x79\x0c\x9b\xb4\xc3\xb0\x79\x6e\x05\x5f\xc4\xb7\xd8\x7e\x8d\xc2\x73\x57\xa3\x82\x09\x53\x28\x9e\x80\x74\x3c\x47\x0d\xf1\x66\x10\x23\xd7\xc5\x1f\x5c\xc4\x91\xce\xae\xe4\x3d\xb9\x43\x97\xd1\x10\x9c\x9f\x64\x11\x45\xdb\x30\x7a\xc4\x4c\x82\xe2\xf4\x8e\x56\xdd\xc5\x43\xf8\xa8\xa0\x48\xf3\x7d\xad\xb9\xc6\x97\x13\xbb\x00\x1d\x14\xc3\xc9\x50\xc5\x15\x0c\x35\x4e\x9f\xd2\x8d\xaa\x44\xf7\x6b\x18\x02\xd1\xda\x8a\x40\x1d\xca\xcd\x0e\x08\x9f\xb1\x33\xf8\x52\x34\xf7\xc7\x4c\xf7\x53\x06\x05\xaa\xd6\x85\x0a\xf9\x34\xae\x77\xf9\x19\xbf\x8d\xc7\xab\x23\x8e\x83\xe8\xa0\x1a\xc7\x85\x60\xf8\x11\x3f\x7a\x28\x19\xd1\x9e\xed\x14\x51\x90\xed\xb7\xa1\xf0\xbd\x61\xe0\xda\x61\xc6\x69\x9a\x17\xcf\x97\x98\xda\x47\x78\x3a\xaf\x3f\x6d\x3a\x72\xbb\x71\xa7\xa1\x07\xc9\x40\xea\xb5\xb9\xf0\x30\x15\x57\xfc\xca\xd9\xd6\x4c\x04\xe2\x73\xd4\x85\xe7\x76\x5a\x34\x35\xc2\x57\xa3\x67\xfd\x8b\x9a\x0a\xe1\x43\x61\xc4\xf7\x7d\xd1\xed\x13\xc3\x40\x28\x7b\x66\x88\x8b\x05\x4b\x97\x07\x99\x2b\xfc\x5e\x78\x60\x3e\x30\xdb\x10\xa1\x2b\xf1\xbc\x85\xbc\xfb\x1c\x98\x6f\xfb\xc2\xf3\x7d\x88\x2d\x30\x9d\xc2\x70\xac\x5c\x17\xc4\xac\x90\x8d\xbc\xcd\x5e\x34\xd5\x89\x7f\x46\x0c\x13\x11\x14\x6d\x87\xe0\x56\xc2\xc5\x0a\xe9\x8e\x36\xa3\x0b\xac\xd1\x1a\x12\x0c\x53\x5d\x72\xbf\xd5\x2a\xb8\x23\x4c\x90\x8a\xe8\x6f\x03\x1e\x38\x7b\x1b\x17\xdd\xb9\x92\xe6\xb1\x78\xc6\xd0\x00\xa8\x88\x5e\xc5\x2b\x02\xc5\x83\xd6\x83\x71\x55\x02\x49\x7a\x34\x44\xf6\xc7\x05\x64\x03\xc2\x2e\x11\xcb\x50\xc5\x73\x4d\x42\x6f\xa1\x4b\x76\x8a\x4a\x22\xf7\x0e\x04\x23\x8e\xa3\xcc\x7c\x38\x56\x88\x9d\x0e\x9b\xd3\xc5\x9c\x1a\x37\xdb\x2b\xb7\x9f\x92\xe5\x58\x16\x1e\xd8\xf7\xb6\xd6\xef\xa1\xbb\x70\xbc\xe3\xa3\x89\xcf\xee\xbd\x2c\x0e\x67\xc0\x8d\x66\xdf\xcf\xa0\x7e\x3d\xe3\xc6\x36\xce\x8f\xe8\xc4\x2d\x6f\xba\x13\x24\x2a\x47\x98\x67\xc4\x5c\x60\x14\xc7\x19\xe2\xb4\x1b\x60\x3c\x08\x94\xc1\xbc\xd7\xc6\x7e\xf1\xe9\xcc\x8b\xc4\xc8\xb1\x6c\x41\x03\xa4\x65\x31\x65\x87\xd8\x34\x0f\x9b\xfa\x05\xd6\x90\x4a\xbd\xb8\x30\x45\xcc\x49\x27\x3b\x1c\xdd\x68\x8c\xf0\x66\x1f\x57\x98\x44\x2a\x17\x52\xea\x56\x1d\x35\xf7\x03\xac\x0f\x16\xe0\x64\x51\x8a\x05\x23\x96\x0d\x2f\x7f\x0c\x03\x3b\xfb\x57\x95\xb1\x44\xe4\xa0\xa8\x93\x5e\xb1\x43\x6a\xfa\x1b\xd1\x52\xd6\xee\x2d\x70\xc9\xd4\xae\x4e\x9d\x89\x67\x08\x39\xf7\x6f\x39\x36\x79\xce\x4a\xf4\x8b\xb5\x6e\x90\xa3\x9a\xcd\x08\x18\x2b\x05\x35\x96\x24\xac\x41\x3c\x61\xe4\x14\xd6\xad\x16\xd9\x4e\xee\x22\xb8\x21\x11\x44\x6c\x26\x43\x82\xec\xa6\xbe\x50\x8b\x1b\x16\x89\x57\x19\x86\x78\x33\x22\x65\x7d\x7e\xec\xf5\x65\x64\x2d\xc0\x35\x4c\xbf\x7a\xc6\x16\x1f\xc2\x94\xf2\xb8\xa4\x71\x74\x2c\xda\xf0\x48\x8c\x9a\x40\x41\x74\x54\xa3\x5e\x50\x46\x06\x6f\xf2\x91\xdf\xc3\x38\x6e\xd5\xc7\x27\x92\x9a\xfb\xac\xa4\x6c\x40\x97\x7c\x76\x32\xf8\xdc\x32\xf8\x63\x68\x64\xfc\xf3\x7d\xcb\x4f\x4f\x4f\x47\x7b\x22\x65\xe0\x68\x84\x67\xfa\xd5\xcf\x7e\x2c\x7a\x11\x84\x1e\xae\x6e\x31\xc5\x86\x93\x7e\xb9\x2b\x1d\xc9\x70\xe4\x83\xba\x74\xa2\xd1\x50\x04\x91\x66\x7e\xf2\x48\x64\xc7\x9c\xe8\x42\x62\x79\xf3\x26\xc0\xea\xfa\x11\x43\x4f\x0f\x2d\xce\x4b\x93\x65\x59\x0b\xcb\x27\x32\xf6\xc3\x14\x6e\x43\x13\x6e\x2f\x07\xd6\x9a\x31\x3a\x99\x01\xc1\x63\xa0\x47\x9f\x1b\xd5\x3a\xb3\xb8\x6b\x44\xfe\xb2\x34\xcb\xe9\x36\xf8\x26\x9c\xb8\x27\xb5\x32\xa0\xac\x20\x13\x3e\x0d\x85\xef\x76\x6e\xa7\x73\x6d\x9c\x6f\x9e\xe4\xc4\xb0\x15\xfb\x54\x8f\x4f\x10\x1c\x90\x24\x69\x5d\x1e\x5d\x38\x63\x01\x28\xa0\x75\xe0\xf5\x58\xbd\xd8\xc2\xfc\x18\xad\xc2\x94\x3d\x8a\x1a\x1d\xf5\x8a\x1a\xce\x95\x26\xa9\xfd\x7a\xd5\x35\xd4\xee\xa5\x08\x91\xc8\x07\xd8\x46\x7f\xe8\xb8\xfc\x3d\x75\x4b\xf1\x8a\xfa\xf8\xbd\xc6\xd2\x84\x81\xc8\x7e\x55\x27\x0b\x04\xfa\xec\xe9\x55\x3d\x22\x50\xd3\x9e\x14\x6e\xa8\x81\x3f\x2c\x99\x2e\x49\xb3\xee\xa9\xae\x0e\x8e\x67\x08\x1a\x0e\x7d\x05\xcd\xbd\x0f\xb3\xdd\x68\x4c\x46\x71\x13\xe8\x9b\xf5\x24\xde\x06\x15\x64\x7d\x2f\xf3\xde\x38\xf7\x96\x11\x2c\x56\x11\xa2\xfd\x88\x76\xc0\x01\x03\xbb\x53\x96\xa0\x91\xf1\xd8\xbb\x14\xa5\xdc\x95\xed\xb1\x3f\x39\xe8\x76\x3c\x3f\xc8\x53\x49\xaf\xd0\x30\x00\x88\x4f\xa2\x0e\x82\x53\x29\xa8\xd5\xf9\x40\x9c\xe4\x6c\xfc\xc4\x2a\x9d\xc1\xf1\x66\x1f\x12\xc9\x43\x1b\x94\x00\x71\xb9\x32\x5b\xaa\x4a\x3d\x9a\x2e\xe5\xdd\x0b\x42\xd1\xe3\x5e\x60\x43\x77\x54\xda\x22\xa9\x65\xb8\x10\xa1\x1c\xea\x4b\x43\x84\x04\x1b\xdc\x80\x72\x89\xc7\x8e\xf5\x39\x59\x97\x60\xf9\x3d\x09\x6c\xf8\xd4\x69\x17\x18\xf3\xef\xfb\x9c\xec\xc5\xa9\x71\x48\x6c\xee\x4b\x62\xd2\xdd\x7a\x0f\x41\xd2\x86\x79\x6b\xf0\x88\xea\x31\x84\xe7\x81\x9a\x6b\x4e\x78\x82\x40\xf2\xf5\x3a\xb9\x1d\x08\x56\xf5\x34\x11\x47\x52\x59\x99\x8f\xe1\x2e\x70\xa3\xee\x23\x65\xde\xdb\x2d\xae\x54\xf8\x89\x17\x8c\x7f\xef\xa9\x79\x18\xc0\x67\x67\x60\xdd\x1b\x24\xd2\xf5\xa4\x82\xc3\x08\xd9\x26\xfc\x90\xde\xd9\xc8\x95\xf7\x09\xcb\xe4\xe2\x71\x56\x49\xda\xab\xce\x57\xe9\x88\xc8\x64\x4b\x32\x9f\x36\x4a\x76\xef\x82\xc9\x98\x5b\x0d\x20\xc5\xbe\x51\xa8\x1a\x61\xd4\x2b\xbf\x41\x04\x88\xde\xe0\xa2\xde\xb5\xc2\x1e\xc8\x71\x69\x2d\x5e\x3c\xd2\xb8\x4f\x6f\xa8\x59\x39\x1d\x35\x81\x3d\x15\x44\x6d\x1b\x07\x3d\xf4\xf7\xfc\x08\x43\x02\x21\xef\xdf\x72\xab\x0d\x85\x61\x86\x17\x1f\x86\xfd\xec\x94\x33\x40\xf8\x7b\xc0\x43\xfe\x26\xc5\xb3\x7f\xbe\x9e\x0f\x27\xce\xe5\x1e\xfc\x23\x90\x1d\x14\x82\x4f\x97\x60\xc4\xaf\x73\x85\x2c\x66\xec\x5c\xc3\x3d\x61\x18\xc6\xc6\x67\xad\xe5\xad\xef\x98\xc7\x5d\xc6\xbb\xb2\xdf\x10\xa4\x2e\x59\xc0\xf0\x29\xde\xb9\xa2\x16\x2d\xae\x4f\x26\x5e\x9c\xe4\x6c\x8f\x83\x56\xa5\xf3\xe5\x50\x28\x37\x41\xe3\x14\x43\x04\x1b\x49\x33\xeb\xa9\xf6\xd0\x2a\x82\x2d\x9f\xde\x85\x45\xdf\xe2\xbc\x91\x39\x97\x29\xbe\xed\x7b\xa1\x80\x85\xce\xea\x7d\x45\x60\xc5\xa2\x68\x87\x72\x56\x74\x9e\x3b\xc4\xf5\xdd\xc2\x8e\x8f\xfd\xd6\x5d\x25\x3e\x6b\x4e\xfc\x59\x50\xf0\x23\x89\xfb\x19\x46\x12\x5b\x62\x8a\x39\x61\x6a\x55\x71\x0c\xaf\x0f\x35\x7e\x02\x36\x00\xe0\xf4\x3d\x40\xf9\xeb\xae\x32\xb0\x43\x4a\x0c\x2c\x6a\x0b\xca\x2e\x6f\xe5\x1b\xeb\xfa\xdb\x43\xe7\x41\x29\x19\xa4\x72\x8d\xfa\x44\x6c\x6b\xde\xce\x95\x03\x69\x3a\x1d\x42\x25\x43\xdf\xcf\x63\xb2\x4c\x5b\x15\x96\x6e\xbf\x34\xfb\x36\x95\xe7\x9c\xcf\x94\xf3\xc7\x56\x29\x17\x8d\x06\xce\x2e\x95\x52\xa1\xd2\xaa\x0b\xe2\xf1\x26\x17\x15\xc9\x50\x58\x02\x01\x17\xf8\x7a\xf7\x60\x6e\xad\xbb\x61\x86\xa1\xf6\xb7\xe3\x41\x0a\x2c\x07\x82\xd7\xc7\xf6\x86\x67\xac\xdc\x32\x0a\xeb\x81\x3d\x5d\x67\xe3\x3c\xdf\x24\x86\xf7\x3f\x39\x44\x2f\x09\x03\x7a\x75\xa5\xc2\x77\x51\xf6\xa2\x5c\x4f\x3b\xc2\x66\x99\x93\xbc\x62\xb2\x21\x73\x78\xc0\xee\x12\x33\xfb\x24\xe4\x57\xa7\x83\xc0\x99\x13\x3b\x01\x06\xbd\x8b\x54\x62\xb8\x38\x60\x39\x76\x71\xc5\x32\x98\x60\x82\x3c\x7b\x2a\xd9\x27\x66\x29\xb5\xc3\x2e\x4d\x29\x92\xd0\xd1\xbb\xa8\xe2\x15\x33\x9c\x18\x33\x2e\xd9\x61\xdd\xd8\x68\x6a\x9c\xb5\x6d\xaf\x4c\x92\xb3\x36\x3a\xdd\x89\x54\x72\xdd\xe4\x8a\x4f\xc7\xd8\xb3\xae\x4b\x4d\xd4\x6b\xb1\xf3\x56\x6e\x43\xce\x3b\x98\x28\x8a\x7d\x95\xce\x01\x48\x98\x8e\xdf\x1f\x15\xb1\x90\x80\x27\x25\x28\x8d\x4f\x24\x4c\x1c\xf9\xc0\x4b\x6b\x2d\x88\x97\x0b\xc2\x9a\x37\xfd\xc0\x9b\x7e\x0f\xe1\xd0\x55\xd5\x5d\xd7\x47\xd7\xeb\xec\xab\x87\xc7\x65\x44\x8a\xdd\x97\xd6\xcb\xb5\xd4\x1c\x3e\xfb\x71\x6c\xa7\x65\xb3\x3e\x6e\xcc\xf5\x55\x87\x0e\xfa\x09\xae\xe2\xc9\xf7\x9a\xbe\x9e\xac\xc0\x4c\x9b\x21\x60\xb0\x48\xdf\xc6\x4a\x4b\x09\xbb\x21\x6a\x06\x05\x60\x45\x75\x43\x08\xf6\xcc\xcd\xc7\xbc\xcb\x34\xe2\xd2\x73\x3b\x55\x33\x7e\xc9\x26\xef\xa9\x25\x1c\xee\xaf\x9c\x87\xf0\x78\x72\xc6\xfc\x72\xbf\xde\x44\x13\xd4\xc3\xeb\xe8\xe9\xd8\x8d\x36\x53\x7e\x7f\xaf\x0b\xd3\x00\x02\x79\xba\x60\xf3\x90\xeb\xac\xc3\x74\x87\x14\x4e\xed\x3b\xe4\x3f\x98\xfe\x29\x3e\xd5\x2c\xb4\xb8\xe7\x7b\xd1\xbf\x20\x72\x6e\x71\x8d\x43\xf8\x42\x3c\xf4\x2d\xe4\xbb\x5e\x52\x77\xfd\x16\x58\x72\x59\x9c\xfd\x8a\x6f\x4d\xfe\x68\x3b\x75\x28\xaf\xcc\xa2\x45\x98\x63\x82\x7a\xbb\x9e\x9c\xc3\x53\xba\x4e\x0f\xaa\xd9\x18\x5a\xbb\x2d\x2d\x87\x6f\xca\x47\x09\x10\x0e\xd5\xe8\x1c\x56\x80\x29\xd4\xa9\x51\x37\x5b\xe8\xe7\x88\x85\x09\x0d\x4b\x66\x96\x4e\x67\x0a\x22\xd2\x93\x7c\x59\x6f\xd3\x1e\xe3\xe6\xed\x0c\xf1\x61\xea\x6c\x69\x31\x86\x75\x0d\x56\x3f\x2d\x11\x66\x8b\xab\xad\x38\xe3\x70\xa1\xc6\x6a\xcb\x0d\xe6\x7e\x64\xfa\xf7\xfd\x17\x15\x2d\xbe\x5b\x26\x6e\x62\xfa\x2c\x6a\x2f\x3e\x99\xf8\x2f\x4a\xe2\xa3\x0c\x50\x33\xe5\x1a\x78\xae\x7a\xf1\xd7\xd8\x97\x4e\xc1\xb2\x31\x78\xcf\x36\x0b\x0c\xea\x47\xff\xfa\x4f\x7e\x0c\x3b\x7c\x81\xaf\x10\x35\x2e\xb0\xab\x8d\xe8\x71\xc4\xab\x8c\xea\xae\x5a\xd1\xb6\x0b\x44\xcf\xcd\x60\xa0\x49\xe6\x37\xfb\x83\xb5\x9c\x67\xf6\xbc\x87\x63\xde\x50\x8f\x43\xa6\xd0\x9f\x18\xa4\xa4\xc9\xe8\x67\xb8\x3e\xd0\xcf\x90\x11\xe1\x4b\x8f\x9e\x83\x3a\x78\xb8\x6f\xbc\xe4\x02\x40\xe8\x2c\x9d\x28\xd6\xdf\xd3\xe1\x15\xc5\x16\x80\xbd\x46\x9e\x4e\x56\x31\x5b\x4f\xab\x60\xac\xa2\x56\xeb\x20\x76\xfa\xe4\x84\x50\x0d\x02\x55\xc8\x7e\x2f\x9a\x46\x34\xe6\x8a\x5d\xba\x18\xac\x47\x1f\xb2\x88\x06\x38\xeb\x5f\x68\x9f\xbc\xae\x0c\xfa\x30\x32\x67\x04\x84\xa1\x07\xff\xb1\x6e\xd2\x4d\x7e\x9f\xe8\xc3\x93\xb1\xf8\x27\x1c\xc0\x50\xfb\xd2\x15\x19\x33\x10\x0f\x18\x76\x57\x26\x38\xc6\x4d\x67\x4e\x49\x1f\x1d\xf7\x31\x92\x70\xf6\xc5\x67\xc6\xe8\xb8\x2a\x7a\x19\xeb\xf8\x3e\x8f\x54\xdd\x69\xd7\xe7\x40\x48\xcb\x67\x9d\x2a\xd4\x4d\x80\xc5\xcd\xd5\x66\x1e\xbf\xcb\x35\x8b\x8f\x00\xfd\x5f\x9f\x57\x0d\x2c\x62\x57\xaa\x82\x6b\x75\x82\x32\x97\x71\x56\x01\x93\x8a\xdb\x85\xf2\x43\x0c\x14\xd9\xba\xdb\xc2\xb1\xab\x6b\xb2\x0f\x41\xcc\x84\x6f\x5f\x1f\xa8\x81\xa5\xb8\x63\x0c\x4b\x12\x01\x41\x28\x73\xa4\xfa\x28\x2e\x9d\x13\x00\x1e\x14\xa8\xb1\x3e\xc5\x23\xdc\x93\xe1\x70\xa3\x00\xc9\x55\xca\xd3\x5d\x29\x5f\xa1\xa2\x95\x83\x16\x8a\x76\x78\x8f\xa3\xb6\xd7\xee\x6d\x6d\x96\x37\xea\x58\x1a\xe7\xf1\x24\xd4\x2a\x95\x5a\x0d\x10\x96\xe9\x1e\xcc\x3d\x0d\xb4\x81\x40\x6a\x9a\x75\xbe\x88\xb9\x09\x71\xd6\x52\xe7\xef\x9c\xf3\xc1\x9f\x5c\x29\x00\xb5\xe5\x05\xa4\xbc\x1d\x57\x90\xb5\xa6\x2a\xb0\x8b\x9c\xc3\xfa\x89\x1c\x6d\x5c\x5e\xf3\x41\xbb\x3c\x96\x9d\xb1\x74\x37\x94\x93\xcd\xa1\xe4\x90\x06\x7f\x0e\x41\xb2\x96\x23\xe0\xbc\x00\x27\xa5\x5b\x57\xc7\x0d\x00\x3c\x10\xbd\xb7\x5a\xe6\x08\xf9\x20\x91\x1b\xb0\xdf\xbf\x01\x65\x0b\x73\xe8\x03\x30\x0a\x90\x01\x6b\xd7\x95\x80\x9a\xdf\x5b\x0c\xd0\x89\x07\xf3\x00\x45\x46\x97\xd6\xd1\x0b\x6f\xb5\x26\xc0\x75\x09\x58\x4e\x1d\xac\x7d\x54\x33\x50\x1c\xe9\x83\x87\xce\x09\x3e\x2b\xfa\x4c\x2d\xfa\x1a\x03\x71\xcf\x59\xa4\xf0\x99\x87\x57\x9f\x4c\xfd\x49\x7c\x10\x10\x90\x6e\xfc\x86\x4e\x5e\xd2\x87\x0c\x7b\x38\x3f\x80\x4e\x10\x05\x78\xd2\x6c\x42\x07\x19\x23\x88\xb7\xab\x83\xa0\xc6\xfd\xb6\x99\xaf\x99\xef\x04\x64\xdd\x09\x0c\x7c\x20\xe3\xf5\x1b\xc3\x9e\xd8\xde\xee\xec\x49\x7f\xf9\x3f\x8b\xf8\xe7\xed\x68\x2d\x62\x13\x0e\x57\x4a\x2d\xa3\xa3\xcc\xc7\x7e\x40\x10\xfb\xca\x00\xd4\x8a\xbd\x60\xf7\xe5\x35\x68\x4e\x76\x73\x7a\xee\x96\x83\x27\xb8\xbc\x17\xd9\xc1\xb8\x5f\x4f\x51\x49\x6f\x8d\x02\xb0\x9f\xe4\x60\x9a\x83\xd2\x0f\xed\x24\xbd\x81\x2e\x42\xcb\xa7\x85\xb7\xd0\xea\x98\x6f\xc7\xb6\xd7\x05\x02\x94\x17\x20\x16\x75\x56\xee\x59\x88\xf3\x68\x3c\xa5\x0b\x22\x38\x16\x80\xb3\x03\x4c\x3d\xbe\x7d\x00\x11\x7d\xfd\x0e\xea\x73\xe5\x0d\xea\xdb\xda\xea\xf5\x94\xc9\x2a\x63\x37\xeb\x09\xb8\x5c\xb0\x1f\x20\x7d\x8f\x35\x83\xf0\x4c\x3c\xca\x6e\x3f\xa3\x7d\x56\x09\x37\x30\x61\x80\xa6\xfe\x0a\x9d\x54\xa8\x6b\x00\x4a\x66\xb0\x09\x16\xdc\x14\x57\x1d\xe2\x77\xfa\x93\x1f\x5c\xf2\xc6\xdc\x47\xe5\x5e\x8a\x70\xb9\x3e\xcd\x33\x50\x8a\x73\x36\x50\xf1\xda\x1b\x6a\x19\xd3\x29\x4b\x31\x6d\x53\x49\x45\xaa\x3d\x22\x9e\xb2\x02\xac\x68\x53\x99\x6f\x43\x99\x7f\x32\xb2\x32\x46\x83\x74\xab\xc4\x36\xb0\x44\x27\xa0\xb3\xdb\x3c\xc3\x38\x4b\xe2\xe7\xc1\x50\x07\xe0\xe5\xf2\xf1\x82\xbd\x55\x71\x1e\xa4\x79\xb9\x56\xe6\x99\x18\xd1\xda\x06\x1f\xc6\xaf\x01\x5e\x40\x90\x54\x75\x51\x2d\x6c\x48\x86\x97\xa7\x6c\xd5\xb4\xb2\xcd\xef\x32\xe7\xb0\x05\xbc\x7f\xd4\x84\x83\xc3\xb2\x5a\x95\x89\x1c\x00\x02\x48\x90\x5e\x7b\x20\x9d\xa3\x07\x09\x65\x0d\xf8\x00\x5f\x3e\x8f\xe6\x2d\xc5\x30\x6f\x67\x61\xdb\x60\xe1\x0c\x67\xb9\x27\xa0\x05\xc8\x2b\x43\xcc\x62\xb4\x4e\xf8\x4b\x3b\xce\x33\xa8\xb9\xc0\x06\x52\x05\xb6\x00\x15\xf8\xa2\xcd\x95\x25\x3e\x63\xf1\xa1\x8f\x52\x3e\x4a\x1b\x84\xfa\xd1\x4a\x50\x2e\xe0\x5d\xb0\x83\x24\x40\x3b\xd9\x2f\x3e\x96\xe1\x38\xa8\x1c\x17\xde\xda\xf8\x4f\xbe\xae\xa9\x29\x0e\x4b\xc7\x04\xd4\x0b\x4d\x4e\xb8\xc1\x7d\x85\x3d\xb0\xa7\x3e\x37\x01\x96\x35\x00\x50\x02\xa0\xd3\x33\x71\x3f\xa0\x46\xe2\x3b\x18\x9b\x45\x18\x3e\x92\x52\x07\xdd\xea\xa3\x58\xf0\xf1\x71\x03\x58\x6b\x84\x5e\xdd\x85\x00\x01\x28\xaf\xea\x5e\x7f\xc3\xf7\x92\x0a\xb0\x15\x10\x28\x73\xef\x29\xb0\x2b\x34\xc6\xde\xf0\x95\xb1\x4e\x67\x7a\xa9\xfd\xbd\xab\x3c\x57\x43\x2b\x3a\x17\x21\xfb\xfe\x7c\x8f\x2d\xbb\x3a\x1b\x74\xd0\xf8\xfe\xc4\xf2\x32\x4b\x38\xd2\x9a\xbe\x72\xe8\xfc\x08\x5e\xec\xa4\x0f\x1f\x9d\xc2\xcc\x14\x5e\xe9\x5d\x3a\x4c\x74\xba\x74\x74\x8a\x03\xea\x8c\x77\x74\xe6\xdf\x06\xd9\xc6\x4c\xa1\xbe\xf6\x4d\x49\x40\xa7\xfd\x34\x29\x3b\x32\x01\xd6\x31\x59\x0e\x90\x94\x4d\x82\x6f\xe4\xea\x81\x6e\x2b\x73\x3b\xf2\x25\xb1\xc8\xea\x68\x14\x33\x9b\xc5\x6c\x63\xc1\x56\x77\x57\x80\x7a\xce\x45\x02\x04\xfa\x67\x4e\x02\x30\xa9\xf9\x07\x4a\x2c\x30\x28\x7e\xd9\xeb\x03\x62\x89\xcc\xe0\x8e\xa9\x1e\x60\x07\x00\x74\x31\xf8\xab\x6e\xbf\x72\x5f\x3e\x5f\x5d\xf9\x6c\x4c\x80\x4e\x5e\x29\xdf\x59\x9a\x6b\x34\x01\xdd\x02\x34\xf4\x02\xe2\xc5\xc9\x11\x99\x07\xc9\x95\x34\x2e\x9c\xd9\x08\xcf\xcb\x5d\x6b\x5f\x07\x36\xa6\xc1\x20\xdb\xe9\xae\x6e\x6c\xbd\x26\x9e\x54\xde\x40\x69\xd0\x1d\x64\xd1\xf7\xd3\xae\xec\xa7\xf5\x74\x79\xf4\xa7\x53\x31\x64\x30\x72\xd4\x01\xdf\x00\x97\x4f\xd8\x8c\xa3\xfd\x0b\x7b\xe3\x46\x8f\x6f\x05\xe0\xbb\xef\x19\x16\xca\x39\x6d\xe4\xa8\x39\x17\x55\xf8\xaa\xff\x46\x6b\x43\xdc\x42\xd3\x52\xc8\x7d\xd4\x2e\xd1\xae\xd4\xf2\x16\x8a\x5c\x28\x3f\x91\xc3\x60\x75\x2f\xe4\x03\xff\x85\x88\x6f\x41\x2a\x70\x22\xad\xa8\xd7\x66\x4b\xc5\x9d\xb9\xdd\x87\x74\x87\xdc\x2d\xf1\xcf\x58\xd2\x9c\xb1\x65\x89\x1b\x6a\x61\xaa\x4b\xa0\x47\x74\x18\x48\xe8\xd6\x02\xcd\xe1\xdd\x41\x70\xc9\xcf\x03\x7c\x9d\xde\x09\x0a\x77\xd0\x75\xc0\x97\xd4\xf6\x59\x6e\x80\x52\xbc\xd5\x38\x6c\x7e\x36\x32\x73\x4e\x92\xfb\x78\x05\xd0\x57\x52\x4f\x0f\xd1\x0e\x1c\x4e\x9a\xef\x5d\xf2\x44\x03\x41\x93\x28\x07\x4e\x50\xee\xf2\x33\x63\xca\xe6\x9b\x80\x12\x28\x41\x25\x38\x41\xa0\x0c\x6c\x75\x72\xe7\x53\xb7\x83\x85\xc4\x03\x04\xb8\xa6\xf0\xaa\xa1\xe5\xed\xa1\xb2\xc0\x0c\xf9\x53\xdb\x8a\x6d\x79\x4f\x23\x50\x24\x45\xca\x3e\x71\xa7\xcb\xb5\x51\xc3\xea\xaa\x01\x9e\x02\x71\xf0\xe7\xbc\x9d\x00\xae\xb3\x07\xc0\x2a\xf5\xb4\x95\xb4\x4b\x68\xeb\xb9\xfb\xfd\x6c\xc0\xae\xba\xf5\x04\x73\x67\xee\x2a\x34\x71\xcb\x71\xf0\xa7\x6e\x52\x80\xc0\x17\x1c\x0c\xc4\xad\xed\x4a\xea\x45\x79\x20\xe0\x66\xf7\xa9\x7f\x90\x42\x71\x52\xeb\x96\x70\x47\xd2\xb6\x95\xbc\xfc\xac\xb3\xfa\xe5\x70\x36\x95\x86\x13\xf4\x0b\x05\x5f\x01\x9c\xc8\x08\x97\x71\xdf\xcf\x89\x0e\xa5\x6e\x04\x15\x62\x16\x28\x0b\x16\x1d\x16\xca\x99\xa8\x41\x4c\x1e\xe1\x6f\x3a\x40\xbc\xbe\xb8\x0d\x62\xdb\x5c\x7b\x97\xf6\xf0\xa9\x33\x77\xfc\x9b\xaf\xc4\x5e\xd0\x5e\x2e\x2c\x2d\x3a\xe7\x82\xcf\xf3\xaa\x83\x96\x60\xd7\xa7\xc2\x5f\x45\xce\x23\xcd\x40\x05\x09\x77\xbe\x13\x1f\x2e\x28\x50\xb5\x33\x55\x35\xe7\x6c\xe7\xb2\xe1\xea\x28\xc2\xdb\x29\xe6\xdf\x6e\x69\xb2\x29\xf1\x86\x78\x78\x0a\x8a\xda\x06\xd1\x01\xe2\xe1\xcf\xf3\x33\x89\xf3\x6f\x1b\x98\xac\xe4\xe2\x03\x1d\xd7\x4f\x0b\x56\xbe\x63\x30\x41\x99\x5d\x5b\x83\xbd\xd3\x9c\x3e\x73\x28\xd8\x7f\xad\x11\xff\x5c\xa3\x96\xef\xe7\x47\x74\xe1\x39\xbe\xc4\x83\xf4\x74\xee\x5a\x6e\x53\xf8\x4f\xdf\x51\xa3\x2e\x3e\xf1\x2b\x25\x83\x6e\x0a\x47\xdd\x1f\x31\x3c\x71\x62\xfd\x89\x11\x07\xfe\x16\x1c\xae\x07\x07\xd8\x8e\x5c\x21\x1d\xf7\x72\xfe\xfb\x5a\x81\x98\x34\x23\x86\x5b\xf5\xb6\x2b\x7c\xc3\xe1\xe6\x33\x67\xe5\xef\xae\xe3\x2c\xe0\xc3\x93\x34\x5f\xf2\x60\xbe\xb4\x5c\xfc\xb9\x4e\x2e\xd7\x51\x22\x73\x78\x4e\x2c\x11\x25\xd9\xaf\x4f\xfd\x61\x8b\x1f\xfe\x39\x08\xb7\x73\x6f\x16\x82\x2d\x10\x9a\x7d\x2c\x8a\x6f\x71\xa9\x70\xcf\x7b\xd0\xb6\x42\xcb\x2b\xc6\x06\x34\xcf\xf5\xe5\xda\x77\xfb\x38\xe5\xdc\x19\xd6\xc6\x89\x07\x2e\x0f\xef\x57\x5c\xbd\x0a\x1e\xbd\xbb\xe1\xfb\x4d\x81\x53\xe5\xaa\xe3\x72\x7e\x4d\x75\x3c\xae\x38\x8e\xfc\x6e\x3b\x57\x5f\xce\xaa\x01\x9a\x98\x77\x26\x01\x7e\xe7\x7e\x5c\x57\xfd\xb8\x95\x25\xc7\x95\x07\x11\x42\xb8\x34\xf8\xc6\x1b\x38\x9b\xec\xd6\x15\xc9\x6d\x8e\xe8\xca\xa0\x0e\x0f\x60\x2b\xf7\xcf\xbd\x10\x64\xeb\x64\x1e\x73\x30\x29\x58\xf7\xec\xdc\x73\xfe\x87\x7b\xea\x9c\xaa\x05\xa8\x7a\x3c\x27\x1b\x9b\xcb\x49\xf3\xb7\xb8\xe7\x6d\x12\x76\xa9\xc8\xb9\x45\x99\xcd\xe5\xf7\xb6\x51\x2f\xc1\xef\xf6\xe8\x45\xf5\xee\xcf\xb4\x19\x19\xd5\x16\x38\x50\x14\x4f\x08\x17\x70\xfc\xa7\xf6\x31\xce\x81\x2e\x85\x2f\xd8\x69\x01\x07\x76\x2c\x0d\x14\x4d\x4e\xfe\xcc\x3b\x94\x43\x2c\x91\x3d\x1d\x38\x53\x4f\xea\x07\x18\x7c\xe6\x97\x1f\x62\x0b\x3f\x03\xff\xe7\x12\x10\x11\xaa\xfe\x3d\xae\x42\xaa\x99\xc8\x18\xc4\x15\x6f\xe8\xbf\x8b\x39\xe5\x8a\x5d\x3a\x83\x4e\x2d\x90\xdf\xb6\x78\x49\xfc\x04\xf9\x6d\xcc\x1d\xee\x03\x3d\x93\xeb\xec\xee\x08\x77\xe3\xdb\xd7\x51\x1c\x2d\xdf\xe8\xcc\x16\x7f\xc0\x1a\xf1\x52\x97\x2c\xc8\xf3\x07\x08\xdd\xb3\x7a\x7d\x4c\xba\x86\xff\x3e\xaf\x01\x99\xab\x1f\x02\xd8\x5c\xd4\x10\xa3\x33\x7f\x12\x96\xef\xf9\x72\x1c\x96\x08\xbd\x27\xf2\xe5\x6a\x81\x7c\xba\x22\xd3\x40\x41\xce\x43\x95\x5f\x63\x24\x9f\x63\xcc\x0f\x2a\x35\x1f\x57\x10\xbf\x77\x9d\x80\x8f\x40\x73\xf5\xb5\x48\x88\xf0\xf7\x7c\x55\xaf\x19\xcc\x70\x05\x35\x72\x07\x63\x53\x41\x73\x50\x54\xb3\x0e\x00\x57\xf3\xe9\x23\x5e\x40\x03\x88\x4d\x07\x36\xd1\x65\x90\x9f\xbb\x29\x3d\x17\xd9\x6a\x4f\x6f\x73\x9d\x3f\xe7\x2a\x7b\x20\xa8\x80\x76\x0c\xfb\x93\xc5\x9d\xce\x38\x33\x39\xdd\x3e\x12\xf3\x5b\x9d\xfb\x8e\x29\x2f\xb5\x83\xd0\xd3\x86\xd6\x3b\xc0\x5a\xae\x04\xba\x1a\x87\x89\xc7\xe2\x95\x76\x15\x72\x59\x19\x97\x15\x53\x71\xdf\xb4\x9d\x1e\x62\xec\x9c\xa4\xa9\x2a\xef\x19\x77\x38\x54\x0b\x20\x62\x4a\x9c\x66\x02\xb7\x2a\x37\xc9\xe3\x44\xf2\xf0\x2d\xe7\x04\xe1\x28\xdf\xd7\x27\x1b\x5b\x5c\x02\xb8\x7f\xcb\xdf\x04\xee\xb0\x12\x69\x36\xa5\x49\x42\x5e\xdc\x6a\xe2\xb4\xa7\x94\x7d\xdf\xc7\x58\xee\x12\x9d\x46\x98\x7e\x32\xf6\x18\x43\x00\xa1\x07\x4c\x12\xeb\xe3\xc9\x32\x0c\x0a\xe0\x77\xd5\xf2\x3b\xff\xbd\x6e\x40\x0a\x76\xba\xdf\xe9\x9d\xb6\x00\xf9\x61\x4c\xd0\x9e\xb3\xb7\xd3\xa2\x2f\x19\x9c\xa6\x9b\x72\x57\xb0\x87\x74\x3a\x64\x9f\x67\xd2\x8a\x91\x30\x6d\xea\x57\x2e\x4a\xa2\x80\x63\x83\xf6\xa2\x5d\x2a\xb3\x81\x67\x34\x07\x83\x90\xd6\x22\x5b\xa8\xb9\xe5\xf3\x0c\xe3\x24\x2e\x14\x3d\x48\x2c\xf4\x64\x9f\x84\x58\x72\x04\x7f\x4a\xe5\x81\x9c\x28\x12\xa9\x00\x77\x46\xb8\x2e\x47\x3f\x63\x4c\x16\x41\xdd\xdc\x16\xc0\x15\xea\xda\x31\x9a\xd0\xf6\xb8\x9b\xe6\x5e\x7a\x27\x1c\x17\x48\xa6\x28\x36\x3a\x0b\xb5\xe0\xe1\x88\xf3\xfd\x8c\xfc\x68\xe2\x18\xc9\x92\xf4\x02\x68\x6b\x49\x86\xdc\x45\x6c\xdd\xe0\xe2\x47\x11\x3e\x38\x2d\x7a\xb4\xb7\x99\x0b\x01\xca\x89\xdf\xd2\xaa\x06\xb4\x1f\x6c\x0d\xb1\xbf\xf1\x41\x60\xbf\x00\xc8\x43\x63\x66\x8d\x48\xc3\x40\x79\x1e\x80\xfd\xb3\x10\x7d\x8e\xdf\x1a\xba\x8b\x67\x38\x72\x62\xe0\x80\xf6\x03\x30\xbe\xf0\x50\x85\xdb\xc3\xb2\x74\xc5\xc6\x8f\xeb\xf8\x6a\x2f\x0f\xdf\xed\x31\xe4\x1b\x6a\x81\x4a\x40\x41\x94\x2f\xbc\xec\xe1\x0e\x80\xd6\x48\x56\xb6\xdb\xec\x72\x41\x0c\xa9\xe5\x7d\xe1\xfb\x19\xcf\x43\x2b\xfb\xa1\x69\xf6\x21\xc0\x2e\xaa\x71\xd0\x38\x41\xd2\x41\x4c\x2e\x19\x24\x40\xb0\xfe\x64\xbc\x5c\x8a\xc5\xef\x67\x37\xcf\xb7\x73\x7e\x8b\x10\x79\xc4\x9a\xfa\xd1\x12\x93\x6b\x78\x3f\x5d\x94\x52\x19\x55\x00\x52\x8c\x85\x82\x5a\x6e\x76\xa8\xd9\xb9\x5a\x87\xa6\xfd\x73\x14\x85\x05\x85\x16\x34\x05\x94\x17\xe8\xe3\x29\xb9\xf7\x09\xf2\xa4\xe4\x1b\xdb\x15\x0d\x1d\x45\x74\x72\x1a\x8f\x20\xcc\xab\x6b\xeb\x02\x75\x11\x1c\xfd\x8a\xdc\xce\xe3\x3c\xe0\x40\x37\xf6\xc6\xa5\x77\xed\xde\x75\x8b\x5b\x0d\xf2\x59\x7e\x54\xdb\x8c\x3e\xe7\x89\x5d\x8a\x58\xcc\xe3\xfb\xdc\x74\x21\xe0\xad\x74\x13\xd2\x36\xd5\x9d\x81\xbe\xc6\x30\x36\xa4\xb7\x47\xa7\x7b\xa2\xc5\xf9\x34\xb5\x7e\xe6\x24\xa7\x27\xc3\x84\xd2\xf7\x8e\x21\x8e\xb1\xed\xf7\x46\x2a\xbf\xa4\xa1\x3a\x3a\xf2\x8b\xc3\xd7\xa9\x55\x3a\x42\xe0\x44\xda\xb3\xd3\xca\x4e\xeb\x58\xcb\x20\xa6\xeb\xe3\x12\xe9\x41\x64\x84\xaa\x10\x2e\x92\x59\x13\x81\x0c\x3c\xfe\xfa\x1c\xd7\x36\x6d\x00\x7d\xbb\x95\x28\x7f\x90\x81\x64\x04\xfc\x45\xf0\xc2\x1d\xf3\x36\xb3\xdc\xc1\x78\xb5\x6a\xbc\xb4\xe5\xf6\x22\x87\x7b\x43\x4c\x41\x0f\x94\x64\x1d\xd7\x83\x1a\x0e\x7c\x38\x90\x99\x26\xc8\x2b\xe0\x7c\x2b\x11\x08\xa9\x1e\xfb\x1a\xea\xe1\xf8\xa0\x57\xb3\xaf\x57\x83\xe6\xe5\xc2\xf8\xfd\x79\xd9\xcb\x87\xf0\x42\x1d\x31\xd8\x43\x0d\xfb\x88\xf9\xae\x04\x5c\xf5\x00\xc5\xe2\x9d\xb0\xbf\x3e\x7d\x04\x20\xdc\x39\xe9\x45\xc8\xa8\x2f\xbe\xfc\xd2\x1c\x40\xfb\x70\xe0\x03\x27\x00\xc1\x43\x13\xc8\xcd\xe7\x73\x13\x6e\x40\xfa\x3c\x06\xc0\x41\x2b\xf5\x72\x9d\x8c\xcb\xb5\x03\x6a\x9a\xb1\x8c\x3d\x53\x90\xfe\x62\x88\x37\xc8\x9a\x38\x18\x31\x32\xa0\x5c\x32\x1f\x65\x71\x87\xc2\x6d\x2a\xa7\xea\x4a\xeb\xfc\x9e\xec\x26\x60\xa1\x41\x49\xe1\xa8\xcf\x86\x8a\xff\x70\xbe\xc9\x01\x5e\x09\xf2\x7e\x5e\xd0\x04\x40\x09\x41\xeb\x25\x10\x7d\x7b\xbc\x18\x5b\x3c\xbc\x8e\x83\x35\x07\xf0\x9a\x6a\x3b\xd8\x0b\xad\xbd\x4e\x1a\xe6\x61\xa6\x66\x7a\xa6\x5f\xe2\x22\xc5\x2b\xda\x3b\xe2\xa0\xea\xb3\xd2\x23\xf0\x80\xab\xb0\xa4\x0a\x30\xb7\x0a\xea\xa8\x05\x1c\x5c\xa2\xb7\xf8\x75\x22\x00\xc8\x37\x0a\x28\x38\x0e\xa4\x03\x82\xd5\x3b\x42\x40\xc3\x0e\x15\xf3\xe2\xe3\x38\xc7\x52\x4f\x9c\x30\xcd\x4f\xee\xc7\xa9\x87\xe6\xc2\x6c\x10\x03\x94\xf6\x55\x32\x78\xbf\x4d\xa4\x16\x98\xb2\xbf\xde\x0d\x2d\x89\x56\x03\x0e\xbb\x14\x1a\xee\x04\x83\x91\x2c\x72\xd9\x75\x91\x87\xb2\xa9\x56\x51\x5e\x6d\xea\x4c\x36\xd6\xd7\xad\x6e\x47\x4d\x78\xb6\x9a\xf0\xd2\xfb\xab\x63\xad\x77\xc8\x42\xd3\x65\xa1\x20\x74\x0a\xbd\x0a\x7c\x80\x29\xd0\x53\x61\x2d\x77\xa6\x83\xc5\x37\x0c\x16\x57\xb0\xfc\x04\x1d\x3e\xfd\x22\x3e\x79\xb9\x25\x86\xc9\xed\xc9\xf5\xea\x02\x65\x75\x95\xf8\xab\xbb\x35\x82\x59\x1c\x19\x1a\x67\xf1\x24\x8b\xa8\x62\x0c\x8f\xeb\x23\xb3\xb4\x38\xf3\xcb\x3d\x8d\x2e\x48\x07\x38\x78\xa7\x5d\x81\xee\xe0\xfa\x69\x9d\x27\x00\xa6\x46\xc0\xc0\x19\x4d\xb1\x2d\x62\x5e\xb8\xbb\x7b\x54\x36\x45\xb6\x72\xfa\x13\x4b\x9f\xdc\x79\x36\x35\xd2\xeb\xa1\x18\xc8\x9e\xd0\xad\x46\x2a\x72\xd7\xf3\x6d\xcc\x4a\x39\x8d\xf0\xf4\xde\xd2\x26\xf3\x44\x0c\x92\xa1\x80\x38\x24\xb1\x51\xd8\xd7\xc7\xf5\x59\x5f\x11\x97\xf4\xbc\xd7\x63\x5f\x10\x0a\x3d\x9f\x95\x40\x0f\x85\x58\x31\x9a\x4d\x06\x65\x87\x44\x0e\x36\xd1\x5b\x30\x7a\xaa\xc1\xde\xe3\xa7\x32\xe4\x45\x8a\xfb\xd4\x9e\x87\x92\xf1\x67\x78\xd7\xe9\xfd\x86\xf0\x45\x4e\x44\x39\xa9\xd7\xb4\xfa\x18\x3d\x5d\xda\xb0\x53\xd9\xb6\xda\x58\xbc\x9e\x3d\x61\x60\x17\x10\x74\x8a\xdc\x89\x3e\x63\xa3\x83\x6e\xf5\xc7\x79\x76\x38\x36\xc5\x6a\x5f\x8f\x90\xd7\x23\xe6\xd8\x83\xdc\x3a\x63\x13\x50\x8a\x40\x59\x45\x66\x30\x9c\x24\x77\xf6\xfd\x01\x74\x23\x98\x9b\x31\x1c\xe0\x1c\x8e\x81\x26\xb7\xdf\x83\x8e\xd4\x5c\xdf\xef\xb1\xa1\x7f\x42\xb7\x86\xee\xdc\x3e\xf7\x77\x92\x42\x6f\xcb\xfd\x89\x1b\x48\xb6\x92\x18\x4e\x61\xcc\xbd\x0d\x65\x17\x75\x7c\xd7\xa0\xe3\xfd\x24\x72\x23\x1a\x1c\x80\xd4\xa3\xd8\x78\x74\x9e\xad\xf5\x1c\x28\x4e\x81\x65\x04\xdf\x8b\x67\x5b\x83\x02\xdb\xd2\xf3\x53\x6b\x69\x05\x89\xd0\x8a\x85\x71\xa7\xf5\xb4\x45\x84\x71\xaa\x51\xbf\xd5\xb9\x3c\xd5\x51\x83\xa5\xc6\xa1\x27\xd4\x52\x52\x51\x73\xc2\xcb\xb7\x67\x0d\x68\xf6\x3a\xfb\x28\x8c\x2b\x98\x68\xb7\x5c\x23\xba\x36\x4e\x47\x6d\x5e\x8f\x8d\x98\x2a\x00\xc9\xb9\x31\x69\xe5\x02\xe5\x5c\x77\xe7\xfe\xa4\xf6\xf6\x2b\x98\x46\x3a\x59\xf6\x03\x74\x0b\x8f\xb6\x58\x27\xd9\x69\xa9\x41\xc9\xe9\x5d\x5a\x2d\xf3\x78\xf9\xac\xad\xb9\x27\xfb\xf4\x1d\x97\x1d\xf2\x79\x5d\x18\x4a\x11\x4e\x56\xef\x06\x00\x2f\x36\x4c\x2f\x95\x5c\xc1\xe2\xfa\xa2\x9a\x15\x63\x33\xe6\x59\x81\x18\x00\x00\xd8\x9a\x28\x46\x1a\x3d\x68\x73\x1e\xdc\x81\x59\xac\x3d\x5f\x28\x5f\xd5\x68\xee\x36\x1c\x62\x0b\x3f\x6e\xfd\x30\x1c\x69\xff\xa6\xfb\x3d\xc0\xbc\x68\xb8\xb3\xd3\xeb\x39\x5c\x73\x42\x72\x5f\xf8\xce\xaf\xe5\x62\x33\x24\x9c\x85\xe8\x48\x07\xcb\x4c\x07\x14\x62\xc3\x41\x73\x03\x20\x7f\xfd\x96\xbd\xae\x37\x4f\x9a\x23\x34\x1d\xa1\xc4\x84\x61\xb3\x8d\x4f\xa0\xb6\x19\x88\xb2\x15\x20\x7f\x83\xd1\xd7\x19\x48\xdf\x20\xdf\xad\x9e\xd8\xc9\x91\x56\xe8\x74\x3f\xd7\x53\x17\xde\x91\xf8\x32\x5f\x29\xd4\x6b\x70\x38\xcb\x62\x4f\x27\xef\x56\xc5\xc9\x1f\xb5\x8c\xe3\x90\xc4\xf7\x9a\xa6\x9a\xd6\x75\x2c\xe1\xa7\x30\x20\xd0\xa3\x77\x29\xf2\x36\xe2\xa0\xba\x98\x4c\x00\xef\x80\xe7\x18\xbe\xdf\xec\xcb\x73\x2f\x8f\xfa\x7a\x55\xf0\xfc\x11\x84\xe1\xdc\x1f\x59\x27\xbe\x4a\x67\xff\x52\xe6\x4c\x34\xa1\x39\x28\x5b\x1d\x43\xd6\x5b\x42\xc8\xe9\xe4\xec\xfb\x76\x3d\x90\x98\xb1\x98\xd2\xe1\x10\x7f\xab\xcd\xb6\x07\xbe\x57\x75\x9a\xa5\x28\x75\x59\x0d\xec\xe4\xb9\x52\x9a\x4c\xa6\x71\xc4\x8c\xf2\xd6\x95\xa3\x86\x0b\x34\x1e\xa7\x66\xb3\x17\x1b\x2b\x61\x0d\x82\x3c\x70\xae\xea\x90\xc4\x70\x8e\xe2\x19\x04\x7c\xf8\x54\xc8\xc4\xb8\x0e\x63\xc4\x11\xa6\x38\x5b\x1e\x84\x4f\xd1\x55\xf7\x28\x99\xbf\x59\x77\x84\x20\x98\xd7\x63\xcd\xdd\xb3\x8b\xea\x53\x6b\xc8\x32\x0a\x60\x16\x26\x87\x14\x3e\xec\xc1\x79\xbf\x16\x16\x4e\xab\xd5\x15\x0b\x8e\xfc\xdd\x40\xab\x17\xb6\x2f\xd1\x64\xa1\x3c\x4d\x96\xdb\x24\x1c\xce\xe1\xe0\x05\x6e\x90\xba\x28\xc5\x86\xc7\x02\xe8\x9e\x7b\xb8\x5c\x51\xe3\xc2\x04\x10\x9c\x8e\x91\xb4\x9e\xe2\x71\x07\xd8\x95\xc1\xf1\xd6\xb4\xbd\x79\xaf\x2f\xf5\x41\xb7\x3e\x6a\xb8\x22\xe4\x83\x14\x0d\x03\x4e\xb3\x35\x03\x74\x81\x2d\x0d\x25\x91\x3f\x71\x79\x77\x9c\x1b\xd8\x2a\xcf\xd6\xe9\xcb\x8e\xb0\x4b\x08\x2d\xb3\x65\xe4\xb1\xc4\x7b\x85\xc4\x81\x5e\x5b\x44\xc3\x68\x05\x5a\x9b\x52\xb7\x0e\x09\x48\x69\x7a\x91\xef\x05\x42\x65\xc6\xeb\xe5\xfb\xe2\xe6\x83\x2a\x44\xf5\x71\x96\x91\x8e\x65\xf1\xc2\xf6\x19\x3f\x82\x16\xbe\xde\x69\x61\x3d\x18\x4a\x71\xfe\x79\x39\x89\xe1\xe5\x31\x6b\x11\x5b\x6f\xe6\xa5\xed\xcb\xba\x0e\x8d\x1b\x2c\x33\x10\xb5\xbe\x1e\xcf\xcb\x78\x48\x5b\xfe\x59\x8c\xd5\xe3\xf9\x10\x4c\xcb\xd2\x34\xc5\x33\xef\xc2\xd3\x39\x7b\x71\x44\xc0\xcf\xa4\xda\x45\x53\x3c\xd7\x7d\x43\xdb\x3a\x8a\x3a\x1d\x64\x48\xb7\xad\xf6\x56\x7d\xe3\xcd\xb9\xac\xc1\x3e\xc4\xa4\x4d\x83\xa1\x5d\x74\xf6\xa6\xf1\x45\xb7\x0c\x30\x96\xe7\x43\xb0\xdc\x9c\x1e\x57\x10\x85\x0a\x3d\x63\x96\x54\x9f\xb1\xb8\x19\xce\xbc\x97\xba\x4d\x57\x8d\x58\x74\x3f\xdc\xee\x43\x26\xaa\x4d\x8a\x22\x6e\xe6\xa7\x59\x36\x4a\x96\x68\xf4\xaf\x98\xdf\x83\x69\x0e\x5a\xc2\xce\xc7\x6f\x18\x24\x0a\x58\x66\x61\x78\x93\x5a\xf2\x39\x9d\xfa\x4e\x2f\x79\x3f\x8b\xb3\x6a\x3a\x9c\x81\x24\x27\x0f\x46\x3a\xc0\x59\x72\x63\x62\x4b\x16\xf7\x96\xb9\x16\x88\xbd\xe5\xc7\x1c\xa6\x31\x0f\x63\x26\x6d\x9b\x2b\x29\x22\xd0\xd7\xbb\x2c\xc8\x38\x2f\x2f\x1e\x5f\x56\xd1\x0d\x1d\x16\x50\x67\xd7\x56\x39\x9b\x40\x2a\x9f\x3e\x63\x74\x23\xeb\x3d\x09\x21\x06\xea\x3a\x5b\x7d\x91\xaa\x12\x8b\x8c\x0d\x4d\xc6\xee\x1e\x30\x81\x09\x2d\x03\x05\x12\x82\x44\x03\xa0\x61\xdc\x3c\x2f\xcd\x7d\x19\x9a\x1a\x8d\x9c\xcb\xcd\x19\x32\x4e\xbe\x04\x8a\xb9\x34\x56\xfb\xca\xe7\x22\x1e\xaa\x49\x1a\xa6\x1b\xc1\x42\x4a\x39\xee\x8f\x67\x25\x5c\x84\xc3\x37\x68\x57\x3a\x1d\x82\x61\x36\x85\xa1\x10\xd7\xc9\xb3\xd6\x74\xaf\x33\x4a\x79\x59\xf0\x2e\xb4\x1f\x27\x71\x84\x54\xdf\xa1\x92\x8d\x0c\xf1\x6c\xaa\x23\x13\xb1\xab\x47\x5f\x79\x03\x2b\x26\xe9\xe2\xd1\xd3\x71\x70\x23\x47\x8c\xe0\x9e\x36\x3b\x8a\x09\x5d\x5f\x2d\x6f\xf5\x2a\x3c\x3a\xf3\x3e\x50\x02\x09\xd3\xda\x4a\xcd\xb9\x21\x50\x54\x70\xfc\xa6\x85\x0f\x27\x07\x61\xe1\x78\x81\x21\x12\xbe\x4b\xed\x48\xa8\x17\x34\xf4\x64\x39\x1a\xa2\xac\x4d\xc4\xae\x3e\xaf\xc4\xab\x86\x2c\x74\xb2\x4b\xf6\x3e\xbb\x87\xe2\x11\xa4\x29\xc3\x62\xb0\xbe\x33\x75\x29\x59\xc7\x27\x86\x11\xe3\xb2\xb0\xba\x87\x96\x80\xea\x38\x0f\x12\xbb\xb1\x2c\x53\x18\x8c\xd9\xea\xb6\xed\x7c\x9c\x0b\xf0\xa2\x24\xc3\x34\x91\x1c\x97\xe1\x7c\x3d\x6a\x88\x97\x23\xde\x1e\x2c\xde\x40\x8e\x5a\x76\x2a\x47\x9a\x82\x16\x80\x05\x19\x2b\xf5\x53\xa2\x68\x75\xe8\x35\xdd\x8e\x3e\x71\x1a\x8b\xfb\x8b\xb2\x03\xae\x83\xc9\x7b\x41\xb0\x06\x7a\x27\xba\x0b\xd2\x37\x7a\xf5\x8a\x9d\x9a\xef\x0f\xc2\x67\xae\x01\x29\x5b\x20\xd0\xb8\xc0\x40\x4c\x1e\xb5\xf2\x46\x99\xf8\x42\x73\xd9\xb9\xe9\xa8\x78\xd3\x95\x79\xc5\xa0\x97\xad\xfe\xaa\x76\x07\x0c\xb5\x3d\x58\x25\x1e\x2f\x1a\xa8\x4a\xaf\x77\x96\x84\xc7\x15\x31\xee\x21\xcb\x4c\xdd\xe0\xf4\x71\x7b\x46\xa6\xe9\xc5\xcb\x89\xfc\xaa\xd7\x7c\x7a\xe0\x96\x6f\xf3\x88\xaf\x07\x09\x54\x06\x2f\xb4\x85\x00\x4c\x3c\x28\xab\x16\x37\xaa\xb8\x43\x88\x75\xb9\xd5\x45\x53\x9d\x1f\x80\x3f\x47\xf4\x4e\xba\x0f\x7c\x3a\xba\x6d\x91\x93\xa0\x96\xeb\x05\xb6\x7b\x03\xd5\x6a\x1b\x04\xe8\x65\xd3\xe0\x15\xc8\x04\x55\x2b\x8e\x80\xcf\x97\x1a\xc4\xe8\x35\x5c\xb6\x80\x76\xb8\x84\xcd\x9e\xbe\xc5\x3b\xa7\x8d\x80\xc7\x5b\x30\x5c\x0d\xcf\x33\x79\x91\xd0\xc2\xce\x48\x96\x65\xa9\x3b\x0a\xcd\x81\xb4\x82\xba\xd2\xa8\xd7\xc6\x60\x7a\xe1\xd0\x01\xac\x8a\x22\xdf\x7f\x3d\x58\x03\x42\xa5\x90\x6e\x43\x12\xc1\x69\xd6\x07\x6d\x28\x15\x87\xdb\xa0\xee\xa7\x3b\xc1\x6a\x71\x4a\x6c\xfc\xc6\x8b\xb8\xf1\x40\x18\xe8\x72\x7e\xe7\xbd\x1c\xd7\x51\x70\x0b\x12\x16\x04\xf5\x59\x2b\x1e\x54\xa0\x4b\x2c\xbb\xb1\xf7\x30\x59\xcb\xf2\xf4\x7a\x4e\x50\x28\x19\x2d\x14\x67\xa0\x67\xe1\x4a\x0c\x8e\xce\x41\x79\x32\xb0\x2b\x15\x37\x5b\x18\x0f\x37\x87\xbb\x49\x55\x78\x65\x61\x20\xea\x01\xad\xd5\x50\xfa\x75\x1a\x7b\xc0\x20\x64\xde\x4e\x6c\xe3\x17\x62\x0c\x71\xb9\xf2\xbe\x2a\xe1\x81\xa0\x80\x58\xa3\x5d\xf8\x9a\x6b\x4f\x3b\x37\x61\x57\xe8\x48\x8e\xd5\xd9\x35\x52\x77\x89\x72\xb0\x6c\xd4\x1c\x69\x89\x1d\x8e\xaf\xe7\x5b\xb2\x8c\x8f\x88\xb6\x9b\x8e\x9b\x17\xd2\xc0\xc6\xa0\xf2\x89\x18\x01\xf8\xc7\xf9\x72\xaf\x31\xeb\xe0\xc8\x67\x2c\x01\xec\x4d\x38\x42\x30\xf5\xbe\x1e\x51\xba\x2b\x94\x49\x37\x15\x3d\x3c\x4b\x77\xd0\xe1\x02\xea\xa6\x65\xee\x0e\x80\x8e\x18\x85\x1d\xcb\xa2\xb8\x23\x37\xb9\x20\x4d\x0d\xdf\xa5\x40\x54\x59\x6a\x91\xe4\xc7\xaa\x38\xe1\xcd\xe3\x0c\x7e\x00\xac\x3c\x4b\xaf\xa8\x94\x76\x4d\x5e\x3d\xca\x0b\x0b\x9b\xdd\x8b\xcb\xef\x6f\xf3\x58\x1f\x9c\xf3\xc0\x05\xaf\x67\xc8\x60\x05\x69\xe2\xf4\x49\x59\xa5\x5b\x9a\x18\x86\x81\xae\xb0\xec\x80\xd8\x9e\xb6\xb8\x39\xc4\x30\x74\x2d\x0e\x85\x22\x79\xbb\x84\x02\x6a\xd0\x38\xf7\x9d\x09\xa3\x3d\x72\x84\xfa\x08\xb4\x5b\x37\x79\xa0\xca\xcf\xf5\x65\x25\x3a\xf7\xa6\xab\x21\x9e\xcc\x64\x79\x2e\xc4\x13\x8e\x51\xc8\xfb\x7a\x84\xbc\xd4\xac\x45\x9e\x97\x8e\x72\x3d\xe6\x2e\x00\x2c\xa2\xb0\x7e\x38\xda\xd4\xaa\xa6\xe7\x66\xa1\x5b\x75\x25\xd6\xa3\x0c\x8a\x44\xb7\xdd\x76\xff\x68\x59\x70\xa7\x3e\x98\xea\xa0\x3d\x2f\xcd\xb5\xaf\xe6\x05\xc2\xbd\xe0\x3a\xfb\x9a\x44\xab\x75\x64\xa0\xfb\x39\x09\x6b\xfe\x70\xd0\xe0\xcf\x1c\x12\x5e\x4f\x78\x44\x9a\xdc\x2f\xd6\x61\x8b\xa6\x8d\x58\x40\xae\x09\xfd\xed\x7e\xd5\x2e\x75\x77\xa7\x37\x44\xb1\x0a\xc2\x59\xb9\x24\x08\x4e\x5d\x57\xc8\x16\x2c\x29\x89\x6c\x23\x83\x9d\x2b\x2f\xcd\x32\x55\xd3\xf2\x7a\xa9\xc6\xa5\xb7\x8b\xec\x41\x0c\xe5\x73\xc4\x6b\x0e\x35\xfb\xcc\x9f\x78\x91\xe8\x45\xa3\x20\xf6\xa5\x25\xab\x0b\x7a\xc7\x93\xf6\x55\x5f\xe7\xc0\x69\x85\x0b\x16\xd4\x64\x7b\xb2\x2c\x4d\x74\xc3\xfa\x2e\x4d\x8e\x12\xde\x03\x98\x59\x05\xf3\xa5\x04\x11\xa5\x15\x5a\x57\x51\xe2\xed\xf5\x8c\x48\xe0\xb8\xcb\xf5\xcc\xbb\x1a\x80\x0d\x96\x3c\x03\x0c\xe7\x30\x47\x01\x75\x3f\xc1\xe9\x09\x08\x0d\x20\xe9\x1f\xb7\x0f\x4d\x6a\x9e\x41\x05\x38\x77\xeb\x95\xf5\xbc\x48\x62\xb0\x1b\x12\x19\x3b\xe7\xe7\x97\x7c\xd1\xe1\x0c\x4a\x21\xd6\xed\x51\x0f\x21\xe6\x36\x10\x95\xe0\xb5\xae\xa7\xdd\x3c\x19\xb0\x2e\x22\x1c\x7c\xea\x85\xeb\x02\xc0\xbd\x4a\xc0\xef\xbb\x51\x53\x17\x0c\x9d\x1c\x2e\x15\x18\x69\x3e\x49\xef\xf5\x82\x23\x45\x7b\x35\xa3\x06\x7e\x1e\x40\x26\xa0\xe5\xf3\x66\x11\x93\xb7\xdf\x76\x89\x90\x06\x7c\xd8\x4a\x0c\xa3\xd8\xc2\x21\x63\xf5\x86\x1e\x97\x0c\x87\x20\x52\x73\x1e\x58\x25\xe5\x86\xda\x4f\x20\xd8\x12\x8c\xd5\xca\x51\xd9\xa1\x53\x18\x99\x3b\x92\x8a\xac\xc9\x2b\x9f\xf5\x48\xb0\xd1\x98\x4a\x66\xe0\x9f\xa0\xb0\x47\x40\x48\x59\x38\x20\x27\x0f\xbd\xf6\x49\xc1\xc8\x53\xef\xea\x55\xbf\x46\x33\x71\x83\x7c\x05\xa3\x41\xd0\xdf\x8d\x3d\x05\x9a\xc5\x46\x16\x97\x86\x19\xc5\x8a\x6e\x98\x76\xb5\xc4\x09\x4a\x64\x07\x41\xcc\xc3\x7d\xe7\x3c\x41\xfc\x1e\xc7\xd0\xeb\xb9\xc6\x71\xed\x23\x49\x78\xe6\xc6\x3d\xc2\x9e\x29\x8e\x03\x3d\xca\x10\xe2\xe1\x06\x0a\xdf\x73\xe9\x37\xa4\x10\xc9\x18\xbb\x45\x28\x8a\xa6\xd7\x8a\x35\x5f\xe7\xa1\xce\x01\xb6\x9e\xf6\x13\xee\xd9\xf4\xa0\xa1\x8d\x88\xe0\x9e\x71\xbf\x61\xd6\x89\xbf\x29\xea\xb7\x33\x4e\x5b\x08\x2f\xaa\xd0\xd0\x85\x98\xb2\xd6\xb2\x9d\x0b\x3a\x90\xcf\xd7\xeb\x2a\x31\x12\xdf\xb9\xea\xb4\xa4\x8b\xf9\x7a\xa6\xe4\x2d\xd2\xaa\x8d\x83\x3e\x0c\xf0\x6c\x2e\xad\x6d\x48\x40\x31\x43\x10\x4b\x62\x84\x24\xbc\x38\xa1\x33\x81\xb2\x70\x28\x0f\x87\xef\x67\xb3\xa7\x7b\x05\x11\xb3\xa3\x50\x5a\x29\xf0\xde\xc6\x32\x0c\x7d\x58\x0f\x76\xad\x74\x45\x3b\x25\xad\x4c\x0f\x8b\x1f\x2a\xdb\x43\x3a\x43\xde\xa3\x53\x99\x15\xc2\x70\xe4\x16\xe7\x57\xf4\x7c\x9b\x8f\x32\x2b\xda\xad\x17\x9b\x92\x70\x41\xa6\x41\x5b\x4d\xbe\x3d\x1c\x3e\x7d\x9e\x03\x7d\x96\x42\x99\x7d\xb3\x01\xb7\xd4\x5f\xef\x9f\xca\x2b\x57\xde\x4a\xe8\xf5\x6c\xd3\x58\xf1\x7d\x47\x7b\xc3\xce\x34\x98\xac\xc1\x96\x9c\x44\x96\x85\xe5\xeb\x55\xe5\xa9\xa8\x43\x43\x28\x33\x34\x54\x7b\xe6\x12\x46\xe3\xe4\xed\x51\xde\x2a\x2e\x16\xbe\xc9\x39\x51\x21\x62\x91\x4f\xd6\x33\xa3\x1f\x13\xc8\x9f\xe9\xa3\x98\xce\x41\xe1\x09\x6e\x4d\x4e\x40\x6d\x23\x38\xd2\x66\xf8\x8c\x2f\x91\xdb\x18\xb1\x2c\x23\xca\xa5\x04\x94\x7c\xa6\xa6\x84\xf1\xa2\xfd\xda\xba\x27\x51\xd9\xde\x0e\x44\xdb\xdf\x8c\x4b\xe0\xf1\x5d\xb9\x1c\x40\xed\x09\xdd\xe3\x9d\x68\x37\xbc\xb1\x70\x63\xf0\x42\x99\x38\x8a\x18\xc0\xda\x2a\xb3\x9a\x9d\x3a\x59\x15\x85\x46\x33\x15\xb6\xa3\xca\x41\xbc\x78\x14\x9f\xbe\x08\xb4\x41\xd2\x1a\x7c\x5f\x09\xcd\xbd\x41\x8e\xc7\x06\x01\xf8\xa1\x70\xf7\xe7\xb7\xf3\x11\x4e\x67\x69\x90\x2b\xd0\x9d\x49\xef\xa8\x59\x44\x34\xbd\x3b\xa1\x68\x6f\x02\x22\x2f\xc3\x7d\x9a\x49\xe8\x38\x00\x85\x52\xbc\x9e\x6b\x52\xa0\xe2\x36\x77\xe2\xb0\x04\x97\x6b\xc5\x8f\xb8\xb6\x00\x85\xe9\x84\x11\x9d\x09\xe7\x96\x79\x0a\x79\x2e\x7e\xe8\x69\x91\x5b\xe8\x8e\x4e\x5f\x27\x15\xe4\x35\xcc\x52\x4f\x23\xc1\x20\x7c\xbc\x0a\xda\xeb\x95\x07\x63\xa5\xd0\x15\x29\xf0\xd6\x79\xc6\x06\xc2\x82\x3c\x71\x63\x69\x5c\x49\xfd\xd2\x8f\x77\x65\xd1\x01\x80\x22\x57\x28\xb6\x8e\xde\x8e\x05\xb9\xc4\x8b\xed\xa4\xbf\xd7\x4f\x0e\x32\x3c\x3e\x87\x98\xd6\xf0\xcf\x97\xeb\xac\x1b\xc6\xd3\x9f\xc6\xe4\x6c\x76\xf4\xdb\x99\x20\x0e\x66\x5d\x26\x3c\x79\xc6\x32\x5f\xde\x46\xb5\x1c\x93\xb2\xee\xba\xe7\xdc\xe1\xd6\x51\xf3\x6b\xd6\xec\x11\xcc\xd7\x20\xab\x14\x85\xdb\xdb\x99\xd5\x71\x15\xb2\x83\x4a\x01\x5a\x11\xa6\x4d\x87\x25\x43\xa4\x06\xdc\xa0\x35\x85\xed\x49\xd2\x65\xf6\x65\xb9\x24\xb5\xda\x86\xfd\x28\x5a\x8e\x95\xf3\x7a\x0c\x7a\x95\xa8\x70\x85\x8c\x2e\xc2\xe0\xe5\xf5\xbe\x28\x0d\x31\x91\xcc\xe7\xf1\x71\x9d\x51\x4f\x7b\x3a\x40\x9b\x3b\x54\xb0\xae\xe6\x84\xcc\x15\x02\xa4\x1a\xe0\x9a\xaf\x77\x77\x4f\x61\x78\xab\xf9\xe2\xed\x9c\x4c\xbd\xbc\x64\x07\x82\x02\xca\xca\x02\xf6\x05\xbf\xac\x87\xe4\xbe\xbc\xf6\x35\x86\xbf\x64\x19\x0e\x93\x3d\x04\x8c\xba\xba\xb3\x7d\x4d\xcd\x65\x98\x48\x84\xc1\x98\xfd\x72\xcc\x3f\x31\xd0\xda\xda\x91\x5a\x06\x62\x74\xf5\x32\xdf\x26\xb7\x9f\xb1\x28\x42\xf5\xfe\x89\xa5\x0d\xfe\xac\x2e\xd1\x60\x67\xa6\x04\x44\x05\x46\xc6\x50\x12\xbe\xb6\x30\xc5\xbb\x3a\xf3\x3a\xe3\x56\xab\x65\xf6\x90\xf8\x8b\x57\xa9\xe9\xd5\x95\x5e\x37\x83\xe3\xf9\x81\x00\xb1\xd7\x15\x23\x3e\x0d\x41\x2a\xf3\x8f\x44\x8c\xa5\x65\xa2\x74\x21\x07\x78\x24\xe5\x99\x23\x65\x3e\xc2\x1a\x97\xc4\xf4\x17\xc0\x81\x9a\xd7\x6b\xbd\xe6\x3d\xa7\xfc\x6d\xf7\x87\x0a\xe9\x34\xa7\x23\xe0\x0c\x25\x49\x30\x66\x70\xf6\xab\x35\xf6\x65\x1b\xe7\xab\xd7\x8b\x22\xaf\x77\xd1\xf7\x0b\xa0\x4b\x60\x93\xdb\xd7\x3b\xcc\x28\x45\x06\x7b\x54\x1d\x85\x63\xde\xbf\xce\xf2\xa5\x0f\xed\x9a\x2d\x1a\x8d\xc3\xb0\xd5\x01\x84\x3b\xdf\x82\xf4\xa5\x59\xe3\xe3\x33\xad\xb6\x73\x97\x1e\xcb\x76\x59\xe8\xd8\xc3\x20\xe6\xea\x1a\x0e\x01\x9b\x0e\xae\xbb\x61\xe4\x56\x64\x9a\x7a\xfd\x06\xb4\x3a\x0a\x45\x0f\x32\x0f\xf8\x95\x6d\x69\xb3\xa1\xe9\x79\x87\x0e\xd8\x92\x84\xa9\x7e\x9f\x2f\x28\xcc\xd8\x8d\xc8\x04\xa3\xf8\x20\x8f\xe7\xe6\xcc\x64\x85\x4d\x64\x38\x9d\x8c\xb4\x29\x8a\x2d\xc3\xa6\x56\xa9\x14\xb7\xb1\x71\xba\xd7\xb9\xdb\x2b\xe6\xad\x3b\x80\x7a\x18\x5e\x29\x0f\xf8\xb0\x64\xfa\x53\xe3\x54\x5b\xe1\xe1\x91\xd1\x9c\xea\x15\x11\xa4\x6f\xcf\x12\x4e\x7c\x06\x62\x88\xce\x60\x2f\x83\x29\x5f\x41\x8e\xc1\x8e\xf3\x80\xdb\xec\x75\xe2\x14\xc9\x43\x8f\xdc\x70\xc8\x16\x9c\x6e\x96\x61\x88\x52\x90\x1b\x03\xc3\x64\x3d\x99\xfa\x8f\xc8\xa8\xf7\xdb\x72\x74\x75\xc0\x94\x43\x5b\x4c\xfa\x75\x9d\x16\x77\xca\xae\xc5\x74\xc1\xb1\x0d\x8d\x8c\x1e\x8d\xc7\x8b\x4e\x0c\xfd\xdc\x8d\x40\xf4\x0f\x15\x4a\x27\x33\x94\x36\xea\x8e\x40\xb7\x79\x00\x29\x23\x95\x2b\x10\x7c\x66\x73\xac\x31\x8a\xd2\x1c\xcd\x6e\x20\x75\x98\xdc\x0e\x66\x17\x23\x7b\x9d\x2b\x43\xb7\xd8\x14\x9f\x60\x21\x53\x0a\x1d\x1e\x1b\x9c\x13\xaa\xdd\xe2\xcd\xb6\x5d\xb2\x8f\xf7\x8b\x45\x4e\x66\xe9\x70\xf6\x26\x22\x38\x5c\xce\x6d\x0a\xc1\x34\x4b\x1d\x6e\xe2\x26\x61\x1e\xf7\x94\xd4\xf8\x8a\xe3\x8d\xdf\xd8\x40\xeb\x16\x20\xc5\xcc\xfb\x42\xc3\xd9\x44\xa1\xcb\x71\xc5\xa6\x21\x44\x59\x8a\x89\x7d\x0a\xba\xf7\xa2\x72\x51\x1a\x15\x04\xfe\x35\x77\xcb\x16\xd7\xb6\x91\x81\x3d\xf4\xf2\xb8\x48\x5b\x5b\x2a\x9b\xc5\xde\xa7\x69\x16\x58\x51\x9d\x07\xfd\x75\xf6\xaa\xb9\xe1\x8c\xe1\x11\x32\x69\xf7\xbe\xef\x42\x17\x5d\x67\xf9\x49\xdc\x26\x7a\x49\x68\xc0\xaf\xc9\x3b\x0d\x7e\x90\x76\x5c\xd8\x25\xc2\xd4\xf2\xfa\x7a\xb1\xee\xc1\x9b\x65\x62\x87\xb0\x3f\x6d\xfd\x5a\x24\xfb\x9d\x01\x3a\xe4\x98\x5f\xb3\xc3\x73\x78\x7b\xec\xf1\xbe\x27\xdc\xf2\xe2\x40\x09\x44\x87\x2d\x73\xb7\x25\x10\x94\x3d\x9a\xb8\x7c\x93\xd0\x20\xf3\x9c\x88\x6e\x50\x74\xd9\x99\xbc\x01\x18\x3a\x55\xa3\xd1\x41\x70\x56\xb3\x0b\x4d\xc8\x2c\x84\x83\xcd\x7a\xbd\x77\xf6\x3a\xc4\xcc\xf5\x79\x3c\x86\x93\x5b\xcf\xda\xc9\x01\xda\xa2\x8d\x04\x96\xec\x00\x45\x1a\x88\x36\xc5\xcf\xb6\x8f\x1c\x27\x81\x60\x16\x4d\x2b\x89\x25\x8a\x22\x12\x8a\x1b\x7d\xb7\x71\x13\x54\x14\x3c\xa5\xf1\x0b\xe2\xeb\xc3\x0e\x61\xf5\x84\x06\xd0\x72\x0a\x1a\xe3\x18\x3c\x22\x6e\xba\xe4\xac\x95\xa2\xc2\x85\x59\x1e\xa4\xea\x30\x36\x10\xe9\x62\x08\xf6\xda\xdd\xee\x48\x26\x1e\x0b\x84\xff\x7c\x9e\xc4\x28\x13\x0b\x3d\x61\x84\xcd\x7c\xdd\xc2\x48\x62\x36\xa9\x82\xb6\xe1\x96\xcd\x3a\x3b\x94\xd5\x19\x90\x85\x24\x61\xf7\xf4\x75\x28\x42\x76\xac\x88\x97\x40\x91\x20\x40\x3c\xbf\x9e\xc9\x60\x70\x9b\xe8\x7d\xd9\xf6\x3a\xb7\x0d\xd0\xe5\xd1\xe9\x21\x36\xcd\x60\x3d\x8b\xad\x13\x56\xf5\xfe\xff\x63\x3c\x5b\x89\x0f\x19\xbc\xe6\x6f\x23\x1e\x4d\xcf\xf6\xaa\x3b\x00\x75\x4c\x80\x51\xf4\x8d\x29\x5e\x5a\x02\x9f\xa8\x9d\x64\x2f\xea\x63\xab\xbb\x1e\x04\x3b\x65\xcb\x57\x59\x75\xb5\x2a\xd8\xae\x9e\xbc\xd4\x83\xb5\x8a\x33\x8b\xce\x2d\x7b\xbc\x1d\x6f\x5c\xa6\xe5\x7c\xf1\xfd\xbc\x06\x7a\x62\x10\xb6\x2c\x03\x29\x3e\x4a\x87\x2c\x68\xba\x80\xe6\x59\x2b\xdb\x4e\xe8\x58\x8f\x62\x2c\x11\x3d\xb2\x61\xe4\x68\xa1\xa3\x22\x34\x15\xde\x0a\xb0\x1b\x17\x95\xd8\x12\x8c\x4e\xda\x40\x5e\x5f\x2f\x0a\x31\x99\x7d\x42\x55\xe7\x0a\xe6\xef\x09\x95\xce\xdd\xfc\x64\x96\xb8\x85\xf3\x30\xc3\x63\x68\xf6\x74\x01\xc8\x01\x36\x5c\x43\xf3\xdb\x9b\x7f\xc5\xb0\x21\x2b\x2f\xda\x88\x01\xf2\x05\x03\xd7\xe6\xcc\xc0\x59\xe8\xf5\xf6\x57\x2b\x3b\xc7\x40\xd4\x8c\xbb\x42\x53\xc3\x86\xfa\x27\xb1\xa5\x66\xc0\x8f\xcb\x9e\x63\x08\x3b\xe1\x3f\xdf\x2d\x30\x79\x7a\x25\xa8\x6c\x96\xef\xeb\x63\xd9\xef\x2f\xe2\xfa\x5e\x83\xdd\x50\xf6\x5a\x43\xdf\x1e\xdd\x16\x2f\x96\x89\xef\xed\x68\x31\xd0\x83\xe6\x0d\x2c\x21\x48\xe8\x40\xbb\x54\x62\x49\xea\xc5\xad\xc7\xfd\x91\x63\x85\xf2\xa2\x6a\xeb\x29\x91\x33\xe0\xa6\xc3\x15\x87\xef\x6b\x8b\x14\xa9\x75\xde\x81\xfe\x7a\x38\x4e\x96\x81\x41\x2f\x18\x28\x60\x74\xc4\x9e\x01\xfc\xd3\x09\xbd\x63\xd0\x50\x54\x99\x29\x0b\xc5\x4d\xde\x84\xeb\xf9\x08\xdc\xee\x26\x91\xcf\x34\x08\x6a\x9a\xeb\xfa\x7a\x84\xa1\xe6\x7e\x45\x99\x88\x12\x7f\xe3\x67\xcf\x53\xfc\xb8\xf8\x43\x57\xb9\x49\x13\xd4\xd1\x43\x86\x07\x0c\xc3\x40\x84\x5d\x1f\xea\x1e\x45\x0d\x39\x47\x35\x08\xd1\x0c\x93\x61\x6e\xa0\x00\xd1\xc9\x29\x68\xf4\x4c\x79\x83\xbc\xbe\xd7\x72\xa5\x34\x0d\xef\x74\x07\x05\x99\xea\x07\xeb\x4c\x74\x9a\x10\xb3\x78\xbd\xa7\xe9\x94\x26\x4a\x56\xf2\x57\xa0\x13\x6b\x29\x1c\xf0\x88\x5f\x6d\xc8\x22\x8b\x89\x4e\xfd\x05\x32\x88\xc5\xa5\x8e\xeb\x18\xb2\xd0\x9e\x3e\x48\xcf\xad\x5f\xaf\xa4\xfa\x64\x24\x72\xa1\x88\x41\x78\x47\x99\xdb\x35\xc3\xee\x00\xf5\xf1\x73\xdb\x7a\x0c\xb7\xe9\xf9\xe7\x73\x26\x79\x1b\x5f\xef\xbb\x25\x37\x44\x28\xd0\xf6\xa1\x6e\x59\x32\xd7\xae\xae\x59\x90\x90\x21\xa4\x79\xbf\x37\x69\x66\xee\xc9\x0d\x27\x92\x73\xa0\x3d\x46\x0c\x78\xe5\x8e\x6e\x81\x79\x2c\xcf\xa9\x92\x59\xe7\x43\x2a\xcf\x24\x62\xde\x67\x7a\x6e\xd5\x6d\xad\xe1\x60\x2c\x1f\xa8\xe1\xb8\x0f\x89\x5e\xc3\xc1\x25\x71\xd8\xf7\x1a\x87\x24\x42\x00\xfd\x2b\x50\x62\xaf\xff\x37\x7b\xc1\xf0\x49\x2e\x1e\xa9\xa7\xbb\xcc\x0c\x0f\x46\x8f\x80\xf0\xea\xa9\x6e\xc0\x8f\x14\xbe\x9b\x46\x38\x18\xa1\xc6\x0c\xba\xb2\x1d\xee\x29\xcf\x4b\x79\xb2\xaa\xe1\x87\x26\x7d\x0e\xe1\xd0\x87\x0f\xff\x88\xfb\xa2\x28\x06\x2b\x94\xb2\x99\x37\x44\x59\xfc\xff\x50\xf5\x26\xeb\xae\xe2\x4c\xd3\xe8\x05\x31\x10\x7d\x33\xb4\x8d\x01\xd3\x9b\x1e\x66\xb4\xa6\x37\xbd\x81\xab\x3f\xa2\xfe\xb7\x56\x7d\xa7\x9e\x3d\xa9\xbd\xd7\xb2\x41\x52\x46\x46\x48\x99\xa1\x7c\x9c\xb5\x1b\x86\xb3\xb9\x29\xee\x0e\x71\x1e\x83\x95\x15\x82\xca\xf6\x31\x16\x6f\xe8\xba\xf1\x1f\x1c\x59\x2f\xe0\xbb\xce\xdb\xde\xc4\x79\xb7\xd0\x48\x2c\x36\x56\x02\xfb\xcb\x13\xec\x80\xf7\xf9\x25\x2f\x00\xea\xf0\x27\xc7\xce\x89\xe7\xb1\x32\x19\xf2\xaf\x10\x1b\x8f\xad\x95\xb8\x62\xe2\xde\x09\x97\x16\xec\xcb\xfe\xb7\x6e\xe1\x76\x2f\xe6\xf6\x33\xb7\x07\x8d\x1d\x0e\xb7\xfa\xed\x34\x82\x8b\x16\x4a\x5c\xe8\xeb\x1f\xa2\xdf\xca\x6e\xa8\x7e\xd2\xfb\x9f\xad\xf5\xf3\x6b\x12\x0c\xc9\x13\x80\xe0\xc8\x31\x1d\x02\x13\xbb\x76\x2d\xbc\xd6\xf3\xef\x0b\xf7\x9c\x18\xa8\xad\x97\x1b\xeb\xe7\x2e\xef\x2e\xa6\x0d\xb6\x10\xf2\xdd\xa8\x9f\x34\xda\x38\x1b\x16\x80\xb1\x83\x11\xf4\xb3\xb6\x47\x3a\x79\xf4\x75\xd0\x7c\xbc\x0b\xee\x77\x46\xc8\xcc\x4a\x1f\x6e\x7a\x7e\x45\x01\x3f\xfe\xb7\x0e\xe5\xc2\xe8\x15\xdc\x01\x9c\xf0\x0b\xfd\x5f\x5e\xec\x08\xff\x2b\xf8\xe7\xe5\x04\x90\x24\x25\x97\x83\x0c\x41\x26\x49\x2a\x7f\xb1\x64\x19\x8c\x3c\xce\xa3\x77\xff\x6a\x65\x27\x86\x94\xe1\x40\xea\xa6\x56\x21\x16\x30\x11\xf2\x41\x13\x28\xe8\x72\x39\xe5\x42\xfe\x5b\xd4\x47\x00\x48\x66\xe6\x10\xb6\x35\x2c\x91\x56\x03\x9a\xcb\xe7\xa0\x22\xc0\xca\xc7\xc9\x04\xd7\xd0\xe3\x37\xdb\x9f\xd0\xfb\xdf\x9e\x26\xff\xb1\xf1\x02\x86\xbe\x5b\xe8\x30\xed\x8f\x09\x14\x44\x46\x0c\x22\xa4\x3b\x22\x6b\xc6\x93\xc1\x5a\x56\x3d\xf1\xb1\x86\xe5\xb8\xb6\x54\x2b\xa6\xa2\x3a\xa8\x02\x7d\x95\x9a\x63\xe7\xae\xb3\xc9\x17\x8b\x41\x79\xa3\x4d\x1c\xe1\xbe\xd8\x76\x48\xcd\x81\x48\xa6\x69\x6e\x33\xe1\x10\xbb\x4a\xe9\xc8\xb5\x01\x7f\x35\xc9\x6c\x1e\x72\x5b\x48\xf1\x07\x13\xb8\x78\x2f\x83\x7f\xf1\xe3\x76\x12\x19\xca\x41\x7e\x5a\xb3\x5f\x84\x89\x16\x77\x9c\xe7\x97\x99\x9b\xbb\x53\xb3\x33\x45\xfc\x73\x7c\x0f\x29\xc3\xa4\xf7\xf1\xcc\xbe\x70\xea\xe1\x29\x54\x74\xd5\x5d\x7e\x3a\xe1\x80\x70\x18\x37\xa5\x46\xd4\xc5\x11\x72\x66\x40\x38\xed\x8c\x1d\x35\x24\xe2\xa8\xf2\xdc\x8a\x42\x54\xf5\x61\xd1\xcf\x57\x72\xe5\x81\xd6\xa6\x8a\x17\xcc\x0d\x6a\x8c\x6c\x28\x14\x42\xea\xf3\x23\xfe\x6d\x4a\x92\x57\x4f\xd4\xee\x84\x86\xf5\xc9\x24\x0f\xf3\xbd\x66\x3a\xcd\xe3\x46\xa8\x38\xc8\xb2\x7c\x6b\x24\x5d\xe8\x66\x82\x58\x14\x8c\xa5\xb2\x42\x69\xba\x1b\x2e\xd7\x5f\x72\x55\x0f\x56\xad\xe7\x6e\x09\xd4\xe6\x88\x55\x19\x91\x88\xa9\x69\xdc\xac\x91\x26\x11\x99\x36\x5a\xed\xc1\xc6\x96\xba\x3b\xd2\xf5\x10\x7d\x33\xe9\x25\x41\x02\x68\xca\xd4\x49\xed\x4b\x58\xbf\x3f\x9f\x3f\xfc\xd7\xc1\x2f\x9f\x50\xbd\x76\x89\xa3\xc6\x56\x2a\xfd\x78\x11\xe9\xe6\x34\x53\x84\x4c\x74\x67\x2c\x32\xb8\xb1\x6c\x88\x6d\xde\x80\xaf\xcf\x49\x2b\x21\xe5\x11\x7e\xd8\x55\x4e\x3e\x71\x68\xe5\xab\x7e\x46\x16\xed\xd0\x79\x8b\x5f\xed\x84\x8c\x0d\x49\x07\x99\x77\xcb\x01\x3b\xdd\x33\x8a\x87\xd1\x04\x49\xec\xa3\xdf\xf1\x5c\xbe\x7a\x71\x44\xe1\xef\xbd\xef\xeb\x75\xf6\xe9\xb8\x98\x76\xf0\xf4\xe4\xc4\x69\xa3\x98\x2c\xa3\x1c\x83\x0f\xa1\xfc\x79\xf0\xc8\x80\x1a\x13\xc0\x4e\x1f\x72\x14\x2e\x55\x71\x99\x6f\x20\x93\x65\x81\xba\xdf\x7a\x2e\x81\xbc\x2a\x1c\xd3\x91\x42\xdf\xfa\x67\x66\xf6\xe7\xd4\x9e\x2e\xa1\x13\x00\x3b\xb0\xab\x56\xf9\xf7\xd0\x3b\xc7\x3b\xca\xe0\xe0\xb9\xc9\xc2\xed\x7e\x9e\x1d\xf3\x56\x52\xff\xee\xcb\xde\x59\x92\x38\xf8\x5b\x3f\x8b\x36\x39\x42\x10\x79\x55\xb1\x49\x49\x68\x37\x62\x90\x15\x79\x38\xff\xe4\x4c\x87\xe0\xce\x98\x83\xd4\xc6\x38\x5d\xf6\x91\xdf\x35\xb1\x57\x82\xdf\x27\xbb\xf9\x30\xbe\x38\x2b\xd2\xf7\x13\xa6\xf4\x02\xc9\x96\xcd\xa6\x5e\x8d\xdf\x98\x50\xda\xfe\xa3\x20\x1a\xa9\xb5\xed\x41\x8b\xbb\xa8\x0d\xeb\xdb\x27\xf8\xd3\x5f\x3a\x35\xc6\x2a\xfb\x01\x8a\xd0\x97\x01\x52\x9b\xe8\xe8\x2b\x35\x3f\xef\x5a\x21\x62\x13\xb1\x63\x50\xc7\xa4\xcb\x2b\x9c\x3b\x28\x11\xe3\xd7\x4f\x23\x6e\xbd\x7e\xcc\x57\xbd\xe5\xd7\x9e\xec\x11\xf2\x15\xea\x25\xe7\x11\x99\xe2\x74\xae\x4d\x6c\x95\x9a\x67\x38\x5b\x00\x41\x08\xe4\x95\xdf\xf5\xf0\x3b\xdf\x1d\xa3\x5c\x3d\x43\x9c\xd5\xee\xfe\x6f\xef\xec\x03\x22\xe2\x4f\xe3\x85\xa1\x2d\xd0\x32\xbb\x8e\xf5\xb3\x3e\xc6\x63\x05\x25\x3d\x82\x83\xcc\x54\x56\x5a\x69\x39\x62\x0f\xf2\x2b\xa8\xea\xd9\xd0\x91\xc8\x5d\x18\xb3\xfa\x1d\x9f\x29\x24\x4e\x33\xcf\x59\xed\x5c\x11\x9f\xec\xf1\x21\x0d\xfe\x0e\x95\x6b\x2f\x7d\x5d\x23\x90\x98\xb9\xcd\x8a\x3c\x0f\x3c\x0f\x23\xad\x24\x7c\x8d\xc7\xbc\xa0\xc6\x40\x68\x1f\x26\x22\x32\xb5\x4c\xd5\x8b\xb2\x5a\xfc\xdf\x1e\x82\xd9\x3f\xca\xc1\x0d\x90\xf7\x3b\xd0\x1e\x0d\xe4\x40\xb8\xb8\xfb\x9a\x3d\xc8\x87\x56\xbf\x59\x51\x6a\xb9\x24\xc0\x0a\xd0\xec\x27\x14\xdf\x21\xf9\xe0\x88\xd4\xe0\x24\xc8\x42\xfc\x4e\x76\x1f\x2e\xd5\xa7\x74\x5f\x6c\xdf\x13\x8a\xaa\x4f\xf1\x68\x20\x8f\x2a\xee\x68\x00\x8e\xef\xce\x12\x50\x3e\x6c\xf8\xf4\x1a\xda\x80\x88\x56\x9d\x58\x2b\xaa\x88\x73\x31\x7b\xbe\xff\x8f\x66\xff\x3c\x54\x2a\x57\xdb\xa3\xa3\x35\x80\x6e\x90\x7e\x98\x39\x82\x70\x84\x76\xde\xf6\xdd\x5e\xe4\x71\xb1\xbb\xa3\x3f\x19\xb6\xa8\x10\x80\xe8\xca\x1d\x14\xab\xd0\x8d\xf1\xb3\x7c\xc1\xa9\xd5\xad\x1b\x78\x90\x53\x50\xdf\x0b\xf0\x25\x6e\x1e\x48\x6a\x09\x10\xaf\xeb\xac\xd1\xf3\x14\xf1\xbb\x20\x37\x75\x28\x26\x9c\x00\x0c\x03\x29\x9e\x1d\x0b\xb4\xdb\x0a\xb9\xbc\x21\x1f\xd5\x1d\x59\xe5\xfd\x38\xff\x6a\xf8\xe4\x6a\xba\xea\xf0\x89\x85\x44\xba\x77\xa1\x1f\xe9\xd5\xed\x46\xfa\xe3\x07\x14\x39\x90\x19\x6f\x9c\x31\xa3\x8a\xc4\x51\x81\xdc\x70\xf7\x57\x0a\x03\x80\x7a\x67\xfc\x07\xd5\x1f\x9c\x0b\x49\x6b\x56\x06\xa3\x67\xff\xe6\x2f\x9b\x1b\x85\x4a\x8f\x34\x27\xec\xa8\x7d\x92\x3a\xb7\xc5\x12\xff\xbb\x73\x00\x6c\xed\x8d\x3b\x52\x42\x6e\x0a\x10\x02\x77\x9b\x25\x34\xbf\xfd\x95\xcb\x69\xbb\x67\x41\x39\x0a\xb4\x4c\xab\xa8\xd0\x33\xb7\x4d\xd3\xce\x00\xa2\x0f\x24\x10\x57\xcd\x8e\xfb\xf2\xa2\xef\xee\x22\x92\xe8\x5e\x85\xc2\x00\xd4\x4d\x83\xaa\xd8\xa0\xbc\x1b\xd6\x54\xf7\xea\x56\xf2\x5b\x23\x9b\xfd\xb6\xbf\xae\x52\x7f\x02\xc0\xfc\xb3\xff\x7c\xa1\x8b\x35\xfd\x36\x79\xe3\xf3\x73\xef\x27\xa8\x3b\x34\xfe\x0e\x29\x2b\x5e\x65\x9a\x73\xf5\xfa\xb9\xed\x6f\x66\xe9\xfb\xd5\x16\xf0\x90\x9c\x50\x28\x8c\x1f\xf1\x78\xfc\x6f\xeb\x55\xdb\x2d\x1f\x5b\x99\xf3\x61\x8c\x9e\x32\xda\xe4\x27\xa8\x32\xe5\x41\x2c\x20\x87\x2f\x63\x06\x0c\xe7\x76\xd8\xf6\x7e\xb9\x4f\xee\x6a\xaf\x32\x20\x7f\x7f\xa1\x94\x42\xe2\x7a\xa5\xc1\x60\xbd\x21\x15\x9c\x9b\xe9\x7e\xfb\xc5\x66\x63\x22\xa7\x64\x82\xb3\xec\x39\xd9\x24\xb3\x98\x79\xde\x02\x8e\xd3\x52\x20\x42\x61\x29\xd0\xe9\x32\xb8\x03\x2b\x57\x0e\xf0\x7f\xda\xef\xf1\x5f\x6d\x2d\x15\x77\x1b\x04\xdc\xfe\xc9\x18\x90\xf3\x28\x9f\x6f\xea\x4c\xbf\x0f\x02\x40\xc5\x5e\xbd\x32\x27\xc0\x11\x0c\xff\xfa\x91\xd4\x48\x03\xc2\x66\x96\x73\xe5\x0e\x72\xb2\xdb\x45\x7d\x93\xb3\xca\xc0\x9c\x03\x40\xfe\x0b\x20\x23\x85\x6f\x4d\x14\x45\xbf\xc7\xa1\x93\xdc\x84\x84\x31\x64\xf7\x05\x85\xe6\x46\x58\x05\xd8\xdf\xbd\x0a\xb5\xb0\xf8\x4e\xea\x40\xdd\x38\x11\x4c\xf4\xed\xc3\x97\x7f\xe7\xb6\x8f\xf0\x49\x17\x8e\xe1\x7c\x48\xc5\x34\x3e\x2c\xf9\x55\xf6\xbc\xbf\x7d\xa0\x1c\x1e\xa1\x3e\x27\xb6\xb5\xf8\xd6\x78\x9c\xa0\xa3\x96\x57\x61\x2f\x13\x60\xc7\x04\xb3\x5a\x14\xff\x3b\xf3\x8f\xdb\x76\xc5\x60\x87\xad\xc9\x97\xfc\xec\x49\x9d\x31\x25\x00\xec\xb3\x00\x05\x29\xe8\x55\x12\x7c\xe4\x23\xef\xef\x4a\xdb\x00\x86\xe2\x16\x98\x5e\x3f\xa5\x5d\xbb\x63\xa3\x3c\x7e\x0b\xcc\x1d\xf6\x34\x52\x2b\x61\xbf\x2a\xf3\x5f\x9c\xd6\x20\xc7\x84\xf2\xce\x96\xb5\x86\x8d\x95\xe7\x8f\xcc\x93\x6b\x7b\xde\x2c\x40\xd4\xcf\x3e\x67\x66\x24\x4b\xce\x57\x4f\x8b\x39\x31\xc8\xcf\x1d\xa2\x19\xac\x26\x24\xf6\x7c\xf8\x82\x6b\xa7\x0a\xc5\xfb\x32\x3d\x06\x07\x3e\xd6\xf9\x4f\x4d\x90\x82\x7e\xf6\xf3\x04\x44\x00\x21\xb6\xa6\x3e\xaa\x59\xfd\xa0\xa2\xcf\xa4\xef\xf3\xc4\xe5\x13\xd0\x73\x56\x4c\x42\x6c\x87\xaf\xa5\x3f\xd9\x44\xdc\xb5\x68\x0e\x71\xd0\xdd\x95\xe3\x2f\x8e\x35\x3b\x29\x66\xda\x2b\xaf\xdd\xc1\xc3\x1d\x5e\x9f\x16\x80\x07\x7b\xc0\xd5\x76\x3b\x58\x80\x22\x70\x56\x36\xa1\x8b\x20\xb3\x6d\xe9\x4b\xa7\xbf\x34\xc8\x01\x38\xba\x2b\x80\x60\xa7\xd4\xb5\x87\x74\x73\x94\x8c\xea\xd9\x23\x4f\xa4\x2e\xaa\x42\xc4\x24\xb6\x62\x03\x7d\x06\x93\x52\x6a\xcb\x90\xd5\x90\x77\x1f\x5b\xe2\x6c\x45\x5d\xca\x15\xb3\xfb\xa5\x70\x4a\x60\x10\x4b\xa0\x0b\xbd\xf2\xaa\xff\xad\xcf\x84\x19\xc4\x74\x70\x4e\xfb\xb2\x5f\xa7\x8d\xbe\x0b\xb7\x16\x45\x31\x0d\x3c\xd8\xcb\x37\xab\x53\x29\x5c\x2b\x50\x92\xc4\x2d\x07\x63\x2b\x42\xe9\xdc\x53\xde\xe1\x47\xfd\x56\x77\x6f\xff\x6e\x7b\xdf\x13\x4c\xac\x6f\x5e\x7f\xa7\x3e\xa4\xf4\xa2\x20\x32\xd1\xf2\x62\x84\x49\x19\x41\xac\x07\x0c\x51\x10\x90\xbb\x95\xcf\xb1\x0a\xa1\x3c\xd7\xaa\x37\xc2\x88\x28\x3b\x71\xf7\x9b\x9e\x2b\xff\xcd\x4f\xc1\x15\x0c\xc5\xf8\x1f\xa8\x6e\x83\xee\x11\x98\xb3\x7a\x9e\xdc\xb6\x78\x5f\xc0\xbe\x72\x4c\x4f\x82\x2a\x51\xf2\x65\x8c\x49\x3f\x49\x25\x16\x23\x00\xe2\x0f\x77\x25\xed\xf5\x13\x13\x47\x0f\xd1\xb9\x2a\x0d\xc4\x1d\x32\x9b\x08\x7e\xd5\xec\xad\x8b\xaa\x42\x59\xff\x4c\xd7\xd9\x1e\xac\x36\x82\x7a\xea\x1a\x8b\x52\x1e\x91\x0d\xea\x89\xde\x47\x38\xd9\xfd\xec\xd7\x98\xbc\x0b\x56\xbc\xfd\x1f\x4f\x81\x9f\xb1\xeb\x50\x96\x26\xea\x3d\x8e\xee\x2c\x61\x1c\xa5\x5a\xe2\x5d\x06\xf3\x20\xc5\x82\xaf\x6b\x02\xa6\x17\xc2\xae\x9d\x05\xf1\x25\x8d\x6c\x51\x1b\x41\x5f\x0d\x50\x0c\x0e\xa3\x58\xbe\xa3\x87\x24\xac\x13\x86\xac\x4e\x13\x99\x22\x38\x7e\x56\xc4\x8a\x10\x8f\x62\x84\xe5\x54\x35\x4b\x36\xf0\xeb\x77\x16\x14\xcd\xf1\xfe\x27\x77\x1c\xd2\x87\xe7\x99\x93\xe3\x8d\x87\x27\x2b\x5e\x6b\xf7\x67\x65\x12\x1c\xe4\x35\x6f\xe9\xdf\x7d\x06\x91\xc7\x29\xc8\x14\xc5\xfb\x55\xdf\x86\x66\x6a\xaa\x60\x0c\x37\x52\x2c\xa2\x21\x22\x57\x9d\x10\x64\x9c\x12\x5f\xc7\xf1\x6a\x55\xf8\x58\xa9\x3e\x03\x96\xf5\xdb\xbb\x52\x3e\xfb\x7c\xa2\x1f\x2a\x2f\x2a\x19\x3f\x66\x2a\x03\x50\xb4\x29\x90\x11\xf2\x14\x2f\x85\xc4\xf0\x78\xb9\x4a\x5a\x11\x30\x27\xa2\x59\x10\xe6\x66\x20\x3f\xcb\xe7\xf7\xd0\x4e\xb9\x31\xbf\x32\x9b\xf6\x8a\x6d\x11\xd6\x23\xfd\xab\xdd\xe2\x23\x71\x1f\x6d\x63\x77\xd4\xb6\x27\x00\xc9\x16\xd4\x01\xb9\x63\x8b\x60\x5c\x4e\x03\x9e\xf4\x1e\xec\xaf\xce\xf0\xed\x21\x75\x73\xdd\xee\x40\xaa\x4c\xf1\x09\x96\x63\x97\x3b\x23\x6c\x0b\x4a\xa5\xa1\x26\xa0\x2f\xa0\x6d\x36\x20\xd3\x5b\xb2\xe5\xf8\xd8\x92\xe5\x1b\x2e\x79\x28\x66\xfb\x3d\x3a\x9f\x2d\x80\xb0\xba\x0a\xbd\x69\xd1\x45\x38\xcd\xdb\xa9\xed\xb2\x16\xf5\x32\xcb\x4b\x7f\xe5\xb7\xda\x91\x03\x7d\x75\xee\x59\xab\xfa\x58\x16\x60\x9c\x64\xb1\x81\x04\xb2\x4e\xae\xc2\x39\x9b\xa6\x63\x49\x42\x97\x23\x38\xf6\xc9\xdf\x59\x38\x1e\x2d\xe4\xce\x14\x3f\x07\xdb\xc9\x91\xbf\x98\x7f\xd9\xcd\xee\x86\x96\x92\xad\x67\x98\x86\x1e\x40\x58\xb8\xd4\x58\xa0\x9d\x8f\x32\x21\x1d\x08\x7e\x8a\x46\x5a\x80\x03\x6f\xf1\xea\xfe\x81\xf1\xfd\xab\xbc\xc3\xe4\xf6\x83\xad\x5f\x8a\x81\x78\xcf\x7b\xff\x3f\x2e\x74\xff\x70\xeb\xdb\x34\xeb\xd7\x89\x36\x3e\xc9\xf2\x59\x4e\x10\x52\xab\x12\x75\x47\xc7\xb9\x47\xb8\x2a\xb2\x72\x00\x71\x96\x6a\xd6\xa0\x68\x48\x74\xa8\x57\x2c\xda\xb4\xc0\xf3\xaa\x70\xac\xee\x7c\xb7\x52\x88\xde\x44\x8a\xa3\x16\x0f\x5e\xb4\xf0\x61\x8b\xcf\x25\x08\x08\x44\x50\xf7\x4f\x21\x11\x60\xc1\xbc\xd4\x9b\xa4\x3b\x19\x3f\xeb\x30\xa0\x3e\xaf\xc7\x6f\x3b\xf3\x09\xdb\x2a\x98\x93\xa3\x26\x16\x09\xc1\xe4\x41\x2f\xbe\xea\x7f\xf5\x00\x7f\x67\x5e\x50\x08\x53\xab\x16\xd7\xce\x77\x50\xdc\x7e\x1f\x89\x90\xee\x43\x48\x71\xf2\x42\x09\x4e\x8d\x35\xcd\x13\xc6\x25\x66\x8c\xef\x09\xaa\xb8\x95\x88\x91\xcc\x68\xbc\xc2\xa0\x8d\xf2\x8b\xe5\xcd\xf8\x84\x54\xc6\x46\x51\x6b\xf5\x44\xf8\xfb\xca\x75\x4e\x9b\x24\x00\x08\x13\xe8\xf5\x02\x60\x5d\x22\x59\xda\xf8\x1e\x00\xbb\x1a\x85\x21\x63\x46\x13\x67\x07\x83\x05\xa8\xfb\x22\x3d\xb9\x58\x1f\x2d\x68\x97\xdb\x54\xfa\xff\xd5\x9d\x77\xb6\x2c\xb6\x55\xd8\xa8\xc6\x33\x82\x34\xf0\x7c\xc7\x75\xfe\x0a\x8a\x0d\x8e\x7f\xb2\x65\xa0\xcc\x01\x23\x37\xc0\x5c\x88\x1c\xab\x22\x90\xdb\x34\xd4\x5c\x00\xe1\x32\xf0\x0c\x4e\x56\xe2\x56\xd6\xf9\x86\xa7\x8b\x09\xb6\xb5\x52\xef\xd1\xea\x0f\x50\x70\x5c\xd1\x57\x67\x82\xe9\x36\xc4\xf0\x77\x6d\xa5\x5f\x26\x2d\x0e\x72\x56\x52\x79\xf3\xb3\x4f\x68\xf0\xec\x1a\x18\x4a\x0b\x13\x54\x73\x9d\x0f\xae\x6e\x8a\x3a\xf2\x4a\xe6\x28\x4c\x0b\xda\x1f\x06\xa3\xb3\xf3\x2c\x1f\x96\x9c\x7e\xe9\xb0\x95\x7f\xcd\xef\xeb\x15\x91\xa5\xf6\xd9\xb4\x01\xa6\x5e\x80\x0c\x90\xf2\x54\xe1\xaa\x5d\xf3\x45\xb5\x89\x6a\xa2\x00\x5f\xfe\x68\x35\xd5\x2c\x25\x6d\x15\xfb\x10\x50\xfb\x9b\xfc\x54\xe1\x60\x50\x6e\xb3\xf2\xd3\x2b\x56\x82\x81\x6f\xe6\x14\x8d\xd9\x78\x4d\x2e\xd5\xa4\x44\x01\x36\x68\xf8\x54\xfb\xb1\xaf\xa7\xa1\x4c\x58\x3e\x3d\xcb\xdb\x9b\xb2\x18\x2b\x9c\x92\x3d\x7b\x77\xff\xd5\x2d\xfb\xd1\x0b\x70\x16\x5f\xbe\x43\xdf\x96\x65\x88\xb5\xc5\x6b\xdc\xe0\x83\xa0\x23\x5c\xa7\x79\xb1\x1d\x44\x63\x20\x26\xc5\x21\x18\x45\x82\xad\xbb\xf9\x3c\xe2\x5c\x86\x09\x89\x92\xe9\xce\xf3\xeb\x2e\x8d\x37\x2e\xce\x17\x31\x5b\x66\xd7\x1a\x32\x85\x5a\x1c\x0b\xc0\xc9\x17\x00\xfe\xd6\x18\x76\xb8\x3f\x9c\xc6\x00\x89\x18\x42\x6c\xfe\xe3\xb8\xcf\xae\x49\x75\xf5\x34\xec\xfb\x3a\x6c\xe2\x96\xd3\x81\x65\x38\x28\x38\xeb\x4f\xbb\x33\x8c\xfd\x3f\x52\x73\x41\xa2\xe9\x3f\xa2\x56\x6a\xa5\x3e\xb9\x0c\x50\x0c\x9d\xfb\x39\x71\xa1\x6c\x2a\x06\x13\x1c\x07\xb8\xe1\xcd\x2e\x11\x8a\x14\xc5\xc0\x10\x04\x7a\x7c\xe4\xf8\x0d\x91\xb0\xdc\xf4\x66\xfe\x7d\xb4\x9f\x49\xc1\xc4\xd0\xd0\xcf\x1b\xe9\x19\x52\xcd\xed\x9c\xc7\xb2\xd7\x66\x01\x66\x73\x60\x48\xd6\xc9\x26\x93\x87\x79\x67\xcc\x0c\x3e\x99\x84\x4c\x23\xfd\x91\xdb\x5f\x90\xe1\x99\x99\x10\x9c\xdd\xe6\xd6\x57\x9d\x75\x4c\x99\x18\x91\xf5\xff\xaf\x67\xcd\xa9\x2b\xee\x69\x27\x67\x65\x44\xe4\x55\xf8\x02\xff\xa3\x39\x35\x40\x5a\x3f\x87\x0b\x3e\x0c\x4c\x80\x50\x1b\x91\x5b\xfd\x39\x50\x6c\xbb\x15\x88\x92\x24\xcc\x1b\x7e\x7a\x60\xc5\x9f\x67\x86\x5e\x3d\x5a\xcd\xd1\x8a\xa7\x49\xbf\x66\xe3\x71\x15\x80\x24\x62\x39\xae\x74\xcc\x85\xaa\x1c\x6e\xc5\x2a\xaa\x57\x0f\x58\x51\x11\x1a\x15\xc8\x1c\xc3\x6c\x90\x89\x2e\xe6\x51\x7a\xba\x17\x05\x47\x7c\x32\xb9\x6a\xe6\xf4\x3c\xf7\x48\xf4\x11\x52\xf3\xdf\xb3\x6b\xed\x36\x5f\x7d\x62\x87\x73\x54\x86\x4d\x19\x6c\xbc\xae\x3d\xe7\x75\x58\x5c\x00\x38\x73\x00\x3c\x21\xd5\x44\xbc\x03\x89\xbb\xd1\xbc\x58\x16\xa2\x4f\x01\x91\xc2\xfc\x29\x62\xa5\x30\x24\xfe\xfa\x06\x3d\x40\x6b\x6c\x08\x22\x55\x8c\x80\x25\xd4\x3f\x3e\x2f\xcc\x13\x91\xf9\x96\x96\xee\xbf\x94\x43\xa0\xf4\xba\xb6\x63\x91\x15\xb4\x2c\x8b\x2f\xd7\x41\x03\x11\x60\xd5\x67\x8c\x91\xc9\x23\xa8\xec\x28\x68\xea\xd8\x1d\x88\x55\x96\xf8\xef\x3e\x6f\xf7\xf0\x13\xc2\x66\xfa\xf4\x19\xd5\xc3\x93\xee\x5d\x10\xdb\x9b\xc7\x6c\x48\x61\xf6\x11\xc8\x88\x8c\x61\x30\xac\x4b\x73\x80\x59\x5b\x42\x73\x50\x13\x8e\x51\x57\xf4\x10\x5d\xcf\x4f\xce\x41\xfa\x39\xdd\xf1\xba\x05\x5d\x36\xad\x5b\xe6\x23\x87\xc9\xda\xb1\x23\x42\x59\x7b\x86\xb8\xb7\x3d\xe3\x68\x20\x7a\x7f\x24\xfc\x13\x00\x2f\xa2\xe0\xab\x72\x1a\x02\x58\x5c\xbe\xda\x98\x1d\x88\xb2\x87\xd2\x3a\xc3\x4f\xdd\x97\xb6\xd9\x7e\x62\xf3\x63\x2b\x8e\xe4\xbe\x1c\x1f\xfd\xe5\x98\x7b\xd4\x4d\x89\x8a\xcc\x1f\xcc\x25\xcf\xe3\xe5\x47\x81\xc7\x65\xe9\x67\x60\xae\x56\x63\x69\x39\x01\xc9\xf0\xa6\x99\xf3\xbf\xbc\xe7\x2c\x27\x4b\xa6\xb1\x09\x53\x18\x19\x84\x87\xfd\x64\x42\x70\xa0\x7e\xae\xda\xfc\x83\xf6\x6e\x21\x1c\xcf\x0f\x06\x47\x18\x4f\xc1\x1b\xe2\x2e\x85\x64\xa6\x59\x04\x41\x0f\xb8\x87\x45\xac\x8c\x43\x0e\x57\x3f\x30\x40\x56\x77\x33\x01\x41\x0e\x60\x60\x81\xd3\x39\x89\x34\xd0\x79\xf9\x36\xab\xab\x48\x9c\x81\xbc\x21\x45\xb0\x85\xdd\x98\xd0\x1e\x7e\xce\x7f\x35\xae\xa7\x6e\x18\x2e\xe7\xdb\x5a\x27\x97\xdf\xdd\x06\x54\xd8\x6d\x93\x24\x70\x65\xde\x4f\xf4\x18\x01\x84\x31\xa4\x85\x47\x98\x62\xc1\x10\x7b\x10\x3a\x70\x7e\x83\x8e\xea\x38\x8e\x25\x9b\x7f\xf6\x56\x82\x08\xcf\x6e\x09\xae\xa8\x2d\x35\x7b\xc9\x4f\x7c\x46\x89\xbf\xef\x6f\xff\xc5\x3e\xe2\xed\xac\x25\x8f\xae\x86\x31\x68\xbf\x08\x69\x02\x30\x02\x80\x2d\xa0\x30\x91\x39\xb8\x7a\xdc\x27\x06\xe0\x78\x4f\x10\x84\xb9\xc2\x34\xc1\x96\x4f\x89\xf3\xc8\x1a\xbb\x6a\xda\xaa\x3d\xdc\x14\x6c\xbc\xdb\x50\x96\x57\x91\x87\xc5\xce\x98\x3b\x19\xfa\x83\xea\x6f\xfe\x7f\x1e\x47\xf0\xd9\x49\xea\xb0\xf4\x42\x79\x55\xdf\xc1\x06\xf2\x6b\x0b\x92\xb3\x69\xb8\xec\x3a\x77\x84\x42\x9c\x63\x29\x2e\x07\xc7\x74\x2e\xf5\x32\x13\x49\x36\xba\x9d\x6c\xa1\x6d\x00\xae\x7d\x94\xd4\xec\xad\x2f\x85\xcd\x4c\x04\xc4\xd0\xe5\x85\x8c\x13\x04\x95\x82\x58\x51\x0b\x42\xa5\x57\x85\x12\x0b\x36\x7e\x53\x37\x5d\xaf\x6f\x3f\x0d\x0e\x38\x1b\x7c\xd8\x89\x61\x8e\xe3\xcb\x04\x01\x87\xfc\xd2\xdc\xf0\x7d\x26\x9c\x83\x24\xd2\xbe\x4c\x1f\x83\x74\xcb\x20\xb3\x64\xb2\x95\xa3\x2e\x0f\x8b\xab\x07\x9c\x14\xea\xb3\x3d\xa8\x7c\x52\xaa\xaf\xab\x86\xe2\x97\x7b\x92\x7a\x4d\xae\x38\x71\x83\xa4\x22\xbc\x21\x7c\xfd\x7f\x31\x93\x62\xeb\xdb\xd8\x5b\xbe\x58\x86\x57\x21\x7a\xc1\x70\x8b\x87\x20\x05\x4c\x57\x3a\x57\x00\x49\x45\x3e\x1f\x0f\xf2\x52\x72\x51\x0e\x60\x9e\xe9\xb5\xc7\xbf\x31\x6f\xe9\x4d\x1a\xf5\x14\xe3\x99\x64\x11\xba\x95\xc2\x67\xc0\x86\x2d\xd2\x7e\x3c\xfe\x64\xd9\x81\x2e\xf4\xc9\xf6\x6d\x7a\x51\x14\x23\x3c\x3d\x81\x3d\x83\x82\xb8\xd8\x00\x27\x3d\xcc\x9d\x81\xc8\x9a\x14\xc4\xb6\x61\x78\x20\x9c\x29\xda\x05\x6a\x5b\xed\xd9\xe5\xd9\xd2\xca\x78\x26\x14\x7d\xdf\x22\xfd\xff\xd3\x13\x0b\xfc\x8e\x99\x4e\x0d\x4f\xe7\xd6\x66\xda\x89\x2c\x7e\x10\x68\xd4\xc9\xe8\x94\xeb\x0e\x7b\xfe\x00\xb5\x57\xaf\xe5\xdf\x1a\xc9\x9f\x8d\x93\x85\x14\xcb\x5c\x7b\xf5\x6f\x94\x70\x61\x99\x34\x62\x0e\x08\x18\x96\x62\x4a\xfc\x01\x92\xc0\x61\x06\xba\x66\xd2\xed\xb0\x78\x82\xed\x6a\xe9\xf8\xf5\xba\x6d\xce\x86\x65\x39\xca\xa8\xf9\x14\x1f\xc9\x81\xba\xc4\x3f\x7e\x7e\x64\x71\x4f\x25\x55\x6d\xa4\x7e\xe8\xd6\x48\x04\x34\xe5\xe5\xac\x49\x20\xb9\x0e\x59\x68\x21\xc0\x59\x2e\x56\x9c\xd9\x08\x76\x63\xd1\xce\xdd\xc5\x2f\x26\x6c\x9a\x5a\x66\xea\x70\xcd\xdf\x73\x7f\x66\xb7\x7e\x7c\xd4\x9e\x17\x49\xc1\xa6\xa5\xce\x79\x37\x94\xf7\xff\xd1\x78\xb2\xdb\xe7\x85\xbe\x7f\xb4\x47\x89\x1c\x81\x46\xbd\xcd\x66\x5c\x33\x6c\xad\x58\xaf\x9a\xbd\xf2\x11\x1d\x12\xc6\x01\x77\xea\x5f\xac\x3a\xab\xd6\x33\x28\xee\x50\x67\xec\xd5\x72\xf9\x01\x74\xf3\x4b\x0d\xca\x68\xad\x26\x97\xde\x54\x8d\xf4\x1a\xf5\xa3\x82\xbd\x78\xfe\x3f\xac\xfa\x3d\x4e\x59\x92\x9a\x90\x97\x26\x41\x3d\xbb\x06\xc6\x57\x54\xbf\x10\x53\xf1\xd6\x1b\xb9\xac\xe8\x65\x26\x54\x88\x47\xca\x59\x9d\x1b\x44\x2e\x25\x51\x29\x7b\xf1\xe6\xbf\x33\x53\xf1\xe1\xcb\x52\x7f\xa6\x11\x66\x0c\xc8\x89\x39\xcd\xae\xd9\xc6\xf1\xe0\x6e\xa6\xc0\xfd\xa8\xab\xf4\xdf\xb3\x2b\x18\xdf\xbb\x55\xb0\x0f\x59\xe3\xdf\x33\x62\x08\x71\x40\x19\x81\xf1\x08\x44\xeb\xdf\xbe\xc8\x68\x9b\xeb\xc1\x9b\x7c\xe9\x18\xbd\x93\x2d\xe4\xc7\x86\xd6\x77\xc3\x7c\xbc\x1f\xed\x70\xf9\x11\x70\x79\x7b\xc2\x90\x74\xd8\x30\x55\x68\xc9\x3e\xa4\xa9\x9b\xbd\x41\xb8\xbd\x57\x1e\x74\xca\x53\xf8\x97\x3b\x5f\xb5\x8c\xe9\x87\xee\xdb\x20\x27\x79\x6a\xd9\x8d\xa1\x45\x0b\x82\x37\x8c\xa7\xbe\x68\xef\x4c\xb1\x1d\xed\xe4\x97\xb8\x2f\xb8\x84\x75\x9e\xd5\xa2\x4e\xbe\x78\xbf\xab\x50\x1d\xbb\xff\xcf\xa7\x4b\x8c\xe4\x17\x02\x90\x34\xf2\x62\x32\xe2\xca\x20\x77\x6a\xb0\x0a\xa8\x92\x71\x21\x7c\x17\x92\xc5\xbc\x27\x2e\xa9\x53\x3a\xb5\x51\x0f\xa8\x88\x3d\xe8\x56\x60\x8e\x79\x44\xd7\x1a\xab\xf9\xe1\x79\x4f\xfe\x78\xeb\x52\x73\xf6\x31\xfd\x78\x37\x6f\x9c\xef\x82\xad\xf3\xac\x7c\x92\xf8\xb8\x51\x24\xa2\x3e\xf5\xee\xa4\xbe\x06\x36\x3b\xaf\x2d\xbf\x11\xcc\x7e\x48\x47\xc1\x9e\xef\x7f\xcf\x71\x19\xad\x46\x4a\x3e\x87\x5a\x18\x32\x51\x7f\x8c\xb8\x4b\x1c\x0b\xc5\x80\x15\xae\xf5\xc0\x28\x7b\xab\xde\xf7\x9a\xc2\xca\xf3\x5d\x54\x9f\xb2\xf8\x15\x12\xf8\x98\xf9\x7f\xf8\xae\x95\x35\x1c\x07\xa6\x6f\x6d\xab\x9d\xb0\x4c\xdd\x0d\xad\x30\x46\xe2\xa8\x2d\xb7\xac\x4d\xea\x63\x7b\x94\xcc\x5a\xd3\xe3\x07\xa9\x05\x68\xfb\xd3\x5e\x38\x2d\x12\x98\xdf\xe5\x97\x62\x87\xf9\xef\xaf\x7e\x59\xd5\x1b\x54\x9b\xe3\x3c\xf9\x70\xd2\xe8\x6f\x1e\x8b\x34\x10\x2b\xf3\xaf\xb4\xd7\xa6\x3b\x6e\xd3\x07\x71\xcc\x87\xda\x90\xf4\x4e\x99\xa7\x8b\x9b\xca\xdb\xdf\x64\x3a\x91\x7f\xff\xbf\x7c\x18\x71\x24\xc2\xb4\x01\xe5\x86\x90\xd7\xf2\xb2\xb9\xf2\xe7\xf3\xa1\xeb\xc9\x92\x7d\x7b\x5f\x18\x0a\x15\x32\xb4\xa7\x0c\xd7\x90\xb0\x3f\xad\xa7\xa7\x4c\x15\x20\xea\xff\xab\x01\xda\xce\x36\xf2\xbb\x6d\x3e\xae\x7a\xf4\xc5\x1a\x8b\x2f\x83\x9b\x91\x29\x0f\xe2\xd5\x62\xc2\x49\x3f\x53\xf7\x2c\xad\x96\x9c\xe4\xd9\x61\x5d\xf1\x53\x83\x9a\xf2\xa8\xe2\x9f\xf6\x48\x8f\xe5\x19\xe3\xf3\xbf\xcf\x19\x21\xd8\xad\xef\x14\x42\x7f\xed\x9a\x11\xed\xd9\xa3\xf7\xd0\x04\x9f\x7d\x35\x67\x47\xb9\xcb\xcf\x10\x7e\x0f\xfd\xe3\xef\xec\xa1\xb1\xad\xe6\x08\x6c\x41\xf3\xda\xb8\x9e\x73\xc5\xac\x97\xb1\x07\x55\x12\x8f\xff\x8b\x23\x27\x64\x2e\xc1\xcb\x90\x51\xe5\xd5\x45\x4a\x0c\xf1\x9c\xd9\xc6\x79\x50\xd2\xaf\xff\x12\x3f\x08\x33\x94\xfe\xf6\x8a\x5c\x61\xfa\x81\x75\x80\xd9\x62\xe6\xc7\xa6\x0f\x74\x48\x77\x04\x0d\x61\xdf\xc2\xf6\x5f\x1c\x7d\xd7\x40\xdf\x11\x0c\x27\xe7\xd7\x27\xe2\x6f\xe1\xf9\x9c\x36\x89\x42\xf2\xbe\x8c\x7f\xda\x0e\x73\xab\xf4\xa6\xfd\x82\xbf\xcb\x90\xa6\x3b\xc5\x33\x66\x4c\x65\xcd\x8b\xd8\x7c\xe3\xff\x87\xdb\x86\xa3\xd1\x38\x6e\xb1\x70\xed\x5c\xb5\xdc\x11\x75\xa1\xc8\x22\x54\x22\x5a\xbd\xb2\x10\x96\xf2\x51\xdc\x36\xea\x9e\x97\xe7\xcb\xec\x3a\x1c\xea\x15\x0d\x96\x50\xab\x9d\xe0\xed\xa0\xdf\x47\xb8\x68\x2a\xf6\x8d\xd5\xff\xf7\xf3\xd4\xda\xf3\x07\x4f\x7d\xe9\xff\xbc\xa3\xc7\xbd\x7f\xea\x4f\x0a\xd0\xb5\x1f\x3e\x8e\xbe\xe3\x98\xe3\xb2\x5f\xff\x79\x77\xbd\x36\xb2\xd3\xf3\x31\x61\x6c\x34\x99\x02\xce\xeb\x38\x62\x25\x7e\x15\x3b\x76\x4a\x11\x8f\xf5\x1e\xff\xd5\xbd\xc0\x18\x1b\xb9\x40\xc9\x53\x47\xb9\x6a\x52\xc9\x21\x4b\xdf\x3c\xb3\xc6\xa0\x11\x90\x70\x0a\x5e\x1a\xc4\xd2\xb5\x7e\xc8\x55\x16\xb1\x70\x5d\xf5\x40\xa7\x61\xca\x38\xd4\x0a\x3f\xbb\x38\x67\xdf\xdd\x7f\xcf\x87\x47\xda\x89\xa8\xf7\xb8\x7d\xb3\xfb\x4c\xe8\xc7\x75\x0e\xd6\x49\x69\xd1\xd5\x1c\xf8\xe4\x2f\xec\x21\xaf\x66\xc5\xf0\x1d\x75\x20\xe1\x79\x4c\xd8\x37\xb9\xb6\xde\xab\x50\x14\xbd\xe9\xf2\x65\xc9\xa6\x3e\x9d\x3f\x68\x30\x81\x37\x7f\xff\xde\xa6\xbf\x1e\x79\xa8\x7f\xfb\x27\xe7\x2f\x7a\x3b\x27\x53\x96\xe0\x39\x8c\x7e\xce\x6d\x87\x38\xd0\x56\x9a\xfb\xea\xf2\x64\x6b\x6b\xc0\xc4\x89\x10\xef\xf9\x61\xee\xbe\x6c\x6d\xaf\xe4\x60\xfb\x97\x3f\x56\x80\xf1\xbd\x27\x24\xbf\x5b\xee\xf0\xa4\x31\xff\xd5\x78\xdf\x3b\xf5\x80\xba\x38\x65\xca\xab\x95\x4e\x48\xb8\x86\x6c\x5e\x85\x52\x7d\xbe\x4f\x28\xe2\xc1\x72\x59\x25\xd6\xdc\xd3\x97\xee\x2d\xe5\x7b\x63\x16\x3c\x2d\x86\x66\x3e\xde\xfb\x5b\xfc\xb4\x48\xa4\x20\xfd\xb2\x53\xf8\x23\xfc\xf6\xbc\x37\xc4\xbf\x67\x05\xcc\xe5\x03\xc0\x36\x54\xaf\x1d\xfb\xd9\x64\xf1\xd2\xff\x22\x16\x21\x27\xfb\xe7\x7d\x87\xb9\xa8\xe7\x70\xa4\x0b\xec\x78\xde\x2d\x6e\xd0\x1f\x54\x38\xbf\x1e\x18\x3d\x69\xc9\xc1\xab\x2d\x06\xce\x70\x55\xce\x49\x19\x5a\x69\x7b\xca\xf3\x9f\x9e\xd4\x3b\xc7\x28\x3e\xa1\x68\x61\x16\x90\x55\xf5\x98\x57\xdd\xf5\x04\x6d\x73\x39\x38\xd1\xe1\x18\xcc\xe6\x17\x97\x3f\x4d\x9e\x06\xf3\xc9\xd5\xe4\xd5\xa3\x78\x34\xc0\x19\x5b\x7f\xf6\x22\xf0\xfa\xa7\xf7\x4f\xdb\xdd\xed\x75\x96\x61\xd1\xae\xc3\x1d\xc6\xb5\x1d\xb7\x27\x36\x4b\xd3\xf7\xcf\xc0\xed\x97\x5f\xf1\x73\x15\x2e\x25\x2f\x5d\x3f\x3f\xe8\x64\x7e\xda\xf8\xb4\x21\xbd\x59\x7d\x0d\x78\x67\x04\x75\xac\x70\x50\xf1\x20\x7d\xa2\xdf\xef\x35\x8f\x5f\x50\xb3\x6e\x75\xd5\x8a\x29\x2d\x23\x8c\x9c\x3f\xfa\x23\xca\xbe\xd8\xa6\xe7\x51\xf5\xce\xc6\x18\xd3\x11\x10\x5b\xa2\xaf\xf0\xf7\x1d\x32\xdd\x0c\x4a\xa2\xe8\xba\xf3\x26\x65\xed\xd5\x12\xcc\x1d\xb9\x01\x0d\xc9\xf0\x2d\xd8\x2d\xa2\xd0\x3e\x57\xa9\xed\x5d\xb6\x9e\x82\x3b\x65\xfa\x57\x7f\x8d\x81\xe6\x7c\x50\x59\x52\x82\xf2\x63\xbf\x98\x3d\x75\x55\xb4\xd4\x1d\x1f\xb2\x90\x85\xa0\xf9\x7c\xf6\x26\x54\xb4\x65\xbe\x27\x6a\x76\xa3\xee\x1f\x49\xe3\xff\xe2\xf8\x6e\x5c\xe7\xee\x91\x05\x09\x89\x54\xbf\x48\xf0\xfc\x16\x33\x84\xe0\x91\xdc\xc5\xdb\xae\x01\xeb\x32\x6f\x2f\xad\x92\x57\xe9\xfb\x2f\x7a\x32\xc3\xeb\x73\x35\x11\x1c\x62\xf6\x48\x29\xff\xdd\x3c\xf8\x87\x8a\xc2\xd1\xfb\xe2\x54\xf0\x60\xa2\x72\xde\xb4\x43\xe4\xc7\x97\x53\xff\xef\x8c\x86\xbf\xf5\xa2\xd5\x1d\x65\x06\x56\x1d\xcf\x1b\x4b\x6a\xeb\xe3\x46\xc0\xcf\x9e\x30\x1a\xab\xe9\xb5\x78\x08\xf7\x95\x99\x7b\xa5\x7d\xc8\x01\xca\x81\x5c\x25\x1e\xe5\xfd\x98\xb6\x81\x1a\x96\x68\x91\x74\x94\x44\x51\xa2\xcc\x1f\x4a\xb3\x69\xfa\x6d\xf8\x64\x7f\x7b\x72\xf2\xf9\xda\x78\xfc\xb7\xd2\x99\x54\x2a\x2b\x42\xb2\x24\xd3\x99\x23\x85\xab\x7b\x3b\x63\x50\xc5\x25\x87\x76\xf9\xec\x8d\x84\xf7\xa0\x9e\x09\xc6\x41\xfc\xdc\xd2\x2f\x30\x27\xfb\x3b\x8a\x35\x02\xcc\x6e\xc6\x99\x8e\x0c\xc2\x23\xb1\x1a\xce\x9c\xf0\xbd\x16\x43\x42\x5c\xd5\x0f\x39\x94\xf4\xe3\xff\xc4\x96\x7c\xe5\xe9\x8e\xc5\x0f\x3e\x2b\x3c\xcc\x26\x1e\x9e\xcd\x45\x6b\xfd\x3e\x35\xca\x8c\xfa\x1d\xf7\x6c\x28\x87\xfa\x20\x57\xdc\x57\xf3\x39\x90\x46\x61\xcc\x64\x78\xbe\x9f\x39\x6a\x35\xbe\xd0\x27\x52\x10\xe4\x47\x26\xe6\xcb\x77\x7c\x55\xf2\x01\x9f\xf7\xf9\xa5\x57\x66\x68\xc4\x63\x55\xcf\x5c\x7b\xdd\xff\xeb\x85\xa4\x0e\x08\x0c\x8d\x8f\xce\xe9\x5b\xd5\x57\x48\xbc\x4b\x1a\xaa\x2d\x1f\x72\x49\xd2\xfb\x78\x75\x25\xe9\x36\xf7\x6c\xa2\x19\x4f\x48\x5a\xae\x7c\x09\x3b\x67\x12\xaa\x30\x74\x7a\x97\xad\x31\x10\xfa\x6d\x2f\xcd\x25\x25\xf4\xb3\x0b\xc6\xd7\x5f\x4d\x09\x7f\x0f\x10\x47\x11\x5f\x8a\x5e\x87\xd7\x16\xd6\x21\xa7\x5c\x8e\x11\xc4\xfd\x99\x49\x29\x31\x9f\xac\x8a\xdf\x77\xd6\x1d\xee\xea\x0e\x73\x9f\x74\x71\xe6\xaa\x85\x62\xcc\x7f\x90\x31\xb7\xf8\xde\xca\xc2\x24\xe1\xb7\x44\x72\x47\xb6\x77\xe5\x5d\xbd\x2f\xf6\x55\x0b\x0b\x82\x06\xe2\x64\xfd\x94\xff\xf5\x48\xe0\x3b\xa5\xe2\x4c\xac\x7c\x34\x36\x55\x91\xa9\x3e\x73\xd9\x69\x32\x18\x3d\xfe\xe0\x98\x0b\x76\x25\xe6\xa7\xd1\xa2\xc6\xb6\xb4\xc4\x73\x66\x90\x5f\x50\xc0\xdc\xd3\x71\x90\x35\x6f\x2e\xb2\x61\x8c\x21\x4e\x9c\xcb\xf3\x70\x39\x8d\xa4\xff\x22\xd5\x11\xd2\xd3\x45\xbd\xf8\xbf\x62\xf7\xf2\xc9\x33\x4f\xeb\xfc\xef\xac\xe9\x4a\x8f\xbb\x66\x3d\xf1\x30\x66\x30\x3d\xec\x8e\x97\x07\xc5\x38\x7f\xbf\xce\x38\x84\xf9\x86\x21\x85\xd5\x9b\x95\xfe\x92\x73\x34\x93\xa2\x57\x53\x65\xc8\x8e\x26\xe2\x9e\x86\x8b\x50\x3e\x27\x8d\xcd\xe3\x05\x67\xe2\xbd\x1c\x39\x48\x5b\x95\xe3\xa5\x14\x4b\x49\xfa\x42\x90\xfc\xbe\x04\x8b\x3b\xd7\xdc\x08\xff\xce\xcd\xed\x56\x74\x42\xe6\x2a\xfa\x12\xaa\x31\x1a\xdc\x93\x7e\xbc\x4e\xb7\xee\x4c\xb4\x45\x20\xde\x88\xaf\xfa\xcf\x49\x0d\xf6\x19\x6c\x47\x99\x7f\x0f\xa4\xd9\xd6\xbe\xb4\x5a\xe1\x55\x20\xf9\xbb\xbf\xb0\xde\xd7\xda\x80\x61\x24\x49\x5a\xcc\x21\x7b\xc8\x2e\xd9\xdf\xc8\xb5\xdf\x1a\x04\xf1\x93\x57\xd9\x17\x02\x9c\xff\xbf\xb3\x2c\xb3\xbe\x6d\x52\x2b\xcc\x5f\xac\x9d\xbd\x4a\xb4\xd0\xf0\xb9\x16\xfc\xc2\x9f\xe8\x97\xe2\x18\xc8\xab\xf3\x56\x25\x38\xb9\x17\xe5\x58\xfd\x45\x1a\x4c\x1c\x46\x84\x2a\xd7\x19\xb3\x69\x82\xd7\x4b\x01\xcd\x48\xe5\x49\x47\xf4\x13\x93\x84\x2f\x37\xa5\xbb\xc5\x49\x12\x7e\xe7\x60\x6a\x70\x4e\x18\x9f\xef\xd7\xbf\xb1\xf4\xb9\x71\x4d\x84\x07\xf2\x1a\x2f\x10\x9c\x71\x70\xff\x9a\x65\x8a\x01\xd2\xbc\x6d\x9f\x78\x3c\x8b\x59\x94\xca\x6f\xe3\x3f\x04\x5e\xa3\xaf\xea\x6c\xbd\x24\xbf\x93\x0f\x31\x03\x64\xa4\xf9\x7a\xb9\x2c\xc2\xf3\x3c\xed\x37\x83\xfa\xc8\x27\x36\x0a\xb6\x2d\xf2\x6a\x37\xac\x6d\x5e\x38\x88\x3a\x71\x50\x4e\xd1\xac\x4a\x53\x2f\xc0\xf9\x3b\x27\x7f\xcd\x85\xca\x05\xe3\xef\x2b\xb3\x78\x18\x4d\xb1\x8f\x7a\x14\xf7\x25\x12\xa8\x72\xbc\xf6\x5a\x08\xd5\x71\x79\x25\x6e\x7b\x34\xb0\x44\xa9\xda\xf8\x7c\xcb\x52\x30\xc0\x89\x44\xb3\x6b\x8c\xa5\x92\x44\xe4\x1c\x61\x4b\xdf\xe7\x04\x04\x65\xa6\x69\x6a\x47\x0e\xbe\xe9\x67\xbf\x2c\xe8\xce\x85\x7b\x74\x3c\x07\xa4\xcf\x0c\x67\x4e\x2b\xb4\x7f\x8b\x7a\x8d\x9b\x23\xdb\x01\x1c\x57\xc2\x23\x16\xaa\x5c\xb8\x4d\x58\x8b\x68\x2b\x90\x22\xf9\x94\xbf\x5d\x55\x2e\xfd\xbf\xf7\x65\x36\xa0\x84\xce\xbf\x45\xe1\xa3\x0b\xca\xf4\x11\xb9\xa4\x98\x0d\x9a\xce\xe2\x73\x54\xce\xbb\x68\x05\x44\x5d\xf9\x88\xe2\xa2\x1c\x91\x81\xa2\xa1\x14\x6b\xfe\xed\x6e\xa0\xe2\x37\xfd\x25\x3c\xfe\x3c\x54\x0a\x51\xbf\x4a\x5e\xc9\x5c\xfd\xb0\x21\xda\xd9\x98\xce\x87\xb2\x46\x63\x14\xe2\x74\xc5\xa6\x5a\x16\xd6\xf0\x12\x9d\x5f\xd6\x49\x39\x82\xb0\xce\x40\xc1\xb8\x0e\x7b\x63\x1a\x99\x1b\xdd\x09\x7c\x48\x69\x8d\x9d\xab\x2e\x4b\xa2\x7d\xff\xad\x94\xaa\x93\x97\x82\x3a\xcd\x02\x91\xce\x77\x8d\x47\xa4\x7e\x52\xf7\xa5\x17\xed\xa6\x95\xa1\x9e\x79\x85\x37\xf4\xe3\xfe\xc5\xe3\x9d\x7d\xd3\x9b\x77\x6c\x0d\xc3\x5d\xbe\xb8\x5f\x9b\x06\x4f\x16\xe1\xba\x72\x88\xed\x5e\x25\x35\xad\x7a\x1d\x06\x40\x48\x50\xb8\x74\xeb\x92\x83\x85\x9a\xcb\x0d\xbf\xdc\x1c\xcb\xac\x5f\xb8\x29\xc1\xb3\x5e\x1a\x6d\x17\xe6\x02\x23\x26\xfa\xee\x4e\x15\xb4\xa3\x78\x91\x97\x2c\x38\xea\x0c\x3b\x7d\xf9\x63\xbe\x15\x1d\x89\x55\x44\x37\xaa\xd7\xfd\xf1\x57\x3f\x28\x77\x07\x5a\xaa\xd1\xde\x0d\x1b\xc3\xf0\x51\x72\x53\xb9\x8f\x82\xf9\x05\x54\xe1\xe0\xdb\x4a\x68\x4f\x84\x18\xc3\x20\x5c\x78\x68\xbc\x22\x28\x46\x8f\x20\x2f\xeb\xc6\x28\xde\x14\xe9\x1c\xc6\xb2\x74\xa2\x77\x58\x5f\x4a\xf8\x0d\xef\x00\x58\x25\x40\xdd\x47\xf9\x05\x43\x6e\xee\x65\x3a\x6b\x44\x9a\x72\xf7\x3a\x7d\xfc\x6e\xd9\x46\x30\x7f\x73\x3b\x5d\x66\xb8\x17\x5e\xb0\xdf\xf3\xf2\xb2\x9d\x4e\x0a\x0d\xa0\x96\x04\x12\xb1\x11\x92\x05\x20\x14\x17\xa0\x80\xda\x5b\x83\xf4\x0a\x13\xfd\xe9\xa0\xd4\xf4\x4d\x9d\x4f\xc5\x7e\x97\x4e\xc3\x7e\x6f\xd1\xf1\x9c\xb7\xdf\x3a\x4b\x79\x30\x0f\x41\x76\x50\x89\xc4\xd4\xe4\xba\x21\xd8\xfc\xc9\xa0\xb2\x9b\xc6\xf7\x13\x02\x9e\x31\xdc\x9e\xe8\xf0\x23\x31\xdb\x5f\x67\x1b\x23\x7c\x46\xf5\xd6\xd3\xe6\x7a\xf8\xa8\xbf\x7b\x2d\xa5\x8e\x1d\xa3\x51\xbf\x75\x41\xc3\x71\x40\xf8\x24\xb6\xa9\x23\xf9\x74\x9a\x81\x81\xd0\x12\x8e\xb0\x67\xa3\xdb\xfb\x84\x50\x2b\x40\xbc\xb1\xd2\xd1\xc6\x23\x70\x04\x27\x08\x40\xdf\xb9\xdf\x8c\x0d\x4a\x37\x8c\x05\x7d\xbf\x39\x9a\xcf\x22\x8f\xf2\x8d\xb4\xa8\x3f\x7e\x4a\x90\x7a\x05\xf0\xbd\x29\x3e\xb6\x1e\x81\xa9\x55\x35\x01\x67\x02\x8a\x7f\xdd\x6f\xef\xb8\x75\x18\x6e\x45\x09\x46\xa8\x74\x9b\xca\xfc\xc7\x96\xd4\xb7\x3d\xfb\xd3\x36\xca\xbd\x8c\xda\x25\x9f\xf5\x95\x76\x38\x38\x83\x8c\x15\x2f\xb7\x25\x5b\x70\xf3\x21\x13\xa0\x69\x22\x56\x49\xa7\x91\x5e\x37\x70\x4e\xdb\x2e\x2f\x9e\x0a\x7f\xe6\x14\x06\xd3\x37\x76\xe4\x29\x5a\xf8\x4a\x5d\x67\x60\xd2\x0f\x88\x1b\x00\xd1\xa6\x96\xa3\x05\xb8\xa9\xdf\x40\x25\x64\x51\x96\xbe\x16\xfb\xdd\xcc\x5d\xd3\x24\xa9\xad\x32\x0c\x69\x46\x3f\x51\xbb\x17\x7f\x1e\x16\xaf\x18\x3d\x35\x48\x24\x24\x0b\xa2\x94\xc8\xd6\xec\xbd\x00\xe4\x0d\x59\x37\xe3\x3b\x9e\x5f\x07\x7e\xf3\x70\xad\x45\xa0\x19\x87\x35\x15\x86\x7b\xfa\x11\xc1\x70\xed\x44\x8c\xd3\x8a\xab\xf0\x69\x1e\x4f\x98\xbd\x0a\x0e\x38\x80\xdd\xec\x53\xed\x4d\x83\x20\xa4\x69\x62\x88\x73\x74\x69\x45\x8f\x37\xe4\xde\x77\xef\x23\x4e\x8f\xdd\x13\x5c\x8c\x2d\xc3\xc1\xbd\xf3\x7f\xfc\xfb\x3d\x42\x0d\x48\x23\xd3\x78\x06\x73\xca\x6f\x02\x8e\xca\xeb\xe2\x4d\x80\xf6\x60\xc8\x27\xeb\x65\x5b\x63\xde\xe8\xc2\x41\x2c\xae\x00\xd8\xa0\x27\x21\xf6\xbd\x9d\xcb\x41\x89\x1f\x52\xe2\xa3\x2d\x2c\x36\xda\x69\x30\xc3\xf9\x7e\xf1\xb1\x5a\xb7\x75\x1d\xd4\x02\x30\x7d\x14\x30\xc3\x4a\xd4\xd9\x1e\x80\x33\x23\xd8\x89\xd4\xee\xb8\xd8\x97\x66\x94\x06\x47\x32\x6c\xfa\x5e\x7f\x5f\xe9\xf1\x57\x1a\xe5\xe2\x8a\x2b\x2e\x65\x11\x16\x08\x1c\x13\xc8\x14\xa6\xb7\x8c\xaf\x00\x05\x1b\x60\xb0\xab\xde\x93\xad\x7f\x77\xfd\x49\x30\x2d\x0d\x90\x18\x46\xe0\x40\xde\x6b\x9c\x69\x99\x85\xeb\x55\x05\xb9\x71\xaf\x70\x13\xd8\x45\xd4\x25\x40\x68\xd1\x09\x67\xb2\xcc\xb9\x73\x64\x8c\x09\x30\xcc\x76\xac\xca\x6b\x99\x6e\xd6\x5c\x88\x77\x48\x89\x79\x67\x4b\xe5\x28\x9f\xc3\x9f\xff\xa4\xff\xf3\x32\x52\x18\x1e\xea\x08\xc7\x9b\x1f\xf8\xf3\xe8\xb2\x91\xb3\x58\x0b\x47\xbf\x92\xf2\xe3\x73\x84\x4b\xf1\xcb\x90\xf2\xe8\x08\x4c\x70\x0b\xa6\xec\x01\xb3\xcf\x5b\x30\xdd\xad\x33\xd9\x0d\xa7\x41\x63\x53\x3a\x05\xa6\x0c\x92\x8d\x18\x84\xd7\x70\x7b\x17\x38\x42\x01\x70\x35\xf2\x03\xec\x03\x13\xc0\x55\xe2\x3f\x21\xf4\xbe\x15\xe9\x6d\x8b\x4a\x89\x98\xb0\x0e\x17\xa5\x78\xbd\x0c\x03\xb0\x21\x74\xbd\xa7\x12\xf1\x7f\xeb\x92\xbf\xeb\x28\x47\x9d\xa8\x37\xf1\xfc\x94\xb5\x34\x13\xcd\x7a\xb5\x7c\x24\x7f\x98\x62\x06\x50\x8c\xcf\x42\x28\xb6\xdd\x93\xb3\x27\x38\x83\x04\x00\x1f\x13\xc3\x76\x66\x8a\x6a\x1e\x67\xe4\x36\xfe\x35\xae\x61\xc5\x6a\x15\xb4\xe6\x21\x2a\x3b\x30\xba\x60\xeb\x9d\x80\x08\xf2\x00\xcb\xfd\x75\x89\x89\x65\x63\x00\xa7\x26\xa0\x50\x11\x3e\xfc\xc1\x10\xf5\xc1\x86\x8b\xc1\xe5\xfd\x9c\x65\xfb\xf6\x92\xb4\x3f\x4f\xd5\x9b\x4b\x6c\x13\xd6\x42\xac\x86\x32\x6e\xbf\xcc\x40\xf2\x1f\x04\x44\x55\x33\x78\x77\x8e\xb7\xcd\xe0\x98\x13\xb2\x28\xaa\xe0\x07\x7d\x5b\xb8\x11\x20\x08\xc3\xc1\x20\x12\xf9\x4e\x33\x54\x6b\xd4\x19\x6e\xa2\x3c\x71\x0c\xf2\xb9\x09\xde\x39\xfa\xf2\x2b\xc4\x83\xeb\x84\xea\xe1\x38\xce\x11\x3b\x35\xef\xa5\xc8\x88\x82\x58\x18\x82\xee\xe7\x49\xb6\x4f\x43\x58\x0a\x42\x97\x8c\x01\xdd\x19\x03\xdb\x28\x11\xb3\xbe\xaf\xff\xea\x8b\x4a\x2f\xcb\xbc\x2c\xb0\x88\x8e\x09\xc9\x8c\x22\xdf\xdc\xce\xfd\x32\x17\xd3\x33\xc0\x80\x0d\x99\x83\xc9\xe8\x16\xb1\x48\x29\x00\x87\x9f\xe0\x00\x09\xd3\xf3\xb4\x5b\x78\xa9\x6f\x05\x21\x0b\xf0\x63\xd7\x1a\x6f\x21\x69\xbb\x7a\xb6\xf7\x08\xcf\x65\xf8\x7b\x46\x0e\x38\x31\x03\xd1\xe4\xfb\xb9\x51\xa1\xc5\x46\xd0\x09\xc1\xf4\xf8\x09\x03\x80\x3d\xcb\xcb\x17\x86\xf1\xc1\xaa\x19\xfb\xaf\xa5\x0f\xc6\x17\x3c\x0f\x32\xf6\xf0\xaf\xd6\x5d\xbc\x5b\x81\x44\x60\x5e\x18\x66\x31\x71\x87\x12\xc7\x91\x83\x4e\x50\xc9\xc2\xa4\xc0\xb6\x24\x04\xb7\xff\x40\x18\xd9\x7d\xbe\x89\xc3\x08\x17\x0a\x30\x78\xfd\xad\x16\x30\x3d\x75\x0d\xb7\xe2\x1b\xd6\x2a\x7a\x00\x96\xc5\xc9\xd0\xc0\xca\xf0\x5c\xca\x38\xc6\x80\x8b\x28\xc9\x37\x7c\x25\x70\xb7\x26\x7a\x38\xd1\x77\x1e\x9c\x3d\x00\x1d\x8d\x22\x8d\x9b\x7d\xdf\x4c\x86\xe0\xc6\xee\xab\xa2\xf4\x5c\x7d\xca\x86\x31\x28\xef\x1e\x7f\x44\xc2\xbf\x6b\xc9\xbf\x5f\x62\x06\x53\xdb\xe3\xb7\x33\xd2\x6d\xdb\x26\x2b\xa2\xc4\xe1\xdb\x6d\x91\x09\xc0\x6b\xeb\xc1\xf6\xa0\x70\x2f\x52\x27\x51\xde\x36\x65\x1c\x11\x86\x22\x93\xeb\xe7\x49\x2f\x8f\xf8\x64\xe9\x10\xd3\x1a\x8d\xd6\x33\x93\xfb\x37\x7e\xd6\x16\x89\x28\xa6\xa6\x40\x90\xe9\x3b\x04\x14\xf9\x0b\x54\xf2\xfc\x7e\x28\xdf\xed\x07\x02\xc0\x1c\x04\x80\x2a\x8b\x9c\xd8\xa0\x81\x09\x74\x84\x84\x7d\x1a\xca\x12\x5b\x99\x68\x0a\x02\x1a\x0f\x3c\xa8\x1c\xfe\xf6\x0d\x85\xef\x6a\xf9\x6c\x69\x72\x20\x2d\x0c\x22\x4a\xd9\x97\xcc\x22\xb5\x51\x20\xd9\x00\x80\xc5\x95\xeb\x1e\xf4\x76\x2b\xba\xf0\xbd\xe1\x5c\x32\x27\x8d\x71\xe7\xca\xa1\x55\x7d\x6a\x79\xcd\x00\x64\x1f\x12\x3b\x27\x10\x0e\xd1\xe5\xae\x49\xf2\xb7\x7f\x1c\xfe\x55\xc4\x92\x13\x1c\x4a\x9c\x41\x10\xb4\xda\xa1\xc7\xc8\x32\x02\xc2\xcf\x18\xe6\x44\x9d\x99\x78\xd4\x8c\x71\xcd\xe3\xe3\x55\xf0\x7b\xb9\xab\xcd\x68\x4f\x04\xb1\x7a\x77\xe7\xb6\xfc\x69\x29\x51\x8e\xe6\x60\xa7\xb2\xc0\xc7\xc2\xb0\x48\x38\x5d\x56\x3f\x73\x2e\x08\xdf\xad\x9d\xe7\x79\x5d\xe1\x3c\xdc\x69\x9a\x3d\x36\x6b\x47\x07\xa5\xb5\xe1\x67\x6f\x39\x87\x50\x7d\x0a\x14\x40\xbd\x17\xfc\xcc\xe0\xcf\x0a\x36\x02\x38\xdd\x79\x1d\xf9\xc6\x7f\x5e\xe9\x53\xa2\x83\x98\xd9\xc0\x04\x73\x05\xd3\x6e\xe0\x50\x9f\x6b\x85\xcd\xab\x44\xd3\x08\x5c\xa3\x2f\xc9\x8b\xb1\x50\x35\x67\xea\xf9\xda\xa4\x98\xc6\xd9\x30\x97\x89\x4d\xdf\x5e\x34\xbf\xbf\xff\x6a\xcb\x43\x55\x78\x35\x93\x53\x16\x59\x1a\x67\x53\xf5\x4f\x8b\x29\x64\x7e\xaf\x80\x8a\x21\xfb\x9f\x00\x14\x74\x01\xd8\x92\x0d\xcc\x74\x23\xbd\xbb\xd9\x5b\x37\xd1\x38\x8b\x1c\xb0\x37\x5e\xc1\xf2\xe5\xd9\x23\x28\xea\x97\xe8\xc1\x45\xcb\x50\x7c\xfd\x9c\x90\x4e\xaa\xfb\xe1\x0a\x8c\x12\x13\xa8\x56\xcd\x51\x70\xb8\x51\x38\x78\xb6\x65\xe7\xdb\xcc\x41\x14\x86\x7f\x71\xdd\xa2\x31\xc0\xf9\x8d\x48\x20\xbe\x4c\x6e\x5c\x70\xf2\x9c\xe4\xca\x92\xd1\x6f\x32\x11\x73\x56\xdd\x31\xed\xef\xcc\x51\x55\x54\x6f\xc4\xa0\x36\xd4\xdf\x61\x36\xd5\x7d\xd0\x7f\xca\x86\xed\xc2\x6f\xad\x10\x05\xc2\x73\x26\xd1\x93\xa4\xb5\xac\x9b\x2e\xa4\x4f\x6e\xca\x89\x8d\xce\x18\x82\xd8\x4e\x06\xb0\x51\x58\xf0\x61\xf8\xbd\x6f\x8c\x43\x51\xee\xbb\x72\xe3\x69\x9b\x80\xb4\x57\x11\xce\x64\xc3\x52\x8d\x4f\x42\x77\x32\x80\x10\x7d\x01\xd8\x11\x80\xa3\x3d\x88\xd2\xb6\xe4\x75\x23\x38\x86\x00\x24\xea\x66\xeb\x5a\xb8\xbe\xfb\xfb\x91\xc2\xed\x1b\xad\x41\xcb\x52\xe1\xd4\x5e\x35\x50\x93\xf4\xfe\xe9\x45\x03\x07\xa8\x51\xbc\xff\x51\x24\xf5\x4e\x07\x28\xd1\x7d\x28\xfa\xb6\xef\xe4\x24\x84\x7d\xcc\x4c\x71\xb7\xa3\x96\xed\xa5\xce\x27\x13\x69\xa6\x48\x8d\xae\x6d\x77\x92\xc9\xbb\x1d\x4a\x68\xf5\x87\x16\x13\x07\x6a\x40\x37\x27\x40\x68\x88\xc7\x1d\x03\xa5\xcf\x64\xa4\x39\x0e\xd5\xc0\xc9\x31\x6c\xd3\x97\x1d\xc2\x34\x91\x7f\xff\xb0\x70\xed\x60\x55\xa7\x84\xdf\xc9\xca\x2a\x98\x47\xc7\x27\xc3\x7c\x6b\x29\x6c\x72\x43\xba\x8b\x40\xe4\x54\xb8\x80\x36\x98\xd8\x36\xb0\x6e\x92\x51\x3b\xc9\xa9\xbf\x0a\x6a\x77\x4c\xf3\x32\x0e\x12\x7b\x6d\x1e\x39\x0f\x12\x64\x34\x21\x7c\x32\x38\xf6\x5d\xfb\xab\x65\x50\xa1\x1e\x85\xb4\xe8\xea\xd5\x0f\x97\x9a\x27\xb7\xaf\x74\x5f\xb2\x0c\xdc\x29\x1d\x65\x77\xbb\xbf\x2a\xc9\xea\x19\x61\x57\xf1\xb2\xfc\x41\x88\x85\xbe\x1c\x4d\xef\x16\x52\xe2\xeb\x09\xb8\x2e\x05\x2c\xe4\x0e\x1c\x49\x8d\x58\x7c\x78\xb2\xb6\x88\x14\x87\xd4\xb5\x83\xee\xba\x13\xc1\x1c\x76\xac\x9e\x7d\x99\x09\xf9\x6e\x26\xf9\x61\x34\x6b\x58\xb7\x02\x88\x11\x34\x0d\xd8\x30\xbe\x52\x01\xb2\xd5\xe4\xee\x02\xd5\xc7\x96\x10\xbe\x04\xe4\x62\x1a\xcc\x35\x1d\x64\xde\x18\x38\xae\x3d\x21\xa8\x8d\x9d\xed\x74\xe6\x54\xdc\xfc\x49\x65\x66\xb4\x59\x42\x12\xbf\xe3\x4d\xcb\xc4\x19\xf6\xfc\x9f\x4f\xcb\x8b\x4c\x73\xf5\x3a\xf4\xe3\x0e\x95\xe7\x83\x44\x5d\xc9\x0f\xc7\xb1\x37\xa3\x1b\x29\x65\xa5\x8f\x0b\x20\x9d\x1b\x70\x58\xa4\x30\xab\xdf\xeb\xa9\x29\x90\x29\x5c\xfd\x92\x27\x64\x66\x5b\x3a\x6d\xd9\x30\x6e\x3d\x69\xeb\x92\xd4\xd7\xbf\x6f\x20\x93\x05\xd6\x2d\x18\x9c\xa3\xcf\xc1\xb9\x9e\xe7\x47\xc9\xfa\xee\x1d\x8a\x61\xd1\x37\xd8\xe0\x9a\x77\x86\xfe\x4d\xab\x69\xf5\x5e\xa7\x95\x31\x41\x37\x40\xa8\x47\xca\x72\xd3\x32\x7b\xf9\x32\x1f\xf5\x00\xc1\xb6\x9a\x01\x4e\x13\x54\xcd\x2b\xe1\x74\x0c\xd7\x21\x22\x41\x83\xfe\xe7\x1a\x51\xf3\xe7\xbd\xf2\xfb\xf5\x28\x40\x36\x71\x27\xd9\x54\x37\xb8\x73\x03\x1c\x14\x4e\x8e\x25\xb7\x94\x4f\xe0\x8c\x77\x52\x88\x61\x9a\x45\x12\x8f\x34\xeb\x69\x8e\x95\x5e\x36\x59\xe5\x49\xb1\xfb\x01\xb9\xed\x08\xff\x2b\xdb\xa9\x7b\xfe\xba\x0d\x48\x7a\xc2\x12\xda\x29\x27\x32\x42\xaf\xd8\x90\xbb\x10\xe8\xa9\x62\xf8\x2e\x28\x45\x1e\x7a\x5d\x13\x38\xad\x18\x20\x37\xa7\x7f\xdc\xae\xc3\x2f\x76\x77\x23\x1b\xe2\x70\x4b\x93\x14\x46\x04\xd3\xbe\xf6\x5e\xb7\x89\xcc\x95\x5a\xce\xde\xd9\x07\x7c\x35\xb3\x3c\xcb\xdd\x45\xe7\xc0\x13\xfd\x86\xf6\x5f\x5d\x2a\xcf\x3f\xae\x5d\xaa\x05\x0e\x20\xe1\xff\xf0\x18\xe6\xb7\x78\x1c\xa7\x8b\xb7\x9e\x6c\x77\x24\x3a\xad\x9c\xe9\xa9\x99\xe6\xa6\x69\xd4\x9a\x43\x6d\xf5\xf9\x85\x86\x08\x0a\x39\xbf\x4e\x0f\xc1\x1b\xbd\x78\x26\x93\xe4\x30\x67\xc7\x21\x42\x50\x14\xc5\x4d\xcd\xe2\x33\xf0\x9f\xbd\x6d\xae\xe1\xdc\x85\x3a\x21\x08\xd4\x42\x00\xb9\xd5\xa8\xc5\x0b\x82\xbe\xc7\x3b\x3f\xc7\x13\x6e\x59\xa9\x87\xee\x19\xcc\x4c\x27\xcc\x39\x0c\xcb\xb2\xae\x27\xf6\x16\x9d\xfb\xc6\xa5\x6a\xc9\x4a\x1c\x5c\x8f\xdb\x9e\xeb\x47\xf8\x3b\x9b\xb4\xae\x21\x1a\x0d\x20\x3c\x33\xc3\x97\x92\xcf\xed\x4f\xa3\x3f\x05\x84\x5b\x2d\xc7\x20\x8a\x55\x5b\xf7\x1f\xc6\x10\x1b\xfe\x21\x82\x2d\x66\x9f\x74\x1d\x5e\x35\x3c\xca\x71\x70\x1b\x91\xc8\x2d\x43\xd1\xdc\xe1\xdb\x07\xab\x8b\x37\x59\xf2\xd0\x4c\xd8\x29\x2c\xf2\x02\xb8\xde\x46\xcc\x5f\xfc\x16\xe5\x05\xc8\x0d\xa5\x0d\xa4\xc0\x3c\x2a\x62\xd7\xf4\x75\x01\x40\x96\x00\x7e\x17\x9d\xad\xec\x1f\x5a\x5c\x27\xcc\x8e\xac\xcb\xb6\x99\x8c\xb8\x74\x44\x12\x95\x79\xff\x62\x90\x4a\x11\x21\x11\x9c\x08\xf6\xa8\xb6\x3c\xe3\x30\xcc\xa6\xd2\x55\x0d\xa5\xa8\x40\x2a\xcb\x22\x56\x2d\xff\x1c\xc7\xee\x2b\x14\x48\xa2\x64\x62\x4a\xd6\x0c\xe7\xd8\xfe\x98\x7f\xb5\xe2\x2f\x5d\xf8\x72\x06\x5c\x36\x21\x04\x7f\x31\xd1\x48\xdf\x8a\xc0\xfa\x0a\xcc\x36\x73\x02\x0f\x3d\xee\xe1\x29\x91\x90\x9b\x31\xd9\x06\xb0\x89\xe1\x90\x7f\x72\xe5\x17\xed\xf1\xd0\xe5\xbf\x79\xbd\x25\x18\x47\xc5\x83\x17\x73\xf1\xea\x07\x9b\x65\x45\xbe\xd7\xda\x9e\x33\xb8\xbf\x8e\x45\x88\xad\xe8\x38\x34\x53\x7e\x1a\x81\xbf\x26\xef\x38\x01\xae\x63\x44\x9b\x1e\xe6\x17\xd9\xe8\x06\xd2\x1f\x0e\x61\xb2\x95\x80\x44\xe9\xab\xfd\xe3\xb5\xf6\x05\x5d\xe3\x3f\x68\x62\x85\x8c\x37\x65\x89\x78\x89\x97\x60\x82\x88\xf5\xfd\xae\xa9\xda\x16\x90\x3d\x4d\x6f\x32\xd5\x4c\xb0\x5a\xe5\xef\x47\xc1\x0c\xb9\x31\x25\x06\xf5\xc7\xb3\x4b\x90\xf7\x7d\xfb\xdb\x8f\xe2\x79\x83\xab\x33\xc2\x34\x03\x54\xfd\xfd\x98\xe0\x09\x57\x61\x0e\x39\xf1\x8a\xc4\xeb\xbc\x29\xf7\xab\x17\x46\xfe\xb1\xa9\x2f\x5f\xfd\xc2\x4d\x2e\x42\x11\xc4\xbf\x43\x5e\x63\xb4\xf3\xe5\xf0\x8d\xf7\x3e\x3a\xf7\xd3\x71\xfe\xee\x7b\x9e\xa7\xa3\xc8\xcf\x28\x59\xd0\xb3\x60\xe3\xe0\xff\x7b\xff\x58\xbc\xbd\x09\xec\xb4\xd1\xc5\xa6\xc2\x59\xc9\xbc\x93\x79\x79\x3a\xd4\x59\x34\xbe\x2e\x2d\xb2\xc7\x4c\x8a\xe8\x12\x36\xee\x79\x10\xbd\x80\x5f\xbf\x6d\x23\x90\xaa\x48\xe0\x0a\x06\x0a\x8a\x43\xe7\xdf\xe8\x55\x59\x6a\xc0\xe7\x10\x7f\x3f\x18\x83\x4d\x33\xb7\x8d\x32\xf8\x76\xe4\xb5\x9e\x97\xe2\x5d\x9e\xa0\x48\xcf\x15\x13\xfc\xce\xab\xdb\x02\x4a\xa5\x31\xd0\x2b\x6a\x89\x71\x64\x1b\xe9\x79\x3a\x12\xf9\xf9\x1a\x24\x00\x20\xa1\xfe\x21\xe2\x2b\x74\x0b\x96\x48\x39\x64\x9d\xfc\xb6\xcc\x5d\x4d\x0e\xf5\xff\x6d\x5e\xdd\x3f\x92\x00\xd7\x26\xe8\x17\x86\xa4\xb5\xfa\x5e\xe2\xbb\xb2\x15\x39\xe7\xe9\x3a\x47\xdd\xa8\x74\x79\x12\x74\xeb\x70\xdc\xce\x04\x67\xdb\x4b\x57\x5f\xf7\x1b\x41\x10\xb3\x51\x36\x0a\x71\xbe\xee\xb1\x8e\x37\xc0\x52\xca\xc5\xbf\xc8\x38\x9b\x9d\x2b\xbf\x66\x45\x9e\x89\xca\x97\xb3\xc3\xd1\xfd\x7f\x41\x01\x07\xfd\x2a\x8a\xda\x7f\x29\x08\x55\xf7\xea\x6a\xf8\xc6\x34\x02\xd0\x6c\x4b\x2c\x24\x50\xdf\xce\x0f\xc6\xf2\xb9\xcb\xec\xc0\xbe\xf0\x5b\xd5\x04\xf5\xcc\xda\xa9\x96\xef\xb7\xb5\xea\x36\xe9\x1c\x30\xb1\x5c\x75\xa8\xbd\x08\xdc\xc7\x91\x92\x79\x7c\xf6\xbf\xfe\x91\xa7\xb6\x04\xc9\xd0\x00\xdf\x0f\xc4\xbe\x7f\xee\x14\x43\x8e\xbe\xa0\x9f\x98\xf0\x74\x4e\x06\xe3\x8c\x7d\x6e\xf8\x31\x35\x17\xac\x38\x4b\xac\x3b\xe6\xe2\xf2\x2d\x87\x00\x0d\xf9\xfb\x5d\xd8\xb6\xb5\x17\x9f\xfd\xe7\xa6\x4a\x37\xe3\x2f\x86\x75\x01\x6a\x5d\x81\xee\x59\xae\xc7\x0d\xf1\xf1\xcb\xf9\xda\x01\x87\x0b\x46\xa5\x65\x52\x34\x33\x40\x58\xd0\xca\xd3\x48\xcf\x18\xf2\x1a\x55\x6e\x18\xc2\xfd\x86\xef\x16\x72\x09\x88\xf3\x24\xda\xba\xdf\x24\x9b\x6d\x9f\x5a\x23\x55\xc5\x5a\x89\xf2\x04\xfa\xef\xec\xf3\x99\x38\xba\x81\xf2\x0c\x03\xb2\xe3\xa1\xe5\x46\x30\xcd\x94\x97\xe5\x43\xa1\xb4\x63\xcf\x7d\x48\xb9\x30\xcd\xe7\x9c\x9d\x73\xd9\x71\x6e\x9a\xe7\xc7\x2f\x8c\xf8\x8c\x8b\x33\x19\x03\x71\x0a\x10\xd0\x87\x88\x5a\x96\x16\xf6\x76\xa9\x90\x34\x8b\x90\x57\xbe\x87\xfd\xc7\x5d\xab\xf1\xc1\x8c\x40\xe3\x04\x1a\xc5\xd8\xef\x67\x4b\x02\x88\x32\xba\x50\x7b\x2a\x83\x96\x9a\x59\xf6\xe7\x89\xda\x8f\x88\xdf\x11\xa2\x78\x7e\xdb\xa7\x44\x9c\x5f\x32\x78\xd3\x8e\xdd\x2a\x27\x15\x2f\xfe\x0f\xa0\x12\xef\x1c\x95\x9e\x6d\xab\x42\x8f\xe3\x77\xfa\xff\x7f\xfe\x6a\xe2\x38\xce\x60\x79\x82\x89\x12\xcc\x2f\x32\x45\x87\x30\xd5\x57\xec\xe8\x36\x0d\xdb\xb0\x40\x2b\xeb\xaf\xf7\x78\xb9\xd3\x99\x91\x06\xff\x56\x09\x86\xe2\x25\xf7\xab\xd9\x19\x93\x53\x1c\x94\x1a\x86\x65\xe1\xfb\x18\xf7\xe7\xe6\x79\x99\x9d\x47\xef\xf1\x3f\xbf\xd0\xcb\x80\x36\x84\xe2\xb8\xfa\xc8\xcf\x4e\x94\x9c\xa7\x5f\x71\x00\x90\xbf\x8c\xf2\xba\x74\xc8\xf3\x09\x72\x3d\x3b\x33\xa0\xc4\x20\xe6\xde\x08\x92\x95\x48\x74\x4c\x91\xdc\x49\xbc\x7c\xe8\xdf\x3f\x16\x34\x33\x1a\x73\xe7\x5b\x70\x32\x0d\x41\xd6\x27\x53\xab\xfb\xfb\xf6\x0b\xff\x38\xa0\xa0\xe1\x47\xfd\xa1\x79\x09\x7c\x70\xcd\xe9\x29\xf2\xa9\x99\xd1\xf9\x8a\xaa\x96\x7d\xc0\x5c\x80\x2d\x1e\xce\x70\xd8\x43\x7a\x10\x5b\x87\xe7\xa9\x29\xd5\xc3\x53\x72\x87\x9b\x7c\x87\x58\xc9\xa6\xe6\xde\xc9\xfb\xeb\xc7\xd1\x97\x77\xc3\x3f\x17\x2b\xf4\x87\xab\x99\x7f\x7e\x9e\x3b\x11\x24\xd3\x3f\xf6\xf3\x6e\x98\xcf\x31\xd8\xb0\x27\x7c\x81\xd1\x5e\xe9\xdd\x29\x30\x33\x81\x30\xcd\x0f\x7b\x94\x7f\x7f\xc4\x8f\xe5\xb6\x8f\x73\x19\x9b\x61\x9a\xe4\xba\x63\xef\xde\x7e\x2c\xa2\xf3\x2e\x97\xe4\xd6\x7d\x65\x56\x5a\x6d\x39\x20\xa6\x9e\x14\xdb\xda\x9f\xe6\x6d\xe8\xd7\x37\x83\x94\x1e\x92\x07\xef\xf5\x03\x34\xd6\x6e\x4c\x25\x44\xfa\x04\x93\x1e\x43\x76\x05\x08\x7f\xf4\x29\x68\x63\x5b\x30\xfb\xed\x44\xa2\xc1\xec\x90\xd8\xf7\x4f\x3c\x4d\xf3\x82\x96\x41\xa8\xf1\xaf\x0f\x31\x72\xc4\x97\x63\x91\xa7\xe6\x4a\x87\xff\x57\x6b\xef\x8a\x36\xb6\x38\x2e\x41\x10\x76\xfd\x7b\x67\x1c\x97\x40\xba\x4d\x6c\x5c\x16\x0e\x9b\xb5\xa1\xfc\xed\xe4\x10\xf6\x51\x0c\xfa\x13\x3b\xd2\xf2\x21\x5b\x06\xc3\x91\x01\x7e\xce\x8c\xe1\xfe\x7a\x0b\x0d\x0a\x30\x9c\x04\x85\xb0\xfa\xbd\x84\x63\x34\x2e\xde\x17\x66\x41\x87\xbf\xea\x98\x90\xd1\x6c\xfe\xce\x6a\x5f\xd3\xc6\x6e\x7e\x00\x81\x7f\x27\x8c\x07\x6f\x6e\xe0\x51\x5d\x54\x0a\xed\xf7\xd3\xf7\x48\xb8\x44\x24\xee\x44\xde\xce\x23\x1c\xac\x98\xea\x22\xd2\x24\x80\xf9\x40\xdc\x47\xf9\x54\xdc\xfd\x89\x01\xbf\xef\x37\x46\x20\xa6\x02\x17\x83\x33\x85\x58\x42\xad\x23\xbe\xb4\xc5\x58\x4b\x7f\x7b\xaa\x8f\x27\x2b\x3f\x4d\x02\x13\x5a\x04\xaa\xce\x62\x93\xd4\x88\x48\x36\xf2\x2d\x9a\x43\xfd\x44\xcc\x8d\xe1\x11\x84\x36\x77\xc4\x70\xc3\x4e\x84\x4b\x38\x02\xb9\x0e\x38\xd4\xaf\x5c\x77\xa8\x85\x94\x45\xc0\x2c\x9a\xbd\xfa\xd5\x4c\x7c\x91\xf2\x6d\x15\x69\x0e\x13\xd8\xf6\xd6\xff\xf5\x35\x3d\x2f\x6f\xac\x23\x45\x8a\x29\xef\xe2\x77\x58\x70\x74\x0a\x72\x4e\x25\x91\x5b\xa3\x5e\xbe\x1d\xec\x57\x67\x0a\xb4\xc2\x3b\x3a\xdf\xd9\xe2\x59\x10\xe6\xc6\xa7\x7c\xa9\x29\x6f\xbb\xa7\xc1\x17\x62\x10\x43\xec\x43\xbc\xdc\x4b\x10\x30\xc0\xcc\x8a\x2c\x13\xed\x48\x09\x6f\xc3\x5b\xfe\xc3\xa2\x47\x09\x69\xd5\x17\xe1\xb4\xa7\x29\x4a\x20\x95\x29\x8e\xce\x67\xc8\x59\x33\xab\x88\x6e\x97\x27\x69\xc1\xb2\x2a\xf5\x2a\xa5\x07\x7b\xd3\x12\x71\x87\x12\x00\x7e\x2c\xfa\x2a\xf3\x68\x5a\x17\x48\x95\x02\xb4\x1d\x89\x84\xe7\xe9\xf5\x5b\x7d\x0a\x84\x2b\x33\x98\x9f\x79\xc5\xe5\xa9\x46\x85\x32\x25\xe6\xde\xf7\xff\xbd\xcf\xcb\x80\x14\x6e\x37\x64\x0b\xa6\x8e\x8f\x26\x49\x66\xc0\xb0\x57\x8d\xed\x04\x73\x99\xf3\x12\x6f\x48\x43\x43\x11\xc3\x49\x26\x4a\x36\xcf\xc1\xae\x5c\x51\xd9\x7d\x0d\xdc\xdf\x18\x96\xf5\x2e\x6d\xbb\xa6\xd0\xcc\x5c\xd3\x17\xdb\x78\x9a\x90\xc5\x68\x1b\xf3\xce\x88\xf3\x77\xfb\xe7\xdf\x7f\xf7\xe3\x33\xfd\x5b\x7b\x01\xf5\x0d\xe4\x68\x05\x5c\x53\x98\xee\xa0\xbf\xb0\xb8\xee\x2e\x50\x29\xe1\x95\xa9\x36\x81\x62\xe5\x4d\x79\x41\x12\x00\x18\xf9\xfd\x43\x7a\xb7\x6a\x15\xd7\xab\xe0\x7a\x93\x6f\x27\x2b\xc1\x89\x8e\xcd\x1d\xd5\xb0\x5d\x16\x94\xc1\xa2\x10\x4a\x17\xf3\x0f\x99\xc3\xe4\x6f\x7b\x1e\xb6\x23\xa7\xe3\x05\xda\xcf\xfd\xea\x17\x47\xc7\xde\xff\xf3\xcc\x7b\xb8\x39\x7f\x22\x7d\x0e\x90\x93\x75\x9a\x01\x8e\x66\x30\x89\xd7\x3d\xa9\x92\x49\x2b\xa3\x32\x69\x9f\x0f\xe4\x4f\x90\x5f\x1d\x5d\x5e\xbc\xd4\x32\x36\x87\xb1\x25\x92\xec\x7c\xb5\x9d\x70\xbf\xb0\x13\xd9\x39\x32\x15\xcb\x2f\x6e\x96\x3c\x7c\x5e\xa2\x28\x06\x50\x84\x23\xf3\x39\x4a\xfe\x2f\x1f\xdd\x05\x1d\x66\x6f\x96\x23\x38\x04\x0a\x66\xa1\xe6\x01\x8a\x56\x9e\x5a\xac\xb9\x23\x11\x39\x15\x68\xfb\xe3\x99\xa2\x5c\x2f\xf1\xd3\xb2\xe2\x6e\x38\x09\x72\xb3\x39\x08\x8e\x23\x1c\x03\x35\x19\x7c\xd1\xfd\x32\xd6\x81\xda\xb6\xbe\xe3\x51\x57\x2d\xb7\x60\x1b\xc7\x83\xdd\x0c\x98\x22\x71\x86\x48\xc9\xf9\x7b\x3f\xb6\x4f\xfe\x77\xde\xb5\x73\x45\x82\x11\x45\x5e\x4b\x74\xe1\xc4\x70\x18\x02\x4f\x2a\x01\xe2\x48\x26\x16\x25\x3e\x3b\xcf\xc2\xd3\xfd\x37\xa7\x1a\xd2\xd9\x2a\xca\x7b\x3f\x21\xfb\x98\x12\xa6\xa7\xe4\x71\xf3\x6c\xa8\x03\xc9\xa5\xde\x49\x92\x65\x91\xf6\xc3\x06\xdf\x77\x87\x1c\x74\x40\x13\x06\xe0\x98\xf5\xfe\x7e\xdd\xa3\xb7\xd4\xfc\x79\xf6\x57\xe2\xb6\xf9\x60\x86\x39\x5b\xe9\xad\xa2\x87\x48\x14\x78\x3c\x01\xbe\x1f\x1a\x72\x32\xfc\xe5\xf3\x97\xe7\xed\xc6\x7c\xde\x3f\xa8\xb2\x9e\xbb\xfd\xf8\x1a\xd8\xc2\x3b\xc5\xc5\x0b\x16\x6e\xd1\x95\xf0\x68\xe0\xfa\x87\x1a\x81\xc1\xd1\x35\x0e\x2a\xc2\x2f\x11\xe4\xe8\x01\x0d\xc4\x7d\xf4\xb4\xbb\xf6\xf5\xff\x3c\x85\xc4\xcf\xb6\x01\x75\x1c\xca\xac\x50\x96\xc4\xba\xb8\x2a\x48\xd1\x0b\xa2\x54\xad\xd4\xcb\x5a\xa6\xf3\x0f\x0a\x58\xc6\x28\xe4\x48\x7d\x7d\x26\x24\x3e\x64\x9f\x4a\xb7\x09\x71\xe9\x5a\xf3\xd2\x84\xa3\x27\x69\xdb\x83\x05\xd4\x6c\x70\xb2\x21\x91\x62\x6a\x05\xb5\x87\xfb\xb9\xc6\x84\xad\xa2\xeb\xf2\xad\xa3\x51\x9e\x39\xe1\x8f\x18\x41\x30\xde\x4e\x85\x5f\xcf\xb9\x39\x8a\xf8\xef\x1e\xda\xf3\x8e\xc2\x09\x39\x46\x0b\x65\xb2\x3d\x98\x68\x0d\x2e\xda\x20\x5b\xc1\xab\x36\x29\x5c\xab\x84\xd6\xed\x1a\x02\xea\x34\x17\x4b\x96\x8e\x9c\x18\x6d\x41\xe8\x4d\x0d\xd6\x6e\x94\x6c\x3a\x52\x4c\xae\xdd\xa3\x14\xbc\xc9\x6f\x12\xcc\xd5\x59\xa4\x9b\xae\xd3\x07\xc2\xb4\x4f\xf8\x2c\x53\x52\x36\x91\x28\x49\x44\x8b\xa6\xbd\x32\xfa\x37\x83\xfc\xe3\xe4\x96\x71\xd7\xfe\xd3\x74\xef\x6b\x0b\x80\x3f\xc1\x41\xbf\xe0\x7a\x67\xdd\xf8\xa3\x63\x2b\xe0\x6e\x12\x71\x35\x95\xb8\x53\x17\x0e\xa2\x06\x25\x06\x40\x96\xba\x7e\x1d\x46\x7d\x0f\x40\x2b\x36\xe0\xc7\xd3\x1c\x73\x56\xa3\xf7\xde\x86\x3d\x1f\xa7\x31\xa7\xb9\x45\x33\xa2\xb0\x4f\x67\xda\xec\x4f\xa9\x44\x2a\x6c\xee\xeb\x60\xe1\xa1\x0e\xd2\x09\x94\xfc\xae\x91\xa3\x46\x61\x48\xd4\xc5\x92\x15\x69\x6a\xa2\x22\xf5\x51\xde\x1b\x50\xbc\x09\xbb\xfd\x5b\x17\xf7\x92\x9f\x6d\xbc\x4d\x07\x54\x76\xdc\x27\xef\x47\x5a\xb9\xe9\xaf\x81\x83\x7c\xfd\xfd\x8f\xbf\x40\x8c\xb7\x5f\xcf\xf2\x05\xf1\xd1\xd4\x01\xe7\x64\x04\x23\x9d\x64\xe3\xe6\x8f\x5f\x76\xaf\x36\x89\x6c\xe2\x42\xa3\xc3\x66\x63\x51\x3a\xdc\x5a\x2d\x38\x0e\x8d\x9c\xa2\x4e\x37\xc2\x1f\x49\x18\x8e\x8f\x71\x34\xc6\xe9\x59\xe0\xb5\x50\x3b\xf4\x8a\x2f\x08\xef\x9f\x58\x00\xf5\xf7\x3a\x17\x82\xa9\xa6\x6a\x58\x02\x55\x9d\x88\x06\x6b\x97\x35\xaa\xc8\xdb\x03\x6c\xff\xab\xf1\xbd\x77\x97\x0f\x2f\xc3\xf4\xc4\xb5\xf5\xf0\xb3\x15\xe3\x1b\xab\x8f\x82\x4d\x25\x93\xab\x7d\x6c\x1e\x50\x41\x73\x60\xda\x3a\xcd\x9e\x98\x68\x5c\x95\xea\x8a\xf8\xba\xcb\x41\x20\xd1\x59\xb0\x6e\x6b\xda\xc3\x48\x79\x27\xc7\xdb\x3d\x72\x90\xe8\x56\xd7\xc1\x04\xb5\xff\xe5\x2d\xb7\x08\xeb\x42\x18\xb4\x30\x3b\x39\x0c\x02\x8e\x5d\xda\x3e\x64\x04\xf2\x99\xe6\xbf\x78\x0d\x94\x15\x01\xb1\x6d\xb2\x69\x78\x63\xfe\xeb\xbb\x85\x38\x89\xdf\xc0\xba\xf9\x5c\x13\x29\x36\xf9\x63\x6a\xd2\xb4\x8a\xec\x5a\x07\x17\x16\x8b\x5e\xf3\x0b\xb2\x9c\x48\x02\xee\x44\xc9\x79\x13\xf2\xc1\xea\xef\x39\xfe\x8d\x97\xfe\x4d\xe4\x66\x9e\xae\xde\xe1\x4d\x60\xa3\xb2\xb5\x0b\x7f\xee\xc0\xad\xf2\x8e\xe8\x08\x40\x70\x62\xf2\x2a\xa4\x37\x35\x5c\xba\x0e\xfb\x51\x16\xe1\x0a\x67\x7f\x1e\xb9\x6a\x90\xe7\x3a\x8d\x94\x59\x98\xfb\x7a\xd5\x45\xd5\xb7\xfb\xf9\xc7\x41\xc5\xd0\xae\xdd\xf8\xca\x1c\xe6\xce\x26\x62\x55\xcf\x1a\x8c\x4b\x0c\xa1\xe1\xe7\xb5\x83\x60\x01\x45\x10\xef\x68\x02\xb9\xa6\xd9\x23\xdf\x42\xe4\xf9\xb9\x92\xc7\x14\x2c\x2f\x7d\x03\x4e\x48\x1e\xf1\x82\xeb\xb1\x73\x10\xf4\x0e\x4e\x42\x90\x52\x43\xa1\x32\x02\xc6\x29\x8a\xd7\x6c\xc1\x3f\xa2\x63\x4a\xf8\x98\x49\x8a\x0d\x77\x6c\x6e\x75\x46\xcf\xde\x2d\x4c\xa6\x18\xb9\xed\xc1\xf9\xdc\x71\x2b\x8a\x5a\xe5\xa6\xb1\x7f\x1e\x88\x50\xe6\xd0\x50\xe7\x22\x7c\x7e\xa4\x9d\x4c\xce\x48\x33\x25\x7e\x7b\xdd\x55\x1b\xfb\xf8\x32\x44\x72\x17\x67\xa1\x6a\x26\x36\x35\x14\x05\xa1\x3e\xeb\xee\x84\xe1\x3d\x55\x0d\x92\xbf\x33\x01\x41\xd1\x90\x93\x2a\xa5\xf0\xa6\x0e\xa7\x4d\x79\xf2\xab\x1a\x75\x9c\x45\x5c\xb7\xb5\x98\x14\xe5\xa0\xfb\x07\x00\x6c\xef\x9c\x11\xc2\x2e\x7d\x5f\xa2\x0b\x57\xa1\x5c\xc5\x06\x36\xb1\x24\xf8\x98\x01\xea\x2e\x69\x52\xff\xfa\x4f\x17\x99\xa3\xf0\xa6\xe1\x13\x33\xfb\x5a\x74\x8f\x1a\x61\x38\xff\x22\x9e\x2d\x7d\xed\xbb\xc9\x84\x43\xfb\x56\xae\x56\x8f\xe4\xcc\x99\x70\xcd\xd7\xf6\x8c\xd6\x1a\xf5\x2a\x2b\x6a\x26\xf0\x45\xd6\x7c\x02\x92\xd6\x8d\x14\x7a\xee\x1c\xa4\x12\xe3\x9e\xf4\x92\xe8\x62\x52\xb9\x21\x7e\xd7\x61\xf1\xfc\xd5\x09\x65\xa5\xaa\xb8\xef\x99\x75\xfd\x87\x67\x7e\xe7\x5f\xc7\x5f\x31\x03\xb8\xb4\x35\x61\x42\x52\xb6\x1b\xdf\x4f\x1f\xe6\xcf\xbf\x57\xfb\x8d\xd2\x0f\x80\xf3\x03\xc9\xef\x3d\x2b\x85\xeb\x6e\x26\x46\x4a\x18\xdd\xcb\x01\x07\xa0\xd2\xd8\x9f\x60\x8b\xf0\x95\x46\x73\x43\xba\xe2\xb8\x59\x04\x02\x55\x13\xcf\xd9\xd8\x31\x5d\x0a\x0d\x2b\xb0\xa8\x33\x8d\x09\x47\x68\x3d\x42\xbd\xa9\x12\xc4\x18\xdd\x54\xde\xc9\xe6\x58\x1c\x66\xea\xb6\x83\x15\xfd\x34\xec\x3a\x40\x6c\x46\xa8\x10\x4d\xe9\xde\x12\x4a\x53\xbb\xae\xc3\x64\xa8\x2a\x44\xf6\x74\xff\x91\xea\x7f\x5e\x82\xc3\x90\x99\x43\x70\x42\x35\xa3\x52\x1c\x82\xc8\xbb\x1b\x0d\xca\xca\xe1\x6b\x4c\xd3\x08\xb2\xc8\x2a\x36\x08\x7c\x1f\x48\x28\xad\x3e\x03\x1d\x67\x73\x98\x3e\xfd\x88\x3f\x8a\xad\x50\x61\xd4\x7e\xf7\xe7\x1e\xfc\xe6\x8c\x80\xac\x25\x24\x1e\xe7\xca\x9e\x9d\x9b\x61\x38\x42\x4e\xa3\x58\x7e\x3c\x9d\x73\xaa\x9f\x9f\x03\x5c\x57\xb3\x15\x4f\x50\xb6\x73\xc9\x97\x76\xe4\xe6\x1e\xf4\x45\x06\x73\x14\x43\x89\x72\x77\x3f\x3f\xdb\x7f\x7c\xa9\x5d\x88\x84\xae\x37\x82\x85\x2f\xd2\xc1\x81\x6d\x2a\xe1\xbb\xca\xda\xf9\x30\x77\xc2\x5c\xf4\xcb\xd8\x8c\x27\x36\x25\xcf\x39\x4a\x1d\x57\xe9\x5c\x10\x20\x7b\x41\x50\x6f\x19\x71\x00\xc8\x52\x26\x16\xc5\x10\x32\x1a\xb4\xa6\xb3\x35\x4d\x8c\xe8\x05\xd1\x13\x55\x27\xbf\x00\x5b\x03\x75\xa5\xe1\xef\x4f\x98\xda\x56\xbf\x81\x3a\x16\x5b\xbf\x4f\xd9\xb2\x11\xba\xea\xad\x84\x6c\xbd\xe4\xd4\x4d\x5a\xae\xb8\x3c\xce\xe6\xd6\x4e\x06\x16\xc4\x9e\x5e\xbb\x4b\x64\xbc\x1e\xc4\x5f\xad\x92\x5c\x9b\x47\x46\x23\x7d\xb2\xe1\xa7\x89\x52\x1d\x4b\xe0\xdc\x16\x89\xaf\x4e\x2c\xad\xb5\x44\x8d\x8a\xe6\x28\x19\x4a\x47\xec\xea\xd7\xd8\xd4\xb8\x9b\x6c\xba\xb0\x60\x3c\x46\x1b\x9e\x0c\xd8\x55\x1a\x73\xde\xa5\x7c\xf5\x61\x02\x1d\xfd\xde\x11\x24\x2d\x67\xb2\x34\xc7\xd5\x54\x87\x7a\x23\x81\xca\x33\x5f\x11\xcf\x23\x22\x2c\x73\x47\xdb\x13\x92\x1e\x18\x4e\x43\xc9\x30\x6e\x41\x32\x13\xd1\xa2\x0c\xa1\x1b\xfb\x4f\x4f\xf8\x9a\x52\xc0\x07\x77\xd7\x4b\x88\xa1\xfc\xa0\xab\x40\x72\xf2\x4d\xa3\xfe\xce\x69\x34\xb9\xfd\x19\xe6\xc9\x0e\x33\x31\x70\x22\x52\x29\x02\x11\x38\x14\x31\x3e\x7e\x31\xff\xfd\x60\x5e\xbb\xfa\xd8\xe5\x5f\x12\x10\x5c\xf4\x26\x30\xee\x48\x39\x55\xb9\x3b\xf1\x12\x6c\xe6\xb5\xcf\x52\x6a\x7a\xd9\xa4\xc5\x90\xa1\x0e\xe0\x5e\x51\x2f\x88\x8b\xc8\x4a\xdf\x5c\x8a\x09\x80\x26\xf1\xe4\x04\x69\xec\x09\x90\x41\xf4\x12\x45\x5d\xf7\x2a\xab\x30\xf9\x29\x1e\xf7\x5b\x57\x1a\x86\x2e\x91\x41\x5d\xc0\x84\xb9\x29\xdd\xbd\xe3\x35\x4e\x26\x1d\x2c\x8e\xe7\xb5\x14\x71\x1d\xa3\xe8\x39\xf7\xc0\x6f\xf9\x7f\xb8\x16\x57\x34\x18\xd5\x0e\x43\xa2\x6e\x18\x10\x84\x61\x4d\xde\xb4\x20\x30\x22\xaa\x91\x9f\x34\x32\x0d\x2a\x36\xa2\xd3\x91\xdd\x7e\x1d\x8b\xe6\x26\x41\x55\x18\xc2\x64\x25\xc9\xa6\xa7\x1f\x9f\x43\x59\x9f\xa7\xbd\x11\x41\x86\xed\xbe\x51\x8d\xf4\x22\x83\x84\xa1\x06\xd5\x78\x9f\xb4\xd7\x95\x23\x44\x54\xcf\x86\xcf\x98\xac\xa4\x7c\x07\x1f\xf1\x3d\x0a\x90\x05\x44\x2b\xb1\x11\x7d\xd5\x5a\xea\x59\x62\x59\x00\xb5\x5f\x5e\x50\x94\x26\x8e\xd7\xe5\x96\xaa\xc1\x75\xd2\x5b\x32\xfe\xee\x17\xe2\x1f\xce\xed\xc4\x25\xbe\xa4\x68\x88\x83\x67\x2e\x95\x64\x21\x9c\xe9\x70\x20\xe3\x38\x0d\x07\xe4\x1e\xd8\x08\x47\x74\x49\x02\x65\xee\x4e\x7c\xb5\x3e\xb9\xe8\xb4\xbf\xaf\x58\x5c\x9c\xeb\x49\xa8\x2d\x08\x83\x10\xe3\xfc\x94\x00\x9a\x32\xc8\xa1\x9b\x91\x31\xe5\x24\x0e\xc8\x72\xb4\x91\x37\x51\x98\xe2\xf1\x0b\x05\xc2\x82\x63\xe9\xd7\x13\x2c\xd7\x8b\x36\x2e\x6a\xe6\xbe\x69\x6c\x5d\xe2\x76\x96\x4c\x0d\xe7\xab\xf9\xc2\x76\x77\x3b\x7b\x11\x1d\xb9\x69\x1e\x1f\x76\x3a\xc1\x94\x79\x23\x11\xf0\x99\xfe\x96\xce\xf3\xe7\xbd\x0f\x29\xd5\xff\xbc\x83\x1e\xbf\x6e\xa0\x43\x3c\x21\x48\x2c\x67\xa5\x22\x7a\x40\x9c\xfe\xc6\x52\xf9\x73\x40\x92\x15\xe5\xac\x70\xe1\xd6\x9f\xde\x31\xf8\xd7\x2d\xac\xdd\x83\x1d\x24\x0b\x4d\x4d\xee\xfe\x63\x51\x5d\x3b\x35\x47\x18\x88\xde\x1c\xaa\x29\xaa\x17\x1a\xe4\x2f\x24\x09\x9b\xb2\x6f\x69\x6a\x59\x1f\x6c\xb0\x0c\x85\xd3\x05\x89\xd2\x84\x59\xa0\xb4\xf1\xe2\x4f\x1b\xcf\x80\x3c\x8c\x73\x7b\xf4\x8c\x7e\x42\xf1\xeb\x8e\x0c\x92\xcc\x8d\x23\x8a\x4b\x20\x9c\xbe\x42\x5c\xfb\x2b\x5d\xcd\x66\xcc\x27\x06\xfb\xaa\x43\x4e\x98\x54\xe5\xdd\x60\xcc\x5b\xe8\xfd\xd5\xb7\x68\xaf\x6c\xd6\xb7\x8d\x7d\x1c\x2c\x04\x74\x81\x00\xe9\x14\x91\xe2\x09\xe8\xcc\xe8\x68\xd3\xbb\xea\x8a\x62\xfc\x1f\x17\x96\x2f\xdd\x12\x1e\xb9\x79\x54\xb9\x53\xad\x26\xc3\xcc\xc2\xf0\x18\xcd\xe8\xd5\x4e\xb2\x17\x9f\x89\x54\x52\xb2\xed\x29\x6b\x00\x5e\xdc\xe7\xdf\xc3\xab\x46\xe0\xe8\x16\x16\x23\x70\x0e\xdb\x31\xa1\xad\x18\x1f\xa1\x62\xf0\xd0\xec\x41\x25\xd8\x72\xa6\xb2\x24\x2b\xc6\x49\xee\x69\x7e\x86\x2c\x5c\xc2\x35\x28\xf0\xde\x99\x98\xf8\x5d\x3c\xdc\xd2\x6e\xe1\x1c\xeb\x64\xf0\x60\x69\x2c\xc3\xd5\x75\x25\x63\x03\x4e\x7d\x69\x7d\xfe\xea\x3e\xb5\x5b\x4a\x2c\x03\x20\xb5\xca\x0a\x81\xc9\x92\xdd\x07\xc5\x97\x22\x88\xc9\xc1\xa5\xc9\x33\xee\x86\xc9\xbf\x1c\x4f\xfe\xd9\x78\x6f\x42\x6b\xde\xe4\xe7\x6b\x91\x0a\x93\x78\xd0\x1b\x00\x2e\x7c\xc7\xde\x19\x08\x23\xe2\x5f\x6d\xd6\xc4\x4b\x5c\xd6\x24\xae\x78\x89\x75\x5f\x3c\x03\x8a\x49\xfc\x03\x31\xcb\xd1\x95\x23\x41\x6a\xdd\xc5\x13\x03\x91\x94\xa4\xb8\x13\x17\x8c\xde\x9e\xed\xf3\xed\xd9\x09\xc4\xb1\x98\x5e\x67\x6f\x48\x3f\x60\x1e\x99\xe9\x72\x4e\xba\xee\xd1\x65\x56\xb0\x99\x84\x74\x0c\x6a\xbf\xde\xb8\x7e\xe1\x86\xd8\xf7\x1a\xc2\xa1\x36\x28\x02\x2b\x2b\xcb\x10\x02\xea\x02\xdf\x53\x1f\xeb\xed\xcf\xf3\x46\xbc\x29\x2c\xd2\xcd\xe9\x97\x72\x95\x25\x48\xb0\x7d\x35\x21\x92\x91\x2c\x18\x58\xe2\x7a\x87\xca\xd5\x79\x77\xf5\x75\xdd\xf1\xb0\x65\x5a\xac\xc9\x89\x6d\xa5\xb8\xee\x52\x72\x3e\xa8\x79\xf9\x75\xf1\xe0\x7d\x29\x6b\xa3\x96\x2d\x36\x2e\x0c\x3a\x16\xf6\x79\xda\x8d\xaf\xcd\x02\x83\xc0\x56\xe2\x1b\x1f\x08\xa1\x33\x9f\xf9\xf8\xa1\x3a\xe7\xe2\x7a\x7d\x81\x12\xfc\x45\x2e\x14\x6e\x3f\x71\xc4\xc4\x9e\x4f\x53\xfe\xc3\x5e\x5d\xd4\xfa\x65\xb1\xc3\x97\xe4\x3a\xb1\xe0\xf9\xed\xe2\x39\xf8\xe6\x35\x93\x53\xab\xd3\xf5\x55\xdf\xa7\xcc\xb0\xac\x6b\x4b\xe2\x83\x56\xdd\xc8\x3f\xbf\xe6\x47\xd5\x11\x5c\xdf\x26\x19\x20\x11\x38\xbc\xa4\x7e\x47\x41\xca\x43\xd1\xc4\x61\xf0\x8d\x2f\xae\xfa\x71\x1f\x1f\xad\xe4\x7f\xc8\x04\xff\x70\x10\xfb\x9e\xa3\xbd\xa8\xb7\xc0\x79\xbc\xed\x99\x15\x3e\x29\x1f\x92\xda\x39\x9f\xc6\x3f\x45\x2a\x0d\x65\xd6\xcf\x5d\x77\x7c\xef\x8c\xa2\xc0\x5e\x6e\x69\x67\x56\xdc\x88\xb1\x76\x74\x9e\xf5\x2b\x67\x09\x7d\x41\x52\x2c\x76\x8f\x82\xdd\xd4\xb9\xdd\xaf\x6f\xc9\x3c\xcb\x7d\xdd\x1f\xdf\x49\x01\x28\x42\x5c\x4d\x31\xf4\x34\x7e\x46\xb6\x6c\xdc\xb2\xd1\xcb\x2a\xed\x23\x3c\xfb\xc7\x8d\xed\xba\x92\x54\xbe\x7c\x28\x11\xb3\x2b\x4c\x04\xfe\xed\x38\x8e\xdf\xeb\xae\x62\x9f\x7d\x61\xa8\xff\x96\xba\xff\xee\x59\xb2\x08\xd2\x78\x94\x9f\x5f\x6a\xaa\xa0\x4e\x2c\x34\x16\x2f\x7e\x68\x8f\xec\xec\x41\x9d\xc8\x04\x31\xd5\x3f\xe8\x84\xc8\xe3\x1f\x8e\xa3\x78\x47\x47\x43\x35\xca\xe1\x94\xc1\xbf\x8f\x6d\x7a\x82\x98\xdd\x37\x63\xeb\xc2\x3f\xaf\x41\x78\xc9\x77\x75\xcf\x1f\xaf\xb8\x22\xa3\x07\xe9\xbd\xc7\x3d\x68\x30\x6a\x37\x82\x0d\x52\xce\xa2\x7d\xbc\x7f\xd9\x01\x40\x82\x49\x56\x39\x86\xad\x94\x55\x30\x16\xaf\xbb\x5e\xb3\x30\x28\x42\xc6\x89\x99\xc0\x33\xbd\x35\xd0\xf3\x66\xb4\xa9\x1c\x0d\x22\xc8\x29\x93\xd3\x86\xbc\xd3\x7f\xc3\x6f\xf8\x76\x21\x10\x48\xf5\x1e\xab\xd6\x43\xb1\x6c\xd5\x41\x9f\xf5\x5d\x6e\x86\x70\xf6\xad\xef\xeb\x7e\x4f\x58\x06\xf2\x9a\x5c\xe0\x84\x32\x02\xe7\xa3\xf3\x8d\x3f\x23\x76\xd5\x7a\x2b\xa6\x03\x31\x81\x6b\xd9\x7e\x0b\xa9\xf5\x9c\x1d\x89\x03\x1b\x54\xfe\xf8\xad\xe3\xbd\x64\x78\x14\xcc\x59\x1a\x59\x1b\x03\xc9\xa8\x33\x5a\xed\xee\x38\xc2\xd6\x7b\x7f\x2f\x94\x6a\xc4\x61\x6c\x93\xfd\x9b\x66\x89\xce\x7a\x4c\x00\x94\xe5\xba\x36\xf4\xa7\x3b\xca\x65\x29\xff\xe7\x13\xfc\x5e\x56\x2a\xc7\xd9\x8e\xc1\xce\x84\x02\x3a\x91\x3d\x8e\x13\xf7\x4f\xf7\x89\xe4\x61\x2d\x95\x4f\xda\xcc\x17\xff\x38\x4d\x4e\xd9\x5b\xa3\xbe\x15\x57\x6b\x20\x9e\xa8\x86\xa9\xe9\x7b\xc5\xba\x87\xe9\xe8\x27\xa3\x97\x3b\xfd\x6d\x8e\xbf\xb3\x8b\xfb\x3d\x48\x38\x64\x60\x0b\x51\xfe\x4c\x87\x4b\xf8\xcc\x46\x0b\xf5\x75\x19\xf2\xa0\xcc\xcc\x8e\x0e\x4f\xaf\x4a\xac\x98\xe0\xff\x3f\xae\xae\x6b\xeb\x4d\x64\xe9\x3e\x90\x2e\x04\x08\x90\x74\x49\xce\x39\x73\x87\xc8\x39\x8b\xf0\xf4\x7f\xe3\xb1\x3f\xfb\xfc\x67\xad\x59\xc7\x33\xcb\x82\x0e\x55\xbb\xf6\x2e\xba\xab\xf8\x99\x43\xf2\xa8\x1d\x9b\x5c\xfe\x52\xab\x54\xce\x13\x20\x18\x1f\xd6\x71\x86\x43\x9a\x13\x9c\xae\x1d\xd5\x7f\xd9\x49\x49\x64\x7f\xf3\xe8\x4c\xe3\xe0\xcd\xfb\xf6\x98\xa5\x9b\x20\x1d\xb2\x9c\x22\xcb\xf2\xb9\xce\x51\xa3\x73\x18\xf4\x56\xc2\xd5\xcf\xd0\xab\x1e\x8e\x13\x1b\xf4\x30\x65\x29\x6f\x70\x65\x40\xb1\x48\x04\x7b\xc3\x0a\x9c\x37\x9e\x3d\x77\x22\x24\x38\xc7\xbb\x04\x3f\x93\xfd\x06\x9b\x6e\x7b\x9f\x8f\xfc\x77\xde\x9b\x54\xae\x3a\x85\x22\x29\x81\xb1\xbf\xaf\x3b\xb6\x4b\x84\x2c\x9f\xde\x0f\xb3\xbe\x32\x67\x2d\x61\x30\xee\xa1\x78\xf8\xad\xfa\xd8\x25\xfe\x29\xed\x31\x04\x21\x9f\x00\x28\x9f\x2d\xe3\x69\x3f\x8f\xfb\x0b\x3d\x0d\x9e\x44\x13\xce\x7c\xa5\xbd\xf2\x6f\x8e\x80\x31\x4e\xe5\xa9\xbd\xc5\xfb\xec\xe1\xb1\x9f\x7c\x3a\x80\xd7\x58\xf6\x79\x46\x1f\xad\x15\x75\xed\x18\x66\x6d\xb2\x26\xa9\xf7\x54\xf1\x99\x7a\x95\x84\xe5\x94\xcf\x90\xac\xe9\x91\x66\x87\x53\x1b\x10\x05\x37\xa0\xbf\x06\xe5\xd5\xdb\x7f\x9f\x69\x3d\xdf\x4f\xdc\xf5\xe3\xe3\x65\x36\x9c\xb3\x4c\x21\x92\x8e\x8f\xbc\x92\x1f\x6f\x39\xd6\xce\x6c\xd5\xf4\xf5\xde\xf5\x65\x57\x48\x43\x86\xa2\x32\xdc\x7a\xdc\xbe\x02\xbf\xba\xae\x76\x84\x2c\xad\x73\x54\x9f\x90\x26\xbf\x58\x62\x5c\xff\xf4\xab\x32\xce\xb1\xb3\xef\xa6\x62\xd7\x5b\x10\x8f\x52\xd4\x2e\x60\x67\xfc\x44\x81\xa2\xfc\x99\x04\x5d\x8b\x84\xf8\x83\x24\x31\x44\x5a\xe5\xec\x91\x34\xe4\xab\x13\x33\x1b\x77\x0f\x64\x92\xb5\x72\xeb\x73\x7e\xb9\xa2\x11\x65\xa4\x36\x4c\x9e\x0d\xc5\xff\xe4\x22\x3d\x5a\x0e\x9f\x20\x46\xea\x41\x90\x9c\x6b\x03\xc9\xae\xe8\xfb\x58\xa5\x95\x19\x1f\x05\x88\x0a\x9b\xc5\x73\x2f\x1c\x6d\x52\xe0\x8e\xe2\xc2\x5f\xe7\x4b\xae\xf8\x81\xbc\xf3\x27\xfd\x5c\xae\x33\x31\x35\xad\x1b\xe9\xa0\x2b\xbd\xd1\x20\xff\x99\x44\xce\x96\x1a\x5f\x41\x5e\x15\x47\x8a\x2e\x09\xf3\x01\xc1\xea\x79\x75\x56\xfd\x08\xb3\x73\x7f\x1d\x6f\xc0\x5e\x91\x71\x5f\x1d\x65\x4d\xf2\xb4\x23\xee\x33\xd0\x13\x3d\x76\x46\x40\x80\xc1\xcb\xd5\x51\x23\xf9\xc6\x7a\xda\x7d\x27\x0c\x88\x6d\x95\xc4\xfb\xf7\x61\xfc\xb5\x65\x41\x18\x18\x34\xd3\xcc\xc0\x31\x9e\xcb\x1b\x4e\xa0\xa4\x8b\xb0\x87\x89\xb5\x7d\x78\xa8\x64\x07\x3f\x6f\xcd\xaa\x68\x49\x70\xea\x66\x62\xc6\xe2\x56\x31\x44\xf1\xeb\xef\xf8\xd4\xb3\xa2\xb1\x87\xfb\xfe\x64\x08\xef\x11\x92\xc3\x3d\x7f\xce\x60\x11\x55\x67\xc4\x47\xe9\x5a\x85\x3f\xe1\xd2\x38\x2e\x60\x28\xaa\x6d\xcc\x5e\x62\xf2\xa8\xc3\x6e\xed\x86\x2f\x56\xeb\x78\xf7\x50\x61\x48\x34\xf5\x3b\x71\x9c\xfb\xa5\x47\x0d\x98\x73\x9a\xe1\xe3\x0d\xce\xfc\x29\x1f\xd5\xfb\xbf\xce\xbc\x75\x12\x1c\x98\xe1\x36\xd5\xf7\x0f\xf6\x53\x82\x4f\x5d\xdf\x36\x4d\xf3\xcd\x5d\xdf\xfb\xe6\x2c\xfc\x1a\x7d\x75\x2a\x1a\x86\xa2\x8f\xca\xef\x0b\xb4\x1c\xa1\xaf\xce\xc3\x3b\x3d\xfa\x1c\xf7\xb8\x3a\x01\xac\xd3\x91\x4e\x30\xcb\x6f\xcd\xe7\x60\xd9\xf5\x6f\x7f\x3c\x01\x85\x78\xa0\xea\x6e\x73\x59\x31\x40\xaf\xea\x1f\x84\xae\x22\xab\xc1\x61\xbf\x7a\x24\x3c\x33\x7d\xd8\xf4\x0e\x25\x59\x0a\xd9\x81\x3d\x61\xdb\x95\x6f\x25\x4d\x36\xf2\x30\x10\x6d\x87\xb1\x69\x5d\x20\xce\x78\x10\x4a\xf0\x54\x5f\x1e\xfa\x57\x22\x5f\xb3\xb2\xfd\xce\xb1\x1b\x1b\x60\x5d\x4f\x85\xce\x6b\x58\xa4\x5b\x75\x90\x9e\xc0\x97\xda\xe1\xbd\xd5\xd0\x6b\x94\x0b\x38\x5e\xa0\x7e\xee\xa0\x75\x90\x4d\x38\xb4\x42\x36\x9f\x9b\x7e\x04\xe8\x86\xaf\x9f\xe1\xee\x8b\x6f\xab\xa7\x8b\xed\x35\x09\xcb\x3e\xee\xc2\x46\xfc\xad\x21\x2e\x5c\x7e\x4c\x89\x95\xf0\xdf\x3e\x7f\x52\x44\x2d\x6b\x89\x18\x4e\x97\x0d\x91\xae\xed\x3f\xf4\xf1\x96\x66\x74\xf1\xab\xe3\xb1\x62\x9d\x15\xe4\x33\xdc\xb6\xcf\x15\x39\x64\x61\x46\x96\x8a\x42\x7d\xf2\xfb\x3c\xba\x96\xe2\x3c\xea\xe7\xdb\x03\xbf\xd9\x0c\xa6\xd3\x02\xae\x53\x74\xfb\x5e\x2b\x24\xce\x19\x8e\x6a\x8f\x3a\xf1\x1a\xec\xf9\x95\xfc\x43\x7e\xa9\x6d\x10\xbc\x56\xd1\x9e\x87\xcf\x59\x9a\xe2\x38\xb6\x03\x9b\x1d\xa7\x64\x03\x3e\xdd\xa6\xa7\x67\x05\x32\x16\xfc\x39\x98\x4f\x1a\x19\x01\xa0\x2e\xaf\x6f\x46\xd3\x7a\xcd\x81\x2d\x1f\x0e\x90\x8a\x77\x37\x9f\x6c\x1a\x6a\xb4\x6d\x41\x74\x12\xfa\x49\xe5\x67\x3a\xbf\x8d\x8d\xc9\x0d\x53\xd8\x1c\x37\xf7\x90\xdd\xaf\xe7\xb9\x89\x2f\x42\xad\x75\x68\x9a\xb2\x7b\x42\x67\x7f\x83\xc3\x3f\x72\xfe\xe7\x2e\x13\x25\x7d\xfe\x8b\xab\xaf\xc7\xee\xd2\xff\x61\x0e\x92\xbc\x33\xfb\xa1\x3f\xad\xcd\x3e\x77\x2c\xf0\x5e\x54\xab\x03\x53\xbe\x63\x4f\x7b\x72\x2d\x58\x97\x5a\x10\x3b\xae\x8f\x43\xcf\x34\xf8\xa4\x1f\x74\x7f\x7e\x50\x4b\xe7\x11\x46\xd2\xe2\x99\x3c\x7e\x63\x44\x3f\x0f\x18\x5d\x40\x10\xe4\x01\x05\x7a\x59\x30\x90\x1d\xf8\xdd\x47\xef\x31\x9c\x1d\x64\x1b\x50\xb7\x2d\xfd\x50\x5f\x77\x2c\x9c\xc7\x27\x88\x24\xd9\x6c\x5c\xf7\x3a\x78\xb8\xbc\xdf\x59\x10\x89\xc5\x8e\x48\x7b\xfd\x84\xdf\x36\xf9\x96\xf8\x3f\x5c\x52\xa2\x02\xb1\x4c\x3b\xb3\xce\x78\x9b\x4e\x66\xc0\xcd\x00\x71\x9c\x3e\x20\x2e\x2c\x74\x9e\xda\x9e\x3a\xa4\x9a\x0c\xb0\xdb\x82\x89\xac\x13\x5f\x93\xf6\x44\x53\xea\x01\xcb\x74\x9c\x56\x78\x7a\x7d\xe3\x29\xfa\x98\x53\xf8\xb3\xc7\x80\xcf\xf6\xee\x9a\xa6\x74\xdd\xff\x9c\xff\xea\xc5\x4a\x59\xfc\xee\xc5\x53\xb8\xbf\x3e\xd4\x10\x7b\x4b\x8d\xb5\xbb\x6c\x60\x01\xcd\xe5\xdb\xce\xf2\x81\x1f\x5e\x88\x7e\xfb\xf5\x6b\xcd\xe8\x77\x5b\x98\x9b\x70\x72\xd1\xb9\x7c\xa2\xab\x4a\x30\xd2\x66\x69\x41\x26\xec\x45\x68\x1e\x2c\xab\x89\x50\x1d\xfc\xc1\xcc\xbe\x1d\xda\x10\x09\x39\xd3\xf9\x5c\x9d\x08\x58\x22\xf4\xb3\xc7\x0b\x90\x5e\x6e\x66\xb2\x55\x88\x81\x8f\x74\xc2\xab\x29\xac\xe3\x16\xbb\xef\xaf\xf5\xa8\x08\x73\x38\x58\x65\x0d\xd9\x66\x8d\xb8\xab\x4b\xd7\x79\xa4\xf2\xde\xde\xe1\x5a\xe3\xcf\x4e\x22\x3b\xc9\x51\xbf\x3f\x7d\x71\x4d\x9e\x06\x4a\x9e\x31\x6f\xeb\x33\x8c\xae\x63\xc7\x76\x92\x64\x9c\xae\x38\x16\x52\x7f\x79\x18\xd9\x51\xee\xad\x87\xa9\xa9\x16\x70\x68\xee\x9d\x90\x5b\xae\x08\x74\x9e\xfb\x78\x5f\x67\x8e\xd6\xc9\x5a\x39\xc6\xab\x6a\x83\xbb\xe5\x69\xe0\x85\xc6\xf6\xf7\x7b\x26\xcb\x08\x03\x47\xe6\x31\x6b\xdd\xfa\x1a\xb2\xbd\x65\x8c\x9a\x11\x99\x54\x7d\x49\x2a\xed\x2e\x7a\xe1\xe7\xf3\x4a\x20\x58\xf6\xb6\xe7\xe3\x51\x99\x6c\xbc\xd9\xc3\x1d\x87\xd6\xec\xe1\x3e\x4c\x18\x0c\xc3\x57\x5f\xe5\xe1\x33\xfd\x1d\xbe\x31\xd5\x8e\x15\x71\x43\xd3\x3f\xe7\xb4\x63\x73\xc3\xd2\x69\xab\xbb\xfb\xd9\xc6\x00\x38\x90\x05\x00\xd8\x7b\x06\xe4\x6d\x3c\x0b\xce\x3a\xe0\xf5\xfa\xa3\x45\xa6\x94\x59\xa4\x37\x38\x50\x37\x00\x6e\x1e\xfe\x08\xdf\xed\x71\x02\xbe\x2d\x02\xbe\x6e\xad\xb7\xae\xc5\xf0\x50\x49\x55\xbb\x11\x58\x4c\x28\xfe\xb8\x8f\x49\x0a\x03\xdf\x3f\xad\x6f\xb3\x3f\xb1\xab\x76\x63\x03\x7e\x04\xf4\xc0\x57\xbd\x21\xf9\xad\xe3\xf4\x7b\xa0\xe9\x44\x42\xd1\xfe\xf3\x01\x84\xab\x32\x30\xed\x9c\x3e\x1a\x30\xdc\xe3\xed\x5f\x27\x70\x3c\x77\x95\x1f\xdb\xbb\xa0\xaa\x42\xfc\x7b\xb6\x5d\x10\x6c\xf1\x71\xf5\x53\x3a\xc5\x3b\x06\x9e\xf3\xbc\x8a\x86\xac\xd7\x7d\x98\x3a\xc1\x3c\xaf\xf7\x92\x27\xbc\x7e\xa0\x37\x58\xee\x13\xc5\x6f\xc9\x3a\x78\x75\xb1\x69\x26\xb0\x92\xab\x37\x5c\xf1\x5a\xdc\xdb\x17\x71\xae\x73\xd3\x61\x9b\xd2\x36\x3d\x48\x3f\xbd\xe1\x14\xb2\xf7\x5c\xc0\xc6\x23\xe9\x91\xf1\xcf\xb4\xec\x07\xc2\x85\xb3\x07\x34\xba\xb2\x15\x77\xea\xd4\xde\x8e\xdb\x42\x0a\xdb\x1d\xf0\xce\xa9\xa5\xa3\xa7\x84\x9b\x2a\x2c\x55\x8a\x5e\x44\x5c\x33\x78\x9f\x68\x86\x6e\xfa\xde\x28\x6f\x3d\xcb\x6c\x34\x8e\x82\x54\xfc\xe9\x81\x44\xe6\x8b\xfe\xb4\x89\x27\x8b\x7e\xa5\xfd\x16\x32\xad\x45\xf4\xbc\x34\x8d\x4f\x30\xf8\x90\x6b\x5f\x0f\x4e\xf3\xc8\xf4\xbc\x7b\x73\xe7\x65\x60\x65\x93\x30\xf3\x0a\x94\x32\x9d\x49\x74\xf0\x6e\xc6\xbd\x26\x49\xda\xc3\x1e\xef\xbe\x8b\xa0\xf7\x1b\xd0\x0e\x04\xda\xd4\x75\xa7\x10\x43\x90\xfc\x7d\x87\x2c\x27\xc5\x51\x88\xd0\xb2\xa7\xaf\xf9\xc3\x89\xd3\x9a\x7c\x57\xab\x55\x95\x9b\x27\xf9\xd3\x7a\xba\x79\xae\x0c\x99\x0c\x27\x53\x04\x2f\xdc\x7e\x6a\x5f\xb8\x69\x63\x56\x19\x1a\xc5\xf3\x1f\x2b\x79\xf3\xe8\x3f\x98\x1a\x48\xa5\x08\x94\xc0\x80\x87\xf5\x21\x43\xe2\x95\x0a\xe8\x42\x38\x91\x2d\xfc\x6b\xe3\xa9\xe5\x28\xe2\x03\xd3\x79\xf9\xdc\x04\x21\xc5\xf2\x9a\xbc\x7a\xda\x01\x39\xac\x5d\xff\xcc\xeb\xd8\xc6\x0d\x0a\x04\xce\xe9\x24\x21\x6c\x13\xa5\xc7\xfd\x7d\x6e\x55\x89\x10\x66\x15\x74\x93\x4e\xcf\xb4\x0a\xe0\xe6\x99\xa2\x19\x8f\xe2\x0e\x40\x1f\x51\x44\x58\xf4\x09\x77\x08\x29\x03\x39\x32\xc5\xaf\xcc\x67\xb4\xc2\x66\x10\x6b\xa0\xf5\xc7\xec\x6e\x2b\xbb\x79\xbb\x47\x1d\x7b\xca\xef\x79\x2c\xe4\x78\xaf\x58\x3f\xf7\x70\x2a\x51\x15\x44\x22\x12\xdd\x07\xfe\x01\x58\x3c\x7e\xae\x4d\xbf\xea\xe1\x11\x85\xc0\xcc\xef\x43\x15\xe2\x87\xdd\x19\x2c\x8a\x62\x8f\x5b\x0b\xa4\x8f\x1f\x2a\x26\xd4\x38\xa7\x33\x7a\xc0\x19\xc6\xab\x03\x22\x96\x99\x64\x5a\x2d\xd1\x24\xd1\xd0\x8f\xb6\x11\x4e\x1b\x79\xcc\x63\xfd\x82\xad\xe2\x99\x9e\xc8\x7e\x1d\x8a\x7c\xc8\x0d\x7e\xeb\x81\x2b\xb8\x61\xe0\x51\x14\x85\xbb\xb5\x1d\x27\x5e\xe7\xa7\xf7\x63\xf4\xa0\x06\xbd\xad\xbd\x60\xb5\x60\x7b\xa3\xcc\x87\xe9\x78\x05\xa4\xa2\x04\xe1\x9f\x74\x9b\x40\x7a\x3d\x92\x0a\x4d\x69\xc2\xe9\x73\xb4\x17\x7f\xbe\xc7\xd1\x55\xa7\x15\xcd\xf3\xc6\xb1\x92\x30\x58\x57\x5f\xad\x4c\xef\x0e\x11\xe8\xda\xb9\x63\xdd\x98\xff\xe2\x1e\x14\xd1\xdf\x29\xbb\xdf\x8e\x85\x6f\x5e\xa9\xc5\x7d\x9d\x9d\xc5\xae\x3d\xbd\x8a\xa0\x00\x44\x96\x47\x1c\x69\xfb\x46\x9e\xbe\x79\x98\x6d\x75\xf3\xe0\x1c\x56\x7d\xfe\xce\x02\x53\x34\x2d\xdc\x14\xb3\x14\x4d\xfc\x4b\xaf\x5f\x7c\xf9\x4c\xd7\xd9\x2a\x10\x7c\x7c\x10\x8d\x9f\x36\x9e\x55\x78\x30\x05\x8b\x08\xe3\x49\x9b\x2e\x69\xf6\x42\x1f\x00\x7f\x33\xbf\x56\xfa\xa1\xea\xbf\x49\x04\xc4\x51\xb0\x8c\xc7\xf9\xfd\x3c\xe8\xe7\x3d\xb1\x6b\x10\xdb\x61\x3f\xc6\xeb\x57\x63\x90\x98\xa1\xe8\xd3\xef\xda\x07\x34\x29\x7c\x90\x57\x66\xc6\xa5\x78\xd5\x1e\x5c\xdf\xc8\xe0\xf2\x40\x50\x02\xd2\x14\x95\x63\x62\x37\x8a\xdd\x9b\xdb\x67\x3c\xe7\xdd\x5f\x96\x54\xf7\xa7\xd6\x87\x51\x74\xa1\x47\x3b\xb4\xb5\x92\xf2\xca\xc8\x6d\x9a\x90\x35\x72\x26\x64\xdb\x96\xab\x1a\x71\x68\x04\x9a\x80\x74\xf5\x0c\x10\x87\x18\x3d\xd2\x3a\x83\x5f\xaf\xda\x08\x30\x21\x4e\xec\x53\xc1\xc0\x65\x81\x1a\xa3\xce\x85\xdf\xd7\x7a\x23\x05\xf8\x73\xf4\x7c\x98\x26\x23\x29\x77\x68\x52\x7d\xd8\x47\x1e\x1b\x8f\x6d\xe2\x93\x5c\xfa\xbe\x0c\xca\xfa\xb0\x45\xec\xae\xc1\xcb\xf4\x51\x17\x57\x28\x78\xf6\x16\xd4\x40\xf6\xb3\x04\xd3\xe4\xf7\xc7\x9f\xef\xa4\xd5\x5b\x7c\x8c\xe7\x5d\xac\xcf\x6a\x17\xea\xd5\x06\xd4\x0c\xbe\x65\x87\x64\xb6\x60\x3a\x9d\x88\xa7\x61\xb5\x62\x14\x13\xb6\x77\xff\xfb\x6c\xdf\x77\x1b\xe6\xd2\xdd\x03\xb1\xfa\x93\xfb\x25\x44\x1b\x0b\x43\xe4\x0c\x31\x78\x92\x51\x8c\xde\x84\xb6\xe2\xe1\x13\x28\x0a\xc6\x26\x11\xae\x44\xb0\xf1\xef\x86\xbd\x84\x99\x2e\xcd\xd7\xa3\x08\xa0\x8f\xaf\x03\x59\xdc\x3a\x55\x68\x40\x03\x72\x63\xa3\x2e\x25\xb8\x0f\x5f\x72\x66\xf3\x63\x8f\x2f\xa0\x00\xad\x7b\xa1\x57\xcb\x07\xb2\x61\xd7\xa4\x55\x36\x9a\xe0\x34\x3b\x5d\xd7\x60\x6e\xda\xce\x12\x69\x8b\x3f\x96\xaf\xbf\x3c\x00\x7b\xa8\x47\x92\xa9\x89\xdf\x31\x91\x0c\x12\x51\xb3\x9d\x17\x9b\x97\x74\xef\x40\xec\xf1\xa1\xc4\xbb\xde\x40\x38\x70\xf6\xf4\xd7\x3f\xe8\x97\x41\x43\xab\x95\x90\xb0\xaa\xde\xa9\x9a\x24\x6c\x60\x56\x89\x3e\x50\xb9\x31\xde\x75\x54\x1a\x31\x1f\xd9\x7a\xdf\x4f\x6e\x13\x04\xc4\xf4\x94\xfa\xc1\x66\xb5\xcc\x1b\xb3\x82\xf3\xd7\x3c\x38\x6a\x7f\x26\xe3\xfb\xfd\xb2\x45\x7f\xbd\xee\x85\x4a\x3b\x02\x08\xe5\xfb\x4a\xe5\x51\xa3\xdb\x17\x3d\x57\x1f\x9b\x87\x16\x2e\x89\x70\x1b\xf2\x05\xdc\xc3\x31\x79\x43\x15\xe0\x51\x96\x86\x69\x9a\xf0\x71\x9a\x22\x4e\x9b\xe9\x19\xa1\x5f\xff\x71\x7e\xb6\x88\x3d\xf7\xf1\xe5\xf7\xb2\xa6\xfb\xaf\x8a\x82\xf5\xe3\x85\x27\xf0\xc0\x70\xd3\x68\xe3\xad\xdb\x40\xc5\x41\x3a\x9d\xbc\x14\xa3\x2a\xd2\xa4\x2f\x7f\xc5\x87\xb2\x9f\xe5\x21\x61\x05\x35\xc0\x36\xfc\xe1\xbc\x6e\x55\x23\xa1\x69\x43\xfc\x57\x5b\x43\xa1\x4a\xae\x40\x53\xcb\x8a\x6c\x58\x61\xb6\xcf\x04\x90\x3f\xbb\x6a\xd4\xf4\x10\x47\x9c\xda\xa9\x1c\x8c\x51\x73\x54\x3c\x18\xa3\xe7\x86\x2f\x7d\xb8\x67\xcf\x87\xf6\xd4\x5d\x9b\x0e\x04\xf0\x56\xac\x95\x65\x4c\x04\x54\x5a\x26\xe0\xbf\x39\x1e\x19\x7f\xdb\x43\xd6\x0f\xf9\x97\x56\xd4\x63\xd2\xc3\x0f\x4d\xa0\xd7\x91\xbc\xeb\x3b\x15\x78\x98\xc9\xb5\x66\xf8\xee\xc6\x77\x36\x81\xe7\x65\xa1\xc0\xd4\xc8\x56\x1e\x5a\x62\xe7\x2f\x85\xae\x80\x1b\xbb\x82\xd4\x92\x3f\xe7\x1d\x72\x26\x72\xad\x31\x05\xc2\x3f\x1d\x0c\xf3\xd7\x3e\xdf\xbe\x2f\x7d\x9e\xe6\xa5\x99\x25\x12\x44\xa7\x10\x52\x0b\x47\x0a\x6d\xe1\x23\x6d\xbc\xe1\x98\x19\x8f\x65\x2c\xfe\x3d\x81\xdf\x31\xe8\x2a\xa3\x2a\x18\x0f\xe0\x2c\xad\xfe\xa4\x8c\xbc\xfe\xcf\xa2\x85\xa5\x8b\x79\x2a\x90\xd8\xc0\xb8\xf2\x33\xd8\x5d\x7f\x82\x9f\x25\xf0\x4b\x2f\x20\x6d\x9f\x15\xb2\x8c\xed\x28\xb3\x5d\x22\xa2\xa0\xd3\x56\x01\x89\xc4\x32\x1a\xf7\x0f\xc8\x81\x0b\x5a\x40\xd4\x01\x53\xc4\xae\x76\xa4\xfa\x50\xff\x60\xfb\x2c\x54\x38\xb9\x05\x7d\xde\xe6\xb5\x95\x89\xe8\x97\xc4\x75\x18\x11\x43\xae\x87\xb9\x1c\xd8\x9b\x42\x5a\xca\x8e\x88\x0e\x59\x4b\xc9\x00\xe2\x1a\x74\xf5\x22\x9e\xa0\x5b\xfb\x82\x39\x23\xb6\x9c\xd3\x0b\x78\xb2\xff\xf5\xed\xb7\x27\xe3\x43\xfe\x79\x2e\x5b\x5a\x00\x31\x7a\x84\x2e\x60\x46\xec\x6c\xdc\x37\xf0\xce\x07\x0a\x31\x6e\x6a\xa5\x30\xa4\xc2\x11\x49\x64\xb0\xaa\x12\xe8\x9b\xab\xb6\x1c\xdf\xdf\x7d\x30\x5e\x41\x99\x38\x97\xca\x0c\x9d\x16\x29\x7d\x7b\x1f\x3e\xef\xf4\xff\xcd\x9d\xcd\xeb\x7c\x53\x69\x51\x82\xdb\xde\x6b\xa2\x5f\x10\xe8\x79\xcd\xb4\xae\xa6\xc5\x19\xab\x84\xde\x79\x14\x36\xb8\x12\x42\x2c\x51\x00\xb3\xce\x58\x54\x07\x73\x01\x23\xad\x05\x2d\x38\xf4\x0a\x37\x2d\xca\x0e\xd0\xed\x7e\xfe\x70\x1e\x6a\xf3\xda\x71\x0d\x6a\xcb\x14\x81\x1d\x7d\x9e\xfe\xc7\x87\xdf\x69\xe7\x8c\xdd\x36\xa1\xa6\x35\x9a\x36\x6b\x18\xfc\x95\x87\x7a\x20\x37\x1d\x59\x55\x68\x5d\x8e\x53\x66\x15\xab\x9e\xa7\xfe\xf6\x6b\xe3\x97\x50\x92\x00\xac\xfd\xe8\x04\xc6\x33\x6d\xea\x03\x4c\x3e\xed\x73\xbc\x05\xa2\x6d\xb8\xda\x47\x9b\x8e\xc7\x01\x2d\x27\x89\x3b\xbb\x5b\x7c\xdf\x32\x69\xd4\x77\x6c\xfd\xb1\x55\x31\x99\x9e\x5f\x5c\xf6\x60\xd7\xa5\x1a\x21\xba\xee\x86\x1d\x71\x52\xf8\x7f\x7b\xd1\xb3\x8a\x6d\xbc\x8c\x4e\x73\x9d\x56\x3a\x11\x6f\x43\x3c\xc4\x6d\x86\xd8\x2d\x2d\xcb\xb0\x6a\xe7\x57\x2d\x4f\x46\x68\x79\xa4\x01\x7e\x7f\xee\x80\x8f\x5d\xd8\x0d\x6f\xab\xf2\xe5\x2d\x95\x46\xf7\xd6\x39\x1a\x95\x0a\x7c\xac\x36\x7e\xf0\x04\xb8\x17\xbd\xed\x56\xe1\x2a\x70\x83\x05\x2c\xf1\xdf\xf3\x22\x1b\xf2\xf2\x9a\xe9\x1b\xae\xc7\xc0\xfa\x49\xcf\x49\xfb\x3a\x43\x8c\x09\xb5\x76\xd5\xe6\x79\x2b\xf0\xfb\x71\x93\x8c\xef\xe0\xa0\x93\x1c\x3e\x55\xda\x88\x99\xe5\x64\x70\x8f\xe0\x7c\x8e\xfd\xaf\xee\x0c\xe1\xf8\x65\x64\x73\x26\x14\x0e\xc6\xb3\x31\x54\x05\xb2\x13\xfd\x75\xcf\x47\x79\x0f\x65\x35\x1c\x75\xd3\xd2\x6d\x3f\x52\x54\xcb\x1d\x53\x12\xba\xfa\x5d\x8b\xfb\x29\x32\x6d\x29\xb6\x6e\x53\xf3\x5b\x3c\xfc\xcd\x9f\xf4\x5f\x91\x37\x67\xdf\x68\x8d\xfd\x21\x55\x89\x3b\x26\x9f\xf9\xfd\x99\x92\xee\x39\xde\x06\x97\xea\xa3\x2a\x0e\xcb\xab\x0e\x00\xd7\x7f\x01\x27\xda\x2c\xd1\x31\x5d\x37\xc8\x68\xc5\x4c\x05\x6d\xdf\x34\xb5\x6f\xfd\x15\x28\xfb\xd9\xd9\xda\xed\xa1\x7a\x81\x13\xc6\xdf\xdf\x01\xa2\xb0\x13\x26\xde\xdd\x40\xbe\xae\x1b\x75\xdb\xad\x7b\xbd\x1e\xef\x77\xe2\x48\x45\xab\xee\xa9\xb4\xfb\x38\xbb\xaf\x9f\xa6\x6f\x57\x80\x57\x24\xa4\xad\x2f\x95\x14\x04\xec\xbc\xbe\x81\x5e\x9d\xa7\x8b\x3e\xc4\xad\x9c\x07\x30\xdf\x73\xff\xd9\x53\xf9\x0a\xc2\x71\x42\x39\xd8\x71\x33\x6d\x68\xe7\xfb\x73\x7c\xe6\xaf\x1a\xea\xf8\xe0\x0b\xd6\x53\xc4\x84\x9d\xd4\x44\x93\xde\xd2\x61\xbf\xc9\x57\xb3\x59\xb0\x51\x08\xf0\xa5\xab\x27\xf7\x9c\xf4\x59\x02\xe6\x16\x4d\xa1\xc1\xb2\x27\x01\x29\xb5\x70\xa3\x2b\xe5\xe7\x1c\x0e\xab\x56\xce\x9b\x37\x5e\xfc\x18\x6b\x2b\x4d\x86\xee\xd5\xd7\xf8\xea\x25\xf8\x55\xbe\x57\x9f\xef\xeb\x8a\x04\x84\x34\x6c\xed\x68\x85\x43\xe5\x41\xc5\x33\xa5\xfc\xc1\xb1\x1d\xb9\x0a\x6b\xe2\xcf\x07\xd8\xb1\xb0\x70\xd9\x25\x69\xe6\x0f\xf1\xe6\xa7\x3e\xe2\x57\x0b\x92\x9c\x9b\x58\xfe\x76\xdb\x5e\x61\x05\x4b\x16\x8e\xeb\x46\xc0\xe8\x95\x87\x07\x26\xa0\xad\x46\xfc\x1a\x16\x7d\xb8\x7a\x86\x53\x7d\x46\xf7\x2e\x81\x32\x79\xcb\x6f\x37\x16\xac\x4b\x24\xe3\x9f\x41\x5b\xcd\x0f\x11\x4d\x00\x20\x1c\x1c\xf8\x0a\xbc\xdf\xb1\x08\xfb\xa6\x3c\x19\x70\xc5\x16\x09\xf9\x18\x78\x6c\x39\x27\x95\xf2\x94\xce\x3b\x7c\x07\x5c\x40\x56\xf2\x7f\xe6\xb5\xbd\x88\x82\xdd\x04\x59\x9c\xab\xcd\xaf\x9a\x79\x66\x6b\xd7\xbc\xf3\xf8\xfd\x71\x7b\xdd\x6f\xdb\x02\xf9\xc1\x1b\x68\x2b\xb6\x57\x81\x0f\x99\x5a\xc2\x08\x0b\x1b\x5c\xb9\x60\x28\x62\x9b\x0a\x8c\x35\x46\xef\x6a\x42\xb7\x09\x40\x4d\x19\xf3\x65\xf5\x1e\xb3\xc5\x82\xdd\x86\x67\xb2\xee\xe1\xbe\x63\xfe\x7d\xe7\x2f\xbf\xd2\x9a\x13\xfd\xcd\xab\xd8\x86\xc9\xeb\xa1\x4d\xda\x91\x50\xbc\x27\x0b\xdb\x97\xfe\x3e\xdb\x4e\x89\xeb\x60\x6c\x82\x81\xeb\xdf\xbf\xde\xa1\xee\x85\x26\xa6\xf4\x91\xb6\xdc\xb2\x01\x9c\xe2\xd1\x3b\xeb\x48\x8d\x13\x71\xaf\x57\xf3\xab\xbf\xf9\x95\xa7\xf6\x38\x30\xef\x1d\x59\x5f\x70\x3b\xbf\x9b\xdb\x3b\xd9\x95\xe2\x75\xd5\x13\x40\x67\xdc\x0d\xdd\xa0\x94\xeb\xd0\x2f\xd0\x90\x6f\x1e\xe2\xc3\x23\x0e\x33\x48\xac\xdf\xb9\x63\x49\xa2\x4c\xc8\x66\x01\x50\x13\xd9\x2d\xb2\xa0\x71\x9c\xf0\x8c\x7e\x66\xda\x6d\xcf\x61\xdf\x79\xb7\xc0\x76\x99\xbe\x63\x1e\xfa\x5b\xbe\xd7\x3d\xfe\x2b\xe1\x3e\x37\x8e\x34\xc0\xd2\x90\x88\xe7\x1d\x63\x81\x6f\x6a\xa1\xad\x44\x41\x0d\xb7\x96\xc8\xb8\x26\xcb\x36\x9e\xcb\x5e\xff\xef\xba\xaa\xfb\xeb\x7f\x26\xfc\xa9\xef\x11\x36\xb4\xb7\xd3\x55\xa1\xd3\x54\x3d\x74\x2f\x66\xfe\x15\xa7\x21\x60\xc4\x57\x1e\xbf\x53\x93\x3a\xa7\x4e\x54\x11\x7e\xe3\x63\x59\x43\x09\xb3\x97\x3d\xf9\x92\x94\xa1\x2c\xbc\xa5\x5b\x9a\x87\x7e\x87\xe7\xe3\x1a\x53\x0d\x35\x1d\xd0\x21\x90\xd6\xcd\xb7\x5b\x73\x50\xd3\xba\x9c\x19\x56\x3d\xdb\xc3\x14\xeb\xd9\x29\xad\x50\x64\xeb\x11\x68\xaf\xfa\x3e\x21\xaf\x52\xea\xcb\x51\x92\x95\xe5\x7c\x7e\x6e\xb2\x3d\x08\xb5\x17\x06\x67\x6b\x6c\x9d\x60\x06\xed\x78\x5b\xaa\xe0\xa6\xca\x4d\x65\x1a\xd4\x50\x0c\x50\xc4\xfc\xe1\x57\x94\x50\xbc\xf9\xab\x08\x55\x52\xf1\xf2\x5c\x9e\xf2\xdc\x04\xb7\xdd\x8d\xdd\x57\xc7\xd7\x01\x62\xfe\x6a\xf4\x8e\xb5\x52\xf3\xfb\xe0\x1f\x61\x0c\xb5\x4a\xb6\xfa\xae\xf1\x2e\xa1\x17\x16\x1e\x90\xe9\x7e\x23\xc6\x44\x09\x29\xff\xba\x74\x51\xe6\xe4\xf9\x53\xa3\x96\x34\x94\xf6\x95\x9a\x3a\xe6\x09\x4b\x5f\xb1\xd8\x2d\x60\x5e\x85\xa2\x15\x87\x6e\x4a\xbc\x47\x94\xff\xdc\xcd\x0d\x3b\x4b\xe9\x02\x5d\x60\x77\x76\x71\x82\xaf\x7e\x1a\x5d\xfd\x35\xc9\xad\xdf\xad\xd6\xf8\xf3\xbd\x97\xca\x95\x87\x27\x85\xad\x08\x38\xcf\x9c\xdb\x8c\x07\xed\xe5\xeb\xde\x66\xa9\xb9\x64\xfc\x41\x09\x33\xc9\xfc\xe4\x03\x05\x67\x57\x4e\xc4\xb6\x46\xaf\x27\xee\x52\x71\xc8\x42\x6d\x25\x56\xe1\xa9\xe5\xab\xba\x1f\x6a\x1d\xdc\x69\xf7\x2f\x47\x61\x0d\x2b\xa2\xee\x54\x33\xf3\xe5\x6b\x54\xd7\x57\x95\x3d\x2f\xfb\x04\x52\x83\x48\x03\xf2\xcf\xd9\x35\x89\xd8\xf6\x39\x19\xf4\x1e\x7b\xd5\xf1\xcb\x6b\x70\xa1\x7f\xaa\x6f\x9e\x08\x23\x5a\xf1\x70\x7f\xab\xec\xbf\xf7\x57\x6d\x56\x7b\x3d\xf8\xba\xca\xd0\xd4\x8c\xe2\xde\x26\xf8\x43\xb5\x43\x52\xcf\x9f\xf6\x4f\xbd\x0b\xd2\x06\xac\x6a\x9b\xcf\x18\xac\x11\xfa\x78\xa3\xd0\x46\x9e\xdc\x8d\xca\x48\xb0\x75\x7f\x7a\xc1\x52\x25\x71\x04\xf5\x50\xf6\xf4\x6b\x8c\x06\x8e\x09\xfa\x17\x69\x02\x2e\xa4\x0b\x6e\xe9\xd8\xd5\xcb\x2e\xe0\x9c\x6a\x7f\x34\x1f\xd5\x92\x65\xbd\x06\xa3\x44\xd0\x78\x75\x2a\xac\x24\xba\x6c\x1e\xae\xad\x42\xfc\xbd\x93\x4e\x80\x75\xef\x0f\xba\xd7\x8f\x27\xc1\x02\x2e\xd0\xef\x94\x4c\xd4\xb7\x3a\x67\xfe\x3e\xe7\x55\x78\xfa\x7e\x68\x60\x9f\x5c\xa2\x2b\xcc\x70\x69\x06\x51\xea\x47\xe5\xbe\x2a\x3d\xc5\xe1\xd1\x56\xee\x41\xf2\xa7\x67\x5c\x2a\x9e\x6f\x2a\x17\xb4\xe6\x25\x2b\xc6\xb7\x46\x8f\x92\x69\xc3\x0e\xf8\x6e\x28\xf3\x16\x71\xfb\xc9\xe1\xc8\x57\xd0\x0e\x06\xe2\x2b\xf3\xdb\xd9\xb0\x3d\x95\x4b\xeb\xbd\x34\xbf\xc8\x86\x68\x27\x74\x1a\x3b\x94\xeb\x23\xf6\xf8\x1d\x9b\x5f\xb6\x83\xd8\x15\xae\x10\xaa\x1e\xe9\x25\xca\x2c\x18\x55\x29\xd0\x4c\x2d\x0e\x96\x93\x7f\x72\x65\x02\x7b\xb7\x21\x64\xb3\x4c\x82\xed\x9f\xe4\xcb\x0f\x29\x09\x75\x02\x96\x6a\x39\x71\xc8\xc9\x7f\xe7\x23\x48\x85\x2b\x0d\x2c\x98\xcf\xbd\x2f\x1a\x33\xac\x85\x4f\x63\xe5\x8c\x9a\xdf\xe9\xe6\x2f\x5e\x62\x9c\x67\x91\x84\xc1\xf6\xed\xc4\xcc\xbd\xa8\x90\x74\x3c\x3a\x04\x5d\xc4\x62\xf9\x1c\x76\x80\x21\x7f\xde\x4b\xbd\x5e\xb9\x01\xb1\xc1\xc7\x8d\x58\xb7\x6d\xe9\x52\xcc\xef\x67\x2e\x19\x4b\x06\xe3\x61\x13\xe2\x39\x6d\xba\xfb\x5b\xfa\x6f\x85\xae\x7b\xcd\xe7\x4e\x6e\x23\x89\x95\x93\x42\x3a\xc3\x9e\xa7\x04\x27\xd5\x26\xff\x27\x97\x73\x10\x5f\xc0\x6f\x07\xaa\x7f\xb6\x92\xc2\x9a\x6e\x63\x81\x08\xd6\x13\x2c\xb1\x7a\x3f\xfd\xec\x67\x9e\x32\x2d\xd1\x46\xe6\x32\x17\x5e\x1d\xd7\x12\xb8\xc7\x03\x5b\x29\x7f\xce\xc2\x50\x5b\xdc\x61\x30\xdf\x9b\xb4\xa0\x14\x50\xaf\xc7\xac\x21\x89\x5f\xd5\xc9\x53\xe1\xef\xc5\x4d\x72\x83\x9e\xfa\x4c\x3b\x66\xc1\x28\xb9\xa4\x16\x08\x24\x30\x31\x19\xca\x7a\x18\xd0\x24\x03\xf6\xeb\xf8\xb9\x23\xab\x08\x6c\x88\x2a\x0e\x61\xb8\x85\xb0\xbf\x3b\xad\xa1\xa4\xb0\xa9\x5b\x81\xfe\xfc\xd4\x3a\xda\x66\x88\xa3\x6c\xcc\x20\x84\x7e\xf6\x70\xb8\x66\x09\xb1\xd0\xce\x77\x20\x36\x44\xeb\xf1\xf3\x6f\x36\xb0\x5e\x5c\xb6\x42\x8d\x02\x36\x74\x14\xe2\x90\x76\x0e\x68\x15\x18\x1e\x4a\x51\xa1\xa4\x1b\xc8\xf9\x53\xaf\x80\x34\x46\xce\x68\x9a\x64\xd8\x9e\x42\x07\x21\xa7\x63\x58\xc0\x77\xa5\x59\x22\x06\xf0\xdb\x67\xa0\x6f\x4f\xf2\xe7\xec\x3b\x19\x09\xd3\x24\xf4\xec\x65\x1f\x67\x3e\x7c\x28\x96\x17\x1c\xab\xfa\x8f\xd3\x40\xf9\x4f\x5f\x71\x85\xa0\xc8\x40\x29\xca\x9e\xa2\x50\xae\x35\x84\x1a\x95\xd4\x03\x36\x28\x79\x5c\x21\x44\x60\xff\xd6\x42\x26\x66\x10\xdb\xe3\x21\xcf\x7b\x4a\x81\xb9\x6c\xf7\x8b\x58\x55\x28\xd2\x9d\x67\xa3\xdc\x3c\x86\xcc\x7e\x34\x48\x1e\xe4\x2f\x87\x24\xbd\x11\xf6\x1a\xf8\xe3\xa2\xaa\x38\x51\x3d\x4c\xc9\xa4\x9d\xd8\x42\x26\x44\x26\xf1\x5b\x57\x10\xb3\x2d\x7e\x45\x42\x48\x68\x3e\x7f\x34\x64\x69\xbd\xbc\x07\x73\xb0\xdb\xdf\x9e\xc5\x32\x13\xc0\x9c\x02\xc8\x25\x1d\xb8\x79\x80\xdd\x8e\x1a\xf0\xf6\xda\xf3\x42\xad\x24\xef\x9b\x49\xe8\x23\x4a\xa1\x7f\xfb\xdd\x2f\x64\xbc\x3b\x4e\xd9\x3f\x5a\xf4\x26\x6a\xb4\xfb\x15\x1c\x03\xd8\xa7\x60\x94\x06\xfb\xb7\xee\x5a\x61\xd1\x5f\x43\x62\x8c\x2d\xef\x5f\x6a\x72\xe0\x06\xc1\xd5\x80\x0f\xa2\x3a\x83\x26\x02\xf5\x77\xff\x8c\xde\xa8\x00\xbf\xee\x69\x46\x0c\xe2\x28\xe5\xe0\x2a\xee\x6b\x10\xbb\xad\x82\xc9\xc5\x3f\x79\x5d\x85\xa4\xae\xda\x7d\x8e\x51\x1e\x32\xb5\x02\xcd\xfe\x60\x76\x09\x92\x59\xe2\xaa\x34\xc5\xcc\x3f\xf6\xc2\x08\x46\x32\x12\xb9\xc5\xd1\x6c\x57\xc0\xd1\x03\x27\xb6\x55\x72\xa4\xe0\x6f\x0f\x6d\x2f\xcf\xef\x32\xc0\x1e\x61\x87\x7c\xee\xd9\xa1\x0e\x35\x25\x8e\x60\x9d\x3f\xd8\x74\x0e\x12\xe0\x9e\x40\x13\xe7\x60\xff\x31\xf8\xe5\xeb\x04\xe0\x2d\x80\x99\x10\xe4\x3a\x3a\x62\xf0\xa3\x05\x00\xdb\xb7\xec\xc1\x00\xb6\x58\xba\x4f\xa0\x23\xfc\x48\x22\xd8\x40\xfd\x37\xa7\x7b\x8e\xd2\xce\x31\xc0\xdf\x4b\x53\x0c\xbe\x37\x14\xe5\x4a\x22\x47\x25\x61\x4f\x81\x4d\x7b\xc2\x0f\xf7\xc3\x80\x56\x11\x4d\x80\xe3\x11\x08\xa2\x35\x08\x13\x26\x11\xde\xaf\xc4\x81\xda\xcc\x6a\x8d\x31\x74\xf9\xb7\x0e\x66\x5c\x44\xea\xcb\x69\x30\x96\xa0\xc3\xf1\x9e\x43\xf6\x47\x8d\xca\xe0\x6d\x94\x82\x47\x73\xf8\x6c\x30\x45\xfc\xfb\xdb\x0e\xad\x95\x74\x63\x30\xba\x85\xa8\xb9\xf7\xb1\x23\x45\x90\x14\x9a\x32\x3c\x65\xa5\x84\x3f\x79\x50\xca\x50\x10\x41\x63\x09\xfb\xb9\x43\xd0\x61\x27\x27\x67\x10\xbc\xd1\x12\x4b\xf9\xa3\xa3\x34\x4b\x51\x81\x8d\x53\x82\xe8\xc7\xd0\x66\x23\xf7\xdd\xa4\x68\x00\xb0\xc8\xff\x8c\x3f\xb5\x61\x82\xc1\x98\x06\x50\x91\xd6\x1b\x03\x1d\x5d\x05\x84\x24\x4a\x28\xbe\x6a\x81\xfe\xd4\x2f\xa0\x88\xc7\xc5\x2d\x1a\x67\x30\xc9\x9b\x25\x62\xe5\xd0\x06\x1f\x75\xa8\x4b\xf3\xd7\xbf\xff\x1a\xff\xfd\xef\xdf\x0d\x41\xf8\xa5\xe4\x01\x69\x05\xa7\xb6\x6c\xf0\x37\x4f\xcd\xb8\xbf\x27\xf2\xaa\xb5\xfe\xf3\x72\x91\xf8\x28\x39\xea\x90\x2c\xf4\xb4\x69\x37\xc4\x34\x35\x7f\x3a\xe4\xf0\x77\xfc\x46\xdb\xb5\xf4\x5d\x23\x26\x02\xb5\x88\x4c\x7d\xbd\x6b\xc4\x84\x1c\xc2\x6f\x24\x51\x54\x70\x37\x20\xff\xda\xb6\xdc\x88\xb5\xf0\xaa\x3e\xc0\x1c\x20\xf8\x0c\x9e\xc2\xfd\x85\x7f\xc6\xd4\xa6\xa2\x81\x80\x4c\xfa\x2f\x56\x42\x24\x79\x97\x3b\x81\x7b\xc1\x2c\xd0\xb7\xe1\xe4\x58\x60\x40\x5f\xcc\xd2\xc9\x57\xce\x17\x31\x57\xd3\x7f\xde\x6d\xc4\x14\xf9\x55\x9b\x61\x6a\x05\x44\x97\x04\xfb\x96\xea\x88\x94\x9b\xcc\xff\x3e\x4b\xf2\xcf\xfb\x73\x4f\xe8\x21\x79\xeb\x6c\x37\xc3\x4d\x02\x43\xcb\xf3\x24\xbc\x58\x69\x09\xed\xf9\xa9\x73\xe1\xe7\x5e\x12\xb9\x32\x40\x3f\x1e\xc2\x0b\x68\xfa\x0e\x9a\x5f\x58\x3b\x43\xae\x8e\xc4\x92\x59\x52\xa6\x38\xd8\x8f\x36\x7e\xd2\x0d\x7f\x6c\x99\xc4\x74\x3f\xfe\xf8\x90\xc9\x3b\xcf\x77\x96\x4a\x21\x59\xb8\x44\xd1\x90\x7b\x74\x0f\xf6\xc2\xc3\xcf\xdd\x86\x76\x4d\x2b\x20\x0d\x42\x1f\x61\x9d\x6a\xc1\x89\xf1\xdd\xb2\x29\x97\x44\x08\x6d\x96\x61\x4a\x21\xfc\xb1\x97\x16\xb6\xa4\x9c\x50\xb1\x38\xb5\xde\xcc\xbb\xfb\xbe\x37\x48\xa5\xf7\xa4\x79\x49\x2c\x30\xad\xfb\x08\x2c\x38\x88\xe2\xb3\x98\xc5\xa7\x0b\x27\x27\x9f\xd1\xa1\xea\x7a\x60\x5f\xd6\x8d\x3d\xb6\x44\xfa\xe9\x5f\x0c\x86\x44\x02\xaa\xe6\xdc\xd1\x67\x0d\xac\x66\xf1\xba\x08\x51\x4b\x74\xb3\x54\x5d\x14\xb5\x2a\x40\x34\xb7\x31\x38\xbb\xf2\x1b\x28\x07\x36\x7b\x53\x2c\x12\x0b\x94\xd2\xa0\xff\xd6\xb2\x7c\x48\xa6\x15\x05\x23\x91\xd1\xd5\x4c\x06\x45\x38\xe2\xfd\x18\x22\x61\x97\xbf\x38\x23\x88\x75\x2d\x9c\x94\x2b\xd3\x03\x40\xad\x67\x55\x34\xde\x51\xac\xb8\x47\x37\xb1\x37\x02\xf4\xd5\xa0\x2f\xe8\x66\x97\xcc\xcf\x37\x6c\xa5\x50\x35\x80\x50\x55\xef\xd9\x61\xf4\x55\x87\xd5\xbf\x6b\x4d\x34\x2d\xd1\x78\xc4\x5d\x51\x8b\xdc\xd3\x89\x8f\x17\x5f\xa0\x01\xd0\x2f\xcb\xaf\xa3\x78\x55\xd6\xcc\x4f\x12\xf0\xd7\xa9\x04\xf4\xe3\x1f\x1f\x1d\x48\x69\x78\xb8\x20\x86\x80\x11\xcb\xeb\x3b\x20\x9b\xc9\x0c\xdc\xac\x59\xbd\xeb\xfb\x91\x22\x4e\x7a\xb0\xed\x68\xd6\x6d\x25\x2f\x5c\xbd\x72\xac\x20\x8e\x61\xaf\xf0\x17\xb2\x58\xa0\xd5\xda\xe9\x16\xc4\xe8\xaf\xed\x6f\x7e\xf9\xc3\x65\x35\x23\x3f\x53\xf4\x8e\x29\x49\xb8\xd2\x0f\xa1\x2e\x6d\xd7\x65\xaf\x7c\x46\x8b\xf9\x89\x24\x8b\x7b\x2e\xd9\xce\x7f\xfb\x58\xbd\x92\x65\xaa\x98\x27\x4f\xe0\xfa\x0e\x6b\x3d\xfc\x34\xa3\xc9\x8e\x3e\x95\xaf\x04\x14\xf6\x29\x51\x28\x36\xe8\xbf\x7e\xc6\xb7\xc6\x39\x90\x5f\xb9\x4c\xc8\xe8\x30\xd1\xcc\xc7\x1f\x0c\xfa\x14\xaf\x3e\xe1\xe6\xfc\x11\x19\xae\x03\x78\x5c\xf4\x09\x2f\x83\x28\x0d\x38\x11\x8c\xc7\x61\xec\xe1\xc4\x7e\x47\x3e\x78\x24\x73\x94\x2e\xd9\x36\x17\xf4\x04\xf4\xc3\xa7\xc9\xa3\x56\x70\xe3\xd3\xd2\x85\xc8\xd4\x63\x4a\xdc\xa7\x76\xed\xa3\xeb\x2c\xcc\xd5\xcc\x41\xdb\xe7\xf9\x26\x50\x27\x92\x9e\x04\xca\x5e\xb5\xa6\x5c\x5c\x27\x9c\x78\x35\x3b\x5e\x17\x62\x0f\x03\x74\x28\x81\xf3\xe2\xaf\xcd\x13\x9a\xb2\x9e\x37\x63\x7f\xce\x6a\xf3\x25\x39\x38\x7f\x76\x06\x7e\x5d\x5e\xdc\x3d\x26\xe4\xcc\xab\x67\x0c\xc7\x66\x19\x47\x6e\x92\xd8\x5c\x5d\xa0\x1c\x3f\xa1\x54\x84\x0b\x62\xe0\x1e\x66\xbc\x8f\x34\x20\xd8\x4d\xf1\x17\x33\xe8\x77\xff\xaa\x78\xf4\xc9\x5a\x6e\x72\x9d\xb1\x6c\xac\x70\xfa\xa8\xf0\x83\xc0\x60\x1c\x18\x1f\xcc\x0b\x05\x27\xef\xae\x5c\xbc\x91\x75\x3c\x86\x7c\x61\xfb\xb5\x94\xb4\xbe\xfc\x52\x7b\x60\x04\xe4\xff\xec\x8b\xf1\x1c\x49\x9d\xce\x93\x73\x76\x51\xcf\x79\xd8\x40\xdb\x66\xbb\x27\x8a\x83\x2b\xd0\x39\xea\x62\x4f\x00\x7a\x9c\x38\xc6\xed\x24\x06\xb2\x2c\xcc\x2e\xec\xba\xca\xfa\xc9\x6c\x4a\xfc\x1c\x0a\x23\xe5\x85\x48\xfd\xc5\x03\x1e\xec\x85\xb4\xa7\x2a\x3b\x26\xc0\x71\xe0\x2b\xc2\x53\xa7\x19\xf1\x66\xad\xaa\xf7\xce\x2f\x03\xab\x4c\xaf\x7a\x98\xf5\xdd\x85\x03\x2e\x64\x6b\x04\x09\x73\xba\x3c\xdd\xf6\xc0\xe5\x04\x63\x08\x0c\xe2\x9d\xf7\x78\xfb\x3a\x84\x23\xfc\x4c\x19\x44\x11\x3d\x2c\x6b\x8a\x9d\xc3\x76\x3e\xe0\x34\xa2\xbe\x72\xdc\xba\x4d\xa0\x3d\xf5\xab\x80\xc2\x75\x81\x82\x7a\xe0\x83\x4d\x7d\x6c\xfd\xa4\x02\xc0\x97\xae\x39\x8f\x63\xcf\x49\xd4\x57\x53\x35\x97\xda\x53\x5d\xef\x13\x51\xd2\x73\xc8\x61\x86\x9f\x7b\xc7\x94\x91\x23\x87\x37\xf9\xef\xa0\x57\xfc\xf5\x80\x19\x40\x81\x4b\x49\xf9\x66\x1d\x1a\x72\xac\x7e\x4f\x8e\x98\xcb\xfb\xc6\x99\xd4\xfb\xa7\xc5\xd7\x71\xca\xe9\xdd\x7a\x6f\x62\x51\x85\x45\x79\x0e\x63\x27\x4d\xaf\x58\xc1\x64\x5c\xa8\x85\x37\x2d\xff\xd4\x65\x24\xe2\x90\xf7\x4a\xda\x3a\x8d\xe0\x9b\x35\x35\x65\x0d\xeb\x34\x8c\xcf\xf9\x86\x4f\x57\x5e\x96\x7a\xe6\x41\x40\x5d\x38\x61\x5a\xbc\xbd\x9e\x8f\xe8\xf9\x48\x33\x98\xab\xba\x76\x33\x3c\x2d\x4d\x4e\x41\x71\xbf\x81\x01\xb4\x12\x5b\x5c\x67\x6b\xca\x9f\x6f\x5e\x35\x01\x42\xa3\x75\x04\x44\xfc\x86\xdf\x7a\xf3\xba\x6a\x76\x83\xe7\x0e\x09\x3f\x6c\x01\x4d\x75\x1f\xec\xa5\x92\x63\xda\x0e\xf3\xfd\xb5\x7c\xa2\x16\xe9\xa9\x83\xe5\x64\xc5\xd9\x22\xbd\x75\x12\x28\x58\x39\x99\xd2\x1f\xbc\x60\x56\x3f\xb1\x9e\x06\x4a\x75\xbe\x02\x45\xd1\xd9\x8d\xa4\xb7\x93\x40\xa0\x5c\xbf\xaa\x95\x70\x6a\xaf\xfd\x5b\xbd\x62\x3b\xf4\xaf\x1c\xc2\xf6\xf8\x88\x2e\x82\x2a\x9f\x55\xe1\x3e\x9a\x7c\x4f\xd5\x9c\x71\xb8\xe1\x47\x93\x69\x16\xd5\x81\xb5\x64\xc4\x4c\x8e\x12\x8b\xf4\x29\xdc\xc7\x5f\x7b\x36\x20\x49\x1b\xb6\x9f\x14\xac\xa1\xdf\x3a\x7b\x1b\xf0\xf4\x66\xf3\x42\x67\xb9\xa2\x9a\x7c\x3c\x72\xb7\x3a\xa7\xe5\xae\x67\x92\x45\x72\x2e\x46\xd9\xcf\xc2\xb8\x55\xcc\x8f\x76\x55\x72\x72\x33\x02\x6f\x9f\xf3\x64\x7f\x3a\x30\xec\xc5\xf7\x9e\x17\xeb\x84\x36\xbc\x14\xcb\x3a\x3f\x47\x81\xb6\xfa\x60\x4d\x11\xc9\x7b\x9a\x9d\x88\x77\x44\x75\xe6\x60\x0f\xac\xa8\x84\xfe\x16\xca\xa9\x09\xc6\xc9\xfe\x3b\x4e\x26\x26\x14\x39\x48\x0d\x9b\xf7\x20\xe0\xc3\xe9\x1c\xc2\xf6\xb8\x56\xe8\xa6\x01\x0a\x3e\xbc\xef\x03\x0e\x25\xfc\x8e\xcb\x26\x2e\xb6\xf7\xab\x1f\x01\x3e\x0e\x52\x7e\x5b\xce\x6f\xc5\xe8\xa5\xbd\xb7\x03\xba\xbc\x78\x69\x2b\x24\xc2\xff\xc1\x74\x9f\x24\x17\x81\x0f\x70\x0c\x79\x5d\xff\x4a\x58\x8e\x49\xba\x7c\x82\x00\xa2\xec\x85\x96\xa6\x7b\xac\x9a\x00\xb2\x75\x13\xbf\xe6\x75\x3f\x89\xce\x21\x1d\xbf\x99\xfd\xf3\x54\x50\x6e\xc0\xa3\xee\xbc\xe3\xfe\x51\x03\x61\xa7\xc0\xf4\x49\xbb\xed\xbb\xbf\xd1\x2e\xf0\xfd\xdc\xff\xeb\xfb\x79\x0e\xcd\xb9\xaa\x0f\xca\xb7\x14\xca\x51\x60\xa4\x72\xd2\xee\x43\x12\xc8\x74\x70\x68\xdd\x07\xc8\x48\xbf\x7a\x5d\x3e\xe6\x6b\x77\xc5\x25\xcd\x86\x1a\xc3\xe8\xf5\x5f\xde\xec\x98\x6a\x95\x2d\xb8\xe0\xa7\x2f\x10\x41\x06\xbe\x86\x95\x6f\x4d\xea\x27\x7a\x7f\x58\x77\xff\xea\x69\x05\x9d\xca\x11\x7e\x5f\xe8\xfb\x71\x97\x62\x3a\x99\x5c\xf7\x73\x83\xcb\x70\xde\xfd\x07\x19\xf9\xe1\xf9\x21\x94\xe3\xe7\x0c\x63\x2d\x68\x67\x57\x12\xc2\xa9\x6b\x71\x1d\x9e\x2c\xae\xb8\xc5\xe2\x8e\x93\x34\xbf\x97\xc3\x86\x70\xad\xf8\xbc\xdf\xbe\xf2\x25\xb7\x88\x77\xc6\x2e\x8b\xbe\xe4\x32\xbf\xbb\x57\xd6\xbc\xcc\x08\xf1\x56\xe5\xb3\x5c\x31\x8d\xf5\x49\x62\x9e\x28\xc1\xa0\xfe\xc1\x76\x26\x67\x30\x00\xac\x90\x26\x0c\x30\xd2\x98\x0e\x58\x0d\x55\xbb\x2f\x59\xc2\x42\x19\x4f\xee\x12\x58\xc3\xaa\xc7\xd5\x4e\x7f\xbf\x0f\xbb\x86\xe1\x04\xc0\x7c\x18\x09\xbb\x86\x41\xab\x9c\x57\x42\x6a\x72\x7b\x3c\x63\xc4\x5f\xbf\x24\xe3\xac\x47\x9c\x1b\xe3\x58\xab\xcf\xb8\x8b\xf1\xe5\x91\x9b\x5e\x25\xf4\x94\xc0\x8f\x64\x4c\xbb\xa9\x7d\xf0\x0c\xde\x79\x20\x8a\x10\x30\x1d\xb5\x53\xab\x81\x98\xec\xc4\x31\x80\x1d\xe0\xa3\x71\x10\x56\xc5\xe6\x33\x99\xb8\x53\x7c\xa8\x39\xb9\xf0\xeb\xb1\x9b\x7e\xec\xbe\x69\x61\x12\x50\x15\xcf\x2f\x87\x76\xc6\x93\xd7\xb2\x5b\x60\x8d\x59\x76\x1f\xae\x83\x6a\x1e\xe5\x2a\x67\xd5\xad\xb7\x20\x42\xe7\x77\x58\xc4\xcb\x21\xf2\x27\x00\x8d\x88\xfa\xb0\x9b\xf9\xfb\x39\xf1\x4c\xf2\x28\xc6\xd8\x66\x18\xc9\xdf\xd9\x43\x87\xef\x27\x31\x10\x2b\x83\x8f\xaf\xe3\xb6\xe5\x59\x89\x80\xfb\xd2\xf5\x17\x38\x47\xc1\x10\xe7\x6f\x3d\x45\x00\x41\xbf\x65\x26\x84\xc5\x44\x67\xcc\x71\x52\x2d\xfe\x78\xef\xb6\x36\x81\x17\x83\x4a\xf6\x87\x92\xc5\xb0\x6f\xee\x57\x3e\x9b\x33\x43\xac\x3a\xf9\x3b\xdb\x2e\x83\xc8\x18\x4f\x11\xc8\xa5\xdf\x8b\x7d\xb3\x14\xd9\x80\x9e\x71\xb0\x6e\xdf\x69\x6c\xd7\xef\x4c\x2d\x1d\x60\xa6\x45\xd4\x8f\xfd\xe0\xae\x7c\xab\x7a\xa6\x59\x76\xc7\xad\xab\x75\x25\x7b\xd5\xc1\x9b\x5e\x79\xe0\x48\xbf\x73\x85\x58\xfd\x6a\x91\x99\x7a\x59\xa1\x50\x5b\xfa\x4b\x75\x5d\x67\x92\xbe\x67\xa7\xe3\x6e\xb3\x46\xe3\xe8\xcc\xf4\xd8\x7a\xbe\x92\x57\xa7\xc3\x4a\x61\x68\xca\x95\x48\xcd\xfc\xa6\x23\xbf\x75\x2e\x5d\xe7\xc8\x4c\xbf\x90\x14\x46\x62\x07\x0f\xc6\x79\x92\x5e\x1b\xde\x8e\xe3\x60\x21\x04\xb2\x0c\x45\x7e\xca\x71\x69\x6e\xdb\x44\xf1\x6e\x24\x14\x98\x62\xfd\xe7\x13\xb4\x3c\x61\x7c\x8d\x62\xf9\x63\x81\x2a\x71\xb4\x4e\xb9\x09\x3d\x32\xbe\x63\x26\xf4\x34\xa4\x2f\x7c\x0f\x88\xe9\x49\xb7\xac\x57\xec\xe3\xd6\x97\x0b\xbc\x62\xc8\x06\x5c\xb7\x52\xd2\x66\xb0\xfe\xd4\xa4\xbf\x53\x6d\xcd\x5d\xcf\x78\xcf\x0b\xcc\x57\xe9\x63\xd2\x9e\x00\xb3\xa5\x17\x93\x69\x5d\x7b\x57\xe0\x48\x52\x5b\x33\x98\x5a\x2a\xbe\xe5\x86\xf1\x57\x47\xf3\x32\xa6\xba\x72\xcb\x42\x9d\x52\x5e\x77\xe2\xa7\x45\x1d\x29\x56\xac\x1b\xd3\xf6\x7d\xbf\x9d\x36\x9c\xdf\x6e\xdf\x9d\x62\x31\xce\x41\xf7\x70\x21\xe7\xe2\x57\x1d\x7d\xc6\x7e\xf1\x67\xe4\xfc\x37\x79\x62\xcb\xf0\xb1\x74\x08\x5b\x29\xa0\x4c\x38\x55\x7b\x7a\x87\xd8\x40\x36\x22\xa0\x2c\x88\x64\xf5\xfd\x3d\xec\xb3\x64\xea\xc8\x66\xa3\xf7\xad\x03\xbb\xf6\xa3\xe5\xc8\x03\x70\x15\x2a\x2d\x54\xd8\xf6\xd9\xab\x64\x2b\x1b\xfc\xf7\x7d\x89\xd9\xac\x93\xbd\xeb\x5e\xf4\x98\x39\xad\xdd\x8d\xa9\xcd\xcf\x75\x66\x48\xfa\xaf\xdd\xbc\x86\xef\x02\x09\xdc\x39\x2f\xe3\xf2\x19\x62\xbb\xe2\x79\xec\x22\x27\x26\xf6\xb0\x7d\x0f\x2e\xd3\x7e\xb8\x0f\xc5\x30\x07\x32\x36\x59\x74\x8d\xee\xf4\x77\x91\x8c\xdf\xf9\x4f\x1a\xab\x71\x10\xe1\xdf\x5e\x04\xe2\xed\x40\x5a\x4f\x02\xf3\x2d\xe9\xae\x9e\xb2\x68\x40\x6a\x5e\xdd\x3c\xe8\x61\x56\x60\x3d\x62\x9f\xec\xb6\x69\xc9\xef\x74\xce\xed\xd9\xfe\x1b\x37\xc8\x25\x9a\x34\x32\x49\xed\x9d\x7a\x1e\x01\xe2\xdb\xf9\x7a\x1f\xf2\xc6\xf2\x05\xac\x0b\x4f\x2c\xd0\x5b\x02\xff\x87\x93\x6d\x5b\x48\xf8\x22\xd0\xd6\xbe\xfd\x91\x18\x8d\x7a\xec\x16\xc9\x28\x33\xcf\x7f\xfa\x9c\xff\xfe\xd5\x17\x2a\x83\x54\x94\x9c\x13\xc5\x4b\x29\x8e\x53\x84\x25\x3a\x59\x97\x37\x88\x2d\x77\xb5\x78\xea\xe2\x95\x43\x2c\xfe\xf6\x74\x16\x69\xbd\x47\xe5\x60\x7f\xef\x69\x28\x36\x48\xca\x6e\x0e\x91\x6e\x99\x42\xc6\xff\xe8\xaa\x02\x10\x9b\xf5\x64\xd4\xb3\xf9\x48\x49\xda\xe2\x2a\xca\x22\x1e\x7d\x07\x18\x20\x24\x3f\x3c\x82\xdb\x04\xcd\x17\xe8\xe4\x33\x66\x6c\xac\x76\x47\x4a\x83\x47\x99\x49\xa4\x4f\x39\x6a\xd0\xe7\xff\x6a\x19\x32\xcb\x45\x8b\x59\x02\xb0\xe7\x10\x27\xb0\x2c\xbc\xdd\x56\x19\x92\xd0\x7f\xe6\xdb\x23\x35\x52\xf6\xe4\x03\xfd\x7a\x56\x85\x65\x0f\x2a\x26\x54\xa6\xd9\xf3\xdb\x87\x32\x2b\x48\x41\xff\xd6\x32\x07\x5a\x2f\xb5\xab\x54\x4a\xce\xfc\x16\x8c\x58\x80\x7a\x98\x5c\x19\x62\x2c\x73\x97\x9e\xfb\x67\xae\x95\x70\xa3\x09\xed\x20\x3e\x57\x31\x23\x7a\x5a\x13\x6d\xa5\x97\x90\x6d\x3c\x56\x70\xf0\xff\xd1\x26\xd7\x18\xb5\x3b\x83\xdd\x5d\x8b\xbc\x2e\x04\x1a\xba\x47\x0f\x39\xff\x93\xbf\xa3\x93\x97\x41\x3e\x3b\xfd\x64\xfb\x29\x97\xe4\xdd\x03\x9c\x4f\x6e\xd4\xfc\xab\x17\x33\xe0\xe7\xff\xea\xe0\xab\xff\x2f\xe0\xfb\x63\xce\x6b\x5b\x6a\xee\xa7\xcb\xb8\xbb\x56\x9c\x60\x99\xd3\x0d\x7a\xe4\x3c\x10\xff\x7f\x7a\x69\xd5\xe6\x20\xd4\x76\xa2\xf5\xc4\xeb\x59\x0c\xd1\xcc\x65\x9d\x72\xc4\xb2\xc2\x60\xb8\xb0\xeb\xf1\x3f\xba\x93\x6c\x3f\xc6\x83\x5f\xa5\x94\x85\x5e\x9a\xf1\xee\x34\x1e\x4e\xbf\xa5\x43\xc5\xcf\x22\x06\x74\xd4\x80\xfe\xce\xa5\x23\xd9\x13\x25\xcf\x99\x7d\x7d\x42\x30\x57\x44\x1b\x1e\x0e\xf1\xb9\xbd\x63\x9e\xac\x58\xeb\x9f\x3c\x80\x00\x38\x15\x92\xda\xa2\xd2\x4d\xfd\xa7\x96\xb2\xfe\xab\xef\x07\x64\xcf\x3c\x4d\x90\x7f\xf3\x4d\x58\xff\x7c\x49\xe7\x1a\x22\x2b\x62\x86\x43\x8e\xa2\xed\x2b\x5b\x96\x66\x12\x3b\x9f\x46\xb6\x99\xe1\xab\x83\x28\xa7\xe6\x4f\x9e\xe5\xd8\x69\x93\xec\x5e\x6f\x36\x26\xbd\x77\xb5\xb8\xfd\x9b\xaf\x12\xf8\xca\x46\x9a\xf2\x3b\x70\x8c\xff\x70\xdf\x90\xf0\xd8\x6e\x05\xed\x2e\xf4\xf3\x81\xa0\x0f\xc5\xaa\xb4\x7c\x9f\x3b\x8d\x51\xdd\xeb\x3b\xc9\x68\x28\x8c\xf9\xa7\x36\x95\x52\x86\xc7\xcb\xb3\xdf\x77\x62\xba\x7a\x43\xfc\x5a\x5b\x5d\x4d\x24\xf6\x90\xfa\x86\xe0\x3d\x6a\xf3\x86\xd7\xc2\x32\x16\xd1\xfe\xe4\x8e\x15\xf0\xfc\x32\x35\x25\xed\x83\xa6\xc6\x56\x3d\x8a\x46\xc7\x63\x23\x56\x1f\x89\x2b\x58\xd3\xdf\x9c\x4f\x69\x8a\xfd\xa0\xcc\xd7\xf7\xab\xa1\xed\xbe\x09\x15\xd6\x33\x5c\x9b\xe6\x50\x89\x21\x33\x3c\xa9\xdc\xba\x0a\xde\x75\x28\x02\x51\xe5\xcb\x2f\x45\xf2\xc6\x8f\xff\xe4\xe2\x8c\x60\x76\x3d\x0a\x0f\xb2\x66\x5c\xe0\x86\x40\x7d\xf5\x2c\xc4\x50\x17\x2b\xb2\xda\x5f\xa9\x60\x7e\x15\x3c\x1a\xaa\x3a\x4e\x16\x74\x88\xe9\x26\x54\x4a\x7a\x74\x43\xc3\xfa\x8d\x81\x5e\x2e\x03\x23\x28\xcd\x64\xe5\x01\x49\x55\xd6\xc2\x51\xb9\x12\x41\x36\x84\xdb\x0e\x6e\xa1\x45\x54\x94\x80\x50\xc9\xa2\xbd\x30\x37\xaf\x44\xbf\x37\x74\x27\xdc\x9f\xba\x7f\x14\x1f\x7f\xaa\x84\x95\x78\x65\x6d\xee\x3a\x65\xc3\x6f\x48\x2b\x8e\x22\xa6\x4a\xd3\x22\xc3\x26\x65\x74\x7a\x7b\x60\x77\xcf\xb2\xce\x7c\xc9\x42\x60\xdb\xd1\x64\x98\x86\x4c\x76\x00\xd7\x08\xa7\x39\xfe\xb3\x83\x8d\x11\x51\x8a\xfe\x4a\xdd\x72\xef\xb2\x77\xfa\x1d\xa3\x71\xe6\x81\xf2\x55\x65\x8c\x7f\x2f\x15\xba\x4a\xe1\xc0\xa2\xcf\xaf\x85\x76\x42\xf2\x09\xa3\xc9\x44\xf5\xe5\xad\x4b\x2d\x58\xbb\x07\x2b\xb1\xf3\x3f\xeb\x81\x5a\x9f\x4d\x6a\x6f\x52\x3f\x6f\xdd\x5b\x35\xa0\x33\x75\x8f\x5f\x35\xeb\xec\x16\x09\xa8\x1c\xd2\x4e\xf5\x73\xdd\xd4\xd1\x17\xa5\x48\xc5\x47\x17\x1f\x33\x2b\x5e\xf9\x07\x65\x79\x15\x39\x55\xa2\xcb\x6f\xac\xa5\x0e\xa6\x78\x21\x04\x96\x3e\xa8\x2e\xce\x74\xb7\x81\x5d\x36\x78\xb0\x57\x9f\x85\xca\x6c\x02\x61\x60\x02\xbe\xc0\x07\x20\x78\xe6\x05\x43\x53\x01\xcc\x0f\xf7\xcd\xbe\x9d\xa3\x67\xf1\x75\xa8\xbf\x98\x4f\xe6\x82\x69\xb2\x73\xf2\x5d\x60\x30\xd4\xd3\x7f\xf3\x33\xf5\x5f\xbc\x3c\xe2\x76\x08\xa8\x12\x42\x24\x5d\x0a\x69\xf9\x4d\xa0\x80\x14\x02\xce\xe5\x8a\xf6\xa7\x22\x8a\x14\x3b\xe5\x81\x0c\xee\x27\xfa\x55\xb9\x7f\x7b\x97\xe4\x49\x6e\x79\x72\x18\xdb\x40\x73\x8c\x99\x7e\xbf\xcd\x03\x61\xb0\x9e\x83\x02\x0e\x6a\x52\xd2\x3e\x12\xca\x87\x27\x07\x0d\xe8\x49\x18\x76\xfd\x46\xb3\x5e\x25\xfc\xee\xae\x6e\x41\xd6\xce\xaf\xfc\x6e\x08\x06\xfd\x53\x23\x94\x22\xaf\xcf\xd1\xa6\x55\xe8\xac\xe9\x61\x4b\xa8\x79\xa2\x04\x74\x57\x39\x7e\xce\x2c\xd0\x69\x2e\x38\x5a\xc7\x89\xe0\xa4\x0a\x52\xca\xb0\x62\x3b\x8f\xf9\xfa\x16\x76\x43\x5d\xc2\x70\xeb\x85\xd1\x8d\x97\xa0\x4f\x28\x17\x61\x5a\xe6\x64\xf1\x6f\xae\x3b\x93\xb7\x97\x14\x8c\x47\x4e\xd0\x11\x76\xd7\xc3\xcf\x27\x74\xa4\xca\x41\x55\x79\x0b\xfa\xad\xe7\x72\x0c\xa8\xfb\x1d\xd8\x3d\xd0\x4c\xeb\xb0\x77\xe6\xcd\xc0\x6f\xc7\x82\x02\xc1\x2a\x93\x16\x11\xff\xe4\x69\x09\x69\x17\x3f\xc4\x4b\xfe\x00\x43\x65\x60\x75\x89\xdd\xb2\x74\x8c\x32\x40\x14\x36\xeb\xc3\x5a\x17\x51\xb0\x17\x2d\xd0\xbd\x7b\x5a\xbd\x32\x80\x47\x36\x46\x12\xcd\x27\xc4\x33\x3a\xf8\xe8\x61\x4a\xa4\x2e\x07\xbb\x66\xc7\xf9\xf7\xa9\xb7\x85\xbf\xb9\xe9\x6f\x1d\x40\x4b\x7e\x0b\x99\x7a\x8c\xa5\xfb\xc6\x3e\xae\x3e\xca\x32\xe6\x8b\xa1\x2c\x7e\xae\x93\x61\x21\xaa\xdf\xf5\x47\x07\xf1\x4b\xc3\x65\xf7\x4d\xbb\x8f\x1f\xa4\xfb\xb8\x5d\x7a\xf6\xf6\x5c\x93\x96\xc5\xb0\x21\x75\xbc\x86\x72\xba\x7f\x3e\x86\xbb\xe6\xa7\x2a\x78\x92\x68\x7e\xfb\xec\x20\xa0\x2f\xf8\x6f\x3d\xa3\x25\x3d\xe7\xed\x44\x13\x86\xa2\xc6\x88\x9c\x65\x16\x1a\xa1\xd4\x4b\x29\x16\xc8\x29\x57\xed\x43\x34\x5e\x1a\x0e\xdd\x1f\x37\x87\xe6\x24\x20\x4d\x91\x44\x14\x35\xe8\xfb\x85\x5d\xdc\x06\x9a\x45\x3f\x6f\x69\x5e\xeb\x59\x8a\x61\xb7\xda\x88\xb0\x04\xed\xc6\xf7\x63\x8d\xe5\x42\x61\x5a\x0b\x5e\x81\xcc\xa6\x9e\x6f\x8d\x5c\xf7\x82\x3e\x9f\x28\xb3\x8d\x16\x79\x1e\x7f\xee\x8d\x03\x88\xa9\x0a\xa0\xeb\xeb\x57\x6d\x14\xf8\x71\x9d\x8f\x08\x8a\xbe\xc3\xce\x1b\x84\x44\xb8\x29\x06\xb0\x66\x6b\x3b\x61\x0c\x68\x52\x7f\xa3\xb9\x60\x89\xde\x24\x39\x06\xe2\x38\x63\x2e\x4f\xce\x8a\x87\x13\xd6\x0a\x58\x15\xf6\xd6\xf5\x5d\x32\x26\x2d\x03\xb8\xf8\xef\x0f\x69\x04\x25\xf0\xa6\x90\x21\x71\x58\xab\xca\xe7\xc4\x1e\x12\xa6\xcb\x52\xa0\x92\x9b\x06\x3f\x17\x06\xa7\xf8\x21\xa9\xb2\x67\x46\xe3\x94\xc0\x95\xd1\xd2\x54\x0a\x47\x51\xe2\x8e\xb5\xa5\x24\xc3\x69\x05\x28\xa1\xd4\x01\x5f\xdf\x92\xc1\x78\xa0\xf1\xef\x87\x12\x01\x50\xa4\x92\x37\x08\xe6\x36\x62\xbe\xe4\x49\x0b\x8a\x6f\xa7\x37\x16\x92\xd0\xe7\x25\x18\xa0\xab\xbd\xc7\x92\x4b\x6c\xbf\x7d\xf3\xd7\x11\x51\x4c\x7d\xb7\x33\xda\xb6\xb8\x5d\x3d\x64\x73\xd3\xac\x83\xd7\x5e\x51\x7a\x0e\xe6\xde\xf5\x6f\x26\xf0\x92\x59\xf3\x1c\x49\xaf\xb6\xd6\x50\x57\xfb\x0f\x56\x10\x40\x37\x72\x32\xe1\xab\xe2\xfc\x41\x59\x80\xeb\x0a\x71\xda\xeb\x56\x25\xd8\x5d\xc3\x1e\x31\xb2\x7f\xac\xd8\xa0\x68\x0b\x7b\x84\xec\x7d\x3e\xf6\x89\x69\xf5\x4c\x12\xa6\xf1\xa9\x0d\xd2\x27\xa4\x68\xdd\x86\x5e\xfc\xeb\x99\x6b\xca\x12\xa8\x8d\x90\xf2\x1f\xb9\x59\x05\xfe\xa5\x31\xf9\xe7\xb5\x2a\x7f\xa6\x63\xac\x58\xf1\x51\x1d\x39\xba\xce\x2a\x4d\x7b\xda\xd9\xbd\x1c\x7e\xb4\x7e\x09\x96\xa7\xf7\x58\x9f\x30\xe0\x05\xbc\xa8\xdc\xcf\x77\x84\x73\x8f\xd5\x4f\xdd\x71\x61\x27\xca\x17\x55\xe6\x52\x48\xc1\x6c\x9a\x28\x08\xdf\xf3\x53\x6b\x9d\x43\x9d\xf4\xea\xc3\x48\xfe\x39\x1e\x85\x4b\x4d\xe6\x90\x0b\x35\xfd\x6d\xf6\x3f\x2f\x2b\x45\x58\x9b\x70\xd5\x90\x4a\xe6\xc9\x11\x10\x37\xfb\xb2\xc1\x32\x6e\x78\xaa\x77\x67\xe6\xb0\x63\xdd\x34\x72\x93\x29\x04\x52\xe7\xa9\x06\x1a\xf2\xb2\x8d\xa0\x67\xab\xc6\x95\x43\x24\x71\x42\x5a\x8f\x6a\x51\xc9\xd5\x2a\x80\x4a\xb8\x3c\xac\x8f\x78\x02\xd0\x76\x63\x79\x4e\x9e\x52\xb1\x02\x0f\x4f\x04\xfe\x2e\xff\x39\x57\x49\x30\xf4\x1a\xf5\x95\x19\xd1\xa9\x64\xbc\x9c\xd2\x52\x85\x11\xc7\x96\xa4\x57\x75\x6b\x95\x72\x84\xdf\xee\xde\x5a\x8c\x8c\xff\xf0\xc0\xbb\x0f\xed\x2d\x94\xfa\xac\x8e\x2b\x2a\xbf\xc3\x52\x5d\xd2\xa7\xaf\xb4\x5f\x33\x79\xc6\x50\x29\xd9\x87\x3f\xf8\x19\x97\x20\x1d\x03\xb5\xc2\x1b\xf3\x10\x83\x80\x57\x86\xc6\xeb\x3f\x39\x04\xc0\x2d\x56\x89\x66\xac\xea\x63\xe0\xbe\x5d\x62\x2d\x24\xe6\x13\xc9\x62\x40\x2a\x3d\x6a\xdd\xc2\xef\x1e\xb2\x3c\x16\xfc\x83\xf4\x10\x37\xb8\x92\x98\xe2\xda\xe1\x19\xc7\xe2\x4e\x4d\x39\xde\x3a\xcc\x27\xe1\x84\x0f\x71\x3d\x79\xf6\x58\x82\x87\xbc\x97\xbc\x89\x36\x70\x2c\x9d\xa1\x89\xc9\x85\x0c\x5d\x32\xfe\x70\x13\x42\xa0\xd0\x52\x15\x7c\xc6\xb2\xb5\x4e\xa0\xdd\x6f\x33\xaa\xe6\xe8\x5a\xef\xe5\x09\xdd\xfc\xe3\x9d\x59\x04\x8f\xe6\x2f\x86\x1b\xd6\x5b\x6a\xec\x62\x5d\x45\x93\x6a\x72\x5f\x18\x19\xf7\x1b\x70\xd9\xeb\x96\x0e\x26\x18\x0f\x8e\xd8\x10\xb5\x0a\x43\x99\x8b\x80\xe0\x17\xea\x2b\xde\x83\x18\x13\xe9\x25\x41\x0c\x04\x8d\xc5\x7f\x5c\x49\xc8\x65\xbc\x34\xeb\xaf\x62\xba\xe5\xf3\x13\x7e\x54\xe6\x81\xbc\xe7\xb7\x7f\x95\xeb\x22\x12\x20\xf5\x6f\x63\xb2\xb5\x14\xc4\xaf\xba\x3f\x82\x11\xec\xba\x75\xeb\x6f\x6d\x04\xf0\x0d\x56\xaf\xf3\xe0\x7c\xd8\x02\x8f\x7a\x55\x7b\xe6\xde\xde\x25\xa7\x44\xc1\xcc\xec\xe5\xfd\x2c\x9e\x22\x49\x02\x3f\xe0\x8c\x52\x57\x48\x81\x84\x8f\xd5\x3e\xf1\x07\x20\xd8\xaa\xc6\x6c\xe4\x9f\x8d\xe4\x99\x9d\xd3\xcd\x1e\x0a\x81\x12\xa0\x42\x3b\x9f\xa2\xd9\xa5\x0a\x48\x6b\x1f\x90\x1e\xc0\xea\xe7\xfb\x22\x74\xcb\x4c\xde\x11\x6a\xec\x77\x3f\x1d\xa8\x4a\x8a\x2a\xa6\x7b\xb3\xde\x49\xab\x7a\x80\x90\x86\x42\x16\x4a\xe4\x37\x09\x1d\x1c\xb9\x63\x2d\x24\x75\x13\xf8\xf2\x41\x59\xa4\xa6\x2a\xd0\x94\x64\xd3\x4b\x7f\x4a\x01\x5d\x3c\x81\xec\x23\x6f\x3e\xf3\x83\x21\x14\xf4\xb0\xb5\x02\xb1\x7c\xb2\x91\x7b\x97\xea\xe1\x68\x62\x3e\xc9\xbb\x5d\x42\xd1\xc4\xe0\x98\x31\x7c\xda\x5d\x9f\xc5\x4d\xb7\xac\x4f\xbb\x00\x65\x77\xde\x71\x7e\xd2\xc5\x46\x25\x28\x18\xac\xa7\x37\x22\x5e\x4c\x17\xb1\x7b\x03\x5e\x5f\xdf\x65\xd4\x1b\xd6\xcf\xda\xad\xcf\x26\x18\x9a\xa4\x67\xde\xcf\xd6\x0d\x87\x53\x15\x0b\x4d\x9c\x91\x35\x3c\x50\xbb\x44\x31\x42\xfb\xd7\xae\x52\xb2\x51\x2d\x41\xac\x65\x59\x0f\x1b\x95\x5e\xe6\xe3\xfc\x0c\xa8\x9a\x95\x9a\x1a\xbf\xa3\x67\x9f\x9e\x5b\xfa\x79\x7e\x79\x06\x2c\xc7\x76\x92\xa2\x27\x8e\x23\x7c\x9b\xdd\xb8\xab\x7b\x96\x17\x60\x95\x0a\xcb\xdb\x1b\xd7\xaa\x25\x42\xd4\x51\xcc\xee\xa1\x3e\x97\xb6\x2e\xcf\x80\x97\xb1\xeb\xed\xb0\x05\xff\x7a\xa7\xf7\x3f\xef\x64\x1b\x25\xcc\x8d\x42\x78\x35\xb5\xd2\x3c\x4a\x08\x8b\xbd\x19\x03\x38\x96\x16\xd7\x59\xce\x3b\xf4\xce\xde\x42\x06\xdf\xb2\xfb\xfb\x56\x37\x91\x2c\xda\x6d\x33\x22\x80\x2e\x40\x8c\xf1\x48\x1e\xc9\x09\xbc\xe6\x7d\xeb\xc1\xa6\x4a\x26\x8c\x57\x76\x04\x6c\xde\xb4\xe5\x74\xc0\x24\x25\xc6\x45\x7d\x63\xa8\xb1\xa6\x2c\x71\x0b\x3c\x28\xd7\x37\xf4\xcf\x56\xef\xca\x32\x1b\xa6\x50\x1b\x50\xe6\x35\xc2\x61\x56\xb6\x4d\x3f\x79\xb5\x5b\x5f\x59\xf5\xf2\x73\xac\x1a\x97\x87\xea\xd8\x8f\xb2\x04\x44\xa1\xc4\x7d\x6e\x3b\x71\x8c\x31\x81\x8b\x44\x57\xef\x38\x4a\x60\xa7\x0f\x32\x6d\x09\xef\x89\x4b\xb3\x66\x58\x3a\xc4\x13\x4f\xe0\xb6\xc8\x81\x18\x1c\xea\x00\xaa\x8d\x30\x44\xdd\x78\x5a\xd8\xfe\xc5\x3e\x65\x9d\x1c\xd5\xab\x6f\x97\x60\xa0\x79\x16\x97\x7f\xbe\xad\x12\x86\xbc\x43\x5e\xf9\x38\x04\xb1\xe5\xc3\xa4\xad\x17\xe7\x05\x71\x01\x34\x1f\xf7\x08\x9b\x5f\xdd\x32\x8d\xc8\x84\xe1\x22\x6e\x3a\x41\xbd\x88\x6e\x93\x3d\x3e\x9f\xec\x00\x63\x3b\x3d\x8c\xd8\x58\x80\xa4\xbe\xb7\xee\x03\x05\x22\x16\xc9\x30\x11\x6d\x24\x9f\x6f\xe1\x25\x9f\x8e\x82\x5b\x5f\xa0\xac\xdc\xa6\xe6\x9a\xc2\xff\xfa\x34\x41\x98\x28\x3d\xe1\x34\x79\xda\xa2\x1e\x6a\x22\xd3\x59\xe1\xe4\x43\xab\xab\x18\x05\x47\x6d\x20\x82\x81\x25\x14\x07\x55\x1b\xea\xbd\x66\xd6\x06\x8a\x71\x48\xf8\xd0\xa8\x3f\xfa\x94\x0c\xe1\x8f\x14\x6b\x81\xb0\xe0\x19\xc2\x54\xa1\x3d\x94\x9d\x4e\x13\xa0\xfe\x38\x9d\xa1\x0b\xf8\x89\x22\xe8\xcd\x23\x00\xb3\xbe\xff\x3e\xaf\x08\xb6\x58\xda\x5a\x91\x90\x0e\x2b\x57\xb6\xc3\x5a\x8a\xba\x65\xae\x9e\x83\x92\x82\x25\xc5\xb2\xa6\x37\x36\xf2\xee\x49\x3b\xdf\x8f\x07\xcd\x1b\x23\x8b\x37\x90\xfa\xf2\x4e\x09\xbf\xc1\x7d\x84\xdc\xf4\xbb\xba\xcc\xea\xd7\x19\x28\x11\x87\xe3\x38\x8c\xd0\xed\x7c\x39\x0a\x15\x18\xc3\x40\x64\xc5\x4f\x80\x67\x02\x39\xc8\xd9\x50\x0c\x09\x6c\x62\xf6\x54\x7b\x3f\xb5\x74\xdc\xa5\x87\x8f\x9b\x86\x94\x66\x52\xb5\xd9\x94\x72\x78\xa5\x72\x57\xbf\xdd\xeb\xd9\x25\xe7\x87\x5d\x80\x7a\x17\xde\xfa\x87\x08\xd9\x16\x49\xb0\x55\x98\xaf\x93\xe0\x63\xeb\xa4\xea\xbb\xa1\xc5\x46\x01\x12\x72\x60\x8c\x44\xa0\x5e\x7f\xf7\x2b\x27\xf2\x79\x74\x73\x91\xda\x3a\x4a\x11\x4e\x33\x62\xaa\xdb\x0b\x1f\x9c\xb1\x66\x23\x35\x14\xea\x28\x85\x7d\xee\x30\x87\x93\x0b\xec\xed\xa4\xcc\xec\x99\xc2\xcb\x63\x7d\x6f\xb7\xa7\x7b\x64\xea\xeb\xe2\x17\x3c\x81\xf1\x1f\xe0\x13\xcd\x6a\x65\x79\x48\x1e\x9d\x04\x79\xd4\x1b\xc3\xb9\x58\x93\x80\x54\x31\xf4\xe1\xe7\xf8\x08\x90\xa7\xec\xcd\x6f\x24\xe7\xf0\x4c\x86\xa7\x45\xda\x2a\x22\xdd\xbc\x1b\xc8\x76\x3b\xbf\x93\x0c\x35\xf5\xd9\xd1\xfd\x6d\x61\x55\xb9\x4b\x72\x87\xcc\x3d\xf6\xdb\x3f\xe3\x46\x64\x04\x93\xea\xaf\x04\x23\x55\xc7\x41\xde\x71\xde\x75\xfe\xda\xb5\x7a\x40\x72\x0a\xa7\xcb\x47\x0a\xa1\x83\xe2\x91\xfe\x01\x20\x10\xc4\x2c\xb2\x60\x8a\xd6\x52\xfd\xf2\x65\x94\xa1\xcd\x7d\x8c\x0e\xf7\xd7\x34\x13\x3f\x5e\x16\x76\x2a\x39\x00\xff\xec\xea\xc7\x8d\xdd\x56\xf5\xe9\x2a\xba\x99\x76\x0e\xbc\x26\xb8\xd1\x85\x2f\x03\x93\xb0\xbd\x0e\xb1\x63\xc7\xe9\xa2\x42\xae\x6b\x9a\x04\x6f\x91\xd9\xdf\x18\x29\x10\xe8\xc5\x07\xc2\xcd\xdb\x35\x24\x95\x77\x4a\xf9\xfa\xa7\x4d\xeb\xab\xaa\x96\xcf\xee\xdd\x51\x65\x88\xb9\x2c\xf6\xc4\x81\x8d\x7d\x5d\xec\x9b\x3e\xd7\xee\x8d\x87\x5c\x8f\xf1\x94\xd1\xd6\xe2\x5e\x34\xf2\x41\x6b\xb4\x4d\x85\x72\xdc\x25\x59\xce\xe7\xff\xb8\x33\x5d\x2a\xe2\x57\x05\xb4\x33\x6b\xd3\x56\x0d\xdd\xb6\xda\x42\x3a\xca\x3c\xb2\x47\xda\xed\x30\x93\x57\x55\xe3\xee\x6d\x3a\x24\x88\xab\x61\x88\x83\xda\xec\x7c\x67\x9f\xcf\x43\xc9\xef\x35\x95\xcf\x69\xfb\xd9\x31\xa2\x96\x42\xae\x59\x12\x49\x51\x20\xfc\x0c\x0d\x42\x9e\x72\x8d\x58\x04\xe1\x2b\xff\xd8\xf2\x55\xf8\x5a\x54\xc2\x42\x2f\x6b\x35\x98\xd9\x4e\x1d\x59\xf4\xcd\x9b\x74\x46\x8b\x44\x45\x01\x8e\x20\x05\xd1\xab\xfc\xd0\xe1\xe7\xad\x3c\x90\xe4\x3a\xc3\xbd\x3f\xfa\xcd\x3c\xf5\xf5\x36\x24\x79\x49\x43\x8f\x51\xf7\xf1\x9b\x0b\xf4\x84\x99\x96\x9b\x5d\x4d\xac\x31\x92\xb7\x3a\xa1\xda\x8e\xac\x56\xe1\x32\xa3\x7f\x7c\x95\x36\x31\xb5\x58\x28\x46\xc6\xb9\x31\x6f\x93\x4c\x32\x45\xb5\xf9\x9c\x0d\x3e\xb8\xda\x08\x79\x6b\x73\xb5\x7f\x33\x70\xde\xec\x9e\xcc\xbb\xaa\xdf\xf3\xdd\x90\xde\x9a\xfb\x84\xa6\x9d\xe7\xde\xea\xd1\x4a\x75\x63\x81\x0d\xec\x38\xce\xf9\x0a\x10\x06\x25\xfc\x66\x19\xee\xbf\xf6\xa5\x32\xb9\x1c\xca\xde\x44\x06\x22\x66\x39\x6a\x3a\xc1\xb1\x5c\x66\x9a\xac\xd7\x0b\xf3\x09\x4e\x18\xae\xe5\x7c\xa5\xc6\xe4\xc1\x5f\x27\xc1\x11\xf5\x2a\xef\xd3\xdd\x21\xdd\xfb\xd8\x5c\xba\xc2\x4c\x9a\x9e\xf5\xfc\x6d\xb4\x01\xd2\x9e\xaf\x18\x1a\x5c\x63\xbc\x61\xfb\x15\xd8\x51\xec\x47\x63\x90\x84\x4a\x45\x95\x63\x5d\xf8\xf7\x1c\x46\xfd\x76\xe0\xa2\x75\x22\xd1\x7e\xb5\xb1\x6e\x5c\xa6\x5f\xdc\xf2\x94\xb9\x1e\xee\x60\xad\xd6\xe2\xf0\x98\x1e\x85\xfb\x06\x3a\xa6\xfa\x64\x09\xda\xaf\xef\x82\x53\xc2\x5a\xa9\x87\x0d\xa7\x9c\x20\xc4\xbe\xae\x30\x20\x92\x56\x11\xf3\x2a\xf4\x02\x94\x3f\xff\x72\x7d\x8a\x68\xd7\x0d\x71\xc3\xb7\x66\x91\x62\x32\x44\x6f\x7b\x7c\x90\xc7\x53\x55\x54\x10\x68\x96\xa1\xed\xf1\xdb\x7e\xcb\x1e\xea\xe3\x91\x14\x6f\xfd\xfb\xbe\x67\x5f\x04\xb9\x74\x53\x21\xaa\x13\xe5\x06\xe2\xd1\x40\x54\xec\x05\xdf\x4d\x30\x78\x34\x86\xf2\xc7\xff\x3c\x5b\x64\x32\xab\x76\xa2\xca\x05\x50\xc1\x2c\x80\x81\x54\x4d\x6f\xa5\x48\xb0\xba\xaf\x07\xd2\x45\x3a\x20\x3e\x7b\x5c\xec\xfe\x13\x19\x85\xe7\xfc\xcb\x0f\x63\xb9\x8a\x83\xb7\x28\x25\x04\x29\x29\xf3\xcb\x2d\x9b\xf5\x33\x90\x64\xce\x58\xa1\x80\x9a\x00\xc8\xc8\x2d\x8e\x7e\xdc\x90\x05\xec\xfc\x3a\xf0\x82\x1b\x7e\x5d\x9a\x8b\x3b\x5a\x50\x31\xc3\xb5\x7a\xdd\x1d\xbe\x65\x9a\x38\xa5\xcf\x65\xc4\xd3\xf2\x36\x89\x5c\xc0\x08\xf4\x3b\x09\x4f\x88\x22\x76\xb2\x55\x8b\x3a\xc7\x52\x94\x80\xf2\xef\xdf\x38\x57\x32\x2d\xb0\x95\x0a\xc6\x25\xc4\xb7\xbf\x26\xce\xbb\x62\xa4\x80\x95\x81\xda\xcf\x82\xbc\x59\x07\x8c\x2f\x57\xd4\xaa\xb3\x81\xed\x0e\x09\xd7\x33\x1f\xbe\x00\xc0\xa7\xdc\xe3\x37\x91\x8b\x76\x83\xa5\x41\x4e\x89\x24\xf2\x37\x66\x13\x44\x6d\xb1\x6c\x5d\x07\x7d\x39\x89\x65\xe4\x6b\x73\x42\x8f\x89\x31\x32\x28\xf6\x52\x67\xb5\x30\x92\x32\x77\xc5\x7a\x09\x6f\xe1\x41\x12\x47\x27\x9e\xb1\x4e\xf1\xaa\xbe\xc5\x26\xf1\xc7\x91\x48\xc2\x67\x4a\x73\x20\xb9\x13\x89\x4d\x61\x89\xc3\x87\x57\x15\xdd\xe2\x79\x60\xb7\x12\x23\xe0\x9b\x5b\xa5\x1b\x78\x07\x86\x64\x90\xa7\x95\xd7\x52\xa1\x90\x93\xe9\x9a\xbe\x45\xff\xc3\xbb\x05\x5a\x3a\x91\x00\xcc\xc9\x6b\x49\xe0\xf3\x27\x65\x79\x29\x0a\x0c\x6b\xb4\x8d\xe8\x74\xe8\xbb\x85\x09\x35\x88\xcd\xfc\x11\x3c\xdd\x37\x52\x97\xea\x2b\xd5\x04\x86\x00\x88\xf5\x57\x67\xed\x42\xc2\x58\xee\xb8\x01\x5b\xec\x87\xa2\xbf\xdf\x5e\x64\xa1\x8a\xad\x22\x2b\x73\x6e\xea\xac\x21\x0d\x2e\x58\xb3\x3e\x1a\x04\xee\xf5\x65\x37\x86\x48\x04\xf3\x1f\x5d\x93\xeb\x7d\x5c\xd1\x10\x67\x68\xf2\xb5\x7e\xea\xc8\x04\x19\x7a\xf1\xed\x1c\x7e\x66\xf7\x07\x1e\x0d\x25\xdc\x2a\x37\xc1\xd6\xb1\xaf\x6a\x35\xac\x10\x38\x75\xb4\x9d\x04\x96\x8c\x27\x54\x3c\x2d\x26\xdf\xfe\x9c\xb7\xa3\x04\xf9\xc8\xf8\xb3\x22\x03\xb5\x5c\x12\x10\x97\xa3\x39\x0e\x33\x9d\x8c\xa6\xc1\x7f\x51\x30\x22\xec\x02\x3e\x4f\x54\x1f\x16\xb1\x14\x92\xf8\x9c\xbc\x56\x14\xe6\xc4\x4d\x15\xec\xb3\x50\x7e\xe2\x93\x5e\xf4\xe5\x2c\x46\x46\x59\x9f\x5c\xbe\x1f\xad\xb1\xef\x0c\xb1\x00\xe0\x81\xc6\x35\x5e\x6a\x65\x54\xc8\xaf\x31\xb0\xc1\x29\x84\x61\x58\xee\x4c\x1f\x4e\x45\x49\xbe\x05\xfb\xf7\x1d\xa5\x6b\x24\x01\x0b\x95\x9e\xb1\xd3\x9c\x06\x7b\x05\xc1\xc7\x00\xfe\x87\xb5\x98\xc4\x71\xf7\x28\x64\x7c\x96\x68\x5e\x5b\xe1\x7e\xd4\xc7\x21\xf5\x5f\xf1\x88\x77\x00\xf6\x6a\x2c\x56\x3f\x44\x9a\x24\x84\x15\xd8\xce\x48\xa1\x05\x6d\x87\x1f\x3b\x50\xaa\xb4\x10\xea\x75\x7b\xe3\x38\xe9\x48\x0d\xff\xf1\x7d\x73\x04\xc6\xdd\x19\xb0\xd5\x1c\x5c\x04\xcf\xd4\x21\x6b\x0c\x15\x6d\x73\x5c\xfc\x79\x8a\x48\xd8\xf2\x0c\x96\xe1\x8d\x19\x57\xa7\x50\x56\xe4\x34\x0a\xf0\x73\x7c\x75\x77\x8d\x11\xec\x24\xac\x1d\x88\xc9\xb9\x2e\x19\x6d\xb1\x0d\x6f\xba\x00\x74\xd2\x56\xfd\xbe\xbb\x77\xf9\xd2\xe8\x10\x96\xa9\x89\x82\x53\x1f\x3b\x8a\x23\x1d\xd1\xd4\x33\xdc\x5e\xc7\x03\xac\xd1\x31\x7a\xf0\xdb\x26\xb7\x2c\xa1\x2f\x0b\x5e\x1f\x87\xc1\xb0\x27\x3d\x08\x8c\xbf\x21\x71\xb6\x8b\x43\x72\x07\xae\xe3\x0c\xba\xff\x86\x00\xe1\x79\x2a\x72\xcd\x11\xb0\xaf\x98\x08\xca\xfc\xea\x3b\x0d\x49\x85\x41\x1e\xf5\x86\xe0\xe7\xd1\x90\x31\x99\x08\xe1\x5f\xfb\xa0\x0c\x89\x38\x69\x8c\x22\x7d\x89\x6c\x8e\x35\xde\x67\xb5\x64\xb4\x32\x08\x4f\xa3\x6f\xbd\x16\xd3\xe8\xc7\x98\x59\x28\xd0\x71\x5a\xc9\x0a\x9f\x7f\x78\x86\x41\x08\x2e\x46\xcf\x06\x29\x74\x82\xe1\x06\xa6\xd2\x8b\x94\x60\xc7\x61\x15\x94\x34\xab\x12\x50\x97\xbe\x89\xd8\x74\xff\xdf\x6f\x64\xe0\xaf\xde\x41\x0b\x0a\x3a\x88\xa7\x19\xb0\x54\x21\xd1\x61\x4d\x8d\x5f\x77\x1b\xa5\xb6\xd8\xec\x1a\x5b\x83\x4d\x53\x44\xba\xad\xd5\xdb\x8f\x43\x93\x92\x30\xac\xcd\x4b\xa6\x58\x5d\x0d\xc3\x06\xec\xd7\x84\xe6\x44\x98\x1f\x36\x88\xaa\x5b\xbc\x53\x7c\x53\xe6\x63\x4c\x11\x52\xad\xdd\xfe\xc9\x1d\xc8\x8c\x44\x61\x2c\x61\x7d\xf8\x98\xa7\x17\x56\x30\x14\x82\x73\xbc\xe6\x2a\xc1\x43\xce\x46\x51\xa4\xe6\x91\x5a\x4f\xcd\xa9\xc1\xbe\xe0\xf1\x8f\xdf\x8a\xe2\x47\x8d\x1a\x6f\x70\x85\x82\x1e\x8b\x0a\x4a\x41\x10\xa8\xec\x82\x20\x0b\xec\xf3\x61\x43\xc7\x73\xda\x82\x68\xe3\x9b\x57\x0c\x04\x09\x64\xd2\x3f\xe3\x5c\x19\x35\xcb\x87\xad\x92\x95\x2e\x7a\xd2\x3e\x47\x54\x8c\x69\xba\x1c\xaa\xc1\xe5\xad\x7b\xce\x94\x16\xa1\x4a\xae\xa0\x68\x4d\x11\x3f\xd4\xa6\xf6\x1a\xb6\x20\x02\xc9\x60\x26\x30\xfd\xa8\x9c\x89\xa2\x51\x26\x37\x08\x2b\xe7\xc3\x08\x59\x03\x81\x50\x2a\xd6\x41\x0a\x7e\xf8\x16\xfe\xfc\xc8\xa2\xcb\xc5\x6d\x81\xfd\x93\x14\x2f\xd2\x4a\x54\x79\x3d\x2c\x2d\x0b\x51\x4c\xfa\x67\xa2\xa5\x90\xe6\x59\x61\x1e\xe4\x52\xc8\x0d\x52\xc9\xf5\xbf\x31\x42\x24\x14\x4b\x0a\xea\xeb\xcc\xde\xfc\x5e\xe7\x92\x50\x6b\x5d\x14\xea\xd7\x5d\x3c\x1c\x23\x7f\xb6\x5e\x29\x6d\x8d\x4b\xd6\x34\xf7\x8f\xce\x26\xeb\x83\x8f\xf1\x50\x2b\xeb\xe6\xd8\x6a\xcb\x1e\x0d\x25\xb0\xe6\xde\x35\x7a\x99\x0b\x4e\x74\x20\xa0\x34\x40\x5f\x93\xda\xf2\xd5\x95\x5b\xf9\x71\x54\x83\xb6\x5d\x86\xc5\x55\x29\x94\xd9\x48\x36\x23\xd6\x10\x00\xbc\xe9\xd6\xe6\xcd\xb0\x34\x98\xe4\x61\xf5\xb8\x85\x32\x0c\x58\xa7\xff\xf9\x9d\x29\x5a\x4e\x6d\xe6\x03\xc1\x48\x83\x2f\x7d\xe8\xa8\xc9\xe8\x18\xad\xea\x2f\xa6\xf7\x36\x1d\x38\x8c\xa1\x74\x2b\xca\xa4\x49\x5a\x4d\x7b\xdc\xd6\x51\x2b\xdd\x18\x28\x9a\x7c\xe0\x73\x4a\x2c\x70\x7a\x3e\xfe\xac\x2f\x29\x06\x0b\x3d\x39\x86\x52\x00\x21\x13\x25\xc0\xef\xad\x96\xd5\x53\x11\xd5\xdf\x5f\xab\x4e\x8a\x1b\xbe\x4e\xf3\xf9\x9d\xc1\xb6\x2c\x87\x0c\x70\xfa\xf9\x08\x70\xda\x90\x24\xb7\x29\x82\x0a\xc4\x16\xf1\x5f\x3d\x88\x51\x0d\x1d\x94\xfe\x55\xf8\xe5\xe4\x84\xc8\xdc\x86\xa7\x80\xf9\xd2\x17\xde\x67\xad\x80\x35\x98\x38\xa0\x65\x78\x3b\xa3\x1b\x47\xba\xa6\x09\xb1\x1d\xdd\x6d\x2e\x03\x31\x80\x88\xad\x02\x07\x72\xb5\x14\x1c\x17\xe5\x94\xad\xfc\x33\x40\xca\x50\x3e\x57\xb3\xb8\xe7\xd5\xbc\x58\xcc\x86\x08\x7b\x3c\xd1\x43\x3f\x5f\x19\x14\x60\xea\xb7\x52\xb3\xf8\x43\x1c\x0c\x91\xe7\xac\xd0\xe4\x4a\x51\xc3\x80\x87\x40\xef\x39\xcd\xd5\x67\x1e\x71\xc3\x03\xab\x56\xe3\xbe\x00\xed\x3e\x58\xa5\x04\xfc\x64\xe6\xf8\x8c\xd1\xdc\x01\xe8\x5c\x28\xa3\x80\xa5\x18\xe6\x66\x30\x23\x4f\xb4\xc1\x5d\xeb\x44\xb2\xf8\x99\x8f\x40\x2b\x50\xd2\x99\xaf\x2c\xbd\xdf\xad\x87\x79\x9e\x22\x7e\x92\x55\xbd\x23\x2a\x57\x7b\xa6\x18\xa7\x7c\x21\xc0\xaf\x82\x95\x44\x1b\xa0\x08\x32\xc2\xae\xb5\x1e\x96\x3d\x5b\xa7\xbc\x4c\x56\xbc\x34\xfd\x72\xf8\x7b\x9a\x1d\xe4\xb6\x4e\xde\x32\xc8\x79\x6f\xa1\x41\x1a\x07\x18\x57\x8f\x46\x25\xdf\xde\x8e\xed\x40\x12\xfc\x36\xbb\x59\x96\x41\x30\x01\xb6\xb8\x22\x1f\xca\xf9\x31\x63\xe2\x70\xcd\xc8\xa9\xf7\x26\xad\xbb\x1e\x93\xd4\x01\x59\x79\xa1\x46\xa8\xe5\x13\x7d\xd9\x87\x86\x0d\xcf\x5b\x35\xdb\x6a\x7f\xc6\xd5\xf9\x1d\xbb\x24\x94\xaf\x5c\x37\x1e\x84\x68\xb1\xab\xf2\x90\x35\x88\xca\x12\x4e\xb7\xb7\xf5\xab\xe9\x55\xc0\x7f\x6b\xee\x5f\xbb\xa5\x6a\xa7\x1c\xdd\xaa\x31\x9c\x7c\x2e\xe6\xf4\xd3\x62\xb2\xb2\x48\xb1\x92\xf4\x6d\x15\x7d\x4e\x01\x51\x6d\xa7\x9d\x92\x1b\x37\x26\x6f\x46\xe9\xdf\xd9\x30\xb7\x3d\x25\x28\xd8\x1b\xd7\x5d\x3c\xdf\xb8\xd0\x17\x39\x55\xa2\xde\x2c\x43\xd1\xa7\x40\xff\x35\xd1\xc3\x0e\x0f\x93\x6c\x29\x81\x92\x64\x24\x3a\xcd\x91\xf2\x9e\xe9\x11\xd9\x75\xf4\x19\xd2\x21\x95\xb1\x5d\x4d\x9f\xb8\x34\x1c\xe9\xe3\xbc\xe1\xae\x17\x6e\xe1\x6e\xf7\x75\xbc\x42\x48\xe1\x68\x34\x2a\x90\x40\xf0\x0c\x9e\xee\x60\x2b\x50\x33\x7f\xf9\x6e\xce\x19\x40\x9a\x01\x4b\xdd\x9b\x9d\x11\x80\x98\x77\xb0\x03\x4e\x3b\x10\x9c\x3a\x2b\x9a\x78\xe8\x0d\xf8\x1a\x6d\x40\x62\x66\x49\xfa\xfe\xfe\xae\x2f\x2f\x87\x7e\x91\xd4\xc0\x39\x09\x9f\x5f\x79\x8c\x7c\x99\x30\xee\xbd\xb9\x42\xcd\x0b\xb6\x19\x2c\x53\x0a\x20\xa6\xfd\x97\x53\x38\x2d\x5d\x97\xbc\xc0\x08\x3e\x3a\x1f\xe7\x74\xc4\xa3\x77\xef\x1e\x23\xe0\x36\xac\x91\xf0\x09\x88\x1e\xe9\x43\xd4\xf2\xe1\xce\x63\xf7\xfa\xbd\xa8\x75\x6b\x22\x72\x81\xe9\xc1\xb0\xd1\x91\x69\x76\x4d\xeb\x24\xa9\xdf\x09\x78\xdf\x5b\x47\x28\x59\x02\x08\x03\x4a\x21\xff\x8b\x31\xd4\xe5\x97\x95\x13\xd1\x9a\x62\xc3\x35\x86\x97\x9d\xde\x6a\x09\x5b\xa7\x40\xdb\x74\x57\x63\xb1\xc4\xb7\x84\x07\xa4\x59\xe8\xb3\xc0\x5d\x80\x89\x14\x0f\xde\x5f\xe2\x7e\x78\xd7\x66\x8b\x3f\x62\x3f\xad\xdd\xf0\xe9\x46\x62\xc6\xc8\xb2\x2a\x52\x96\xcf\x98\x40\xaf\x0a\x04\x62\x00\xe2\xb0\x5d\x82\x0d\x82\xde\xcf\xd4\x6f\xae\x52\x1f\xb0\xfb\x48\x3e\x11\xfe\xd5\x31\x30\xe6\x4c\x20\x49\xe1\xe6\xa2\xcb\xfa\x05\x92\x35\xd5\xf9\xc0\x37\xae\x3e\x6b\x81\xd9\x43\xfd\xe3\xb9\x7c\xf5\x9b\x60\xcc\xef\x23\xee\x68\x5b\x22\xa3\xaf\x2b\xf5\x30\xf7\xb8\x0a\x86\x24\x95\x23\x8a\x99\x6c\xaa\xfb\x69\x98\xf4\xe8\x1b\x50\xbc\xc3\x8c\x13\x7e\xdc\x3a\x3d\x02\x48\x9b\xd1\x63\x75\x0e\x52\x23\x35\x06\xf1\x0c\x89\x14\xae\xe3\x94\x10\x0a\x08\x2b\x07\x62\x34\x84\xf5\x00\x64\x7e\x71\x5b\x92\x48\xc7\x72\x19\xdd\xee\x06\x65\xd2\xe2\x3d\x33\x0f\x5e\x4c\x21\xd6\x93\xf6\x14\x0f\xf1\xbf\xe4\xc3\xee\x3b\x2e\x4f\xf6\x96\xca\xdf\x75\x94\x30\x0a\x86\x2e\xdf\xed\x0c\x21\x9d\x1d\x61\x6f\x80\xed\xcb\x63\x39\x5e\x31\xbd\x64\xee\x8a\x8e\x32\x35\xbb\xd1\x2d\x79\xd6\x9f\xef\xe7\x79\x37\x80\xe5\x31\x3b\x27\xf3\x1c\x60\xc6\xca\x1b\xfd\x1e\xf0\x57\x3d\x62\x87\xb9\xe9\x3a\x4a\x55\xb6\x73\xf2\xf8\x2c\x50\x57\x7a\x15\x70\x16\xb0\xf7\x90\x7b\x6d\xcb\xe8\x2d\xeb\xa7\x7b\x96\xaf\x38\xf9\x7e\x75\x9c\x4b\xde\x6f\xcc\xc4\x26\xf1\xca\x6f\xe6\x64\x71\xaf\x5d\xd9\x39\x78\xd1\x11\x82\x1b\xeb\x8e\x8b\xba\x63\xc0\xd8\xa6\x26\x9e\xde\xf1\x95\xbd\x91\xca\x24\xa4\xe7\xe5\x71\xe5\x9f\x5e\x24\xc3\x6c\x34\xa7\x20\xad\x4d\x3c\x18\x2d\x3d\x85\xba\x3e\xf4\xf7\x9d\x44\xbf\xa6\x48\x13\xc9\x58\x17\x1b\xcc\xe4\xc9\x78\x68\x85\x58\xfd\x62\x4c\xa4\x80\x44\x78\xa2\x21\xb7\xe7\x2d\x0c\xe1\xe8\x1d\x8b\x79\x4f\xf6\xd7\x5a\x61\x65\x3d\xc8\xe1\x47\x0e\x85\x8a\x9e\xa9\xdc\x29\x27\xbb\x3f\xfc\xc6\x73\xfb\x95\xed\xcb\x12\x10\xcf\xf1\x99\xa5\xcf\x16\xab\xca\x07\xf6\xd5\x9f\x0f\xf0\xe7\xe9\x99\xcc\x55\xbb\x85\xd7\xbb\x83\x22\x6f\xf5\xf7\x8d\xb4\x6c\x31\xae\xba\x8d\x07\xa6\x43\x84\xb3\x4a\x5e\x3c\xc0\x90\xfb\xdb\xe3\x33\xc1\xa8\x11\x67\xc6\xd8\x30\xd7\xbd\x99\x80\xd8\xd5\x06\xd7\xe6\xa7\x4f\x6d\x57\x45\xb7\x04\x68\xeb\x36\x42\xab\xb3\x22\xda\xfa\xe4\x8f\xe7\x33\x42\x92\xf6\x15\x3f\x1e\x0a\x5a\x75\x1a\xc6\x95\xe2\x44\x69\xe6\xd1\xc6\x6c\x5e\xf2\xf7\x87\x26\x60\x72\x1a\x5c\x75\x92\xe8\x17\x75\x28\x35\xbf\x26\x8e\x63\xe5\xce\x85\x2f\x38\x90\x6b\x96\x8d\x5b\xa2\x92\x2a\x5c\x5f\xa3\x06\x17\xd2\xbf\xf2\x40\x0c\x55\x5e\x67\xcd\xb2\xef\x23\x40\x71\xd6\xa0\x24\xe6\x17\xfe\xba\x0d\xe6\x49\xad\x1a\xee\x1c\x2b\x7c\x6f\xcc\x70\x0c\x6d\xd6\xdd\xd0\x66\x99\xa1\xd6\xb9\xbd\x65\x00\xf0\xc7\xfe\x0e\x07\x9f\xa4\x18\x80\x2b\x93\x8a\xc1\xcb\x0c\x0f\x2c\x62\xa7\x29\x86\x5e\xbd\x77\x5a\xd5\x86\x13\x60\x2b\xb9\xe8\x53\x1d\xaf\x05\x1e\xe4\xd5\x10\xf7\x05\x52\xfd\x88\xbf\x6a\x99\xd8\x23\x11\x57\xf5\x09\x47\xbf\xe2\x8d\x21\x08\x8c\xe1\x57\x63\x69\xc5\x34\xfe\x8b\x84\x90\x61\xce\xf9\xe1\xeb\x2b\x1c\xbb\xc6\xc5\x96\x28\x2b\xc9\xcd\x16\xb1\x4c\x84\xb2\x83\x71\x4c\xb7\x9e\xb1\xb9\xbc\x5f\x77\x47\xbf\xd1\x4a\x62\xf7\xae\xf8\x8c\xd6\x7e\x24\x8f\x0f\xe2\x02\x2e\xd5\x37\xee\x1d\x62\xd6\xe6\xb1\xbe\x1f\x1d\x81\x76\xd2\x94\x2f\xb2\x15\x03\xfb\x71\x38\xf3\xde\xc1\x80\x8b\x00\x5e\x5a\x31\x41\xea\xf4\xe6\x7e\xee\x3d\x9a\x5c\x5c\x6a\xff\xcd\xef\x0c\x61\xf2\x26\x17\x7e\x3e\xd5\x7c\xdf\xaf\xe1\xc8\x32\x53\x92\x6c\xa3\x34\x46\xa1\x63\x69\xcc\xcb\x4b\x34\xc5\xb8\x02\xf4\x05\xc4\xf1\xd3\x74\xf6\x09\xd5\xfb\x93\xff\xe2\x07\x61\x99\x52\x60\x0a\x8f\xf4\x31\x2c\x08\x30\x0e\x39\x37\x60\x3c\xc7\xd7\x42\xb1\xdc\xe2\xe5\x8f\x00\xb4\x7d\x53\x15\xa1\xff\xa3\xe9\x3a\x96\xdd\xc6\x95\xe8\x07\x71\xc1\x9c\x96\x92\x98\x83\x98\x83\xb8\x63\x14\xb3\x98\xd3\xd7\x3f\xf0\x7a\xde\x4c\xb9\x5c\x75\x6d\x4b\x24\xd0\x7d\x02\xd0\x40\xbf\x53\x0f\x60\x01\x0b\x4c\x74\xac\x76\x6c\xdd\x10\x4c\x2f\xbf\xf3\x1a\xaf\x80\x78\x33\xff\x5b\xe3\x1e\x82\x69\x6c\x1e\xcd\xdf\x9c\xcc\xbb\xab\xe9\xce\x6b\x2f\x25\xd2\xf5\xe3\xb9\xdb\x6d\xc5\x5b\xd4\xa5\x1f\x19\xb8\xa5\xb0\x0b\xca\x81\x58\xea\x33\x80\x91\xec\x9b\xf6\x28\xfc\x3e\x1b\xaf\xf1\x52\x64\x2a\x81\x12\xb5\x01\x3a\x18\xca\xd5\x7c\xe1\x86\xfb\x66\xe2\x92\x24\xac\xb4\xd7\x32\x7b\x9d\x75\x7f\x32\xad\x55\x69\x59\x68\x3a\xc2\x97\xe1\x96\x86\xfb\xf7\xdd\x9c\x72\x5f\xdf\x64\x4a\xf5\x2e\x1b\x37\x2f\x3e\xa3\x21\x39\x19\x5f\x26\x5a\xf2\xa1\xef\x37\x17\xcc\x57\xcf\x85\x83\x2d\xfe\x88\xde\x70\x27\x20\x61\x7c\x9b\x94\x5f\xa2\x91\x5e\x1e\x02\x22\x64\xbb\xd7\x48\xe3\x29\x90\xb7\x8e\x0d\x2a\xba\xcf\x00\x2e\xda\x58\xd4\x21\xb1\xf4\x60\x68\x6a\xc0\x03\xe7\xe8\x10\x7f\x91\x1c\x10\xcc\xa3\x17\xdc\xf7\xbc\x14\x8d\xc5\x0b\xd5\x21\x37\x38\x29\xf6\x28\x25\x9d\x86\x68\x09\xff\xad\x87\x34\x24\x5b\x1d\x80\x65\x81\xc2\x68\x6e\x2c\x77\x38\xdd\xd0\xc5\xda\x73\xd2\xbc\x34\x07\xd6\x8c\xe8\x24\xd6\x0b\xb1\x65\xa9\xde\x43\xfa\x71\x95\x86\xd7\x43\x66\x8b\xb0\x60\xe5\x5f\xf3\xd2\x95\x7b\x2d\x40\x89\x0d\x52\x45\x68\x37\x8a\x44\x72\x4e\x1e\x3f\xf1\xcb\x34\x4a\x19\x6f\xb9\xed\xbe\xf5\xef\xa2\xda\xcd\x0f\x05\x7e\x84\xf7\xfc\x9c\xd3\x23\x96\x2f\x20\xf1\xb4\x8d\x00\x9e\x45\xdd\x7a\xce\x5d\xf8\x92\xf7\x5b\xc4\x3f\x1d\x02\x23\x4f\x79\x07\x78\xa9\xbc\x84\x73\x5e\x54\xcf\xa0\xbe\x1c\xf0\x95\x04\x53\x6b\x57\x66\x87\x03\xfa\xf8\x65\x02\x1f\xdd\x9a\x90\x6a\xb1\xd5\x0a\x07\xf9\xee\xce\x6e\x3b\x19\x16\x47\xd3\x4a\xbb\xcc\x60\x0c\xa6\xe2\xbc\xdf\xc8\x96\x6e\x02\xb3\xb7\xc5\x92\x71\x1e\x69\x26\x24\x9c\xc4\xbc\x5f\xe4\x41\x3a\x1c\x6e\xdd\x89\x9f\xfd\x2b\xf7\xc0\xfb\x12\x58\x63\x4d\x5a\x35\xf0\x45\x98\xc8\xd2\x5c\x99\x7c\xff\xa3\xf5\xef\x4d\x39\x4f\xc5\xe6\x05\xef\xf6\x33\x0e\x4f\xfc\x50\xf9\xfe\xe9\xf3\xf1\xde\xc8\xc7\x10\xd7\x97\x67\x10\x58\xd5\x8c\xed\xd9\x17\x4d\x54\x44\xd3\x22\x34\x0b\x62\xfb\x82\x55\x89\xeb\xb6\x90\x28\xda\xe4\xd8\x92\xf8\xf4\x66\xe3\x36\x8b\xd6\x7a\xf4\x1b\x54\x5f\x18\x39\x85\xef\xa6\x23\xd3\x5c\x1e\xbf\xf7\x28\x2c\xe4\x51\x52\xe6\xc2\xe2\xf7\xcd\x7e\x1e\xd5\x38\xb9\xa4\x28\x73\xaf\x06\x8f\x28\x6b\x5e\x03\x6a\xf2\xcb\x58\x0f\xf7\xf3\xce\xc1\x5b\x94\x2d\xca\xb2\x7d\x06\xe6\x1f\x77\xec\xbc\x06\xcf\x19\x8f\xec\x01\x28\x48\x53\x3c\x2f\x10\x9f\xe6\x64\x50\x9e\x9e\x1c\x85\xc7\x0d\x97\x94\xcb\xe1\x0f\x8d\xe3\xb6\x0a\xde\x76\x6f\x52\x7c\x3d\x30\xf0\x9a\xe0\x12\xb6\x0d\x85\x49\x16\x3a\xb2\x68\x99\x84\x9f\xa2\x33\x23\x41\x29\x53\x1a\x3d\xfc\x89\x82\x05\x88\x82\x0c\x4f\x71\x45\x05\xa2\x80\xa3\x61\x0f\x5d\xdf\x48\xe7\xbc\xc7\x79\x79\x86\xc2\xda\x34\x4e\x3a\x78\x8f\xb5\x3d\x3c\x82\x21\xf9\xaa\x3e\xbf\x9b\xc6\x60\x7b\x38\xee\x8f\x2f\xf2\x5f\x9e\x4b\xda\xa9\xf7\x58\x7b\x1f\xbc\xdf\x5f\x9c\xd8\xbb\x4c\x60\xf9\x8f\x51\x78\xdc\x05\xb9\x47\xbe\xbc\x37\xed\x53\x83\xef\xf6\x56\x6c\xc1\x67\xa6\xef\x58\xca\x91\xa3\xbf\x5c\x7f\xd3\x48\x25\x53\x47\x10\x1f\x8a\x21\x2d\xd5\xec\xff\xe4\x6f\xb0\x6c\xb1\x51\x4f\x3c\xcd\x86\x4a\xea\x5f\x4d\x96\xf7\xa8\x01\xb8\xaa\xfd\xc9\x44\x4e\x59\x4e\x74\xb6\x80\xa0\x5d\x03\x16\x0f\x12\xd9\xd1\x97\x36\xdc\x17\xfc\x36\xaf\x27\x26\xc9\xea\xfc\xcf\x93\x3a\x3a\x25\xf3\xce\xbb\xd1\xcb\xbe\xba\x41\x00\x73\x1a\xfc\x20\xa9\x81\x76\x2a\xc9\x51\x05\xcb\x50\x70\x83\xd6\x7b\xd7\xb3\xed\x56\x2f\xd2\x25\x61\xf1\x06\x30\x27\xfb\x08\xd4\xc7\x67\x69\x55\xc0\xaf\x3d\xea\x44\x25\xce\xda\x63\xeb\xc5\xb5\xf2\xad\xaa\xd9\xeb\x9b\x70\xc0\x5e\xf2\xdb\xa1\xc5\xba\x32\x7e\x67\xad\xc6\x13\x10\x3e\xd1\xde\xde\xb7\xa2\x82\xcf\x8c\xfa\x4a\x2e\x0c\xec\xe3\x8d\x93\xc0\x2d\x20\xe2\x9f\xc8\x17\xeb\x57\xf0\x7c\x5c\xeb\x64\xb9\xc6\x8f\x91\xd1\xdf\x97\x06\xc3\x1c\x55\x5c\x10\x53\x6c\xd2\x42\xb0\xcb\x13\xe8\x5b\x98\x65\x83\x20\x9d\xad\xdc\x3a\x03\xd7\x1d\x1a\x18\xce\x8c\x25\x28\xef\xb9\xd7\x34\xf7\x30\xa5\x7e\x42\xd7\xfb\xe4\x51\x67\x2c\x1f\xe0\xcf\x1e\xbf\xd7\x70\x91\xef\xfb\x3a\x34\xa2\x7b\xdb\xcd\x3b\xc9\xf1\xf9\x27\x18\x23\xab\x90\xea\xaa\x39\xc4\x98\x71\x39\xfe\x7c\x28\x2c\xcf\x1a\x4a\x8c\x85\x51\xcf\xa0\x23\x9d\xd3\x58\x99\x9a\xe5\xda\x0f\x61\xea\x8b\x65\xf0\xf2\x88\x6e\x39\xd6\x8d\x65\x4d\x5e\x76\x95\x88\x3f\x62\xa3\xd5\xd4\x34\xfa\xc8\xad\xaf\x0d\x97\x7e\xf7\x35\x63\xcc\x92\x31\xa3\x0c\xfe\x96\xac\x34\x64\x71\xd0\x28\xe6\x4f\xff\x62\xe7\x03\xe6\x86\x07\xf3\x84\x93\x2d\x44\x07\x7b\xce\x71\x37\xb9\xa3\xe9\x53\x8b\x96\x16\xb1\x6b\x87\x07\x47\x02\x92\x9e\x78\x0a\xe8\xc9\xbe\xfe\xb8\x52\x53\x03\x77\x4c\x27\xd5\x69\x20\xcf\x0f\xb2\xc4\x61\xd3\xd1\x7f\x78\x02\x57\x5d\xa9\x86\xc8\x4e\x24\x63\x23\xed\x9b\x0a\x72\x1a\x04\x42\xe5\xe3\xca\x13\xd3\x0c\x71\x8b\x3f\xbe\x9d\xb1\xd5\xb1\x89\x56\x80\x27\x63\xc3\xb5\x38\x72\xde\x28\x1b\x75\x2d\x7f\x29\x37\xd4\x12\x94\x6c\x1f\x1f\x24\xcd\x07\x00\xe2\x29\xcf\x94\xf3\xf3\xf5\xdf\x2b\xc2\xc9\x25\x74\xe3\xee\x7c\xe5\xba\x84\xa4\xce\x43\x68\xa4\xea\xb2\x9e\xcd\x28\x1e\xbf\x5c\xe8\x59\xf6\xa2\x89\x03\xce\x96\x30\x79\x07\x95\x2b\x3d\xd1\xfc\x88\x1e\xdd\xcd\x9e\xd6\xa1\xfd\x5d\xb7\x9c\xa7\x0f\xe9\x2f\x86\x82\x7c\x65\xe6\xd8\xb8\xa6\x6c\x04\x13\xdc\xeb\xd7\x6a\x13\x25\x4f\xf5\xbe\x33\xd1\xcb\xd7\x9d\x7b\xda\x79\x47\x52\xe5\x6e\x22\xc0\xea\xd3\x3b\xb5\x05\xcf\x4c\xc0\x26\x29\x79\x24\x80\x56\xd8\xa4\x2f\x2e\x14\x9d\x31\x05\xef\xf9\xbb\x36\x62\x4c\x90\x68\xa6\xd0\x6c\x38\xf5\x0d\xc5\x68\x0d\x6f\x44\x29\x91\x13\xc6\xe0\xb9\x17\x9d\x55\x10\x01\x47\x80\x63\x56\x36\x3e\xb2\x97\x6e\x3b\x74\x06\xa1\xe7\xea\x9f\xf2\x63\x07\x8a\x4d\x86\x59\xa8\x17\xd9\xfd\xf3\xf8\xd3\xa4\xd9\xa0\x29\x91\x08\xd2\x40\x1f\x73\x94\x5a\x9c\xd1\x1a\xcf\x6d\x7b\x1d\x57\x38\xad\xeb\xa6\x8b\xdf\x8b\x26\x15\x84\xf8\x94\xb5\x18\xd5\x8a\x00\x2f\x74\x80\x02\x6a\xa2\x3e\x0b\xe1\x1d\xb8\xb8\x4e\xf8\xf2\xbd\x05\xb0\x75\x8e\x10\xcd\x37\xd8\x35\xa8\x95\xff\xfa\xaa\xbd\xd0\x79\xf2\x98\x0e\xf1\x76\x12\x0c\x2c\xd9\x0f\xb6\x51\xa0\x50\x7c\x1c\x26\x18\x1a\x36\x92\xa4\x9e\x22\x46\x6a\xd6\x7e\x76\x55\xa5\x5c\xc5\x4c\xa2\x3c\x10\xdf\xe7\x83\xe7\x6d\xc3\x9d\xe9\x2d\x84\x4f\x90\x41\xf7\x79\xcc\x9b\x7e\x57\xbf\x8d\x80\x71\x30\x87\x39\x57\x41\x52\x59\x89\x92\x7e\xe4\xaf\xff\x1a\x5b\xbf\xde\x3e\x6f\x12\x6a\x96\x44\x9b\x2f\x6c\x3f\x59\xff\xa3\x24\xd8\x9f\x3e\x7a\xaa\xad\x36\xaf\x78\x7e\x64\xe3\x2f\x88\xf9\x99\xbc\x9f\xcd\xd3\x2b\xed\xf5\xdd\x3e\x34\x08\x61\x23\x54\x9a\x3c\xb6\x80\xc2\x7d\x04\xb7\x17\x92\x65\x69\x8c\xbb\xb5\xc8\xcd\x2b\x84\x1d\xd6\xff\x32\xe2\x12\x68\x44\x6a\x59\x86\x6c\x48\x70\xba\xbe\x0b\x90\x79\xf9\xeb\xfb\x05\x42\x0d\xa0\xfc\x5c\x3e\x15\x5e\x01\x60\x50\x71\x0a\xf7\x82\x80\x5b\x31\x87\xdb\xd3\x80\x98\x8a\x2c\xcc\xb9\x82\x6f\xaa\x94\x59\x3b\x3b\x8b\x4f\x85\xbf\xb1\xd2\x9e\x11\x48\x3c\xb8\x4c\xb5\x3a\x47\x53\xee\x82\xa5\x07\x8e\x2c\x75\xc3\x6e\x1b\xdc\xa1\x65\x38\xfa\xd6\x10\x3e\x3e\x25\xe6\x96\x5a\xed\xed\x9d\x7a\xee\xf3\x69\x56\x2d\x2b\x8e\x68\xbe\xb9\x3f\xcf\x2e\xd7\x53\x98\xe4\x7a\xd7\x1b\xc4\x64\x69\x76\x69\x65\x1b\x97\x3f\xc2\x0f\x96\x66\x5c\xe2\x9e\xf7\xd2\x9b\xaa\x22\x8b\xe9\xbe\x33\x96\x82\xe8\x22\x49\xc8\x50\x26\x7f\x5f\xa0\x29\xde\xbd\x98\x70\x1f\x5f\x38\xfc\x8e\x79\xcc\x88\xf8\xc1\x8c\x4d\xd8\xf5\xec\x05\x45\x2e\x97\x58\xb6\xf5\x9e\xd3\x76\x89\xd8\x2e\x45\x44\xc3\x2e\x48\xa4\xe5\x7e\xfe\x8b\x1d\x31\xe1\x53\x00\x4f\x75\xd7\xbb\xe4\xfd\xb2\x0d\x53\x62\xcd\xa4\x5b\x6b\x9c\x37\x9f\xc7\x7d\x23\x08\xd0\xe6\xdf\x03\xaa\x23\xbd\xab\x55\x7d\x88\x1e\xdf\x32\xc7\x24\x0c\x98\x61\xf5\x6b\xe9\x92\xb9\xc0\xb4\x91\xcb\x96\x88\xbb\xc3\x53\xae\x3a\x10\xff\x2b\x94\x75\xac\x8a\xc6\x4b\x61\xbc\xca\x27\x95\xe9\x7d\x34\x45\x38\x43\x00\x9d\xc1\x51\xa2\x54\x40\x81\xd4\x89\xda\x42\x01\xc3\x8b\x62\xeb\x8e\x72\x38\x97\xce\xe1\x55\x70\xf4\x13\x5a\x5b\x15\x3a\x17\xc4\x6b\x97\x10\x81\x42\x0c\x4a\xae\xd0\x3c\xa1\xe2\x5a\xc9\x21\xc9\x3b\x7c\xcc\xb4\x35\x2c\x28\xd5\x4a\x23\xea\x3e\xe1\x32\xee\xbb\xda\x06\xe3\xa5\x9d\xa8\xdb\x03\x73\xf7\xbe\xd2\x8b\x53\x9b\x77\xb8\xa5\x1f\xeb\x21\xf3\x42\x30\xa1\xa7\x22\xeb\xee\x5c\xed\xef\xe2\xee\x69\xd0\x46\x71\x20\x97\xd6\x63\x0b\x6d\x0a\xfe\x20\x38\x1e\xba\xb5\xeb\x02\x5f\xb2\x00\x87\x2d\x71\x23\x09\xa6\x7b\x40\x60\xba\x08\xa9\x02\x3f\x52\xfd\x29\x9a\x9f\x8f\xb8\x4c\x14\xf3\xf3\xd5\xe3\xf9\xb9\xd7\x6e\x0c\xa5\xd5\xdf\x1d\x9d\xe6\xe1\x86\xd1\xf3\xda\x08\x48\xe0\x44\x22\x65\x84\x31\x1c\x7e\xf0\x8b\xfe\x61\x7d\x9c\x70\x31\xba\x28\xa7\xb1\xb5\x7a\xd9\x22\x73\x19\x3e\xff\xd5\xa9\x40\xe1\x09\x9d\x3a\x86\xb1\x7d\x2c\x10\xcb\x4e\x0b\xab\x4c\xf8\xcc\x1b\x06\xee\x5b\xb4\x17\x76\x5c\x1c\xce\xa0\x3e\x41\xa5\x8a\x19\x54\x74\xef\xda\xbb\xae\x2c\x70\x02\x39\x8a\x2a\x85\x67\xa2\xba\x78\x49\xda\xbd\x2e\xde\xbc\xaa\x3b\xef\x45\xde\x50\xec\x39\xac\x95\x0b\x87\x8f\x17\xd0\x92\xe9\x3b\x2a\xd0\x07\xf5\x77\xef\xcb\xa1\x75\x19\x71\xef\x2f\xfc\xad\xa3\x3f\x87\x5f\x72\x5f\xdb\x15\x63\x5a\x3f\x91\x89\x3f\xd6\x71\x36\xda\x2d\x99\x0f\x31\x2a\x08\x1f\x37\x8e\x4c\x03\xcb\x3d\xc1\x76\xe5\x76\x51\x47\x52\xe0\xef\xb5\x42\x05\x81\x7d\xf6\x0d\xf4\x9c\xa4\x69\xc0\x1f\x3c\x85\x9f\xae\x7d\xdb\x67\x41\x13\xc3\x3a\x8b\xd6\x29\xb6\x5d\x60\x47\x97\xcb\x78\x0b\x11\xb6\xc4\xaa\x62\x6f\xb3\xc7\xe8\x77\xf7\xcc\x50\xbc\x6f\x6b\xff\xf5\x6b\x9f\x65\x7e\x4a\xc6\x38\x3d\x5e\x0e\x7f\x41\xd9\x14\x77\xc3\x4b\x32\xd4\x83\x5c\x0d\xd3\x4b\x90\xec\xdf\x92\x98\xda\xb9\x0a\x2d\xeb\x4a\xb7\xef\xaf\xc5\x39\x8f\x5a\x61\x52\x09\x0d\x02\x71\xb9\xef\xd1\x8a\x27\x9f\x67\x9b\x7b\x1d\xa5\x44\xd6\x85\x4a\xbe\x15\xe7\xad\xe8\xc9\xb1\xc6\x30\x27\xe2\x4f\x7d\x3e\x54\xf6\x8d\x75\x31\xbd\xe2\x57\xe5\x56\xbd\x4c\x6d\x42\x33\xe4\x49\x73\x34\x6d\xac\x1f\x9d\x87\x37\x91\xb6\xfc\xc4\x7b\xff\x4c\xe6\xa4\x18\x5b\x7e\x56\xc9\x95\xc0\x45\xe5\x1b\x14\x7e\xdf\xc4\x7f\xdb\x40\x4f\x5e\xfc\xa1\xf9\x04\x3c\xcb\x61\xb0\x68\x5e\x7a\xd5\xa8\x55\xfb\xef\x5a\xa2\x93\x5a\x4d\x9b\xda\x3c\x79\x55\xf6\xea\x05\xf4\x1b\x0d\xc2\x01\xc5\x18\x6a\x46\x9e\x88\x9a\x16\x21\x3a\x7d\x05\x48\xd4\x22\x7a\x0b\x72\x8f\xa0\x9f\x9f\x4b\x71\x3c\xb1\x12\x54\x23\x25\x9d\x7e\xd8\x85\xab\x3f\xe3\x61\x31\x29\x3f\x7b\x78\xef\x30\x54\x15\x79\xef\x1e\x7f\x75\x69\xaf\x17\xa7\x29\xcc\x43\x8e\xd7\xcf\x26\x54\xcf\xff\x96\x09\xe5\x26\xd6\x55\xce\x88\x6a\xa3\xa3\x61\x7c\x64\xb7\x91\x7b\x74\x39\x41\x2e\x81\xa3\xa2\xe6\x64\x51\xb8\x0d\x70\xff\x70\x0c\x26\x3e\x27\xbd\x25\x8e\xd6\x45\xa0\x02\x7d\x27\x7d\x5e\x94\x70\xcb\x6c\x6b\x1c\xe8\xc4\xef\x75\x06\xb7\xb6\x7b\x3e\x7a\xce\x78\x38\xa3\x07\x5e\x68\xd0\x29\xa2\x7a\x4b\x35\xaa\x0e\xac\x5f\xa9\x0f\x5e\xbe\x7d\x00\xdf\x38\x13\xe2\x3c\x64\xc6\x5d\x20\x58\xaa\xdb\x16\x65\xaa\xff\xdf\x91\x9d\xa6\xa2\x77\xe6\xdd\x27\x3c\x23\x05\xe9\xa8\x2b\xf2\x8e\x77\x39\xda\xf6\xc8\xfa\x71\xed\x7d\xd4\xc9\xb9\xe8\x19\xe8\xdb\x22\x8e\xaa\x9c\xde\x24\x02\x96\x30\xfc\x7b\x0a\xd6\x16\x00\xb1\x39\x9c\x76\x5b\x2d\xfe\xb7\x07\x0f\xd0\x4b\x40\x7c\x7f\xda\x0a\x19\xb5\xf7\xab\x21\x31\x16\xfe\xb1\xfc\x9e\x2f\x96\xcc\xbd\x94\xc7\xd3\xbc\xf7\xd2\xda\x7b\xbf\xef\xde\x69\xf3\x04\x5d\x74\x0e\x6f\xfe\x7f\xc3\x38\x19\x31\x3a\x84\x24\x98\xac\x01\xf6\xf1\x6e\xda\x89\x90\x5d\x81\x56\x5b\xe1\x31\x75\x79\x2a\xef\x0e\x0f\x3b\xf5\x57\x5d\xdd\xd6\x85\x7c\xc7\x02\xfd\x72\xb1\x0f\x4e\x78\x79\xa1\xda\x7a\x4e\x1f\x93\x53\x07\xb0\x4d\x02\x1e\xd7\xed\x2f\xc9\x8f\xb4\x6e\x40\xe3\x9f\x08\x3c\xde\x62\x0d\x86\x80\x48\x8c\x8e\xd2\xa2\xc3\x3f\x1c\x85\xbb\x0e\x12\x33\x65\xdd\xde\x08\xe2\xf3\x96\x7c\x62\xfb\x7f\x8c\x00\xfd\x28\xb6\x6a\x68\x5b\x6d\x2e\x58\xad\x90\xfa\x6a\x2d\x22\x43\xfb\x71\xdc\x4e\x88\x2e\x2b\x0e\x94\xf8\xbd\x55\xb9\x23\xac\xe9\xdd\x33\xe7\x50\x6d\xe0\x95\xfa\x8e\x71\x53\xcd\xdf\x22\x7e\xac\x3f\x85\xf0\xe9\x93\xce\x60\xb5\x1f\x32\x24\xd7\x41\xd0\x36\xe5\x3f\xa3\x67\xfe\x48\x4e\x99\xe1\x14\x7d\x04\x63\x8f\x89\xb2\xee\x6c\x03\x95\xf5\xc7\xe7\xe7\x57\x8f\x7f\xfb\x37\xac\xf2\xc3\xb2\x50\x2d\x36\xd5\x42\xee\xf4\xfb\xcd\xea\x6b\x79\x97\xe0\xcf\x05\xa5\xa9\xa3\x09\x27\x2d\xfc\xc0\xf9\xde\x65\x7d\x24\x93\x5c\x64\xf5\xa1\x09\x8d\x2b\xcf\xf9\x5a\x8b\x87\x35\x48\xb7\xaa\x95\x75\x37\x03\x2d\xd0\x6c\xf1\x7f\x8b\x8c\xc4\xde\x27\xfd\x3e\x7e\x15\x7f\x6b\xb6\x5f\x4a\x41\x0c\xd2\x59\xa7\x6c\xd1\x47\x80\xc6\x87\xf0\xdf\x15\x3f\x5f\x81\x18\xdb\x60\x7a\xe5\x7c\x5b\x4c\x7c\x0b\x1c\x0e\x99\x27\x1d\x65\x48\xe9\x72\xea\xe4\x62\x0c\xa8\x37\x42\x54\xc4\x1b\x1f\x7a\x4a\x19\x36\xd2\xa1\xce\xfa\x38\x5a\x7b\x3e\x70\x87\xa2\xe1\x38\x3a\xf3\xde\x8d\x30\x7d\xbf\x17\x67\xa8\xee\x0d\x3e\xb5\xa9\x78\xb5\x84\xf4\x3e\xcb\x4e\x1d\x84\xf0\x3a\x8d\xec\x0a\xbe\xb1\xa8\xfe\x5b\x23\x67\xab\xfb\xe5\xc8\x8b\x44\x96\x1d\x6f\xbd\x21\x0a\x05\xe7\x87\x42\xcd\xee\xbe\xfb\x47\x34\x05\x19\x73\xf1\xe2\x17\x25\xba\xe6\x14\x02\xf1\xc3\x34\x67\xb6\xa7\x39\x4a\xe6\x53\xe7\x68\xab\x07\x45\xe6\x53\xcc\x90\x2f\x47\xdd\x35\xac\xb2\x2c\xae\x6b\x11\xc7\xab\x5f\x18\xb6\x7d\x55\x3e\xc1\xaf\xfd\xbf\x5a\xff\x7d\xa8\x00\xf4\x60\x93\x17\x8f\xfd\x72\x33\xc4\x99\x14\x7d\x38\x08\xf5\x82\x89\x8f\xf9\x67\xab\x43\x06\x94\x8a\xac\x33\x5f\x55\xfd\x2d\xc6\x56\xbc\x38\xbe\x76\x6e\x6d\x91\xf5\xa9\x7a\x52\xfe\x87\xdf\xf2\x66\x95\xab\x88\x26\xb8\xcf\x6e\xef\xed\x57\x47\xad\xef\xcb\xf2\x34\x16\x62\xe6\x2e\x9a\xb1\x4f\xc9\xf5\x52\xbc\x75\x68\xe2\x20\xb3\xf6\xff\x38\xda\xec\x4a\xec\x5c\x92\x55\x1b\x5f\x21\xfd\x7c\x09\x5f\x14\x4c\xe9\xda\xd0\x9c\xb1\x3e\x00\x0e\x21\xd2\x92\x4b\xa3\x70\xfe\x24\xef\xe8\x79\xb4\xd3\xcc\x76\x9e\x3d\x20\x89\x6c\x13\xc0\x9e\x00\xdf\x45\xa1\x80\x42\xc7\x65\x5b\x4f\xa7\x42\xf2\xb7\xf4\x12\xb3\x2f\xf1\x34\x06\x12\x08\x3a\xfb\x12\x5f\x06\x37\x27\x28\xc5\x3f\x5e\x9c\x8d\xb3\x63\x91\x43\x12\x09\xc3\xfd\x93\x85\x45\x5f\x7d\x12\xe9\x81\x63\x48\xf6\xec\xff\x1b\x6f\xce\x76\xf9\xa4\x86\x02\x53\x72\x44\xc1\xbc\xf7\x3a\xa6\xe1\xb8\x3a\x47\xdf\x16\x38\xcd\x2b\xc6\x4f\x7d\xa3\xe6\x27\xe2\x39\xcb\x8a\xa9\x70\x8f\x84\x0d\x0a\x48\x8b\xec\xe6\x5a\x5b\xa5\xbd\x5c\xeb\xa7\x39\x78\x40\x25\x8e\x7d\xdf\x2d\x55\xd7\x40\x18\x80\xb4\xbb\x48\xf7\x15\x39\x04\xe2\x86\xec\x84\x7d\x3d\x42\x7a\xf0\xfa\xd3\x6c\x8f\xaf\xee\xc0\x97\x53\x8f\x36\x5e\x64\x6c\x4e\xd2\x30\x3d\x31\xc0\x49\x35\x01\x01\x42\xa7\x26\xe3\xe5\x77\xf5\x79\xfa\x5f\xda\xab\xea\x5b\x12\xba\xbc\x25\x57\x77\x2f\xd1\x6f\x10\x26\x2a\x29\x37\x97\xb6\x8d\x41\xf8\xa2\x37\x06\x65\xe2\x3a\x8e\xe7\x45\xa8\x6d\x1a\xa7\x65\x53\x88\x35\x32\x3e\x43\xbd\xfd\x2e\x42\x7b\x88\xcd\x03\x41\xc4\xcd\x8f\x70\x68\x0f\x2a\xbc\x37\x7a\x7d\x51\xab\xdf\xe2\xac\xf8\xea\x2a\xbf\x2b\xa4\x58\xde\x7e\x00\x7c\xfc\xcb\x3d\xbe\x3d\x9c\xb4\x77\x37\x7c\xe9\xd0\x68\x34\x7b\xb8\x7e\x37\xf7\xad\xcf\x45\xf8\xd3\x03\xd3\x43\xc6\x35\x50\x45\x6f\xd1\x1c\xac\x48\x16\x4c\xfd\x7f\xef\x4c\x89\xd5\xd7\x4e\x51\x47\x21\xfa\x91\xd9\xb2\xa5\xea\x1e\x69\x05\xf8\x4e\xef\x3b\x46\xd5\x18\x0d\x33\xdd\x6f\x46\x2f\x0a\xa1\x4a\x87\xd4\x21\xa6\xb5\x98\x1f\x9d\xbc\x02\xad\x9a\xc5\x7d\x8a\x5b\xac\xe2\x2a\x3c\x56\xbc\xb7\x57\xe9\xd7\xae\x08\x38\xe7\xe6\x9d\xf9\x70\xc1\xe4\xed\x82\x12\x7c\x55\xd7\xa1\xe0\xb0\x58\xf3\x71\xa4\xd1\x03\xf5\x73\xbb\xf3\xd1\x3c\xc4\x21\xc6\xbc\x3b\x77\x7e\x84\x87\x55\xbe\xdd\x15\xbb\x7b\xc8\xb7\xd1\x45\x0d\xf6\x27\x38\xe7\x51\xdd\x26\xbb\x86\x58\x8a\x55\x72\x98\xef\x79\xb3\x3d\x8f\x5c\xdf\x56\xc7\xb9\x5e\xda\x7f\xdb\x5b\xf1\x49\xcb\x61\x58\x97\x0b\x01\x54\xff\x99\x5c\xa9\xf7\x8a\xdd\xda\x66\xf1\xb0\x97\xec\x35\x79\x1b\x02\xef\xf9\x42\x5d\x25\x01\x42\xe0\x6f\x3a\x6f\x60\x6e\x86\x15\x99\x8e\x22\x53\x45\x72\x44\x4e\x51\x7c\x35\xaf\x20\x12\x02\x4e\x4e\x6c\x9f\x37\x6c\x8a\x2c\x41\x28\x3e\xd3\xf5\xc4\x54\x28\x4b\xd9\x39\x08\xdb\x2c\xf4\x07\x52\x21\x25\xee\x11\x73\xb7\xa6\x4e\x9f\xf2\xc3\xda\x8d\xdb\x33\xf8\x6f\xe5\xf7\x56\x86\x67\x4e\x22\xbd\x1b\xfa\xfe\xf2\xa9\xff\xf4\x3f\x39\x63\x45\x01\xb5\x6d\x4b\x20\x1f\xa3\xd0\x3e\x3e\x0a\x29\x4b\x8a\xb1\x39\x9c\x78\x68\xe6\x91\xbd\x47\xeb\x7f\x9b\x5a\xcf\xef\x2e\x00\x45\x6a\x16\x18\x1d\x1d\x1a\xab\xbd\x00\xb5\x79\xce\x4f\x49\x83\x2f\x8a\x40\xb1\x21\xd1\x26\xde\xe3\x4a\xee\x0e\xfd\xd6\x99\x55\x69\xf2\x2a\x18\x58\xc0\x7d\xd5\x2c\x00\x43\x1f\xf8\x45\x4f\x8c\xda\x39\x90\x4f\xc5\x51\x54\xa0\x4b\x11\x20\xbc\x30\xbb\xc3\x46\x54\x6c\x53\x5d\xd9\x05\x2e\x53\xa7\x97\x8d\x76\xa5\xe9\xed\x23\x2c\xda\xca\x57\x3f\x4c\xac\x35\x81\x26\x02\x53\xd8\x5f\x64\x03\x90\x42\xb7\xf6\x2b\xcf\x55\x7e\xff\x6a\x3d\x3e\x33\xe6\xbd\x51\xa0\x88\xbc\x79\x37\x6e\x2c\x33\x28\x56\x06\xa4\x3b\xbe\x0f\xc7\x1c\x80\x77\x7f\x72\xfc\x3c\x7a\x3e\xd1\x13\x7a\x01\xe5\x23\x7d\x3c\xf8\x39\xe4\xec\xbd\xcb\x0b\x28\x42\x3f\xdd\xe1\xf1\xbf\x40\x53\x9a\x6d\x5b\xb7\x03\xae\xff\xf5\x83\x7d\xdb\xea\xd3\x09\x43\x9c\x17\x88\xe1\x25\xdc\xf8\x88\xb1\x53\x3c\x52\x83\xa9\x6c\x76\x84\x8a\x93\x7f\x1f\x1b\x4b\x7b\x73\xd6\x8b\x73\xb1\x47\x64\xd5\xce\x75\x18\x63\x1c\x87\xc2\xfd\x33\x11\x67\x83\x42\x5b\x02\xb4\x0f\xb7\x3b\x4f\xa5\xe9\x3f\xb3\xd4\x30\x7b\xb9\x71\x5d\xba\xc2\x3f\x28\x40\x1a\x26\x45\xc8\xe1\xe4\x86\x58\x0d\xb6\x64\xd4\x37\xfe\x50\x52\x97\xad\xbe\xe8\x35\xa7\xb9\x6d\xa1\xb4\xa1\x01\x8b\xf2\x26\xaf\x32\x08\xa5\x1a\xa7\xd0\x48\xac\x8f\x43\xa1\x4e\x6b\x51\x9a\x05\xe4\x80\xaa\x00\x3d\xfe\xf4\x1f\x3a\xa1\x28\xe4\x6d\xa3\xbe\xe2\x5f\x0f\x52\x3b\x3a\xbe\x64\x96\xe6\x63\x6b\x4c\x67\x2a\x7f\x56\xca\xf7\x89\x91\xb6\x24\x1a\x3d\x5b\xef\xee\x94\xf8\xd1\xff\x9d\x3f\xfd\x25\xac\xc6\x33\x40\xf1\x29\x1e\x9f\x0c\x58\x4b\x5d\x4a\x69\xfb\x0c\xc5\xca\x53\xd2\xe4\x0f\x97\xd3\x55\xaf\xb5\xed\x58\x13\x5d\x24\xd1\xd1\xa0\x19\x7e\x43\x3e\x90\x46\xad\x61\x73\xa5\x7e\x1c\x6a\x1e\x40\x98\x99\x17\x60\x27\x8b\xb0\xec\xe7\xb9\x47\xa1\xb4\xf9\x9f\x00\x9a\xda\xd7\xc8\xe3\x96\x87\xea\x5e\x17\xe5\x21\x81\x5b\xd4\xa7\xa9\x0c\x18\x4f\x35\x85\x6b\x81\x69\xf9\x4e\x24\x7a\xe6\xc8\x9b\x7e\x11\x0c\x51\x88\x0c\xfc\x7c\x55\xaf\xe9\x6f\x0f\x50\x77\x44\x36\x5f\xef\x73\xb0\x3c\x6e\x70\xcc\xf3\x3e\xdf\x43\xa1\xc2\xef\xf3\x9d\x95\x67\xae\x81\x71\xcd\x66\x89\x60\xcb\xef\xbf\x0d\x31\xa8\x7a\x2b\xcc\xa8\x6c\xae\xb7\xf0\xde\x67\x4b\x71\xe5\x24\x7d\xf4\xc0\xf0\xa1\xb6\x97\x27\xb0\xd0\x00\x5f\x69\xd9\x13\xdc\x5f\xa4\xec\x45\x98\xc6\xab\xb8\xf7\x05\x64\x36\x30\xc8\x2d\x38\xeb\x45\x9a\xfd\xc8\x99\x5d\x62\xbf\x6f\x7a\xdf\x0d\x36\xb2\x7c\x43\xd7\x3b\xe0\x4d\xf7\xc9\xbf\x29\x10\xa1\xc6\x8c\x70\x93\xf5\x38\xdc\xb2\x9b\x34\x4b\x83\xc3\xb2\x8f\x65\x78\xf1\xf7\x55\x3d\x9b\xe1\x3d\x2c\xfa\xa7\xd9\x7d\xf4\x73\x6a\x5b\x1d\xd6\xfb\xda\xc4\x75\x51\x49\x93\x0a\xe2\x75\xe0\xeb\xb3\x16\xfc\x87\xfc\x91\xef\xf5\x68\x59\xf9\xac\x7c\x62\x10\x4e\x27\xd8\xc8\xc7\x51\x78\x7c\xd9\x34\x20\xd0\x9c\xf7\xe5\xeb\x76\xa0\xb5\x18\xf7\x6f\xf3\xd6\x78\xcd\x11\xa7\x45\xb5\xbc\x76\x33\xa4\xb6\x7d\xef\x51\x74\xbc\x47\x02\x43\x31\x94\xb0\x55\xe4\xf4\x42\x82\x06\x25\x03\xaf\x39\x29\x20\x50\xf7\x69\x91\xd8\xf7\x51\x20\x9b\xc1\xd7\xc5\x6a\x7e\x0b\xd8\xdb\x45\x08\x4d\x0f\xc8\x63\xaf\xc3\xda\x4d\xcc\x96\x93\xdf\x9e\x22\x6e\x93\x1a\x4e\x4b\x1a\xb6\x24\x34\xc1\x27\xc7\x30\x8b\x94\xbe\xbc\x5a\x58\x5e\x69\x92\xdf\x57\xc7\x78\x4c\xd8\xdc\xfd\x47\xa2\xf8\xd3\x3a\x3f\xfb\x79\x74\x38\x60\x03\xc0\xe5\x6b\x78\xa5\x50\x9e\x1f\xda\x6b\x0b\xde\x33\x02\xc4\x21\xc0\xd1\x4b\x30\xc1\xbb\xfd\x61\x4b\x22\x15\x0c\x64\x4a\x60\x48\x7e\xf6\xfb\x2a\x61\x78\xbb\x7e\x1d\xe2\x0b\x36\xf0\xb3\xee\xa1\x1c\x10\x19\xf8\xed\xbd\x61\x98\x9a\x8f\xbf\x1a\x12\xfd\x19\x51\x61\x40\xc5\x99\xd1\x79\x3d\xbf\x21\x3e\x27\x93\xb7\xf7\x1d\x58\x20\x88\x3c\xb2\x8a\x5b\x7b\xe7\x9e\xba\x13\x8a\x25\x1e\x44\xef\x4c\x45\xfc\x6e\x7b\xf8\xa9\xc4\xfc\x38\x0e\xd9\x04\x68\x32\xf9\x8a\x84\x72\xa4\x37\x3f\xe7\x55\xee\xe9\x6e\xbf\x88\xa9\x57\x14\x5b\x1c\xdf\xee\xb1\x12\x05\x86\x69\xf7\xbd\xd7\x3f\x90\x76\x38\xa4\x50\xde\x4f\xad\x19\xf8\x22\xfb\xcd\xe1\x9d\xcd\x21\xc6\xca\xfe\x21\x33\xcc\x80\xfc\x20\x9d\x40\xd0\x73\xb8\x88\x7c\x35\xcf\x44\x01\x61\x45\x97\xc7\x9e\x44\x82\x18\x37\xa7\x6b\x5a\xbc\x7c\xd4\x55\x0b\xf2\x7a\xb9\xec\x76\x25\x62\x45\x24\x20\x7a\xe7\x1d\xe6\x5f\x7f\x9f\x8f\xf8\x04\x8c\xd9\x00\x8e\x3b\x35\x28\x65\xa2\xb2\x6c\xe8\x68\xb3\xf1\xad\x36\x70\x10\x32\x0d\x92\xb4\x46\xc7\xa0\xb1\xd7\xee\x77\x9f\x78\x67\x91\xb0\x08\x11\xb4\x98\x21\xab\x1c\xbf\x24\xf9\x03\x39\xaf\xf1\xe4\x10\x93\xef\x78\x3d\x7c\x3f\xa0\xf1\x4a\x67\x89\x7e\x94\x9b\x41\xb6\x68\xf8\xaa\xc2\x2a\xf7\x62\xdf\x69\x87\xdc\x17\x1f\x98\x58\x6a\xc4\xba\xfa\x3b\x94\x67\x2a\xbf\x86\xfa\x7a\x32\x2c\x7e\x48\xd7\xa7\x49\xa4\x79\x7a\x36\xa1\x5a\x3a\xbf\xc2\x62\x76\x53\xaf\xcc\x07\xe6\xa0\x1f\xee\x45\x64\x33\x12\xf3\x6e\x46\x9c\x71\x10\xda\xdc\x70\xd9\xd3\x42\xb0\xdd\xa9\xd9\xe9\xfe\x2a\xc4\x2d\x9c\x8c\x7e\xa5\xe7\x64\xff\x6f\x6e\x1e\x20\xb4\xb5\x4f\x55\xc1\x0e\x6b\x22\x95\xa9\x9e\x23\x4d\xb0\x11\x74\x7e\x3c\xeb\x78\x2b\x40\x19\xfb\xce\xd0\xe6\x7e\x37\x9c\xc1\xd7\x2b\xd2\xf9\xfc\xc5\x5e\xc3\xca\x36\xf3\xe2\x43\xd1\xcf\x85\x5a\xe8\x09\x72\xf8\xa2\xb2\xc4\xaf\x48\x3c\x2b\x05\xb7\x2e\xa6\xa3\x4a\x92\x58\xfc\x6a\xb7\x28\xeb\x9c\x1b\x1d\xc5\x40\xb1\x00\x6b\x95\x34\xd7\x8c\x8f\x19\x94\x68\xf0\x5d\x7b\x89\x7e\x46\x51\x96\x4b\xfa\xbb\x55\x2f\x5b\x08\x8b\x6a\x89\xdd\x31\xe3\x36\x9d\xff\x68\x95\x25\xed\x05\x70\x6f\x5b\x30\x3d\x03\x5c\x87\x72\x46\x27\xd6\x89\x35\x69\x7d\x95\x92\x3c\x73\x64\xa8\x62\xe1\x0d\xc6\x6b\x34\xfe\xee\xc5\x3f\xbd\x75\x54\xb0\x56\x5f\xbd\x4e\x33\xbf\x82\xc0\x86\xb1\x76\x9a\x55\xdb\x42\xae\xed\xf7\xad\xbe\x80\xd7\x6e\x26\x9a\x6a\xd4\xb7\x56\x9e\xe0\x33\x63\x27\xe3\xb2\x67\x20\xc1\x43\xea\x07\xbf\x84\xc8\x9f\x4b\xc1\xfb\xb3\xc1\x3b\xcf\x81\x35\x0f\xe0\x1b\xbf\xa1\x31\x7f\xf9\xec\xa0\xf1\x1a\x92\xa0\x16\xe0\x80\x76\x22\xc3\x32\x02\x89\x08\xa0\x34\x56\x76\x94\x60\x14\x2d\x62\x98\x38\x1f\xdf\x61\x53\x39\xbd\xab\xdc\xb5\x67\xcd\xe1\x58\xcf\x0a\xb2\x6d\xf1\xf5\x78\x9d\x58\xa6\xb6\x9f\x32\x0a\x55\x67\x1f\xbb\xba\x1e\x68\x35\x14\x49\x06\x2b\x5c\x62\xa5\x1e\x6a\xf6\x42\x15\xea\x9f\x5e\x54\x5e\xf6\xd0\x60\x59\xa1\x13\x3c\x8f\xe0\x6e\x14\x78\x2d\x0e\xf7\x58\x0f\xd2\x4a\xa9\x2a\xbf\x2a\xdd\xf5\xbe\x6a\x56\x73\x98\x0d\xcd\x3b\x84\x09\x20\xe0\x77\x9d\x17\x22\x83\x39\x09\xf9\x0f\x66\x49\xcf\x08\x92\xf1\x8f\x4e\x3d\x5a\xb1\x7f\x85\x8c\x8b\x95\x7b\x04\x55\x57\xc4\xa4\x6a\xb9\x49\xa4\x0c\x92\x19\x6f\x23\x27\x18\x4c\xe7\xf9\xd1\x8c\x48\xd3\x06\x82\x84\x20\x35\xca\x86\x6d\xe9\x1f\x0c\x54\x80\x79\xbf\xf7\x6f\xa2\x6f\xf9\x48\x94\x47\xf1\x64\xca\xfc\xa0\x09\x2a\xdb\x6a\x4b\xb6\x01\x4c\x8b\x70\xbe\xc9\x12\x74\x62\xf1\x75\x45\x5f\xd2\x62\xdc\x7e\x1c\xa9\xd1\xe8\x6f\x57\xfb\xb1\xff\xcd\x43\x42\x1f\xde\x62\xeb\x27\x4c\xb5\x8b\x40\xb0\xb3\xf6\xd4\xf4\xd5\x90\x84\x16\x42\x81\x0f\x70\x87\xdf\x1e\x8e\xbe\xe7\x74\xa2\x24\x46\xbf\x55\x93\x1e\x54\x6f\x51\x62\x15\x2c\x47\xf5\x41\x8b\xe9\x49\x76\xa2\x35\xbe\xe4\xc7\x55\x6a\xd1\xf7\x6a\x38\xab\x91\x83\x8a\x77\xaa\x15\xc6\x75\x1a\x3e\x0e\x3b\x9f\x8e\x67\x4a\xc2\xbb\x1b\xd9\xa7\x7f\x98\x06\x51\xec\x67\x7b\x6a\x64\xaa\x54\xf3\xaa\xcd\x97\x76\x45\x82\xdc\xa3\x41\x82\x86\xda\x31\xc9\xf3\xba\xe1\x0e\x26\x9f\x2c\xfe\x13\x90\x58\x8f\x95\x19\x55\xbf\x76\x27\xf0\x8f\x39\x84\x09\xf9\x6b\x3d\x82\x60\x8b\xbc\x5a\x0c\x3f\xfa\xd2\xcc\xe3\xba\x6e\xdd\x68\x3d\xcf\x23\xcd\x4c\x2c\xb8\x02\x05\x22\x7c\x8a\x02\x90\xc5\xbf\x6c\x7d\xaf\xff\x6b\x15\x89\xc9\x6c\x5e\x0e\xcd\x1d\x03\xef\xee\x82\x17\xda\xb8\xe6\xcd\x37\x06\x4f\x71\xc2\x7b\x4d\x4c\x98\xf4\x59\x65\x04\xf6\xbd\xd6\x40\x46\x84\x22\x9a\x71\x1f\x24\xe3\xed\x9d\x64\xa6\x12\x04\x1c\x8b\xf1\x7a\x41\x81\xc1\xc6\x54\x05\x2d\x9f\xe5\x31\x39\x4f\xfb\x6d\x48\x26\xb3\xb5\x78\xa7\x02\x6c\x12\x70\x68\xec\x9c\x68\x9b\x28\xae\x9b\x46\x2c\x83\xb5\x52\x49\x6d\x53\x93\xe0\x4f\xe9\xc5\xae\x09\x8c\xd2\x36\x81\x37\x21\x1f\xcd\xe8\x46\x91\x7e\x29\xb3\x37\x37\xfa\x41\xbf\x23\x4e\xc9\x33\x43\x42\xee\xa3\x74\x13\x98\xbe\x51\xed\x16\x02\xef\x20\x96\x86\x54\xa0\x81\xfb\x9a\x9b\x0b\xfd\x6e\xb4\xd5\x7e\x81\x47\x7d\xb5\xb0\x44\xc3\x58\xed\x4f\x76\x76\x7d\x03\x77\xb9\x31\xe3\x8b\x7d\xc1\xcb\x90\xdf\xb0\x10\xf1\x78\xd5\xfb\x9a\x09\x1e\xbf\x3f\xcc\x10\x9f\x7b\x3a\xf5\x0c\xd1\x36\x60\x1a\x6d\xf5\x5b\x3d\x75\x65\x35\x90\x17\x15\xa5\x59\x16\xf8\x3f\x24\x7e\x37\x62\x74\x9a\xb2\x52\x52\xba\xfa\x82\x1f\x4a\x0f\xf7\x8f\xa9\x19\x0c\x9e\x30\x9e\x79\x45\x09\x62\x4a\xd8\x1d\xa4\x6e\xc6\xe3\xf3\x99\x4a\x18\xfa\xca\xa6\x5d\xf5\xd0\xad\x2d\x38\x35\x95\xfc\x92\xd2\xba\x0a\x91\xf4\xbb\xae\x0a\x9e\x30\xfb\x95\x92\x97\x19\x43\x46\xe8\x3d\x2c\x7c\x17\x84\x97\xdf\x1e\x69\xf7\x5a\xa3\x28\x7f\xf7\x43\xe6\x8f\x03\x72\xe6\xf9\x3b\xc0\x49\x82\xc8\x74\x74\x2c\xbd\xe7\x83\x6f\x72\x58\xee\x2e\xa0\x98\x3a\x00\x65\xda\x59\xac\xd6\xf7\x69\x49\x51\xbc\xe0\xd1\x92\xe1\x39\x5e\x3d\x67\x26\xc6\x0a\xc3\x2c\x3f\x73\x68\x96\x70\x01\x8f\x6e\xa0\x33\x9f\xd7\xcf\x0f\x0a\xcd\x65\xd8\x7a\xdb\x76\xf1\xfb\x77\xff\xfe\x6e\x3c\xef\x4b\x5d\xe6\xc0\x35\x5e\xa6\x8b\x02\x7f\xdc\xbd\xb3\x76\xdd\x50\xe0\xff\xa9\xf9\xd3\x2d\x4c\x51\x0b\x96\x5d\xaa\x12\x5b\x71\x22\xeb\x94\xe3\x52\x15\x4d\xd4\xae\xea\x98\x75\x35\xfe\x79\x10\xf6\x58\x84\x55\x2f\xf7\xa7\x2a\x7f\xe5\x12\x59\x8e\x77\x9f\x43\xa5\xf6\xdd\xdd\xd7\xbc\x1f\xe2\x4b\xbe\x36\x86\x56\x35\x9b\x6e\x1e\xd9\xb4\xf7\x93\x9a\xdb\x08\x75\xd4\x7b\x22\xeb\x2c\x30\xac\x9e\x32\xf5\x3c\xfc\x7e\x19\xa8\x58\xb4\xfa\x64\x3a\x05\x75\xdf\x25\x3c\xf9\xb1\x76\x05\xa3\x9d\x76\x1f\xa6\x6b\xe4\x52\xba\x80\xc7\x32\x6a\x5b\x3e\xe6\x58\xdc\xcc\x33\x6d\x5a\x5d\xfd\xbc\x88\x4f\x81\x10\x96\x12\xc5\x6a\x37\xc0\x27\xc2\x53\x29\x12\xd3\xd4\x30\x4e\x32\x96\x93\x76\x38\xfb\xbf\xed\x13\xfe\xe9\x61\xf9\xa1\x0f\x8b\xf0\x43\xaa\x99\x94\x1a\xc9\xcd\x34\xa2\x9e\xe8\xea\x67\xbd\xa8\x90\xcb\xf9\xb0\xf8\x41\x19\x84\xa7\x8c\x4b\xa5\x16\xf5\x4d\x28\x8d\xf4\x77\x80\xf2\x08\x45\x83\xe7\xa5\x8e\xb4\x74\x63\xc6\x3d\x10\x28\x31\x1e\x70\xf6\x71\x21\x63\xd2\x7a\xa9\x45\x89\xf7\xf9\xf9\x70\xb2\xaf\xa7\x46\x71\x26\x24\x7d\x7d\xe2\x0b\x08\x11\x85\xb2\xaa\x2e\x35\x56\x83\xb5\xe4\x6a\xdf\xf5\xed\x35\x11\x15\x34\xfa\xf1\x70\xef\x51\xd3\x5c\x34\xad\x95\x2b\x6d\x78\x77\x35\x98\x03\xc9\x04\x53\x35\x36\x21\xf1\x86\xfe\x2e\x01\xd2\x44\xaa\x58\xdb\x04\x93\x9b\xe1\xe0\x1d\x0f\xc4\x40\x86\xe6\xea\x1a\xaa\x5f\xa1\xeb\x3c\x11\x9f\xc1\xbf\x71\x48\xd1\x7a\x66\x5c\xaf\x7f\x19\xab\x70\x40\xcf\x0f\xe8\xcd\x65\x57\x10\xb7\xa3\x2e\x39\x1f\x27\x82\x1e\xa7\x81\x1c\xc5\x9b\x9f\xde\x9c\x03\x23\x94\x23\x1b\x77\xd1\xe0\x40\x4b\x6d\x20\xd4\xb0\x0b\x87\x48\xb2\x0b\x72\x04\x25\xfb\xb0\x1d\x1c\xf7\x34\xf2\x70\xa7\x49\xe1\x75\xa1\x8f\xdc\xb1\xd6\xec\x88\x25\xb8\xb5\xb6\x15\xef\xe7\x9f\x6c\xd7\xc0\xca\x55\xbc\xdd\xe0\x84\xcc\xf3\xd6\x9b\x47\x68\xe0\xfb\x35\xe7\x37\x35\x69\xdd\x8b\x4f\x87\xfb\xb7\xd6\x2c\xe3\x7c\xe8\x1e\xd0\x35\x83\xa9\xb0\x3f\x6b\x50\xb9\x6b\x8c\x76\x67\xfe\x68\xc4\xff\x0a\x9b\x4f\xa9\xe9\x9c\x6c\x58\xd1\x49\x3d\xbc\x91\x15\x53\xd8\xe2\xf9\x04\x12\xc3\x03\x6e\x66\xed\x2d\xe5\xe4\x41\xa9\xaf\xa7\xbf\x6b\x6c\x45\xc0\xfb\x11\x23\xd7\x35\xbf\x4c\xf4\xad\xd9\x97\xa0\xeb\xc2\x77\x3b\x4e\x21\xaa\x71\x18\xcb\x1e\x85\xbb\xcf\x59\x19\x0b\x7d\xec\x68\x3b\x6b\x63\x2f\x55\x5b\x4a\xa0\x01\x11\xf1\x8b\xd4\x36\xe9\x44\x2e\xff\xd1\xc1\x28\x59\xb7\x5f\x8f\x5e\x62\x71\xd1\x60\x9a\x5d\xa0\xef\xf0\xda\xb8\x80\x84\x38\x7e\x7b\xa6\xe3\x13\x12\x3f\xc5\x02\x4e\xc0\x98\xb2\xc7\xfa\x26\x3e\x7f\xf5\x50\x0f\x4d\x7d\x86\xaf\xcf\xa4\x56\xbf\x9f\x26\x71\x6a\x24\x61\x49\x05\x4d\x1c\xb0\x3f\xb8\xf9\xdc\x57\x6f\xfd\x96\x2f\x97\x18\xa3\xf4\xe1\x97\x03\xed\x32\xc9\x2a\x32\x6a\xc6\x14\x6b\xb5\x91\x0f\xee\xcd\xed\xbc\xfc\xad\x5f\xe2\xb2\x9f\x78\x0a\x62\x68\xd4\xe1\x1a\x2e\x13\x72\x39\x9f\xce\xab\x99\x37\x5a\xc7\xcd\x77\x26\x83\x07\xe5\x9f\x5f\x95\x81\xe9\xc7\xe3\x7b\x52\x17\x9b\xcb\xb8\x49\x1e\xef\xe3\x8b\x98\xc3\xf5\x6c\x97\x6f\x5c\x6a\xa7\xd4\xe5\x21\x1a\x3f\xd5\xf5\x5f\xf1\x72\xc3\xfb\x88\xb1\x62\x32\x53\xab\x09\x6a\x2b\x59\x32\x87\xfc\x74\x78\x83\x5b\x3c\xdf\xc2\x67\x61\xe8\xca\x7f\x43\xfa\xc3\x82\xd1\x47\xf7\x7e\xd6\x5c\x77\xf1\x14\xe6\x3d\xca\x55\xd2\x08\x96\x18\x38\x97\xcc\xf9\xbe\xaa\xbf\x70\x57\x97\xfe\x65\xf0\x2c\x7b\x5d\xef\xf1\x43\xb1\x56\x04\x8d\xa7\xc8\x7c\xcf\x97\xac\xbf\x5a\x47\xa3\x96\xbd\x31\x9f\xd0\xb7\xe1\xf9\xaf\xfa\x35\xcd\x2f\x27\xeb\xab\x86\x2d\xaf\xfd\xa7\x3d\x0f\x35\x62\xc8\x5f\x0a\xb2\x02\x09\x46\x54\x5e\x69\x8e\x59\x43\x2d\x8f\x68\xe9\xfc\xab\x37\x78\x3e\xd8\xea\x3e\xab\x41\x01\x72\xce\x7d\x2a\xf4\x28\x80\xa9\x8d\x35\xe9\x54\x21\xd4\xa9\x2d\x8b\x7e\x48\x25\xfd\xb2\x03\x89\x09\x86\xc8\xf9\x1e\xef\xb2\x61\x98\xef\x0c\xd7\x61\x05\x6f\x79\xca\xa9\x7e\x50\xbf\x9e\xac\x5b\xee\xf8\x00\xe5\x27\x0d\x78\xa3\xfe\x86\x16\xbd\x4a\xfb\x65\x1b\x60\xfe\xf5\xc6\x01\xd8\xb3\xdf\xa8\xf4\x26\x7d\xaa\x7f\xd9\xac\x59\x99\xe9\x84\x4c\xb3\x60\xed\x0d\x08\x10\x18\x7b\xbc\x9e\x60\xfa\x48\x04\x7a\x97\x61\x48\x74\xc4\x1e\x02\x13\xbe\xe3\xb8\x0b\xd9\x27\xe4\xfb\x61\x78\xe2\x95\x39\x39\xb9\x39\xe1\x24\x4f\x5e\xf0\x5f\xad\xa5\xfc\x9a\x65\xd2\x38\x9e\x56\x48\x2a\x8e\x2f\xf8\xfd\x18\x06\xef\x20\x92\x51\x6f\xf6\x75\xf5\x90\x0c\x60\xba\x42\xd8\x17\x40\x56\x5b\x5b\x68\x49\x08\x63\xcc\xec\x4f\x1c\x9e\x91\xc2\xf0\x41\x19\x31\x38\x43\x6d\x64\xeb\x35\xd5\x4b\x87\x85\xe9\xec\xe7\x1c\x7d\x54\x7e\x04\xa3\x49\x94\x7c\x47\xb2\xea\x41\x8c\x13\x34\xbb\x0b\x12\xd5\xf8\xb4\x62\xe3\x89\xae\xfc\x1e\xc8\x63\x23\xd3\x0f\x37\xcf\xdd\x39\x50\x0a\x42\x7e\x98\x16\xd1\xd0\x8a\xf8\xbe\x6c\x85\x2f\xf2\xe6\xf3\xed\xa8\xec\xbf\xb1\x6d\x5b\x75\xf2\x5f\xd1\x59\x9f\x55\xc2\x7f\xbf\x9d\xab\x7f\x7f\xf2\x6a\xe9\xf0\xc7\xfb\x7e\xa6\x56\xf4\x8e\x02\x2a\xcc\x87\xa4\xf3\x8e\xd4\xfa\x6c\x20\xf4\x13\xb2\x29\x64\x72\x7d\xb7\x5c\xd7\xa6\xbe\xdc\xc3\x14\xa6\x3a\x9e\x3f\x4a\x89\x4a\x81\xf3\x2b\x21\x80\x2d\x44\xbd\x3c\x0b\x1c\x7e\x7f\x3c\x7c\xa9\xe1\xed\xb0\x5f\x89\x7b\x98\x49\xae\x01\x25\x66\x13\xe6\x29\x70\xf4\xc7\x85\xd5\x7d\xff\x3d\x78\xeb\x6b\xee\x94\x65\x27\x23\xbd\xb2\xf9\x16\x9c\x70\xf5\xec\x80\xcc\x03\xfc\x51\x43\x5e\x5a\x34\x42\x49\xe4\xd6\xe0\x21\x6e\xda\xe0\x58\x41\x53\xeb\x30\xa6\xbc\xf5\x57\xef\xcf\x3f\xb0\xd7\xe4\x59\x70\x65\x54\x89\xdc\xf4\x28\x30\xdf\x81\x09\x40\x7d\xe4\x8f\xa5\xc2\x7e\x3b\xe9\x71\xb0\x9d\x29\xa5\x88\x32\x47\x5a\xe5\x3d\x14\xed\xf4\x39\x71\x07\x52\x95\x25\x08\x2e\xbb\xab\x43\x86\x84\x02\xb6\x3e\xe3\x9d\x66\x81\xce\xff\xb6\xee\x0b\x49\xdf\x9b\x34\x95\xb5\xaa\x48\xaa\x10\xba\x39\xff\x2e\x72\xca\x7f\xe5\x24\xd1\x0f\x48\x63\x3c\x0d\xd8\x9f\x2c\x87\x7c\xd8\xcf\x4c\xc2\x0c\xdd\x0a\x1e\x2f\xc3\x95\x1e\x89\x26\x77\x3f\x06\x66\xb7\x8d\x95\x3b\x10\x19\xdb\x2e\xe8\x05\x0c\x02\xdf\xd3\xec\x6c\x77\x2d\xfb\x31\x0a\x9d\xae\x18\xff\xd6\x80\x9b\xe1\x43\x02\x90\x79\x1a\xa9\x1d\x18\x6f\xed\xcd\x8f\xa4\x5f\x48\x9b\x1e\xb4\xba\xa6\xcc\x2c\x6d\xf2\x03\xe5\x20\x2a\xbc\xe0\xd2\xea\xf1\x5c\x9d\xc0\x44\xbe\xe0\x9a\xcc\xd0\xb5\xa7\x0f\x9d\xdb\xa6\x06\x63\xae\xde\x4b\x25\x80\xb5\x73\xed\x22\xcf\x99\x0f\xcf\xbf\xa7\x0a\x7f\xf0\x1c\x8c\x75\xf2\xf5\x0c\x17\x36\xb4\x8a\x43\xf9\xbe\xac\x87\x7b\x12\x3b\xb0\x13\x46\xe3\xe8\x9f\x75\x12\x9e\x56\x00\x74\x26\xa3\xe6\x1f\xb8\xc7\xc3\xe3\xf8\x3b\xd9\xef\xb2\x40\x11\x8e\xbe\xfb\xf8\x1c\xaf\xef\xdf\xdd\x1d\xd6\x3b\x19\xb0\x6a\x0b\xda\x7e\x90\xc1\x00\xe1\x61\x67\xb7\x19\xb6\x03\x03\x9d\x3a\x53\x88\xaf\xed\x63\x7d\x0f\x2e\x06\x7b\xbf\xd0\xf4\x32\xe9\x75\xa8\x0c\x5e\x66\xc2\xc7\x91\x47\xcf\x9a\xbc\xd1\x54\x8f\x49\x00\xaf\x4c\x37\x8c\xfa\xcb\xa9\xa4\xf2\x80\x0b\x42\x1d\x4d\xe1\xca\xe7\xf0\xd2\xe8\x27\x2f\x7e\xb7\xef\x0f\x8c\x24\xf6\x7d\xbc\x1e\xb4\x2f\x44\x41\x5f\x7f\xcb\xa8\x15\x61\xf1\xf6\x66\xe3\x7b\xc8\x17\x9a\x81\x1c\x6d\x75\xb1\xac\x27\xe9\x11\xa5\x2e\xee\x1f\x78\x29\x4f\xf4\x50\x67\x6f\x8f\x78\xea\x01\xb3\x43\xff\x5c\xed\x97\x83\xb2\x49\x19\x4b\x7d\xa7\x99\x9b\xa4\x7f\x8d\xec\x48\xde\x6f\xf1\x2d\x47\x5e\x2c\xd3\x2c\xba\x4a\xec\xeb\x65\xf1\x3d\x7b\xe6\x2a\x61\x92\x74\xb3\xd7\xfc\x76\x2c\x87\xd0\x35\xa4\x05\x3d\x9a\x6f\x11\xef\x77\xbd\xc5\x5d\x77\xfa\xe2\x85\x17\xe3\x5e\x45\xbe\x0d\x48\x8a\xac\xf7\x7a\xcb\x42\xad\x40\x31\xae\xf7\xff\xd3\x4a\xad\xf7\x1e\xa0\x5c\x6a\xb3\x23\x58\xf5\x65\x96\x88\x5c\xf6\x5f\xe6\xe2\x74\x7d\x7f\xf3\xb8\xcb\x01\x3b\xca\xa9\x5b\x30\x0a\xde\xbf\x66\xc8\xd5\xe0\x1b\xd3\xdd\x87\xdb\x8a\x5d\x27\xbe\xb0\xf4\x3c\x35\x55\x56\x67\xbf\x0d\x66\xdf\xe5\xa7\x34\x4c\x3b\xd7\x8c\xb3\xc2\xec\xb7\x42\xa2\xa8\xe3\x92\xaa\xc4\x0f\x05\x6f\x0d\x42\xc9\x5c\xde\x76\x39\x55\x32\x2e\x11\x58\x8b\xbd\xe9\x1c\xeb\xb7\x88\xd8\x04\xca\x1c\xee\xc6\xa2\x50\x81\x43\x21\x0e\xf5\x03\xf1\x3d\x60\x9e\xb9\x50\xdd\x3b\x13\x79\xde\xe9\xe7\xb9\xde\x3d\x19\x68\x7d\x1e\xd9\xf8\x07\xbe\x9a\x43\x02\xeb\x14\x3f\x98\x5d\x9c\x5f\xef\xd5\xfc\xbb\xff\xa7\xd9\xc0\x8b\x91\xba\x8c\xca\x23\xaa\x87\x1d\xa1\x16\x54\x23\x3b\x06\xc2\xe2\x91\x33\x3c\x5a\xd8\xcb\x4b\x7c\x92\x9e\x54\x25\xb1\xda\x0b\x45\x82\x62\x08\x92\xed\xcb\x73\xea\xd9\xc7\xe9\xeb\xea\x3f\x4f\xb7\x14\xcb\x0d\xb6\xec\x37\xdb\xa1\x15\x6d\x59\x7d\x85\x5a\xf3\x9b\x85\xae\x34\xd4\x85\xb1\x9a\xf7\xa0\x62\xd0\xce\xa3\x5a\x4f\x14\x83\xc7\x24\x87\xcc\x2a\x56\x71\x37\x0c\x63\x8c\x4d\x13\x75\x97\xf6\x40\x40\xc8\x43\x63\x02\x7e\x66\x2c\xb4\x83\x2c\x74\xaa\x7d\x2b\xae\x9a\xb1\x0a\x0d\x86\x2d\x23\x7b\xae\x31\x8e\xd3\xe8\xdf\x7b\x5a\x32\x6f\x3b\x10\x1c\xaf\x27\x59\xb3\xe9\xca\xe6\xf1\x33\x07\x30\x2b\xf9\x2c\x10\xc0\x64\x76\x75\xe0\x9c\x41\x97\xbc\xbb\x22\x51\x80\x03\x29\xe9\x2c\x77\x77\x22\x7e\x4b\xf5\x6f\x8f\x4d\xfb\x57\x73\x6b\xc6\xd8\xa8\x93\x8d\xdc\x70\x10\x7d\xfd\x1e\xa3\x89\xfa\xeb\x40\xb8\x8d\x1d\x90\x86\x79\x3f\xd0\xc4\x82\xed\x67\x57\xa8\x99\x3b\xa6\x17\x4e\x8a\x45\x4f\x42\x45\x88\x1e\x8e\xd7\x2a\x8e\xb5\xe8\xc8\xe7\xdf\x7d\x58\xd5\x1d\x13\x93\xfa\xd7\xbe\x72\x98\x62\x68\x6a\x60\x2f\xdd\xcc\xf7\x0b\x49\xe2\x99\x6f\xac\x9f\xd1\x08\xd2\x64\xdb\x58\xb9\x11\x73\x7d\x8e\xa7\x1e\x5b\x9b\x6f\x5e\x54\xb4\x0d\xd4\x37\x7d\x99\xa1\xda\x7e\xab\x24\xfe\x40\xb4\x1f\xaf\xb6\x97\xc7\x5d\xfc\xd0\x9e\x36\xaf\x76\x8f\x6f\xa3\x29\x04\xb5\xb1\x7c\x0e\x2d\xdb\x05\x11\x30\xbc\x30\x1b\xd5\x8c\x2d\xd2\x8d\xd7\x7d\x57\xdf\xdd\xc4\x7e\x17\xfa\xaf\x06\x78\x54\xad\x26\xf5\x4a\xb1\x56\x7d\xdb\xd9\x43\x2f\x99\x53\x86\xa5\xca\x28\xc8\x7b\x3f\x5e\x72\x59\x0c\x36\xeb\xe3\xc3\xe4\x90\xd1\x27\xf7\xfa\xd4\x4a\x77\x76\xfa\x58\x92\x08\xbb\x5b\x96\xfa\x2d\xfa\xab\x26\xca\xfd\xf9\x2f\xcf\xbf\x5b\x13\x0d\x41\xd0\x2a\xb1\xd1\x25\x7a\xf7\x16\xea\xa3\x7b\x3c\x65\xd8\x39\xf2\x25\x1c\xad\xd7\xe3\x4b\x7c\x93\x9a\x4a\xf7\x28\xc9\xc5\xaa\x74\xb4\xee\xd8\xbb\xd7\x28\x54\x27\xf9\x96\x24\x89\xc9\x65\x0b\x86\x38\x76\x90\xb8\xf2\x5c\x61\x80\xb6\x0c\xf4\x7e\x95\x16\x91\x26\xe1\x8b\x3c\x5c\x94\xc6\xee\x8e\xc7\x77\xc7\x4f\x03\xae\x05\x81\xc6\xf1\xd3\x08\xcf\x66\xd1\x1c\x2f\x7e\x03\xd1\xfa\x05\x0e\xf0\xba\x8e\x21\x36\x45\x59\xfa\xab\xea\xfe\x1a\xe2\x78\x6f\xe2\xdf\xc8\x4d\xcc\xee\xc1\x33\x99\x29\x71\x2c\x36\x69\x18\xbb\x15\x39\x2c\xcc\xbb\xca\x3b\x5a\x7b\x30\xa1\x6a\x9a\xd1\x7a\xe8\xe7\x86\x7e\x12\x9c\xe3\x16\x53\x4e\x9c\x69\x27\xfd\x0c\x35\x9b\x4f\x46\xb4\x56\x39\x02\x5a\x71\x62\x20\x03\x50\xb4\xe9\x91\xca\x7d\x95\x02\x66\xb7\x0e\x6f\xe0\xd4\x87\x34\xd7\x0e\x65\xf8\x62\x82\xe0\x65\x04\x4f\x39\x46\xdd\x05\xd1\x19\x92\xc1\xcd\xc9\x4c\x9a\xfd\x03\x51\x14\x6a\xcd\xa9\x80\xc7\x1c\x82\xb0\xc5\xcc\xf2\xc5\xbc\x76\xf0\xe8\x48\xaf\xee\x50\x5e\x28\xcd\x92\x6d\x4b\xd2\x7f\xf0\x1e\x23\x07\x23\xc4\xa9\x85\x63\xc0\x90\x7d\x5e\x20\xdb\x1e\x24\xde\x45\xae\x1a\x59\xaa\x62\xab\x83\x37\x2e\xcb\xb2\x2d\x77\xef\xf7\x6c\x9a\xd9\x0b\x02\x22\x33\x54\xee\x9d\x0f\x1b\xd9\x80\x39\x28\x84\x92\x31\x37\x36\x3c\x68\x86\x99\x5f\x4f\xb8\xd8\x70\xda\x65\x4f\x48\x7b\x11\x58\x1a\x11\xcf\x87\xfa\xfc\x21\x77\xbd\x21\x4a\xbd\x25\xd5\x1d\xd6\xae\x22\x46\x15\xcc\x71\x66\x74\x5c\x79\x9c\x83\x35\xbc\xa7\x39\xfb\xec\x99\xa6\x9e\xae\x77\x63\x4b\xab\x02\x7a\x23\x56\x35\x6e\xa8\x8c\xef\xb6\x02\x1d\xd1\x0c\x50\x0d\x4d\xb3\xd9\xef\xfd\x2c\x11\xfe\xe1\x96\x94\xc2\xd7\x2b\x9e\xac\xd8\x84\xd2\x2c\x24\x70\x25\xaa\xa0\xc8\x83\x00\x52\x38\x35\xa4\x8b\x3c\x21\x89\x6b\x86\x96\xda\xfa\xcb\x26\x99\xd5\x1a\x1a\x2a\x35\x33\xb1\xbf\x0f\x70\x7e\x1f\x7c\xcb\x5b\xbe\x7d\xd7\xdf\xe8\x17\x7e\xff\xe8\x29\x6b\x94\x60\x8d\xa6\xa6\x69\x70\xb1\x60\x68\x41\x46\x79\x50\x9e\xf3\x68\xd4\x3f\xea\x29\x0d\xed\x24\x8c\x98\x38\x37\x8f\x5d\x79\x49\xea\xd9\x9e\x8e\xfc\xf8\xde\x17\x5a\x49\xc5\x99\x63\x1b\x9b\xaa\x4f\xfa\x27\x93\x7a\xde\x5a\xb5\xa4\xab\x3b\x47\x21\xb2\x65\xc6\xf3\xbb\x60\x54\xfb\xb3\xb1\x02\xdf\xc1\x4f\x6a\x09\x39\x23\x81\x55\x49\xfd\x32\xd9\x58\x5f\x08\x7e\x7d\x7f\x82\x61\x8a\x35\xc9\x20\x71\xa6\x36\x67\x64\x4a\x7d\x9d\x06\x6b\xa8\x3e\xe0\xbb\x15\xec\x0e\x7c\x91\x50\x92\x8c\x3e\x73\x10\x9c\x16\x26\x4e\x31\x23\xb5\x4d\xbd\x01\x9d\x1f\x8e\xfb\xb1\xe1\x4f\xf9\x8e\xd5\x6a\x74\x3a\x3a\xf3\x71\x2d\xba\x3e\xc5\xbe\xab\xe3\x43\x65\x70\x0c\x8f\x20\xa5\x74\x17\xfa\x91\x5c\xb1\x5d\xe9\x5d\x6f\x9f\x75\x57\xb2\xf5\x66\x1f\xa1\x4c\x0a\xf1\x1a\x6f\xcd\x9d\xb2\xc3\x6f\x06\xfd\x74\xe3\x58\xbe\xfd\xf3\x62\x63\xb7\x7c\xf1\x08\xd4\xa5\x7a\x1f\x8e\x8b\xd1\xbb\x43\x83\x15\x53\x6b\x8d\x7a\xfc\x8c\x28\x7d\xe5\x9e\xf0\x9c\x46\xb9\x82\xe0\xc9\x35\xd9\xef\x2b\x86\x1f\xe1\x05\xc3\x8e\x64\x12\x23\xba\x78\x8f\xef\x2c\x4d\xfe\x58\x2e\xeb\xf6\x94\xea\x7e\xba\xbb\x3d\x3c\x7b\x03\x8f\x66\x08\x76\x5d\x3a\x5b\xb1\xfb\x5e\x92\x31\x07\xa8\x00\x6d\x6c\xf4\x36\xba\x53\xf4\x5c\x7f\x5c\x50\x72\x0e\x2e\xf0\xb7\xa0\xc8\x54\xbd\xb3\x28\xa9\x7f\xec\x69\x3f\x41\xfe\x40\x85\x91\x1b\x17\x98\x6b\x58\x05\x9e\x90\x19\xbe\x3a\x57\x79\x26\xd3\x1c\x15\x1e\xf9\xd2\x2b\x24\xec\x77\x67\x58\x6f\x99\xb7\x72\x47\x80\x1b\x5e\xd1\x1d\xd2\xf2\xe4\xd4\xe4\xe1\xf2\x54\x9e\x2d\xa7\x1d\x0c\xcc\x3f\x37\xf8\x17\x31\x33\x8f\x2d\xb0\xa1\x90\x5f\xa0\x37\xf2\xd7\xd6\xef\x78\xbd\x3e\x2d\x91\xc3\xa7\x16\x03\x6e\x09\xa9\x5e\xbc\x5a\x7a\xc2\xbe\x27\xd9\x20\xe8\x27\x45\xc5\xfa\x47\xaf\x98\xe0\xe5\x58\x5a\xa4\x3d\x77\xc3\xc7\xc9\x08\xca\x3a\x43\xca\x40\xf4\xdd\xf5\x20\x5a\xf9\x41\xb1\x01\xcf\xc2\x70\xc1\x93\x77\x4f\x93\x04\x9b\xd0\x38\x39\x34\x71\xdd\xb9\x11\x8b\xfd\xce\x68\x3e\x29\x92\x55\x14\x1e\xd5\x8f\x47\xd1\x1f\x0f\xe8\x8e\x31\xfa\x09\xed\x74\x64\x9a\x78\x40\xe3\x41\xcf\x5a\x77\xe3\xe4\xfb\xd7\x10\x05\xbe\xf6\x98\x0d\xbc\x3f\x49\x79\xe9\x2e\xe5\x7b\xc4\x58\xb4\x26\x1d\xed\x64\xd5\xe3\xc3\xe9\x53\x7b\x2f\xdf\x0a\x4f\x05\x67\x92\x52\x57\xa6\x8d\x12\x6b\x81\xfe\x08\x24\x7b\xb9\xc1\x06\x6f\x9e\xcf\x67\x05\xe6\x57\x47\x0e\xcc\x23\x21\x7c\x7f\xe2\x97\x05\xcf\x9a\xad\xc4\x27\x35\x31\xf0\x7b\x9b\xe2\xb8\x49\x08\x43\x1c\x54\xbf\x40\xa3\xda\xcf\xc6\x3b\x1b\xca\x40\xe9\x3b\xd8\x30\x25\x31\xe0\x2c\x17\x05\x47\xb1\xfa\xda\x79\xc8\x5f\x30\xa7\xf7\xd2\x1e\x8d\xcc\x5f\xc7\x55\xb9\x1c\x69\x84\x2f\x23\x22\x81\x92\xee\x98\x99\xcd\xe5\x2c\x84\x3f\x79\x8f\xae\xe4\xed\x8c\xac\xf7\x09\x9f\x0f\xe1\x82\x4d\x90\x93\x78\x02\xeb\x7d\x37\xf9\x2b\xf6\xe6\x52\x9c\x83\x0b\x13\x80\xd1\x33\x1d\x21\xd9\x13\x57\xde\x62\x27\x60\x73\x2a\xfc\xf7\x7c\x8e\x8e\xa7\x3c\x5e\xa1\x3a\x14\xaa\x6c\x33\x0e\x41\x79\x9f\xc0\x7c\xae\x65\x85\xb8\x64\x60\xad\x5a\x73\x40\x0d\xe1\xfc\x66\xe9\xf1\x13\x97\x80\x8e\x66\x3c\x51\x05\x45\xef\x6c\x19\xc9\x00\xb0\x6c\x58\x0f\x26\xd2\x28\x77\xe3\x52\x3e\x08\xb1\x15\xf4\x50\x1c\x89\xa5\x0a\x96\x63\x9e\xb8\x9c\xc2\x97\x81\x17\x2b\xae\x3d\x57\xf8\x43\x2f\xd8\xa9\x6b\xfb\xd3\xe8\x47\x6a\x99\x08\x00\x93\xe2\x95\xcd\x85\x21\x92\xe4\x49\xb1\xb4\xa6\x4e\x13\x8d\x76\xfb\xcf\x52\x7e\x25\xdd\x12\xfc\x79\xd7\x5f\x26\x28\x06\x7f\x66\x89\x64\x01\xdb\x6b\xe5\x84\x21\xde\xab\x42\x52\x10\x95\xbd\xbb\xe0\xf0\x2a\x09\x02\xc3\xd0\x34\xbd\x93\x29\x04\x9e\x67\x4d\xd5\x1f\xcb\xff\xa0\x52\x47\x57\x16\x05\xec\x0e\x47\x73\xf0\x96\x32\xdf\xf7\xef\x06\xe4\xea\xd3\x71\x80\x11\x13\x7f\xb4\x88\x4c\x92\x3b\xa2\x8f\xa5\x0b\xeb\x5d\xeb\x8f\x5e\x41\xdf\x7d\xb4\x86\x12\x67\x97\x3c\x0e\x12\x7f\xe6\x5d\xa0\x2d\x97\xf7\xef\x2d\x99\xdd\xf5\x6b\x53\xba\x7a\xa9\x1e\x95\x19\x74\xb1\x30\x3d\xfa\xf5\x3f\x3c\x47\x71\x3d\x79\xa4\x6f\xc0\xce\x36\x18\x16\xae\xee\x07\x7f\x75\xc8\xc2\xa7\x7c\x8a\xfc\xcc\xa1\x26\xbc\x46\xd3\x86\x0c\x6c\x02\x79\xbf\x64\x59\x5e\xb2\xf2\xf4\x73\x07\x06\x82\x41\x0c\x5f\x34\x41\xe5\x93\x73\x43\xc3\x2d\x0c\xe8\xf1\x9c\x3f\xdc\x0b\xe8\x2f\x09\x39\x1b\xc7\xb9\xfb\x84\xa0\xc1\x88\x5d\x3f\xf5\x05\xde\xdc\x66\x6c\xb3\x43\xc0\xd7\xdf\xe7\xb1\xa8\xed\x03\xf2\x50\x2b\x7b\x16\x22\xb9\xf6\x03\xb8\x1b\x58\xf9\xd0\x0f\xef\xe2\x9a\x92\x85\x17\xb2\x9f\xa1\x47\xe5\x15\xee\x22\xa8\xc3\xfb\xf9\xd5\x95\x38\x68\x41\xc4\xb5\x24\x89\xc2\xf8\xe0\x0c\xde\xa5\xd3\xb1\x4d\xe8\xcf\xad\x58\x31\xdf\x24\x41\xd4\xdf\xff\xa1\x7e\x14\x4a\x04\xd3\x7d\x90\xfc\xe2\x22\x4e\x5d\xc2\x69\x16\x6d\x34\x97\x11\x82\xe7\x9e\x6c\x04\x6d\x62\x02\x30\x09\xcf\x8d\x17\x49\x21\xd4\xc4\x43\xee\x57\x2b\xbf\x5f\x52\x45\x35\xa7\x7c\xdf\xfb\x65\xb0\xc8\x02\xed\xfc\x14\xfa\x32\x7b\xb0\xc3\xe1\x38\xf6\xa1\xe7\x91\xf8\x4c\x03\x55\x76\xdc\xcf\x8a\x99\xc1\xe8\x0a\x3f\x0a\x58\xd7\xc3\xe2\x65\x5f\xdb\xd9\x09\xf8\xe2\x03\x61\xa3\xf9\x4a\xd7\xd0\xd8\x3a\x6e\x93\x12\x2e\xaa\xb1\xa6\x54\x03\x6c\x9b\xae\x01\xa3\xe5\x89\x11\x6e\x3e\xba\x75\x54\x6b\x92\xdb\x37\x63\x20\x86\xd9\xfd\x94\xa2\x2c\x72\xa2\x17\x08\xbf\x8a\x7b\xed\xf5\xdd\xc3\xa7\x13\x6b\x2e\xb1\xe1\x64\xa1\xd1\x72\x02\x15\xce\xbc\xc8\x34\x0d\xb4\x42\x55\xb7\x97\x2d\x76\x95\x83\x25\x0f\x0d\x01\x02\x48\xaa\xd8\x11\xcd\x17\xb8\xab\xa3\x79\xd0\x7b\x17\x4b\xcc\x91\x8a\x86\x7c\x9e\x3c\x35\xcb\xd2\x1c\x42\xda\x16\x25\xc6\xb3\xed\x86\x7b\xf0\x50\x18\x3e\xae\x23\xd4\xda\x1d\x3a\x6d\xb9\xaa\x46\xa5\xbb\xa2\x85\xbc\x68\x1a\x37\xbe\x5f\x45\xdf\x5e\x2e\xc1\xee\x69\x01\x9b\x92\x60\x12\x15\xb1\x47\x59\x51\x04\xe1\x49\xea\x7d\x45\xaf\xae\x0d\x78\x18\xce\xe1\x39\x93\x3b\x7a\x9f\xe7\x79\x2b\xa0\x24\xc2\x31\x09\xd1\xd1\x25\xf4\xd9\x7c\x6c\x9d\x35\xf4\x9d\xeb\x7d\x1a\x26\xb6\x02\xc6\x9e\xc8\x05\xc7\x6d\xff\x22\xe7\xb2\x99\x67\x8b\x3d\x61\xa0\xb1\x30\x0a\x66\xdd\xf8\x58\xb6\x18\x76\x61\x16\xbb\x96\x93\xe4\xbf\x17\x90\xd3\x68\x62\xe2\x35\x0c\x17\x38\xcd\x76\xa1\x99\x91\x84\xc2\x9f\x49\x9a\x2e\xeb\x02\xf0\x0f\x0a\xcc\x91\x0e\xda\xc5\x65\x20\x82\xa6\xa9\x23\x59\x4f\x32\xd3\xb6\xd9\x92\xdd\xf5\xeb\x09\x07\x74\xd8\x01\x8e\xe3\xad\xf4\x09\x84\xf2\xce\x31\x6a\x9c\xc6\x8c\x25\xa1\x9c\x05\xfc\xe8\x19\xf3\x4b\x91\xd6\xfb\x78\x79\xae\xd5\x19\x5d\x7a\x85\xe6\x43\x68\xda\xf9\xf5\x07\x33\x99\x00\xdf\x60\xc7\x67\x8f\xe9\x5b\x6a\xf2\x23\x78\xca\x3c\x30\x8a\x2b\x10\xf8\xb8\xc8\x87\xbf\x09\x1f\x5f\x0a\xbd\x0e\x73\x5a\x66\x4d\xf5\x8c\x83\xf2\x40\xdd\x72\x82\x34\xd3\x7a\xbe\xf8\x58\xcd\x34\x11\x9d\x94\x4d\xfb\x4e\x2f\x1a\xdf\x81\x60\x50\x84\x36\x41\x52\x8e\xd7\x53\x56\xd4\x45\x6b\x0e\xb4\xe1\x8b\x15\xee\xaf\x73\x99\x69\xc1\x34\xba\xde\x42\x98\xa5\x60\x83\x05\xcf\xb6\x2e\xc4\x83\x67\x20\x3d\x0b\x01\x3b\xfd\x1b\xbf\xf3\x16\x8d\xfe\xf9\x22\x48\x66\x7b\x6f\x2b\x8c\x63\x31\x05\xd1\xef\x99\x9a\x95\x25\x36\xf9\x1d\xe8\x13\xa1\x66\xfa\x1d\x00\xe4\x9b\x48\x5f\xbf\xe0\xa4\x93\xf0\x32\x35\x76\x22\x29\x32\x33\xf0\x3c\xba\xf2\x18\xe0\x50\xdb\xe1\xdb\x41\xae\x61\x4b\xea\x01\xbc\x20\x14\x9a\xf4\xf8\x74\xbe\xa1\x2c\xdd\x8e\xc6\x00\x6e\x61\xc6\x27\xa5\x86\x08\x0a\x60\x0f\xde\x0f\xc3\xb2\x1d\xdf\x43\x5f\x44\xcf\x77\x90\x30\x0d\x1a\xe1\xf9\xcd\xff\xd5\x8b\xd8\xf7\x62\x7e\x90\xcc\x98\x6e\x48\xdc\xaf\x43\x77\x10\x80\xef\xfb\xae\xa3\x61\xd8\x91\x9a\xe4\xd0\x2c\xf1\x0a\x93\x83\xa0\x03\xda\xe0\xa5\xde\x58\xac\x18\xe3\xeb\x22\x0e\x3b\x95\x36\xb8\xae\xc8\x04\x62\x32\xdd\x78\xbf\x4f\x8a\x29\x06\x21\x18\x99\x80\x38\xc8\x88\x85\x74\xc4\x75\x21\x80\x46\x27\xa3\x6d\xec\x0c\x5e\xec\xf9\x25\x66\x47\x01\x0a\xf0\xac\xdc\x73\x08\x27\x53\x60\xe0\xa3\x08\xf1\x89\xc4\x0f\x96\x69\xc0\xc8\xbe\xf7\x8f\xfd\x7a\xd8\xc1\xd4\x56\x7f\x75\xae\x09\x3d\x91\xe4\x00\xa7\x70\x66\xea\xaa\xda\x78\xaf\x5f\x08\x31\x6b\x0a\x6b\x70\xbb\xa7\x5e\xbc\x82\xf1\xb2\x50\x38\x59\x30\x32\x63\x56\xa9\x0e\xaf\x01\xa9\xb6\x96\xfd\x39\xc3\xb5\x34\xaa\xe6\xeb\x15\xff\x86\x8d\x84\x58\x18\x59\x0e\x07\x3b\x6c\xac\xc3\xb6\x7f\x72\xe8\x3c\x9b\xa1\x7a\xcb\x8f\xb6\x2e\x63\x0b\x0a\x22\x02\x47\xdc\xcc\x09\x81\x07\x70\xa5\xd4\x9f\xb1\x84\xa5\xce\x3c\x34\xf2\xfd\x12\xee\xbd\xef\x89\x9c\x61\x97\x0a\x9d\x8f\xc5\xf4\x21\x00\xbb\x73\xa3\x59\x32\x9e\xe1\x15\xb7\x2a\xe1\x65\x40\x84\x0c\x10\x3f\x37\x21\xce\x05\x38\xcb\x6e\x2e\xe2\x88\x93\x14\x9a\x21\x7a\x5d\x38\x4d\x9b\x1b\x0c\x2d\x29\x6b\xc2\x5b\x34\xc9\x4b\x7f\x14\x94\xd2\xd0\x3e\xa7\xee\xf5\x4b\x21\x67\x0c\xce\xb7\x2c\xc3\x67\x9a\x0f\xf2\x0b\x50\x40\xb0\xb0\x24\xc3\x90\x18\x8e\x93\xc4\x91\x42\x9f\x65\x61\x91\xd8\x3a\xc4\x02\xc4\x3b\x05\x51\xcc\xb6\x5d\x17\x82\xe0\xe2\x5d\xd3\x6b\x16\x70\x59\x5b\x88\xc9\x7d\x77\x86\x2d\xcd\x6f\x7f\xfd\x00\x0e\x32\x76\x16\xf4\x5b\x06\x4b\x8d\x82\x2d\x81\x50\x1d\xb1\xda\x3d\xe1\xde\x10\x69\xd2\x66\x56\x18\xba\xe0\x62\x3f\x2e\x59\x17\x80\x7e\x34\xeb\xa0\xc3\x60\x10\xb7\x04\x3b\x05\x8b\xc8\xa1\x68\x12\xb0\x2b\x88\xaf\xeb\x64\xdb\x65\x0b\xdd\x6c\xc3\x67\xf0\x2c\xe2\x79\x61\x17\x2f\x95\x23\x75\xce\x9b\x5a\x42\x07\x2b\xc3\xa5\x0f\x23\x13\x18\x1f\x98\xa0\x93\x69\x63\x59\x9c\x25\xd2\x54\xe3\x2b\x5f\x4b\x16\x08\x38\xd9\x5f\xb1\x16\x10\xf7\xf8\x5a\xef\xc8\xb8\x7e\xe9\x41\xe3\xf4\x55\x2f\x52\x7d\x1c\x24\x61\x31\xdb\xd0\x83\x51\x94\x29\xa3\xfe\x16\xeb\xba\xc3\xc5\xf8\xe0\x45\x20\xad\xc4\x9b\x9b\x98\x9c\x31\xe1\x16\x4d\xbc\xd3\xa4\x8e\xbe\x39\x36\x20\xa3\x96\x48\xa9\xd8\xa2\x6f\x1c\x55\xa7\x34\x5d\x3e\xbe\x8e\xfc\xea\xb8\xc6\x91\x3f\x95\x67\x1c\xb2\x5c\x56\x36\x65\x2b\x13\x16\x89\xfa\xd4\xd9\x5b\x31\x48\x01\xee\x59\xdd\x3b\x20\x40\xf6\x14\x8a\xa6\xd1\x38\x74\xe1\x6c\x9e\xb3\x28\xfa\x66\x59\xca\x41\x48\x83\x5b\x23\x07\x29\x77\x38\x5b\x8f\xfb\xec\x4a\x82\x2f\x94\xe1\xe9\xee\x30\x1f\x08\x0d\x6f\xe1\xba\xc1\xc0\x43\x38\x66\xdb\xc7\x20\x6f\x43\xbc\x01\x22\xa9\x77\x23\x9a\xd9\x65\xdd\x6c\x65\xe6\xc3\x67\x00\x97\xdb\x04\x92\x85\xee\x04\x62\xe3\x05\x59\x33\x00\xd1\x60\x63\x04\x0f\x0a\xea\x6f\x8a\x4f\x43\x7b\x12\x2c\x0c\xa9\x7a\x51\x6c\x8c\xd4\x5d\x30\x19\x19\x25\x90\x05\x40\x07\x0f\x59\x91\x57\x9d\x18\xa3\x20\xa6\x19\x11\x06\x00\xd7\x4b\x9e\x05\xa5\xa9\x0d\xa2\x9d\x3a\x27\xad\xca\x8c\xf8\x9d\xe9\x41\x6e\xac\x62\xf8\x6e\x4f\x34\xab\xb6\xc1\xee\x72\xf7\xda\xc2\x6d\x83\xf2\x3e\x33\xe1\x0b\xe2\x68\x90\x6b\x5d\x17\x28\x7a\x46\xdf\x75\xf2\x2c\xcb\xd2\x09\x23\x02\xc5\xc6\xc0\x2c\x7a\x24\xf1\x39\x77\x3b\xfa\x02\xf9\x27\x55\x5b\xbf\xad\x57\x9e\x34\x39\x6f\x03\x4c\x4f\x39\x96\x45\x61\xd6\x28\x6d\x27\x47\x7d\xf5\x69\x53\x0c\xb0\x51\xf3\xd5\x00\x8b\xb7\x6d\xf8\x84\xc0\x05\x54\x97\x8b\x40\x5e\x92\xb5\x8b\x34\xbd\xe1\x11\x5c\x8a\x9c\xcb\x11\x24\x5c\x26\x09\x4d\x90\x34\x39\x80\x61\xa9\x57\xc8\xb3\x9a\xdb\x3f\x53\xcf\x4f\x5d\x67\xd7\x20\x60\xd8\xb0\x34\xaf\xfd\xf9\x92\x5e\x2c\xfe\x72\x08\xe0\x0c\x14\x59\xee\x8f\xa0\x95\x5c\xb9\xb5\x8f\x6b\xaf\xd0\xe3\x82\x0e\x66\x20\xa8\xe3\x81\xf5\x3c\x2d\x0a\xd6\x00\x00\x06\x2e\x24\xfc\xdc\x63\x93\x7a\x0d\x24\xcd\x5c\x71\x0b\x54\xce\x2b\x6b\xc6\xd7\xf1\xcb\xa5\x7c\x85\xd8\x67\x5a\x1f\x06\x60\xb6\x75\x33\xc3\xae\x3b\x00\x61\xe0\x94\xa2\x30\x19\x4d\x83\x01\xbe\x95\x0b\x94\xe1\x61\xd8\x37\x68\xb9\x2e\xee\x7c\xce\xb0\xf4\xa5\x24\x1f\x3f\x91\xe2\x2d\x31\x4f\x87\x61\x58\xfc\xe4\x4e\x22\x20\xcd\xe1\xb1\x71\xc0\x97\x92\x8e\x01\xaf\xf7\x67\xdd\x98\xd9\x5f\xc6\xf3\xca\x69\xdc\x81\x20\xc6\x5c\x3f\x3d\xb4\xf9\x1b\x4d\x3a\x40\x9d\x09\xdd\x2b\x7b\xd9\x48\x21\xdd\x39\x5b\x25\xf5\x13\x8b\xb2\x54\xee\x08\xd5\x20\x87\x5b\x67\x8f\xdd\xb8\x08\xb8\xf8\x74\x3d\xf6\xd6\xd1\xf3\xce\xb9\xda\x43\x40\x59\x86\x89\x80\x24\xeb\x2f\xdc\xc5\xa9\x58\x1b\x60\xf5\x95\x2a\x47\xa8\x87\x95\x62\x6d\xdd\x15\xc2\x4b\xeb\xe7\x20\x59\xe6\x43\xb7\x3e\x36\xf7\xf8\x14\x70\xea\x6d\x7c\x1c\xe6\x3d\xe6\xc0\xf9\x6a\x85\xf7\x41\x52\x63\xda\x90\x16\x38\x29\xe8\x33\x73\x21\xf6\xfc\xc9\x1b\x88\xcb\xc2\x00\xc8\x82\xb0\x45\x51\xc0\x1c\xcd\xc2\x4c\x5a\x97\xfb\x51\x4a\x5f\x99\x87\x6a\x96\x04\x60\x81\x92\x28\x7a\xd1\xe7\xbc\xc0\x6e\x50\x01\x52\x9e\xfd\x84\x00\x06\x71\x68\x90\xd8\xf3\x93\xc0\x93\xdd\xcf\x80\x15\x43\xfd\xd2\xee\xb9\x79\x0b\x5a\x32\xf8\xa7\x3b\x9b\xbf\x8b\xed\x4b\x96\x56\x8c\xe6\x47\x2e\x33\x5b\xd9\x5b\xdd\xf3\x29\x0b\x4b\x23\x9a\x14\x79\x66\xbe\xb7\x1e\x1f\xc7\x39\xe6\x9f\xcd\x39\x1c\x4f\x5e\x20\xe8\xb7\x24\x99\x12\x8f\x98\x1f\x80\xc5\x74\x51\xa4\xd9\xb6\xd4\x30\x7d\xfa\xa8\xd7\x23\xd5\x51\x1c\xb8\x94\x8a\x14\x70\x36\x73\xbe\x2c\x3b\x8e\xbf\xb0\x5f\x50\x64\xc0\xd5\x69\x30\x34\xac\xcb\x96\x1b\xc9\x30\x90\x6b\xdc\xd5\x5c\x58\x52\xda\x68\xbf\xbd\xad\xd8\x68\x99\x85\x28\x02\xe8\xe6\x1e\x38\xb1\x73\xd6\x60\x98\xce\xe1\x83\x7c\x3d\x88\xba\xdf\xda\x21\x4a\x6d\xda\x03\xfe\x39\x54\xfd\xf5\x81\x9d\x64\x85\x7d\x7a\xf6\x91\xf5\x13\xfb\x7d\x78\x9d\x9a\x5b\x2a\xfc\x69\x1a\x61\x68\x84\xf8\x9f\x5f\x32\x71\x13\xe7\x42\x0e\xa7\x3e\x65\x11\xd4\x4f\x80\x19\xcf\x37\x49\xc0\x85\x27\x30\x50\x0c\xc3\x14\x8c\x7b\x46\x86\xcb\x22\xc4\x42\x71\x84\x18\x73\x24\x5b\xc1\xbb\x26\x8e\x75\xdb\x4e\xca\x06\x89\x0e\x88\xba\xae\x60\xfc\x94\xad\x4f\x0f\xb4\xcd\xb2\x0d\x50\x47\xd5\x20\xb3\xb8\x0a\xfc\xf3\x97\xa1\xcb\xfc\x13\x26\xc2\x27\x11\xa7\xa1\x53\x16\x66\xb7\xc1\x97\xe3\x1c\x40\xf5\x7e\x5a\x68\x5d\x13\x2c\x97\xe0\xb0\x80\xbf\x4a\xcc\xc6\x5a\x5b\x42\xfd\x53\x92\xc6\xdf\xcf\xb5\x35\x04\x39\xad\xd1\xfe\xd5\x11\x4e\xcc\xe0\xc3\xa0\xc7\x11\x5b\xce\x4b\x26\x59\xc8\x2d\x31\x23\x5b\x3f\x99\x31\x38\x8f\xf2\xd8\x4c\x66\x1c\x82\x29\x69\x4b\x04\xce\xa1\xa2\xd8\xf9\xb0\xac\x12\xf9\x5c\xbd\xc9\x56\xaf\xac\xeb\x10\x83\x7e\xc3\xf0\xef\x80\x19\x46\x95\x68\xe9\xaa\x31\xd4\x2f\x06\xe8\x6e\xdf\x42\x2d\x30\x64\x22\xc5\x66\xf6\x94\xc8\x98\x04\xa9\x8f\x22\xe2\xa2\x14\x6b\x54\x66\xb1\x71\xdc\x71\xb0\x2c\xa7\x41\xc1\x07\xe7\x9a\x53\x91\xe8\x02\x4f\x8a\x2d\x2c\x0a\x0f\x45\x7d\xbc\x60\xe1\xcd\xa7\xb7\x83\x5a\xee\xbd\x49\x0f\xb8\xe1\x6d\x02\x86\xd4\xa2\x4a\x61\xc1\xed\x41\xbc\x17\x2c\x0d\x30\x66\x15\xf4\xc9\x7e\xa2\x2c\xb2\x17\x89\x05\xf9\x1b\x08\xb0\xcf\x2b\xef\x65\x0a\xf6\x20\x98\x3d\xae\x85\x65\x4f\x8a\x00\x3e\xeb\x10\xdf\x33\xe3\x4a\x04\xdc\xc1\x26\x50\xfc\x80\x6b\x56\x33\x79\xc2\x26\xa5\xd9\xe5\x5d\xf3\x03\x17\xf7\xc6\x99\x51\x38\x17\x74\x11\xa9\x13\xf8\x1c\x4c\x96\xcb\x16\xb5\xab\x32\x48\x66\x65\x18\x34\x80\x39\xd2\x3c\x2e\x14\x66\x08\x04\xf7\xf4\x9f\xfe\xd3\x60\xd3\x84\x61\xa6\x06\xbc\x95\x43\x74\x14\x21\x50\x61\x0e\x58\x1a\x51\xc7\x52\x57\x5b\x99\xab\xa3\x62\xb4\xdf\xf6\x33\xb2\x5f\x24\x8b\x69\x47\xe2\xde\xe9\x92\x8c\x72\x8c\x56\x89\xf3\x4b\x85\x35\xe7\xbe\xd4\x47\xae\x7d\x8d\x98\x87\x71\xc5\x74\x4d\x5c\x7e\x61\x66\xa3\x5a\x20\xd7\x33\xb0\x75\x38\xc4\xe8\x6f\xe1\x75\xc4\x10\xc3\x26\x49\x60\xca\xd5\xda\x83\xec\xb3\xb3\x67\xc5\x0b\x9a\xc3\xcc\x6e\x7d\xc1\xd0\x7d\xfe\x31\x2b\x5e\x9a\xab\xd5\x56\x03\x19\x84\x8f\x82\x64\xcc\x80\x0e\xc3\xda\x29\x3e\x36\x95\xb8\x74\xc6\xbc\xcf\x8e\x6d\x14\x3d\x90\x30\xd4\x5f\x2b\xdc\x1d\x5d\xdd\x21\x0a\x9d\xad\x10\x40\xb0\x08\x68\x39\x78\x5d\x5d\x0a\x0d\xb9\x6c\xc1\x9f\x36\x17\x44\x0c\x04\xf2\xec\xb3\x61\x44\xf6\xad\xce\xf5\xbe\xea\x0e\xfd\x94\x31\x56\x1d\xc7\x3d\xf4\x9a\x7f\x22\x8e\xee\x2c\xf7\x59\xd4\xc1\xf6\x3f\xd6\x40\x42\xea\xf0\x99\xd7\x90\x7e\xee\xbf\x49\x70\x20\x19\xde\x44\x07\xbb\xd7\x10\x7a\xf6\x42\x09\x96\x81\x58\xdb\x5a\xa5\xdf\x89\x65\xe9\x1c\xf8\x42\x32\x5c\x10\x8c\x73\xc0\xc0\x38\xb2\x46\x14\x1a\x55\xb6\x22\xad\x59\x77\x6d\x96\xb7\xd2\xb6\xf4\x96\xec\x3d\x33\x3e\x16\x88\xd4\x2c\x89\xa1\xa5\xda\x8a\x1e\x20\x3f\xce\x9e\xb7\xa6\x8b\x38\x7a\x63\x8a\x91\x40\xfa\x7d\xf3\xd3\x72\xb6\x17\xde\xb0\x02\xe1\xb5\x28\x7b\xed\x62\xbf\x63\x74\x9c\xaa\x64\x76\x37\x46\x8d\x39\x17\x52\xe1\x14\x3d\xde\xb2\x9f\x70\xe0\xc8\x34\xe6\xd6\x33\xaa\x7c\xbe\x3c\x50\x86\x03\xfc\x7d\x3d\x23\xd8\x64\x61\xc0\xd7\x2c\xca\xec\x04\x9e\x30\x61\x33\xf6\xb7\xff\x61\xe3\xef\x69\xce\x7b\x6a\x5f\x38\x09\x30\x03\xbf\x7b\xa9\x26\x23\xda\x45\x71\x8c\xd1\x6f\x9a\x85\x80\x4e\xa9\x01\xb2\x05\x41\xd4\x3f\xd9\x82\xc9\xa4\x53\x3c\x3e\x6b\xb0\xd1\x76\x5a\x1d\x2e\xbf\x16\xc9\x2b\x65\x81\xeb\xa5\xce\x9b\x5f\x6a\xf2\xb3\x50\x34\x00\x48\x92\xce\x88\xe6\x8a\xc2\x64\xb6\x3f\xa1\xa8\x74\x47\xd6\x05\x45\x0c\xf2\x85\x35\xf6\x8e\x36\x3b\xae\x77\x93\x29\xd7\xf2\xe3\x78\xd4\x35\x30\xeb\x1c\x8b\xd1\xd2\x82\x17\x5b\x41\xc2\x70\x96\xf2\x23\xc9\x5f\xf7\x26\xb1\x7a\xc4\x6b\x3e\x8a\xe5\x67\xad\x6a\xe6\x88\x92\x15\xca\x37\xab\x7e\x3d\xde\x8c\xe1\xa1\xf0\x13\x66\x38\xe8\x71\x7d\xbb\x9e\x0c\x43\x02\x69\xcf\x77\x83\xe9\x48\x76\x9a\x88\xe5\x00\x55\xa8\x09\xd5\xb0\xac\xab\x24\xd5\xe5\x0f\x57\x0a\x68\xe0\x94\xb3\x59\xd1\x32\xf8\x05\x3b\x6d\x61\x3b\x71\x3e\x7f\x28\x71\xf8\x21\x1f\x53\xbf\x81\x18\x86\xb6\x12\x8c\x87\xf6\xe4\x8e\xf3\xfb\x2a\x1c\xde\x7f\xc4\xbe\xfc\x7d\xbd\xe4\x8f\x5c\xc2\x74\x87\xa9\x44\x18\xfc\x80\x34\x1b\xd6\x44\xf1\x79\x6b\x3c\x31\xe0\xc9\x6e\xdd\x46\x90\x86\x58\x28\x10\xa6\x36\xcc\x89\xa5\x4c\xd6\xbf\x74\x75\xa7\xdf\x15\x44\x40\x9f\x24\xe9\x2f\xb4\xf5\x0b\xa6\xe8\x59\x71\x9b\xb9\x00\xa1\x8a\x3f\x9d\x51\x5d\x00\x4f\x84\xbd\x08\x87\xee\xb7\xe7\x01\x45\x52\x19\x6e\xc2\x26\x82\x90\xf7\xca\x7b\x3d\x11\xeb\x34\x03\xb0\xc1\xba\x0c\x66\x49\x3e\xc3\xd1\xcc\xf5\xf8\x87\x7d\x40\xca\x83\x90\xa2\x0e\x00\x64\xf7\xc2\xe4\x89\xd4\xd9\x6d\xc2\x8b\x4b\x89\xfe\xd6\x30\xa4\x19\xb3\x62\x4e\xb6\x5a\xda\x6d\x45\x6f\x7d\x6c\x3e\xc6\x6e\xc9\x1b\xc3\xd3\xf2\xd5\x94\x45\x2c\x58\x94\x06\xbc\xf7\x86\x83\x27\x60\x85\x9e\x4e\x3f\x77\x6d\xb8\x69\x6e\x3a\x7d\x50\x0c\xbc\xf3\x9e\xee\x58\xf2\x6f\xfa\xc5\x66\xc4\x48\x55\x73\xa0\xe7\x56\x94\xa4\xde\x8e\x9c\xee\x3c\xf6\xb8\x81\x3a\x9f\xa0\x7b\x29\x61\xbb\xef\xc3\x81\x78\x69\x66\x5d\x9a\x21\xf8\xb7\x09\x43\xec\xe6\xe1\xc1\x0b\x3f\x98\x66\xa3\x4e\x23\xca\x7c\xcc\xbe\x0a\x72\xdf\x96\xf3\x5b\xbd\x10\x75\x6e\xb3\xbd\x52\x2d\xfd\x47\x5b\x1f\x3c\x52\x9e\x3c\xf3\xcb\x91\x2a\x09\x84\x99\x46\x9d\xd2\x50\xc6\x11\xf7\x9a\x05\x95\xe1\x90\x37\x8f\x90\x1b\x5b\xf3\x44\xcb\x21\xf0\x4a\xa0\x51\xba\x50\x73\x81\xb5\xfe\xbe\xbc\x8d\x09\x96\xd9\xfa\x85\xfe\xaf\x50\xa8\xcd\x63\x18\x78\xab\x80\xe6\x82\x0a\xc6\x0e\x4c\xe3\x43\xd3\x70\xa1\x6f\x7f\xef\xb3\x7f\x86\x88\x74\x9e\x50\xc1\x9b\x78\xbf\xc1\x2d\x88\x05\x7c\x5a\x7a\x0e\x8a\x28\x62\xbd\x0a\x00\x88\x58\x80\xdd\x21\xbe\xc0\x3c\xb5\x45\xb1\xf3\xb0\x62\x29\xa6\x79\xbf\x3a\x26\xe1\x3c\x7e\x63\xde\xdb\x8c\xf5\xbe\x1a\x76\xbf\xeb\x10\x50\x06\x4b\x8e\xeb\x59\x85\x6b\x1b\xcc\xe1\xf7\x18\x7e\x2e\x7f\xef\x9f\xd0\x3a\x0d\xe6\x18\xae\xd9\x2c\x3f\x04\x8e\xcf\x0d\x3a\x02\x42\x32\xe8\x3a\xca\xb7\xac\xd3\x14\x70\x58\x07\xe9\x76\x8a\x33\xf6\x2b\x82\xb5\x63\x6d\x89\xd1\x0e\xe4\xa1\x1f\xc6\x7b\x70\x69\x3d\x6a\x03\x82\xe6\x14\xe0\xc2\x90\x84\x66\x17\x14\x3b\x29\x3c\x31\x37\x04\x59\x92\xf5\x28\x1a\x66\xc6\x49\xa8\xc8\xbd\x0c\xc2\x9a\xd9\x06\xf6\xd9\xa5\x00\x7c\x95\x08\x84\xf8\x87\xd5\x30\x97\x48\x2b\xba\x2f\xd5\x40\xa4\x7b\x04\x9f\x7b\x83\x55\x91\x26\xfd\x7d\x23\x5b\xbc\xe0\xb0\x62\x9a\x12\xe5\x09\x66\x13\xd0\xd0\x97\x3d\x4e\x3f\x34\x8b\xf0\x5e\xf5\x8c\x48\x98\xc4\x5d\x04\x06\x92\xe7\xf8\x59\xd2\xa5\x05\xf1\x12\xc8\x1f\xf8\x6d\x00\x6c\x9a\x00\x05\x97\xf3\x39\x51\x9c\x2a\x73\x64\xbc\xac\x17\xd4\xb3\x78\xcf\x90\x38\xfb\x3d\xc7\x9a\x59\xdf\xc0\x51\x01\x65\x0d\xf4\x72\x0f\xd3\x04\x78\x97\xef\x57\xeb\xf2\x98\x43\x58\x60\x9e\x98\xe3\x62\xf9\x49\x09\xa3\xef\x68\x7c\x2a\x11\xa6\x87\x40\xcd\xb3\xfe\x43\xf5\x91\xd1\xbb\x7c\x1f\x5f\xc3\xf6\x26\x7f\x4b\x7f\x1d\xd1\xf1\xbd\xbd\x39\x57\x46\xb5\x1d\x68\x08\xf0\x06\x18\x04\x33\x17\x9e\xc3\x3e\x81\x1c\xfc\xcf\x04\x5c\xd6\xb7\x32\xcd\x12\xd4\xdc\x17\x9c\xe9\x0c\xfd\x8e\xca\x60\x18\x74\xe3\x35\x0f\xad\x32\xd7\xaf\xcf\x65\xec\x0f\x93\x2f\x69\x89\x7b\x88\x7d\x7f\x7b\xde\xd4\x80\x33\xf6\xb2\xf0\x37\x95\x31\x2e\x9b\x2c\x9f\x64\x94\xf2\x20\x64\x02\x6c\xfb\x68\x56\x01\x75\xa7\xda\xd8\xfc\x4f\x7f\x4a\x03\x6f\x30\x34\x7d\x7a\x8a\xae\xf3\xc0\xce\x37\xb1\xb6\x38\x5d\xed\xaf\x55\x96\x5f\x52\x9d\xeb\x72\x68\x88\x06\x94\x14\x67\x9a\xe7\xd5\x46\x9e\x14\x98\x94\x03\x08\xc4\x74\x2b\x03\xb7\xde\xa4\xc2\xec\x81\x5e\xd9\x02\x3c\xc3\xa6\xe0\x93\xd6\x82\xc1\xa9\x27\x61\x0c\xf9\xbd\xf0\x26\x49\xf8\xf5\xab\xd2\xb4\x48\x30\xd8\x5c\x27\xcf\xc8\xf1\x64\x03\x84\x61\xd2\xf5\x34\xf9\x59\x1e\x35\x07\xb0\x02\x59\xdb\x2f\x00\x93\x4f\x8a\xca\xd6\x8b\x0b\x11\xd4\x0a\xab\x55\x94\x49\xd3\x60\xf3\x7b\x85\x10\x09\xd3\x8f\x24\x53\x29\xf2\x71\x17\x64\xee\x01\xbe\x03\x50\x83\x9f\x87\xf2\xf8\xd6\x4c\x06\x9c\x30\x8e\x6f\x9b\x13\x6e\x84\xfd\x92\x3d\x9b\xb3\x9f\x10\xb0\x31\x78\x06\xec\x33\x73\xef\x39\x65\x13\xc9\x7c\x59\x51\x36\xc2\x67\x90\x03\x81\x39\xa1\x8a\xe9\x8e\xdd\xfa\x56\x43\x97\xa2\x39\x30\x66\x1d\x4f\xc2\x6d\x5f\x6c\x1b\x22\x01\xda\xff\x22\xf6\xa9\xfb\x28\xc4\xcc\xe6\x7b\xa7\xbe\xe1\x0c\x8c\x1e\x03\xfd\xce\x3c\x87\xdf\xfc\x0b\x7e\x99\x3f\x8b\xb0\x46\x26\x48\x8a\xd6\xfb\xbe\xae\xe7\x5b\x31\x3c\x69\x6a\x7f\x0e\x15\x9d\xae\x21\xe2\xc4\x49\x6e\xc8\x2a\x97\x10\x03\x61\xfd\x27\xff\x18\x24\x6b\xfb\x11\x91\xea\x6f\xd3\x47\xf9\x24\x67\xb1\xac\x8d\x89\xbc\x71\xd9\x12\xcf\x42\x8f\x65\x0a\xc0\x79\xf0\xe6\x79\x64\x1b\x73\xd7\x78\x00\xb2\x39\x92\xf0\x6d\xa9\x17\x19\x17\x9b\xfe\x7e\x53\x09\xd3\x8d\xa9\x67\x6c\x89\x7f\x0b\x26\x86\x4f\x17\xcd\x41\x59\x7a\x86\x78\x60\x42\x08\x49\xa2\x07\xe0\x3f\x49\x42\x03\x52\xe0\xb4\x77\xc2\xe5\x78\xb8\xe7\xa7\xb8\xc6\xac\x44\x8b\x91\xcf\xd8\xc9\x01\xf6\x8e\xd8\x75\x98\xa6\xa6\x3f\x1d\xf2\x8b\xe4\xbe\x62\x7b\x11\xd0\x53\xe8\x75\x31\x69\x4e\x4c\xbc\x3d\xb2\x2b\x9c\x64\xe7\x62\xc4\x55\xa4\x27\xde\xff\x48\x3a\xaf\x65\x47\x71\x20\x0c\x3f\x10\x17\xe4\x74\x69\x82\xc9\x19\x9b\x70\x47\xc6\x60\x92\xc9\x3c\xfd\x88\x33\xb5\xe5\x9d\x9a\xda\xb3\x3e\x84\xee\xbf\xff\x4f\x6a\x49\xb8\xc9\xd2\x30\xbd\x39\xf8\x0f\xc5\xca\x3a\x39\x99\x55\xcb\x22\xd1\xd2\xd6\x0f\xb1\xb8\xf2\x38\x39\xaf\x33\x22\xb8\xa7\xeb\x75\xd8\xeb\xa7\x12\x9d\x66\xa8\x9d\xb7\x45\x82\x40\x30\x80\x61\x7f\xef\x0f\x14\x3e\x55\x9a\x2d\x52\x79\x9e\xd3\x40\x09\x42\xd6\xec\x71\x0b\xb6\x62\xd4\x0d\xdd\x15\x01\xa2\xa2\xbc\x31\x62\x20\xb5\xe0\x83\x96\xde\xfa\x5e\x99\xa4\x26\x1c\x83\xfc\x1a\x71\xa3\x24\xbd\xdd\x5a\x1f\xb6\x47\xe8\xc7\xb2\xf5\x9c\x37\xa6\xbf\xda\xf3\xbf\x1e\x39\x19\x38\x4d\xa0\x23\x4f\x77\x03\x09\x31\xf4\x6b\x41\x1f\x70\x29\xd2\x28\x69\x6d\xe7\x40\xbf\x7b\x5b\xe3\x65\xe5\xa2\x01\x93\x5c\x64\x23\x4e\xf3\x9b\x7c\x0e\x13\x9a\xac\xeb\x6a\x07\x18\x41\xb2\xb9\x73\x5d\x99\xdc\x94\x3e\xf1\xdb\x03\x48\x98\x6d\x8e\xb6\x95\x1d\x86\x61\xb5\xeb\x7b\x88\x9e\xa8\xf9\x77\xbe\x4c\xff\x8d\xe6\x38\x28\x68\x10\xd2\xff\x3a\xcd\xb6\xf0\x8b\xb8\xbd\x36\xe0\x21\x5a\x27\xff\xc6\x0b\x0f\x51\x29\x5b\x4e\x89\x9c\x54\xb4\x8a\x7b\x5c\xe7\xce\x63\xf0\xd3\x97\xd9\xc9\xab\xb8\x29\x2b\xf8\x2a\xb4\xbf\x18\x23\x49\xe4\x9c\xbf\x6e\x7f\x47\xd3\x34\x21\x2f\x85\xe8\x9d\x6b\x79\xd9\x25\x3d\x44\x30\x8c\x1f\x17\x7c\xd8\x2a\xfb\xd6\xf1\x4b\xfb\x6a\x6d\x04\xa7\xa6\x1c\xaf\xd3\xeb\x6b\xc1\xc2\x3d\x16\x1a\xc4\xe9\x33\xb0\xbd\xfe\x35\x7d\xa5\xe6\xa0\xf2\x70\x9b\x41\x4c\x2b\xed\x57\xb0\x78\xda\xf4\x01\x91\xe2\xb6\x8f\xd3\x14\x16\x11\xf9\x6b\x59\x0f\xe7\x01\x93\x27\x9b\xbd\xe0\x55\xa8\x36\xba\x53\x72\xb6\x38\x1a\x18\xcd\x91\xa4\xa4\x32\x7c\x0b\x61\xac\xdc\x7e\x96\xf5\x39\x7f\x33\x5c\x4e\x85\x4c\x57\x24\xe7\xb5\xef\xa7\x2b\xbe\x39\x81\x3f\x66\xce\x17\x1f\x5a\xb8\x85\x41\x6f\x01\x81\x5b\xe9\x6f\xaa\x8e\x47\x41\x3f\x0e\xf1\xf1\x72\x39\x8e\x73\xaa\x27\xd7\x55\xe2\xdf\x06\x59\xcd\xc5\x06\xa1\x5b\xd6\x97\x71\xb2\x06\x54\xb2\x9b\x9d\xc6\xa1\x1b\x01\x50\xa6\xfb\xfe\xf7\x3d\xe8\xad\x2b\x10\xd6\xdb\x66\x04\x14\x65\x19\xe1\xd0\x85\x8f\xdf\x4c\xc1\xc0\x65\xd3\xc4\xe7\xf9\x68\xaf\x0a\x91\x06\x5c\x20\x82\x7a\x4a\xc6\x2a\x92\xe8\x60\x9f\x53\xf0\xea\x1a\xe7\x34\xfa\x0b\x20\x11\xee\x5c\x10\xfb\x8c\x56\x6d\x21\xf7\x73\x10\x92\x76\x10\xc3\xf5\x83\x85\x6f\x33\x90\x31\xb7\xdf\xd6\x8d\xf2\x76\xd7\x79\x1f\x14\x78\x88\xe5\x70\xd5\xf3\x50\x68\x3c\x9c\x9f\x6f\x25\x3e\x01\x1d\x57\x02\xf9\x99\x16\x3b\x1b\x80\x88\xf8\xde\xd7\x9b\x69\x0b\xdf\x3e\x90\x2d\xf7\x17\x89\xcb\xa7\x7d\x3e\x21\xd2\xb0\xc0\x0b\x12\x69\xfa\x7b\x41\x74\x1a\x4e\xa6\x84\xa7\x2c\xca\x6b\x34\xbd\xc3\x1b\x78\xb0\x6f\xab\x47\x57\x56\xf3\x56\x9c\x29\x9e\x63\xd2\xfd\xa0\x0d\xa7\x2c\x39\x90\x29\x45\x91\x19\x3f\x07\xe0\x9c\x6a\xb3\xe6\xbd\xe8\xee\x67\x40\x0f\xc7\x31\xde\x4f\xce\x79\x70\x89\xf1\x19\xae\x07\x73\x2a\xdc\x43\x79\x7e\xae\x62\x0b\x3a\xc1\x5d\x0f\x23\x3e\x5a\x4b\x96\x19\x08\xe8\xf8\x0b\x0a\x26\x77\xe2\x52\x50\x3d\xb5\x73\x1e\x09\x4a\x87\xb8\x13\x0a\x31\x7a\x31\x65\xaa\x66\x05\xe7\x25\x72\xf9\xac\x89\x97\x25\x24\xd3\x51\x08\x7b\x02\xec\x3a\x9b\xbe\x90\x5e\x45\x72\xc3\x6d\x6a\xa6\x4a\x6d\x8e\xdc\xc8\xcd\x89\xef\xc6\x0b\x40\x2d\xc4\x54\x30\x31\x42\x47\xe3\x53\x2d\x61\xeb\x61\x13\x43\x54\x61\xc9\x91\xe3\xef\xc3\xbf\xc3\xbb\x85\x2d\xad\x53\x2b\xbc\x69\x8f\x0f\x9a\x09\x20\xc8\x49\x4d\x79\xe0\x1b\x7e\x91\x33\x9b\x40\xd4\x6c\xc3\xe9\x8a\xf7\x21\x49\xcc\x81\xb1\x40\x7d\xd4\xbe\x58\xc3\xe0\x2a\xe3\x19\xbc\xbf\xf7\x2c\x8b\x71\xd9\xfe\xf7\x83\xcd\x40\x94\xe7\xe6\xb1\x9b\xa8\x19\xbe\x03\x7e\xef\x1c\xf7\xd1\x37\x24\x14\x19\x61\x98\x7c\x2f\xfa\xf9\x3d\x20\x61\x2b\xdc\xce\x40\xc2\x8d\x87\x1a\xf9\xd7\xb8\x85\xc1\xf7\xcd\x46\x41\xa9\x4c\x6c\x23\xc0\x63\x50\x22\xd1\xde\x7e\xd5\xdd\xfb\xeb\xfb\x9a\xfc\xb3\x82\xf4\x39\x63\x49\x64\x4a\x50\xb0\x90\x5a\xe8\x06\xe6\x12\x75\xe4\xd2\xf0\x65\x0f\x03\x56\xcc\xb7\x30\x45\xbb\x5f\x07\x00\x50\xd0\x9b\x80\x25\x3a\x98\xc4\xce\x44\x7f\x86\xc8\x82\x6a\xf1\x5e\x6e\x78\x78\x91\x83\xff\xc8\xc2\x8e\x5c\xc3\xda\x11\x0b\xe7\x67\xe4\x92\x73\xbd\x5f\xad\xad\x76\x97\xdd\x8e\x9a\xd7\xe3\x34\xeb\x18\xaf\x52\xb5\x12\x68\xd3\xbf\x1e\xb1\x3b\xd4\x5b\x8d\x03\xff\xdb\x60\x9b\x73\x19\xe9\x73\xa8\x3d\x97\x6c\x37\xae\x75\x56\x9e\x68\x0e\x06\x3e\xe7\x1e\xba\xf7\xe0\xbb\x50\xb1\x61\xd2\x1a\xae\xe0\x59\x11\xd0\xf7\xfb\xd5\x7b\x3a\x08\x7a\x7c\xa7\xf4\x86\x3e\x0c\x1f\xef\x4c\x76\xb2\x1b\xf5\xc1\x24\xf6\xce\x58\xf2\xc9\xbd\x19\xbb\x87\xad\x9f\xf9\x55\x75\x94\x72\xa0\x97\x05\x95\x46\x16\x2d\x6f\xff\xc0\xb8\x77\xf0\x2a\xfa\x52\x45\x57\xa8\x12\x6b\x63\xa4\x18\xfa\xd8\x9e\xd9\xd0\x83\x6c\x8d\x58\x7d\x33\xe1\xde\x3c\xdb\x0b\x84\x8f\x57\x60\x0a\x91\xb4\x63\x55\xe0\xf2\x46\xe6\xd0\x78\x91\xba\xdd\x93\x4c\xa7\x2a\x5e\x69\xfd\xbe\x18\x9a\x8c\xe3\xeb\x4c\xb6\xf0\x27\x33\x89\xd8\x28\xbf\x78\xc6\xe7\x46\xb9\xe6\xfc\xf3\x41\xee\xc3\xcf\xf9\xd7\xd7\x0d\xd0\x45\x77\xcd\x46\x01\xaf\xee\x44\xa3\x25\xcd\x2e\xc3\xb7\xc1\x0b\x7d\x83\xc8\x29\x56\xf8\xaf\x47\xe7\x8d\x53\x28\xa9\x2e\x01\x9d\x43\x8b\x3f\x34\x0d\x49\x05\xce\x5e\x52\xc2\xc3\xe5\x44\xb1\xb4\x66\xdf\x80\xcd\x36\x76\x34\x5e\xf1\xc2\xc6\x6e\x49\x92\x7b\xd6\x4a\x09\x9b\xfd\xf7\xf4\x5e\xad\xea\x76\xac\xc0\xd8\x21\xee\x1e\x36\xb4\x7d\x94\x56\x0d\x3b\x9b\x89\x26\xf3\xf3\x12\x7f\xe5\xdc\xe4\x2b\x5e\x0a\x4e\x6b\xc1\xb0\x60\xf9\xc3\x36\x3b\xe5\xfa\x43\xee\xf9\x9b\x5a\x54\x6a\xd5\xa7\x96\xcf\x30\x69\xe3\x98\x04\xf3\xbd\xeb\xd0\x78\xaf\x9a\xd3\xbc\x61\x52\x00\xdf\x2d\xb5\xf1\x6e\x0d\x75\xb0\x9f\xb1\x29\x8f\xb9\xf6\x74\x34\xce\x51\xa1\xf0\x80\xc2\x00\xc9\x9b\xbf\xf3\x38\xea\xf7\xfb\x1d\x7e\xe3\x20\x00\x9f\x37\xb0\x1e\xe1\x97\x2c\x42\x62\xba\x5b\xe9\x14\xa6\xb4\xb3\x9f\x7a\x3a\xe2\xeb\x6b\x1f\xed\xb5\x4d\x06\xc3\xed\x5c\x71\x50\x76\x33\x1c\x33\x9e\x0e\xe8\x31\x74\x88\x66\x34\x76\x7f\x7d\x59\xb7\x8d\x25\x6e\x6b\x61\x6d\xb4\x55\xd4\x4c\xc1\x93\x13\x5e\xef\xa7\x79\xcf\x13\xfa\xef\x77\x1c\xc4\x3f\x39\xd2\xb9\xf4\xe7\xa1\x90\xb2\xfe\xa0\xf1\x97\x7c\x06\x8d\x87\xb6\x89\xaf\x36\x1d\xa6\x99\x35\xe5\xab\xca\x38\x84\xa7\x49\xb1\xc5\x95\xad\x8a\x2c\x5c\xe8\x07\x59\x82\xb9\x7e\x6a\x08\x90\x3f\x18\xd6\xbf\x27\xdd\x57\x23\x61\x6b\x11\x56\x6c\x1b\x2d\x7a\xb1\xa9\x30\x9d\x04\x6e\x1d\x61\xdd\xe1\x54\xf8\x07\x0c\x7c\x9f\xf6\x6e\x13\x53\x7e\xa5\xbe\x73\x66\xb4\x95\x6e\xbc\xa3\x04\xee\x6f\x8f\xf6\x8a\xe8\xec\x85\x6a\x5e\x6a\x73\x40\x3e\x8c\x5b\xc1\x9b\x7d\x02\x41\x54\xac\x43\xeb\x12\xe9\x73\x5f\x52\xa5\x25\xdc\x00\x74\x6b\xd0\x3e\xcb\xce\x55\x74\x9d\xe9\x63\xa9\x46\x8d\x78\xcf\xb5\x0a\x9e\xfb\x10\x43\xe6\x11\xf2\xaf\x17\x5f\x25\x7c\xb7\x4c\x49\x96\xa3\xd3\x13\x63\xea\xba\x92\xca\xa6\x73\xbf\x24\xcb\xd1\x98\xf1\xf8\xfe\xb6\x81\x27\x5a\xf8\x23\xf8\xca\xfb\xa1\x18\x35\xc3\x9e\xf4\x55\x1e\xb6\x72\xef\x77\x30\x47\x9d\x7a\x77\xaa\xcd\xa9\x74\x0c\xb1\x74\xb4\xa9\x78\x78\x39\x21\xb6\x3b\x92\x34\x59\xfc\x31\xd2\x36\xd3\x87\x52\x27\x42\x85\xe4\xbf\xfb\x53\x18\x4a\xb6\xc7\xa1\xe9\xa7\x1d\x33\xbd\x5e\xf1\x27\x63\xfc\x0d\xc7\xda\x15\x64\x3e\x89\xbe\x84\xbf\x33\xc9\x44\xd1\x59\xc2\x2b\x69\x5b\x2b\x73\x70\x36\x98\x71\xe6\x30\xe3\x70\xef\xb6\xa7\x39\x1e\x0e\xd6\x51\xd8\x32\x50\xd6\xbd\x3d\xd7\x1d\x32\xe0\x73\xce\x3f\x43\xaf\x67\x9d\x95\x2c\x14\x7e\x3c\xf7\x4a\x84\xf5\x89\xea\xfe\xde\xcc\xef\x64\x36\x4d\x63\x36\xfd\x44\x80\x6b\xf2\x89\xe0\xf9\xe6\x3a\xf1\xbb\x55\x8c\x91\x3f\xe0\xc8\xda\xb0\x34\xc3\x06\xf3\x07\x48\x6c\x73\x4a\xc4\x66\x8d\xd4\x3a\xaf\x11\x81\xbf\xb8\x52\x38\x84\xc5\x0b\xd0\x0e\x57\x13\xe3\x95\x19\x04\x14\xaf\x20\xd8\xa2\x71\x7f\xe8\x70\x7a\x50\xf9\xcc\x2d\x3c\x2a\x04\x67\x6e\x08\x07\x80\xe9\x57\x39\x8d\x2b\xbb\xcc\x26\x02\x6a\x20\x1e\x46\x13\x61\xa6\xa0\xbf\xee\xb9\x17\xf0\xe9\x32\xa1\x36\x5b\xf7\xa5\x70\x46\xf8\x3c\xee\x46\xa6\xe8\xf5\xe4\xee\x30\x75\x41\x4c\x18\x97\x75\xcd\xb4\x76\x19\x97\x7e\x32\x16\x63\x95\x9a\xdd\x1d\xe1\xe4\x43\x29\xa3\x0e\xa5\x37\xb6\x48\xba\x5b\xc1\xef\x4d\xb1\x59\x5f\xca\xc0\x57\x37\xa5\xce\x85\x45\x8c\xbd\xcd\xee\x02\x20\x41\x3a\xdf\x4b\x04\x2f\xe1\x8e\xfe\x35\xed\xc8\x2e\xed\xe2\xe9\x6e\x0a\x1b\xa9\xe2\x9e\xc4\x1d\x70\xe7\xce\x2a\xa8\x6c\x8e\x08\x8d\xbb\xf8\x2f\x4b\xee\x3f\xc7\xa4\xd8\x00\x73\x41\x5e\xfc\x7b\x0a\xf7\x3c\xfb\xeb\x13\x9b\xe0\x17\xe1\x0d\x6d\xed\x33\x03\xcb\x12\x19\xea\xe1\x0f\xf0\x69\x91\xe9\xe2\xdd\x5e\x0c\xdb\xd1\xa8\x7d\xa6\x35\x48\x8b\xe0\x84\x02\x8f\x3c\x4d\xb3\xbf\xda\x46\xf5\x42\x12\xcd\x96\xb0\x90\x1d\xa5\xea\xea\x5f\x0c\x97\x29\x4d\xb3\x3e\x0b\xdb\x76\xdf\xcc\xbd\xed\x21\x8b\xea\xbd\x9e\xc2\xf9\xfa\x30\x84\xf7\xac\x55\x4a\xff\x9c\x76\xcd\xa1\xa6\xf3\x12\x1e\x87\xe9\xbf\xae\x04\x8b\x41\x48\x69\x55\x8a\x71\x55\xa2\xf1\x37\xa6\x7d\x7f\x09\xd6\xb2\xca\xf6\xc5\x2d\x06\x12\xb3\xb0\x97\x36\x91\xfb\xcc\xcb\xb8\x52\xc6\x1d\x2b\x7b\xf5\x06\x76\x11\x39\x3a\x53\x73\xd5\x45\x7c\x54\xa7\xf1\x33\x2e\xf0\x81\xed\xc1\x7f\xba\xaf\xf7\xfd\x36\x80\xa3\x68\x6c\x1f\x65\xed\x10\x65\x1f\xbb\x21\xe4\x0e\x62\x16\x6f\x60\x43\x35\xdb\xc5\xa4\x3d\xa8\x19\xb4\xce\xd8\x2a\x13\xc6\x0d\xc4\xaa\x46\xca\xc2\x8f\x45\x09\xda\xac\xe9\x93\xe9\x7c\xb3\x43\xb7\x12\xd3\x8e\xac\x30\x7a\x06\x98\x04\x3b\x23\xc5\x24\x02\x6a\x00\xcb\x64\x86\x5b\xd1\x65\xaa\x57\xab\x97\x32\xb1\x90\x30\xc1\xac\x70\x57\xed\x2e\x0a\x42\x00\x7c\x5e\xd8\xbd\x15\x22\x9a\x83\x2c\xb6\x7d\xef\x07\x24\xad\x9d\xb5\xfb\xf8\x4d\x50\xd4\x40\xc5\x5a\xfd\x96\xa4\x59\xf2\x3b\xfe\x50\x72\x87\xec\xc3\x93\xeb\x9d\xc1\xd5\x4b\xdd\x3d\x2b\xa0\xd9\xa3\xc2\x41\xbd\xea\x6b\x0b\x6e\x7a\xfd\x4d\x11\x11\x79\xb0\x4e\xf0\xac\x86\x9e\x5e\xca\xf7\xd3\x43\x72\xfb\x59\xf2\x4e\xab\xbe\x85\xef\xcf\x2b\xa5\x71\x4d\x13\x2c\x9f\x0b\x2c\x8d\x57\x3c\x9d\xde\x51\xf9\x05\xc9\xc0\x1f\xe9\xbc\xf9\x1a\x99\x6d\x6d\xe1\x68\x38\xe0\xd6\x74\x99\xb0\x7c\x89\x30\x14\x7c\x80\xa4\x4b\xae\xa5\xa7\x7c\x24\x70\xc8\x3d\x0e\x92\xcb\x1e\x34\x95\x5b\xc3\xc0\x77\x90\x80\x10\x42\xa1\x7e\x6b\x49\xb3\xdc\x5e\x93\xe9\x07\x6f\xad\x03\xef\x21\x7c\x3a\xe1\x73\x37\x2c\xec\xe0\x82\xd1\x20\x29\xc8\x80\xa2\xca\xad\xca\xdf\xd9\x81\x8b\xc8\xb0\xb4\x3a\xf0\x2f\x11\xe9\xae\xd2\xd1\xe0\x6f\x54\x09\xff\x82\xb6\x92\x02\xfe\x0c\xee\x53\xb8\xa0\x9d\xb0\xd2\x7c\x42\x92\xe0\x0d\xde\x71\xd2\x71\x1f\xed\xf7\xbf\x13\x89\x2c\x60\xc4\xcd\xc3\x2f\x55\xb4\xe3\x05\x1e\x7e\xe8\x11\x48\x61\x87\x67\xf4\xf5\x52\x74\x8c\xfb\x37\xca\xa6\x57\x9c\x1d\xd1\x16\xe4\x2a\xec\xc8\x50\xdc\x5c\x43\x2a\x91\x8b\x19\x5c\xa9\xdd\xf9\xef\xf4\xfa\xda\x6d\xc8\x93\x38\x01\xc5\xe6\x5f\xe3\xa9\x3d\xbe\x52\x21\xa6\x29\x3a\x5e\x10\x2a\xb6\xfc\x10\xcb\xb5\xb5\xe8\x0f\x80\xf5\x41\x87\x17\xeb\x10\x7a\x06\xb2\x92\xa1\x45\x61\xbd\xbf\x74\xfe\xb8\x5a\x5a\xa8\x8a\x4b\xfb\x35\x7c\xf3\xc4\xf3\x93\x55\x6d\x90\xef\xed\xa8\x2e\x14\x9b\x00\xcc\x05\xb5\xf2\x25\x96\xce\x12\x50\xe6\x87\x80\xb7\x55\x24\x46\xfa\xd4\xdc\xfa\x21\xf6\x0e\xe5\x13\x42\x03\x0f\xea\xb3\x3f\x4a\x90\xca\x23\x78\xc1\x2a\xf8\xd8\x23\x5e\x86\x3f\x0a\xfa\x2c\xc1\x2f\xf7\x5d\x34\xf9\x6b\xbc\xba\x2f\xef\xf7\x4b\xd6\x65\xa2\x6c\xcd\xdb\x7c\xd8\xab\x7d\x27\xf0\x76\xac\x63\xd0\xcf\xcc\x7e\xe7\xe7\xb0\xb1\x36\xf9\x23\xdc\x95\x43\xbd\x79\x9a\xbb\x10\x66\x02\x6a\xfb\x50\xf5\x98\x90\x3c\x16\x00\x73\xea\xa7\xdd\x46\x3e\x80\x0e\x52\x1b\x03\xc7\xc5\x91\xbf\x1b\x83\x1d\xde\x45\xc9\x75\xcb\xd9\x21\x68\x26\x8a\x86\x63\x48\x0c\xb4\x2d\x97\x10\xa0\xdf\xb4\x84\x31\xd5\xe3\x7d\xaa\xed\xbe\x6a\x31\xca\x08\x6d\xf6\x7e\xa3\x67\x31\x10\x68\x52\xf3\xe6\xdb\x61\xa1\xd8\xaa\x7c\x4b\xf8\x7d\x65\x8c\x71\x31\x08\xec\xa0\x79\x98\x2f\x61\x69\xb3\x26\xd4\x93\x6b\xd9\x9f\xec\x0a\xe1\xc4\x0a\x2f\xb8\x0e\xc2\x0a\x14\xd8\x3c\x83\x95\xf7\x92\x04\x79\x9f\x60\xdf\x31\x0a\x6a\x50\x0d\xdc\x36\x91\x92\x69\x9c\xbc\x76\xd2\x1a\x05\x84\x17\x65\xb3\x74\x07\x24\x15\x59\xec\x32\x44\xa9\x3d\xb3\xe9\x29\x6b\x47\xa4\x39\x75\x0e\x85\x4d\x98\xcc\xdd\x2a\x31\x6d\x13\xbe\xe0\x8b\x92\x99\xad\xd5\x61\x74\xaf\xd8\x50\xfa\xf9\x7c\x72\xf9\xf9\x8a\x81\x27\x69\xb1\x2b\x7e\xf7\x63\x4d\x6e\x4c\xd6\x1e\x88\x87\xdc\xeb\x55\x2d\x83\x4a\x1b\xdf\x08\xc2\x90\xf4\x83\x2b\x5e\x1d\x4a\x9d\x51\x6e\x4b\xf7\xac\x11\x81\x77\x0c\x12\x39\x22\x07\xc1\xf9\xe6\xe4\x4e\x66\x16\x05\xee\x02\xa9\x1b\x5d\xea\x0d\xcc\x9a\xa1\x3f\x5e\xbf\x19\x4a\xa6\xa4\x1f\xa9\xac\x52\x1a\x2e\x56\x5b\x50\x5c\xac\x0d\xc7\xa7\xbb\x7f\x28\xf0\x08\xaf\xf8\x25\x57\x06\x74\x3b\x0b\xa0\x32\xdc\x54\x94\xd5\x03\x20\x5b\x4c\x01\xff\x90\xbf\x36\x37\x0c\x2e\x35\xaf\x1a\x5a\x4d\xb1\x81\xe5\x62\xe1\x41\x81\xeb\x9d\x48\xdd\x9a\x13\xb1\x71\xc6\x23\x1a\xe7\xd6\x9a\xda\x02\xfd\xe5\xe5\xdd\xf1\x40\x98\x5e\x3b\xb7\xf1\x87\x14\x0a\x3e\x85\x5a\x52\xeb\x20\xa8\xbe\x00\xe3\xda\xf7\xf5\x81\xd2\x16\x70\xfd\x7d\x36\x7b\x6a\x62\xc8\x7d\xd8\xa1\xe4\x6c\xc5\xa7\x32\xb9\x61\xe1\x9f\x42\xcd\x50\x85\x45\x94\x66\x3c\x6f\x0f\x7a\xf1\x5f\xa8\x75\x15\x8b\x37\x9f\xb6\xa8\xad\xdf\xe6\x56\xfd\xa9\xd8\x70\xc7\xd5\x61\x1f\x58\x9e\x7b\x0b\x3a\x80\x82\x3b\xf0\x40\x6d\x73\x18\xb4\x10\xa7\xf6\x86\xb1\x35\x42\xe7\xc5\x2f\x9a\x62\x0b\x94\xa6\x77\x94\x4c\xda\xf3\xfb\xf2\x3e\xfc\x29\x33\x47\xaa\xc6\x7d\x2c\xc7\x8b\x0a\x79\xfd\x67\xb8\xf7\x24\x79\x78\x80\xfe\xde\xb2\x08\xfc\x86\xe1\xc9\x0d\x84\xbd\x75\x22\x21\xcc\xf4\xd5\x16\xdc\x73\x4c\xbd\x9a\x3f\x42\xf2\x31\x57\xb9\xf0\x18\xd4\x74\xe9\x26\xd4\x67\x2f\x9e\xd0\xa8\xb5\x19\xa0\x8d\x02\x7f\x7c\x61\x19\x40\x36\x5e\x7e\x91\x3c\x3c\x85\x8a\x81\x5b\x9e\xf9\x9e\x11\x25\x3b\x54\xc5\x3c\xef\x3d\xf5\x67\x72\x2c\x61\xe3\xdd\xcd\x30\xcc\xc8\x59\xe1\x7c\xfa\x86\xa5\xcd\x0d\x80\xfb\x5d\xaa\x7c\x98\x94\x1d\xe4\xfd\xca\xbd\xc9\x1b\x5e\x9d\xae\xea\xf0\x4b\x74\xd2\x6d\x6d\x52\xd6\xc1\x2e\x97\xcd\x09\xb6\xab\x23\x71\xb6\x27\x45\x13\xa7\xd5\x09\xdc\xbb\xef\xcb\x3f\xb4\xe2\x30\x21\x36\x3b\x61\x48\x6e\xbf\x67\x03\x12\xb4\xcc\x28\x66\x2d\x88\x42\xee\x6b\x08\x6e\xda\x2f\xa8\x49\x3f\xc0\x34\xf0\xf3\x60\x6d\x24\x83\xe0\x6c\x03\x0a\x0f\x38\xc1\xb4\x2f\x9c\x73\x74\x8e\xfe\x62\xb4\x5f\xef\xb4\x3f\x4d\x74\x82\x01\xa7\xc3\x94\x77\x7f\xae\xd5\xf4\x20\xba\x9a\x60\xd7\x34\x8f\x98\xac\x66\xc6\x52\xdb\x6d\xdf\xa2\xd7\x51\xe2\xdb\xe0\x29\xc7\xd8\xfa\xe3\x1e\xbe\x2a\x42\xbb\xb3\x7f\x35\x1c\xa2\x43\xe9\x88\x4f\x6e\x78\x6f\x40\x80\x51\x9a\x95\x85\x19\xb7\x3b\x20\x75\xa3\xda\x5b\x40\x0e\xaa\xbb\x89\x09\x82\x72\x7f\x83\xee\x8e\xc1\xb9\x51\x35\x59\xd2\x8d\xe6\xca\x5c\x16\x93\x85\x47\x56\x02\x35\xfe\x44\xb5\x98\x3f\xdb\x4e\x82\x77\x7b\x1e\x69\x20\x4e\x13\x66\xf5\x7e\x5d\xed\xed\x2a\xa3\x14\x5b\xfa\x25\xc9\x4c\x78\x6a\x39\xe3\x14\x77\xf6\x55\xe0\xa0\xcc\xe4\xa0\x44\x53\x10\xfe\xd6\xce\x29\x00\xde\x93\xcc\x37\xfe\xb3\x48\x85\x82\x48\x1d\x1e\xf4\x42\x57\x28\x17\xfa\xb5\x1b\xd6\x12\x15\x57\x51\xf5\x11\xb0\xef\xa5\x12\x67\x59\x6c\x72\xdb\xd8\x28\xc3\x26\xc7\x9a\xbe\x80\x17\x15\xdc\x8a\x68\xed\x53\x3f\xbf\x50\x3f\x2a\x8e\x58\xb3\x27\x59\xbe\x17\xa8\xf8\x18\x67\xf7\xba\x00\xf6\xe3\xec\x03\x3e\x61\x2f\x4f\x95\x07\xf7\xdd\x0c\x44\x15\x9c\x0e\x48\x04\x4a\xfa\xaf\xd3\xb0\xeb\x43\xbf\x08\x58\x17\x3a\x20\x83\xa3\xff\xce\xc3\xe7\x37\x5e\xc3\xd5\x96\x17\xec\x1e\xf9\x9f\xf1\x67\xeb\xa5\x70\x71\x7d\x6b\xbe\x2c\xa7\xe0\xe5\x9a\x5d\x31\x3f\x88\x2e\x91\xe1\xde\x42\x7c\x72\x48\xbd\x2c\x7f\xe1\x0c\xaf\x94\x1f\x0c\x7c\xaa\x27\x93\x95\x23\x53\xc2\x57\xcb\x0f\x6f\xe1\x41\xc2\xc6\xf3\x51\x3d\xcb\x1b\xbb\x6b\x51\xab\x09\x80\x1b\xbc\x03\x3c\xee\xab\x1a\xc4\x61\x12\x9d\xe9\xe9\xa8\x9c\xa2\xc2\x30\x45\x7b\xbc\xe3\x89\x11\xb8\x5f\x5e\x87\xbe\xd8\xc3\x85\x0b\xa8\x98\x60\x1a\x46\xa0\x7b\x5c\x02\xb5\x46\x18\x66\xcd\x63\xca\xdd\xa9\xf4\x29\xe7\x92\xbe\x34\x3c\x84\x30\x4d\x21\x20\x41\x4f\x40\x46\x92\x72\x94\x74\xb4\x79\x2e\x47\x40\x85\xc0\xc1\xf4\xef\x94\x16\x2e\x89\x2d\xbd\xc2\x32\x49\x68\x9e\x14\x03\x17\x46\x10\xad\xa5\x21\xeb\xef\x1f\x83\x4b\x43\x2f\x00\x75\x84\xe1\xab\x73\x81\x5e\x19\x2a\xd1\xff\x00\xc1\x9f\xe0\xf1\x80\x1a\x4b\x03\xc0\x3d\x9f\x45\x1f\xac\xf8\xa9\x8e\x2c\xd4\xfb\xe5\x2b\xb6\x8e\xd8\x46\x4a\x26\x4f\x81\x59\x90\x77\x84\x86\x3e\x4e\x5d\x85\x0a\x2a\xa5\xd0\x4b\x86\x21\xe7\x4b\xe7\xfb\x9e\xe9\x14\x8f\x7d\xda\x0f\x82\xe8\x1d\x4b\xb1\x10\xec\xaf\x08\xbb\x3d\x10\xfd\x31\x5e\xb8\x24\x0b\xf7\x08\x0d\x33\xfb\x2c\x55\x2e\x88\x26\x0a\x66\xa9\x37\xf7\xb8\x01\x3a\xef\x30\x80\x76\x12\x58\x2b\xd3\x38\x3e\x86\x0e\xb4\x35\x05\xb1\x12\xea\x23\x9a\x60\x4a\x9a\x25\x6d\x25\x3e\x9a\x15\xa7\x17\x9c\xc9\xf4\x27\xe0\xb7\xb5\xd5\xad\x27\xfa\xcd\x76\x20\xe4\x62\x40\xb6\x31\x42\x01\x9c\x68\xa9\xdc\x9c\x71\xf9\x7b\x80\xca\xba\x00\x95\x14\x59\x5c\x60\x00\xfe\xf8\x77\xd5\x28\xd6\x90\xc8\x0e\x65\x17\x81\x37\x36\x7a\x3f\xae\x23\x6d\x7a\x1d\x14\xee\x50\x5b\xb4\xf8\x4f\x3c\xb3\x9b\x93\xb4\xfc\x5a\x85\x16\xa9\xaa\x9c\x49\xfe\x1b\x77\x79\xb9\xa2\x0b\x6e\x24\xff\x32\xc3\x07\xa7\x7a\x7f\x6c\xbe\x58\x3e\xfa\x24\x2c\x37\x6c\x25\x1f\x3b\x8d\x93\xa0\xb0\xaf\x38\x15\xdc\x2e\x8a\x2d\x01\x8d\x7f\x3d\x94\xc1\xef\xd5\x19\x2f\xa0\x9c\x3c\x32\xeb\x40\x60\x7f\x57\x4b\xe6\xc0\x53\x1b\x93\x1d\x92\x27\x32\xea\x04\x64\x6f\x00\x94\x49\x06\x68\xf6\x02\x31\xa7\x01\x88\xeb\xec\xdc\x86\x2c\xb7\x10\x21\x25\x09\x94\x2d\x92\x81\x52\xb3\x23\x57\x7c\xfe\xbd\xd1\xac\x57\x3d\x2e\xf8\xfd\x5c\x91\x98\xb4\x73\x2e\xff\x8c\xc8\x7d\x32\x4a\x49\x63\x34\x20\xda\x03\xd4\x84\xf9\x3b\xbe\x9a\xed\x7b\x58\x1e\xf0\xfc\xa1\x7c\xd6\x4a\xeb\x95\xdd\xd8\x19\xdc\x07\xfc\x84\x53\xd8\x92\xa7\x64\x6c\xb1\x8a\x1d\xce\xbd\x55\xd3\x54\x1f\x4c\x57\x3f\x70\xbd\xc0\x75\x93\x8f\xd7\x86\x7b\xda\x0d\x8c\xc3\x27\xe4\x69\xae\x91\xcc\x23\x46\x41\xab\x12\x45\xeb\x8b\x9f\x7e\x8f\x9e\x22\x21\x6a\x23\xb3\xb2\x6f\xd9\x09\x4d\x3f\x47\xb6\x26\x9d\xa0\xbf\xab\xc0\xd2\xe4\xe3\xf9\x4d\xe3\x44\xa1\x99\x70\x70\xf3\xb8\xc0\x34\xe8\x4a\xc8\xdd\x52\xcf\x02\xa8\x49\xc3\x81\x7b\x20\x94\xc8\x5d\x4a\xe8\x0c\x45\x3b\xfc\x5c\x5c\xcc\x99\xef\x78\xf4\xda\xbf\xba\x15\x9a\x27\x39\xa1\xc5\xea\x09\xa5\x69\xf4\x34\x5f\xdb\xa2\xaf\x62\x02\x62\x0e\x1e\x0f\xdb\x17\xa8\xee\xe2\xa8\x65\xfd\x66\x2c\xe4\x4d\x0a\x01\xf0\x9b\x8e\x7d\xe0\x09\x03\xfe\x1b\xee\x2f\xf8\xfb\x73\xa4\xfe\x90\x4e\x01\xf7\x7a\x7f\x4b\x42\x80\x2a\x26\xb7\x97\x8b\xdf\x2b\x55\x7c\xf1\x0f\xa7\x17\x46\x92\x99\x79\x08\x0e\x74\xf6\x37\x7e\xbd\xa8\x21\xfa\x9e\x81\x4a\x13\x2b\x56\x52\xb5\x9b\x00\x68\xa3\x43\x64\xa6\xec\xc7\x73\xa7\x51\x40\x8f\xdf\xf6\x03\xa4\xd5\x40\xad\xba\x87\x66\xe1\x17\x3c\xf2\x4f\x6f\x1e\x59\x2a\xbb\xc6\x0d\xe5\x61\xdd\x7d\x05\xfc\xa1\xe2\x77\x43\xe1\x09\x74\x6a\xe9\x62\x09\xc8\x4a\x2e\xba\x99\x85\x2b\x3d\x78\xda\x36\x8e\x53\xa3\x86\x2d\x4d\x20\x36\xef\x06\xbc\x4a\x41\x58\x16\x16\xfa\xb6\xf5\x11\x02\x3e\x4b\x0c\x00\x4b\xbc\xc8\xda\x46\x86\x89\x95\xa2\x5a\xe3\xbd\xc9\xc1\xfd\x81\xca\x2f\x39\x24\x72\xcd\xe4\xd2\x81\x54\x44\x44\x2f\x20\x48\x28\x64\x11\x7c\xf2\xf3\x6a\x2f\x83\xb6\xa9\x20\xb0\x38\xe7\xc9\xdd\xe3\x00\x20\xae\xf1\xdd\xb6\x2e\x34\x61\x73\x2c\x35\x67\x4b\xda\x4d\x5a\x80\xae\x30\x61\xd4\x85\x1b\x51\xe9\x85\x72\x2f\xd8\xd4\xb0\x86\x55\x65\x17\x7d\x9b\xbf\x12\x7a\xc0\xdb\x8b\x26\x60\x93\xd8\x0c\x10\x73\x9f\x08\xfb\x10\x33\x21\x3b\x04\x84\x84\x38\x7d\xd5\xb8\x29\x6d\x17\x55\x65\xef\xcf\xcd\x69\x6d\x30\x10\x53\xe7\x5a\x7b\x03\x72\x28\x5c\xa9\xb5\xa7\x59\xef\x0e\x6c\x50\x0a\xd5\x57\x2f\x91\xea\xa9\x7f\xae\x95\x80\x77\xae\x18\x47\x49\x9a\xb1\x9e\xe5\xda\xbe\x7b\xa9\xde\xfb\x1b\x65\x86\x74\x8d\x13\x2b\x55\xec\xe4\x9f\x62\xd6\xee\x0a\x1c\x7d\x45\x7c\xa2\x61\xb8\x45\x9e\x3c\xa3\x4f\xa7\x00\x79\xc4\xee\x72\xf3\x03\x4b\x56\x1b\x57\x82\xf3\xda\x49\xa1\xf1\x44\x09\xc8\x90\xfe\x1d\xf6\x4c\x93\x7e\x50\x30\xfd\xa6\xe7\x62\x67\x68\x6c\x27\x92\x4b\x25\x63\x9f\x94\x10\x91\x5e\x20\xce\xdd\x7e\x25\x80\x1c\x23\x1a\x0f\xe3\x07\xa4\x6f\x4a\xcf\x8b\x8c\xd7\x67\x9a\x4e\xd1\x25\xf8\x35\x9d\xa2\xef\xfd\x83\x1a\xf2\x44\xb8\xf7\x26\x5b\x30\x16\x64\x35\x28\x79\xc0\x6c\x86\x7e\x0d\xdb\x8d\xc2\x10\xc0\x9b\xe5\xa8\x4e\x4a\x4a\x66\xc9\xb5\xa3\x70\xaa\xd5\xf9\x46\x14\xc1\x2d\x8b\xb0\xa5\x27\x15\x74\x65\xab\xec\x09\xc3\xd3\x5f\xaf\xf8\x34\x55\x23\xc3\x27\x36\x8d\x48\x92\xf7\xb3\x0d\xe7\xf3\x72\x64\x76\xbd\x9b\x14\x27\x60\xcf\x7e\xe5\xbe\xa8\x9f\x46\xcd\xc3\x1b\x99\x22\x75\x96\x8d\xba\x32\xee\x25\x50\xcf\xa3\x08\x9f\x80\x4b\x55\x1d\x25\x94\x24\xb2\x7d\xca\x76\x4f\x95\x28\x9f\xfb\xf4\xfc\x1c\x11\x48\x6a\x7f\x1f\x3c\x07\x4f\x16\xe0\xaf\x13\xa8\x4c\x61\x86\x7b\x50\x0d\xb4\xd8\xbd\xd9\xe7\xc9\xdd\xc5\x2a\x37\x2e\xcd\x32\x86\x24\xcc\x26\xbf\xd7\x46\x61\x33\xe5\x3e\x18\x87\xf3\x7e\xe6\x18\x9b\xed\xb9\x33\x3f\xc1\xed\xd5\x43\x22\xad\x7e\xbc\xbb\xa0\xb2\xee\x02\x48\x12\x40\x74\x57\xd4\xc5\xcb\x45\x30\x6e\x45\x02\x93\x30\x2f\xb2\x2f\xa1\x52\xe7\xc9\x47\x01\x48\x9a\x80\xb2\xd5\x57\xee\x31\x9e\x7b\x28\xe3\x65\x54\xab\x73\x5a\x8d\xe4\x9b\x3d\x57\x39\xd2\xad\xcd\xd4\xe2\xab\x2d\x14\x7e\x49\x57\x4f\x59\x2d\xd0\x99\xef\x46\x9e\xd2\x63\x7f\x03\xb0\x2d\x3f\xdf\xd7\xbd\xe6\x2a\x2f\xf4\x28\xcb\x84\xc7\xb3\x9a\x9e\xc0\x00\x14\x10\x66\x63\xba\x70\x8c\xe5\x03\x0a\x4f\x0c\xfd\x04\x63\x6f\x93\x28\xf0\x15\x8f\x1e\x7b\xe1\xe1\x8c\x1a\xdd\x91\x61\x19\x63\xfd\x18\xad\x66\x8c\xfa\x3a\x47\xc3\x8c\xdb\x15\x6f\xcb\xc7\x1a\xea\xe4\x67\xf6\x0b\x35\x01\x97\x17\xe1\x07\x53\x0f\x64\x31\x7a\x9f\x61\x52\x10\x96\xfd\x56\xfc\x57\x46\xdb\xcf\x87\x84\x72\xdb\xa6\xda\x33\x4a\xcf\x57\x74\x2e\x30\x14\x1a\x92\x37\x98\xa0\x22\xae\xf1\x70\x7e\xc6\x71\x77\xcb\x48\x92\x03\x8f\x84\x24\x81\x23\xe6\x50\xdf\x7e\x6f\xdd\x92\x50\x95\xd9\x21\x39\xae\x58\x5a\x66\xc8\x05\xad\x7d\x16\x86\x49\x26\x06\x1c\xb6\xf5\x14\x78\xf2\x03\x56\x1a\xa5\x5c\x3c\x07\x5d\xd4\xc3\x2f\x2b\xa0\x6a\x31\x40\xe2\xef\x30\xaa\xfa\xe1\xc9\x82\xc5\xa7\xaf\x9a\xa7\x48\xef\xf5\x15\x63\xa2\x18\xe8\x9d\xd5\x0f\x9a\x64\x68\x17\xd1\x85\xfe\x22\x59\x1d\x6e\x0c\x51\xf6\xfb\xbf\x73\x41\x00\xe7\xef\x6d\xcf\xfc\xad\xd8\xd3\x62\x76\xeb\x98\x0b\xfc\x0c\x0c\x07\xbf\x6a\x50\xbc\x27\xf0\xe3\x50\x73\xaf\xa7\x08\x1b\x02\xea\xdd\xeb\x89\x19\x69\x70\x98\x3e\xb2\x6b\x92\x00\x28\xbc\xb0\x7a\x9d\x98\x85\xba\xb0\xb1\x7a\x4a\xd4\x07\x6b\xd3\x24\x45\x66\x23\xf0\xe4\xac\x96\xca\x36\x28\x11\x69\xa3\x0e\xd7\x86\xa6\x33\x0e\x95\x0b\x6a\xd6\x3f\xf9\x1a\x91\xdc\xc2\x73\xa8\x8b\x5d\x24\xb2\x19\x8e\x4f\x59\xc2\x31\x7c\x11\xcb\xab\x6b\xb6\x18\xa6\xa6\x67\x10\xd3\x2f\xcb\xea\xcb\x65\x9a\xa0\x4d\xb8\x3e\xb1\xe2\x47\x94\xfa\x79\xec\xad\xba\xb3\x26\xe6\x3d\x6e\xcf\x68\xa5\x76\xbf\x01\xc7\x1c\x8e\x4a\xfa\x7e\x73\x0e\x63\xa7\x07\xe3\xd2\xbf\x81\xe2\x2b\xe7\x29\xff\xed\x9d\x7c\x20\x50\x66\x18\x69\xaa\x5d\xd5\xa0\xd9\xd7\x2b\x89\x55\xfc\x50\x55\xbb\x13\xcf\x6e\x21\x60\x7b\x01\xf5\xe2\xe1\xdf\xbd\xea\x0a\x7f\x54\xc1\x04\x78\xb3\xd9\x0a\x0e\x24\x5b\x56\x6c\x42\x31\x94\xc4\x03\x96\x86\xb9\x62\x06\x53\x51\x85\x89\x28\x69\x46\x34\x67\xff\x9b\xfd\x50\x66\x93\x71\xa9\xf9\xbc\xe5\x11\x60\x9c\x69\xb2\x56\xcc\x23\xf5\xa7\xa7\x5f\xd9\x88\x8d\x6e\x5d\x5b\x6a\xe8\x01\xd3\x75\xc8\xd4\x6b\x10\x0f\xd2\xaf\x62\xff\xbd\xee\x7b\x69\xcd\x9f\x75\x9a\xc3\x3a\x43\x9a\x03\x66\xbb\x0b\xc2\xe5\xce\x0c\x68\x1e\x05\xcf\xc9\x3f\xdb\xb3\x9a\xe0\xe7\x2f\x45\xfc\x55\x15\x54\x72\xf1\xfd\x14\xfd\x25\x20\xc0\x61\xb2\x21\x9c\xc4\x23\xd9\x8a\x7a\xdb\xfc\xf1\x81\x7e\x6c\x0d\x1e\xda\xbd\x5e\xa9\xdc\x66\xea\x6d\xa8\x29\x8e\x97\xf8\x7d\xee\x68\x5f\x20\x28\xf0\x2a\x31\xdc\x53\x4c\x43\xc2\x5b\xdf\x70\x7b\x0b\xd8\xaf\xed\x97\xa4\x95\x1a\x2b\x2c\x17\x0b\xd4\x32\x88\x8b\x96\x00\x19\xbb\x0c\x02\x9e\xe3\xc7\x2d\x69\xba\xcc\x67\xae\x7b\xc8\x57\x8d\xb2\xd0\xd2\xc9\xc9\xb5\x04\x08\x4f\xe6\xd2\xcc\x70\xa1\x57\x53\xf1\xde\x42\x72\x2b\x7a\xd8\xb2\x7b\xff\x72\x57\x84\x29\xa5\x17\x65\x95\xd4\x1b\xed\xae\xe8\x2e\xf5\xd9\x16\x40\xdb\x37\x7e\xbd\xfb\x6f\x32\xf8\xdd\x61\x08\x1a\x9f\xcc\xe9\xf3\xa8\x09\x22\xf7\xd2\x40\x30\xb9\x71\x91\xa4\x46\xbb\x07\x82\x1f\x7a\xfa\x91\xa7\xde\xfe\x74\xa1\x1e\x9e\x4e\xe7\x75\xc7\x75\x73\x21\x66\x0b\x75\x9b\x3f\x5d\xe2\xcc\xad\x41\x22\x4f\x98\x5f\x80\xdc\x4f\xb0\x4f\x22\xa0\xf8\xbc\xc8\xcc\x7c\x54\x45\x5a\x45\xaf\x88\x04\xa1\x62\xd6\x19\xdb\x32\xf2\x0a\xb7\x8c\x6b\x0e\xba\x50\x7d\x5a\xaf\x32\xd6\x9f\xa9\x51\x6c\x02\xa4\x64\x44\x1c\x89\x71\x5d\x99\x22\x32\x78\xb5\x38\x93\x06\x91\x07\xbb\x70\xe8\x8a\x90\xe1\xaa\x2d\x52\xbf\x8e\xb6\x6e\xc4\x20\xfe\xf1\xc9\x22\xd4\xf2\x68\x57\xd3\x97\x17\x1f\x2e\x17\x1f\xb6\x46\x3b\x4d\x53\xbc\xfc\x9f\x07\x43\x89\x6c\x43\xfc\xa7\xb3\x9b\x65\xeb\x27\xd9\x07\x06\xb4\x5a\x1b\x7f\xd6\x5a\x95\x2f\x6d\x18\xbc\xc2\x81\x99\xcf\x73\x1a\x87\x0c\xce\xcf\x22\x85\x23\xbb\x58\xb8\xe2\x67\x98\xe0\xd9\xe4\x42\x35\x78\x09\x1d\x8c\x6f\x9d\xbf\x66\x76\xa5\x4b\x16\xbe\xc7\x51\x12\xe0\xe7\x6a\xe2\x85\x02\x61\x4c\x17\x5f\xda\xe7\xfa\xe7\x33\x99\x75\x01\x3d\xfd\xfa\xe5\x68\x7e\xb2\x05\xf8\x0f\xdc\x74\x3c\x9b\xef\xf4\x78\xfe\xb6\xc7\x05\x7b\x75\xd6\x8f\x10\xbf\xbf\x1e\x8b\xce\xa3\x4d\x2c\xd4\x08\xd5\x0a\x19\x5c\x82\x7a\xf9\xfc\x1d\x5f\xf2\x01\x22\x83\xab\x9b\x4d\x47\x80\x26\xd9\x99\xed\x5f\xed\x2f\xa6\x5f\x7b\x06\x50\xc4\x6c\xdc\x22\x84\xad\x11\x8d\xb6\xc7\xe4\x40\xb7\x7f\x84\x60\xa1\x7e\x50\x42\x35\x03\xc7\xe0\xa5\x9f\xd4\x21\x22\xab\x8e\x51\xf3\xc9\xb5\x6e\x95\x89\x8d\x00\x32\x87\x7b\x02\x0d\x6f\xdf\x9f\x0e\x10\x78\x82\xcf\xad\x65\x35\x76\xed\xcc\xc8\x92\xba\x2d\x90\xb7\x5c\x8e\x31\xf8\xfb\x21\xc8\xcc\xfa\x54\x63\xf2\xfa\x72\x75\x30\x12\xb2\x46\x0e\x4c\xf6\x40\xa1\x58\xac\x95\x3c\x7c\x7f\x93\xcf\x42\x0b\xd9\x2a\xd3\x4d\xf9\x8e\x82\x9f\x96\x6c\xdb\xc5\x24\x9f\x93\x3b\x8f\xa2\xf3\x55\x06\xd4\x52\x2a\x59\xb7\x0e\xd8\x84\xed\x95\x9a\xa4\x8a\xe0\x63\x30\x89\x98\x74\x74\x34\x47\x7b\xba\x0b\xbb\x4b\x05\x2b\xd8\x69\x89\xf8\x0f\xe2\x44\x1b\xdd\xe0\x64\x2a\x4e\x03\x3b\x92\xf9\xfb\x1e\xdc\xdd\x75\xeb\xab\x5d\x43\xa0\x4d\xd0\x05\x32\xe6\x7d\xa8\xab\x83\xda\x85\x71\x44\x05\x01\x3f\x12\x3b\x2a\x69\xd1\x40\x57\x84\x78\x9d\xc0\xb2\xa3\x2d\xf6\x6c\x80\x1e\x61\xc2\x8e\x28\xa1\x0e\x7f\x75\x8f\x50\x6d\x8d\xd7\xdc\xc4\xb0\x28\x36\xe2\x72\xcf\x95\xbd\x7d\xb5\x8f\xe7\x07\x8d\x66\xd9\xa6\x85\x4d\xb0\x28\x07\x17\xcf\x19\x78\x07\x16\xe0\x34\x88\xfa\x6f\xc8\x75\x30\x3f\x4b\x5c\x15\x01\x8e\x40\x4f\xda\xda\x15\x35\xf9\x4c\xd3\xf2\x7b\x1f\x51\xd0\x52\xc5\xa3\xf7\xc9\xbb\xdf\x36\x2f\x1e\xf5\x32\x21\x89\xfe\x6c\x63\xa1\xba\x6b\xd8\xd9\x0a\xef\xa8\xb0\x2a\x24\x68\x56\xb9\x26\xfa\x1d\x81\x43\x99\xb2\xc4\xd7\xa3\x8a\xfb\xf9\x88\x65\x04\x35\x2f\x97\x60\x8b\x5d\xd1\xec\xfe\x47\x68\x7c\xd6\x73\x90\x21\x7f\x7f\x0b\xa8\xa5\xa7\x73\x0a\x6a\x5b\x7d\x1e\xaf\xa7\x1b\xf6\xd7\xc8\xe2\xaa\x50\x2b\xc1\x37\xff\xf2\x39\xdf\xa5\xf9\xea\x0c\x98\x04\xfb\x25\x92\xe7\xb3\xa2\x22\xad\xc3\xb8\x04\x0a\x8c\x68\x24\x3d\xb5\x73\x98\x1e\x15\x7c\x6f\x13\x5c\x7b\xaf\x59\x7d\xb8\xc1\xac\x77\xcf\x3a\xd8\xe1\x8b\x37\x14\xa6\x42\x81\x74\x7f\xed\xbe\xd9\xdd\x1e\xa7\xc0\x7d\xdd\x00\x5d\x59\x05\xce\xfc\x96\x4f\x2e\x09\xad\x88\x14\x22\x96\x4e\x33\x70\xef\xd7\x9c\xee\x5a\xe2\xf7\xda\x69\x63\xf6\xd7\x19\xbe\xa0\x9a\x18\x67\x62\xa4\x16\xb1\x72\x4d\x25\x16\x8f\x67\x06\x8b\x75\xda\xa1\x82\xd1\xbf\x91\xe5\x97\x0a\x7e\xf3\x8d\x95\xe6\x3b\x30\x96\xb0\x4f\x62\xb5\xc9\x18\xa4\x36\x69\xd8\x30\x70\xa7\x3f\x3f\xe7\x0b\x33\x2a\xd1\xe5\x7f\x80\xb6\x1c\x11\xaa\xf2\x6c\xc5\x47\x53\xfb\x6e\x21\x6a\xba\xd9\x2c\xd5\x35\xa5\x4b\xcd\xeb\xcb\x7a\x53\xe2\xb5\x8b\x14\x02\xe5\x7a\x0a\xf5\xc0\x0f\x45\xf9\x25\xee\x31\x41\xe3\x4b\x89\xf3\x02\xc1\xe1\xc5\x6d\xdb\xaf\x29\x6b\xe1\x11\x35\xb7\x77\xaf\x77\x95\x4f\x93\x63\xce\xe4\xad\x53\x93\x00\x5d\x7e\x28\x45\x26\x5b\xa8\x48\x4f\xd2\xf4\x3e\xb3\x2e\xec\x61\xbf\x33\x03\x2f\xc4\x6a\x6f\x07\x07\x66\x89\x1c\xc5\x27\x1e\xef\x69\xcd\x70\x01\x5d\xd0\x5b\x07\xa5\x0b\x66\x0a\x75\x55\xb0\xa6\x95\x06\xb1\x43\x8b\xfe\x71\xa1\x52\xa3\x72\xe4\xfb\x68\x8d\x7a\x82\xca\x10\xa9\xa3\xc9\x72\xc2\xc4\x53\xe0\xd5\x9d\x85\x86\xc6\x7c\x15\xa1\x81\x3b\xf5\xaa\x05\x7d\x30\xc5\x56\x0d\xf7\x38\xff\x7b\xb1\xc3\xeb\x28\x4c\xd7\xe5\x49\x62\xfd\xbd\xa7\x53\x73\xd7\xc7\x94\xc0\x8e\xc1\xe7\x2b\x1d\xdf\x8b\xdc\xf5\xc8\x96\x90\xf8\x23\xd2\x13\xb3\x2c\xfa\x0f\xf1\x85\x6d\x95\xfb\x38\x00\x3a\xc7\x57\x01\x50\x68\xbd\xdf\xf0\x1f\x26\x88\xbf\x8b\x6c\x84\xef\xd2\x21\xaa\x4b\xbd\x18\x1f\xbf\x9c\x04\x09\xf6\xef\x9e\x06\x8e\x4c\x32\xc0\x0e\x05\xa0\xb6\xd7\x07\x03\xf4\x95\xac\x23\x0f\x5b\x37\x80\x6b\xbf\xd8\x80\x99\x87\x0c\x4c\x63\xab\xfc\x00\xfa\x55\x8f\x90\x86\x8c\x05\x03\x2e\x0a\x6b\xa9\xbe\x20\xa0\xfd\x63\x30\x5a\xaf\x0f\xb3\x24\xb6\x05\x60\xb9\x48\x78\x04\x70\xfa\x26\xf6\xc9\x53\xfd\xdc\x39\x8c\x26\x05\x0e\x52\xac\x79\x10\x62\x50\x29\x25\xdd\x38\x00\xc3\xc2\xdc\x5f\xee\x53\x68\x0a\x7c\xea\x1b\xb8\xcd\x99\x2e\x57\x45\x94\x4d\x2e\xec\x71\x10\x5a\x73\x6e\xc9\x12\xfb\x8b\x89\x3c\x78\x29\xc1\x15\x63\x2e\x63\x74\x39\x8b\x2d\x7d\xba\xb3\x64\x04\x20\xf1\x69\x06\x84\x23\x94\x0a\x5b\x0a\x24\x4c\x44\xda\x93\x2c\x00\xee\x2c\x84\xd3\x32\x5d\x66\xf7\xb6\xd4\xf7\x28\x2d\x38\xbb\x49\x66\x79\x71\xf3\xa8\xb0\x67\x32\x54\xf6\x34\x71\x05\xba\xaa\x5c\x07\xbb\xaa\xe7\x1a\xf1\x3c\x78\xce\x5f\xe4\x2d\x13\x47\x45\x19\x88\xc5\x55\x81\xf8\x14\x1c\xc6\x82\xe0\x72\xaa\x67\xa7\xfa\xbc\x41\xca\x16\xdf\xb7\x91\x5f\x9a\xfe\x85\x77\x14\x4a\xb3\x71\xfe\x1e\xfc\x04\x2d\xfa\xcc\x8d\x59\xa6\x19\xe4\xac\x6f\xf8\xe1\xdd\x0c\x5e\x9f\x6d\xe7\xb3\x2b\xe0\x30\x71\xe0\x43\xf7\xf4\x3a\x83\x3e\x02\x4d\xa5\xe0\xeb\xf0\x21\x46\x47\x3c\x87\x68\x77\x1c\xa9\x07\x61\x8c\x85\x05\xdd\xe2\xa5\x1a\xe8\xbc\x71\xab\x50\xe3\x5a\x7e\x6e\x75\xbe\xfa\x75\xd7\x38\xe6\x01\xba\xea\x99\x47\x36\xb2\xf0\x05\x46\x8a\x9a\x31\x57\x25\x88\x8d\x2a\xc8\x19\x4b\xe9\x6b\xd9\x23\x93\x66\xa0\xd7\xa8\x79\x9d\x77\xc5\x39\xf0\xc7\x0e\xf0\x88\x98\x72\x76\x11\x4e\x13\x37\xf7\x75\x80\xd2\xcb\xcd\x3b\xc9\x1c\xf1\xd9\x21\x45\x31\x96\xe8\xee\x5b\x39\x45\xe0\xaf\x5e\x9a\x85\x53\x33\xc8\x0c\x0c\x02\x6f\x74\xcf\x30\xa3\x5f\x28\x00\x58\x0b\x0b\x97\xe8\xae\xd7\x17\x29\x02\xde\x99\x7d\xc9\x51\xae\x5a\xb1\xd4\xfe\x92\x30\x4e\x3f\xef\x1a\x3f\x91\xc5\x1a\x4d\x1c\x67\xe8\x6b\x9f\x2e\x80\xb4\xec\xe7\xe6\xbe\x84\x07\x61\xb3\xf5\x4e\x52\x45\xb8\xe9\x03\x70\x55\x5c\x07\xea\x23\xcd\x2e\x78\x2a\xe5\x0b\x3f\x33\xe4\x63\x44\xf3\x32\xb8\x87\x74\xb9\xa4\x26\x74\xeb\x9c\x16\x79\x50\x4e\x77\xd3\x7e\xa4\xe2\x89\xdc\xb3\x36\x65\x16\x3a\x20\x39\xd2\x9c\xc2\xd3\xee\xb9\x6b\x93\xfa\x6e\xbb\xf4\x8e\x75\x33\x91\x00\xe2\x4a\x42\x9c\xa2\x4f\xfe\x29\x7c\x7d\x2e\x46\x35\xa1\x44\xb9\x51\xea\x34\xb8\xd7\x3e\xf5\x8a\xeb\xbb\x3a\xab\xc6\xcc\xf4\xb6\x75\x18\x49\xf1\x71\x65\x5d\x31\x4a\xcf\x5b\x26\x4d\xd4\x68\xdb\x9b\xc3\xbd\xa3\x2e\x1c\x0a\x3d\xf7\xc3\x73\xb7\x63\x6b\x5c\xab\x21\xc5\x34\xed\x79\x05\xe1\xb2\x75\x26\x2b\x46\x8a\x4c\xb9\x3f\x71\x50\x71\x41\xec\x18\xaa\xce\x93\xf7\x80\xe0\x3d\xb6\x24\xb4\x66\x1e\x4f\x40\xb7\x41\xfc\xe6\x10\xc5\x95\xe5\xfc\x9d\xd1\x84\xb6\xbb\x1d\x2b\x20\xbd\xf5\x02\x59\x6e\xe8\x00\x4d\x90\x25\x29\x89\xc8\x90\xd3\xf1\x60\xa8\x58\x22\x2d\xf2\xbe\xfe\xc9\x0c\xd6\x39\x4d\x00\x8b\xf1\x2b\x49\x6f\x61\x73\x8d\x94\x69\xe1\x4b\xf0\x53\xe7\xc8\x0a\x7e\x2d\x3b\x22\xf4\xac\x6c\x8a\x4f\x09\x3e\x95\xc2\x2c\xbc\x6d\xd3\x12\x2c\xaa\x29\x2a\x39\xe4\xca\xf7\x10\x92\x0e\xc3\x95\xfb\xe2\x1e\x0c\xee\x98\x16\xbc\x8b\x42\x64\x18\xa7\xd6\x28\xde\x83\xea\x47\x5b\xfe\x11\x94\xe5\xa9\x22\xa4\x17\x9f\xd1\xba\x32\xb6\x39\x22\x1a\x08\xc4\xa6\xce\x4b\x62\x35\xd1\xfd\x77\x90\x70\x0b\x93\x0c\xed\xf5\x2b\x22\x1c\xad\xea\x3d\x0a\x9f\x75\xa2\x41\x07\xb0\xd0\xd5\xe7\x49\x37\xe7\x7a\xd7\x67\x88\x69\x67\x4e\x94\xa1\xf3\x5e\x43\xc5\xf0\xe9\x74\x01\x7d\xb4\x5e\xbf\xf7\x55\x91\x27\x52\xd4\x8b\x11\x3d\xf6\x4d\xc0\x81\x60\x5c\x73\xd5\x37\x6b\xe4\xc7\xdd\x87\x89\x79\x2f\xf1\xd7\x00\xb8\xaa\x06\xe0\x2a\xa6\xcf\x9f\x78\x0b\x41\x80\xa6\x66\xb7\xbf\xa8\x33\x3a\x99\xf5\x93\xfa\xb8\x86\x85\xf2\x63\x59\xd2\x5a\xc7\x04\xa6\x0f\xbe\x4c\xdd\x58\x99\xaf\x3f\x11\x64\xa3\xd0\x1c\xa3\x8c\xbe\xf9\x6d\x18\xf5\x09\xb8\x34\xc6\xf4\x0f\x63\xae\xc3\x4f\xe5\xde\xdf\x38\x18\x54\x18\xfe\xc5\x2b\xae\xea\xf0\xf8\x06\xe2\x17\x65\x85\xcd\x45\x44\xaa\xd2\x62\x01\x0d\x58\xf7\x21\x6d\x7f\xf0\x2c\xf9\xca\x2e\xa3\x5c\x45\x2b\x44\x17\xfa\xa0\xa8\x9c\xf5\x60\x4d\x35\x26\x3b\xc6\xc0\x65\x6e\x6f\xc3\x4f\x4a\x3f\x66\xa0\xd8\xc0\x36\x4b\xd6\xf6\x47\x52\x7d\xd6\xed\xbd\xdb\xb2\x40\xb5\x2e\x43\xc6\x54\x55\x73\xf7\x36\x3d\x05\xf3\x6c\x8c\xb1\x13\xea\x51\x60\xa1\x37\xeb\xbe\x72\x69\xd9\x8e\xb5\x8a\x4c\x4d\x7f\x5e\xcd\x63\x54\xba\x17\xb8\xac\x25\xd0\x63\xa3\x7c\x20\xd4\x06\x3d\xae\x7c\xbd\xba\xdf\x7b\xa9\xea\x53\xf5\x9e\x12\xb8\x80\x14\x91\xd9\xdf\x86\xd2\x04\x1b\x78\x5c\x9e\x87\x39\xc2\x3d\xf6\x92\x4f\x86\xe4\x59\xb7\x1d\xa4\xb5\x3e\x26\x7f\x9e\x2b\xbe\xab\x50\x59\x57\x6c\x5c\x5d\xd6\x29\xbe\x40\x0a\xd8\x07\x48\x03\x82\x1c\xfd\x12\x78\x3d\x23\x1c\xf6\x59\xb2\x0f\xcb\x7c\x2e\x96\x21\x93\x08\x43\xa5\xc1\x37\x00\xd8\xb0\x56\x4f\xd4\x66\xe2\x9a\x31\xe3\x19\x23\x96\xdf\x68\xf8\x34\x8e\xd2\x49\xd1\x95\x0c\x94\xe8\x2b\x7c\x1f\x7b\x17\xe9\xfc\xe3\xca\xd6\xce\xa2\xd7\x21\xea\x9c\xcc\xb6\x98\x8d\x7d\x00\xe9\x1b\xaf\x74\x42\x37\x04\xca\xb5\x41\x12\x09\x12\xbc\x2a\x14\x62\x8b\x21\x28\x5e\xe4\x00\xd2\x11\x32\x99\x1d\x56\x2e\xe3\x7c\x31\x72\x12\xfb\x56\x22\x7e\x5c\xc3\x06\x7c\x98\xfd\x9e\xed\x35\xf5\xf5\x17\xff\x1d\xe4\x69\x4a\x3b\x12\xd8\x12\x2c\x15\xdb\x13\xc4\x00\xe5\xdf\xc7\xf2\x7d\x7d\x15\xc2\xd3\x85\x82\xe1\x8c\x56\xdb\xcf\xf0\xe6\x89\x68\xfc\x9e\x78\xcb\xf4\xdb\xc7\xa2\x7f\xca\xfb\xbc\x50\xb9\xc9\x9c\x2d\x30\xac\x63\xd1\x1d\xe6\x29\xfb\xe2\xbe\x28\xfc\xcf\x7b\xd4\x5c\xd9\x93\xb7\xff\x7c\x1c\xfe\x8c\x4f\x06\xad\x16\xa4\x8c\x27\xb2\x4c\xb4\xef\x86\x0f\x7b\x1f\xd3\x8f\x83\xa0\x72\xbb\x67\xbc\xfe\xc2\xb4\xe3\xfb\x21\x4b\xbb\x0f\x29\x53\xba\xa8\xb7\x09\xf9\xb1\xb7\x06\xf0\x45\xa2\x5a\x3f\x7c\xc2\xf0\x62\xe1\x80\x2f\xd3\x50\xbd\xb2\x89\xcc\xb6\xe1\x92\xcc\x21\xd8\xdb\xa7\x10\xe5\xfb\x7e\x77\x40\x14\xfd\xc7\x76\x82\x87\xe7\x9a\xac\xee\x57\xc5\xdc\xdf\xe2\x46\xad\x06\xfd\x5e\x49\x06\xb5\xa3\x16\xc4\xe9\x07\xc4\xa9\x4b\x4d\x94\x98\x35\x0b\x7f\x45\xaf\x1d\x70\x22\xf2\xf9\x88\xb3\x70\xdc\xdb\x23\xb0\x70\xf8\x02\x56\x97\xed\x34\x32\xac\x69\xe5\x22\x83\x1f\xfa\x43\xc5\xd0\x67\x99\x32\x1b\xee\xf9\xfe\x30\x65\x57\x64\xf4\xd5\x82\x3b\xe0\xfd\x5b\xc1\x38\x86\xd0\xcb\x74\x8f\x13\x7c\x51\x0d\x7f\xa3\x79\xc8\x2c\xc1\xf7\x78\x03\xfb\x2b\xbd\xc8\xfc\xca\x8a\xec\xbe\xb6\x76\x33\x65\x60\xbe\x62\xb9\x1a\xc0\xa3\x77\x6b\x7b\xcd\xc7\x8f\x30\x64\x20\xc7\xa3\x52\x45\xa8\x92\xd9\xd2\x03\x4a\xa9\xa0\x37\xb6\x6f\xde\xab\x48\x7f\x73\xd2\xd8\x11\x33\x6e\xf7\x17\x6a\xbe\xdf\x25\xde\x3d\xc9\xaa\xc5\x22\x1c\x80\x2e\xd7\xce\x29\x9e\x44\x3f\x3b\xa6\xae\x78\x6e\xd5\x02\x4d\x35\xe1\x9e\x8d\x99\xf1\x14\x86\x9b\xa3\xbd\xc2\xdf\xbd\x21\x3b\xdc\x12\xed\x35\x4b\xd1\xf3\xf1\xe0\x2b\x22\xb5\xeb\xdd\x5b\x4f\x62\x4c\xde\xdf\xe0\x5a\xe9\x27\xf1\xad\x5c\x1f\x09\x75\xf4\xcc\xac\x1e\xa1\xf2\xda\x9c\x64\x3d\xdf\xf0\x14\xc4\x66\xac\x13\xac\x1a\xbc\xbe\x66\xb2\x86\x2c\xac\xce\xae\x99\xc0\x99\x01\x9c\x15\x9a\xf7\x6f\xa0\x23\x9d\xee\x27\xdd\xb7\xbe\xc7\x1e\xef\x81\x76\x4c\x03\xb1\xf8\xe4\x76\xfb\xca\x70\x56\x8f\x8f\xa7\xe5\xf7\x21\x7d\xec\x8f\x77\x7c\xd5\x5a\xd6\x87\x9f\x87\xe3\x3e\x48\x95\x3b\x30\x65\x4c\xce\x79\x93\x85\x43\x69\x3a\xb4\x9d\xbe\x1c\x65\xb7\x7e\xb1\x11\x26\x2c\x87\xc0\xab\x03\x2b\xb1\x2e\x38\x55\xa8\x4f\x41\x54\xf7\x6b\x4e\x0a\x31\x2c\x74\xae\x46\xf2\xde\x03\xb1\xf8\x1d\xe3\x80\xb2\x53\x18\xe9\x6f\xf4\xb3\x64\xbf\x65\x32\x26\x35\x70\x75\xcf\x98\x00\xf9\xea\x57\x8e\x33\x4c\x62\x96\xf7\x7a\xce\x21\x6a\x84\xe8\x69\x8d\xf8\x42\x16\x08\x94\x18\x75\x87\x35\x89\x27\xde\x7d\x29\x9d\x1f\x37\xd0\xcf\x89\x91\x7b\xba\x7d\x9f\x35\x7e\x9a\x7e\x13\x0d\xb0\xff\x9e\x91\xbe\x97\x73\xcd\xcc\x05\x4f\x2e\x21\x91\x02\x06\xea\xb5\xeb\x10\xe5\x33\x7f\xbd\x3b\xe3\x5b\x2c\x41\x64\xab\xcc\x2b\x69\xee\x1f\x8b\xd8\x62\x7d\x6f\x7a\xce\x90\xf9\xcc\x2b\x21\x6f\xd0\xf2\xa3\xbd\x5a\x3a\x9f\x54\x83\xaf\x55\xcc\xeb\xf2\xf7\xdb\x7d\x13\x76\xfb\xb6\xee\xc1\x73\x5c\xe7\xac\x46\x31\x4b\x53\x78\xa1\x00\xcc\xd2\x0f\xd3\x1f\x3d\x24\x04\x1b\x0c\x77\xe9\x7b\x06\x7a\x91\x3f\x61\x7b\x07\x75\x61\x6d\x8c\x46\x39\x41\x79\x67\x3e\x59\x84\x35\x77\x23\xec\x6c\x41\xfa\xed\x79\x12\x5b\x6a\xc4\xb8\x01\x12\x63\xd1\x38\xa7\x79\xc8\xf0\xe0\x52\x94\xd9\x04\x60\x77\x4d\x21\xe2\x36\x3d\x45\x4d\x90\xb3\xf8\x8b\x61\xa6\x0d\x78\xec\x7b\x83\x0a\xf5\xf9\x53\x97\x21\xed\x9e\x87\x65\x55\x8a\x3a\x67\x69\x33\x74\x23\x55\x48\x95\x42\x27\xcb\x11\x2f\xa3\xe5\xe6\xa0\x46\x01\x8f\x0a\x55\x18\x33\xc2\x03\x78\x34\xa0\x26\x9b\x34\xb5\xb9\xe3\x57\xa4\x2c\x14\xc9\x39\x27\x79\xde\x67\x87\x80\xa2\x07\x8a\xeb\x75\x37\x09\x97\xf0\x85\xab\x04\x55\x94\x00\xdd\xf5\xfa\x5e\x2b\x77\x3c\x7d\xe8\xe8\x1e\xfb\x9d\xcf\xf8\x84\xd2\x26\x71\xa1\xe3\xc4\xb7\xa3\xee\x36\x28\x42\xce\x8b\xa8\x14\xc4\x0a\x17\xba\x57\x81\x0b\x77\x5a\x18\xf3\x2d\x68\xf3\x27\xdc\x5d\xb1\xe7\xeb\x78\x71\x7a\x1c\x25\xce\x45\xb3\x10\xf1\x0e\xb1\xe2\xad\xa3\x18\x16\xd0\xee\x50\xf9\x34\x2c\x8b\xb9\x7c\x50\x20\xe7\x9a\xfc\x13\x34\x19\xcf\xf2\x4d\x24\xdb\x7b\xa1\x5c\xd5\x20\x29\xe8\xc2\x49\xc1\x77\x4c\xc5\xc3\x48\xf9\x04\x70\xae\x79\x0f\x53\xbb\x18\xe3\xba\x26\x31\xe8\xfc\x2e\xbe\x25\xeb\xc2\x3c\xe3\x3e\x08\xe1\x5d\x4f\x56\x3f\xb2\x45\x9f\xa2\x30\xf2\x70\x79\x17\xf0\x27\x73\xbe\xb5\x83\x5d\xbe\x03\x4a\xd1\xf9\xbd\x24\x21\x97\x9f\x14\xe6\x41\x1f\x10\x16\x50\x0c\xc4\x54\x6f\xe9\xcf\xaf\x88\xb3\x0d\x8f\x41\x38\x88\xee\x3a\xe0\x0c\xa7\xe6\x2b\x1e\x11\x85\x0d\xa5\x15\xc1\x0b\x36\x20\x36\xd8\x3e\x88\x58\x2c\xfb\xee\x72\xe7\xe3\x93\xc1\x0c\x41\x30\x50\x59\x2e\xd5\x4f\xc8\xf2\x38\x08\xbf\xbf\x7c\xc5\x92\x60\xf9\x0d\xc7\xbb\x55\xf8\x88\x92\xbe\xbc\x29\x8e\x06\xb9\xc1\xfd\xa3\x22\x32\xeb\xe1\xba\x86\x8f\xb0\x70\x5b\x56\x3c\x01\x4d\xa1\x27\xa2\x80\xec\xfd\xb4\xd8\xef\x71\x77\x8c\xe5\xe0\xd8\x4f\xb8\x8f\x92\xeb\xd2\x3d\xde\x00\x65\xe0\x62\x75\xf2\x15\xc0\x95\xc8\xcd\x8a\x32\x9e\x59\x6b\xcb\xb7\x05\xc4\xa1\xf7\xdd\xd0\x74\x2b\xd3\x8e\x92\xbf\x52\x3e\x18\xe4\x59\x89\xed\xcb\xd2\x9c\x27\x7c\xf7\x29\x7b\x64\x39\x77\x23\xd3\xd8\x92\xa3\x52\x13\xc1\x8a\xb5\x98\xb5\xaa\x17\xa8\x3e\xf0\x72\x33\x64\x63\xa1\xbf\x1e\xa1\x66\x1e\x99\xf0\xc9\xfc\xf7\x8c\xb1\xb8\x8b\x3e\x73\xa6\x03\x6c\xa1\x2d\xdd\x95\xd4\xcf\xa8\x81\x8f\x84\xcb\x80\x47\xc7\xd3\x9a\x6c\xa9\x29\x92\x20\xcd\x97\xcf\xbe\x3f\x80\x6c\xc3\xfd\x51\xdd\xdd\xe3\x9f\x88\xb9\xf7\x56\x93\xb3\x0a\x28\x29\x55\xe0\xe9\x6a\x48\xdd\xfb\x3b\x39\x6f\xfc\x64\x60\x1b\x38\xb6\xd9\xd6\xc4\xcf\xfb\x8c\x01\x6c\x15\xf4\x2a\x34\xf3\xac\x34\xca\xe7\xd1\xda\xbf\x2f\xfb\x61\x32\xd7\x9c\x39\xf8\xdc\x80\xce\x0d\xb4\x80\xed\x38\xe3\x8b\x9c\x88\xae\x96\x06\x74\xc1\xec\x8e\xe4\xc8\xa0\x6f\xfb\x79\x7e\x27\x34\xc9\x43\x15\xa9\xcd\x97\x61\xf7\xbb\xd8\x94\xc8\xb7\x10\x8e\x7b\x63\x33\x7f\x56\x7f\x2c\x6e\x9e\xbb\x50\x91\x1c\xc9\xd9\xd1\x17\x03\x1a\xe2\x5e\x0e\xf2\x85\xbe\x3d\x40\x19\x7d\x81\xb8\xe1\xc7\xef\x99\x09\x15\x76\xa1\xfb\x34\x9b\x80\xb7\x9e\x2c\xc1\xd5\x66\x02\x78\x6b\x09\x57\x19\xc7\x38\xa2\xc9\x9e\x19\x32\xcf\x43\xfe\x1b\x18\xf2\x0f\x0e\xd1\xe0\x8b\xa4\xad\x95\x78\x64\xd5\x07\xf5\xe1\x84\x96\x8f\x70\x1e\xb8\x7f\x1c\xc4\x06\x0a\xc8\xe6\x43\x58\x64\x42\xac\x7a\x63\xf6\x70\x24\xca\x92\x9a\x06\xc0\x63\xd8\xbd\x4f\x98\x65\xfc\x58\x67\xa0\x49\xce\x24\x3a\x2f\xf5\x31\xb5\x57\xff\x8b\x30\xae\x42\x8c\x60\xe4\x29\xa1\x6a\x8a\x2d\xbc\xf7\xbf\x31\xd2\x21\x39\xd5\x50\x7f\xef\x9c\x3c\x9a\xb1\x7c\xef\xd9\x82\x31\x44\x7e\x4f\x0b\x25\xb6\xb6\x21\xf3\x84\xa1\x51\x6c\x4a\x80\x8f\xcd\xef\x50\x17\x8e\xc2\x57\xaf\x4d\x01\x05\x84\xfe\x7e\x3e\xc5\x8f\xfc\xcc\x62\x6d\xbc\x85\x70\xb6\x46\xd6\x1e\xcb\x8d\x84\x12\xfe\x04\xff\x64\xf7\xa4\xca\x23\x01\x5c\x62\x22\xb9\x5e\x1e\x40\xdc\xf2\xb4\x78\xe4\xcc\x6f\xd7\xb9\x2f\x02\xa5\xf7\x59\x05\xc7\x27\x2c\x57\xa4\x0b\xcd\xf5\x17\x46\xfa\x41\xb4\xe4\xc6\x26\xeb\xcf\xc5\xe5\x4b\xc4\x6c\xf6\x43\x94\x95\x65\x1f\x88\xf5\x6b\x13\x88\x28\xe8\x4a\xae\x23\x07\x59\x18\x5e\x47\x6d\x78\x85\xa9\x80\xa0\x73\x70\x23\x28\x43\xe8\x64\x72\x14\x1a\xf0\x29\x1f\xb4\x5c\x1d\x15\x8b\xb9\xf4\xac\xdf\x52\xe3\xa2\xe6\xd0\x6a\xf6\xac\xb8\x8e\x76\x31\xfe\xbd\x78\xd1\x2a\xc9\xcb\x74\x09\x50\x46\xb4\x75\xf9\xf9\x28\x4d\x56\xbb\x14\x3c\x2c\x16\xfb\xa1\xd7\x78\x7d\x5e\x4f\xd7\x79\x81\x18\x4c\x93\x4e\xe2\x86\x9d\x48\x3e\xaf\x7b\xbd\x30\x90\xa7\x7b\x6e\x5a\xfa\x3c\x6b\xfd\x9e\x94\xa0\x96\xde\xc5\xe6\x78\xe3\x5d\x45\xf0\xb0\xca\xa9\xc4\xea\x4f\x4f\x9f\x53\xbe\xc2\xee\x7e\xb8\xa9\xcd\x4b\x8a\xac\xb2\xef\x87\x19\xbe\x50\xfd\x61\xad\x8d\x1c\x2d\xfa\x83\x7b\x4b\xb6\x46\x1d\xbf\x01\xc0\xe4\x0a\x62\x1b\x0a\x5f\xd7\x87\x76\x91\x0c\xed\xe0\xac\x32\xbe\x87\x26\x55\x08\xb6\x69\x6f\x0d\x3d\x81\xdd\x5d\x08\x7c\x2e\x6c\xf9\xee\x33\x51\x1c\x48\xd9\x5d\x4e\x03\xb2\x07\x14\xf5\x2a\x16\xaa\x2c\x31\xf5\x00\x82\xd6\x76\x2e\x5c\xce\xd8\x8a\xdf\x73\xef\x07\x29\x17\xb3\xd4\x36\x7a\x63\x84\x32\xce\xac\xa1\x22\xfc\x46\x60\xbe\xee\xb9\xc5\x88\xcf\x3e\xaf\x6e\x3e\x63\x1c\xcb\x7a\x75\x37\x04\x07\xe1\x38\xc0\x01\x43\x23\x3f\xa4\x56\x15\x0b\xbb\x91\x9b\x03\xae\x7f\x48\x8c\x40\x7f\xd7\xb0\x02\x53\x60\x58\x26\xf1\x2a\xec\x70\xb3\x20\xc9\xe8\xa0\x0f\x47\xee\xfa\xea\xd8\x74\x0d\xdb\xd7\x0b\x7d\x46\xe8\xc2\x5b\xc0\x66\x45\x05\x00\x73\xc4\xa9\x9f\xd0\xc3\x3e\x26\x5d\x91\x15\xfd\x4b\xcd\x8f\x89\x8f\x5e\x7c\x2e\x7b\x6e\x25\xa4\x49\x0b\xfc\xf2\x5b\xb4\x6c\xf0\x3e\x6a\x7f\xc5\xe9\x83\xf7\x0b\x65\x0e\x74\x3f\xde\xf0\x48\x1d\x1f\xef\x0f\x64\x3e\x41\x32\x00\x7f\xde\xd9\x2e\x30\x2a\xc3\xb7\x59\x33\xa2\x7e\x8e\x11\xc6\x7e\x44\xf9\x81\xf8\x14\xa6\x3c\x3f\x1f\x0d\x85\xe5\x86\xbf\xb7\x9a\x3e\x04\x13\x64\xd3\xb3\x2c\xc9\x2e\xee\x0a\xa9\x7e\xba\xec\xdd\x22\x55\x28\xb4\x74\x80\x27\xa2\x7c\x86\x9d\x7f\x4b\xc6\xd9\x39\x06\xb0\xf2\xda\xf0\xf4\x9d\x24\x8d\x2b\x3a\x96\x00\xee\xa8\x67\x76\xcf\x49\x44\xca\xc5\xf6\xf7\xfc\xe1\x28\x54\xa2\x2c\x0e\xf0\x95\xa2\xec\x3d\x13\x4d\xc9\x82\x1f\x94\xed\xf4\x14\x8b\x41\x9b\x7f\xad\x92\x56\xa4\x75\xb4\xa9\x63\xc6\x94\x17\x79\x9f\x94\x17\x37\x45\x12\xeb\x28\xe5\xf9\x66\xc4\x72\xa0\xce\x43\xf5\xfa\x1b\x9f\xfc\x10\x0a\xff\x44\xf9\x65\xd5\xaa\x48\x0f\x10\x51\x9d\x92\xae\x92\xee\xe6\xd1\xf1\xa4\xa4\xe7\x9c\x8b\x87\xe4\x0e\x11\xf1\xbd\x9b\x27\xfd\x1c\xc0\xcd\x54\x0d\x0a\xcf\xf1\x15\xa5\x1f\xf9\x44\xc4\xa1\x71\x31\x81\x87\x80\xff\x61\x62\x57\xa0\x89\x5e\xaa\x1b\x10\xd1\xd8\x0f\x42\x06\x96\x18\x33\xdb\xe8\xb7\xb5\xf9\x04\x95\xf7\xee\x65\x89\xee\xe0\xe9\x30\x4b\x12\x60\x96\xeb\x58\x95\x21\x0d\x71\x06\xde\xb8\x43\xeb\x2b\x96\x2c\x52\x6e\xfb\xa6\x23\x4a\x23\xf4\xd8\x31\xaf\x1a\x78\x0f\x5e\xaf\x3e\x00\x13\x1b\xd1\xb0\x67\x52\x25\x88\xfc\x3e\x47\xe1\x11\x67\xb9\x25\x7d\x9c\x8b\xfd\x1c\x09\xcf\xbc\x66\xa8\xb4\xa8\x9c\x3f\x14\x78\xa8\xa2\x0c\xb0\xbe\x04\xe7\x9b\x0a\x9e\x73\xd4\x4b\xf0\xb8\xa7\x28\x05\xc1\x17\x33\xf1\x68\xe9\x5f\x02\xc2\x01\xff\xe0\x15\xaf\x77\x1c\x70\x5f\x5f\x2f\x6c\xf0\x5e\xc1\x7d\x8f\xe0\x96\x5f\x16\xea\x2d\xa9\x87\x90\xb6\xe0\x2e\xf7\x52\xdd\x95\xe7\x1e\x98\x4e\x55\xdd\x95\x6f\x2d\xaa\x7b\xfb\xda\xbc\xc5\x73\x98\xb4\x1a\xf8\x8a\xf8\xed\x20\xa6\x20\x5b\x40\x98\xbe\xac\xea\xbd\x48\xa9\x85\x02\x67\xc3\xd7\xe9\x52\x61\xbb\x5d\x72\xe8\x05\x43\x6a\x6e\xeb\x0d\x0b\xe9\xdb\xa7\x30\xe8\x24\x88\x3b\xb3\xdb\xac\x54\x38\x07\xb1\xe5\xee\x9d\x91\xab\x41\x94\x87\x8a\xf0\xd4\x26\xea\x9f\xb7\xfe\xbf\x40\x99\xa3\xa1\x56\x83\x7c\x62\x86\x57\x32\x67\xc4\x90\x9a\x5b\xf7\x1b\x17\xc1\xd8\x9e\x25\x17\xdf\x82\x58\x94\xac\xe5\xc2\x4b\x9d\x9e\x08\x02\xb5\xbf\x37\x05\x7b\x48\xfe\xe4\xb4\xd3\x53\x93\x93\x0d\x31\xeb\xfd\x03\x9a\xba\x9b\x42\x15\x81\x1a\x40\x0e\xf9\xe3\x17\x7c\x27\x50\x2c\xf0\x62\xf0\x11\xf0\xde\x85\xb3\xd1\x29\xee\x91\x08\xc9\x1d\x9b\x88\xa9\x4a\xbb\xf5\xdc\x87\xe7\x34\xef\x3c\xbd\x0f\xd5\x0f\xe4\x17\xf1\xd3\x87\x18\x08\x1f\xdf\x23\xe4\xbd\x82\xa5\xb3\x5e\x58\xf9\x6c\x34\x10\xb6\x71\x25\xf5\xc4\x28\x2a\x8d\xfc\x9e\x3e\x6a\x7b\xdc\x73\x56\x4d\x35\x3f\xe5\x75\x82\x8d\x92\xf4\xbd\x31\x05\xf5\x2e\xe0\x26\x5a\x8d\x05\x2d\xfc\xbd\x4f\x4e\x48\x1f\xed\xb1\xf2\xb5\xc3\x3e\x44\xcf\x53\x1c\xde\xa0\x0a\xdb\x99\x87\x44\x02\x1e\xcd\xe8\x5c\x66\x32\x83\xa8\x04\x00\xf5\xf0\xf8\x4e\x6a\x66\x67\xa3\xb6\x5a\x65\xa8\xf0\x4d\x16\x02\xe0\x8c\x11\xb8\xbd\x7c\x43\x28\x5b\x0e\x80\xe1\x97\xea\x19\xb8\x77\x6d\x3c\x23\x55\x7a\x32\x70\x89\xd6\x9c\xc7\x96\xeb\x76\xd5\xfb\x9e\x21\xec\xc2\x12\xf0\xbd\xff\x48\x3b\x68\x3f\x2d\x86\x15\x2e\xb1\x95\x1d\x94\x85\xeb\xf5\xc0\xd0\x17\xec\x85\x15\x6f\x5d\xa8\x52\xf6\xc2\x8a\xd5\x6f\xf1\xa0\x24\xa1\xa2\x8f\x58\xa5\x92\xcf\x73\x50\xaa\x47\xa5\x08\x7d\x8c\xe5\x86\x5f\x7d\x2b\x19\xf8\xf2\x2f\x28\xa0\xae\x25\x67\xb3\xde\x1c\x27\xe4\xb7\x0b\x57\x43\x01\x40\x1a\x51\x02\xff\xa2\x1f\x42\x1f\x38\x5e\xe2\x39\x32\xc2\x42\xdf\xf2\x42\x4e\xd7\xdc\x83\x80\x29\x65\x6c\x0f\xb4\xd7\xf7\x6e\x8f\xaf\xc6\xd3\xf8\xd8\x50\x89\x81\xda\xf7\xdc\x55\x83\xac\x99\xe9\xa1\x07\xf8\x82\xdd\xfd\xd9\x95\x02\x50\xaf\x53\x9f\x40\x9f\x25\x09\x2e\xef\xa9\xfe\x0c\xd6\x45\x3e\x14\x62\x2c\x04\x95\xdc\x4e\x42\x57\xa7\xbd\x6b\x21\x20\x45\x78\x38\xa0\x6e\xb6\x70\x7e\x51\xfb\x9b\x88\xef\x75\x10\x81\x58\x29\xd2\xb6\x6c\x95\xc2\x0a\x89\x44\x02\x62\x08\x9f\x5c\x84\x3e\x45\xc3\x89\xf4\x01\x7e\x90\xb0\x05\xe0\x0b\xd3\xbe\x4d\xc4\xb7\x46\x8b\x98\xdc\xb4\xbc\x21\xb8\x60\xba\x38\x77\xe5\x8a\x28\x9e\xa2\xee\xb8\xfc\xbd\x0f\x54\x61\x48\xed\xc7\x9d\x52\x51\xb2\x10\xd4\x6d\x2f\xb7\x80\xfc\x5d\x4c\xdd\x50\xee\xf8\x0b\x2b\x8d\x50\xb7\xeb\x1f\xe5\xea\xd1\xf2\xf3\xce\x4f\xed\x9f\x04\xc4\x35\xdf\xc7\x87\x37\x04\xe3\x92\x2e\xf6\x78\xd4\xa4\x05\xbe\xe9\x78\x9d\x19\xe2\x04\xfa\x03\x6d\x5e\x57\x97\x1d\x5c\xb5\x97\x7a\xdd\x58\xbb\x5a\x78\x40\x84\x31\x2a\x2f\x8d\xe0\x58\x36\xbc\x57\x56\x5d\x23\xe4\xd5\x36\xa9\xa5\x80\x33\xee\xb1\x17\x9f\x05\xd2\x05\xfb\x7a\x3c\xf0\xe3\xd0\xc5\x2a\x11\x88\xc2\xd0\x71\xb1\x85\xe9\xee\xc8\x6e\xef\x59\x6c\x33\x0b\xd0\x4a\xe5\x23\xa6\xdc\xb1\x1f\x05\x95\x6b\x3d\x3b\x1f\x5e\x7c\xf8\xf7\x41\xe0\x3f\x47\x0f\x15\xe6\xd1\xec\x9e\xd3\x9f\x7f\xef\xaf\x4e\x82\x67\x8b\xbc\xa8\xe2\xf7\x89\x2a\x21\x31\x94\x92\x01\x8f\xf8\xd5\x0b\xbb\x15\xb2\xde\x07\x04\xe1\x11\xdb\xed\x29\x88\xb3\x3a\x63\x82\xeb\x34\x08\x6b\x83\x67\x5f\xc0\xf2\xf1\x43\x21\xd8\xed\x97\xaf\x74\xa1\x2c\x5c\x22\xb2\xb0\x1f\xb8\x4c\x90\x81\xc9\x71\x2a\xc9\x94\x17\x03\x9b\x80\x1b\x77\x55\x6f\x16\x1c\x6e\xae\xd9\xf0\x58\x00\xcf\xf1\xc4\xc7\xdf\x60\x17\x88\x07\x0c\x92\x27\x5d\xe9\xc6\x25\xb9\xf8\xa1\x8d\x36\x39\x9d\x36\x46\x08\xd0\xbd\xc8\x05\xd0\x88\xdb\xfa\x9f\x2f\xb3\x17\x0f\x1c\xbb\xdb\x76\xe6\x2d\xd0\x1d\xa7\x71\x5f\x3f\xe1\x11\x37\x54\xf4\xfb\x06\x3c\x53\x79\x4e\x64\x4b\x89\xb6\xfc\x1c\x64\x08\x9e\x4b\xfa\x21\x02\x60\xfd\x3d\xa6\x30\x2f\xe7\xd4\x6a\x1b\xa7\xc9\x41\x57\x94\x8a\x13\xa5\x7b\xa1\x89\x5e\x9c\x20\x6f\x3b\x67\xec\x19\x56\xbe\x7d\xb0\x96\xc2\x2c\x3a\x3a\xf0\xd5\x39\xa7\x8a\x60\xb1\x2e\x41\x5d\x1f\x75\x2a\x5c\x5e\xa4\x41\x37\xf3\x0e\x24\x30\xb6\x52\xb2\x7d\x29\x03\x40\xb5\x2d\x48\x29\xc3\x1f\xf2\xbb\x33\xe4\x59\x6b\x1a\x6b\xb4\x7b\xef\x32\xa5\x33\x60\xe2\xe2\xe4\x30\x7a\x36\xa7\x77\x0d\x50\x59\x01\x83\xe2\x71\x9c\xd8\xd3\x24\x7b\x43\xe9\x2e\x19\x63\x11\x3c\x52\x49\xea\x86\x84\xe2\xbf\x30\x12\x1b\xfe\xe3\xb0\xc8\x6d\xc7\x9f\x9c\xf3\xc2\xed\x1f\xce\x1d\x2e\xd3\x8e\xfc\xc3\xf4\xe9\x32\xe3\x61\x08\xdf\x80\x4d\xc1\x44\x74\x44\xa8\x12\xd4\x9e\x83\x16\x6b\xf6\x32\x70\xf3\x80\x7f\xd4\x50\x31\x5e\xc5\xbc\x3f\xf7\xdc\xc7\x03\x65\xf8\x61\xd2\x75\xaf\xdd\x5c\x0c\x1e\x5b\xc0\x12\xf9\x56\x05\x0c\xda\x01\x4b\xa1\xcb\x9f\xc2\x26\x45\x51\xf1\x34\x4c\x7f\xff\x56\x39\xfc\xde\x7b\xcc\x2b\x0f\x4e\x75\xc5\xe7\x8b\x3b\xd7\xa8\x1d\x4f\x26\xdf\x5e\x89\x69\xc7\xe1\x1d\x07\xc8\x08\xa0\xea\x9e\x37\x99\x39\x2c\x9a\x1c\x91\x28\xe4\x9a\x50\x27\x81\xab\x58\x10\x9c\x91\xf9\x40\x95\xc9\x12\x2a\xa2\xe1\x9a\x91\xf7\x48\x9a\x02\x1e\x7f\x9f\x55\x1e\x94\x70\x6c\x30\x9f\xc3\x7d\xa0\x13\x86\x97\xeb\xeb\x69\xfa\xce\x95\x43\x7c\xd4\x42\x5c\xf5\x79\xee\x3f\xb3\xbf\x66\x6e\xca\x7e\x7d\x46\xf9\x66\x4f\x28\xd2\x8b\x9f\x93\x0a\x0a\x9f\xa6\x1e\xee\x39\x1c\x18\xe2\xa3\x95\x33\x29\xbe\x0c\xc8\x37\xab\x80\x3a\x15\x57\xd3\x07\x4d\xbd\x3c\xc8\x61\x3e\x0a\x21\x80\xe8\x5e\x91\xd4\x9b\x2f\x39\xa4\x95\x06\x85\x1e\x1b\x25\xb9\x62\x39\x54\x46\xbe\xb3\xb6\x24\x6c\xee\x4d\xea\x2d\xa5\xc5\xcc\x10\xe4\x4e\xab\xf3\xd1\x9b\x4d\x93\xf3\x0b\x7c\xe2\xc0\xab\xd4\x0b\xe4\x01\x89\xb3\xd8\x09\xec\x31\xb9\xfa\xdd\x4c\xfe\x3a\x62\xe5\x81\xc7\xa5\x2c\x7c\x03\x75\xd0\x75\xb6\xbb\xfb\x66\x3b\x38\x26\x33\x7a\x0f\x58\x20\x32\x2b\x37\x90\xe7\xe1\xa7\x6e\x88\x44\xe2\xa6\x38\x1b\x8d\xf5\x85\xe3\x34\x40\xb1\x42\x46\x0b\xff\x82\xf2\xa7\xfb\x02\xa9\x09\xf4\xff\x33\xfc\xd4\x7b\x7c\x58\x7d\x9d\xa9\x9f\x08\x2e\x42\xa0\x85\x9b\xc8\x34\x13\xf6\x07\x73\xaf\x5b\xfc\x59\xe9\x60\x04\xe6\x7d\xe6\xe9\xee\x88\xc3\xd3\x06\xdf\x32\x49\x21\x2d\x3c\x22\xe1\x8b\x6d\xac\x74\xcf\xa8\x7f\xf6\x55\xaf\xa2\xd7\x57\xc1\xd5\xde\x7e\x8f\xe9\x22\x67\xf8\x42\x14\x6c\x25\x01\x27\x11\x49\x11\xc4\xe8\x80\xe3\x98\x55\x86\x37\x7b\xf5\x9e\x35\x88\x0f\x16\xca\x19\xf3\x19\x7f\x66\xb3\x9f\x83\xd4\xec\x07\xe7\x8e\x8f\xed\xdb\xd4\xc3\x25\x7d\xa3\x0b\x36\xfd\x71\x9a\x86\x89\xb5\x23\xfd\x1e\x83\x7b\x9e\x6c\x56\x99\xaf\x8c\xb8\x5e\x92\x05\xbf\x6a\xfe\xa9\x95\x32\x00\xbd\xdd\x7f\x03\xcf\x76\xa2\xd9\xd6\x6a\xf2\x23\x84\x3d\xfc\x41\xf4\x12\x60\xeb\x8a\x89\xad\xd5\x0b\xd3\xe6\x25\x3c\x2a\xa0\x75\x5f\x62\xae\xf1\xf8\xf9\xd1\x9e\x44\x69\x25\xb3\x8d\xba\xef\xb7\x2f\xbe\xc6\xe8\xc3\x57\xb3\x9e\x15\xa1\xcd\xc5\x81\xd5\x44\x30\x87\xa8\xe2\x8c\xa4\x2c\xc1\x68\x82\x23\xba\x0c\x72\xb7\x7b\x76\x07\x03\xf1\xe8\xfc\xf0\x38\x4d\xea\x7e\x0d\x1d\x08\x64\x61\x7a\xc7\xbd\x7d\x8d\x35\xa4\x97\x8a\x9d\x36\x82\x0f\x1f\xa5\xc6\x81\x89\x45\x3a\xdf\x82\x7e\x1f\xe1\x3b\xf2\xe1\x37\x7e\xe7\x5b\xa8\x3c\xef\x67\x40\x32\xb4\xb4\xe7\xf1\xc8\xd6\xcc\xbe\x03\xef\xc7\x0f\xd8\x5b\x7d\x02\xa8\xe5\xc6\xb0\x20\x5e\x48\x33\x02\x7e\x98\x65\xcb\xf5\xaa\x4d\x27\x18\xa3\x01\xfe\x66\xc3\x05\x06\x93\xe5\xc8\xfc\xdd\x93\x29\x20\x1d\xea\xff\xfa\x00\x90\xff\xbd\xd2\x79\x94\x4e\xdb\x87\x98\x62\x0b\x2a\xf0\xfb\x7c\xed\x21\x33\xec\x3a\x13\x2a\x1d\x3c\x2f\x00\x2a\xb1\xe9\xb0\x23\x0d\xd8\xe2\x9d\xac\x10\x07\x87\x7a\x94\x8f\x7b\xf5\x51\x34\xbe\xda\x3e\x74\x0e\x72\x95\x2e\xf0\x05\xa2\x3b\x32\x72\x79\x8f\x08\xd2\xe2\xcc\xdb\xf8\xfd\xb3\x86\x49\xac\x32\x64\x17\xdd\x29\x17\x7c\xb4\x7c\xef\x19\xc7\xbd\xaa\x96\x80\xda\xf7\x01\xee\xf0\x1e\x5b\x92\x59\x88\xe6\x93\x08\xc7\xe5\xbd\x21\x61\xe5\xc7\x6a\xc5\x9e\xc9\x22\x87\xa7\xe8\x84\xbb\x17\x07\x79\x7d\x8c\xb3\x2a\x2f\x72\xaf\x27\x1f\xfc\xcd\x53\xd2\x41\xa8\x41\x07\xe4\xbe\xd2\xea\x6b\x50\xb0\x15\xc2\xab\xac\x3d\x92\x8e\xc1\x0a\x4b\x6e\xbd\xf5\x33\x92\x63\x4b\x95\xf5\xba\xcd\xaa\x92\x00\x34\xd7\x69\xde\xe2\x18\x8a\xe8\x9b\x03\x7f\xe6\x3c\x22\x3a\x71\x12\x7c\x6f\xce\x9c\xd5\xa1\x71\xfb\x7b\xd5\xd8\xf4\x59\xf6\x0f\x8f\x1a\xa5\x87\xfc\x34\xb4\x50\x49\xa7\x6f\x00\x63\x35\xb6\x44\xc1\x00\xa2\xb1\xe6\xd4\x59\xe9\x97\x43\xb0\xdf\xba\xcf\x1f\xb8\xb6\x1f\x09\xa5\x18\xec\x35\xf3\x3d\x87\xd5\x1c\x03\x5b\x00\x5e\x86\x5f\x62\xbd\x87\xc0\x28\x6c\xea\x88\x14\xef\xfb\x6c\x3e\xbd\x0a\x5a\x44\xea\xe3\x40\x71\x60\x3f\x6e\x8f\xde\xe0\x3e\x7b\x57\x67\x5b\x28\xba\xcd\xe4\x50\xb9\x3f\x32\x4c\x9c\xfd\x12\xb6\x98\x5f\x4f\xce\x77\x9a\x24\x7d\x7c\xcd\x4f\x40\x2f\x27\x24\x94\x4b\x36\x52\xd3\xc4\x2f\x0b\x22\x49\xad\x18\xc6\x67\x0e\x2c\xfc\x9e\x17\xd7\x4b\xcc\x70\x46\xb9\x7b\x21\x3d\xcd\xe5\x9f\xdc\x4e\xd9\x5c\x6d\x74\xed\xab\x62\xc4\xc8\xe8\xdd\x21\x7b\x3e\x9c\xaf\x24\x9c\x13\x5a\x00\x2b\xdb\x62\x66\x13\x9f\x32\x48\xbd\xfe\xba\xcc\x93\x99\x85\xa7\xec\xe3\x8c\x29\xf8\x08\x63\x6d\xcb\xea\x1d\x4b\xfa\x46\x6f\x9d\x2b\x35\xa7\x66\x3a\xc8\x60\x4a\x45\xb3\xf1\x20\x39\x20\x93\xe3\xdd\x28\x7c\x92\x90\xfa\x29\x5f\x99\xf9\xd6\xad\xc6\x47\x59\xaa\x77\xd1\xdc\x07\x4e\x45\x2d\x75\xd9\x47\x3b\x41\x8c\xe6\xea\x23\x94\xc4\xf5\x9d\x48\x63\x0d\x75\x26\xa8\xc3\xa7\xea\xcd\x9b\x60\x73\x39\x4a\xe7\x36\xdb\xb0\xdd\xc1\x52\x7a\xca\x1b\xd5\x69\xba\xbd\xbd\x90\xc5\x2f\x39\xc9\x57\xf5\xb1\xef\xb5\x31\x9a\x27\x7e\x49\x74\xb9\x97\x2c\xfc\x26\xa0\x39\xe4\x53\xad\x9a\x8f\xd8\x7b\xeb\x8c\x01\xea\xfc\xa0\xe9\xf2\x52\x1b\x2f\xd2\xc8\xb5\xec\x9c\xe1\x65\xd6\x1d\x91\x96\x1b\x5e\x6c\x3f\x6d\x37\x20\x28\x77\xee\x85\x74\xdf\xe2\x9e\xdb\x19\x48\x8b\x12\xdf\xfe\x2b\x07\x11\x6c\x87\xbf\x4a\x83\x15\x97\x21\x01\x8c\x40\xf2\x28\x52\xb2\xbf\x60\xef\xa7\x19\xa6\x94\xa6\xb4\xa3\xe2\xb1\x6d\x43\x29\xe1\x0e\xc1\xe8\x91\xc9\x20\xac\xef\xd5\x2a\xf7\x20\xf2\xcf\x1c\x50\xdc\x30\x72\x76\x40\xa9\xf8\xe1\x62\xc6\xc9\xaf\xe1\xaf\x35\x26\x03\x68\x4e\x7a\xc9\xd0\xc4\xff\x90\x59\xd9\x76\x8e\x35\x5b\xee\x5e\xf9\x38\xc1\x28\x7f\xa2\x8a\xbb\xb3\xc5\xd7\xb7\x30\xc4\x3f\x0b\xfd\xda\xff\x46\x94\xa3\xcc\x92\xf6\x88\xf6\x8f\x37\x27\xaa\x5d\x7d\xfb\x2d\x9c\xcd\xc6\x07\xae\xff\x48\x10\xeb\xfd\x07\x94\x6d\x16\x0d\x83\x77\xa7\xa6\x40\x94\xef\x95\x8c\xea\x27\xea\xde\x4b\x1a\xac\xfd\xe3\x9a\xbd\xda\x3c\x96\xd5\x58\x74\x07\x71\x44\x51\xaa\x2e\x20\x81\xad\x83\x7c\xbf\x8e\xd8\x3c\x56\x51\x8e\x73\xef\x8d\x66\x72\x3f\x7d\x05\xd5\x48\xc2\x7a\xb5\x22\x59\xc9\x79\x67\xfb\x1e\x8c\x15\x4d\xf2\x83\xec\x47\xf3\x0c\x5f\xaa\xc8\x99\xe3\xcc\x0e\xf3\xf7\x0d\x5b\x77\x95\xdb\x41\x76\xe0\x4c\x5f\x6f\x61\x8a\x5f\x10\xcc\xb5\x08\x7f\x71\xaf\x1a\x40\x28\x70\x3d\x3f\xa2\x72\xc9\x34\xad\x4f\x2a\xd5\x32\x9b\x22\x94\x3a\x53\x52\x14\x63\x1e\xfc\x16\x5f\x19\x63\xa9\xe7\x57\x17\xd1\x25\x0a\xa6\x4f\x1b\x20\x35\xc7\x1c\x03\xf9\x35\x3e\x00\x52\xd6\x37\x0c\x58\x17\xc2\xe5\x2f\xb9\x34\x4e\xa7\xfd\x26\x64\xe1\x5c\xa7\x35\xbe\x6d\xb1\x2d\x44\x44\x81\x84\xb3\xd5\x6d\x24\x3e\x8f\x2c\x7a\x7e\x70\xc7\xb3\x8f\x7d\xa6\xb2\xce\x27\x5a\x4d\x94\xd9\x95\xd9\x34\xef\xcb\x5d\xe4\x53\xca\xe0\xde\x53\xdf\x0d\x87\xf7\x38\x15\xf1\x6c\x33\x4f\xd2\x3d\x56\x0d\x79\xd0\xa5\x91\xd9\x32\xe8\x5c\xc8\xd5\xab\x5d\x79\x7c\x05\xf7\xdb\x83\x18\xd2\x04\x7b\x7e\xf9\xdd\x67\x21\x68\xfa\x02\x76\x20\xf5\x1e\x14\x8b\xc3\x7f\x7d\x89\x24\x18\x27\x68\xfb\xd1\x43\x84\xc0\x7e\xe5\x8a\x0f\x04\xee\x64\xe1\x68\x3f\xd2\x4e\x9b\xb3\xe2\xcf\x6b\xee\xe5\x61\x88\x42\x69\x7d\x31\xf5\x09\x7e\x3f\x01\xd5\x21\x2a\x54\x4c\xd8\x20\x0d\xdb\x34\x07\xa6\xab\x6d\xb3\x4a\xaf\xd8\xfe\xc1\xd0\xe3\x91\xf2\xc9\x90\xc9\xdc\x2c\x62\xb8\xa6\xb8\x0f\x45\xa8\x21\x9a\xfb\xcc\xf1\xc6\x70\x0f\xdc\x3b\x88\xc3\xe2\x15\x1b\xb6\xee\x9e\x23\x21\xc2\x8c\x43\xc7\xde\x77\x9b\xb9\x42\x64\x16\xf8\xb5\xf7\xee\xcf\x3c\x77\x0f\x46\xa6\xdc\x85\xb8\x22\x49\x64\x54\x8e\x11\x1c\x90\xcc\x5f\x7e\x7b\xde\xd0\x7b\xd5\xdb\x46\x42\xb3\xf5\x0a\xf5\x43\xf1\x4f\x66\xd3\x91\x77\xa5\x39\x49\xe9\xab\x30\x24\x09\x59\xf9\x8c\xb4\xa3\x35\x37\x7b\xdf\x1d\x33\x72\x8a\x13\xf6\x5c\x02\x68\x89\x17\x80\x44\x70\x57\xd9\x40\x2a\xe6\x19\x6d\x92\xa7\x7e\x86\x41\xc3\x36\x60\x68\x0a\xb8\xb4\x71\xfc\x7c\x3e\x05\x67\x7c\xcf\x78\x07\xbc\x47\x10\x03\x29\x4d\x87\xa8\x4a\x49\xae\x89\xa6\x17\x75\x76\xf9\x82\xb1\x1c\xde\xdd\x47\x29\xb3\xdb\x7d\x9e\x78\x88\xe1\x23\xb1\xfa\x73\x2c\x71\x55\x25\x90\x0a\x53\xb7\xd2\xb2\xb2\x7e\xde\xa7\x18\x20\xe5\x90\xcc\x6d\x83\x01\xec\xfd\x3c\x9c\xd7\x2e\x90\x79\x63\x03\x93\x83\x44\x4a\xb5\x5d\x32\xc2\xfc\x5a\xed\x6d\xb4\x33\x85\x27\xd8\x32\xde\x8c\x6a\xf6\x5b\x2f\x57\x32\xb9\xde\x8b\x11\x37\xfc\xf7\xbd\xf7\x9e\xe0\x5c\x82\x1f\x79\xc0\x70\x76\x73\xa4\xe5\x98\x3a\xa2\x7c\xcf\x85\x1c\xdb\x88\x65\x77\xe3\xd1\x2a\xfb\x3f\xee\xd3\x28\x24\x00\x4b\x5c\x86\x1e\xc7\x57\x79\xde\xe3\xc8\x4d\x3c\xe3\x90\x53\x56\xd4\xb9\x10\xaa\xea\x94\xe5\xce\x27\x32\x06\xc7\xf3\xe7\x65\x5d\x9e\xf1\x06\xd6\xcd\xba\xe7\x42\x98\x69\x1e\xb3\x66\xca\xed\x15\xb6\xa1\xbc\x9a\xa9\x1c\x52\x1a\x00\x90\xba\xab\x64\x64\x43\x82\x04\xda\x53\xe1\x37\xa5\x34\x4b\xdd\x67\x19\x23\x53\xbe\x4b\x44\x0e\xdc\x11\xf2\xa5\x13\x95\x93\x0c\xdc\x8f\x0c\xc1\xe5\xa2\x11\x24\xa7\xde\x60\x54\x15\xfc\x24\x47\xc1\x3f\x6a\x9d\xd4\x4a\x20\xed\xd5\x0f\xcb\x2d\x74\xc4\xa6\x3d\x76\x3f\x1d\xaf\x08\x50\x9f\xd2\x10\xd4\x7b\x0e\xbd\xdd\xcb\x18\x2d\x37\xc3\xf5\xfe\xc9\x1f\x05\xc9\x16\x2d\x1d\xe5\x17\x01\x40\x1c\x3b\xb2\x52\x8e\x08\xf6\x24\xf9\x52\xac\x58\x0a\x11\x77\xbf\xb6\x5c\xfd\x27\x66\xbd\xfe\x51\xa5\x62\x7f\xb0\x6c\x0e\x51\xd5\x84\xba\xe4\xdc\x54\xaf\xdc\xf0\xc8\x04\x2d\x10\xa7\x3e\x14\xa5\x81\x8a\x96\xb4\xfc\x8e\x34\x04\xcd\xac\x61\xe2\xf1\x60\xb2\xce\x6b\x7a\x72\x4b\xef\xf9\x7f\x96\x9b\x18\xef\xf9\x35\xfd\x00\x6f\xc8\x16\x8b\xc6\xad\xc5\xef\xe9\x9e\x6b\x78\x62\xec\x28\x2c\x7f\xe3\xcc\xbe\xda\xf2\xd6\xa9\xf4\x53\x03\x84\xbf\x35\xf6\x2d\x8f\x83\x88\xef\xd3\x1a\x68\x6a\x0c\x7e\x7a\x6b\xde\x6a\x65\x09\x75\x75\x76\x08\xd4\x03\x2b\xee\xef\x3c\xcc\xf7\x48\xf0\x79\x54\x6b\x3f\x52\x21\xf0\x70\x64\x84\x4b\x18\x9b\x6d\x30\x01\x69\xfb\x12\xdc\xbb\x46\xca\x90\xe1\x3b\x31\x2f\x19\x16\x78\xde\x6f\x2d\x06\x85\xb7\x67\x48\xb3\xd8\x1e\x95\xce\xc7\x08\xcb\x10\x0c\xf4\xfb\x61\x8c\x3b\xb0\xf1\x1a\x1e\x24\xa4\xf5\xbe\x7e\xa8\x25\x23\x57\x8c\xcd\xd3\xca\x1b\xa2\x8b\x2a\x3b\x6d\xe9\x98\xd3\xe8\x10\xd3\x2e\x7c\xee\x99\xc2\x2f\x74\xcf\xee\x30\x4d\x67\xcb\x0a\x35\xa2\x8a\x64\x72\x04\x89\x9c\xba\xc6\x5d\x22\xbe\xa3\x56\xf1\x7c\xa6\xb1\x1d\x79\x11\x0d\xb5\x37\x40\x70\x51\x44\x2c\x36\x4a\x80\x27\x4b\x85\xd0\xe5\x7c\xd9\x38\xca\xba\xaf\x52\xec\x37\x26\xee\xe6\x7b\xdd\x01\x4e\x9c\xb0\xe0\x41\x6c\x39\x92\xca\xf4\x78\xe5\xa2\x67\xa7\x22\xdc\xfd\x14\x68\xea\xbe\xd3\xbd\x4f\x29\xc7\x05\x70\xf1\x50\x29\xcf\xab\x5f\x85\x8d\x13\xc6\x64\x26\x4d\x8c\xc0\x51\x54\x2c\xca\xc0\xca\x01\xfa\x8b\xb7\x14\xdc\x8f\xf7\x38\x74\x8f\x59\x57\xfd\x43\xed\xdd\x2c\x9f\x6f\x44\x29\xa4\x7a\xe7\x35\xf6\x43\x66\x58\x9e\x35\x4a\x55\x79\x0f\x03\x38\xbf\x24\x08\xd4\xe2\x5d\x22\xc6\xf0\x94\x12\xa6\x0c\xe7\x95\x5e\xae\xee\x5e\x02\xd1\xd4\x70\x39\x21\xb9\xed\xe3\x85\x7d\xaf\x19\xa3\x41\x12\x92\xf0\x49\x66\x67\xaf\x9e\xf7\xaa\x83\xf0\xd3\x92\x9c\x55\x83\x92\x48\xc0\x42\x57\x29\x66\xd4\xb4\x23\xd0\x9c\x3d\xe3\xa7\xfb\x48\x92\x7b\x01\x63\x22\xfd\x62\x29\x31\xbe\x6c\x81\xc9\xf9\x7a\x98\xe9\x33\x8a\x5e\x63\x25\x21\xed\xd6\xee\xc2\x5b\x16\x06\x60\x08\xd7\x1f\x41\x8a\x8d\x0a\x7c\xc6\xf4\x35\x21\x98\xc1\xd3\x03\xde\x56\x3c\x9d\x6d\x7a\x61\x6d\x3f\x44\xfd\x10\x58\xfd\xd7\x5b\xe6\x88\xf0\x5e\x13\xec\xcc\xbf\x64\xa7\xf2\xf5\x37\x60\xd3\x1c\xca\xb3\x0c\xab\xc2\xe0\x15\x8d\xd2\xb3\xea\xf1\x33\x56\xe3\xf8\x47\xd3\x75\x6c\x39\x8a\x2c\xd1\x0f\x62\x81\xf0\xb0\xc4\x09\x23\xbc\x91\x10\x3b\xbc\x37\x12\xc2\x7e\xfd\xcb\xac\x9e\xb7\xa8\x33\x35\x7d\xaa\xab\x51\x12\xe6\xde\xc8\x88\x1b\xfb\xea\x88\x48\x69\xb9\x09\x9c\xc7\x7c\xe5\xcd\x1b\x25\xba\x2f\x0b\xf2\x20\x38\xe6\x4a\xf9\x70\x08\x9a\x0a\xcc\xf5\xa4\x68\x0b\x07\x54\xd1\x96\x75\xa4\x91\x0e\x87\x77\x24\xf0\x5e\x11\x95\xc1\xd8\x3e\x12\x49\x36\xcb\xed\x31\x09\xe5\xdd\x04\xb1\xea\x13\x82\x3c\x2d\x7e\x90\x2e\x22\x35\xc4\x6b\x7c\x41\xdb\x8f\xb1\x65\xe2\x97\xcb\x4a\x2d\x02\x00\x98\xee\x4c\x1c\xaf\x99\xed\xdf\xf8\xc6\xf5\xa5\x80\xf7\xa6\x91\x0a\x05\xbc\x8f\xe5\x4f\x89\x60\xa0\x80\xbf\x0a\x55\x02\x32\x7b\xa2\xac\x70\x10\x7e\x9c\xe8\x45\xb7\xd9\x9b\xa3\x1d\xf3\x16\x3e\x4d\x91\xd0\x2e\x37\xb9\x12\x0c\x2d\x09\xff\x49\x39\xde\x45\x33\x39\x71\x1d\x0c\xff\x4a\x19\x67\x3c\xf3\xe4\xf5\x5c\xdb\xc5\xf7\xe5\xeb\x95\xa2\x6b\xc4\x0b\x8c\xb0\x78\x94\x96\x6b\x64\x07\x45\xa5\x9e\x5d\xf9\x3d\x98\xf6\xa0\x48\x5c\x6e\xec\xcf\xfc\x4d\x2a\x4d\x96\x58\x77\xcb\x12\x49\xbb\x4c\x8a\xe5\x8a\xfd\x3d\xd1\xd6\xe3\x37\xd0\x00\x80\x6e\xfb\x1b\x37\x66\x4b\xc1\x97\x74\xb8\x00\x46\x7b\x8a\xa2\xf9\x54\xbd\x6d\x04\xb1\x5e\xb8\xf9\xa7\xc9\x5d\xab\x04\x50\x4e\xf0\xc2\xda\xf1\x11\x9c\x0f\x53\xfe\x7e\xb1\xcc\xa2\xa9\x52\x22\x6a\xa3\x2d\xf7\xec\x85\x6d\xa9\x54\xdf\x18\x7d\x12\xd7\xd3\xad\x10\xb9\x71\x51\xa4\x94\x5d\xda\x36\x0e\x6b\x20\x52\xfc\x9b\x6f\x2d\xa5\xe8\x9a\x59\x6d\xcb\x2b\x88\xcd\x99\x3d\xa2\x09\x70\xf8\x24\xe0\x6a\x11\x6e\xe7\x01\x5f\x00\x79\x6e\x9f\x2f\xea\x1e\x1f\x6b\xfe\x28\xf5\xf4\x6f\x16\x79\x9c\xff\x16\x41\xd8\x5f\x78\xf9\x09\xbe\x1f\xc1\xf7\x70\x3e\xb9\x65\x51\xfb\xbe\xed\x15\x00\x63\x9f\xd2\xf5\x12\x07\x12\x47\x7c\x69\x35\xf1\x7e\xeb\xed\x14\x1e\x2b\x08\x66\x95\x6c\x9f\xe3\x17\x61\xf4\x6e\xcc\xef\xbf\x6b\xb6\xfb\x29\x79\xad\x20\x12\x89\x48\x1e\x2f\x78\xa2\x85\xb2\xac\xfe\x90\xcd\x78\x9c\x66\x6b\x5e\xf2\xed\x63\x79\x1f\x47\xb8\xd6\xf9\x2e\x0b\x9a\x2f\x1f\xa1\xf5\xb8\x6a\x13\x5d\xdf\x4d\x31\x5d\xfb\xcb\xf8\xd1\x52\x1c\x24\xf5\xce\x96\xc0\x0f\x18\x0a\xb9\x16\x43\x62\x95\x78\x78\xf6\x7c\x94\x92\x74\x11\x4c\x0d\x8f\x6f\xfe\xfb\x95\x00\x5f\xfd\x3e\x01\xe8\xdd\xc6\x53\x7f\x76\x8d\x59\xa9\x8a\xb0\x38\xe3\x51\x83\x5f\xdb\xdf\x7a\x9d\x1d\x45\x06\x4e\x08\x4b\xca\x92\xbb\x9e\x84\xbc\xa4\xd3\xd6\xe4\xa6\xfd\xce\x24\x78\xf0\xb3\x30\xc7\x3b\xc8\xff\x21\x56\x07\x34\xee\x8b\xee\xc7\x68\x48\xe0\xc7\x14\x00\xa0\x5f\x8c\x43\xb9\x27\x14\x4a\x80\x77\x88\x2f\xe0\x09\x4f\xac\x8c\x76\x53\xe0\xff\x93\x12\x28\x03\xf8\x75\x63\x9d\xfc\xa3\x39\x5a\x4b\x55\x0f\x7a\xdd\x01\xde\xfc\xe4\x36\x5a\xa8\x01\x8f\x4a\xbf\xb5\x11\xc8\x7b\x83\x4c\xd7\x3c\x08\x67\xa4\x28\x86\xd3\xd2\x59\xa7\xef\xd6\xeb\x73\xef\xe3\x17\xb4\x49\x5b\xa8\x5d\xdc\x7f\x83\x1c\x99\xec\x16\x59\x09\xb2\xfc\x56\x6a\x00\x18\x5e\xf0\x6e\xd8\xbb\x32\x6e\xa5\xca\x10\x90\x6f\xf7\x15\xbe\x55\x4f\x9e\xef\x57\x7f\x60\x6c\xb7\x55\x42\x48\x23\x0f\x59\x26\x28\xcd\x3b\xb2\x51\x67\x4f\xc7\x3f\x34\xe0\xb4\x19\x9e\xe6\x53\xa7\x87\xca\xfa\xe1\x17\x44\xfe\x7a\x33\x7d\x24\xf1\x6f\xa7\x61\xbd\xc8\xbf\xd5\xda\x38\x89\xbc\x76\x6b\xeb\xe4\xa7\x34\xc7\xfb\x17\x3d\x1c\xe0\xbc\x50\x37\x63\xf9\xde\x55\xa8\x99\x00\xbf\x60\x95\x97\x40\x2f\xd6\xe7\x5e\xd4\xf8\xa5\x11\xa8\x13\x00\xbf\xa6\x58\xad\x7b\x02\x75\x41\xac\x57\xa7\xaa\x38\xbb\xf2\xfa\xdc\x13\x31\x59\xf6\x5f\xa1\x7d\x06\x21\xc3\xca\x31\x7d\xae\x84\xfb\xe9\x39\x64\xf3\x67\xb8\x09\x0c\xe0\xd4\xa8\xf5\xc3\x67\x2e\x4d\x52\x10\xf3\xef\xf7\x82\x38\xd0\x72\x78\x7a\xc6\x68\xcd\xfd\x72\x82\x1c\x53\x90\x77\xd1\xaf\x7e\x7e\x8b\xa2\x8b\x78\x03\xec\x99\x5c\xef\xd7\x0a\x7d\x0a\x70\x26\x5a\xf2\x9f\x24\xcc\xd1\x50\x93\x87\x5e\xb7\xef\x49\x0e\xc2\xc3\x1f\x75\x10\x5f\x72\xfb\xda\x9a\x27\xf5\x03\x90\x2b\x9d\x4b\x47\xe2\xf9\xd2\x13\xc0\x01\x01\x90\x76\x21\xef\x23\xa9\xde\x00\x6e\x95\x50\xbf\x69\x06\x6f\xd3\x3d\xd3\x1e\xfc\xf7\x99\x22\x98\x51\x35\x08\xdb\xe6\x0e\xdf\xc9\xae\x7b\x3f\xe9\xbc\xfc\xb5\xdc\xe7\xb2\x94\xab\xd0\x3d\x51\x8b\x89\x05\xdf\x9e\x45\x36\x9f\x25\x42\xea\xb8\x7b\x0e\x7f\x33\xfc\xef\x41\x07\x26\x6d\x05\x20\x9e\x07\x32\x1c\x2f\xc4\xac\x3c\x7a\x02\x33\xe0\x3b\x01\x2a\x6a\xbc\x78\x27\x62\x4d\xc9\x25\xac\x2b\x23\xbc\x27\x88\xbf\x6f\x58\xd1\x18\xc0\xd3\xc6\x37\x4b\x8f\x9b\x57\x3f\xa5\x54\x16\xfa\x85\x1c\xfd\x10\xf4\x4e\x28\xf6\x4d\xc4\x80\x5f\xef\x0e\xc9\x68\xb6\x75\xf7\xfe\xea\xc3\xfb\x1e\x6b\x33\x67\x4b\x5b\xb9\xf3\xe6\xe9\x88\x64\x24\x0e\x8f\x76\x3a\x53\xc0\x3d\x3c\x87\x08\x47\xe4\xc6\x7f\x0b\xef\x87\x93\x83\x3e\x1a\x4f\x74\x26\x3f\x3f\xe5\x8a\xbb\x65\xeb\xd9\xb1\x62\x7f\xb2\xde\xd8\x6a\xf9\x4b\x06\xec\x87\x16\xa9\xa5\x9c\xb5\x00\xd8\x22\x60\xac\x3e\x9b\x2c\xd8\x47\x09\xde\x3f\x43\x74\xc3\x5f\xaf\x20\x5d\x7a\x3f\x98\x8b\xe6\x4c\x6f\xf2\x04\xa5\x7b\x68\xd7\xce\x79\x00\x3e\x9e\xe7\x3b\x0e\x28\x15\x95\x25\xba\x1c\xe1\xf6\x72\xf0\xc5\x22\x12\x82\x26\x2c\x4a\xa9\x0f\x6a\x06\xe7\x30\xc4\x6b\xfa\xc2\xe0\xb4\xf5\x1c\xbf\xfa\xfa\xfd\x36\xe3\xec\xfd\xf1\xfb\xd9\x05\x2f\xa6\x68\xdf\xbc\x8f\xf7\x32\x4f\xe6\x76\x25\x01\x36\xe8\x04\xb7\xd5\xfb\xec\x81\x2f\x96\x9a\xf3\x66\x11\xa7\xfc\x72\xcf\x8f\xa5\xba\x00\x25\xd2\xb9\xea\x91\x97\xa7\xc5\x54\x4f\x29\x1e\x22\xed\x5e\x68\x88\xdf\x86\xdc\xb2\xb9\x49\xe1\x59\xa6\xf6\x55\xb1\x65\xa9\xc9\xfe\x26\x40\x9d\x16\xd9\xf7\xcc\x58\xb2\xfa\x92\x6c\x5c\xbf\xc9\xe9\x61\x23\x9f\x7e\x82\x6f\xd1\xfd\x8b\x26\xba\x16\x08\x6f\xc3\x5b\x70\xef\x81\xbf\xfd\xe8\x1c\xd1\xea\x8e\x88\x5c\xb2\x08\x70\x9e\x06\xd8\x1a\x37\x6e\x3a\x35\xbc\x87\xe5\xd3\x45\x2e\x80\xcf\x1e\xe0\xe8\x9a\xf4\xe4\x84\x8e\xb9\xb7\x8b\xa4\xf1\xad\x9f\x4b\x87\x5a\xd4\x5a\x73\x8b\x53\x6b\x40\xc2\xdd\x2b\x49\xce\x11\x98\x2d\x78\x7d\x3f\x03\x17\x84\x3e\x8a\x32\x4d\xfa\x38\x97\xe9\xd5\x7b\xef\xe5\x65\x3c\xd7\x1b\xf8\xc9\xf3\x19\x2e\xc0\x2e\xac\x9b\x1f\x5e\x3c\xb5\x94\x29\x9e\xaf\xed\xec\xf9\xcd\x18\xe1\xcc\xa0\x34\xfb\xed\x15\xcd\x49\xd1\x4f\x0f\xdf\x70\xfc\x87\x80\xa8\xe2\x8e\x12\x9f\x23\x36\x4f\x10\x9f\x83\x63\x68\xf8\x3d\x50\xdd\x1b\x3b\x44\x36\x89\xca\x04\xc0\x24\xa8\x2a\xf2\x28\x8f\xaa\x35\x80\x8d\x8a\x45\x73\x39\xc3\x21\x5d\xcb\x32\x4c\x4f\xad\x6f\xb1\xaf\x5f\x44\x3a\x39\x54\x16\x1b\xfe\x3a\xdc\xd2\x4b\xe3\x0c\xc5\xca\x8b\x2d\x3c\x53\x2b\x5a\xcb\xde\x0d\xfb\x87\xe0\x3e\x5c\x52\x97\xee\x0d\x4a\xf9\x67\x0a\xe7\x64\x6e\x8a\x8e\x3a\x02\x60\x49\x80\xcf\x15\x20\x53\xbb\x47\xa3\x88\x9a\x28\x90\x6d\xfd\x99\xa7\x64\x38\xb2\x6d\x78\x0c\xe0\xbb\xdc\x36\x53\xc8\x4f\xe5\x99\x1d\xcb\x0f\xc1\x84\x4f\xc0\xf3\xbf\xc9\x91\xe4\x2b\x9e\x06\x1b\x93\x0f\xc4\x8f\x71\xc4\x5a\x9d\x45\xd8\x5f\x2d\x60\x39\x38\x5f\xb2\x78\x85\x55\xfb\xe6\x8e\x7e\x73\x5f\xa6\x0e\xde\x90\x0a\x17\x03\x8c\x17\x87\x0a\xf3\xe9\x60\xec\x07\xbf\x7b\xe4\xee\x69\x09\xbc\x7a\xa3\x32\x9e\x3a\xcd\x4f\x01\x75\x7d\x6a\x40\x0b\xd6\xf4\xc3\x64\xaf\x61\x9e\x63\x28\x09\xc5\x1f\xe4\x7d\xfa\x98\x8d\xee\xab\xe0\x0c\x5e\x71\x93\x54\xc3\xf7\x65\x59\x11\xcd\x9c\x6f\x60\xe0\x2e\x48\x31\xca\x7d\xb2\xf4\x4f\xb9\x71\xe8\x83\xf2\x17\xde\xf2\xb9\x62\x95\x04\xc8\x99\xb9\xe1\xb9\xe9\x70\xb1\xb6\x52\x2f\x01\x4f\x2f\x14\xe0\xd5\xc6\xf1\xd2\x6b\x55\xd4\x34\xbe\x8b\x36\x67\xbc\x99\x12\x4f\x8c\x57\x4c\x05\xcf\xbb\x2f\xa7\xdb\x29\xc3\x1e\x8f\x3f\xad\xe7\x71\xa3\x2d\xd1\x7f\x4f\x96\x33\xf7\x20\x64\x03\x66\x84\x83\x94\x77\x63\x7e\xe2\xa1\x51\xf4\x6b\xd8\xdb\x6a\xa1\x68\x58\x0b\xa8\x3b\xef\x9e\x80\x8f\x09\x42\x63\x04\x52\xc6\xd3\xf0\xbb\x99\xc7\x1c\xa3\xb3\x15\x84\xd7\x34\x1f\x20\x45\x87\x52\x2f\x56\xfc\xfc\x86\x5b\xa2\xc9\xaa\xa4\xdf\xeb\x6f\x8f\x73\xaf\x9e\x2a\xa4\xa6\x7e\x47\xf7\x6b\xa1\x0b\x5a\x38\x2a\xe3\x64\xec\x31\xc8\x11\xb4\x38\xcb\x2b\x1c\x9a\x93\x24\xfb\x77\xd2\xe6\x09\x5b\x44\xb6\xa9\xaa\x7a\xf3\x7e\x29\x82\xde\x55\xc5\x0f\x65\x38\x09\x21\x51\x56\x50\x57\x61\x1a\x1d\xea\x60\x2d\x29\x5e\xb8\x9c\xa4\x4d\x25\x8a\x68\x0c\xae\x1d\x1a\x66\xde\xfd\xc3\x90\x99\xb3\x89\xef\x46\xe4\x1f\x26\xd4\x61\x09\xe5\x76\x8f\xc8\x25\xda\xd1\x58\xeb\x15\x45\x76\x57\x25\x8a\x9b\x73\x0c\x66\xa6\xcb\xbe\x43\xae\x0a\xc0\x72\xaf\x2f\x91\xab\x7f\x7b\x72\xee\xd9\x31\x0b\xd1\x40\x16\x00\x48\xf4\xbd\x1f\xd1\x7e\xd0\x41\x6c\xe8\xab\x2d\xab\x74\x85\x71\x14\x3a\x8b\x96\x5c\xea\xde\x64\x21\x92\xcb\x5e\xde\x84\xdb\xdb\x21\x8d\xe1\x60\x09\x33\xd3\xb5\x53\x5b\x7e\xb2\x77\x7b\xb5\xa2\xe7\x92\x81\xae\x78\xe6\x17\x71\x54\x54\x43\x5c\x19\x8a\x6e\x55\xd3\x43\xac\x2b\x5c\x17\x83\x18\xb6\xdd\xca\x3b\xbc\xc3\xaf\x15\xfe\x54\x5a\x84\x7b\xbf\x4c\xfc\x8a\x59\xc0\x73\x8f\xd2\xe8\xba\x85\x55\x1b\x94\xe5\x94\xfe\x1d\x64\x88\xa7\xa1\xf7\x5b\x2d\x8a\x20\x76\x4a\xcf\x1b\x9c\x41\x22\x38\x1e\xa4\x11\xdb\xc2\x5b\x19\x2f\x19\x78\xe7\x06\xf8\x27\x1b\xd3\x56\x8c\xa2\xbf\x83\x02\x90\xa2\xa8\x15\xfc\xab\x97\xa6\x26\x68\x86\xb8\x77\xda\x64\x85\x3f\xe3\xc1\xf8\x61\xd6\xd7\xb1\xeb\x91\xd8\x6e\xe6\xbc\xf0\x90\xb3\xde\xfc\x38\x03\xb5\xd5\x7c\x68\x75\x7d\x9a\x6f\xc4\x09\x00\x94\x26\x23\x9d\x8e\x5e\x14\xcb\x18\xa5\x5e\xea\x12\xd1\x57\xb9\x5f\x41\x79\x86\xb7\x49\xfb\xf7\xfd\x05\x6f\x07\x1a\x40\x99\xf5\xf1\xb4\xc4\x1a\xce\x3a\x2f\xce\x70\x97\xd9\xc2\x3e\x29\xfd\x0e\x71\x1f\x8c\x98\x95\x06\x8b\xaa\x9f\xd6\x9b\x50\x11\x97\x4d\xd7\xbb\xef\x0e\x16\x05\xf4\x2c\x0e\x01\x77\x30\x6f\x03\xb5\xbf\x92\xf9\x94\xa3\x27\x91\x43\x5d\x37\x8a\x45\x72\x8b\x16\x4b\x9c\x4c\x31\x9a\x91\x9d\xac\x32\xe7\xd3\x64\xd5\xf2\x61\x55\x44\x7d\xb6\x3d\xf1\xe5\xe3\xa5\x43\x4a\xb3\x96\xfc\x43\xa5\xb6\xd8\x37\x9e\xc1\x0d\x75\x0e\x74\xdf\xc3\x38\x7a\x1e\x99\xa3\x88\x8f\xef\xa1\x48\x87\x2d\xbf\x60\x21\x94\xcc\x1d\xa5\x49\x6d\xb6\x25\x1f\x7d\x1a\x1d\x68\xf0\xa5\x3d\x45\x05\x64\xfc\x36\x49\x56\x3c\xa1\x87\x52\xd9\x5f\xc5\x0b\x63\x31\x5f\x6b\x9f\x9c\xe0\x79\xb5\x07\xc9\x08\x09\x6c\xab\xec\x8f\x67\xe0\x62\xad\x74\x93\xdd\xe5\xa5\x8f\xf1\x91\xe3\xa8\xd5\xc8\x8d\xe7\xc4\xa9\x94\xd0\xb7\xa0\x05\xc1\xf1\xd3\x68\xcd\x83\xf3\x48\x24\x36\x87\xf1\xe4\x5e\x5b\x24\xf0\x9a\x50\x6c\x5a\xe0\x8c\x04\x2d\x3c\xea\x21\xd1\x5a\xeb\xa0\x07\x75\x4a\xe4\x7a\x12\xbe\x55\x56\xb9\xf2\xe4\x5d\xcd\xf5\x46\xa2\x52\xa4\x85\x6e\x7e\x70\xfb\xd3\xd4\xd8\xf9\x05\x67\x30\x0c\x70\x0e\xad\x84\xb9\xf5\xa3\x33\x94\x17\xbd\xf3\xd6\xf0\x75\x01\x14\x53\x2b\x51\xbe\x84\x2a\x26\xab\x87\x2f\x1d\x64\xe5\x2d\x1a\xf6\x82\x83\x20\x01\xc5\xb2\xba\xb7\x0d\xa3\xc4\x11\x7f\xf3\x79\x77\xd1\x05\xfe\x4f\x21\x51\xdd\x62\xa2\xac\x69\x95\xf2\x0e\xec\x84\x14\x0b\xcb\xa9\x63\x74\xa5\x90\x44\x61\x9e\x49\xb2\x7f\x81\x13\x1e\x25\xb2\xbe\x24\xb2\x7b\x28\x00\x52\xde\xa1\x1f\x4c\x27\x8f\x08\xca\x72\x91\x1c\x8e\xd7\x5a\x1c\x5b\x21\x8f\xbe\xbb\xe4\xb3\x7f\xd0\xcc\xad\xef\x1f\x8d\xa3\xe6\xfc\x59\xa5\x00\x29\x1b\x01\x38\x7a\x52\xfb\x5a\xd9\x1a\x9d\xd4\xf4\xd1\xc4\x32\xe1\x1f\xf0\x4e\x31\x18\xe9\x67\x6b\x94\x89\x14\xde\x23\x89\x2b\xb9\x4e\x98\x72\x35\x38\xf8\x5b\x07\x37\xd0\xaa\xdd\xc3\x16\x70\x15\xf6\x08\xbf\xb5\x3c\x11\xbb\xdf\xde\xe9\xd2\xdb\x8d\x18\x09\x69\x36\x00\x1a\xa5\xf0\x9d\x55\x8d\xe9\xee\xa6\x04\x12\xd7\xa8\xdf\xfd\x7b\x33\x75\x8c\x79\xb5\x61\x2c\xb9\xc7\x6c\xb9\xa1\x2a\x8c\x3d\xce\x00\x0c\x1d\x17\x6b\xb0\x93\xd9\xf7\xe1\xb7\x41\xa7\xe0\xe2\x35\xe4\x35\xde\x92\x00\xea\x17\x9d\x30\x0e\xee\x1f\xee\x30\x11\xc3\x6e\x49\xf3\xc7\x01\x2c\x73\x94\x7f\xcf\x0c\x7d\xb5\x16\x73\xb7\xf1\xc7\x64\xcc\xf5\xe4\x09\x0c\x76\x8d\x9f\x91\x54\x57\x69\xe7\x75\xb7\x5c\xa2\xa4\x50\x91\x9e\xc3\xef\xf1\x68\xb4\xf5\x90\x96\xea\xcc\x86\x81\x29\x56\x47\x86\xf5\x00\xb7\x33\xef\x55\xeb\x44\xd7\x4e\xd4\x92\x2c\x07\xe7\xeb\xde\xa7\x29\x37\xe0\x56\x71\x91\x4b\x49\x4a\xc2\x2a\xf0\x8c\x18\x17\x24\xcf\x2c\xf8\xc5\x2d\xac\xce\xb7\xf5\x8e\x1a\xa8\x70\x56\x11\x11\x2a\x20\x7e\xc6\x2f\x6f\x68\x7b\x6d\xda\x87\x70\x07\x61\xe7\xb5\x37\xe2\x57\x40\xa5\xaa\xd9\xc8\x8a\x71\x30\x52\xe1\x2a\x80\x7b\xbd\x58\xf6\xba\xde\xf0\x89\x0d\x63\xeb\x88\x76\x45\x1c\xd6\x6d\x1b\x93\xc6\x90\x6d\x57\x70\xab\xcb\x9f\xf7\x10\xcd\x67\x3e\xd9\xbe\x4f\x5d\xf6\xc2\xe8\x4e\x64\xa6\xf4\xdc\x1c\x72\x29\xa0\x06\xce\x2b\xfc\x35\x61\xf7\x10\xea\xd7\x22\x83\x90\x0f\x30\x9e\x2d\x56\x6f\xd7\x13\xe7\x37\x00\x36\x6b\x14\x50\xc0\x8c\xdf\x34\xbc\x7c\xbf\x5f\xc6\xad\x0e\x1e\x27\x0b\xf8\xb2\xb5\xc1\xa9\x96\x83\x2c\xf7\x3b\xc8\x91\x46\x9c\x3c\x2b\xc4\x4b\x32\xf0\x0e\x73\x5e\x63\xf3\x37\xff\x76\xfe\x9f\xf7\xc0\x5b\xa6\xb4\x03\x04\xd1\xe0\x48\x1a\xf9\x14\x8f\xc2\x0a\x6b\xb3\x6c\xc7\xf7\x6a\x74\x6c\x9f\x03\x50\xf4\x63\x1f\x0d\x48\xbc\x5f\xcf\x1d\xe2\xf0\xe9\xf0\x3c\xc0\x37\x5b\x7a\xb2\x76\xbd\x9b\xd3\xcb\x09\xe6\x1b\xd7\x5d\x31\x5d\x7f\x7d\x13\xf6\x21\x00\xaf\x00\x41\xce\x12\xbe\xd6\xc5\xb1\xa5\xb6\x63\x82\xfc\x18\xda\x0f\x9d\x11\x49\xf6\xed\x70\xa3\xb9\x06\x26\xff\xe5\x05\xf1\x6c\xd8\xad\x9f\x9a\xc2\x82\xf3\xc3\x6f\x67\xf4\xe7\xb7\x8a\xf0\x3e\xec\x63\xe0\xad\x5d\x2f\x1b\x38\xbd\x1a\xb9\xa2\x03\x48\xce\xef\xbb\x70\x3c\x25\x94\x07\xb5\x64\xc2\xc5\x15\x1f\x84\x3f\x9d\x53\xd4\xe0\x1c\xea\x79\x84\xdb\xc4\x03\xc7\x69\xa7\xcf\xeb\x8a\x2b\x99\x79\xb2\xe6\x80\xfe\xa4\xdd\x54\xc7\x0c\x19\x9a\x4f\x12\x62\x85\x59\x81\x74\x8f\xb7\xd3\x4b\xe1\x8d\x58\xeb\x02\x19\x16\x42\x8e\x8a\x3a\xa9\xfc\x0b\xc8\xaf\x99\x6b\xae\x20\xaa\xc6\x72\x15\x39\xb3\x5e\xcb\xa6\xa4\x39\xde\xfd\x00\xb2\x3e\xf2\x8d\x66\xd0\x8a\x57\xf6\x85\xfa\xf6\x35\xe2\x45\xdf\x33\x01\x30\x45\xc0\xd8\xe3\x4d\xa5\xcc\xbf\x7a\xb7\x9e\xbc\x2a\x10\x85\x8e\xba\x2c\x2f\x60\xaa\x2c\x27\xd8\x1e\x81\x2f\xb7\x67\xc6\x44\xaa\x7a\x2a\x1e\xee\x7b\x27\x95\xad\xe4\xcb\xb3\x9b\xf9\xf1\x1c\xca\xae\xd3\x42\x15\xe7\x26\x10\x81\xfb\xbe\x5d\x9e\xd5\xfb\x31\xf8\xca\x91\xe9\x4a\x87\x19\xca\x41\x64\x4b\x6a\x6c\x0e\x5c\xc5\x1a\x19\x33\xd9\xbd\xe7\xd7\x26\x53\x7a\x51\x5e\x93\x9c\x00\xc8\x4f\xf2\xe8\x51\x37\x00\x17\xf9\xf2\x8e\xa8\x90\x05\xe6\x2b\x40\x0a\x87\xbf\x46\xd2\x71\xa3\x1c\xf0\x8f\xea\xce\x86\x33\xa5\xb2\xd2\x71\xe6\x8a\xd3\x0b\xe6\xcf\x9b\x52\xd8\xcf\x41\xaf\xa6\xdf\x99\x86\xd8\xa4\x3e\x35\x44\xe3\xb4\x38\xda\x28\xf6\x6e\xab\xd1\x09\x8c\x9f\x16\x43\x9e\x01\xe7\x5c\x02\x82\x4f\xea\x1b\x6a\x6a\x6e\x4d\x75\x3f\x37\x8e\x01\xbb\x35\x3b\x53\x9e\x47\x57\x43\x60\x74\x19\xbf\xb3\x2e\x55\x54\xd3\xb5\x70\x1d\x30\xec\xe3\x3c\x2a\x2b\x53\xbe\x8b\x18\x4a\x88\x59\xe0\x09\x5e\x46\xdf\xfe\xc6\xb4\xc0\xcb\xdc\xb0\xe5\x2c\x99\x1e\x41\x8e\x0b\xf4\x51\xca\x56\x03\x5e\x33\xe0\x54\x39\x10\x04\xd1\xe2\xc0\x88\x2e\x40\xef\x1f\xb0\xe7\x41\xa0\x5a\x5f\x86\x02\x18\x0f\xcf\x1c\x99\xfc\x73\x84\x67\x15\x9e\xab\xba\xf2\xf8\xfb\x7a\x85\x27\x9b\x24\xd9\x27\x35\x2a\xf5\xdb\x7e\xcd\x16\x98\x01\xaa\x54\x0b\xb1\x99\x58\xa4\xd3\x77\xc0\x4f\xab\x5b\xa8\x77\xad\x05\xf0\xa3\x1e\x74\xb1\xe3\x0b\xeb\xef\x44\xf2\x64\x05\x40\xb1\x36\xfc\xdb\xfa\xca\xab\x2f\x4e\xbf\x75\x7b\xc6\xed\xac\x73\x3e\xc7\xa8\xa9\xd1\x73\x85\x52\xb1\x1c\x41\x02\x13\xdb\x1f\x5c\xf1\x1c\xd2\x01\xe6\x84\x48\xdd\xb0\x69\xe6\x75\x86\xb1\xff\x7a\xbf\xc5\x64\x9b\x1b\x8a\x50\x65\xd7\xaf\xef\xf7\x7d\xc5\xe8\xbb\x04\xb8\x2d\xa0\x78\x0c\x9b\xe0\xd4\x9a\x76\xf3\x99\xfd\x3e\xe9\x4f\x02\x39\xf9\x7b\x50\x2c\x9d\x4e\xb7\xb3\xb8\xd1\x16\xba\x46\x6f\x44\xa9\xfd\x70\xd4\x69\x80\x01\x6f\x69\x41\x34\x8b\x56\xfb\x0f\x56\xbf\x79\x53\xc6\x73\x19\xff\xed\xd9\x8b\x74\xab\xe8\x10\xda\xb2\x3e\x71\xd4\x0f\x87\x97\x27\xc5\xda\x9e\x18\xc0\xaf\xec\x11\x00\xb5\xf6\xdd\xe9\xaa\x94\xdb\xf3\x87\x7c\x4c\x7c\x74\x7f\x69\x16\x9f\x6d\x3c\xdf\xb9\x50\xb1\x04\x83\x55\x92\x62\x25\xa6\x67\x28\x99\xe4\x43\xaf\x13\xa4\x54\xf6\x9b\x24\xbd\x7b\xc2\x02\x24\x13\x50\x95\x85\x7c\x47\x6e\x23\x86\x42\xd6\x6a\xa7\xd9\x6a\xb4\x53\x94\xe5\x0c\x32\x38\x88\x2f\x17\x32\x6e\x61\xcf\x70\x27\xd9\x42\x9d\x9a\x28\x4b\x98\xfc\xe8\x62\x58\x9f\xa1\x2d\x3d\x82\xda\x0f\xe4\x9a\x5d\xf9\x82\xd3\xbf\x84\x48\x7f\xba\x52\x6e\x6e\xc2\xa6\x6c\xce\xb8\xdf\xb3\xd4\x19\xc9\x92\x1a\xa3\x6c\x24\x95\x56\xdc\x1d\xce\xc8\x04\xcd\x4b\x28\x92\xd2\xa0\x40\xdc\xe2\x3b\x7f\x80\x97\xad\x5b\xc4\x1a\xfa\xa8\xbb\xa3\xd5\x7e\x15\xe7\x84\xfb\xec\x99\xca\xf4\x1a\x17\xdb\xa3\xe5\x1d\xe6\x27\xcb\x8b\x9e\xe0\xa0\x7c\x65\x6f\x20\x5c\xaa\xb9\x59\xcb\x32\xeb\xbf\x31\xee\xc9\xb0\x8e\x0f\xa7\x31\xbe\x4b\x09\xf2\xd1\x9e\x85\xc6\x1d\xe7\xb1\x25\xaa\x32\xd7\xe3\x63\xd8\xf7\x36\x51\x56\x3b\xdf\x68\x1b\x16\xbb\x67\x90\x64\x0d\xc7\xca\xe3\x8e\xb2\x73\xc0\x48\x22\xd8\x3c\x05\xbf\x1f\x28\xfb\xdb\xee\xe3\xe5\xc2\x39\x03\x90\xfe\xbf\x07\x79\x3e\xd1\xaa\xcd\x7e\x9a\x48\x2d\x16\x86\x35\xed\xaf\x4e\xd0\x38\xaa\xd0\x16\xc7\x70\x59\xed\x95\x4d\x41\x54\x88\xfd\x30\x63\x59\x4a\x1d\xd1\x4f\xa1\x89\x60\x83\xe6\xf7\x71\xc8\x2a\x5d\xdb\x70\xd9\x34\x6a\xe1\x8c\xf1\xc3\x69\x32\x22\xf0\xf6\x86\xe6\x88\xf2\x09\x08\x5b\xc4\x7a\xdf\x63\x1f\x51\x82\x14\x68\xb6\x4e\x4a\xea\x76\xbe\x15\x9e\x6f\xa4\xb4\xd5\x77\x66\xd5\x3e\xd4\x62\x04\xbc\x69\xb0\xb2\x77\x58\x35\xca\xd9\x7e\x3e\x00\x05\x7f\xa8\xdf\x8b\x59\x71\x2e\x02\x18\xf3\x39\xc4\xe0\xf1\xd3\x91\x42\x51\xb6\x00\xd0\x54\xe4\x50\x84\xaa\xcb\x0e\x2a\x46\xe5\xe6\x58\xf8\x15\x09\x65\x0a\x5f\x4c\xdc\x25\xaf\x7b\x3d\x65\xe8\x7b\x29\x35\x97\xbf\x9d\xe4\xf1\xb3\xb1\x42\xe6\xb4\xd7\x6b\xaa\x69\x36\x3b\x60\x4e\x35\x8e\xe0\xd1\xe2\xb6\x2f\xc4\xf2\x3c\x7d\xec\xe6\xc6\x07\xb1\x26\x69\x4d\x38\xa7\x27\x79\x83\x02\xb7\xc2\xe7\xaf\xd6\x22\xde\x3b\xa1\x62\xdd\xa2\x84\x35\x51\xc9\x6a\xcf\x82\x03\xff\xfc\xed\xcc\x1d\x5c\x5a\x31\x7d\x5b\x2d\xc0\x3c\xc2\xe3\x96\x49\xf9\xb1\xa4\x34\x92\xeb\x93\xc5\xef\x1f\x41\x56\x3b\xf9\xaf\xae\x07\x00\xe6\xf9\xfb\xd2\x38\x87\x18\xf5\x43\x6f\xa6\x15\x80\x5a\xf0\x4a\x8e\x10\x3c\x65\x8c\x3c\xb6\xef\xed\x93\x8a\x3b\x6b\xd9\xe3\x9f\x5e\x42\x0d\xfe\x5c\x65\x10\x54\xe8\x77\x29\xb6\x6e\x70\x5e\x12\x16\x80\xa9\x7b\x74\x1d\x1d\x92\x69\x8e\xad\x2a\x8c\x94\xfc\xe8\x07\xab\x1a\x2c\xf2\x34\xf0\xb2\xbe\x7e\xb8\x21\xbd\x53\x34\x0c\xba\xfb\xa6\x0e\x07\xd6\x2d\xcf\xf1\x89\x59\xef\x3a\xd4\x03\x46\xd2\x2e\x43\x86\xda\x1c\x98\x55\xcc\xb4\x66\x2d\xac\x0d\x52\x39\x03\xf5\xa0\x80\xed\x73\xe3\x5b\x0d\x23\x17\x70\xb7\xd9\xf7\x7b\x45\xd4\xa1\xc2\xef\x4f\x92\x01\x6a\xa7\xaf\xf8\x07\xeb\xd2\x8e\xdc\x93\xfc\xa7\x8a\x55\xc1\x93\xd1\xed\x20\xe1\xbd\x40\xe8\x14\x8f\x88\x93\xbc\x9b\xd7\x91\x89\x20\x28\x77\x80\xd4\x7c\x15\x83\x3c\xef\xdf\x62\xcf\x3a\xf5\xa6\x25\x22\x50\x2a\x02\xbc\x27\x7b\xdd\x6d\x37\x42\x1d\x22\x9a\x59\xdd\x29\xa2\x1e\x18\xe0\x08\x97\xd8\x52\x30\x44\x3d\xad\xab\x74\xf7\xcc\xb9\xad\xcd\x2d\x03\x87\x7b\xa2\x71\x0d\xf5\x7c\xeb\xd9\x10\xf3\x2d\x05\xaf\xc4\x0d\x19\x4d\x36\x7e\xbd\xf6\x70\x93\xe6\x0e\x73\x76\x24\x92\x11\xfd\x1b\x98\xaf\x70\x96\xa4\xa7\xc6\x9a\xfb\x31\x0e\x3c\xd4\xa6\x27\xff\x56\xbd\x88\x43\x18\x7f\x5e\xbe\x32\x03\xb9\x71\xa5\xcc\x7d\x1c\x57\x65\x4f\x95\x4c\x92\x04\xb3\xc0\xbb\xca\xbe\xa6\xaa\x7a\x61\xec\xa0\x3f\x32\xc2\xd0\x9f\x0f\xce\x58\xcd\x09\x55\x6d\x82\xa0\xad\xc7\x39\xf4\x4c\x46\x30\xfa\x51\x43\xcd\x5b\x3c\x64\x1f\xa6\xde\x29\xf5\xf4\x06\x5f\x69\x89\xd2\x05\xd4\x61\x5a\x46\x1d\xaa\xff\x5e\x0b\xc7\x8d\x1b\x31\xbc\xba\x99\x8e\x80\x07\xe4\xc1\xfb\x93\xd9\x4c\x8b\x54\xdf\xc7\xce\x26\x9b\x37\x29\x01\xb5\x43\xd9\x96\x4c\x2a\x7f\x83\x82\x0a\x08\xd1\x8b\x41\x78\xb3\xe0\xfb\xe2\x30\xf0\xc8\x63\x08\x3f\xae\x58\x55\x8f\x37\x4b\x84\xf3\xf8\x61\x3d\x25\x51\x3e\x9f\xf5\xfb\x98\xb3\x6d\xaa\xce\xe3\xe0\x96\x33\xf6\x9f\xe6\x70\xde\x62\x40\x95\xb1\x01\xaa\x30\xbb\x41\xa4\x1a\x27\xb9\x1e\x1b\x5f\x99\xec\xf3\x5e\x00\x06\xe0\x69\x85\xad\xbe\x30\x00\x70\x29\x1a\x71\x67\xd7\x44\x6a\xed\xa6\xc5\x96\x72\x1b\x98\xf3\x52\xbd\x1b\xc8\xd1\xc2\x0b\x6e\x09\xff\x4a\x4e\xbe\x1f\x7d\xcd\xcb\x6e\x22\xb9\x58\xee\x04\x58\x6e\x5d\x99\x2a\x91\xc8\xec\xfc\x5d\x6d\xfe\x8c\xe0\xf6\x73\x7c\x60\x24\x17\xb0\x1d\x97\x00\x7f\xa9\x63\x5e\x27\x52\x16\x0b\xc8\x6a\x04\xc7\xb4\x18\x7d\xda\x5f\x8f\xcf\x8e\x81\xdd\x46\x16\x90\x2e\x34\xc1\xc1\x29\x99\x47\xd0\x50\x0f\x5f\x5e\xf8\x4d\xb3\x53\x55\x8e\x40\xec\xb0\xba\xec\xf9\x7c\xed\x29\x57\x42\xad\x97\x23\x11\x95\xf3\x5f\xec\x92\xa2\xae\xb1\xba\x55\x44\xa8\x7c\x7b\x7e\xe0\xac\x16\x9e\x57\xb9\x04\x02\x19\xf8\x1f\x12\xd6\x99\x4d\xe9\xd2\x2e\x13\x18\x06\x27\xcb\xe1\x2a\x97\xb2\x24\x10\x5c\x7d\xf0\x7b\x00\x3c\x03\x2f\xd8\xeb\x55\xaf\xb7\xf8\x94\xed\x73\x71\x45\x19\x24\xa2\x9d\xfe\xd2\x41\x7f\xea\x7a\x69\x1c\xa1\x20\xca\xbc\xeb\xa9\xb0\x35\x78\x83\xd7\xa7\x2b\x81\x32\x3f\xf4\x89\x63\x3f\x80\x86\x43\xec\xe4\x4a\xfd\x8b\xd1\x48\xa9\xf7\xb7\xee\xe7\x3f\xe3\xcc\xa8\xb3\x47\x5f\x9e\x37\x4a\xae\x0f\xf3\x5a\x7f\xd5\x8d\x54\x2d\x60\xac\x3d\xf5\xba\x23\xa3\x6a\x74\x54\x11\x0b\xde\xec\xd2\x00\x87\x79\xc8\x3b\x5c\x81\xaf\x3d\x9f\xa9\x00\x00\xed\x48\x4a\x1a\xaa\x89\xed\x1d\xc0\xf3\x46\x64\x04\xf9\x09\x80\xf2\x85\xd0\x8f\xf6\xb3\xff\x08\x7a\x61\x54\x5c\xe4\x2f\x15\x95\xef\xc2\xd2\xef\x74\x9e\x5a\xb7\x9f\xe6\x87\x77\xbe\x93\xa7\x50\x16\xa8\xfb\x15\x9f\x48\xe6\xec\x48\xea\xf5\xf7\xf0\x29\xec\x54\x51\x7b\x8a\xfc\xd6\xaa\x46\xf4\xea\x85\xeb\x7f\x4c\x3e\xd3\x45\xb4\x82\xa4\xb0\xe0\xd6\x4a\x2d\xa9\x05\xf0\x4e\xb8\x21\xf4\x6f\xdd\xbe\xcc\x87\xb6\xeb\x0e\x51\x81\x1d\x23\x84\x53\x38\x8f\xf6\x21\x31\x8f\x7a\x4a\x3a\xfd\xe3\xbc\x6b\x63\x47\xdb\x21\xd2\x59\x84\x17\x28\x4c\x0a\x42\xd6\x0d\x75\xed\x8b\x68\xf6\xc5\xda\xdc\xf6\xd6\x13\x6e\x77\xf1\x42\x7a\x7e\xb0\xbf\xbc\x2d\xa8\xb8\xef\x1c\x76\xa1\xa7\x1c\x82\xf4\x20\xf5\x98\x81\x04\x60\x90\x01\xf0\x35\x71\x87\x9f\xa3\x28\xab\xca\x93\x18\x96\xaf\xf4\x4a\x00\xd4\x7b\x8d\x67\xe3\x1c\xb8\xe6\xa5\x54\xef\xaf\x2d\x41\x09\x31\x60\xd8\x21\x70\x22\x68\x63\xbe\x36\xce\x4c\x31\x99\x80\x95\xd0\x47\x92\x97\xea\x83\xca\xc5\xd6\x23\x40\x0e\xf8\x45\x05\x31\x53\xf6\x7c\xdb\x0e\x8d\xc1\x50\x94\x60\x7a\xb6\x0e\x4f\x3a\x4d\x90\xad\xa5\xab\xd7\x96\x32\x29\x7f\x54\xe7\xac\xe4\x52\x34\x86\x1c\x4f\xdc\x6e\x80\x2b\xa4\xf5\x7d\x2b\x8f\xe7\x4f\x7d\xdd\xa6\x4f\x61\x34\x24\xbc\x25\xa9\x13\xf0\xfe\x32\x73\x0a\xfc\x1d\xe0\x78\x53\xff\x39\x6f\x5c\xa8\xf3\x34\x70\xe1\xad\x2c\x8f\xe6\x90\xf3\x1a\xe3\x35\xb3\x23\xcf\xbc\xdf\x8a\x50\x8b\x3e\x4c\x2e\xd3\x2c\x6b\xf5\xc7\xaa\x97\xbb\xe2\x42\xf6\x3d\xf2\x2f\x79\x1f\x67\x22\x29\x09\x40\x78\x18\x5e\xe7\x70\x81\xd7\x05\x5f\x95\xf6\xbd\x7b\x19\xbe\x01\x35\x40\xd1\x0c\x6a\x1a\x0b\x82\x07\x02\x6e\x5b\x38\x2d\xf9\x76\x00\x0b\xd2\xec\x40\xc0\x97\x34\xc1\x97\x98\xfe\xea\xdc\x96\x3d\x55\xef\x8a\x17\x02\xce\x7b\xa3\xeb\x35\x87\xe4\x9d\xd7\xf4\x97\x11\x74\x80\x79\xf3\xb5\x13\x1c\xfd\xf5\x92\xe1\x15\x10\x66\x49\xaf\x89\x7d\x13\x33\x0d\x8e\xf0\x47\x85\xb5\xe3\xef\x79\x68\x5e\xee\xe9\x76\x8b\xb7\x86\x2f\x00\x84\x65\x58\xa9\x9d\x1e\xc9\xdd\x1d\xf4\xd7\x53\x48\xb7\x49\x91\xe5\x2e\x50\x9e\x3d\x15\x47\x46\xa7\x9b\x54\x14\xad\x00\xa5\x37\x98\x38\x61\x3f\x0b\xce\x46\x80\xc8\xc8\xf9\x9f\x10\x5f\x80\xbf\xd1\xb1\x3d\xd2\x49\x35\xc9\x02\xf6\xba\x1d\x66\x00\x08\x2c\x9c\x43\x4a\x07\x72\xdd\x96\xb0\xd6\x71\x34\x20\x68\x4d\xd7\x35\x4f\x99\xd0\x91\x46\x92\x9b\xe2\xa4\x39\xc8\xd3\x39\x82\x6a\xae\xbe\x8e\xe2\xaf\xa3\x66\xdb\x57\x79\xed\x6b\x8b\x7c\xe5\x42\x8e\x16\x1e\x25\x8c\x23\x61\xa3\x41\x9d\xf8\x95\x2c\xd4\x95\x2c\xd5\x9e\xea\xb8\xec\x55\xb6\xe1\xfc\x08\xf4\x72\x8f\xe1\x0c\x02\x93\x9f\xd8\x87\x84\xdd\x03\x07\x95\xe0\x42\xc5\xeb\x61\x19\x10\xab\x84\x44\xea\xa7\x8b\x49\x25\xff\x05\x53\x2e\x7d\x97\xe6\xaf\xce\x90\x36\x51\x51\xc9\x08\x42\x3c\x0a\x7d\x15\x84\xfd\xac\x2d\xa1\xb4\x47\xa4\x3c\x0a\x4d\x14\x81\x81\x39\x1e\x56\xa4\xd5\xb6\x68\xd2\x4d\xc4\x60\x5d\x10\xea\xf0\x9d\x13\xff\x8b\x87\x78\x00\x71\x7f\xbb\x71\xe6\x71\x5b\x2a\x5d\x85\xd4\x6c\x90\x5c\x57\x22\x5c\x9b\x6e\x20\x46\x6c\xdf\x61\xa9\x2f\xa4\xa9\xb7\x07\x2a\xc5\xdd\xfb\x2d\x99\xf1\xdb\xc1\x10\x53\x85\xba\xfa\xfa\xa3\xfd\x7e\x98\xd5\x7c\xe9\x32\xac\xc5\x2d\xb1\x63\x86\xec\xf4\xe0\x79\xbe\xe2\xe5\x5e\x76\x9f\xee\x48\xc8\x39\xf9\x10\xa7\x8f\x3f\x5c\x01\x2c\x3e\x24\x58\xb1\x75\x01\x66\xf0\xee\x0f\xc9\x08\x1d\x6e\xe0\xfb\x98\xf2\x34\x0b\x1a\xaa\xf2\xd8\x71\x7c\x1e\xf6\xf7\xc4\xf9\xfd\x76\x7f\xfe\xb3\xdd\x7e\x77\x6c\x09\xb1\xfb\x17\xa9\xfd\xde\xf7\xdf\x77\xd0\x3f\xc9\xfa\xad\x48\x4d\x5c\xad\x2a\x54\x85\xbd\x04\x78\xf6\xf6\xb7\xb3\x42\x1b\x02\xfe\xfe\xb3\x86\xcb\xe5\x99\xe9\x0b\x08\x91\xa7\xb5\x6d\x7c\x55\x93\x2f\xff\x24\x3e\x95\x04\x66\x7e\x02\xe6\x64\x06\xc0\x8e\x00\xec\xc0\x65\xe3\x20\x09\xe3\x09\xe7\x68\xc7\xaa\xe1\x35\xb7\x91\x17\x43\xbc\x86\x2b\xe6\x50\x6e\x3b\xa9\x4f\x6e\x8f\xfe\xeb\xa0\x00\x4c\x54\x25\xd8\x28\x72\x72\x6d\x00\x85\x49\x6f\x77\x5d\x7c\x47\xe2\xfc\x70\x3b\x49\x26\x3f\x44\xb6\x03\x98\x2a\x03\x7c\xa1\x5d\x09\x99\xbc\xb4\xed\x61\xc2\xfc\x0b\x5e\xa0\x52\xc9\xc3\x0b\x03\x79\xa8\x30\x79\xd7\xef\x11\xee\xd6\x29\x5f\xd8\x5b\xa5\x92\xc9\x6a\xd5\x18\x91\x13\x39\x0f\x67\x36\x7e\x7a\x19\x6e\x34\x16\x3e\xef\xae\x6c\xc8\x4f\xdd\x1f\x4f\xe1\x1d\xc6\x76\x07\x30\x2f\x78\xfe\x0d\xce\x44\xc2\xfd\x61\x82\x10\x74\x6c\x54\x8d\x6d\x7d\x1b\x77\x9a\xe6\x82\xae\xa7\x50\xbb\xf2\x26\x40\xa5\xbd\xcd\xc1\x38\xd6\x06\xbc\x9f\x07\x76\x71\x3c\xfc\x6e\x42\xde\x6c\xae\x8c\xe4\x90\x6f\xb8\x28\xc4\xc2\xc4\x30\x16\x70\x2e\x3a\x19\xbc\xf9\xcd\xfe\x00\xcb\xe1\x7b\x0f\xf8\xdb\x1e\xd7\xcd\xeb\xee\xab\x67\xe1\x5b\xf3\xdb\xad\xa5\x87\x96\x33\xac\x0d\x72\x83\x90\x5e\xf6\x3b\x09\x53\x77\x18\x9a\x89\xd6\x78\xec\x59\x2d\xd8\x22\x08\x15\x27\x3d\xe7\xd6\xda\x59\x91\xff\xe3\xf7\x8a\xd0\x79\x0f\xd7\xc6\x7f\x4a\x5d\xf3\xe7\xeb\x09\xef\xbf\x6d\xde\x7d\x56\xbe\x86\x3a\x0c\x02\x07\x46\x39\x4d\x04\x08\x70\x28\xcc\xfe\x28\x96\x78\xf0\x64\x0f\xf8\xe3\x9c\x7b\x84\x94\x1e\xe4\xa6\xc1\xfb\x99\xf0\xe9\xfc\xfe\xf4\x4a\xdc\x3b\x48\xb8\x66\x7e\x70\x85\xec\xdd\x30\xc7\x8f\x4d\x0c\x6a\xd7\xf8\xf4\xf7\xfd\x10\xab\x1e\x6a\x23\x7c\xfc\x02\x4b\x5f\x93\x33\x1e\x33\x55\x95\xf3\x61\x38\x63\x4b\xde\x9f\x86\x23\xaf\x67\x2f\x6f\x1f\xc5\x28\x76\xc7\x32\xe2\x59\xf2\x41\x80\x7d\x1a\x07\xc3\xed\xb4\xa3\x84\xfa\x1d\xe2\x1d\x58\xb7\x16\x9a\xf6\x3d\xe1\xb9\x03\x78\x38\x66\x19\xe9\x0c\x9b\xd8\x38\x9b\x09\x14\x4c\xda\x91\xef\xf3\x1b\x87\x82\x94\x7d\x7c\x2d\x78\x2f\xaf\xf0\xae\xc1\x96\x7b\xe0\x45\x7e\x56\x9a\xfc\x8b\x15\x8d\x66\x37\xad\x4b\x50\xce\x64\x82\xf5\xa3\xed\x0a\x93\x62\x5c\x31\x67\x5d\xbe\xf7\x85\x48\x59\xfd\x83\x54\x11\xf9\x66\xdc\x0a\x7e\x1e\x15\xce\xe6\x17\xd1\x4f\xf5\xc8\x27\x1e\xa1\x3c\x6f\xdc\xd7\x07\x08\xff\x90\x7b\x04\x4a\xcc\x9a\x97\x7c\x80\x64\xe6\x56\x77\xdd\xf0\x3b\xe0\x14\x8f\x96\x4f\x1e\xae\x0c\x7d\xa6\x79\x0f\x15\x57\x58\xaf\x7e\xad\x3e\xda\x82\x68\x4e\xc0\xad\xe9\x8f\xcc\x42\x9e\x28\xe3\x53\x0b\xa9\x4c\xa3\x48\x73\xc8\x76\x46\xa4\xc4\xfa\x92\xdc\xe7\xba\xfc\x9b\x0f\xc0\x98\x7e\xfd\x14\x3f\x65\x0c\x84\x5e\xfa\xa1\x5f\x8c\x51\x94\xb8\xe3\x77\xf6\x81\x3c\x41\xee\x74\xdc\xcc\xf2\x74\x10\x30\x7d\x5d\x66\xf8\x68\xc2\xd8\xde\x90\x3c\xf3\x21\xb8\xa2\xf8\x8d\xbf\x18\x0b\x90\x5b\x45\xb7\x02\x5c\x4b\x28\xc5\xee\x13\xcb\x4b\x58\x3b\xc0\xa0\xfe\xa8\xe1\x63\x47\x0a\x7b\xb4\x3e\x8f\x8f\x59\x6b\xaf\xc0\xb0\xf0\xe5\x9d\xf8\xd3\xd7\xf9\x13\x0f\x38\xd0\xb6\x13\xe0\xf2\x0a\xb1\xfa\x7e\x48\xdb\x87\xbb\x72\xe2\x06\xb6\x65\x7d\x1b\xe9\x90\x66\xf0\xc6\xaa\x46\x82\x9b\x69\x02\x2b\xd4\xf5\xb7\xbe\x02\xd7\x6e\xde\xb6\x1a\x4c\xd5\x83\x12\x6f\xe9\x6c\x29\x5c\x83\x21\xa9\x28\xbd\x1e\x4f\xf1\x01\x22\xa8\x3e\x9b\x7a\xbe\x7e\x95\xa7\x78\xe9\x32\xff\xb9\xb7\x07\xd5\xa0\x41\x75\x57\x24\x8c\xfe\xab\xe1\x7d\x84\x0a\x50\x61\xfd\x2e\x73\xae\xe0\x86\xf7\x7f\xfd\xd3\x91\x4c\x8e\xf2\xdf\x07\x98\xc8\x35\xb8\xa1\x4a\xa0\xc3\x7e\xcb\x69\xd6\x9d\x4b\x63\xf9\x51\xfc\x4c\xb9\x7f\x24\x5c\x66\x87\x36\xb1\x8e\xf9\xf2\xae\xe2\xa0\x62\x66\x9c\xe9\x64\x0e\xfd\x3e\x27\xc1\xd9\x00\xd0\x17\x42\xaf\x20\x68\xd6\x7b\xaf\x2f\x10\x33\x1d\xb9\xd6\x3b\x3a\xfc\x28\x27\xdf\x6d\x72\xcf\x75\xb1\xe2\xf2\xe2\xaa\x77\xc1\x28\x65\x4e\xb0\xf3\x58\xfa\xb8\x16\x10\x82\x4a\xb9\x9e\xdd\xab\xca\xda\x0a\xcb\x44\xd4\xb8\x81\xc4\x94\x11\xf7\xdd\x34\x51\x63\xe7\xcc\x21\x60\x37\xfd\xe4\x34\x95\x05\xa7\x38\x4b\x91\x59\x4a\x9f\x1f\xc5\xd8\xb5\x97\xbc\x6f\xb2\xad\xaa\x8b\xad\x88\xb5\x7c\x93\x5d\xac\x7d\xe3\x51\x7c\x66\xa6\x4c\xba\x82\x7c\xef\x24\x00\x37\x7f\xc5\x8d\xc9\x89\x96\x2a\xb4\x9f\xb4\x19\x90\x1f\xc1\x89\x45\xa3\xbd\xbf\x0e\x04\x35\x99\x9f\x7d\x69\xf8\xde\xbb\xc3\x5f\xc0\xc4\xb1\x37\x78\x9f\x85\xda\x63\x77\x4a\xb8\x0e\x0e\xcb\xe7\x14\x6e\x8c\xe2\xcf\xfe\xd9\xf7\xb1\x18\xac\x22\x0f\x72\x24\xef\xd4\xdd\xd5\x29\x92\x00\xde\xd3\xe2\x04\x5f\x66\x8f\xd3\x59\xe8\xef\xa8\x3f\xe4\xb0\x0f\x95\xef\x7d\x26\xdb\xba\xb3\xae\x01\xd3\xd4\x4e\xb5\xba\x66\x12\x41\x9b\x1d\x7f\x5d\xef\x59\x16\x33\x4b\x9d\x79\xa8\xbc\x7f\x84\xae\xd4\xd3\x0c\x83\x94\xbf\xba\x16\x79\xad\x5a\xaa\x0f\xd4\x98\x43\xa6\x3d\x5e\x90\xd4\x9c\x7f\xf7\x89\xe5\xb9\xa9\x7b\xca\xe7\x9b\x02\x64\xdd\xc3\x73\x69\x4e\xdf\x9f\xe4\xf3\xe1\x67\x36\xac\x26\xe1\xe2\x58\x32\xc7\x65\xe6\xc8\x57\x7c\x7f\x1d\xb7\x86\x21\x2b\xce\xb9\xd1\xed\x0d\xb8\x26\x5e\x69\x8f\xe8\x8b\x9d\x77\x97\x4d\xdd\x46\x85\x75\xfa\x35\x22\xed\xec\xb2\x06\xce\xdb\x91\xec\xe2\x07\x1b\x76\xa4\x42\xac\xec\x9a\x2a\xb9\x12\x19\xe4\x94\x33\x13\xf6\xaa\xc7\x9e\xce\x79\xbe\xc5\xaa\x90\xc0\x0f\x6f\x13\x8f\x45\x2e\xc0\x98\x89\xc5\x07\xe4\xf8\xaa\x27\x5f\xac\x17\x19\x15\x15\x59\x65\x3e\xb0\x6b\xc2\x4a\xc4\x0a\x4e\x14\x26\x34\x57\x28\xa2\x0c\x81\xe6\x79\x65\xb5\x37\xe1\xa9\x33\xba\xe6\x0a\x7b\x75\x5e\x80\x08\xeb\xc2\xf2\x82\x1a\xf4\x2f\x6c\x16\x83\x3e\x61\x33\x87\x14\x85\x9a\xd1\xab\x17\xf6\x3e\x70\xf7\xc4\x19\xef\xd7\xd0\x64\x93\x55\x14\x08\xfa\x2b\x3f\x96\x16\x4e\xb2\x6f\x2b\x35\x14\x31\xd4\x5a\x78\x1f\x23\x7c\x7b\x49\x3a\xe3\xa3\xe1\xc7\xf8\xa1\x53\x28\x80\x4b\xb0\xd9\xde\xad\x53\x70\x08\x42\x72\xce\x25\xb5\x21\x56\x1b\x62\xf7\xcc\x36\x25\xeb\xaf\x5e\x05\xef\x17\xb9\x49\x10\xda\x32\xc2\x6a\xfb\x66\x0c\x00\x7b\x17\xdb\xe8\xe9\xdd\x77\xe3\x49\xf4\x6e\x8f\x17\x69\x7d\x90\xb1\xb5\xb1\x77\x76\x7f\x87\xe0\xf9\x05\xb8\x6b\x06\x38\x31\xc9\xae\x0e\xca\x7f\xea\xf0\xdb\x9f\x47\xb1\xa9\x0c\x40\xc8\x18\xac\xb7\xb1\xd9\xe3\xfe\x7e\xfe\x1e\x73\xaf\xd8\xf2\x8c\xe7\xf0\x3e\x6a\x99\x7b\x7e\xfa\xfb\x99\xe5\x78\x0b\xd6\xef\xc7\xd8\xc0\x4e\x0e\xf4\x64\x5b\x69\x07\x29\xb6\x7e\xbf\x54\x96\x88\x6a\xc0\x39\xe2\x1f\xde\x54\xf3\x23\x51\x8e\x46\xdf\xdb\xa6\x3c\xc8\x17\x27\x3e\x95\x0f\xe0\xfa\x2e\x5b\x38\x26\xdf\xd6\x18\x7f\xc7\xe5\x7e\x82\x3d\xc3\x6a\x30\xe3\xde\xbd\xbc\x57\xe9\xcb\xfa\xbd\xb0\xef\x69\x86\x7f\x73\xd5\xbd\x4a\xc7\x07\xfe\x38\xde\x66\xd6\x9c\xb9\x46\x3f\xbb\x29\x08\x4a\x82\x5a\xca\x07\x80\x7e\x77\x81\x20\x28\xee\x1d\x3c\xa5\xea\x66\x76\x45\x33\x98\x6d\x43\xfe\x40\xc8\x0c\xe1\x5e\x27\x35\x10\x76\xcd\x04\xf9\xb7\x11\x77\x47\x45\x41\xf2\x66\x16\xdb\x75\xe8\x35\xc3\x4b\x1b\x41\xf7\x29\xb4\x8e\x98\xe5\xc0\x39\x01\xcc\x0b\x82\x18\x6d\x36\x5e\x1c\xae\x2f\x69\xdd\x51\xcd\xe2\x51\xd2\x79\xff\xc6\x3b\x39\x09\x7e\x6c\x0d\xf9\x49\xf9\x47\xfe\x0e\xf2\x0a\xdb\x7e\x8f\xfe\x73\xfb\x45\xae\xf4\xaa\x43\xa1\xf2\xd4\xe9\xee\x79\x18\xc4\xcb\x56\x1d\xb3\x1d\x59\xb1\x6f\xa7\xea\xf9\xd0\x2f\x02\x15\xce\x19\xd8\xde\x6e\x4f\x22\xe0\x0b\x97\xe6\xd9\xe9\x57\x2f\xb7\xf7\x62\x5e\x66\x10\xaa\xd2\x64\x8a\x7b\x71\x3f\xed\x3d\xbc\xa0\xc4\xc1\xb6\x11\x8f\x14\x97\x29\xcf\xb0\x0e\x60\x1e\xd9\x1a\x19\x3d\x08\xfe\x2f\xe5\xed\xc7\x65\x46\x58\x97\xda\x1e\x74\x2d\x51\x81\x04\x92\x7c\xb9\x18\xe1\x04\x6b\x59\x8a\xd7\xf9\xf4\x49\x7e\x64\xbe\x06\x20\x65\xb1\xc1\x7b\xee\x19\x17\x4b\x43\x92\xad\x1a\xfd\x08\x5e\xcf\x91\xc2\x68\xe3\xde\x9d\xb9\xb9\xa9\x0e\xc3\x7d\xd9\x7e\xec\xdc\x26\x2c\x1f\xdf\x27\xea\x0c\x17\x3f\xee\x2c\x8b\xda\x57\x97\x06\xba\x79\xfa\x71\xb8\x01\x83\x77\x79\xe1\x09\x68\x7f\x1e\xbd\xb0\xe5\xa3\xd8\xb0\x86\x77\x97\x25\x26\x13\x28\x6e\xd9\x63\x75\x42\xd4\x30\xcc\xc5\x3f\x09\x0e\xc1\x6a\xae\xfe\x76\x38\x24\x59\xc9\xcb\xe0\x40\x8d\xb7\x82\x83\xed\xcd\x65\x43\xd2\x63\x81\x0b\x85\x27\xe3\xd2\xd7\xba\x77\x00\x37\xc0\xf1\x24\xf0\x9b\x73\x85\x09\x0e\xa8\x7b\xf6\xe4\x77\xbf\x79\x3c\x6f\x27\xb3\x1a\x15\x1f\x7f\x44\x90\xf8\xbe\xf6\x61\x7a\xcd\x20\x0f\x51\x78\xe6\x4e\x03\x9e\x95\xd3\xee\xe7\xa0\x0f\x31\x57\xb4\xb1\x8c\xbd\x2f\xda\xe1\xbd\x33\xba\x48\x11\x29\x1d\x0a\x29\x47\x7e\x07\x7f\x2d\x59\x9c\xec\x40\xec\xf0\x2d\x57\xa2\xe0\xc1\x2a\x18\xf2\x26\x6e\xa9\xd3\x2c\x3d\x5c\x61\xb1\x5b\xe5\x06\x35\xa8\x13\xfd\xd6\xdd\x00\x8e\x1a\x1d\x83\x49\x49\x51\x84\xb9\x1f\x5e\x89\x9e\xef\x37\x05\xef\x22\xc4\x34\xb8\xfb\xf0\xa2\xfc\xe5\xca\x3d\x70\xe3\x2e\xb5\xc6\xab\xfe\x5b\x17\xf2\x80\x02\xdb\xb0\x5f\x64\x62\x64\xcd\x9d\x4b\x33\x1e\x78\x58\x14\x82\xf8\x6b\x8a\x1e\x85\xd3\xe9\xf8\x09\xe2\x48\x8a\x9d\x0a\x83\x8f\xd1\x97\xe8\x31\xc9\xdd\x61\x47\x0c\x9b\x49\x55\x8e\xef\x25\xd3\x7a\x24\x3b\x45\x4f\x1a\x64\xf8\xb7\x82\xb3\xe8\x78\x38\x6a\x6b\xcb\x82\xd8\xcc\x3e\xc8\xef\xda\x57\x5c\xbf\x8d\x7a\xf0\x3c\x8e\x33\x0c\x9c\x66\x91\xce\xc8\x5f\x6c\x6a\x4a\x84\x06\xc0\xf0\xda\xd3\x50\x64\xdb\xca\xc5\x6c\x4e\x3d\x26\xf7\x10\x31\xf7\xa3\x7e\xf3\x8d\xc8\x37\x0f\x7f\xda\xbb\xf0\x9e\xed\x9e\x7c\x36\xa2\xec\xf1\xf7\x56\xd9\x6c\xbb\x28\x96\x95\x7e\x63\xfa\x6d\x9f\x26\x80\x99\x6d\xdf\xfc\x7c\x34\xf1\x51\x89\xb5\x27\xf8\xae\x23\xa9\x6a\x55\xae\x42\xc6\x60\x14\x91\x7b\xcf\x6f\xf1\x9d\x19\xf4\xcb\x3a\xd4\x35\x3a\xf6\xb3\xcd\xd1\x67\x6c\xe5\xc4\x13\x7b\xa6\x37\x00\x8f\xe6\x49\xae\x04\xfe\xb3\x64\x48\x5e\x3e\xc2\x11\x01\xe9\x25\xf6\x01\x61\xfa\xec\x9d\x7c\x4b\x73\x49\x12\x35\x29\x23\x34\xdc\x6a\xab\x2a\x52\x8e\x25\x39\xf5\xb6\xe1\xc6\x68\x0d\x8c\x52\xb8\xed\xe2\x70\x26\x69\x50\x61\xb7\xae\x93\x57\x3d\xa5\x9c\xe8\xd3\xbe\xae\x91\x17\x76\x3b\x87\x43\xf1\x6e\xbf\xdd\xeb\xf8\x86\x56\xc6\x0b\xd9\x25\x2b\x72\x69\x34\x50\x53\x5d\x6d\xf5\x2b\x5c\x84\x96\x16\x44\x51\xc3\x44\xb8\xf3\xc1\x44\xa9\x5a\xfd\x7d\xd6\x7c\x8c\x31\xcb\xfa\x75\x34\xaa\x07\xfc\x82\x94\x3b\xad\xb8\xeb\x03\x5f\xbe\x64\xbf\x6e\x6a\xfb\x3b\x9f\xd6\x07\x6e\xa3\xb6\xd5\xd4\x60\xda\xc7\xf0\xf9\x54\x64\x69\xba\xc6\x8f\x77\x05\x0d\xb0\x53\xfa\xca\x72\x7a\xf6\x1f\xa1\x2f\xfa\xdf\x27\x4d\x3d\x80\xa9\x28\x92\x38\x4a\x24\x2a\xb3\x80\x43\xea\xf7\xa5\x49\x90\xc2\xcc\xa4\xa5\x98\xdd\x3d\xfb\x4d\xfd\xba\x50\x76\xd4\xbf\x9f\xef\x86\x78\xfb\x6a\x0d\x1b\xec\x62\xf9\xb7\x00\x4a\x8e\x56\xd5\xc2\x6b\xc5\xc9\x46\x32\x88\x5e\xf6\xe9\x5f\x09\x40\x94\xd3\xaa\x2d\xe6\xfb\x76\xff\x69\xa2\xd9\x0d\xc9\x50\x4f\xf8\x83\xe2\x8a\x9b\xf7\xc4\xa7\xd3\x6a\x0b\x5c\x67\xaa\x1c\xb3\xfd\x33\xbb\x05\x4b\xca\xad\x6d\xdc\x21\x3b\x7b\xf9\xb6\xda\xe2\xfc\x63\x0d\xf7\xf0\x7e\x14\xa5\x4d\x2c\xaf\xec\xc5\xdf\x1c\x82\x43\x97\xea\x85\x14\x8e\xdc\xe8\x4d\xac\x80\x23\x60\xc9\xad\xd2\xc1\x9f\xd1\x05\xd1\xb8\x84\x5b\x19\xbc\x1d\x00\xac\x53\xab\x1b\xa5\xfd\xe6\xef\x09\x30\x18\x91\xe4\x6e\xd5\xf6\xe5\xf7\x46\xdf\x96\xfd\x87\xf5\x8a\xd7\xc4\x5f\xed\x03\x0c\xd7\x92\x52\x3c\xee\x97\x21\x2c\x1c\x55\xbc\xcd\x8f\x50\xf9\x4e\xe4\x08\xf7\x4e\x49\xc8\x8e\xb8\x46\xee\xc0\x52\x6c\x46\x08\xe7\x21\x14\x82\x6b\xb5\x8c\x4d\x46\xa2\x46\xd0\x87\x23\xb8\x5e\xb5\xb9\xa8\x8b\x6d\xc0\x47\x20\xe3\xae\xaa\x57\x63\x9e\x59\x2f\x2a\xe9\x9c\x82\xf4\x6b\xb7\x43\x1b\x6f\x66\xfb\x4e\x60\x9f\x23\xc1\xfc\xc0\x79\x6e\x55\x6d\x52\x0e\x40\x57\xda\x85\x59\x72\xeb\x81\x3c\xbb\x13\xfe\x8f\xb9\x03\xe7\xfc\xd9\x4a\xaa\xf7\xfe\x18\x6a\x85\xea\x3d\xef\xf9\xf0\x29\xa0\x16\x1d\x76\xd6\x1b\x78\x61\xbc\x66\x47\xe4\xf2\x44\x38\x81\x4d\xd0\x72\x24\x50\x62\xc4\xe4\x0e\xe4\xfd\x4f\xe8\xa4\xbf\x8f\xf7\x40\xd0\xb6\xe6\xa9\x55\xbc\xd1\x1c\xe0\x1c\xda\xfd\x5e\x87\x2f\xb5\xed\x59\xe5\x81\xdb\x00\xad\xe5\x92\xd9\x5a\x97\x1f\xe5\x71\x2b\x50\xaa\x2d\xa0\x1f\x61\x29\x99\xdb\x93\x76\xe8\xcb\x19\x2f\x56\x1d\x5b\x5c\x7d\x54\x1e\xad\x7d\x97\x77\x9b\xa1\xe3\x0a\x75\x29\x1e\xb5\x3f\xdd\x4a\x47\x1d\x02\xa2\x70\xb9\xa1\x50\x1f\x69\x95\x04\x29\xf1\x05\xcf\xce\x7e\x61\x19\xd8\xff\xe8\x10\xbf\x60\x37\xb5\x1b\x5e\xb8\x29\x45\x04\xc9\x2d\xd5\x9b\x6d\xb5\xc3\xf4\xe5\x8f\x77\xfb\x2d\x39\x30\x76\x99\xda\x4d\x10\xf2\x6e\x99\x0a\xf8\x29\xdf\xc0\x46\x52\xed\xb4\xb4\x54\xe2\x38\x33\x74\x0d\x65\x1d\x7a\xd9\x4a\x05\x4c\xbf\xf7\x71\x11\xc9\x07\xb7\xf7\x0f\x19\xf6\x64\x25\x80\xa6\x7b\x46\xe9\xb0\x6b\x26\x9a\x9c\xea\xdf\xec\x79\x34\xce\xac\xd3\x6d\xb9\x23\x27\x77\x2d\x2f\x04\xdd\xcc\x4a\x3c\x84\xa4\x96\x08\x10\x76\x61\x8b\xdf\xea\x46\x75\xed\x2d\x80\x27\xb2\x51\x13\xfa\x93\x97\x88\x29\x78\x8f\x22\xdc\x83\x20\x8b\xe7\xfe\x22\xf2\x8e\xfa\xb8\x36\x9b\xb0\xde\x17\x0a\x6f\xcf\x6b\x78\x58\x27\xff\x53\x88\xe8\x3b\x8c\xc1\x5c\xb9\xc6\x65\x6e\x86\x4d\x04\x95\x76\x9f\x92\x3e\x8a\x01\x56\x57\xa7\x32\x62\x2a\x11\x6e\x5a\xe2\x7e\xc3\x95\x35\x2f\x78\xcf\x68\xbe\x86\x2c\x59\x1e\xa9\x85\xdd\x01\x1b\xd3\x96\x50\xbe\x0b\xfb\xab\x34\x13\xc3\x15\x78\x91\xef\xc9\xf5\x2e\x69\xeb\x53\x76\x22\xfc\x11\x67\x58\xb8\x7c\x13\x5c\xef\xeb\xa4\xec\x49\x64\x20\xb5\x2b\x77\xaa\x7d\xa9\x9e\x2f\x90\xed\x7e\x84\xc1\x0b\xdf\x90\x19\x7e\x03\x53\xb8\xe3\x29\x86\x65\x56\x38\x81\xf4\xe3\x6d\xde\x50\xe7\x50\xcd\x88\xb0\x77\x00\x69\xd5\x05\x2d\x47\x54\x13\x4d\x6a\x75\xd2\xdb\x7d\xf9\x3e\x3e\x9f\x66\x10\x41\x7e\x21\x72\xf9\x19\x7e\x8a\xa8\x26\x59\xb5\xea\x52\x92\x13\xee\xe4\xe3\xad\x7a\x62\x53\xb0\x70\xbf\xc0\x71\xc5\x2c\x82\x94\x68\x56\x18\xef\x5b\xd2\x9e\x66\xcb\x70\x27\xd2\x06\xcd\x5e\xd7\xe8\xfc\x28\x02\x60\xa7\x64\x3f\xdc\x1e\x97\xb4\xa9\x3a\xc9\x80\xc3\xc1\xbf\xfe\xcc\x77\x09\xcf\x8b\xae\x5c\x67\xa9\x4f\xfb\x19\x9c\xd3\xa4\x7d\x42\xae\x22\xb6\x41\xce\x7d\x7a\xe0\xe5\x73\x5a\x52\x84\xdf\xdf\x5a\x1d\x3e\xce\x38\xa0\x8d\xb2\x7e\x17\xe0\xe8\x14\xfd\x66\x11\x0c\xdc\x35\x82\xb0\x05\xfb\x7a\xa8\xad\xd7\xd8\x38\xaf\xb3\x6e\x31\x92\xab\x06\x02\x3e\xac\x03\xff\xba\xb3\x22\x6d\x51\xae\x01\x36\x88\x55\xf3\xf9\x9c\x93\x47\x9d\x18\xaf\x28\xf6\xfa\x9b\xb6\x76\xeb\x2e\x6a\xad\x39\x52\xde\x94\x2a\x86\x47\xe4\xa2\xf7\x26\x8d\xd7\xf7\x09\x17\xc3\x51\x5d\x2a\x5b\xb9\xc0\xb3\xfd\x40\x27\xe7\xfa\xfd\xd1\x67\xe2\x59\x89\x52\x85\x70\x56\x10\x4f\xf3\xe1\x61\x1b\x82\x8e\xe1\x4c\x7e\x69\xf5\x10\x7e\xe0\x5e\x23\x19\xa9\x83\x9d\x33\x0a\xa2\x20\xd2\x45\x16\x11\xef\x5c\x13\x8b\x2b\x9f\x2a\xc3\xcb\xbc\xbb\x87\x28\x36\x78\x5d\xdc\x88\x79\xaf\x0c\xf5\x57\x3e\xcf\x5f\x7b\xc7\x37\x40\xce\x84\xb7\x26\x7e\x45\xf4\xde\xa0\x1c\xe0\x1e\x37\xca\x96\x7e\x9f\x22\x10\x40\x8e\x04\x46\xb5\x69\x4f\xe0\xa3\x80\x00\xc0\x3b\xb4\xaa\xda\x76\xa1\x08\xdb\x89\xfb\x26\xca\x17\xa7\xad\x41\x4a\xf5\xce\x6f\x5e\xc1\x75\x4c\x38\xec\x5b\x98\xfc\x3d\xd5\xaf\x85\x44\xca\x15\xf0\x07\x47\x0e\xd6\xb1\x9c\xf1\xcf\x8f\x69\x29\x26\x07\xdf\xff\x30\x75\x84\xbd\x2b\xb0\x2d\x91\xcd\xd1\x7c\x85\x77\x02\x13\xcd\xae\x10\xb3\x55\x78\x15\xe1\x2f\x7c\x57\xb8\xc9\xe4\x82\x53\x29\x74\x10\xa5\xe3\xe2\x89\x46\x51\x2f\x8e\x76\x3b\x25\xf4\xca\xb4\x1f\x97\xe5\x1f\x15\x9c\x0d\x1d\x25\x10\x66\x1a\xcc\xc2\xb7\x74\x25\x66\x5b\xe8\x89\xf4\xc5\x96\xd1\xa5\x3f\xb7\x3f\xad\x1e\x87\x20\x58\xdf\x90\x78\x80\x95\xec\x6e\xc4\x93\x1c\xf9\x86\x27\xa0\x0d\x7c\x1f\x3a\x3c\xef\x41\x50\xe0\x3d\xba\x39\x6c\xa5\x1b\xfa\x49\xec\x05\x1c\xca\xfe\x73\x80\x2b\xce\xe9\x3d\x46\x02\xad\x8b\x76\x64\xc4\x01\x7a\xcf\xa2\x3b\xdc\x4d\xe1\xfe\xd6\xa0\x89\x9e\x5f\xec\xd6\xb7\x3d\x7a\x7a\xd1\x4c\x6b\x46\x26\x95\xac\x5f\x21\xe3\xef\x57\xb1\xbf\x9f\x0c\xf0\x34\x86\xf4\x1e\xcf\xdb\xe0\x8d\x44\x80\xc6\x50\xd9\x16\x05\x73\xb7\x38\x2b\xe2\x44\xbf\xf6\x3d\x3c\x90\x5c\xce\x3e\x8f\x73\x0b\x6e\x9c\x25\x55\x93\x09\x1e\x78\x41\x53\xb3\x75\x97\x3b\xaf\x18\x08\xff\x10\xfd\x24\x9e\x26\x80\x85\x0e\x13\xb8\x94\x5b\xde\xd2\xde\xb8\x63\x58\x1e\xbd\xb5\xbb\x50\x65\x77\xf3\x9a\xaa\xf1\x07\x58\x81\x53\x64\x64\xc4\x03\xbe\x96\x2e\x5e\xa6\x95\x9f\xe8\x7b\xa0\xce\x48\xed\xb2\x04\xec\x18\xa3\xed\x6b\x49\x01\xc6\xf1\x0d\x43\x84\x2d\xca\x5d\xe3\xd9\x9d\xbf\x6d\x80\xc4\x3a\xcf\x0d\x25\x81\xff\xf4\xad\xaf\xb2\x3e\xcf\xf3\x14\x40\x04\x4f\x2f\xe2\xaf\x08\x4d\x2c\x10\xde\x62\xd8\x83\xbe\xe7\x3a\xe9\xf0\xaf\xd7\x91\x15\x95\x1f\x9b\x48\x59\x2e\x20\x88\xbc\xe9\x47\xf5\x69\x8d\x9f\x6b\x6c\x91\xaf\x33\xda\x83\xb5\xbb\x9b\x29\x95\x50\x97\x11\xdd\xf9\xed\x40\xdb\xdd\x7e\xb4\x5c\xa9\x4c\x6f\xfc\xd9\x7b\xd1\xf1\xae\x50\x76\x0d\x58\xc0\x15\xa2\xa7\xff\x2a\x80\x9d\x44\x00\xfb\x02\x2c\x37\x06\x6f\x78\xd7\xbe\x71\xc8\x88\xc4\x62\xbc\xbe\x18\x6b\xa8\xa2\x8b\x9a\x5f\x21\xa0\x4d\xab\x59\x2d\x0f\x71\xa9\x90\xdd\x98\x71\x9a\x06\xb8\x85\xef\x6a\x54\x15\xca\xa1\xc8\xf0\x42\x92\x04\xfe\x87\xa0\xc5\x91\x05\x20\xb3\x67\x95\xe4\xcd\xb7\x29\x20\xf9\x8f\x04\xef\x71\xfa\x93\x4a\x82\x32\x1b\x04\xe3\xe6\x36\xb7\x64\x7a\x3e\xa8\x01\xd1\xaa\x02\xc9\xdf\x66\x33\x7e\xba\xd3\x11\xcf\x0c\xb3\xcf\xee\xb6\x2b\x20\x2a\xa5\x75\x62\xe1\x43\x90\xfd\x80\x03\x4a\x1b\xf4\x17\xfc\x7d\x26\xa7\xc9\xe9\xb4\xfb\x8b\x9c\x65\x30\x87\x65\xfa\x9c\xeb\x6e\x74\x09\x52\xaa\xe8\x9d\x32\x00\x0f\x88\x39\xa4\xd8\x52\x45\x06\x54\x4e\x55\x51\x15\x8e\xb0\xc3\x7d\xa5\xfa\x84\xb8\xc7\x36\x80\x53\x09\x35\x7e\x70\x70\xc5\x2b\x6f\xb5\x47\xde\x8a\x20\xbd\x4c\x58\xaf\xbd\x67\xeb\xab\x23\x6e\x31\x4f\x3e\x60\xe9\x6a\x08\xe2\x81\x4e\x59\xb4\x50\x29\x2e\xcd\x0a\x74\xdd\xa2\x3b\x82\x2e\x20\xb7\x64\x27\x7d\xdb\x24\xd7\x34\x1e\x52\x99\xb5\xe6\x23\xb4\x25\xe1\xbb\x7a\x51\xbc\xbf\xe5\x25\x58\x0c\x1d\x07\x99\x82\xca\x8c\x39\x5f\x86\x17\xda\x90\x04\x5a\x2e\x9e\x6d\x05\xde\x0c\x3e\x47\xad\x67\x76\x48\xde\x34\xdc\xf8\x9c\x5b\x6c\xf9\x34\x9c\x1c\x90\xa9\x29\x7c\xde\x8f\xbc\x04\x5e\x51\x17\xcc\xbd\x2d\xcd\xa2\x3a\x2a\x85\xff\x0a\x1f\xbd\x56\x84\x19\x90\xbe\xbb\x28\xf6\xfd\xa9\x90\x99\x8e\xf1\xde\x22\x72\xb2\x07\xcc\x68\x03\xf0\x57\xef\xa9\x05\xce\x26\x76\xd3\xcb\x60\x37\xe7\xbc\xf1\xd5\xac\x09\x0f\x80\xa9\xa8\x52\xd3\x70\xec\xf1\xd7\x8f\x0e\x58\xc4\x54\xed\xfb\x3d\xef\x4c\x89\x29\x70\x66\x20\xaa\xb7\x2c\x80\x38\x19\xc8\xb5\xdd\x77\x69\xc8\xfb\x77\xcf\xea\x3e\xa8\x43\x43\xa7\xd7\x51\xae\xa6\x87\xf9\x13\x59\xc3\x95\xd0\xcb\x57\x09\xdc\xe3\x49\xb3\xbe\xa4\x5d\xf3\x4d\x09\xf4\xf5\x96\x77\x71\x1f\xc4\xf5\x84\x25\x3f\x7f\xce\xce\x42\x14\x72\x1a\xc9\xe3\xcd\xfb\xde\x10\xd8\xe6\x9d\xaf\x20\x87\x44\xeb\x05\xf2\xb1\x94\xfe\x70\xba\xde\x62\xf9\x99\x39\x46\xb7\xef\x99\x23\xf3\xd9\x8b\x44\x1d\x8a\x68\xe9\x56\x94\x50\xb1\xea\x2c\xe0\x2e\xce\x0d\xc9\x04\xbe\xea\x01\x06\x93\xaa\x2c\x39\x7e\xdf\x79\x27\xf3\xd0\x36\x79\x57\x29\x4a\x67\xc4\x44\x59\x6c\x2f\xfa\x17\x7e\xab\xcf\x73\xa6\x19\xe1\xfa\x14\x0c\x29\x16\xb6\xce\xdc\x0c\x80\x97\x84\x33\x23\xcc\xc8\x78\x9e\x1a\x16\xa3\xfe\xb3\xff\xa5\x2b\x6e\xc4\x6c\x85\xc4\x43\xae\x4d\xa5\x7d\x92\x8b\x3b\x3d\xc4\xaa\x3a\xff\x3b\x07\x9b\x44\x15\xd6\x1b\x7b\x63\x42\xbc\xbf\xb9\xf6\x35\xda\xef\x7d\x38\x7d\x65\x97\x2d\x83\x79\xda\xa7\x9c\xca\x8f\x19\xc4\x8a\x83\x64\x00\x32\x9d\xef\xe8\x76\x3b\x9f\xf6\x79\x5d\x42\x47\xcd\x2e\xd5\x9e\x77\x49\xd4\x41\x1c\x7e\x86\xcf\xbc\x19\xc2\x9b\x2b\xc7\x16\xae\x88\x96\x95\x36\xdf\x27\xce\x51\xb0\x86\x87\xd7\xdb\x2c\x9d\x76\x6b\x9d\x44\x7c\xa2\xcd\xae\x7e\x24\x22\xbf\xa5\x96\x52\xf3\x8b\x29\x02\xd3\xd3\x40\xae\x64\x40\xb8\x82\x4b\xb6\x5f\x02\xb5\xd7\x5b\x11\xa0\x0a\x76\xe4\x80\xd8\xf0\x37\xee\x24\x29\x25\x54\xaa\xef\x8c\x5e\x0f\x5d\xaf\x12\x90\x4f\xad\x97\xde\xc3\x55\xa2\x6d\x36\xae\xf7\xb2\xbf\xa7\xf2\xb5\x0c\xfd\xeb\x7b\x73\xe9\x3e\xd9\xb6\x57\xfa\x66\x1b\xed\xe3\x79\xcb\x77\xb8\x83\x33\x15\xaa\x43\xa8\x2b\x15\xf1\xaf\x38\x96\xd2\xc9\x54\x69\x64\xfc\xfa\x50\x58\xd2\x5b\xf0\xce\x01\x6e\x6b\xa0\x0d\x01\x5e\x35\x2c\xbf\xcb\xe4\x76\xdf\x30\x43\xa3\xdf\x42\x80\x03\xe4\xdf\x1a\x6d\xd1\x29\xa2\x2f\xc2\x15\x48\x0e\xc5\xc7\x76\x12\x5a\x61\x36\xea\xa4\x39\x04\x61\x85\xcb\x3f\x23\x95\x7a\xc9\xbc\xfd\x00\x4c\xbb\x1c\x0a\x8b\xe7\x66\x89\xda\x95\x91\xfa\xf7\x37\xec\x65\x38\xb8\x7d\x5b\x9e\x86\x2e\xfb\x51\xeb\x9a\x1c\xac\xdd\xb4\x68\x70\x02\x90\x3a\xd4\x99\x74\xc1\x2b\x7a\xae\x64\xc6\xfb\xcd\x12\x9b\xa9\x59\xbb\x56\x3e\xad\x95\xf1\x96\xb3\xfc\x28\x95\x30\x31\x1b\x80\x8d\xb7\x83\x7a\xbf\x14\x7a\xb4\x8f\xa5\xea\x7f\x15\x5c\x20\x08\x7f\xcf\x72\x3d\x5f\x70\x4f\x02\xac\x53\xde\x9a\x96\xc2\x41\xa8\x40\xd0\x92\x6b\xf2\xf7\xa4\x27\x39\x08\x65\x53\xa9\x88\x4d\xbf\x7f\x4a\x67\x90\xef\xec\x7e\xdb\xf9\x7c\x96\x2c\xc4\x68\x60\xfb\x03\xb4\x9d\x3e\x8c\x74\xe0\xd3\x11\x6b\x47\xf6\xb1\xcb\xc4\x00\x9b\xb4\x21\x2e\x02\x34\x3b\xe5\x7a\xb6\x9c\xce\x6e\x33\x18\x54\xab\x45\xf5\x8e\x1a\x27\x2b\xa0\xe5\x06\xf2\xf4\x0e\x5b\xc7\xf1\x76\xa2\x13\x79\x39\xa9\x1b\x75\x13\xd1\xe6\x4f\x53\xd0\x19\xbf\x32\xad\x09\xe6\x20\x79\xba\xf2\x01\x74\x9c\xb1\x4f\x6a\xa1\xe3\x06\xf5\x5e\x1b\x31\xb5\x27\x20\x50\x4e\x64\xbe\x64\xca\x4c\x5d\xf4\x66\xaa\x41\x62\x32\x8f\x75\xf3\x45\xf7\xb1\x8e\x62\x0d\x18\xf4\x4b\x9b\x95\x4c\x6a\xeb\x3b\x57\xe9\x9c\x37\xa1\xca\xeb\xd8\x79\x93\x37\x02\x9b\xa8\x4d\x39\x72\xeb\x46\x91\xd6\xec\x69\x5e\xe6\x91\xaa\x7e\xf7\x33\x1a\xa2\xc2\x99\x13\x01\x64\xa6\x3f\x9d\x8d\x67\x95\xc6\x3b\x30\x9a\x2a\x88\x92\x50\x8d\xa6\x7b\x32\x3f\xbf\xae\x68\x3b\x90\x49\xcd\x64\x1f\x5c\xd7\x7f\x8d\xd7\x01\x48\x79\x20\xcd\xce\x84\x42\x79\x9a\xee\x8a\x61\x6b\x39\x6d\xe1\x71\xf2\x22\x3f\x4a\x8b\xb7\x7a\x17\x5d\xb5\xc5\x44\x3f\x1a\xcd\x49\x14\x79\x1e\xb7\x44\xe9\x26\xd2\xa4\x33\xd5\x1c\x1d\x7f\xef\x44\xc2\x7d\x43\x1d\x6e\x9f\xe1\xde\xbb\xdd\x00\xe6\x4e\xc6\x62\xed\xd2\x4f\x2f\xdb\xae\x2f\xb6\x6f\x00\xbb\x96\x32\x45\x4c\x5f\xc3\xc7\x73\x3b\x22\x94\x63\x67\x4b\x99\xff\x02\xa2\x9d\x0c\xc0\xdc\xc8\xcc\xd0\xfb\xb1\xc5\xb8\x79\xa4\xca\xcf\x87\x41\x38\xaf\x8c\x41\x4a\x81\x63\x78\x52\xc4\x27\x55\x0f\x62\xa0\x9c\x30\x1c\xe0\xcc\x42\x27\x25\x9e\x2f\x78\xa6\x65\xe1\x9c\x92\x6c\xea\x71\x75\x59\x3b\x17\xc4\x8f\x02\x14\x38\x76\x1f\x04\x43\x61\x34\x12\xed\x99\xe4\x19\xd5\xca\x14\x2b\x94\xfa\x7d\x7d\xc4\x88\x94\x90\xa0\x07\xaf\x38\x4f\x32\xdc\x05\xbe\x6f\x94\x5a\xaa\x9e\xd9\x89\x3c\xed\xa1\x3d\x62\x7f\x7a\x8d\xf3\x23\x30\x87\x56\x91\x52\x75\x9a\x10\xf9\xbe\x91\xab\xa5\xb6\x28\xac\x0c\x56\xc7\x0e\x58\xb5\x9e\x22\x2d\xba\x17\x0e\x80\x88\x11\xf0\xf7\xe1\xad\x48\xe0\x38\x1b\x8d\xea\x5c\x15\x36\x99\x10\xd1\x76\xd3\xee\x75\x45\x3d\x2c\x35\xb8\x23\x82\x4d\xa4\xac\xcd\xdf\x2c\xe9\x35\x84\xa8\x54\x9d\xb0\xb1\xf7\xfe\xaa\x31\xee\x29\xc0\x3d\xe2\x04\xb6\x9e\xdd\x21\xfb\xb2\xfb\xa3\x4d\xce\xd1\xe0\x2a\x2c\x59\x64\x2f\xe7\x62\xb8\xf0\x8b\x5d\x81\x0e\xa0\x9a\xe6\x1c\x2f\x87\x9d\x52\x24\x31\xf9\x4a\xec\xe1\x60\x71\xa1\x37\x61\x2d\xf5\x3a\x46\x59\x42\xdd\x85\xb5\xbc\x98\xd2\x60\xc4\x9f\xcb\xc6\x61\xce\x9a\x8c\x7b\x83\x87\xb7\xee\xb3\xc0\xfd\x30\x30\x87\x13\xe9\x71\xf0\x27\x1e\x60\xf2\xd6\x2c\xcd\xd3\x98\xe3\x92\xc9\xb5\x73\xfb\x32\x6a\xe8\xcc\x6f\x7e\xe1\x05\xa7\x5e\xca\x15\xff\xe0\xdf\x89\xb2\x6f\x5e\x25\x94\xc0\x46\xb9\x98\x4b\x97\x73\x99\x1f\x98\xa4\x3c\xdd\x49\x97\xf4\x89\x2e\x3b\xfd\xf5\xf4\xd2\xab\xdb\xac\x23\xb3\x7b\x94\x24\x01\xf5\x82\x73\x56\x72\x03\xdc\x46\xd2\xaf\xdb\x34\xaa\x32\x8f\x88\x73\xd8\x75\xdd\xb4\x09\x97\x45\xdf\x23\xd9\x92\xde\xd4\x71\xe3\x96\xb6\x01\x31\x9d\xf8\x02\x4f\x5f\x89\xc9\x7a\xfd\x30\xe7\x93\x9c\xcb\x28\x71\x23\x33\x2d\x91\x71\xf0\x0f\x3b\xf1\xe7\x4f\x30\xbe\xc7\x52\xa0\x27\xcc\x14\x66\x82\xc2\xf5\xac\xe0\x56\x22\x0f\x42\xcc\xd4\xc7\xc9\x86\xbd\x3c\x07\xbd\x6b\x7c\xa7\x43\xe1\xef\x09\x70\x67\xb6\x92\x7e\x8f\xa0\xd7\x6b\xb9\xbc\x3b\x03\x06\xe8\xed\x72\x51\x2b\x9c\xeb\xe6\xb1\x23\x9b\xef\x3e\xe9\x81\x17\xb6\xbc\x2e\x2a\xc2\x4a\xc4\x05\x38\xcb\x73\xd1\x95\xc0\xd8\x3d\x25\x28\xd8\xeb\x12\x9e\x6d\x06\x10\x9d\x8a\x71\x37\x3b\xe3\x53\x5a\xd2\xb9\x4d\xba\xa8\x1b\x1a\xdd\xe0\x3d\xf8\xe7\xee\x10\x28\x9e\x3a\xa9\xf9\x82\xcd\x42\x49\x3d\x88\x53\x7b\x27\x7b\xa8\xf1\xcb\x24\x8b\x7c\x7f\x10\xa7\xfb\x68\x8a\x94\xd1\x1a\x5a\xa6\x55\x7e\x1c\x59\xb6\xac\x1f\x81\x9f\x5b\x0f\x1a\xc4\x57\x58\xa3\x10\x85\x77\xa2\xd4\xad\xce\xdd\x29\xa5\xde\xc9\x18\x24\x8c\x9f\xf1\x29\x25\x40\x15\x79\xf8\xc8\x11\xf6\x4b\x1a\xa6\xc4\x35\x88\x43\xe0\x5c\x6f\x77\xc7\x31\x9e\xbd\x1a\x2b\xfb\xa4\xa9\xc2\x7e\x6c\xf0\xca\xfc\xad\xed\x47\x74\x1a\x0f\x92\xcd\x75\xe2\xe7\xed\xb7\xc2\x7e\xab\xaa\x6d\xf1\x42\x35\xbb\x25\x30\x7f\xcb\xf2\x76\xaf\x84\x83\x79\x5f\x60\x08\xad\x7d\x85\x2f\xe0\x5b\x68\xf6\x56\x84\x4d\x73\x37\x0f\xf8\xf8\xe5\x4d\x37\x59\x78\xd4\xe1\xd2\x75\x2d\x94\xd8\x7c\x6e\x94\x37\x86\x6b\x34\xb6\xc7\x47\xbb\x8b\x74\x48\xac\xb1\x63\x50\x3e\x00\xc8\x72\x95\x28\x89\xcb\xe3\x72\xa0\x90\x88\x05\xdc\x35\xc5\xd4\xf6\xf9\x28\xd6\xa7\xea\xdd\x9e\xd6\x78\x7d\x7e\x3f\xc3\x0d\x2d\x1f\x7b\x42\xcd\xe0\xe9\x3a\x39\xf4\x3b\x03\x00\xfe\x51\xc3\xbb\x19\xdc\xb6\xf4\x84\x05\x55\xed\x20\x11\x1d\xfa\xc6\x49\xe5\x9d\x3e\x04\xe9\xef\xd4\x83\x46\x75\x4e\x16\xe7\x72\x34\x5b\x97\x83\x2d\x1c\x8b\x61\x6b\xf7\x47\x3a\x4a\xc7\x79\x22\xad\xd6\x34\x97\x6d\x95\xce\x74\x25\x3b\x2e\xcf\x0a\x10\xba\xd4\xfc\xf3\x09\x21\x38\xbf\x77\xa8\x65\xe3\x8f\xf5\x7c\x23\xcb\xed\x52\x37\x4c\xe6\x1a\x92\xb6\x4b\x14\x4f\x68\x19\xfc\xc7\x60\x3e\x00\x3b\x87\x2f\x83\xc3\x23\x9f\xe6\x7a\xe6\x76\x62\x76\x62\x29\x98\xe5\x87\x4b\xf3\xc2\x93\xa7\x71\xbf\x06\x60\x4f\xc9\x40\x7d\xb4\xbe\xa1\x9f\x51\xd9\x61\xd6\x95\xa5\x98\x72\x23\x33\x87\xa4\x95\x57\x05\x1e\x27\x93\xe1\xce\xcf\x88\xf8\xfe\xd3\xc9\x38\xcc\xc6\xe3\xc6\xc7\xfe\xe4\x8d\xea\x8e\xde\xbb\xb2\x4a\x10\x74\x24\x95\x20\x9e\xb5\x2f\x7a\x92\xb8\x55\xcd\x1d\xc1\x18\x17\xfb\x93\xe2\xf0\x27\x41\x4c\xc6\xb4\x1c\x1e\xc4\x24\x00\xf5\xd7\xaa\xf5\x68\x9d\x7d\x47\xba\x2d\x9f\xb3\x42\xfa\xbb\x4f\xba\x57\xc6\x4c\xad\x79\x96\x1c\x1c\x0a\x07\xcc\x7a\x92\xc5\x7d\xa7\x4d\xed\x3e\x2f\x45\x07\x67\xc5\x98\x9a\x2c\x6e\xcd\x86\xc2\xbc\xc6\x22\xa9\xf9\x7d\x22\x85\x2b\xf5\x5e\x78\xe7\xf7\xa2\x78\x74\xb4\x5d\x4f\x35\xaf\x2b\xed\xd1\x5b\x79\x3f\xbb\x5e\x97\x2a\x6d\xb1\xa0\xeb\xc7\x9c\xd8\x6c\x6c\xe1\xdf\x87\xf5\xe3\xcf\xfd\xcd\xbf\x01\xfc\x2f\x0a\x7a\xc1\x9f\xad\x10\x58\xc9\x5c\x69\x92\xe1\x30\xc3\x87\x0e\xf3\x1b\xcd\x51\x56\x39\x18\xef\xdf\x73\x21\x3e\x2f\xa6\x02\xf6\x09\xc8\x5b\x49\x8c\x0b\xc0\x29\xb7\x69\xfe\x9d\x5e\xca\xe4\x03\x57\x70\x8e\x02\x4c\x20\x97\x07\x6f\x7d\x07\x54\x8f\xf7\xbe\xac\xac\x3c\x7a\x46\x14\x0b\xf7\x74\x16\xe5\xf0\xa0\xf2\x47\x5a\x9b\x6d\x9d\xc1\x99\xdd\xed\xe0\xd0\xa7\x51\x6c\xb7\x9c\xeb\x8e\x08\xb5\x7f\x4c\x14\x13\x01\x7f\xc6\x8e\x5f\xc2\xdb\x1e\xbd\xd6\x1e\x5e\x57\x75\x09\xc9\xe3\xf9\xb3\x83\x77\xf9\x6d\x47\xd9\xc9\x1d\xbb\x69\x87\xfb\x28\xae\x85\x91\xcf\x6b\x47\x00\x2b\x81\xc3\x83\x01\x8f\x1a\x98\x3d\x06\x4a\x9b\xaf\x86\x41\x9c\xea\xed\x29\xa3\x52\x7c\x84\x20\xbe\xcb\xcf\x6f\x05\xb9\x25\xab\xa8\x22\xae\xca\xba\xe8\x76\x9a\x00\x78\x98\xaa\x01\x9c\x92\xb5\xc5\x74\x55\x19\x94\xe0\x3c\x08\x7a\xea\xd1\x68\xb8\x72\x73\xd4\xef\xd9\x0e\x35\x48\x8b\x68\x66\xa6\x90\x14\xaa\x07\x08\xca\xf5\xe3\x65\xf4\xb4\x18\x86\xba\xff\xed\x11\xe6\xb7\xad\x4e\x94\xf9\x06\x96\xab\x5e\x52\x38\x95\x76\x2f\xbc\x51\x02\x29\x15\xce\x45\x3f\x5d\x47\xf6\xf6\xd0\x51\x50\x5b\x35\xee\xef\x56\x4d\x99\x11\xf6\x77\xcd\xef\x35\xea\x34\xf6\x87\x76\x28\x82\xf9\x70\xc9\xca\x13\xf8\xa5\xbc\xf3\x2a\x22\x93\xac\xad\xe3\x6a\xb9\x6e\xa1\x76\x51\x77\xdf\x09\x3d\x78\xdc\x70\xc6\xa0\x78\xab\xbf\x97\xdb\xcd\x86\x7f\xe5\x1b\xde\x82\x74\x7f\xb1\x94\x1d\x0f\xe2\x0e\x12\x0c\xfe\xb6\xf1\xe9\x5d\xb3\x77\xb9\xc3\x55\xa4\xab\x2c\x3c\x18\x66\x71\x38\x5f\x34\xbc\xa4\x7c\x2b\xd1\x5e\x37\x45\xb7\xcb\xfc\xa2\x36\x73\xb8\x92\xd1\x83\xb9\x49\xb5\x8a\x22\x6d\x88\x64\x0e\x15\xa4\xca\xb5\xbc\x24\x14\x6d\xb5\xdd\xac\xf9\x07\xa2\xd8\xce\xe8\x13\x09\xee\x46\xfa\xc9\x4e\xdc\x32\xab\xab\xc8\x3d\xd6\x9c\xbe\x09\x91\xfa\xda\x4f\xa1\x12\x4c\x10\x0a\x85\x8a\x06\xc7\x81\x8b\xe9\x7a\xe7\x08\x0a\x4d\x7f\x50\xd3\xc3\xf7\xcd\xf1\x72\xf9\xe8\xbe\x87\x77\x21\xed\x1e\x73\xc7\x57\x2f\xe3\x89\xb7\xa9\xaf\xfa\x8d\x59\x78\x5b\xe3\xb0\x21\x36\xa2\xad\x5b\x7d\x60\x3d\x34\x87\x33\x14\xd6\x4a\x7c\xab\x9a\x71\x41\x2c\x09\xd2\x27\x61\xed\x19\xef\x96\xa4\x1c\x9c\xc9\x68\x96\xdd\xe3\x69\xc1\x5d\xe8\x7d\x31\x35\x3e\x38\x82\xd8\xc4\xb3\x1c\x65\x54\x3d\x74\xf8\x1c\xa3\xb9\x1c\x60\xab\xdb\xcb\x11\xef\x9a\xf2\x19\x3c\xb8\x14\x45\x93\x25\x81\xd3\x70\xa5\x51\x85\xfd\xed\x6e\x58\x85\xc7\xf6\x6b\xf8\x00\xa6\x30\xc4\x92\xe5\x47\xdf\x9e\x1d\xdc\x57\x5a\x33\xde\x97\x20\x98\x37\xab\x80\xb3\xce\x7c\x15\x80\xa6\x03\x1d\x1c\x9d\xd9\x0c\x27\x51\x94\xfa\xfd\xb4\xd0\x01\x3b\xdc\x50\x13\xdc\xdd\x02\x5c\x61\x9e\x71\x26\x8c\xc9\x4f\xd9\x1c\xd3\xad\x40\xd1\x3d\x8b\xe9\xa2\x27\x18\x6e\xaf\x0b\xd9\xbd\x0b\xef\xa7\xe7\xb4\xf4\x14\xb8\x42\xb5\xfe\x00\xc0\x6f\xf0\x6c\xdb\xa5\xf4\x70\xb0\xe4\x89\x8e\x8f\xbf\x3c\x9b\xca\x9b\x49\x95\x86\xea\xfb\x11\x83\x5d\x20\x76\x16\xa5\xf9\x5a\x87\x9f\x86\xf8\xc3\xfc\x05\x48\x67\x55\x23\x23\x2a\xe5\x2d\xba\x7d\x0a\x74\x32\xc3\x41\x6f\x72\x0d\x09\x15\x6e\xa4\x0e\xb9\xf5\x4e\xa3\xe2\x25\x44\x33\x56\xa7\xfd\xbb\xfb\x07\x58\x13\x6a\x91\xf6\xeb\xec\xe9\x82\xa1\x6f\x2d\xc6\xdc\xd9\x33\x6d\x01\xf8\xe5\x4a\x73\x70\x36\x9a\x68\xc0\xa7\x37\x30\x3c\xf1\x70\x35\x19\xe0\xba\xfe\x6e\xc6\x6a\x74\x2e\xbb\xd8\x0e\xd8\xb3\x6a\xaa\x41\x14\xc6\x60\x26\x8e\x8f\x4b\xd9\x9b\x59\xd9\xd3\x33\xd3\x05\x3d\xdf\x88\x24\x17\x5e\x4a\x6c\x8f\x38\x3d\xc4\x43\xfc\xe4\x39\xef\xd5\x4f\x80\xfb\x32\x19\x8f\x6e\x84\x8f\x9b\xa2\xfc\x86\xfd\x73\xcf\x1f\xf1\xf5\x66\x22\x9e\x30\xd8\x2f\x81\x48\x84\xe8\xc0\xbe\x2c\x4a\xfe\xb1\xce\xeb\x8b\xc1\xba\x24\xc1\x8c\xd2\x8d\x2e\x6c\x59\xc5\xdf\x44\xbf\xc5\x78\x99\x38\x9b\x2b\xf0\x2a\xf3\xa8\xc0\xef\xd2\xc9\x3d\xed\x29\x3b\xa8\x30\x29\x74\x59\x49\xef\x60\x60\x8b\x75\xff\xb6\xe8\xc0\xab\x27\xcc\x0a\x1e\xfe\xc5\xf2\x36\xc0\xc4\x4b\x84\xa2\xc8\xad\xa5\x1e\xb0\x45\x1f\x35\xc6\xab\xfc\x21\x47\x48\xcf\xb3\x7e\x0c\xe3\xfc\x49\x87\xdd\x61\x38\x93\x2e\x9d\x87\x38\x2d\xbd\x93\x1c\x97\x48\x98\xfd\x49\x95\xf5\x5c\x49\x00\x73\x15\x65\xc8\xdc\x6f\xcb\xfc\xb9\xbe\x27\x75\x17\xae\x89\xf8\xe1\x0c\xd1\x98\xdc\x78\x71\x4c\xbb\x7e\xd1\xcc\x63\xd1\xf2\xde\xd0\x85\x36\xa0\x5f\x0e\x31\x28\x2a\x50\x02\xbf\x0a\xd1\x36\xee\xc5\x81\x90\xe4\xf1\x3d\xf7\xf6\x25\xfa\x2f\xe0\x67\xc6\x00\xf7\xe5\x40\xcd\x2c\xcf\x90\x78\xf2\xa1\x55\xf7\xf7\xf3\xee\x87\x3d\x08\x25\x2e\x92\xc1\xde\x61\x0f\x70\xd5\xb1\x9d\xa9\xe5\x77\x01\xda\xcf\x90\x64\x66\x91\x28\x23\x2f\xb8\xfe\x56\x67\xb3\x84\xf7\x34\x7a\xce\x27\x06\x73\xdb\x6b\x14\x8e\x05\x62\x5c\x84\x36\x3a\x69\x88\x74\x64\x73\x33\x21\xd9\x93\xc7\xdf\xab\xd6\xf4\x55\x2f\x25\xaf\x6d\xc1\x4b\x47\x06\xb4\x55\xa7\xee\x1a\xf6\xe1\xd2\x1f\x0a\xe2\x10\x88\xad\xf7\xe0\xfe\xb9\x94\x9a\x6a\x37\xb1\xd1\xdf\xcb\xcf\x10\xcf\xae\x8c\x03\x88\x87\x00\x37\x47\x1c\xae\x74\x0c\x5f\xe6\xd4\x0f\x12\xef\x36\xd4\x0f\x88\x41\xfc\x93\x8e\x93\x96\xf8\xbb\x7d\xb2\x7a\x9d\xe9\xd6\x8b\x49\x80\x55\x55\x15\xc3\xf3\x68\xdb\x15\xdf\xe5\x18\x3b\x6a\x4d\x1b\xba\x33\xac\xed\x35\x7e\x28\x73\x60\x50\xae\x7e\x42\xdd\x29\x6f\x13\xb8\xbf\x3e\x69\xa6\xdc\x14\xa9\x67\x0f\x13\xe4\x04\xba\x29\xd7\xa0\xe7\xa8\xe9\x54\x24\x6f\xf3\xcd\x0b\x76\x8e\xbc\xea\x29\x91\x65\x11\xbf\xb2\xd5\xb8\x07\xf5\x4e\x4d\xd9\xe8\x0e\x32\xdf\xd2\xdc\xca\xa9\x8b\xc9\x13\x00\xfd\xeb\x29\x07\x10\x9c\xf4\x80\x42\xf4\x61\x69\x0b\x2c\x20\x9b\x4b\xaf\x97\x04\x1a\x6d\x04\xf5\x20\x7e\x51\xda\xb3\x45\xe9\x4e\x2a\x1e\xb4\xb5\x83\x76\x36\x97\x94\x88\x86\xae\xf1\xf3\xca\x36\x94\x2a\xc1\x67\xcc\xb5\xef\x1a\x4e\x50\x9e\xef\x57\xf5\xf2\x2e\xbd\xb9\xf6\xf1\x1c\xae\xdf\x8f\x9d\x5d\x88\x17\x5b\x1b\xd5\x80\xdd\xaf\xa9\x8d\x8f\xe2\x61\x89\x20\x9c\x7b\x44\x23\xbd\x6d\x69\x83\xbb\x9a\xb4\x2c\x86\x3d\x8a\x70\x5f\x02\xde\x7f\x13\xcc\xda\xbf\xa6\x2f\x7b\x02\xba\x85\x90\x33\xc6\xc6\x65\x25\x7c\xbd\xfb\x4a\xeb\x18\x04\xc0\xdd\xe6\x6c\x0b\x49\x79\x61\x08\x53\xce\xf8\x2d\x63\x64\x71\xe1\x11\x27\x6d\xb2\x5b\x89\xdc\x45\xb1\xa5\x86\x0c\xc0\x5b\x38\x94\x5c\xe9\xe6\xb8\x85\x39\xed\x4c\xab\xed\xb5\x1b\xf9\xc4\x60\x97\x06\x5c\x3b\x71\xdf\x15\xe2\xc2\x2f\x61\x88\x4b\xb9\xde\x99\x9f\xad\x5e\x4b\xf7\x81\xf9\x2b\x16\xcd\x0b\x50\xfb\x43\x91\x1e\x72\xaa\xa9\xcb\x20\x1b\xf6\x54\xf2\x52\x4c\x50\x08\xba\x9d\xc0\x4e\x92\xdf\xeb\xde\xfb\x61\xa3\x39\x41\x42\xef\x8b\x2a\x09\x9b\x33\x7c\x9f\x34\xed\x77\xc8\x7a\x8f\x70\x6f\x4b\x6f\x28\xfb\x2b\xa1\x4a\x0d\x88\xc9\x47\x5e\x8a\xdf\x5e\xe3\x3a\x11\x29\xbf\xf4\xe4\x82\x38\x35\x52\xb0\xb3\xc2\x51\x03\x72\x8f\xa9\xd2\xfe\x5d\x24\xe6\xea\xa7\xd6\xec\x4b\x69\xbc\xe8\xd9\x23\xc7\x07\x75\xa3\x63\xc7\xa5\xab\xd4\xc2\x69\x36\x2f\x7f\x78\xb2\xbe\xc1\x5b\x2f\x22\x10\x83\x2f\x0e\x55\x91\x37\xc4\x4f\xab\xbb\x63\x02\xf0\x1b\xbd\xa5\x71\xc4\xb3\x94\x2b\x76\xb1\xd9\x06\x3f\xcd\x23\xf1\xef\x26\x60\xbc\xf3\x3b\x96\x02\xae\xb2\x21\x98\x5f\x6d\x5f\x59\x6e\x4a\x53\x11\x74\xb1\x7c\xc0\xbb\x4c\x0b\x7c\x94\x13\xc1\x45\x34\x42\x9e\xb0\xbb\x3f\xfe\xbd\x3e\x53\x41\x16\x77\x96\x2e\x7b\xec\xf9\x52\xf2\xdf\x70\xbd\x1a\xe4\xfd\x8c\x35\xd9\x06\x34\x53\x33\x95\x37\x71\x66\xbc\x0f\xa0\xf2\xfd\x83\xa7\xf2\xb0\xef\x70\x0e\xe5\x6b\x0d\x84\xea\x08\x53\xf7\x02\x54\x27\x0d\x55\x7b\xdd\x1e\x58\xae\x48\xf5\x66\xb7\x15\x91\x6d\xa7\xc9\x1a\xca\xd5\x2d\x36\xdc\x2b\xc4\xdc\x83\x9d\x43\x54\xe7\x9e\x9f\x02\x77\x77\xd4\x4f\xda\x3b\xc1\x13\x25\x2a\xc4\xbc\xf3\xcb\xbd\x36\x59\xbf\x5e\xd4\xfa\x88\x65\x86\x26\x79\xde\xf0\xfd\x51\xdf\x59\xa8\xc1\x04\x39\xd4\xbd\x0e\x9f\x9a\x37\x97\x0f\x9f\xdd\x08\x66\xa6\x4e\xee\x88\x17\xfa\x05\x8e\xe8\xa4\x5a\xc6\xfa\x2d\xf8\x5b\xb3\xb5\x52\x4a\xf2\x84\xc5\x93\x09\xfb\x10\x1d\xdb\x74\x89\x1c\xc1\xac\x5f\x38\xfd\x56\x02\xbf\x7d\xb9\x8c\x44\x78\x2f\x58\xe5\x7b\x3b\x1c\x72\x81\x18\x3f\x9d\x43\xd6\x05\xa3\x82\x71\xf9\x8f\x55\xf8\x5b\x4a\x0a\x34\x69\xa9\xfb\xe8\x04\x18\x97\xe6\x0b\x71\x4b\xe3\xb8\x1b\xa0\x5f\x45\x3b\x6b\xab\x45\xb5\x53\xf9\xea\x4f\xa3\x92\xbd\xfb\x5b\xd5\xe5\x38\x53\xc2\x78\xd3\xfc\x0a\xad\x8b\x4b\xc9\x60\x97\x7d\x78\x27\x47\x93\x8d\xf8\x18\xac\xdd\x16\x13\xc7\x97\x6d\xf5\x6b\xa2\xcd\x56\xf4\xde\xef\x47\x69\x8f\xb1\x18\x77\xe7\x98\x35\x21\x59\x1b\x27\xbb\x6d\x84\x41\x99\xed\xd2\x4c\x34\xdc\x23\x37\x7e\xef\xcb\x9c\x64\x03\xb5\x32\xdb\xa3\xf7\xe9\xdc\x06\xc4\xb8\xe8\x97\xf4\xf1\x43\x40\xa0\x62\x8b\x2d\x4a\xf1\x21\x74\x26\x1d\x00\xf1\x7e\x94\xe6\xdb\x62\x28\x87\x96\xff\x02\x7b\x4c\x6f\xf8\xbd\xd8\x4a\x4d\x1d\xf9\x6a\x40\x6f\x2f\xf5\xb4\x79\x71\x8f\x5e\xe0\xf1\x8b\xa6\x0f\x79\x84\xd8\xdf\x99\xa3\x8e\x62\xe1\xec\x00\x9d\x8b\x3c\xef\x87\x9e\xf0\x14\xa7\xef\xe3\x66\xf1\x74\x7b\x70\xec\x2f\x48\x6f\xc8\x06\xdb\x0d\x7c\x02\x70\xce\x87\x10\xd8\x83\x14\x1a\x7c\x89\x34\x2f\xb4\x5c\x6f\x78\x69\x4f\xf6\xb1\x63\x79\xf4\xe4\xfd\xdc\x91\x6a\xf6\xe4\xcc\x6f\x7f\xd2\x57\x99\xae\x91\xc2\x79\x9b\x04\xc8\x15\x93\xad\xd5\xde\x87\x96\x59\x96\x1b\x86\xbe\x88\x47\x2c\x79\x4b\xe5\x7c\xeb\x5b\x69\xdf\x86\x36\xdf\xb6\xf1\xea\xc5\x86\x8e\x7c\xae\xf3\x8e\x97\x71\x8c\xe8\x86\x4b\xa5\xf9\xce\x56\x95\x2d\xd2\x47\x9a\x04\xba\x18\x8c\x29\x4e\xbe\x81\xf1\xf0\x05\x65\x3c\x3f\x3b\x30\xe2\x8f\xff\x4d\x9c\x0f\x1d\x5b\x03\xc2\x14\x2b\x9d\x0b\xd5\x1e\xdf\xda\x5f\x03\xd7\x78\x68\x4c\x23\x93\xb8\x00\xf0\x87\x37\xb4\x3f\xc2\xda\xe0\xcc\x40\x55\xbd\xce\x47\x61\x37\xb0\x77\x77\x6e\xf0\xf4\x93\xed\x8a\x7c\xdc\x9e\x54\x10\xf9\x19\xb2\x0d\x46\xfe\x28\x32\xd9\x8f\xa1\x02\x08\xb4\xb3\xb6\x1e\x7b\xf9\x58\x82\x86\x62\x53\x8c\x47\x8f\x47\xe1\x81\x00\x85\x22\x08\x09\x10\xd1\x29\xd7\x5e\xe8\xa3\x04\x94\x05\x85\xa5\x87\x8f\xd1\xf0\x32\x5f\xf4\x7a\xf2\x52\xdb\x63\xdf\x4d\xeb\x97\x99\x20\x9f\x42\x6d\x94\x52\xcb\x9a\xe9\x34\x5b\xa7\x07\x88\x09\x1c\xda\xf6\x94\xe2\xe6\x7d\xaf\xd1\xdf\xef\x1c\x3c\xd3\x77\xbe\x0f\x90\x1f\x1c\x94\xb8\xb7\x8f\x82\x99\xbe\x3d\x4d\x9d\xbf\x2d\xa0\x51\x9a\x43\xe8\xdd\x4c\x0a\xbf\xf5\x70\x8b\x2d\xf5\xf7\xef\x15\xea\xb8\xc1\xa5\x28\xf6\x78\x7e\x31\x04\x70\x5e\x5a\xd7\x79\xce\x4d\x5b\x26\x1e\xb1\xaf\x15\x7d\xf1\xee\x9a\x7b\x8b\xbd\xe9\x67\x36\x3e\xf0\xf4\xb7\xef\x31\x23\x32\x52\x19\xbe\xa6\xe7\x5d\xf7\xb3\x75\x6c\x8e\x9c\x1d\x82\x51\x4b\x6d\xe0\x99\x95\x6b\x82\xec\xdf\x9d\xce\x19\xa6\x0a\xb5\xc0\x1d\xba\xb0\x7e\xac\x5d\xa3\xf2\x05\xb9\x55\xd7\xa8\x4f\x1c\xc2\x21\x6d\x62\x95\xcd\x37\xc4\x81\x0f\x58\x27\x17\xf8\x1e\x64\x58\x8a\x45\x0b\x96\x4e\x10\xc3\x9b\xf0\xc8\xa0\xce\xf9\x15\x7e\xf3\xb4\xcb\xa4\xf6\x89\xe5\x61\x74\xcd\x6c\x49\xaf\xd4\x91\x39\xac\xd0\x85\xad\x4c\x58\x3c\xf0\xb6\x88\x5b\xa3\xb2\x34\xb5\xff\xb1\xf7\x25\x3b\xaf\x32\xcb\x96\xf3\xfb\x18\x35\x2b\x31\xa0\xef\x54\xaa\x81\x6d\x0c\x18\xd3\x99\x1e\x66\xb4\x06\x4c\xdf\x83\x54\xef\x5e\x99\xdf\x5f\x83\x73\x6a\x76\xe7\xc7\x92\xb5\xb5\xad\xcf\x0d\x49\x64\xc4\x5a\x19\x11\x2b\xb8\xb2\x8f\xb2\xc7\x2f\x75\xd5\xe2\x17\x90\x72\x4d\x6a\x97\x76\xbd\xcc\xad\x02\x8e\x78\xc9\x79\x9e\x6b\x9e\x73\x37\xb8\x4c\xa1\x74\xf5\xad\xad\x77\xe3\xb6\x3d\x7e\xfd\x5b\xaf\xf9\xe3\xa4\x48\x9c\x12\xd9\x6c\x45\x81\x3f\x23\xbc\x85\xdb\x50\xb0\x1d\x05\x62\xf1\x26\xf3\x95\x9b\xfd\xe3\x1a\xf2\x65\x25\x92\x30\xd5\xe4\x70\x94\x78\x8c\x73\x94\x1f\x95\x6a\xc1\xeb\x77\x7c\x32\x1e\x45\xd8\x0c\x55\x9b\xeb\x40\x27\x7a\xf6\xc1\xf6\x79\xbc\xaa\x70\x7e\x53\x5c\x02\x60\xe1\xf3\xd0\xec\xb7\x43\x61\x06\x96\xc9\x19\x80\x62\x50\x67\xf2\x25\x10\x82\x78\xdf\x0a\x61\x2c\x3a\x25\x27\x17\xb6\x04\x71\xb2\xfe\x7e\xc2\xd1\xf4\xaf\xec\x5d\x74\x02\xfa\x4d\xe5\x95\xfd\x19\x92\x00\x0b\x6b\x7c\x2f\x9a\xc2\xe5\xd9\xff\x52\xeb\x09\xf5\xd6\xc8\x9f\xfb\xb4\x25\xe7\x50\xb6\x02\x1b\x69\x1e\xc1\xf0\x44\x1f\xd7\x71\x9c\xa7\xf1\xfe\x00\x61\x1f\x0a\x0d\xce\xd3\x93\xda\xde\xef\xc7\xcc\x90\x0a\x2f\xcb\x00\x9b\xd8\x68\x94\x00\xc3\xb2\x5d\x70\xf7\xb3\x0a\x9e\xeb\x41\xed\x79\xfb\xf6\xc1\xe4\xd6\x94\xda\x09\xce\x6e\x74\x61\x3f\x55\x95\x82\xd8\x99\xbb\x38\x7d\x0b\x53\x9f\x6f\x01\x1d\x33\x62\xda\x14\x3e\x84\xa3\x77\x52\xed\x7c\x90\x99\x2a\xb8\xfb\xc7\x85\xf3\x87\xff\x6a\xa9\x6f\xc0\x59\xf8\xcb\xc4\x8c\x59\x37\xd1\xac\x13\x71\x2c\x20\x47\x98\xdc\x7c\x52\x58\x1a\xcd\x83\x6b\xfb\x7b\xaf\xf9\x0a\x0d\xae\x50\x89\x61\xfb\xc5\xcd\x1b\xfd\xd1\xb9\x9f\x3d\xbe\xdf\xd7\xe3\x33\xb6\xb9\xea\xe3\xeb\xd4\x33\xbb\xcd\xbd\x8d\xec\x47\xbf\x73\xb4\xc0\x99\x74\xeb\x01\x67\x86\x39\xe2\xe7\xad\xfc\xe5\x26\xdf\x75\xbc\x04\xe2\x14\xfc\x78\x69\xdf\xa5\x25\x98\x76\x1a\x93\x18\x7b\xe8\xad\x67\x24\xb9\x0d\x61\x0f\xf6\x51\xb9\xad\xd9\xd5\xb8\x15\x85\xfb\x57\xec\x37\x15\xae\x45\xd8\x3d\xf1\x10\xcf\x12\xba\xa3\x5a\xbd\xbc\x0d\xc0\x7e\xc6\x8c\x37\xea\xbb\x4d\x07\x16\x88\x66\xfd\xfb\x9f\xf1\xe2\x50\x8e\x74\xa9\xb0\xe9\x4f\x23\x8b\x82\x3d\x83\xe6\x98\x29\xf9\x1a\x7c\x72\xe0\xdf\x23\x2c\x6d\x55\x5e\x49\x10\xad\xba\x16\x9e\xd9\x1c\x3e\x47\xf3\xbe\xbb\x8d\x90\xe9\xd2\xe1\xe6\x8e\x8b\x9a\x6d\xad\xe3\x75\x59\xd3\x46\x86\x69\xd9\x6f\x2d\x90\x8b\x82\x1c\xf9\xe2\xa4\x53\x0a\xc0\xdf\x67\xac\x4b\x8b\x4f\x16\x17\x22\x91\xfd\xfc\x7b\xce\xad\xce\xf0\xa9\xe0\x0c\x87\xe6\x80\xcd\x7d\x7e\xba\x90\xe0\x97\x8d\x48\x22\x0f\x6a\x9c\xab\x51\xc3\x83\x8d\x77\x4a\xd9\xe5\x84\x62\x6f\x96\xcf\x0d\xc0\x57\x1e\x01\x30\xfc\x12\x8c\x66\xb0\x6b\xf4\xc0\x66\xb6\x33\xc8\xa0\xd7\x64\x38\xf1\x0f\x84\x90\x5a\xe0\x53\xfc\x80\x25\x56\xf0\xfc\x2c\x37\xd5\x2f\x00\xa7\xda\xb4\xb3\xa4\xb8\x01\x16\x8f\xfb\x81\xf5\xab\x3c\xce\x1c\x83\x22\x79\x01\x47\x53\xbd\xea\x17\xa1\xe7\x07\xac\xed\x3e\x59\x40\x9d\x17\xe9\xba\x2e\xde\xc3\xde\x25\xa6\x5d\xe9\xdf\x4e\xd2\xd8\x7c\x6b\x0d\x10\x8e\xc0\x95\x8e\x07\x5a\x42\x81\x32\x38\xf8\xd8\x75\xf9\x3c\x82\x05\x89\xce\x09\xe0\x3f\x70\x55\x7c\xa4\x7f\x91\xe0\x42\xd2\x44\xb2\x20\xdb\x00\x80\x4c\xff\x52\x59\x7e\x7c\x43\x5f\xbc\x13\xb8\xc6\xc3\x5a\x49\xca\x35\xe4\x48\x56\xe0\x8c\xd0\x86\xbe\x58\x03\x36\xf0\xf4\x24\xf7\x1e\x9a\x74\x0b\x68\xca\x34\x65\x94\xc5\x2b\x72\x5c\xd0\xf0\xd4\x05\x3b\xd5\xfc\xad\xdd\x84\xe6\x62\x2c\x4d\x87\xbd\x92\x60\x5b\x39\xee\x65\x5c\x74\x05\xf3\xcb\x75\x38\xbb\xad\xa3\xac\x5f\x1f\xc7\x17\xdd\x49\xf1\x4f\x7d\x3e\x0b\x93\x3c\xbf\x28\xf3\x5b\x83\x84\xd5\xb2\xfc\x7e\xf3\xee\x3f\x7e\x88\xed\x9f\x25\xd0\x8c\x68\x72\x8c\x59\x05\x4d\x11\x0c\xf1\x5a\x1e\xeb\xa7\xfa\x9a\x0b\xb0\x41\xf0\x5e\xf0\xc1\xa4\x4e\xd4\x15\x96\x06\xd6\xe9\x02\xbf\xf4\xa3\xf2\x49\xad\xa8\x91\x59\xcc\xa4\xf5\xe9\x2e\xf2\xef\x5f\xca\x50\x47\x62\xcc\xb6\x8e\x89\x24\x6b\xdd\x55\x44\x05\xfc\x08\x7b\x6d\x41\x30\xb1\x7c\x45\x7a\x9f\x83\x4e\xd9\x31\x5c\xa0\x80\x1f\x43\x85\x05\x20\x17\x45\x9f\xc5\x6b\xd0\x69\xb4\x29\x1e\xbe\xc2\x3c\xca\x3e\x97\x61\xd6\x6e\xa5\x7c\xfa\x97\x68\xa7\xdb\xcb\x24\x83\x98\x62\x75\x6a\xfe\x8e\xe9\x02\x87\xca\x47\xd4\xb9\xe6\x84\x8f\x04\xc9\x02\x64\xf3\xb6\xa3\x82\xf4\xc9\x7c\x00\xb1\x7c\x88\x43\x28\xe8\xe6\x37\x34\x08\x70\xf9\x1b\xb8\xd6\x81\x55\x4f\xf1\xbe\xc7\x57\x11\x46\x9c\xdb\x85\x21\xa4\x2c\x20\xf2\x5c\xba\x3f\x65\x2b\x9b\xd7\x3f\x45\x5f\xfd\x4b\xf2\x9e\xc0\xfc\xf2\x55\x78\x52\x6f\xb1\x22\x68\xfe\x01\xfc\x8e\x0e\x02\xff\x46\x32\xba\x7f\x39\xd1\x4c\xf0\x0a\xc2\x21\x05\xbf\x0a\x69\x20\x62\xf0\xb0\xd1\x45\xea\xae\xa6\x79\x7b\x26\x88\x64\xf3\xbf\x80\x57\x50\x21\x9f\x68\x7d\x6a\x48\x6e\xd0\x7d\x6a\xd3\xc1\x60\x4f\xe5\xe9\x83\xd8\xd3\x24\x54\x21\x33\x70\xd6\xa3\x54\x97\xcb\x16\xb5\xac\x74\x7e\xd7\x19\xbc\xe7\x65\xca\xdb\xba\xf7\xae\x2a\x1a\x28\xae\x34\x0b\x40\x0e\x21\xd2\x03\xb4\xcd\x93\x52\x4b\x23\xdd\x42\xa8\x09\x0f\x73\x54\x5a\xbd\xdf\xe3\x63\x9b\x6e\x36\xb5\xc2\x18\x8f\xf1\xaa\xdd\x37\xde\x0f\x8a\x6d\x4f\x38\xc1\x83\x4b\x99\xcd\xc7\x6f\xb0\xed\xb0\x0b\xa5\xa3\x9a\x5b\xb0\xc3\x7a\x95\x2b\x20\xbe\x4f\xac\x85\x1c\xc9\x99\x7d\x26\x34\x22\x3b\x0b\x5e\x7a\xfc\x41\x4e\xc4\xd5\xeb\x02\x40\x94\xe1\xc7\x34\x1c\x5c\x37\x03\x81\xa5\xc2\x6f\x19\xdc\x75\xd9\x61\xf1\x15\xce\xae\x65\xb8\x2a\xe4\xe5\xb7\x61\x03\xf7\xa9\x9c\x13\xcf\xf0\xa8\x96\xeb\xda\xf5\xc1\x22\x33\xf7\xb0\x4e\xe7\xd0\xdb\x96\x44\x33\xc9\xf0\x80\xc9\x4e\xc1\x4c\xde\xa8\x08\x7d\x03\xbb\x78\x77\x13\x45\x69\x32\xd4\x0b\x03\xeb\xc4\x78\xf8\x67\x5f\x4c\x12\x45\xab\x84\xd7\xf7\x11\x65\x2d\xe2\x8a\x16\xa1\xeb\xf7\xaf\x1b\x75\xdf\x47\x70\x12\x64\x34\x36\x3e\x8a\x6e\x38\x0c\xc8\xcb\x27\xcb\x87\x20\x05\x0b\x9d\x00\xdf\x9e\xd0\x34\x85\x8e\x20\xf8\xf1\x10\xd0\xff\xf2\x07\x20\xf7\x3f\x26\x01\x86\x74\xff\x6d\x4f\x26\x05\x5b\xce\x03\x1c\xb8\x28\xf7\xa8\xb5\x3d\xb3\xdf\xc5\xf9\x55\xde\x5e\x9d\xb9\x11\x5c\x61\x5e\x31\x71\x7c\x5f\xca\xc6\x0a\xb8\x86\xc4\x5c\xc9\xfd\x0c\x57\x4d\x7c\x72\x01\x44\x88\x35\x48\x6f\x8f\x97\x75\x95\x1d\xa2\xf3\x10\xa7\xa3\x59\xe0\xc7\xa8\x15\xf6\x43\xd3\xcf\xc8\x08\x7f\x4f\xe1\x3a\x01\xf3\x43\xb6\x1e\x44\x2e\x7a\xc6\x87\x93\x31\x22\x06\xe2\x53\x59\x80\x93\x0a\xb7\x4f\x2f\xd8\x85\xe5\x62\xf7\xfb\x27\x95\x55\x82\xdc\x6c\x5a\xe7\x43\xbd\xfc\x5a\xcf\x03\x84\xce\xa5\x39\x81\x63\x06\x80\x7d\x4b\x00\x34\x66\xad\x26\x33\x6b\x2a\xe9\x96\x8e\x9c\xf0\xf9\x7e\x7d\x93\x17\x7f\xbf\x98\x82\x45\xea\x1f\xa1\xe2\x6c\xcd\x01\x5f\xc5\x95\x04\x49\xfb\x20\x28\xbe\x65\xfe\x40\xc1\xe6\xdf\x3a\xa8\xc6\x07\xbc\x95\xd8\x46\x63\xcc\x2e\x2d\xe9\xe1\x8b\x4c\x13\xb8\xfd\x1c\x48\xf9\x40\xd1\x00\x38\xdd\x0f\x88\x4c\x63\x93\x5e\xb1\xf6\x4a\x5b\xd8\xbc\x4a\x7e\x72\xb0\x28\x2c\xd7\xa6\x54\x67\x04\xdb\xda\x19\xcf\xda\x1a\x1f\x67\xfc\x00\x9b\x99\x2c\x1a\xae\x0c\xa0\xd7\x78\x95\xd9\x55\x71\x68\x87\x80\xe0\xcc\x20\xc5\x7c\xc5\x62\xf2\xb9\x18\x95\x46\xcc\x6f\x00\xf3\xed\x9d\x33\xe0\xe9\x3a\x85\x7b\xc6\xe6\x5d\xd5\xd6\xe1\xfd\xad\xd0\xf0\xec\x83\x97\x2d\x37\x7a\x5a\x35\xce\xa0\x45\x45\x26\xb7\xd4\x06\x56\x30\x2c\x24\xfb\x13\x4c\x04\x70\x78\x7e\x6b\x10\x12\x41\x1f\xac\x07\x56\x3a\x72\x68\x8e\x01\x37\xd3\xf6\x71\x5f\x00\xb4\x16\xc4\xe8\xcd\xd9\xd1\xde\x78\x95\x3b\x52\xf7\x8c\x39\x68\x8a\xfa\xe9\x01\xff\x5f\xc0\xce\x0b\xc3\xf0\x5e\x72\xba\xe2\x3c\xaf\x74\x0e\xbc\xc4\x79\xee\xda\x67\x7e\x3e\xe0\xb9\x10\x75\xc6\x9a\x7c\xe1\xad\x60\xba\xfc\xf3\xc1\x08\xc3\x46\x6e\x04\x6b\x92\x88\x2a\xd6\x8b\xd1\x53\x7a\x8b\x5a\xdb\x13\x4b\xca\x23\x86\x07\x2d\x33\xe1\x29\x10\x9a\xfa\x11\x0e\x3c\xeb\xf6\x22\xde\x10\x61\xd9\x5d\xe9\xb8\x4a\x1a\xdc\x8f\x85\xa6\x3a\xd4\x45\xd2\x35\x88\x60\x0c\x4d\x9a\x4d\x83\x02\xa0\x7d\x53\x1d\x91\xd3\x7c\x73\x69\x59\x00\x07\x4b\x96\x06\xb9\xe2\xfb\x47\x7b\x18\xe7\xfe\x33\x1f\xfc\x4a\x15\x3d\xc0\x8b\x9b\x40\x7d\x1a\x00\xf7\xd1\x0d\x9e\xdf\x10\x4b\xfd\xe1\x16\x38\x1f\xf3\xeb\xe7\xa6\x9b\xcb\x1a\x22\x1f\xb9\x86\x27\x8b\x7c\xc7\x32\xe9\x4a\xb6\x86\x54\x9b\x8a\x18\x18\x0f\x2c\xa2\xf2\x0e\x54\x9c\x43\x2a\x6a\x40\xc0\x5a\x28\x27\x5b\x05\x73\x87\xab\xb4\x7c\xa3\xc4\x32\xf4\x57\xb4\x00\x34\x6f\x3b\xb4\x56\xe1\x3a\xcd\x2c\x19\x63\x03\x8e\x74\x64\x07\xc0\x74\x86\xf5\x7b\xa2\xe3\x09\xe0\x1f\x3a\x93\x4f\xb9\x48\x3f\xcf\x45\x8d\x71\x95\xf2\xa5\x90\xc7\x3e\x13\x40\xa6\xca\xcc\x24\x66\x6f\x36\x9d\x18\xdf\xa5\x05\xe0\x31\x9c\xc0\x43\x07\x95\xdb\x92\xb6\xca\x73\xab\x29\x92\xe7\x80\x17\xd9\xa1\x4a\xe8\xc2\xe6\xd7\x92\x48\xf8\x02\x78\x40\x85\x3c\xbd\x35\x69\xd9\x47\x7b\x15\x07\x57\xc0\x39\x1f\xac\x7c\xa4\xbe\x72\xf8\x2f\xa6\x53\x7c\xbd\x4e\x09\x38\x53\x38\xe2\xb8\x41\x68\x01\xfc\x13\x0e\x8c\xc9\x95\x1b\xf2\xc2\xfc\x76\x18\xc1\xae\x9a\xb2\x89\x8c\x23\x5d\xda\x53\xb9\xda\x52\x15\x78\xaa\x31\xdf\x58\x40\x19\x01\x0b\x81\x83\xda\x16\xd4\x89\xad\xa5\x17\xf1\x22\x50\xd2\xd5\x87\x9a\x7c\xba\x9e\xaa\x00\xea\x42\x6a\x26\x5c\x7d\xfa\x20\x9e\x69\xdb\x91\x08\x75\xe9\xbd\x4f\x23\x75\xf9\x42\x37\x14\x55\x0c\x49\xe1\x92\x26\xed\x09\xad\x06\x4b\x3d\xa5\xfb\xa2\xfe\x53\x41\xaa\x5d\x90\x3f\xc6\x01\xb6\xc6\xc6\x3e\x0b\x37\x5e\x75\x30\xde\xb4\xb1\xda\xb4\x35\x5c\xcf\xbd\x05\x5b\x16\xb3\xbb\xa8\x23\xe9\xe6\x1a\x86\x69\x28\xa3\x25\x04\x9f\xc4\x02\x81\xa7\x39\x8f\x38\x33\x20\x37\x39\x56\xe3\x7e\x18\x39\x56\xc8\x5d\x80\x72\x57\xaf\x74\xcc\x0a\xee\x1d\x0d\xec\xa2\x52\x2f\xcd\x4d\x19\x0c\x44\x10\x53\x16\xa8\x9f\xf0\x5c\x00\xa3\x4d\x36\x04\x35\x7b\x2c\x37\x30\x63\xfc\x13\x87\x4c\x94\x19\x9f\x09\xbc\x8d\x09\x1d\xfc\xc4\xa6\x21\x12\x6b\x70\x71\x45\xb8\x09\x20\xf0\x44\x3f\x88\xc7\x14\x1b\x6a\x5c\xfb\x68\x45\x9e\x36\x97\xbb\xfa\x81\xcf\xe4\x16\xeb\xed\x49\x27\x21\xa0\xb7\xc8\xec\x11\xc1\x1b\x11\x2a\x79\xe7\xe5\x00\xbf\x00\xfa\x78\x57\x44\xfd\xa5\x11\xc6\x41\x9a\x4d\xbd\xd2\x24\x07\xae\x61\x56\x1e\xf9\xc0\xe6\x83\xce\x23\x1c\x1a\x90\x9f\x2b\xb0\x0e\x26\x37\x65\x40\x07\x90\x74\xd9\x65\xdc\xff\xb6\xb0\xf6\x92\x21\x6a\xd4\x89\x74\x3e\x35\x28\xae\x90\x36\xfc\xe1\x46\xf3\xf4\xc0\x34\x01\x66\xa9\xc0\xae\x90\x6a\xfb\xd0\x84\xdb\x57\x7d\x99\xe8\xd5\x45\x84\xf5\x83\xad\x9b\x91\x04\x6e\x65\x0c\x80\xdc\x16\x80\xf0\x0c\x45\xac\x9f\x0f\xf2\x29\xb8\x87\x2e\xc0\xc4\xd6\x03\xd8\x79\x84\x9c\xa6\xb7\x1b\xce\xc1\xed\xec\x84\x67\xf7\xe5\x82\xba\x87\x4e\x48\x68\xd0\x8e\x26\x9f\x80\xcd\x2a\xb3\xf3\xc4\xf5\x0a\x60\x7c\x78\xa8\x12\x43\x59\x1e\xd8\x88\xf5\x53\xaa\xcf\x0f\xfc\xfe\xa6\x8f\x05\x37\x8b\x61\x4c\xe9\x9c\xfb\xf1\x6a\xfa\xa1\xe4\x34\xc5\x90\xc5\x93\x67\xe8\xac\xba\x69\x13\x9f\x93\x41\xc6\xfb\xb1\x1e\x39\x79\x68\x7d\xc9\xe9\x37\x99\x06\xea\xa2\x6f\x60\x53\xc0\x49\xff\x0d\x40\x4b\x74\xbb\xff\xb9\xb4\x20\x43\xde\x6d\x41\x59\x5e\x80\x29\x9d\xbf\x56\x0d\x3c\x8b\xc5\xcf\x68\x96\x68\x91\x37\x9d\xf7\x27\x51\x05\x1f\x59\x50\x71\x01\x8c\x52\xc0\xd5\x2b\xd5\xcf\xfd\xfe\x9e\x43\x00\xb0\x77\xd2\xd2\x92\xd3\x45\x46\xe1\x42\x1f\x11\x06\x83\xb0\x80\x08\xe1\xb3\xe2\xa9\x14\x3e\xcb\x40\xe1\x28\x88\x13\x6e\x3f\xb2\xad\x00\xbf\x53\xa6\xde\x24\xc3\x79\xe6\xd1\x9f\x49\x62\x31\x9d\x37\x9e\xdf\x8c\x6f\x62\x3c\x6a\x80\x44\x0e\x80\xe0\x94\xfc\xc7\x02\xae\xb0\x31\x97\xc1\xb1\x19\xaf\x12\x7d\x6a\x76\x1c\x44\x32\xd1\x1c\x4b\x8e\xb7\x4e\x6f\xe4\x4f\x80\x77\xe0\x91\xef\x17\xca\xf0\x8d\xb1\x34\xcc\x71\x60\x90\x49\xc6\x33\x36\x2c\xcb\x60\x72\xd6\xef\xd9\x92\x5a\x9e\xa5\xeb\x8a\x86\xf5\xa3\x11\x8b\xbb\xe6\x8e\x69\x14\x1f\x10\xdf\xd1\xea\x1a\x31\xf2\xdd\x4e\x88\x91\xcb\xdf\x32\x38\x5f\x7a\x43\xcd\x26\x07\xf0\xdc\xac\xe5\x1b\x2b\x9f\x69\x33\xd0\x0c\x85\x72\x82\x89\xfa\x89\x9d\xf9\xcc\xa3\x1d\x3a\x58\x12\xb9\xf7\xe2\xfb\x6d\xc4\xef\x37\xb1\x74\x31\x87\xf2\x65\x30\xe1\x54\x29\x9a\x77\x32\x45\x0a\xb3\xbf\x4a\xf5\x29\xf8\xa1\x59\xb3\x88\x73\xed\xb9\x03\x0f\x21\x00\x4f\x0d\x98\xbc\xac\xff\x86\x02\xc4\xc4\xdf\xbf\x7d\xdc\x96\x00\x89\x8c\x55\xe4\xc2\xf9\x4c\xee\xe1\xbe\xbc\xdb\xe7\x61\x0e\x20\x6a\xbe\xef\x1f\x9e\xe6\x0b\x74\xc4\x9f\xaf\xb1\x01\xc0\x07\xdb\xe0\x19\x8c\xca\x70\xfd\x74\x7e\x87\xb7\x25\x79\xd5\x73\x78\xbe\x06\xf1\xe5\x89\xe5\xc7\x17\xff\xaa\xbe\x3e\x1d\x0d\x19\x0f\x2c\x80\x47\x0a\x07\xd5\x74\x53\x80\x75\x0f\x0c\x82\x0e\x28\x8b\x32\x4e\xa2\xca\x4b\x5b\x05\x13\x93\xe9\xd2\xa3\x74\x3e\x45\x71\xbf\xbd\x4b\x17\x6c\xba\xdb\xae\x0b\xd6\x36\xe8\xed\x14\xce\x92\x2c\x94\x3d\x81\xc1\x39\x01\xba\x10\xb8\xf0\xe7\x97\xee\x0b\x1e\x4e\x8a\x56\xea\x6e\x4e\x42\xac\x3f\x2f\xf3\xbd\x57\xf9\xb6\xd7\x89\xe1\x9e\xe0\xf5\x88\xbf\xcc\x35\x83\xeb\xab\x5c\x5b\xb7\x53\xae\xce\xf8\xe5\xa4\x93\xe7\x46\x17\x26\x53\x29\xe1\x92\x05\x22\x69\x99\xf5\x2f\xbd\x7a\x93\xe5\xa1\x0c\x62\x98\x69\xed\xe3\x24\x72\xa3\xb5\x3f\x3e\xbd\x36\x77\xc2\x38\x39\x47\x3a\x5e\x5f\x96\x77\x79\x3c\xf2\x87\x29\x46\x82\x9f\x77\x62\x9f\xc7\x23\xd2\x3a\xa1\xb6\x4f\xda\x64\xb6\xd0\x02\xd7\x2d\xc9\x04\xf1\xb0\xec\x97\xcd\x5e\xf7\x02\x72\xd4\xee\x4b\xe9\x58\x16\xf8\x51\xbe\x37\xaa\x78\x22\x34\x9c\x3c\x35\x6e\xea\x06\x22\x59\x64\xfa\xea\xcf\x96\xc7\x9c\xa0\xc8\x49\xe7\xe3\xd9\xff\x05\xe6\x9c\x6b\x45\xde\x5a\xe7\xea\xed\x6b\xc3\x48\xaa\x08\x70\xae\x7c\xd1\x2c\x3b\x9c\x1b\x3b\x91\x9a\x54\xa2\x5d\x2a\x54\xc0\x31\xd3\xe2\x3a\x33\x05\xac\xff\x65\xd6\x90\xf9\xbd\x62\x5e\x19\xb8\xa3\x87\x02\x2e\x61\xff\xee\x7b\x54\xa5\x72\x11\x6a\x06\x4b\xb2\x71\x9b\xfe\x7a\x70\xa2\x74\x85\x58\x62\x46\x4e\x86\x10\x52\x24\xf8\x72\x50\x97\x0f\xd6\x4d\xce\x3e\xe5\x03\xeb\x5c\x59\x96\x13\x10\xe5\x7b\x98\x09\x40\xeb\x50\x87\xb6\xbd\xf0\xcb\xab\x13\x40\x90\xae\x23\x17\x76\x7f\x91\x0d\x38\x06\xb6\xc4\xb8\x08\x4e\xe4\xab\xa3\xe0\x45\xc1\xbc\xa1\xa9\x3b\xd9\xed\xdc\x72\xe2\x89\x3b\xf6\xb9\x41\xf0\xd9\xe4\x16\x07\x28\x9a\xf7\x58\xd1\x64\xe1\x0f\x8e\x19\xdf\xf9\x76\x51\xd4\x38\x31\x00\xf8\x45\xe6\x9d\x4b\x99\xcc\xa0\x39\x5e\x46\xea\x81\xb5\x7d\xc7\x13\x90\xb2\x39\xe9\x32\x35\xf7\xe9\x4f\x9f\x97\x63\x8a\x08\x61\x69\x9a\xb0\x3a\x92\x65\x44\x12\xb8\xd2\x6c\x9b\xdc\x38\x9b\x72\x77\x00\xa4\xca\x40\xe3\x15\xcb\x9d\x7d\xf8\x08\x91\x20\x63\x72\xa4\xaa\xb4\xcb\x64\x66\x4b\x1a\x9b\xfa\x9b\x6d\x55\x27\xde\x60\x83\x17\xab\x86\xda\x18\xae\x27\x69\xfd\xe9\x83\x0f\xfb\x26\x80\x29\xba\xbc\xe9\xf0\x1f\x63\xca\x6e\xe5\xcb\xda\x3e\xbf\xe7\x17\x58\x3d\xa7\x7f\x8e\x23\xb4\xed\xb7\x35\x4b\xfc\xbe\xc9\x80\xee\x75\x1b\x42\xbe\x8a\x7b\x6a\xab\x80\x29\x12\x70\xce\x88\x75\xcc\xd2\x9d\xb1\x8a\xc7\xb7\x8b\xd6\x08\x20\x7b\x5e\xb3\x0e\xe1\x45\xa3\x69\xce\x6a\xfe\xe7\x34\x66\x9c\xb6\x80\xe1\x53\x92\x0c\x30\xcd\x3b\x5a\x4d\xef\x20\x61\xd2\x89\xa1\x6e\xfe\xbe\x7f\x19\xc1\x5a\x57\x92\x2d\x4b\x86\x62\x17\xe0\x2d\x98\xb9\x1e\xe5\x96\x4f\x0f\x70\xe9\x4b\x98\x34\x17\xbd\x33\x84\x5c\x20\x1d\x0b\x2c\x88\xd0\xcb\x90\x80\x4e\x25\x22\x33\xcc\xd7\x65\x18\xe3\x5d\xd1\x74\x61\xbd\x58\xcb\x46\xb3\x94\x07\xf5\x4e\xb1\x6a\x15\x12\x8a\x95\x4d\xb7\x7c\x13\x30\xbe\x51\x2c\x37\x96\xbd\x77\xf2\xd3\x32\xcd\x5b\xb9\xc9\xb6\xbb\x21\xf6\x3b\xe5\xd4\x0c\xed\x81\xae\x5d\x70\x29\xfd\xeb\x56\x4b\xf7\x36\xe9\xd8\xfd\x94\x9e\x3f\xfe\x11\xbd\x6c\x6c\x99\x70\x9a\xcd\x16\x91\x48\xdf\x55\xc6\xf0\xeb\x80\x23\xc6\xd7\xd2\x8d\x13\x5d\x49\xe7\x78\xf5\xaf\xaf\x40\xb0\x79\xff\xa6\xe4\x7d\x15\x5c\xa8\x35\xec\x4f\x00\xae\xdd\xbb\x86\xe2\x8c\xc7\x23\x78\xce\xc7\x5a\x5c\xe5\x0e\x83\x6e\x5d\x16\x1a\x9f\x6f\xbe\x45\x49\x2b\x88\x18\x30\x58\xc4\x95\x51\xa0\x13\xc5\xf9\xba\xe1\x7c\x69\xc1\xb9\x28\x42\x29\x43\x1c\x79\xf3\x55\x37\x21\x5f\x0e\xf9\x01\xa0\xd1\x9c\x88\x5e\x5b\x80\xe1\x18\xe3\xa3\x19\xb4\xcb\xc5\xcd\x40\x9d\xdf\xda\x4c\x28\xaf\x56\xaf\x5c\x59\xc7\x47\x13\x20\x8b\x88\xd2\xde\x24\x73\xaf\xe9\x19\xf1\x13\xa1\x6f\x38\x5f\x1e\xbb\xdd\xf1\x41\x9c\x93\xe4\x95\x6c\xeb\x62\x6f\x3d\x40\xec\x26\xca\x5e\x37\x7f\x2a\xd2\xc2\xd4\x1f\x7b\xe8\x1a\xcf\x6f\xb5\xc3\x1c\x68\x94\x12\xf1\x06\xc7\xeb\xbd\xee\xb7\xaf\xb4\x58\x64\x1b\x47\x06\x58\x53\x84\xda\xc3\x27\x8a\xf0\x80\xb9\xbf\xcf\x56\x45\x17\x01\x3d\x3e\xc2\xf9\x41\x36\x80\x24\xab\x61\xa8\xb5\x64\x49\x76\xc3\x3c\xe0\x3c\x1e\xc0\x5b\x84\x7b\x65\x91\x00\x15\x11\x80\xde\xe4\x8f\x5b\x15\x6a\x04\xb7\x46\xc0\x82\x0a\x77\x69\xa3\x2a\x6c\xa5\x8e\x57\xad\x5f\x28\x7d\x38\x8e\xfb\xb1\x62\xa7\x6e\x18\xe3\xc4\x05\x2d\xd9\xfd\xf4\x66\xf8\x6c\x83\xd4\x45\x6d\x8a\xb4\xfc\x08\x69\x02\x02\xfd\x35\x9c\xa8\x52\x59\xb3\x23\xab\x53\x35\xf3\xa6\x45\x78\xfe\x8e\xe6\xe6\x68\xf6\x1c\x69\x4e\x6c\x7e\x6a\x9d\xd4\x62\x39\x79\xff\x51\xc3\xf3\x0d\xb0\x87\x65\x0b\x00\x83\xcf\xf6\x59\x41\x5c\xfc\x53\xf5\xb9\xef\xa6\xfd\x25\x01\x9f\x86\x37\x24\x96\xd0\xbc\x2e\x6d\x05\xca\x39\x37\x3b\x5f\x92\x78\xb7\x1e\x73\x1f\x4a\xf7\x9a\xcb\x7d\x01\x1d\x75\x29\x74\xb7\x07\x9e\xe1\xf5\xa1\xd4\x39\xd4\xd4\x42\x0b\xb3\xbc\x5d\x89\x1c\x72\x7a\xcb\x45\x0c\x92\xdf\xfc\xcc\x80\xe3\x32\x7a\xa4\xfb\x58\x88\x29\xd5\x4e\x36\x13\x53\xc9\x92\x38\x05\x47\xf9\x33\xdd\x93\x53\xb2\x92\x45\xf5\x46\x3c\x34\xcf\x34\x65\x3d\x60\x20\xbf\xbe\x5e\xb5\x36\xdf\x65\x01\x42\x0d\x5c\x73\x3e\x4f\xd1\x93\x1a\x18\xab\xfb\x33\xd2\xf8\x6c\x09\x8d\x4c\x7b\xa2\xd7\xce\x00\x2f\xe9\xb1\x39\x7a\xee\x37\xa6\xbb\xb5\xc1\x79\x90\xb5\xb1\x87\xf8\xa7\x2e\xfa\x77\x28\x71\x64\xb0\xc2\x9c\x0c\xac\x35\xb6\xe6\xf3\x04\x74\xea\xb6\x67\xc5\x88\x0d\x00\xea\xbf\x6d\x28\x95\x37\xd8\x78\xe6\xbc\x18\x53\xb0\x7a\x9a\xce\x83\xa6\xbe\x3b\xbb\xdc\x99\x1d\x08\xd9\x35\xeb\xf5\xad\xa7\x96\xc6\xbb\x98\x4d\x8d\x42\xc6\xda\xde\x15\xa5\x89\x0a\xa8\x33\x37\x1b\xac\xc2\xed\xb1\xfd\x2e\x2e\xac\x98\x7e\x36\xae\xab\x31\x39\x68\x44\xfa\xbc\x37\x64\x8f\x25\x5a\x37\x25\x83\x3e\x2a\xc3\x16\xe6\xcc\x76\x5f\x82\xf7\xb7\x1e\xf1\x39\x71\x75\x43\x26\xde\x5e\x3d\xa3\x9a\x42\x44\x6b\xd1\x5a\x21\x96\x82\x15\xc2\x43\x82\xdd\x3d\xe0\x59\xb7\xe1\x92\x90\xad\xb3\xa9\x24\x48\x06\x62\x09\xdc\xeb\x76\x79\x9f\x04\x70\xf0\x8e\x8e\x38\x13\x67\x55\x00\xd7\x03\x58\x0b\xeb\xaa\xba\x36\x10\x80\x56\x86\xc5\x4a\xe6\xfa\x3e\xd0\x99\xa8\xd2\xcd\xa5\x7c\xf1\x14\xb0\x12\x03\xce\x9d\xb7\x9e\xfa\xdb\x7a\xbe\xcb\x74\x09\xa6\xa6\xba\x92\x91\xd4\x3c\xe4\x29\x60\x6f\xc3\xb4\x9b\xa7\x59\x0a\x64\x32\x75\x12\x1d\x98\xc8\x11\xee\x5c\x6a\xc0\xfa\x96\x90\x92\x94\xbb\xf6\xf8\xa6\x77\x78\xee\xfe\xad\x4e\x11\x16\x1b\x62\xc4\xa5\xdd\x11\xfe\x71\x68\x35\xf0\x45\x91\x9c\xb0\xd6\x6a\x85\x9e\xe3\x1b\x94\x78\x9b\xa5\x5a\xa1\x5a\x8c\x5d\x56\x0d\xe7\xb3\xbc\xf8\x9e\x00\x55\xd6\x07\x41\x4d\x55\xd3\x58\x7e\xd2\x5e\x19\x82\x98\x81\x37\x3c\x5b\x87\x9c\x19\x3e\x0a\xa8\xb8\xbf\x44\x40\x73\x38\x23\x7c\xdc\x7d\x65\x71\xc4\xe5\x1a\xdb\x99\xcd\x49\x93\x7c\x8e\xfb\x5b\x5c\x7c\xca\x7e\x84\x3f\x2a\x33\x86\x5d\x31\x0d\x58\x63\x7f\x6b\x7f\xa5\x19\xac\xee\x1a\x68\x94\xdc\xdd\xa7\x8a\x7a\xdd\x9d\xa2\x87\x52\x57\xb6\xf0\x72\x2d\xc4\x1b\xbf\xcf\x69\x19\xdd\xe6\x2f\x27\x15\xb6\xb7\xef\x0d\x40\xb4\x56\x91\x0d\x7b\x1c\xc6\x77\x49\xe5\xdd\x0f\x20\x0c\xcb\x6c\x85\xca\xea\x4a\x0e\x56\x50\x86\xa1\x90\x33\x05\xe3\xf7\xa3\x56\xa7\xd9\xae\xab\x20\x0e\xb9\x94\x8a\x9c\x4b\x9b\xe4\x57\xff\xc8\x8c\x2e\x45\xf2\x8b\xfd\x40\x4d\x4c\x34\xbf\x80\xc9\x99\x01\xc9\x7a\x1d\xcf\xec\xf4\x8c\x77\x28\xa2\x02\x3a\x08\xf0\x1a\xef\x14\x12\x8e\x21\x84\xc9\x4a\x70\x4f\x13\xb1\xfe\x7c\x88\xae\x28\x88\x43\xe8\x3f\x6e\x0a\x57\x31\xb1\x2f\x56\x5b\x57\x4d\xd1\x88\x87\xc3\xcb\x48\x40\xe4\x9c\x81\x83\x6b\xbf\x9d\x67\xa8\x17\x92\xf0\x7a\x9b\x5c\xdb\x2e\xb3\xda\x77\x78\x79\x90\xa3\x58\xee\xec\x03\xbe\x77\x11\xfb\x4d\xb1\xd2\x3a\x8b\xbd\x7c\xf1\x13\x1c\x07\xb4\x43\x93\x8a\xc1\x8c\xd6\x38\x14\x1f\xf3\xb6\x3c\xea\xf9\x9b\xdc\xf6\xe4\x8f\x18\xa8\x28\xa1\x3e\x3b\x87\xe6\x47\x32\xe9\x71\x69\x30\xb0\xc7\xc7\x7e\xb8\x0e\x85\xbc\x62\x29\x88\xe6\x33\xb6\x0b\x9d\x56\x5c\xb0\xb6\xe3\x03\x41\xe7\x16\xc9\xfc\xad\x05\x38\xa1\xc7\xb5\xa7\xa2\x17\xdf\x6d\x21\xdd\xfc\xa2\xa5\xe8\xe7\x89\x00\x45\xaf\x7b\x6c\x48\xc5\x7d\xe7\x43\x80\x6d\x2b\xb9\x43\x47\x31\x90\xdc\x9a\x43\x68\x8e\x12\x01\xaf\xf7\x6a\x34\xf5\xe1\x40\x58\x72\x6e\x57\xd1\xde\x10\x11\xdf\xdb\x6b\x5a\x08\xe6\xdc\x6e\x4f\x6b\xdb\x98\xbe\x4c\xfa\x31\x24\x84\x1b\x1a\x55\x65\x8b\x12\xab\xb2\xa7\x7e\xd0\x64\xb2\x33\xe0\x8a\xa8\x18\x3c\x4d\xf1\xce\xc0\xf1\x1a\x49\xb6\xc2\xf3\x92\xfb\x7c\x88\xa2\x8e\xa5\x08\xfd\x79\x6c\x13\x13\x7a\x0f\xf1\x02\x6b\x8a\x1b\x87\x4e\x5d\x1d\xf8\x36\xe1\xb8\x17\x9b\x8c\x5f\x3e\xb9\x53\xda\x4d\xa5\xd1\x8d\x60\xa8\xac\x47\xe1\x1c\x95\x7d\x9d\x73\x5a\x73\xe4\xcf\x8f\x1f\x03\x14\xb8\xf8\xda\x7f\xdd\xfb\x44\x42\x38\x76\x96\xd1\x05\xe9\x02\xaa\xab\x7e\x0d\xcc\x5b\x17\x1b\x8b\x88\x9c\xfe\x80\xf3\x15\xf1\xf1\x7e\xbf\xa1\x63\xc1\x49\x37\x33\xe3\x9d\xd8\x64\x1b\x36\x17\x04\x6a\x8a\xa3\xda\xe2\xf6\x08\x89\x32\xd9\xd6\x72\xa3\x56\xd8\x5f\xe4\x67\x5d\x76\x5d\x5f\xda\x38\xe9\x14\x72\x28\xf1\x91\xa0\x07\xb6\xe6\xec\xec\xdc\x3e\x22\x14\x23\x75\xe0\x94\x80\x12\x59\xf0\x34\xf0\xc4\x7e\x10\x0b\xda\xd8\x3a\x85\x59\x04\x82\x9f\xe2\xa5\xcb\xe6\xfa\x1c\xbf\x0a\xee\x79\x78\x04\x38\x5a\xf5\x34\xb8\x37\x27\x09\xb0\x15\x6a\x5d\xcf\x19\x5c\xc5\x52\x49\xbb\x32\x36\x13\xce\x50\x00\x6f\xfd\x15\xfc\xde\x5f\xa9\x28\x94\x3b\x29\xa4\xd8\xc0\x40\xae\x39\xfc\xce\x2c\xdf\x14\xf7\x76\x37\x03\x7b\x7a\x7b\xf3\xa4\x9e\xe5\xeb\xe7\x00\x30\xc0\x82\xfb\x92\xe8\x98\x5d\xcb\xcd\x04\x38\x1d\xc6\xa7\xc1\x65\xfd\x66\xa8\x11\x3c\xbe\x8e\x9e\x4b\xa8\x57\xbf\xc4\x86\xf3\x08\xe5\x62\xbc\x8f\x07\xc5\xde\xe8\x26\x21\x8a\x2e\x3d\x0a\xc3\xa1\x7f\x8c\x67\x7f\xdd\xbe\x95\xac\xb0\xb5\x7e\xba\x8c\x96\xdf\x45\x50\x29\x4b\x47\x5b\xce\xfe\xb6\x6c\x25\x7c\x31\x13\xde\xbe\x4f\x11\xa0\xc1\xdc\xf8\x53\x07\x7e\xa9\xb6\x15\x1c\x9c\xbd\x7d\xf4\x54\x52\x92\x13\xf7\xae\x42\x47\xf9\xe1\x15\xd2\x04\x7b\xae\x5e\xe5\x0b\x0b\x9f\xc1\xe7\x3a\x78\xf3\x5d\xf9\xd7\x4b\x40\x96\xfb\x40\xc8\xc2\xc0\xb5\x01\x0b\x7c\x3d\xa6\x01\x17\xcc\x7a\x80\xaf\x0b\x8e\x84\x98\x6d\xc5\x74\x88\x95\x00\x9e\xce\x5a\x78\xa3\x1d\x80\x5a\xb8\xd9\x85\xae\xa6\x44\x0d\xa1\x8a\xf2\x8e\xb4\x87\xb2\xc8\xd0\xa6\x84\x82\xcf\x13\xcb\x39\x69\x4f\x70\x17\x32\x01\x30\xa1\x05\x25\x87\xe6\x8a\xa0\x5d\x70\x45\xcd\x65\x77\xea\x34\xa6\x78\xca\x56\x10\xbf\x33\xfe\xe8\x0f\x3f\x94\x0c\xc2\x7f\x87\x57\xac\x2b\x3f\x8e\x0f\x17\xc0\xe3\x99\x9d\xeb\xdf\x12\x21\x20\xa3\x16\xeb\x12\xac\xc5\xcc\xa7\x5b\x1f\x9a\x14\xd9\x68\x66\xb0\xb0\xb9\x64\xf8\x4e\xc9\xcf\x48\xe3\xae\xb2\xe8\xc5\xc0\x11\x75\xeb\xf7\xd1\xc3\x7c\x59\x44\xec\x58\xcc\x6a\x49\x99\x2a\x6f\x28\xb1\x32\x8d\xbc\xfc\x62\xfa\x42\xa5\x13\x00\xc2\x94\xfd\x88\xf9\x04\x50\x2a\x7d\x6e\x01\x32\xa6\xe6\xf3\x05\x7b\xd8\xa8\x58\x2c\x21\x1b\x1d\x9f\x98\x51\x32\xc6\x6f\x50\xad\x05\x41\x43\x89\xf8\x62\x61\x61\xf9\xc4\xe5\x1f\xc0\xcc\x6b\x84\xc9\xb5\xce\x93\xbe\x59\x00\x9b\x31\x37\x92\x99\x57\x3d\x06\xdc\xcf\xeb\x9c\x9e\xe2\x73\xb4\xd8\x18\xeb\xc9\x9b\x6c\x86\x00\xdb\xf2\x17\x6b\x93\x01\xe7\x65\x04\x9e\x60\x75\x98\x8c\xef\xf1\x18\x8d\x55\x2b\x0f\x3a\x3a\x74\x9f\xf7\xcb\x6c\xf6\xb5\x30\x3a\x82\xef\x12\x2a\x95\x38\x63\xc3\xf8\xc2\xdd\x4a\x2a\x73\x0a\xf1\xe6\x3c\x69\x80\xae\x91\xb4\x46\x64\xbb\x1d\xe3\x4e\xa1\x51\xa3\xee\x7e\x21\xe0\x84\x0f\x11\x5e\xd6\x32\x60\xac\x2f\x9c\x13\x96\x39\x9a\xfa\xa0\x56\x16\x0e\xf3\x42\x03\x96\x26\x77\xa4\xe0\x09\x89\x0f\x00\xf0\x6c\x50\xbe\x91\x27\x8c\x05\xd0\x73\x0d\x32\x48\xe8\xc6\xb8\xea\x19\x4d\x45\xd6\x3c\xdc\xda\x98\x8f\x17\xee\xf8\xf1\x52\xbd\x85\x98\x72\x96\x7d\x2c\xb3\xcf\x1b\x57\x87\x08\xa0\x59\x69\x03\x0f\xd7\x5f\xa7\x5a\x00\x66\x59\x6a\x5d\xad\x34\x48\x3c\x7a\x5e\xf9\x8d\xa6\x13\xb9\x7f\xde\x82\xf7\x31\xb6\x3b\xfa\x49\x5f\xf7\x70\x2b\xf2\xa4\x58\xc8\xa7\xd8\x7c\x7f\xc6\x1a\x08\xc4\xfe\xd8\xfb\xb7\x33\x50\xd4\x33\xd8\xcb\x11\x10\x4d\xf9\x4d\x2e\x03\xcf\x04\xc1\x2d\x66\xf2\xef\x1e\x85\x6d\xd9\x9f\xa6\x35\xe5\x56\x08\x3c\xf9\xd6\x4e\xaf\xf1\xfd\xa8\xdb\x0d\x63\xa7\xbc\x50\x41\x28\xf5\x9a\x5d\x85\x27\x39\xb9\xc9\x1f\x4c\xdc\x0d\x08\x58\xaa\x09\x97\xeb\x9d\x48\xf4\x49\x39\xdf\x5c\xec\x02\xa8\x2c\xdc\x77\x36\x5f\x03\x82\x1d\xc6\x48\xea\xc6\x25\x84\x59\x42\xa8\x67\x0e\xe7\x93\x0d\xaf\x70\x24\xab\xb0\x41\x82\xca\x0c\x67\x1b\x07\xe0\x30\x37\xfd\x20\xf6\xcc\x4b\xb3\xa3\xdf\x9e\x74\x47\x9a\x3c\x4e\xcf\xc2\x4f\x24\x9d\xdd\x9b\xc8\x9c\xcf\x28\xbc\x79\x27\x1d\xc1\x3a\x71\x2f\x0d\x1f\x0c\xbb\xbe\xdb\xc9\x9b\x99\x39\x20\xf9\xc8\xa3\x73\xb2\xfe\xa2\x28\x86\x14\x4c\x6d\x46\xe1\xcc\x70\x79\x6a\x48\x02\x3c\x73\x64\x00\x4c\x8f\x30\x1a\x2c\x04\x9c\xff\x46\x21\xcc\xf7\x8f\x44\x82\xb7\xa1\x56\xc5\x53\x8d\xcb\xd9\x95\xfd\xe1\x54\xe3\xa2\x20\x4f\x64\xd0\xed\xa8\x62\x0c\x5b\x92\x0f\xb7\x39\x87\x9c\x77\xd3\xfb\xcc\xe2\x17\x36\x45\x70\x4e\xd0\x2d\xa5\xa4\xd7\x0d\x5d\xfb\xf1\x0d\x40\x8a\xa1\x93\x39\x31\x3a\x76\xa7\x36\xdc\x4b\x07\xde\x81\x45\x4a\x40\x77\xbf\x27\xf7\x14\x01\x5b\xe9\x97\x86\xbf\x53\xa8\x1c\xf3\xeb\xda\x85\xeb\x64\x53\x48\x6e\x46\xbe\xdb\x88\xe5\x15\x58\x4f\xeb\x99\xce\xbe\x7a\x48\xea\x11\x28\xc9\x0c\x35\x3d\x7f\xab\xaf\xfa\x9e\xc3\xf7\x28\x87\x9a\x20\x7e\x12\x31\x5a\x85\x48\x40\x1f\x08\xb8\xa2\xc7\xbd\xa2\xc3\x39\xda\xf2\x07\xc6\x02\x56\x71\x37\xe5\xba\x01\xc4\xe1\x87\x19\xde\xfe\x06\xf1\xfb\xab\xa5\xe5\xf6\x63\x73\xf3\xc2\x6d\x1b\x0f\x38\xdb\xe5\x02\xd1\x4c\x18\x2e\xd2\x88\xa2\x5a\xdd\xeb\x03\xfb\xd2\xe7\xf3\xa7\x8d\xf0\x18\x7b\x11\xc4\xe7\xfb\x7c\x45\xd4\x5f\x8d\xd8\xd2\x5e\xa1\x78\xdf\xdd\x5a\x94\x15\xe3\x7d\xb7\xd7\x60\x5a\xfd\x73\x3a\x42\x6d\xb0\xad\x9f\x23\xf2\xe7\x62\x17\x52\xa5\x76\x5c\x50\x5e\xf4\x8c\x01\x42\xec\xf4\x35\x7a\x1c\xf0\xc8\x07\x49\x85\xdb\xef\x2d\x7c\xe1\x70\x77\xfd\x8d\x15\xf8\x5b\x11\x1f\x38\x8f\x6e\xf0\xac\xbe\xba\xb9\x97\xe8\x39\x2e\x69\x5e\xc7\x8c\x03\xac\x9c\x3a\xcf\xe3\x65\x09\x70\x08\x8e\xcb\x6f\x13\x27\x83\x3d\x52\x36\xf6\x92\xe4\xc0\x89\x18\x60\x3b\xdf\x1b\x67\x98\xfb\x31\x86\x7d\xc8\x42\x3e\xa6\x86\x6c\x7f\x11\xb5\xc9\xd6\x16\x17\x45\x2b\xf5\xbd\x13\x07\xfb\xd3\x69\x1d\xe0\xab\xdf\x50\xbd\x4e\xbb\x8c\x0b\xfd\x6a\x12\x7f\xdf\x3e\x1b\x2e\xd5\xd6\x7a\xcd\xf7\x77\xde\x25\xfc\xb8\x6b\x4e\xcf\xf8\x5f\x6a\x5a\x68\x3f\x23\x53\x45\xac\xf8\x8a\x0c\x13\xf1\xf9\xaa\x1b\x8c\x32\x04\x98\xdb\xff\xa5\xf2\x68\xd4\x3d\x6b\x34\x50\xab\x69\xfa\x6a\x3f\xc5\x9c\xae\x94\x35\xcc\xae\x20\x12\xa3\x16\x6d\x38\x5b\xa3\x50\xf6\x2d\x9b\x62\xe2\x07\xf6\xf3\x31\x33\x89\xf2\xc5\x9e\x43\x62\x17\xe4\x91\x06\x70\xda\xcf\xb2\xd3\xa7\xf9\xfd\x09\xb1\x2e\x23\xf6\xa7\x71\x37\x1b\x41\x06\xde\x51\x5f\xe2\x9a\x2c\x0c\xc5\xa5\x85\x41\x92\xfa\x99\xc2\x22\xdb\xdc\xf9\xd1\xaa\xf5\xc5\x52\x55\xba\x7f\x93\x33\xe5\x5a\xb1\x0c\xbd\xc9\x1b\x89\x77\x7e\xaf\x8f\x17\xc9\xcf\x91\x64\x63\x70\xae\xb4\xc1\xae\x05\x81\x2a\xea\x6b\x90\x01\x2a\xc7\x58\x45\xa8\x29\x58\xf7\x2c\x69\x13\x2d\x02\x00\x72\xc0\xf8\xf8\xc5\x0a\x23\x56\x80\x5f\x8a\x5f\xf7\x76\xe6\x8a\x42\xc5\x2e\xb0\x42\xce\x41\xa1\xcd\x8c\x78\xbd\x0a\x6e\x71\x65\xf0\xa6\x42\xb2\xfc\x53\x8c\x6f\x55\xab\xe4\x66\xb9\x9f\x4c\x02\x05\x87\xa3\xc7\xcd\x63\x5e\x2a\xf2\xa8\x88\xe2\x82\xf5\x85\x9f\x8a\xcf\xd7\x6e\xeb\x84\x26\xe6\xe1\x59\x27\x9f\x5f\xde\x88\xe5\x5b\x07\x05\x51\x3b\xc5\xe6\x6d\x60\x2a\xb0\x97\x6c\xb5\x4a\x75\x6a\xdf\x55\x3f\x38\xe5\xce\xae\x9f\x6b\x4f\xa3\xc8\xf6\x6b\x6b\x2c\x4c\x92\x33\x84\xef\xc8\xa4\x39\xce\x44\x6d\xd8\x32\xc8\xea\x9e\x48\x10\x13\x3a\x40\x42\xea\x48\x81\x40\xdd\x97\xfb\x86\xc1\x3e\xa5\x89\xb2\x0a\x61\x1a\xf6\x6f\x1a\x14\xc6\x1b\x5f\x26\x81\x90\x84\x7b\xf7\xa5\xaa\x37\x5f\xcb\x2d\x26\x5b\x7c\xe0\x8a\x77\xc0\x1b\xde\xe2\x88\x6c\xb7\xe2\x6b\x32\x2f\x42\xfa\x36\x50\x83\x27\xd8\x8e\xbd\x77\x5d\xf9\x59\x26\xfe\x35\xff\xf8\xbb\xd2\xda\x97\x08\xe0\xbd\x6d\x9f\x84\x58\xc2\xf3\xf9\x74\x62\xc8\xa6\xd8\xa1\xbe\x36\xc0\xab\x19\x21\x23\x4a\x99\x10\xdc\xd6\x1d\x12\x95\xc1\x1a\xa2\x54\x07\x6f\x7f\xd9\xdb\xe6\xca\x08\x00\x54\x24\x20\x6f\xf9\x67\xcf\xb8\x6a\x56\x43\xa8\xc0\x5c\x31\x72\x09\x87\xcb\x4d\x1e\xd2\xb2\xe3\xde\x44\xd2\xc1\x7d\x1e\xc1\x2d\x34\x53\x52\xb5\xf1\x05\xf0\x08\x6f\x9b\x30\x2e\x37\xc5\xdf\x6b\x81\xfe\x1a\x4a\xa3\x9c\xa9\x8a\x3d\xbe\xf1\xdd\x24\x59\xb8\x36\x07\x9c\xe5\xfe\x41\x78\x10\x98\xbc\x00\xc7\x69\x77\x0a\xa3\xec\x11\x00\x36\x59\x03\x44\xfd\x64\xda\x69\x24\x8b\x81\x98\x83\x6c\x67\xf4\x66\xc4\xe3\xd3\xf8\xe6\x5a\x8d\xf2\x66\xec\x77\xc3\x12\x03\x8e\x02\xd6\xa9\x00\xf1\x6d\xf1\x2e\x11\xea\xbf\x13\x4e\x7c\xb1\x50\x1f\x07\x44\x39\xd3\x05\x4c\xd0\x70\x2e\xa7\xec\x0b\x19\xe5\x56\xa3\x68\x32\x6e\x82\x4d\x72\x08\xcc\xf5\x9e\x5a\x2d\x3b\x19\x53\x06\xc0\x92\x7d\x78\x06\x09\x7e\x83\x87\x65\xcf\x63\xb9\x1e\xe4\xa2\xbe\xcf\x25\xf1\x1a\xec\x0c\x69\xf4\xfc\xc1\xc4\xfd\xa0\x15\x32\xbf\xa2\x7f\xf3\x60\x9b\xd7\x20\x51\xc0\x0b\x72\xd3\xf3\xb0\x5f\x84\x0c\x40\x6c\xb7\x83\x9d\xe8\x79\x99\xff\x8c\x7f\xef\x12\x9e\xf9\x5f\x9a\x6a\xef\x53\x14\x69\x07\xac\x59\x39\xf9\xe0\x3a\x50\xb9\xeb\x07\x5e\x83\xc9\xec\x43\x51\x1f\x4f\xf7\xb1\x6d\x38\x7b\xa1\xaf\x2b\x25\xdf\xc4\x6f\x8a\x0f\x6c\x50\x6d\x46\x6f\x4b\xd3\x61\x45\xb3\x7d\xdf\xa0\xe6\x8e\xe7\xdf\x97\x29\x36\xa0\xa9\xb5\xe0\x99\x38\x7a\x42\x1b\x8f\x6a\x7f\x1d\x03\x46\x2a\x57\xca\x78\x7c\xa3\x49\x02\x19\xe6\xba\xf4\xa2\x7b\x0d\xcf\xa0\xdc\x18\xb8\xcd\xd7\x49\xb0\xe9\xc0\xe2\xfa\xb3\x6f\xdf\xc7\xfa\xdc\x67\xf5\x17\x48\x39\x93\xd4\xe9\x54\xbf\xdf\x73\x0f\xee\x05\xac\x43\x18\x91\xa2\xd5\x20\xbf\x56\x6d\x0c\xde\x92\x6d\xfe\x72\x4e\x99\xea\xaa\x83\xc1\x9a\x86\xc3\xcc\x95\x3b\xd8\x9f\x50\x13\x18\x18\xf6\x1b\x36\x4d\xe1\x4b\xec\x4f\xd1\x8a\x31\xb1\xfe\x39\xd6\xc7\x9d\x1a\x95\x2a\xe9\x08\x9c\x0f\xa0\xdc\x78\x70\x16\x12\xd1\x01\x6c\x41\x2c\x38\xcb\x77\xf7\x23\x4b\xfd\x67\xea\x34\x16\x3c\x0c\xa6\x51\xc0\xb6\xf0\x7c\x33\x41\x78\x8f\x0c\xbf\x2e\xb5\xad\x81\xf3\x91\xc7\x06\x85\x3a\x1a\x2c\x1f\x6b\xc0\xb5\xde\x39\x26\xb1\x01\x2b\x75\x47\x3a\xc0\x61\x11\x6c\xfc\x71\x25\xc4\x87\x39\xff\x32\x0a\x3c\x2f\x05\x6f\x73\xe6\xaf\xf3\x39\x74\xe1\x73\x69\xac\x01\xe5\x24\xce\x65\x48\xe8\xdb\x77\xd5\x6a\x92\x5b\x94\x6b\x63\x21\xa3\x81\xf3\x49\x0a\x33\x18\xc5\x70\x15\x7a\x46\x2a\xb1\x8c\xb5\x66\x58\x13\x5b\x62\x6c\xe6\x5b\x87\xdd\xf5\xb7\xdf\x5d\xaf\xe6\xa2\xf6\x2f\x6f\x86\xbd\x57\xa8\x58\x62\xcb\xcf\x11\xce\x0f\x55\x55\x7d\xab\x42\x7a\x96\x22\x28\x40\xaf\xc9\x1c\x44\x4b\xff\xb8\xdd\x84\x57\xf5\x37\x6b\xb7\xa2\xd6\x57\x41\xca\xfc\x89\x66\x18\x8f\x3c\x67\x76\x02\x60\x06\x5c\xb4\x54\xe7\x14\xba\xf2\x7f\x7d\x56\x6f\xd2\x34\xcf\x0e\xe6\x0e\x7c\x36\x5b\x81\x7d\x13\xaa\x03\x50\x45\x89\x39\x45\x85\x2d\x6a\x01\xa0\x44\xbe\xc1\x48\x8c\x6c\x35\x3b\x8a\xd4\xfd\xd0\x04\x16\x71\xc0\x92\x1b\xd6\xd3\x7c\x1d\xb4\x6c\xd5\x8c\x5a\xb7\x89\xac\x4e\xd9\xa3\xcf\x1e\x48\x96\xcf\x84\xd0\x92\xf1\xd2\xe2\xf2\x9e\x58\x4f\xf0\x7b\x46\x88\xa3\x49\x15\xbf\x78\x14\xf8\x3f\x0e\xa9\x7a\xd8\x24\x85\x34\xe8\xfe\x7d\xdf\x7b\xc9\xe8\x60\x6c\x04\xe0\x3f\x1d\x3e\x5b\xdb\xde\xc0\x43\xab\x2e\x1e\xdc\x71\x58\x9f\x63\x3d\x3d\xd1\x0c\x50\xa2\x96\x71\xda\x6b\x2c\xd7\x83\xf9\xbd\x6c\x66\xe1\x50\x53\x4c\x93\xff\xce\x14\x04\x8f\x67\x58\x5a\x02\x41\x16\xf8\x64\xf3\x43\x69\x03\x14\xaf\x60\x4d\x9a\xff\x6b\xde\x6d\x62\x1a\xc0\x9b\x64\x7b\x7b\x00\x10\xdc\xcc\xe4\x8e\x98\x25\xfa\xc3\xbe\xbf\x14\x58\x14\xe6\xc9\x30\x2d\x7c\x4c\x38\xc2\xbf\xab\x79\x0a\xb9\x31\xe2\xc8\x2f\xf7\x3c\x0c\x58\x2a\x01\x75\x59\xad\xfe\x17\xa8\x7f\x47\xf9\xdb\x97\x12\xf6\xfb\xd9\x4f\x27\x87\x1a\x80\x8f\xc3\xb9\x41\x32\x79\x22\xb2\x28\x59\xdf\x78\xb9\x7e\x38\xcc\x9b\x43\x33\xbc\xef\xa9\x54\x4e\xae\x96\xdc\xf7\x42\x13\xbf\xe9\xed\xf6\x7a\xa0\x70\x40\x0f\xc0\x08\x66\x4d\xad\x3a\xac\x19\xc2\xd3\x95\x6a\xb8\x03\x38\x90\x75\x18\xa0\x12\x04\x5f\xbc\xa7\xe1\x6f\xf4\x90\x3e\xd9\x04\x3c\x8f\x69\xf6\x29\x7b\x29\x8a\x1a\xb6\x7a\xdd\x5d\x34\x03\xf5\xc2\x39\x3c\x5d\x82\x45\xc3\xcc\x03\x31\x0f\x38\x43\x1f\xdc\xbb\x81\x4c\x06\xbd\x45\x63\xa3\x1e\xea\xef\x6d\xbe\x19\xd2\x1d\x45\x19\x6f\x23\x60\xf3\x7c\xc0\x81\x0b\x4c\x0b\x59\x01\xb1\x71\x18\xfd\x16\xf3\x27\x53\xbd\xc3\xf2\x2e\xed\x9f\xc6\x79\x6c\x9e\xec\x1d\x96\x72\x81\x27\x7f\xce\xb7\x0f\xec\x69\x56\xe0\x57\x59\x1c\xa2\x8a\x27\x5b\x51\xb8\x6e\xb9\xc0\x59\x97\x9e\xa8\x3b\x33\xc4\x34\x12\xe9\x4f\x12\x4b\xba\xa3\xf8\xa9\xe4\xfe\x0e\x0b\x42\x65\x98\x70\x2a\x48\xa8\xc6\x4f\x26\x3c\xd7\x2a\x76\xd8\x6c\x24\x91\x40\xed\x21\xe0\xfc\x28\x75\xc8\xa7\x91\x01\x7b\x14\x04\x2a\x98\xf2\x8c\x7c\xbc\x09\x09\x43\x90\x12\xef\x63\xc2\x8e\x04\x38\xb3\xb0\x3f\x55\x60\x7a\x6f\x08\x3c\x6c\xf3\xa2\xa8\x50\x9f\x09\xf6\x6c\xc1\x36\x5b\xea\x90\xc0\x6b\x97\x50\x9b\x8a\x9c\xc1\x35\x4b\x6d\xb9\xdf\xf8\x59\xa6\x90\x37\x9a\x2f\x80\x31\xe4\x74\xc1\xf1\x2d\x0e\xdb\x8c\x5a\x58\x9a\xf4\x97\xfe\xab\x42\xfc\xc9\xed\xd0\x8b\xe2\xb1\xa4\x7b\xf7\xef\xed\x76\x7f\xd2\x8a\xf5\x14\x5d\xd8\xdf\xc5\x9b\x76\x2c\x95\x3f\x5c\xf7\x81\xfb\xd4\x6b\xf7\xd4\xbf\x2f\x09\xc7\xee\x37\xf9\x28\x60\xcd\x3c\x1c\xbb\x4f\x70\x36\x1c\xc3\x0a\x9e\x36\x19\xc7\xcd\x80\x35\xf5\x0b\x92\x00\x98\xa1\xe9\xa5\x06\xec\x74\xd8\xf6\x02\xad\x68\x4e\xe2\x13\x66\xf2\x3e\x05\x34\xe3\xa2\x81\x87\x91\xcd\x68\xff\x06\x58\x2a\x25\x59\xdd\xc0\x80\xf0\x00\x7f\x17\xfc\xb4\xfb\xe7\x23\x79\x13\x1a\x71\x66\xc3\xc3\xb3\xbf\xe3\x93\x9b\x52\xfd\xc1\x62\x9d\x00\x70\x52\x77\x3e\x84\xe6\x3c\xe1\xf9\xf7\xeb\xfe\x00\x78\xed\x41\xc1\x89\x85\x03\x78\x0d\xce\x8b\xfa\x9b\xc4\x16\xe7\x4d\x04\x30\x33\x8d\x38\x3f\xfb\x8d\xde\xa1\x66\x3d\x9c\x89\xf9\x37\xc1\x0f\xfc\x96\x96\xae\x62\x5f\x5c\x12\x0a\x9b\xcd\x9b\xb1\x94\x85\x02\xec\x16\xf0\x88\x4e\x43\x8a\x14\xec\x46\x74\xdb\x69\xfd\xe2\x60\x1a\x96\xf4\xce\x8f\xdd\x14\xb4\xf9\x37\x3a\xd2\x05\x20\xbd\x08\x0a\xd8\xc3\x2f\xf7\x48\x07\x3b\xee\xff\x06\x57\xbf\xe1\x7c\x5e\xb0\x86\x37\xc5\xfb\xba\xe0\x35\x58\xb7\xf7\xae\xc6\x11\x4e\x25\xad\x93\x4f\xb2\xdc\x6f\x23\x25\xb5\x4d\x13\x0b\xf7\x66\xd4\x33\x19\xae\xaf\xf3\xe1\x76\x60\xfe\xcf\xd7\xef\xd9\x7a\x6d\x24\x5f\x0c\xff\xf8\x75\xc6\x99\xb2\xca\x35\xa3\x2a\x8b\xf4\xf0\x8c\x60\x16\xef\xae\xdb\xbc\x5a\x71\xc8\xbd\xe6\x2f\xe0\xcd\xbf\x1f\xb8\x25\x52\xc5\x04\x23\x63\xff\x3c\x39\xaf\xff\x39\x00\x55\x80\xf1\x09\x2e\xa6\xff\x63\xae\xd8\xe2\xc0\x27\x08\x93\x89\xaf\xf9\x65\x05\xe2\x1b\x08\x31\x99\x29\x50\x4f\x11\xde\x83\xb3\x01\xb1\x2f\x0f\x7e\xb4\x64\x41\xb9\xa0\x86\x2e\x81\xdd\x03\x00\x87\x07\x5e\xf7\xf8\x2d\xcf\x57\x27\x46\x7e\xd4\x84\x81\x99\x17\xf0\xe3\x33\x8b\x48\xd6\x89\xd6\xc9\x04\x59\xf2\x63\xf1\x5c\x51\xf8\x72\x68\xf7\x7e\x77\xbe\xeb\x79\x96\x0b\xaf\xfd\x4f\x5b\xc5\xbb\xc3\x04\x62\x36\x3e\x00\xc2\x7e\xdf\xef\x80\x32\x83\xeb\xb5\x30\xa9\xf6\x46\x18\x88\xea\x18\x63\x3f\x61\x02\x22\x31\x00\xb8\x93\x3a\x5a\x0d\x7e\xa6\x93\x72\x99\x08\x88\x55\x96\xff\xb6\x1e\xe0\x6a\x1b\x39\xe3\x9e\x4b\x13\xc5\xde\xf3\x35\xb6\xff\x14\x28\x8e\xd3\x74\x6c\x26\x8d\x3e\x78\x41\x85\xff\xfd\xa9\xb8\xf1\x53\xf0\x2c\x04\x38\xcb\x9a\x09\xac\x25\xdd\x19\xf6\x4f\x7e\xb1\x84\x01\x84\x07\xce\xbd\x7e\xcd\xaf\x1b\xf7\x4d\x6a\x0a\xd6\x65\xff\xbf\xc7\xfe\x84\xfd\x1c\x01\xd5\xdd\xb4\x1b\x1c\xc2\x91\x7e\x6e\xff\xf2\x78\x7c\xac\xeb\x7c\xde\xfe\xed\x21\xfc\x9e\x5a\x22\xdf\xfe\xf5\xef\x9e\xb7\x3c\x0c\xf6\xf4\xdf\xfe\xcc\xf8\x58\xc7\x9c\xde\xff\xf5\xa5\xcf\x9d\x2e\x8b\xfb\xfe\x6f\x7f\x46\xdf\x65\xe9\xd8\xff\xf5\x2b\xc0\x96\x6a\x45\x4e\xfe\xff\xbf\x33\xfd\xcf\x77\xfe\xe7\x3b\xff\x1b\xdf\xb9\x61\xc5\x84\x94\x4d\x60\x2c\x72\x4b\xfc\xfe\x5e\xb5\x01\x2a\xb0\xde\xf4\x23\x7c\xbd\xfe\xf7\xff\xf8\x9f\xff\xeb\xbf\xfe\xcf\x7f\xfd\xdf\x00\x00\x00\xff\xff\xbb\x94\x2f\x4d\xe9\x06\x02\x00") func pagesAssetsStylesContainersCssBytes() ([]byte, error) { return bindataRead( @@ -245,7 +245,7 @@ func pagesAssetsStylesContainersCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "pages/assets/styles/containers.css", size: 132791, mode: os.FileMode(416), modTime: time.Unix(1462822029, 0)} + 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 } diff --git a/vendor/github.com/google/cadvisor/pages/templates.go b/vendor/github.com/google/cadvisor/pages/templates.go index 7d50590316..5589567358 100644 --- a/vendor/github.com/google/cadvisor/pages/templates.go +++ b/vendor/github.com/google/cadvisor/pages/templates.go @@ -98,7 +98,7 @@ func pagesAssetsHtmlContainersHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "pages/assets/html/containers.html", size: 9533, mode: os.FileMode(416), modTime: time.Unix(1462817463, 0)} + 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 } diff --git a/vendor/github.com/google/cadvisor/utils/cloudinfo/azure.go b/vendor/github.com/google/cadvisor/utils/cloudinfo/azure.go index 7ac6d55538..2581d63d11 100644 --- a/vendor/github.com/google/cadvisor/utils/cloudinfo/azure.go +++ b/vendor/github.com/google/cadvisor/utils/cloudinfo/azure.go @@ -34,7 +34,7 @@ func onAzure() bool { return strings.Contains(string(data), MicrosoftCorporation) } -//TODO: Implement method. +// TODO: Implement method. func getAzureInstanceType() info.InstanceType { return info.UnknownInstance } diff --git a/vendor/github.com/google/cadvisor/utils/cloudinfo/cloudinfo.go b/vendor/github.com/google/cadvisor/utils/cloudinfo/cloudinfo.go index ad4ce5abe4..22cf6f6b0f 100644 --- a/vendor/github.com/google/cadvisor/utils/cloudinfo/cloudinfo.go +++ b/vendor/github.com/google/cadvisor/utils/cloudinfo/cloudinfo.go @@ -97,7 +97,7 @@ func detectInstanceID(cloudProvider info.CloudProvider) info.InstanceID { return info.UnNamedInstance } -//TODO: Implement method. +// TODO: Implement method. func onBaremetal() bool { return false } diff --git a/vendor/github.com/google/cadvisor/utils/cloudinfo/gce.go b/vendor/github.com/google/cadvisor/utils/cloudinfo/gce.go index 4c2e330dfe..b525451c05 100644 --- a/vendor/github.com/google/cadvisor/utils/cloudinfo/gce.go +++ b/vendor/github.com/google/cadvisor/utils/cloudinfo/gce.go @@ -20,8 +20,8 @@ import ( info "github.com/google/cadvisor/info/v1" + "cloud.google.com/go/compute/metadata" "github.com/golang/glog" - "google.golang.org/cloud/compute/metadata" ) const ( diff --git a/vendor/github.com/google/cadvisor/utils/tail/tail.go b/vendor/github.com/google/cadvisor/utils/tail/tail.go index 0219b3fb50..2d04f3fc03 100644 --- a/vendor/github.com/google/cadvisor/utils/tail/tail.go +++ b/vendor/github.com/google/cadvisor/utils/tail/tail.go @@ -88,7 +88,7 @@ func (t *Tail) attemptOpen() error { t.file, err = os.Open(t.filename) if err == nil { // TODO: not interested in old events? - //t.file.Seek(0, os.SEEK_END) + // t.file.Seek(0, os.SEEK_END) t.reader = bufio.NewReader(t.file) return nil } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/SPEC.md b/vendor/github.com/opencontainers/runc/libcontainer/SPEC.md index 32578f01a3..e5894c6429 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/SPEC.md +++ b/vendor/github.com/opencontainers/runc/libcontainer/SPEC.md @@ -71,7 +71,6 @@ that are required for executing a container's process. | /dev/tty | 0666 | rwm | | /dev/random | 0666 | rwm | | /dev/urandom | 0666 | rwm | -| /dev/fuse | 0666 | rwm | **ptmx** diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/cgroups.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/cgroups.go index 274ab47dd8..35fc8eb961 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/cgroups.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/cgroups.go @@ -37,7 +37,7 @@ type Manager interface { // restore the object later. GetPaths() map[string]string - // Set the cgroup as configured. + // Sets the cgroup as configured. Set(container *configs.Config) error } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/apply_raw.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/apply_raw.go index ed46561a25..9692e4fb23 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/apply_raw.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/apply_raw.go @@ -104,6 +104,8 @@ func (m *Manager) Apply(pid int) (err error) { if m.Cgroups == nil { return nil } + m.mu.Lock() + defer m.mu.Unlock() var c = m.Cgroups @@ -128,8 +130,6 @@ func (m *Manager) Apply(pid int) (err error) { return cgroups.EnterPid(m.Paths, pid) } - m.mu.Lock() - defer m.mu.Unlock() paths := make(map[string]string) for _, sys := range subsystems { if err := sys.Apply(d); err != nil { @@ -195,18 +195,10 @@ func (m *Manager) Set(container *configs.Config) error { if m.Cgroups.Paths != nil { return nil } - for _, sys := range subsystems { - // Generate fake cgroup data. - d, err := getCgroupData(container.Cgroups, -1) - if err != nil { - return err - } - // Get the path, but don't error out if the cgroup wasn't found. - path, err := d.path(sys.Name()) - if err != nil && !cgroups.IsNotFound(err) { - return err - } + paths := m.GetPaths() + for _, sys := range subsystems { + path := paths[sys.Name()] if err := sys.Set(path, container.Cgroups); err != nil { return err } @@ -223,14 +215,8 @@ func (m *Manager) Set(container *configs.Config) error { // Freeze toggles the container's freezer cgroup depending on the state // provided func (m *Manager) Freeze(state configs.FreezerState) error { - d, err := getCgroupData(m.Cgroups, 0) - if err != nil { - return err - } - dir, err := d.path("freezer") - if err != nil { - return err - } + paths := m.GetPaths() + dir := paths["freezer"] prevState := m.Cgroups.Resources.Freezer m.Cgroups.Resources.Freezer = state freezer, err := subsystems.Get("freezer") @@ -246,28 +232,13 @@ func (m *Manager) Freeze(state configs.FreezerState) error { } func (m *Manager) GetPids() ([]int, error) { - dir, err := getCgroupPath(m.Cgroups) - if err != nil { - return nil, err - } - return cgroups.GetPids(dir) + paths := m.GetPaths() + return cgroups.GetPids(paths["devices"]) } func (m *Manager) GetAllPids() ([]int, error) { - dir, err := getCgroupPath(m.Cgroups) - if err != nil { - return nil, err - } - return cgroups.GetAllPids(dir) -} - -func getCgroupPath(c *configs.Cgroup) (string, error) { - d, err := getCgroupData(c, 0) - if err != nil { - return "", err - } - - return d.path("devices") + paths := m.GetPaths() + return cgroups.GetAllPids(paths["devices"]) } func getCgroupData(c *configs.Cgroup, pid int) (*cgroupData, error) { diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpu.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpu.go index a4ef28a60f..7cd506a8ec 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpu.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/fs/cpu.go @@ -22,10 +22,48 @@ func (s *CpuGroup) Name() string { func (s *CpuGroup) Apply(d *cgroupData) error { // We always want to join the cpu group, to allow fair cpu scheduling // on a container basis - _, err := d.join("cpu") + path, err := d.path("cpu") if err != nil && !cgroups.IsNotFound(err) { return err } + return s.ApplyDir(path, d.config, d.pid) +} + +func (s *CpuGroup) ApplyDir(path string, cgroup *configs.Cgroup, pid int) error { + // This might happen if we have no cpu cgroup mounted. + // Just do nothing and don't fail. + if path == "" { + return nil + } + if err := os.MkdirAll(path, 0755); err != nil { + return err + } + // We should set the real-Time group scheduling settings before moving + // in the process because if the process is already in SCHED_RR mode + // and no RT bandwidth is set, adding it will fail. + if err := s.SetRtSched(path, cgroup); err != nil { + return err + } + // because we are not using d.join we need to place the pid into the procs file + // unlike the other subsystems + if err := cgroups.WriteCgroupProc(path, pid); err != nil { + return err + } + + return nil +} + +func (s *CpuGroup) SetRtSched(path string, cgroup *configs.Cgroup) error { + if cgroup.Resources.CpuRtPeriod != 0 { + if err := writeFile(path, "cpu.rt_period_us", strconv.FormatInt(cgroup.Resources.CpuRtPeriod, 10)); err != nil { + return err + } + } + if cgroup.Resources.CpuRtRuntime != 0 { + if err := writeFile(path, "cpu.rt_runtime_us", strconv.FormatInt(cgroup.Resources.CpuRtRuntime, 10)); err != nil { + return err + } + } return nil } @@ -45,15 +83,8 @@ func (s *CpuGroup) Set(path string, cgroup *configs.Cgroup) error { return err } } - if cgroup.Resources.CpuRtPeriod != 0 { - if err := writeFile(path, "cpu.rt_period_us", strconv.FormatInt(cgroup.Resources.CpuRtPeriod, 10)); err != nil { - return err - } - } - if cgroup.Resources.CpuRtRuntime != 0 { - if err := writeFile(path, "cpu.rt_runtime_us", strconv.FormatInt(cgroup.Resources.CpuRtRuntime, 10)); err != nil { - return err - } + if err := s.SetRtSched(path, cgroup); err != nil { + return err } return nil diff --git a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/utils.go b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/utils.go index d43270032c..8946dd5959 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/cgroups/utils.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/cgroups/utils.go @@ -139,7 +139,7 @@ func (m Mount) GetThisCgroupDir(cgroups map[string]string) (string, error) { return getControllerPath(m.Subsystems[0], cgroups) } -func getCgroupMountsHelper(ss map[string]bool, mi io.Reader) ([]Mount, error) { +func getCgroupMountsHelper(ss map[string]bool, mi io.Reader, all bool) ([]Mount, error) { res := make([]Mount, 0, len(ss)) scanner := bufio.NewScanner(mi) numFound := 0 @@ -166,7 +166,9 @@ func getCgroupMountsHelper(ss map[string]bool, mi io.Reader) ([]Mount, error) { } else { m.Subsystems = append(m.Subsystems, opt) } - numFound++ + if !all { + numFound++ + } } res = append(res, m) } @@ -176,23 +178,25 @@ func getCgroupMountsHelper(ss map[string]bool, mi io.Reader) ([]Mount, error) { return res, nil } -func GetCgroupMounts() ([]Mount, error) { +// GetCgroupMounts returns the mounts for the cgroup subsystems. +// all indicates whether to return just the first instance or all the mounts. +func GetCgroupMounts(all bool) ([]Mount, error) { f, err := os.Open("/proc/self/mountinfo") if err != nil { return nil, err } defer f.Close() - all, err := ParseCgroupFile("/proc/self/cgroup") + allSubsystems, err := ParseCgroupFile("/proc/self/cgroup") if err != nil { return nil, err } allMap := make(map[string]bool) - for s := range all { + for s := range allSubsystems { allMap[s] = true } - return getCgroupMountsHelper(allMap, f) + return getCgroupMountsHelper(allMap, f, all) } // GetAllSubsystems returns all the cgroup subsystems supported by the kernel diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/cgroup_unix.go b/vendor/github.com/opencontainers/runc/libcontainer/configs/cgroup_unix.go index bd6f69b82f..94b38879ed 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/cgroup_unix.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/cgroup_unix.go @@ -120,5 +120,5 @@ type Resources struct { NetPrioIfpriomap []*IfPrioMap `json:"net_prio_ifpriomap"` // Set class identifier for container's network packets - NetClsClassid uint32 `json:"net_cls_classid"` + NetClsClassid uint32 `json:"net_cls_classid_u"` } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/configs/config.go b/vendor/github.com/opencontainers/runc/libcontainer/configs/config.go index 3c38191b35..a56d12bdb9 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/config.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/config.go @@ -300,29 +300,38 @@ func (c Command) Run(s HookState) error { if err != nil { return err } + var stdout, stderr bytes.Buffer cmd := exec.Cmd{ - Path: c.Path, - Args: c.Args, - Env: c.Env, - Stdin: bytes.NewReader(b), + Path: c.Path, + Args: c.Args, + Env: c.Env, + Stdin: bytes.NewReader(b), + Stdout: &stdout, + Stderr: &stderr, + } + if err := cmd.Start(); err != nil { + return err } errC := make(chan error, 1) go func() { - out, err := cmd.CombinedOutput() + err := cmd.Wait() if err != nil { - err = fmt.Errorf("%s: %s", err, out) + err = fmt.Errorf("error running hook: %v, stdout: %s, stderr: %s", err, stdout.String(), stderr.String()) } errC <- err }() + var timerCh <-chan time.Time if c.Timeout != nil { - select { - case err := <-errC: - return err - case <-time.After(*c.Timeout): - cmd.Process.Kill() - cmd.Wait() - return fmt.Errorf("hook ran past specified timeout of %.1fs", c.Timeout.Seconds()) - } + timer := time.NewTimer(*c.Timeout) + defer timer.Stop() + timerCh = timer.C + } + select { + case err := <-errC: + return err + case <-timerCh: + cmd.Process.Kill() + cmd.Wait() + return fmt.Errorf("hook ran past specified timeout of %.1fs", c.Timeout.Seconds()) } - return <-errC } 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 ba1f437f3b..4d348d217e 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/configs/device_defaults.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/configs/device_defaults.go @@ -107,19 +107,5 @@ var ( Permissions: "rwm", }, }, DefaultSimpleDevices...) - DefaultAutoCreatedDevices = append([]*Device{ - { - // /dev/fuse is created but not allowed. - // This is to allow java to work. Because java - // Insists on there being a /dev/fuse - // https://github.com/docker/docker/issues/514 - // https://github.com/docker/docker/issues/2393 - // - Path: "/dev/fuse", - Type: 'c', - Major: 10, - Minor: 229, - Permissions: "rwm", - }, - }, DefaultSimpleDevices...) + DefaultAutoCreatedDevices = append([]*Device{}, DefaultSimpleDevices...) ) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/container.go b/vendor/github.com/opencontainers/runc/libcontainer/container.go index 1a71179c96..6844fbc7a8 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/container.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/container.go @@ -75,8 +75,8 @@ type BaseContainer interface { // Returns the current status of the container. // // errors: - // ContainerDestroyed - Container no longer exists, - // SystemError - System error. + // ContainerNotExists - Container no longer exists, + // Systemerror - System error. Status() (Status, error) // State returns the current container's state information. @@ -91,8 +91,8 @@ type BaseContainer interface { // Returns the PIDs inside this container. The PIDs are in the namespace of the calling process. // // errors: - // ContainerDestroyed - Container no longer exists, - // SystemError - System error. + // ContainerNotExists - Container no longer exists, + // Systemerror - System error. // // Some of the returned PIDs may no longer refer to processes in the Container, unless // the Container state is PAUSED in which case every PID in the slice is valid. @@ -101,8 +101,8 @@ type BaseContainer interface { // Returns statistics for the container. // // errors: - // ContainerDestroyed - Container no longer exists, - // SystemError - System error. + // ContainerNotExists - Container no longer exists, + // Systemerror - System error. Stats() (*Stats, error) // Set resources of container as configured @@ -117,7 +117,7 @@ type BaseContainer interface { // start. You can track process lifecycle with passed Process structure. // // errors: - // ContainerDestroyed - Container no longer exists, + // ContainerNotExists - Container no longer exists, // ConfigInvalid - config is invalid, // ContainerPaused - Container is paused, // SystemError - System error. @@ -128,7 +128,7 @@ type BaseContainer interface { // opens the fifo after start returns. // // errors: - // ContainerDestroyed - Container no longer exists, + // ContainerNotExists - Container no longer exists, // ConfigInvalid - config is invalid, // ContainerPaused - Container is paused, // SystemError - System error. diff --git a/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go index 70cbc6359f..29c8b3437b 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go @@ -35,7 +35,6 @@ type linuxContainer struct { root string config *configs.Config cgroupManager cgroups.Manager - initPath string initArgs []string initProcess parentProcess initProcessStartTime string @@ -86,13 +85,14 @@ type Container interface { // Systemerror - System error. Restore(process *Process, criuOpts *CriuOpts) error - // If the Container state is RUNNING, sets the Container state to PAUSING and pauses + // If the Container state is RUNNING or CREATED, sets the Container state to PAUSING and pauses // the execution of any user processes. Asynchronously, when the container finished being paused the // state is changed to PAUSED. // If the Container state is PAUSED, do nothing. // // errors: - // ContainerDestroyed - Container no longer exists, + // ContainerNotExists - Container no longer exists, + // ContainerNotRunning - Container not running or created, // Systemerror - System error. Pause() error @@ -101,7 +101,8 @@ type Container interface { // If the Container state is RUNNING, do nothing. // // errors: - // ContainerDestroyed - Container no longer exists, + // ContainerNotExists - Container no longer exists, + // ContainerNotPaused - Container is not paused, // Systemerror - System error. Resume() error @@ -308,10 +309,7 @@ func (c *linuxContainer) newParentProcess(p *Process, doInit bool) (parentProces } func (c *linuxContainer) commandTemplate(p *Process, childPipe, rootDir *os.File) (*exec.Cmd, error) { - cmd := &exec.Cmd{ - Path: c.initPath, - Args: c.initArgs, - } + cmd := exec.Command(c.initArgs[0], c.initArgs[1:]...) cmd.Stdin = p.Stdin cmd.Stdout = p.Stdout cmd.Stderr = p.Stderr @@ -447,7 +445,7 @@ func (c *linuxContainer) Pause() error { c: c, }) } - return newGenericError(fmt.Errorf("container not running: %s", status), ContainerNotRunning) + return newGenericError(fmt.Errorf("container not running or created: %s", status), ContainerNotRunning) } func (c *linuxContainer) Resume() error { @@ -1049,6 +1047,8 @@ func (c *linuxContainer) criuNotifications(resp *criurpc.CriuResp, process *Proc }); err != nil { return err } + // create a timestamp indicating when the restored checkpoint was started + c.created = time.Now().UTC() if _, err := c.updateState(r); err != nil { return err } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/factory_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/factory_linux.go index 6cce46e0dd..0abc2c5a24 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/factory_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/factory_linux.go @@ -6,7 +6,6 @@ import ( "encoding/json" "fmt" "os" - "os/exec" "path/filepath" "regexp" "runtime/debug" @@ -33,32 +32,9 @@ var ( ) // InitArgs returns an options func to configure a LinuxFactory with the -// provided init arguments. +// provided init binary path and arguments. func InitArgs(args ...string) func(*LinuxFactory) error { return func(l *LinuxFactory) error { - name := args[0] - if filepath.Base(name) == name { - if lp, err := exec.LookPath(name); err == nil { - name = lp - } - } else { - abs, err := filepath.Abs(name) - if err != nil { - return err - } - name = abs - } - l.InitPath = "/proc/self/exe" - l.InitArgs = append([]string{name}, args[1:]...) - return nil - } -} - -// InitPath returns an options func to configure a LinuxFactory with the -// provided absolute path to the init binary and arguements. -func InitPath(path string, args ...string) func(*LinuxFactory) error { - return func(l *LinuxFactory) error { - l.InitPath = path l.InitArgs = args return nil } @@ -122,10 +98,10 @@ func New(root string, options ...func(*LinuxFactory) error) (Factory, error) { } l := &LinuxFactory{ Root: root, + InitArgs: []string{"/proc/self/exe", "init"}, Validator: validate.New(), CriuPath: "criu", } - InitArgs(os.Args[0], "init")(l) Cgroupfs(l) for _, opt := range options { if err := opt(l); err != nil { @@ -140,9 +116,6 @@ type LinuxFactory struct { // Root directory for the factory to store state. Root string - // InitPath is the absolute path to the init binary. - InitPath string - // InitArgs are arguments for calling the init responsibilities for spawning // a container. InitArgs []string @@ -202,7 +175,6 @@ func (l *LinuxFactory) Create(id string, config *configs.Config) (Container, err id: id, root: containerRoot, config: config, - initPath: l.InitPath, initArgs: l.InitArgs, criuPath: l.CriuPath, cgroupManager: l.NewCgroupsManager(config.Cgroups, nil), @@ -216,7 +188,7 @@ func (l *LinuxFactory) Load(id string) (Container, error) { return nil, newGenericError(fmt.Errorf("invalid root"), ConfigInvalid) } containerRoot := filepath.Join(l.Root, id) - state, err := l.loadState(containerRoot) + state, err := l.loadState(containerRoot, id) if err != nil { return nil, err } @@ -230,7 +202,6 @@ func (l *LinuxFactory) Load(id string) (Container, error) { initProcessStartTime: state.InitProcessStartTime, id: id, config: &state.Config, - initPath: l.InitPath, initArgs: l.InitArgs, criuPath: l.CriuPath, cgroupManager: l.NewCgroupsManager(state.Config.Cgroups, state.CgroupPaths), @@ -302,11 +273,11 @@ func (l *LinuxFactory) StartInitialization() (err error) { return i.Init() } -func (l *LinuxFactory) loadState(root string) (*State, error) { +func (l *LinuxFactory) loadState(root, id string) (*State, error) { f, err := os.Open(filepath.Join(root, stateFilename)) if err != nil { if os.IsNotExist(err) { - return nil, newGenericError(err, ContainerNotExists) + return nil, newGenericError(fmt.Errorf("container %q does not exists", id), ContainerNotExists) } return nil, newGenericError(err, SystemError) } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/generic_error.go b/vendor/github.com/opencontainers/runc/libcontainer/generic_error.go index 9c3d32492b..de37715c92 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/generic_error.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/generic_error.go @@ -67,9 +67,6 @@ func newSystemErrorWithCause(err error, cause string) Error { // stack frames skipped. This is only to be called by the other functions for // formatting the error. func createSystemError(err error, cause string) Error { - if le, ok := err.(Error); ok { - return le - } gerr := &genericError{ Timestamp: time.Now(), Err: err, diff --git a/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go index 01ff0d133d..b1e6762ecd 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go @@ -144,7 +144,7 @@ func finalizeNamespace(config *initConfig) error { } if config.Cwd != "" { if err := syscall.Chdir(config.Cwd); err != nil { - return err + return fmt.Errorf("chdir to cwd (%q) set in config.json failed: %v", config.Cwd, err) } } return nil diff --git a/vendor/github.com/opencontainers/runc/libcontainer/label/label_selinux.go b/vendor/github.com/opencontainers/runc/libcontainer/label/label_selinux.go index 4493bda774..1d9d78a390 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/label/label_selinux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/label/label_selinux.go @@ -129,7 +129,7 @@ func Relabel(path string, fileLabel string, shared bool) error { exclude_paths := map[string]bool{"/": true, "/usr": true, "/etc": true} if exclude_paths[path] { - return fmt.Errorf("Relabeling of %s is not allowed", path) + return fmt.Errorf("SELinux relabeling of %s is not allowed", path) } if shared { @@ -137,7 +137,10 @@ func Relabel(path string, fileLabel string, shared bool) error { c["level"] = "s0" fileLabel = c.Get() } - return selinux.Chcon(path, fileLabel, true) + if err := selinux.Chcon(path, fileLabel, true); err != nil { + return fmt.Errorf("SELinux relabeling of %s is not allowed: %q", path, err) + } + return nil } // GetPidLabel will return the label of the process running with the specified pid diff --git a/vendor/github.com/opencontainers/runc/libcontainer/process_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/process_linux.go index 33db39239d..5b81317fd7 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/process_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/process_linux.go @@ -32,7 +32,7 @@ type parentProcess interface { // wait waits on the process returning the process state. wait() (*os.ProcessState, error) - // startTime return's the process start time. + // startTime returns the process start time. startTime() (string, error) signal(os.Signal) error @@ -356,7 +356,7 @@ loop: } } if !sentRun { - return newSystemErrorWithCause(ierr, "container init failed") + return newSystemErrorWithCause(ierr, "container init") } if p.config.Config.Namespaces.Contains(configs.NEWNS) && !sentResume { return newSystemError(fmt.Errorf("could not synchronise after executing prestart hooks with container process")) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/rootfs_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/rootfs_linux.go index 943b2fc099..67b7a2754e 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/rootfs_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/rootfs_linux.go @@ -50,7 +50,7 @@ func setupRootfs(config *configs.Config, console *linuxConsole, pipe io.ReadWrit } } if err := mountToRootfs(m, config.Rootfs, config.MountLabel); err != nil { - return newSystemErrorWithCausef(err, "mounting %q to rootfs %q", m.Destination, config.Rootfs) + return newSystemErrorWithCausef(err, "mounting %q to rootfs %q at %q", m.Source, config.Rootfs, m.Destination) } for _, postcmd := range m.PostmountCmds { @@ -270,7 +270,7 @@ func mountToRootfs(m *configs.Mount, rootfs, mountLabel string) error { } func getCgroupMounts(m *configs.Mount) ([]*configs.Mount, error) { - mounts, err := cgroups.GetCgroupMounts() + mounts, err := cgroups.GetCgroupMounts(false) if err != nil { return nil, err } @@ -320,6 +320,8 @@ func checkMountDestination(rootfs, dest string) error { "/proc/diskstats", "/proc/meminfo", "/proc/stat", + "/proc/swaps", + "/proc/uptime", "/proc/net/dev", } for _, valid := range validDestinations { diff --git a/vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_386.go b/vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_386.go index c990065189..bb44d895ce 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_386.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/system/syscall_linux_386.go @@ -8,7 +8,7 @@ import ( // Setuid sets the uid of the calling thread to the specified uid. func Setuid(uid int) (err error) { - _, _, e1 := syscall.RawSyscall(syscall.SYS_SETUID, uintptr(uid), 0, 0) + _, _, e1 := syscall.RawSyscall(syscall.SYS_SETUID32, uintptr(uid), 0, 0) if e1 != 0 { err = e1 } diff --git a/vendor/github.com/xiang90/probing/prober.go b/vendor/github.com/xiang90/probing/prober.go index 9f04f86025..c917cfd9d1 100644 --- a/vendor/github.com/xiang90/probing/prober.go +++ b/vendor/github.com/xiang90/probing/prober.go @@ -61,7 +61,7 @@ func (p *prober) AddHTTP(id string, probingInterval time.Duration, endpoints []s } resp, err := p.tr.RoundTrip(req) if err != nil { - s.recordFailure() + s.recordFailure(err) pinned = (pinned + 1) % len(endpoints) continue } @@ -71,7 +71,7 @@ func (p *prober) AddHTTP(id string, probingInterval time.Duration, endpoints []s err = d.Decode(&hh) resp.Body.Close() if err != nil || !hh.OK { - s.recordFailure() + s.recordFailure(err) pinned = (pinned + 1) % len(endpoints) continue } diff --git a/vendor/github.com/xiang90/probing/status.go b/vendor/github.com/xiang90/probing/status.go index bdfab2761c..bb5f6599fc 100644 --- a/vendor/github.com/xiang90/probing/status.go +++ b/vendor/github.com/xiang90/probing/status.go @@ -14,6 +14,7 @@ type Status interface { Total() int64 Loss() int64 Health() bool + Err() error // Estimated smoothed round trip time SRTT() time.Duration // Estimated clock difference @@ -27,6 +28,7 @@ type status struct { total int64 loss int64 health bool + err error clockdiff time.Duration stopC chan struct{} } @@ -56,6 +58,12 @@ func (s *status) Health() bool { return s.health } +func (s *status) Err() error { + s.mu.Lock() + defer s.mu.Unlock() + return s.err +} + func (s *status) ClockDiff() time.Duration { s.mu.Lock() defer s.mu.Unlock() @@ -74,15 +82,17 @@ func (s *status) record(rtt time.Duration, when time.Time) { s.health = true s.srtt = time.Duration((1-α)*float64(s.srtt) + α*float64(rtt)) s.clockdiff = time.Now().Sub(when) - s.srtt/2 + s.err = nil } -func (s *status) recordFailure() { +func (s *status) recordFailure(err error) { s.mu.Lock() defer s.mu.Unlock() s.total++ s.health = false s.loss += 1 + s.err = err } func (s *status) reset() { @@ -91,6 +101,8 @@ func (s *status) reset() { s.srtt = 0 s.total = 0 + s.loss = 0 s.health = false s.clockdiff = 0 + s.err = nil } diff --git a/vendor/golang.org/x/oauth2/.travis.yml b/vendor/golang.org/x/oauth2/.travis.yml index a035125c35..fa139db225 100644 --- a/vendor/golang.org/x/oauth2/.travis.yml +++ b/vendor/golang.org/x/oauth2/.travis.yml @@ -1,8 +1,7 @@ language: go go: - - 1.3 - - 1.4 + - tip install: - export GOPATH="$HOME/gopath" diff --git a/vendor/golang.org/x/oauth2/README.md b/vendor/golang.org/x/oauth2/README.md index 0d5141733f..1643c08ef8 100644 --- a/vendor/golang.org/x/oauth2/README.md +++ b/vendor/golang.org/x/oauth2/README.md @@ -1,6 +1,7 @@ # OAuth2 for Go [![Build Status](https://travis-ci.org/golang/oauth2.svg?branch=master)](https://travis-ci.org/golang/oauth2) +[![GoDoc](https://godoc.org/golang.org/x/oauth2?status.svg)](https://godoc.org/golang.org/x/oauth2) oauth2 package contains a client implementation for OAuth 2.0 spec. diff --git a/vendor/golang.org/x/oauth2/client_appengine.go b/vendor/golang.org/x/oauth2/client_appengine.go index 4a554cb9bf..8962c49d1d 100644 --- a/vendor/golang.org/x/oauth2/client_appengine.go +++ b/vendor/golang.org/x/oauth2/client_appengine.go @@ -1,8 +1,8 @@ -// Copyright 2014 The oauth2 Authors. All rights reserved. +// Copyright 2014 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 appengine appenginevm +// +build appengine // App Engine hooks. diff --git a/vendor/golang.org/x/oauth2/google/appengine.go b/vendor/golang.org/x/oauth2/google/appengine.go index 65dc347314..dc993efb5e 100644 --- a/vendor/golang.org/x/oauth2/google/appengine.go +++ b/vendor/golang.org/x/oauth2/google/appengine.go @@ -1,4 +1,4 @@ -// Copyright 2014 The oauth2 Authors. All rights reserved. +// Copyright 2014 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. @@ -14,6 +14,9 @@ import ( "golang.org/x/oauth2" ) +// Set at init time by appenginevm_hook.go. If true, we are on App Engine Managed VMs. +var appengineVM bool + // Set at init time by appengine_hook.go. If nil, we're not on App Engine. var appengineTokenFunc func(c context.Context, scopes ...string) (token string, expiry time.Time, err error) diff --git a/vendor/golang.org/x/oauth2/google/appengine_hook.go b/vendor/golang.org/x/oauth2/google/appengine_hook.go index 2f9b15432f..4f42c8b343 100644 --- a/vendor/golang.org/x/oauth2/google/appengine_hook.go +++ b/vendor/golang.org/x/oauth2/google/appengine_hook.go @@ -1,8 +1,8 @@ -// Copyright 2015 The oauth2 Authors. All rights reserved. +// Copyright 2015 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 appengine appenginevm +// +build appengine package google diff --git a/vendor/golang.org/x/oauth2/google/appenginevm_hook.go b/vendor/golang.org/x/oauth2/google/appenginevm_hook.go new file mode 100644 index 0000000000..633611cc3a --- /dev/null +++ b/vendor/golang.org/x/oauth2/google/appenginevm_hook.go @@ -0,0 +1,14 @@ +// Copyright 2015 The oauth2 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 appenginevm + +package google + +import "google.golang.org/appengine" + +func init() { + appengineVM = true + appengineTokenFunc = appengine.AccessToken +} diff --git a/vendor/golang.org/x/oauth2/google/default.go b/vendor/golang.org/x/oauth2/google/default.go index 78f8089853..565d731c45 100644 --- a/vendor/golang.org/x/oauth2/google/default.go +++ b/vendor/golang.org/x/oauth2/google/default.go @@ -1,4 +1,4 @@ -// Copyright 2015 The oauth2 Authors. All rights reserved. +// Copyright 2015 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. @@ -14,10 +14,10 @@ import ( "path/filepath" "runtime" + "cloud.google.com/go/compute/metadata" "golang.org/x/net/context" "golang.org/x/oauth2" "golang.org/x/oauth2/jwt" - "google.golang.org/cloud/compute/metadata" ) // DefaultClient returns an HTTP Client that uses the @@ -50,7 +50,8 @@ func DefaultClient(ctx context.Context, scope ...string) (*http.Client, error) { // On Windows, this is %APPDATA%/gcloud/application_default_credentials.json. // On other systems, $HOME/.config/gcloud/application_default_credentials.json. // 3. On Google App Engine it uses the appengine.AccessToken function. -// 4. On Google Compute Engine, it fetches credentials from the metadata server. +// 4. On Google Compute Engine and Google App Engine Managed VMs, it fetches +// credentials from the metadata server. // (In this final case any provided scopes are ignored.) // // For more details, see: @@ -84,7 +85,7 @@ func DefaultTokenSource(ctx context.Context, scope ...string) (oauth2.TokenSourc } // Third, if we're on Google App Engine use those credentials. - if appengineTokenFunc != nil { + if appengineTokenFunc != nil && !appengineVM { return AppEngineTokenSource(ctx, scope...), nil } diff --git a/vendor/golang.org/x/oauth2/google/google.go b/vendor/golang.org/x/oauth2/google/google.go index 2077d9866f..4f7352762b 100644 --- a/vendor/golang.org/x/oauth2/google/google.go +++ b/vendor/golang.org/x/oauth2/google/google.go @@ -1,4 +1,4 @@ -// Copyright 2014 The oauth2 Authors. All rights reserved. +// Copyright 2014 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. @@ -21,9 +21,9 @@ import ( "strings" "time" + "cloud.google.com/go/compute/metadata" "golang.org/x/oauth2" "golang.org/x/oauth2/jwt" - "google.golang.org/cloud/compute/metadata" ) // Endpoint is Google's OAuth 2.0 endpoint. @@ -37,9 +37,10 @@ const JWTTokenURL = "https://accounts.google.com/o/oauth2/token" // ConfigFromJSON uses a Google Developers Console client_credentials.json // file to construct a config. -// client_credentials.json can be downloadable from https://console.developers.google.com, -// under "APIs & Auth" > "Credentials". Download the Web application credentials in the -// JSON format and provide the contents of the file as jsonKey. +// client_credentials.json can be downloaded from +// https://console.developers.google.com, under "Credentials". Download the Web +// application credentials in the JSON format and provide the contents of the +// file as jsonKey. func ConfigFromJSON(jsonKey []byte, scope ...string) (*oauth2.Config, error) { type cred struct { ClientID string `json:"client_id"` @@ -81,22 +82,29 @@ func ConfigFromJSON(jsonKey []byte, scope ...string) (*oauth2.Config, error) { // JWTConfigFromJSON uses a Google Developers service account JSON key file to read // the credentials that authorize and authenticate the requests. -// Create a service account on "Credentials" page under "APIs & Auth" for your -// project at https://console.developers.google.com to download a JSON key file. +// Create a service account on "Credentials" for your project at +// https://console.developers.google.com to download a JSON key file. func JWTConfigFromJSON(jsonKey []byte, scope ...string) (*jwt.Config, error) { var key struct { - Email string `json:"client_email"` - PrivateKey string `json:"private_key"` + Email string `json:"client_email"` + PrivateKey string `json:"private_key"` + PrivateKeyID string `json:"private_key_id"` + TokenURL string `json:"token_uri"` } if err := json.Unmarshal(jsonKey, &key); err != nil { return nil, err } - return &jwt.Config{ - Email: key.Email, - PrivateKey: []byte(key.PrivateKey), - Scopes: scope, - TokenURL: JWTTokenURL, - }, nil + config := &jwt.Config{ + Email: key.Email, + PrivateKey: []byte(key.PrivateKey), + PrivateKeyID: key.PrivateKeyID, + Scopes: scope, + TokenURL: key.TokenURL, + } + if config.TokenURL == "" { + config.TokenURL = JWTTokenURL + } + return config, nil } // ComputeTokenSource returns a token source that fetches access tokens diff --git a/vendor/golang.org/x/oauth2/google/jwt.go b/vendor/golang.org/x/oauth2/google/jwt.go new file mode 100644 index 0000000000..b0fdb3a888 --- /dev/null +++ b/vendor/golang.org/x/oauth2/google/jwt.go @@ -0,0 +1,74 @@ +// Copyright 2015 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 google + +import ( + "crypto/rsa" + "fmt" + "time" + + "golang.org/x/oauth2" + "golang.org/x/oauth2/internal" + "golang.org/x/oauth2/jws" +) + +// JWTAccessTokenSourceFromJSON uses a Google Developers service account JSON +// key file to read the credentials that authorize and authenticate the +// requests, and returns a TokenSource that does not use any OAuth2 flow but +// instead creates a JWT and sends that as the access token. +// The audience is typically a URL that specifies the scope of the credentials. +// +// Note that this is not a standard OAuth flow, but rather an +// optimization supported by a few Google services. +// Unless you know otherwise, you should use JWTConfigFromJSON instead. +func JWTAccessTokenSourceFromJSON(jsonKey []byte, audience string) (oauth2.TokenSource, error) { + cfg, err := JWTConfigFromJSON(jsonKey) + if err != nil { + return nil, fmt.Errorf("google: could not parse JSON key: %v", err) + } + pk, err := internal.ParseKey(cfg.PrivateKey) + if err != nil { + return nil, fmt.Errorf("google: could not parse key: %v", err) + } + ts := &jwtAccessTokenSource{ + email: cfg.Email, + audience: audience, + pk: pk, + pkID: cfg.PrivateKeyID, + } + tok, err := ts.Token() + if err != nil { + return nil, err + } + return oauth2.ReuseTokenSource(tok, ts), nil +} + +type jwtAccessTokenSource struct { + email, audience string + pk *rsa.PrivateKey + pkID string +} + +func (ts *jwtAccessTokenSource) Token() (*oauth2.Token, error) { + iat := time.Now() + exp := iat.Add(time.Hour) + cs := &jws.ClaimSet{ + Iss: ts.email, + Sub: ts.email, + Aud: ts.audience, + Iat: iat.Unix(), + Exp: exp.Unix(), + } + hdr := &jws.Header{ + Algorithm: "RS256", + Typ: "JWT", + KeyID: string(ts.pkID), + } + msg, err := jws.Encode(hdr, cs, ts.pk) + if err != nil { + return nil, fmt.Errorf("google: could not encode JWT: %v", err) + } + return &oauth2.Token{AccessToken: msg, TokenType: "Bearer", Expiry: exp}, nil +} diff --git a/vendor/golang.org/x/oauth2/google/sdk.go b/vendor/golang.org/x/oauth2/google/sdk.go index 01ba0ecb00..d29a3bb9bb 100644 --- a/vendor/golang.org/x/oauth2/google/sdk.go +++ b/vendor/golang.org/x/oauth2/google/sdk.go @@ -1,4 +1,4 @@ -// Copyright 2015 The oauth2 Authors. All rights reserved. +// Copyright 2015 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. diff --git a/vendor/golang.org/x/oauth2/internal/oauth2.go b/vendor/golang.org/x/oauth2/internal/oauth2.go index dc8ebfc4f7..fbe1028d64 100644 --- a/vendor/golang.org/x/oauth2/internal/oauth2.go +++ b/vendor/golang.org/x/oauth2/internal/oauth2.go @@ -1,4 +1,4 @@ -// Copyright 2014 The oauth2 Authors. All rights reserved. +// Copyright 2014 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. diff --git a/vendor/golang.org/x/oauth2/internal/token.go b/vendor/golang.org/x/oauth2/internal/token.go index ea6716c98c..18328a0dcf 100644 --- a/vendor/golang.org/x/oauth2/internal/token.go +++ b/vendor/golang.org/x/oauth2/internal/token.go @@ -1,4 +1,4 @@ -// Copyright 2014 The oauth2 Authors. All rights reserved. +// Copyright 2014 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. @@ -91,24 +91,36 @@ func (e *expirationTime) UnmarshalJSON(b []byte) error { var brokenAuthHeaderProviders = []string{ "https://accounts.google.com/", - "https://www.googleapis.com/", - "https://github.com/", - "https://api.instagram.com/", - "https://www.douban.com/", "https://api.dropbox.com/", - "https://api.soundcloud.com/", - "https://www.linkedin.com/", - "https://api.twitch.tv/", - "https://oauth.vk.com/", + "https://api.dropboxapi.com/", + "https://api.instagram.com/", + "https://api.netatmo.net/", "https://api.odnoklassniki.ru/", - "https://connect.stripe.com/", "https://api.pushbullet.com/", + "https://api.soundcloud.com/", + "https://api.twitch.tv/", + "https://app.box.com/", + "https://connect.stripe.com/", + "https://login.microsoftonline.com/", + "https://login.salesforce.com/", "https://oauth.sandbox.trainingpeaks.com/", "https://oauth.trainingpeaks.com/", - "https://www.strava.com/oauth/", - "https://app.box.com/", + "https://oauth.vk.com/", + "https://openapi.baidu.com/", + "https://slack.com/", "https://test-sandbox.auth.corp.google.com", + "https://test.salesforce.com/", "https://user.gini.net/", + "https://www.douban.com/", + "https://www.googleapis.com/", + "https://www.linkedin.com/", + "https://www.strava.com/oauth/", + "https://www.wunderlist.com/oauth/", + "https://api.patreon.com/", +} + +func RegisterBrokenAuthHeaderProvider(tokenURL string) { + brokenAuthHeaderProviders = append(brokenAuthHeaderProviders, tokenURL) } // providerAuthHeaderWorks reports whether the OAuth2 server identified by the tokenURL @@ -134,23 +146,23 @@ func providerAuthHeaderWorks(tokenURL string) bool { return true } -func RetrieveToken(ctx context.Context, ClientID, ClientSecret, TokenURL string, v url.Values) (*Token, error) { +func RetrieveToken(ctx context.Context, clientID, clientSecret, tokenURL string, v url.Values) (*Token, error) { hc, err := ContextClient(ctx) if err != nil { return nil, err } - v.Set("client_id", ClientID) - bustedAuth := !providerAuthHeaderWorks(TokenURL) - if bustedAuth && ClientSecret != "" { - v.Set("client_secret", ClientSecret) + v.Set("client_id", clientID) + bustedAuth := !providerAuthHeaderWorks(tokenURL) + if bustedAuth && clientSecret != "" { + v.Set("client_secret", clientSecret) } - req, err := http.NewRequest("POST", TokenURL, strings.NewReader(v.Encode())) + req, err := http.NewRequest("POST", tokenURL, strings.NewReader(v.Encode())) if err != nil { return nil, err } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") if !bustedAuth { - req.SetBasicAuth(ClientID, ClientSecret) + req.SetBasicAuth(clientID, clientSecret) } r, err := hc.Do(req) if err != nil { diff --git a/vendor/golang.org/x/oauth2/internal/transport.go b/vendor/golang.org/x/oauth2/internal/transport.go index 521e7b49e7..f1f173e345 100644 --- a/vendor/golang.org/x/oauth2/internal/transport.go +++ b/vendor/golang.org/x/oauth2/internal/transport.go @@ -1,4 +1,4 @@ -// Copyright 2014 The oauth2 Authors. All rights reserved. +// Copyright 2014 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. @@ -33,6 +33,11 @@ func RegisterContextClientFunc(fn ContextClientFunc) { } func ContextClient(ctx context.Context) (*http.Client, error) { + if ctx != nil { + if hc, ok := ctx.Value(HTTPClient).(*http.Client); ok { + return hc, nil + } + } for _, fn := range contextClientFuncs { c, err := fn(ctx) if err != nil { @@ -42,9 +47,6 @@ func ContextClient(ctx context.Context) (*http.Client, error) { return c, nil } } - if hc, ok := ctx.Value(HTTPClient).(*http.Client); ok { - return hc, nil - } return http.DefaultClient, nil } diff --git a/vendor/golang.org/x/oauth2/jws/jws.go b/vendor/golang.org/x/oauth2/jws/jws.go index 396b3fac82..8bcecb46ba 100644 --- a/vendor/golang.org/x/oauth2/jws/jws.go +++ b/vendor/golang.org/x/oauth2/jws/jws.go @@ -1,9 +1,17 @@ -// Copyright 2014 The oauth2 Authors. All rights reserved. +// Copyright 2014 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 jws provides encoding and decoding utilities for -// signed JWS messages. +// Package jws provides a partial implementation +// of JSON Web Signature encoding and decoding. +// It exists to support the golang.org/x/oauth2 package. +// +// See RFC 7515. +// +// Deprecated: this package is not intended for public use and might be +// removed in the future. It exists for internal use only. +// Please switch to another JWS package or copy this package into your own +// source tree. package jws import ( @@ -27,8 +35,8 @@ type ClaimSet struct { Iss string `json:"iss"` // email address of the client_id of the application making the access token request Scope string `json:"scope,omitempty"` // space-delimited list of the permissions the application requests Aud string `json:"aud"` // descriptor of the intended target of the assertion (Optional). - Exp int64 `json:"exp"` // the expiration time of the assertion - Iat int64 `json:"iat"` // the time the assertion was issued. + Exp int64 `json:"exp"` // the expiration time of the assertion (seconds since Unix epoch) + Iat int64 `json:"iat"` // the time the assertion was issued (seconds since Unix epoch) Typ string `json:"typ,omitempty"` // token type (Optional). // Email for which the application is requesting delegated access (Optional). @@ -41,23 +49,22 @@ type ClaimSet struct { // See http://tools.ietf.org/html/draft-jones-json-web-token-10#section-4.3 // This array is marshalled using custom code (see (c *ClaimSet) encode()). PrivateClaims map[string]interface{} `json:"-"` - - exp time.Time - iat time.Time } func (c *ClaimSet) encode() (string, error) { - if c.exp.IsZero() || c.iat.IsZero() { - // Reverting time back for machines whose time is not perfectly in sync. - // If client machine's time is in the future according - // to Google servers, an access token will not be issued. - now := time.Now().Add(-10 * time.Second) - c.iat = now - c.exp = now.Add(time.Hour) + // Reverting time back for machines whose time is not perfectly in sync. + // If client machine's time is in the future according + // to Google servers, an access token will not be issued. + now := time.Now().Add(-10 * time.Second) + if c.Iat == 0 { + c.Iat = now.Unix() + } + if c.Exp == 0 { + c.Exp = now.Add(time.Hour).Unix() + } + if c.Exp < c.Iat { + return "", fmt.Errorf("jws: invalid Exp = %v; must be later than Iat = %v", c.Exp, c.Iat) } - - c.Exp = c.exp.Unix() - c.Iat = c.iat.Unix() b, err := json.Marshal(c) if err != nil { @@ -65,7 +72,7 @@ func (c *ClaimSet) encode() (string, error) { } if len(c.PrivateClaims) == 0 { - return base64Encode(b), nil + return base64.RawURLEncoding.EncodeToString(b), nil } // Marshal private claim set and then append it to b. @@ -83,7 +90,7 @@ func (c *ClaimSet) encode() (string, error) { } b[len(b)-1] = ',' // Replace closing curly brace with a comma. b = append(b, prv[1:]...) // Append private claims. - return base64Encode(b), nil + return base64.RawURLEncoding.EncodeToString(b), nil } // Header represents the header for the signed JWS payloads. @@ -93,6 +100,9 @@ type Header struct { // Represents the token type. Typ string `json:"typ"` + + // The optional hint of which key is being used. + KeyID string `json:"kid,omitempty"` } func (h *Header) encode() (string, error) { @@ -100,7 +110,7 @@ func (h *Header) encode() (string, error) { if err != nil { return "", err } - return base64Encode(b), nil + return base64.RawURLEncoding.EncodeToString(b), nil } // Decode decodes a claim set from a JWS payload. @@ -111,7 +121,7 @@ func Decode(payload string) (*ClaimSet, error) { // TODO(jbd): Provide more context about the error. return nil, errors.New("jws: invalid token received") } - decoded, err := base64Decode(s[1]) + decoded, err := base64.RawURLEncoding.DecodeString(s[1]) if err != nil { return nil, err } @@ -120,8 +130,11 @@ func Decode(payload string) (*ClaimSet, error) { return c, err } -// Encode encodes a signed JWS with provided header and claim set. -func Encode(header *Header, c *ClaimSet, signature *rsa.PrivateKey) (string, error) { +// Signer returns a signature for the given data. +type Signer func(data []byte) (sig []byte, err error) + +// EncodeWithSigner encodes a header and claim set with the provided signer. +func EncodeWithSigner(header *Header, c *ClaimSet, sg Signer) (string, error) { head, err := header.encode() if err != nil { return "", err @@ -131,30 +144,39 @@ func Encode(header *Header, c *ClaimSet, signature *rsa.PrivateKey) (string, err return "", err } ss := fmt.Sprintf("%s.%s", head, cs) - h := sha256.New() - h.Write([]byte(ss)) - b, err := rsa.SignPKCS1v15(rand.Reader, signature, crypto.SHA256, h.Sum(nil)) + sig, err := sg([]byte(ss)) if err != nil { return "", err } - sig := base64Encode(b) - return fmt.Sprintf("%s.%s", ss, sig), nil + return fmt.Sprintf("%s.%s", ss, base64.RawURLEncoding.EncodeToString(sig)), nil } -// base64Encode returns and Base64url encoded version of the input string with any -// trailing "=" stripped. -func base64Encode(b []byte) string { - return strings.TrimRight(base64.URLEncoding.EncodeToString(b), "=") -} - -// base64Decode decodes the Base64url encoded string -func base64Decode(s string) ([]byte, error) { - // add back missing padding - switch len(s) % 4 { - case 2: - s += "==" - case 3: - s += "=" +// Encode encodes a signed JWS with provided header and claim set. +// This invokes EncodeWithSigner using crypto/rsa.SignPKCS1v15 with the given RSA private key. +func Encode(header *Header, c *ClaimSet, key *rsa.PrivateKey) (string, error) { + sg := func(data []byte) (sig []byte, err error) { + h := sha256.New() + h.Write(data) + return rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA256, h.Sum(nil)) } - return base64.URLEncoding.DecodeString(s) + return EncodeWithSigner(header, c, sg) +} + +// Verify tests whether the provided JWT token's signature was produced by the private key +// associated with the supplied public key. +func Verify(token string, key *rsa.PublicKey) error { + parts := strings.Split(token, ".") + if len(parts) != 3 { + return errors.New("jws: invalid token received, token must have 3 parts") + } + + signedContent := parts[0] + "." + parts[1] + signatureString, err := base64.RawURLEncoding.DecodeString(parts[2]) + if err != nil { + return err + } + + h := sha256.New() + h.Write([]byte(signedContent)) + return rsa.VerifyPKCS1v15(key, crypto.SHA256, h.Sum(nil), []byte(signatureString)) } diff --git a/vendor/golang.org/x/oauth2/jwt/jwt.go b/vendor/golang.org/x/oauth2/jwt/jwt.go index 205d23ed43..f4b9523e6e 100644 --- a/vendor/golang.org/x/oauth2/jwt/jwt.go +++ b/vendor/golang.org/x/oauth2/jwt/jwt.go @@ -1,4 +1,4 @@ -// Copyright 2014 The oauth2 Authors. All rights reserved. +// Copyright 2014 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. @@ -46,6 +46,10 @@ type Config struct { // PrivateKey []byte + // PrivateKeyID contains an optional hint indicating which key is being + // used. + PrivateKeyID string + // Subject is the optional user to impersonate. Subject string @@ -54,6 +58,9 @@ type Config struct { // TokenURL is the endpoint required to complete the 2-legged JWT flow. TokenURL string + + // Expires optionally specifies how long the token is valid for. + Expires time.Duration } // TokenSource returns a JWT TokenSource using the configuration @@ -95,6 +102,9 @@ func (js jwtSource) Token() (*oauth2.Token, error) { // to be compatible with legacy OAuth 2.0 providers. claimSet.Prn = subject } + if t := js.conf.Expires; t > 0 { + claimSet.Exp = time.Now().Add(t).Unix() + } payload, err := jws.Encode(defaultHeader, claimSet, pk) if err != nil { return nil, err diff --git a/vendor/golang.org/x/oauth2/oauth2.go b/vendor/golang.org/x/oauth2/oauth2.go index dfcf238d23..798edc809f 100644 --- a/vendor/golang.org/x/oauth2/oauth2.go +++ b/vendor/golang.org/x/oauth2/oauth2.go @@ -1,4 +1,4 @@ -// Copyright 2014 The oauth2 Authors. All rights reserved. +// Copyright 2014 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. @@ -21,10 +21,26 @@ import ( // NoContext is the default context you should supply if not using // your own context.Context (see https://golang.org/x/net/context). +// +// Deprecated: Use context.Background() or context.TODO() instead. var NoContext = context.TODO() +// RegisterBrokenAuthHeaderProvider registers an OAuth2 server +// identified by the tokenURL prefix as an OAuth2 implementation +// which doesn't support the HTTP Basic authentication +// scheme to authenticate with the authorization server. +// Once a server is registered, credentials (client_id and client_secret) +// will be passed as query parameters rather than being present +// in the Authorization header. +// See https://code.google.com/p/goauth2/issues/detail?id=31 for background. +func RegisterBrokenAuthHeaderProvider(tokenURL string) { + internal.RegisterBrokenAuthHeaderProvider(tokenURL) +} + // Config describes a typical 3-legged OAuth2 flow, with both the // client application information and the server's endpoint URLs. +// For the client credentials 2-legged OAuth2 flow, see the clientcredentials +// package (https://golang.org/x/oauth2/clientcredentials). type Config struct { // ClientID is the application's ID. ClientID string @@ -283,7 +299,7 @@ func NewClient(ctx context.Context, src TokenSource) *http.Client { if src == nil { c, err := internal.ContextClient(ctx) if err != nil { - return &http.Client{Transport: internal.ErrorTransport{err}} + return &http.Client{Transport: internal.ErrorTransport{Err: err}} } return c } diff --git a/vendor/golang.org/x/oauth2/token.go b/vendor/golang.org/x/oauth2/token.go index ebbdddbdce..7a3167f15b 100644 --- a/vendor/golang.org/x/oauth2/token.go +++ b/vendor/golang.org/x/oauth2/token.go @@ -1,4 +1,4 @@ -// Copyright 2014 The oauth2 Authors. All rights reserved. +// Copyright 2014 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. @@ -7,6 +7,7 @@ package oauth2 import ( "net/http" "net/url" + "strconv" "strings" "time" @@ -92,14 +93,28 @@ func (t *Token) WithExtra(extra interface{}) *Token { // Extra fields are key-value pairs returned by the server as a // part of the token retrieval response. func (t *Token) Extra(key string) interface{} { - if vals, ok := t.raw.(url.Values); ok { - // TODO(jbd): Cast numeric values to int64 or float64. - return vals.Get(key) - } if raw, ok := t.raw.(map[string]interface{}); ok { return raw[key] } - return nil + + vals, ok := t.raw.(url.Values) + if !ok { + return nil + } + + v := vals.Get(key) + switch s := strings.TrimSpace(v); strings.Count(s, ".") { + case 0: // Contains no "."; try to parse as int + if i, err := strconv.ParseInt(s, 10, 64); err == nil { + return i + } + case 1: // Contains a single "."; try to parse as float + if f, err := strconv.ParseFloat(s, 64); err == nil { + return f + } + } + + return v } // expired reports whether the token is expired. diff --git a/vendor/golang.org/x/oauth2/transport.go b/vendor/golang.org/x/oauth2/transport.go index 90db088332..92ac7e2531 100644 --- a/vendor/golang.org/x/oauth2/transport.go +++ b/vendor/golang.org/x/oauth2/transport.go @@ -1,4 +1,4 @@ -// Copyright 2014 The oauth2 Authors. All rights reserved. +// Copyright 2014 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. diff --git a/vendor/google.golang.org/api/cloudmonitoring/v2beta2/cloudmonitoring-gen.go b/vendor/google.golang.org/api/cloudmonitoring/v2beta2/cloudmonitoring-gen.go index 30f1b6bef2..3db730d76c 100644 --- a/vendor/google.golang.org/api/cloudmonitoring/v2beta2/cloudmonitoring-gen.go +++ b/vendor/google.golang.org/api/cloudmonitoring/v2beta2/cloudmonitoring-gen.go @@ -771,25 +771,23 @@ func (c *MetricDescriptorsCreateCall) Context(ctx context.Context) *MetricDescri } func (c *MetricDescriptorsCreateCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil body, err := googleapi.WithoutDataWrapper.JSONReader(c.metricdescriptor) if err != nil { return nil, err } - ctype := "application/json" + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/metricDescriptors") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, }) - req.Header.Set("Content-Type", ctype) - req.Header.Set("User-Agent", c.s.userAgent()) - if c.ctx_ != nil { - return ctxhttp.Do(c.ctx_, c.s.client, req) - } - return c.s.client.Do(req) + return gensupport.SendRequest(c.ctx_, c.s.client, req) } // Do executes the "cloudmonitoring.metricDescriptors.create" call. @@ -824,7 +822,8 @@ func (c *MetricDescriptorsCreateCall) Do(opts ...googleapi.CallOption) (*MetricD HTTPStatusCode: res.StatusCode, }, } - if err := json.NewDecoder(res.Body).Decode(&ret); err != nil { + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { return nil, err } return ret, nil @@ -893,20 +892,19 @@ func (c *MetricDescriptorsDeleteCall) Context(ctx context.Context) *MetricDescri } func (c *MetricDescriptorsDeleteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil c.urlParams_.Set("alt", alt) urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/metricDescriptors/{metric}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("DELETE", urls, body) + req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, "metric": c.metric, }) - req.Header.Set("User-Agent", c.s.userAgent()) - if c.ctx_ != nil { - return ctxhttp.Do(c.ctx_, c.s.client, req) - } - return c.s.client.Do(req) + return gensupport.SendRequest(c.ctx_, c.s.client, req) } // Do executes the "cloudmonitoring.metricDescriptors.delete" call. @@ -941,7 +939,8 @@ func (c *MetricDescriptorsDeleteCall) Do(opts ...googleapi.CallOption) (*DeleteM HTTPStatusCode: res.StatusCode, }, } - if err := json.NewDecoder(res.Body).Decode(&ret); err != nil { + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { return nil, err } return ret, nil @@ -1057,22 +1056,21 @@ func (c *MetricDescriptorsListCall) Context(ctx context.Context) *MetricDescript } func (c *MetricDescriptorsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } var body io.Reader = nil c.urlParams_.Set("alt", alt) urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/metricDescriptors") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, }) - req.Header.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - req.Header.Set("If-None-Match", c.ifNoneMatch_) - } - if c.ctx_ != nil { - return ctxhttp.Do(c.ctx_, c.s.client, req) - } - return c.s.client.Do(req) + return gensupport.SendRequest(c.ctx_, c.s.client, req) } // Do executes the "cloudmonitoring.metricDescriptors.list" call. @@ -1107,7 +1105,8 @@ func (c *MetricDescriptorsListCall) Do(opts ...googleapi.CallOption) (*ListMetri HTTPStatusCode: res.StatusCode, }, } - if err := json.NewDecoder(res.Body).Decode(&ret); err != nil { + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { return nil, err } return ret, nil @@ -1321,23 +1320,22 @@ func (c *TimeseriesListCall) Context(ctx context.Context) *TimeseriesListCall { } func (c *TimeseriesListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } var body io.Reader = nil c.urlParams_.Set("alt", alt) urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/timeseries/{metric}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, "metric": c.metric, }) - req.Header.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - req.Header.Set("If-None-Match", c.ifNoneMatch_) - } - if c.ctx_ != nil { - return ctxhttp.Do(c.ctx_, c.s.client, req) - } - return c.s.client.Do(req) + return gensupport.SendRequest(c.ctx_, c.s.client, req) } // Do executes the "cloudmonitoring.timeseries.list" call. @@ -1372,7 +1370,8 @@ func (c *TimeseriesListCall) Do(opts ...googleapi.CallOption) (*ListTimeseriesRe HTTPStatusCode: res.StatusCode, }, } - if err := json.NewDecoder(res.Body).Decode(&ret); err != nil { + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { return nil, err } return ret, nil @@ -1538,25 +1537,23 @@ func (c *TimeseriesWriteCall) Context(ctx context.Context) *TimeseriesWriteCall } func (c *TimeseriesWriteCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("User-Agent", c.s.userAgent()) var body io.Reader = nil body, err := googleapi.WithoutDataWrapper.JSONReader(c.writetimeseriesrequest) if err != nil { return nil, err } - ctype := "application/json" + reqHeaders.Set("Content-Type", "application/json") c.urlParams_.Set("alt", alt) urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/timeseries:write") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("POST", urls, body) + req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, }) - req.Header.Set("Content-Type", ctype) - req.Header.Set("User-Agent", c.s.userAgent()) - if c.ctx_ != nil { - return ctxhttp.Do(c.ctx_, c.s.client, req) - } - return c.s.client.Do(req) + return gensupport.SendRequest(c.ctx_, c.s.client, req) } // Do executes the "cloudmonitoring.timeseries.write" call. @@ -1591,7 +1588,8 @@ func (c *TimeseriesWriteCall) Do(opts ...googleapi.CallOption) (*WriteTimeseries HTTPStatusCode: res.StatusCode, }, } - if err := json.NewDecoder(res.Body).Decode(&ret); err != nil { + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { return nil, err } return ret, nil @@ -1766,23 +1764,22 @@ func (c *TimeseriesDescriptorsListCall) Context(ctx context.Context) *Timeseries } func (c *TimeseriesDescriptorsListCall) doRequest(alt string) (*http.Response, error) { + reqHeaders := make(http.Header) + reqHeaders.Set("User-Agent", c.s.userAgent()) + if c.ifNoneMatch_ != "" { + reqHeaders.Set("If-None-Match", c.ifNoneMatch_) + } var body io.Reader = nil c.urlParams_.Set("alt", alt) urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/timeseriesDescriptors/{metric}") urls += "?" + c.urlParams_.Encode() req, _ := http.NewRequest("GET", urls, body) + req.Header = reqHeaders googleapi.Expand(req.URL, map[string]string{ "project": c.project, "metric": c.metric, }) - req.Header.Set("User-Agent", c.s.userAgent()) - if c.ifNoneMatch_ != "" { - req.Header.Set("If-None-Match", c.ifNoneMatch_) - } - if c.ctx_ != nil { - return ctxhttp.Do(c.ctx_, c.s.client, req) - } - return c.s.client.Do(req) + return gensupport.SendRequest(c.ctx_, c.s.client, req) } // Do executes the "cloudmonitoring.timeseriesDescriptors.list" call. @@ -1818,7 +1815,8 @@ func (c *TimeseriesDescriptorsListCall) Do(opts ...googleapi.CallOption) (*ListT HTTPStatusCode: res.StatusCode, }, } - if err := json.NewDecoder(res.Body).Decode(&ret); err != nil { + target := &ret + if err := json.NewDecoder(res.Body).Decode(target); err != nil { return nil, err } return ret, nil diff --git a/vendor/google.golang.org/api/compute/v1/compute-api.json b/vendor/google.golang.org/api/compute/v1/compute-api.json index b9e0b1ac50..1265f0425d 100644 --- a/vendor/google.golang.org/api/compute/v1/compute-api.json +++ b/vendor/google.golang.org/api/compute/v1/compute-api.json @@ -1,11 +1,11 @@ { "kind": "discovery#restDescription", - "etag": "\"jQLIOHBVnDZie4rQHGH1WJF-INE/-kKJM_jdN_4N4POlnVybNFH0Kag\"", + "etag": "\"C5oy1hgQsABtYOYIOXWcR3BgYqU/IHPQejAPoHbj6rriHVm8lNKt_bg\"", "discoveryVersion": "v1", "id": "compute:v1", "name": "compute", "version": "v1", - "revision": "20160426", + "revision": "20160812", "title": "Compute Engine API", "description": "Creates and runs virtual machines on Google Cloud Platform.", "ownerDomain": "google.com", @@ -94,7 +94,7 @@ "AccessConfig": { "id": "AccessConfig", "type": "object", - "description": "An access configuration attached to an instance's network interface.", + "description": "An access configuration attached to an instance's network interface. Only one access config per instance is supported.", "properties": { "kind": { "type": "string", @@ -272,6 +272,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -300,6 +301,7 @@ "", "", "", + "", "" ] }, @@ -345,6 +347,10 @@ "type": "string", "description": "Specifies a unique device name of your choice that is reflected into the /dev/disk/by-id/google-* tree of a Linux operating system running within the instance. This name can be used to reference the device for mounting, resizing, and so on, from within the instance.\n\nIf not specified, the server chooses a default device name to apply to this disk, in the form persistent-disks-x, where x is a number assigned by Google Compute Engine. This field is only applicable for persistent disks." }, + "diskEncryptionKey": { + "$ref": "CustomerEncryptionKey", + "description": "Encrypts or decrypts a disk using a customer-supplied encryption key.\n\nIf you are creating a new disk, this field encrypts the new disk using an encryption key that you provide. If you are attaching an existing disk that is already encrypted, this field decrypts the disk using the customer-supplied encryption key.\n\nIf you encrypt a disk using a customer-supplied key, you must provide the same key again when you attempt to use this resource at a later time. For example, you must provide the key when you create a snapshot or an image from the disk or when you attach the disk to a virtual machine instance.\n\nIf you do not provide an encryption key, then the disk will be encrypted using an automatically generated key and you do not need to provide a key to use the disk later.\n\nInstance templates do not store customer-supplied encryption keys, so you cannot use your own keys to encrypt disks in a managed instance group." + }, "index": { "type": "integer", "description": "Assigns a zero-based index to this disk, where 0 is reserved for the boot disk. For example, if you have many disks attached to an instance, each disk would have a unique index number. If not specified, the server will choose an appropriate value.", @@ -392,7 +398,7 @@ }, "source": { "type": "string", - "description": "Specifies a valid partial or full URL to an existing Persistent Disk resource. This field is only applicable for persistent disks." + "description": "Specifies a valid partial or full URL to an existing Persistent Disk resource. This field is only applicable for persistent disks. Note that for InstanceTemplate, it is just disk name, not URL for the disk." }, "type": { "type": "string", @@ -429,11 +435,15 @@ }, "diskType": { "type": "string", - "description": "Specifies the disk type to use to create the instance. If not specified, the default is pd-standard, specified using the full URL. For example:\n\nhttps://www.googleapis.com/compute/v1/projects/project/zones/zone/diskTypes/pd-standard \n\nOther values include pd-ssd and local-ssd. If you define this field, you can provide either the full or partial URL. For example, the following are valid values: \n- https://www.googleapis.com/compute/v1/projects/project/zones/zone/diskTypes/diskType \n- projects/project/zones/zone/diskTypes/diskType \n- zones/zone/diskTypes/diskType" + "description": "Specifies the disk type to use to create the instance. If not specified, the default is pd-standard, specified using the full URL. For example:\n\nhttps://www.googleapis.com/compute/v1/projects/project/zones/zone/diskTypes/pd-standard \n\nOther values include pd-ssd and local-ssd. If you define this field, you can provide either the full or partial URL. For example, the following are valid values: \n- https://www.googleapis.com/compute/v1/projects/project/zones/zone/diskTypes/diskType \n- projects/project/zones/zone/diskTypes/diskType \n- zones/zone/diskTypes/diskType Note that for InstanceTemplate, this is the name of the disk type, not URL." }, "sourceImage": { "type": "string", "description": "The source image used to create this disk. If the source image is deleted, this field will not be set.\n\nTo create a disk with one of the public operating system images, specify the image by its family name. For example, specify family/debian-8 to use the latest Debian 8 image:\n\nprojects/debian-cloud/global/images/family/debian-8 \n\nAlternatively, use a specific version of a public operating system image:\n\nprojects/debian-cloud/global/images/debian-8-jessie-vYYYYMMDD \n\nTo create a disk with a private image that you created, specify the image name in the following format:\n\nglobal/images/my-private-image \n\nYou can also specify a private image by its image family, which returns the latest version of the image in that family. Replace the image name with family/family-name:\n\nglobal/images/family/my-private-family" + }, + "sourceImageEncryptionKey": { + "$ref": "CustomerEncryptionKey", + "description": "The customer-supplied encryption key of the source image. Required if the source image is protected by a customer-supplied encryption key.\n\nInstance templates do not store customer-supplied encryption keys, so you cannot create disks for instances in a managed instance group if the source images are encrypted with your own keys." } } }, @@ -444,7 +454,7 @@ "properties": { "autoscalingPolicy": { "$ref": "AutoscalingPolicy", - "description": "The configuration parameters for the autoscaling algorithm. You can define one or more of the policies for an autoscaler: cpuUtilization, customMetricUtilizations, and loadBalancingUtilization.\n\nIf none of these are specified, the default will be to autoscale based on cpuUtilization to 0.8 or 80%." + "description": "The configuration parameters for the autoscaling algorithm. You can define one or more of the policies for an autoscaler: cpuUtilization, customMetricUtilizations, and loadBalancingUtilization.\n\nIf none of these are specified, the default will be to autoscale based on cpuUtilization to 0.6 or 60%." }, "creationTimestamp": { "type": "string", @@ -484,7 +494,7 @@ }, "zone": { "type": "string", - "description": "[Output Only] URL of the zone where the instance group resides." + "description": "[Output Only] URL of the zone where the instance group resides (for autoscalers living in zonal scope)." } } }, @@ -572,6 +582,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -600,6 +611,7 @@ "", "", "", + "", "" ] }, @@ -672,7 +684,7 @@ "properties": { "utilizationTarget": { "type": "number", - "description": "The target CPU utilization that the autoscaler should maintain. Must be a float value in the range (0, 1]. If not specified, the default is 0.8.\n\nIf the CPU level is below the target utilization, the autoscaler scales down the number of instances until it reaches the minimum number of instances you specified or until the average CPU of your instances reaches the target utilization.\n\nIf the average CPU is above the target utilization, the autoscaler scales up until it reaches the maximum number of instances you specified or until the average utilization reaches the target utilization.", + "description": "The target CPU utilization that the autoscaler should maintain. Must be a float value in the range (0, 1]. If not specified, the default is 0.6.\n\nIf the CPU level is below the target utilization, the autoscaler scales down the number of instances until it reaches the minimum number of instances you specified or until the average CPU of your instances reaches the target utilization.\n\nIf the average CPU is above the target utilization, the autoscaler scales up until it reaches the maximum number of instances you specified or until the average utilization reaches the target utilization.", "format": "double" } } @@ -726,7 +738,7 @@ "properties": { "balancingMode": { "type": "string", - "description": "Specifies the balancing mode for this backend. For global HTTP(S) load balancing, the default is UTILIZATION. Valid values are UTILIZATION and RATE.", + "description": "Specifies the balancing mode for this backend. For global HTTP(S) load balancing, the default is UTILIZATION. Valid values are UTILIZATION and RATE.\n\nThis cannot be used for internal load balancing.", "enum": [ "RATE", "UTILIZATION" @@ -738,7 +750,7 @@ }, "capacityScaler": { "type": "number", - "description": "A multiplier applied to the group's maximum servicing capacity (either UTILIZATION or RATE). Default value is 1, which means the group will serve up to 100% of its configured CPU or RPS (depending on balancingMode). A setting of 0 means the group is completely drained, offering 0% of its available CPU or RPS. Valid range is [0.0,1.0].", + "description": "A multiplier applied to the group's maximum servicing capacity (either UTILIZATION or RATE). Default value is 1, which means the group will serve up to 100% of its configured CPU or RPS (depending on balancingMode). A setting of 0 means the group is completely drained, offering 0% of its available CPU or RPS. Valid range is [0.0,1.0].\n\nThis cannot be used for internal load balancing.", "format": "float" }, "description": { @@ -747,21 +759,21 @@ }, "group": { "type": "string", - "description": "The fully-qualified URL of a zonal Instance Group resource. This instance group defines the list of instances that serve traffic. Member virtual machine instances from each instance group must live in the same zone as the instance group itself. No two backends in a backend service are allowed to use same Instance Group resource.\n\nNote that you must specify an Instance Group resource using the fully-qualified URL, rather than a partial URL." + "description": "The fully-qualified URL of a zonal Instance Group resource. This instance group defines the list of instances that serve traffic. Member virtual machine instances from each instance group must live in the same zone as the instance group itself. No two backends in a backend service are allowed to use same Instance Group resource.\n\nNote that you must specify an Instance Group resource using the fully-qualified URL, rather than a partial URL.\n\nWhen the BackendService has load balancing scheme INTERNAL, the instance group must be in a zone within the same region as the BackendService." }, "maxRate": { "type": "integer", - "description": "The max requests per second (RPS) of the group. Can be used with either RATE or UTILIZATION balancing modes, but required if RATE mode. For RATE mode, either maxRate or maxRatePerInstance must be set.", + "description": "The max requests per second (RPS) of the group. Can be used with either RATE or UTILIZATION balancing modes, but required if RATE mode. For RATE mode, either maxRate or maxRatePerInstance must be set.\n\nThis cannot be used for internal load balancing.", "format": "int32" }, "maxRatePerInstance": { "type": "number", - "description": "The max requests per second (RPS) that a single backend instance can handle.This is used to calculate the capacity of the group. Can be used in either balancing mode. For RATE mode, either maxRate or maxRatePerInstance must be set.", + "description": "The max requests per second (RPS) that a single backend instance can handle.This is used to calculate the capacity of the group. Can be used in either balancing mode. For RATE mode, either maxRate or maxRatePerInstance must be set.\n\nThis cannot be used for internal load balancing.", "format": "float" }, "maxUtilization": { "type": "number", - "description": "Used when balancingMode is UTILIZATION. This ratio defines the CPU utilization target for the group. The default is 0.8. Valid range is [0.0, 1.0].", + "description": "Used when balancingMode is UTILIZATION. This ratio defines the CPU utilization target for the group. The default is 0.8. Valid range is [0.0, 1.0].\n\nThis cannot be used for internal load balancing.", "format": "float" } } @@ -771,6 +783,11 @@ "type": "object", "description": "A BackendService resource. This resource defines a group of backend virtual machines and their serving capacity.", "properties": { + "affinityCookieTtlSec": { + "type": "integer", + "description": "Lifetime of cookies in seconds if session_affinity is GENERATED_COOKIE. If set to 0, the cookie is non-persistent and lasts only until the end of the browser session (or equivalent). The maximum allowed value for TTL is one day.\n\nWhen the load balancing scheme is INTERNAL, this field is not used.", + "format": "int32" + }, "backends": { "type": "array", "description": "The list of backends that serve this BackendService.", @@ -786,6 +803,10 @@ "type": "string", "description": "An optional description of this resource. Provide this property when you create the resource." }, + "enableCDN": { + "type": "boolean", + "description": "If true, enable Cloud CDN for this BackendService.\n\nWhen the load balancing scheme is INTERNAL, this field is not used." + }, "fingerprint": { "type": "string", "description": "Fingerprint of this resource. A hash of the contents stored in this object. This field is used in optimistic locking. This field will be ignored when inserting a BackendService. An up-to-date fingerprint must be provided in order to update the BackendService.", @@ -793,7 +814,7 @@ }, "healthChecks": { "type": "array", - "description": "The list of URLs to the HttpHealthCheck or HttpsHealthCheck resource for health checking this BackendService. Currently at most one health check can be specified, and a health check is required.", + "description": "The list of URLs to the HttpHealthCheck or HttpsHealthCheck resource for health checking this BackendService. Currently at most one health check can be specified, and a health check is required.\n\nFor internal load balancing, a URL to a HealthCheck resource must be specified instead.", "items": { "type": "string" } @@ -815,16 +836,16 @@ }, "port": { "type": "integer", - "description": "Deprecated in favor of portName. The TCP port to connect on the backend. The default value is 80.", + "description": "Deprecated in favor of portName. The TCP port to connect on the backend. The default value is 80.\n\nThis cannot be used for internal load balancing.", "format": "int32" }, "portName": { "type": "string", - "description": "Name of backend port. The same name should appear in the instance groups referenced by this service. Required." + "description": "Name of backend port. The same name should appear in the instance groups referenced by this service. Required when the load balancing scheme is EXTERNAL.\n\nWhen the load balancing scheme is INTERNAL, this field is not used." }, "protocol": { "type": "string", - "description": "The protocol this BackendService uses to communicate with backends.\n\nPossible values are HTTP, HTTPS, HTTP2, TCP and SSL.", + "description": "The protocol this BackendService uses to communicate with backends.\n\nPossible values are HTTP, HTTPS, HTTP2, TCP and SSL. The default is HTTP.\n\nFor internal load balancing, the possible values are TCP and UDP, and the default is TCP.", "enum": [ "HTTP", "HTTPS" @@ -842,6 +863,22 @@ "type": "string", "description": "[Output Only] Server-defined URL for the resource." }, + "sessionAffinity": { + "type": "string", + "description": "Type of session affinity to use. The default is NONE.\n\nWhen the load balancing scheme is EXTERNAL, can be NONE, CLIENT_IP, or GENERATED_COOKIE.\n\nWhen the load balancing scheme is INTERNAL, can be NONE, CLIENT_IP, CLIENT_IP_PROTO, or CLIENT_IP_PORT_PROTO.\n\nWhen the protocol is UDP, this field is not used.", + "enum": [ + "CLIENT_IP", + "CLIENT_IP_PROTO", + "GENERATED_COOKIE", + "NONE" + ], + "enumDescriptions": [ + "", + "", + "", + "" + ] + }, "timeoutSec": { "type": "integer", "description": "How many seconds to wait for the backend before considering it a failed request. Default is 30 seconds.", @@ -873,7 +910,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + "description": "[Output Only] Unique identifier for the resource; defined by the server." }, "items": { "type": "array", @@ -889,7 +926,7 @@ }, "nextPageToken": { "type": "string", - "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + "description": "[Output Only] A token used to continue a truncated list request." }, "selfLink": { "type": "string", @@ -897,6 +934,44 @@ } } }, + "CacheInvalidationRule": { + "id": "CacheInvalidationRule", + "type": "object", + "properties": { + "path": { + "type": "string" + } + } + }, + "CustomerEncryptionKey": { + "id": "CustomerEncryptionKey", + "type": "object", + "description": "Represents a customer-supplied encryption key", + "properties": { + "rawKey": { + "type": "string", + "description": "Specifies a 256-bit customer-supplied encryption key, encoded in RFC 4648 base64 to either encrypt or decrypt this resource." + }, + "sha256": { + "type": "string", + "description": "[Output only] The RFC 4648 base64 encoded SHA-256 hash of the customer-supplied encryption key that protects this resource." + } + } + }, + "CustomerEncryptionKeyProtectedDisk": { + "id": "CustomerEncryptionKeyProtectedDisk", + "type": "object", + "properties": { + "diskEncryptionKey": { + "$ref": "CustomerEncryptionKey", + "description": "Decrypts data associated with the disk with a customer-supplied encryption key." + }, + "source": { + "type": "string", + "description": "Specifies a valid partial or full URL to an existing Persistent Disk resource. This field is only applicable for persistent disks." + } + } + }, "DeprecationStatus": { "id": "DeprecationStatus", "type": "object", @@ -947,6 +1022,10 @@ "type": "string", "description": "An optional description of this resource. Provide this property when you create the resource." }, + "diskEncryptionKey": { + "$ref": "CustomerEncryptionKey", + "description": "Encrypts the disk using a customer-supplied encryption key.\n\nAfter you encrypt a disk with a customer-supplied key, you must provide the same key if you use the disk later (e.g. to create a disk snapshot or an image, or to attach the disk to a virtual machine).\n\nCustomer-supplied encryption keys do not protect access to metadata of the disk.\n\nIf you do not provide an encryption key when creating the disk, then the disk will be encrypted using an automatically generated key and you do not need to provide a key to use the disk later." + }, "id": { "type": "string", "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.", @@ -967,7 +1046,7 @@ }, "licenses": { "type": "array", - "description": "[Output Only] Any applicable publicly visible licenses.", + "description": "Any applicable publicly visible licenses.", "items": { "type": "string" } @@ -999,6 +1078,10 @@ "type": "string", "description": "The source image used to create this disk. If the source image is deleted, this field will not be set.\n\nTo create a disk with one of the public operating system images, specify the image by its family name. For example, specify family/debian-8 to use the latest Debian 8 image:\n\nprojects/debian-cloud/global/images/family/debian-8 \n\nAlternatively, use a specific version of a public operating system image:\n\nprojects/debian-cloud/global/images/debian-8-jessie-vYYYYMMDD \n\nTo create a disk with a private image that you created, specify the image name in the following format:\n\nglobal/images/my-private-image \n\nYou can also specify a private image by its image family, which returns the latest version of the image in that family. Replace the image name with family/family-name:\n\nglobal/images/family/my-private-family" }, + "sourceImageEncryptionKey": { + "$ref": "CustomerEncryptionKey", + "description": "The customer-supplied encryption key of the source image. Required if the source image is protected by a customer-supplied encryption key." + }, "sourceImageId": { "type": "string", "description": "[Output Only] The ID value of the image used to create this disk. This value identifies the exact image that was used to create this persistent disk. For example, if you created the persistent disk from an image that was later deleted and recreated under the same name, the source image ID would identify the exact version of the image that was used." @@ -1007,6 +1090,10 @@ "type": "string", "description": "The source snapshot used to create this disk. You can provide this as a partial or full URL to the resource. For example, the following are valid values: \n- https://www.googleapis.com/compute/v1/projects/project/global/snapshots/snapshot \n- projects/project/global/snapshots/snapshot \n- global/snapshots/snapshot" }, + "sourceSnapshotEncryptionKey": { + "$ref": "CustomerEncryptionKey", + "description": "The customer-supplied encryption key of the source snapshot. Required if the source snapshot is protected by a customer-supplied encryption key." + }, "sourceSnapshotId": { "type": "string", "description": "[Output Only] The unique ID of the snapshot used to create this disk. This value identifies the exact snapshot that was used to create this persistent disk. For example, if you created the persistent disk from a snapshot that was later deleted and recreated under the same name, the source snapshot ID would identify the exact version of the snapshot that was used." @@ -1255,6 +1342,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -1283,6 +1371,7 @@ "", "", "", + "", "" ] }, @@ -1344,6 +1433,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -1372,6 +1462,7 @@ "", "", "", + "", "" ] }, @@ -1407,17 +1498,17 @@ "properties": { "allowed": { "type": "array", - "description": "The list of rules specified by this firewall. Each rule specifies a protocol and port-range tuple that describes a permitted connection.", + "description": "The list of ALLOW rules specified by this firewall. Each rule specifies a protocol and port-range tuple that describes a permitted connection.", "items": { "type": "object", "properties": { "IPProtocol": { "type": "string", - "description": "The IP protocol that is allowed for this rule. The protocol type is required when creating a firewall rule. This value can either be one of the following well known protocol strings (tcp, udp, icmp, esp, ah, sctp), or the IP protocol number." + "description": "The IP protocol to which this rule applies. The protocol type is required when creating a firewall rule. This value can either be one of the following well known protocol strings (tcp, udp, icmp, esp, ah, sctp), or the IP protocol number." }, "ports": { "type": "array", - "description": "An optional list of ports which are allowed. This field is only applicable for UDP or TCP protocol. Each entry must be either an integer or a range. If not specified, connections through any port are allowed\n\nExample inputs include: [\"22\"], [\"80\",\"443\"], and [\"12345-12349\"].", + "description": "An optional list of ports to which this rule applies. This field is only applicable for UDP or TCP protocol. Each entry must be either an integer or a range. If not specified, this rule applies to connections through any port.\n\nExample inputs include: [\"22\"], [\"80\",\"443\"], and [\"12345-12349\"].", "items": { "type": "string" } @@ -1464,14 +1555,14 @@ }, "sourceRanges": { "type": "array", - "description": "The IP address blocks that this rule applies to, expressed in CIDR format. One or both of sourceRanges and sourceTags may be set.\n\nIf both properties are set, an inbound connection is allowed if the range matches the sourceRanges OR the tag of the source matches the sourceTags property. The connection does not need to match both properties.", + "description": "If source ranges are specified, the firewall will apply only to traffic that has source IP address in these ranges. These ranges must be expressed in CIDR format. One or both of sourceRanges and sourceTags may be set. If both properties are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP that belongs to a tag listed in the sourceTags property. The connection does not need to match both properties for the firewall to apply.", "items": { "type": "string" } }, "sourceTags": { "type": "array", - "description": "A list of instance tags which this rule applies to. One or both of sourceRanges and sourceTags may be set.\n\nIf both properties are set, an inbound connection is allowed if the range matches the sourceRanges OR the tag of the source matches the sourceTags property. The connection does not need to match both properties.", + "description": "If source tags are specified, the firewall will apply only to traffic with source IP that belongs to a tag listed in source tags. Source tags cannot be used to control traffic to an instance's external IP address. Because tags are associated with an instance, not an IP address. One or both of sourceRanges and sourceTags may be set. If both properties are set, the firewall will apply to traffic that has source IP address within sourceRanges OR the source IP that belongs to a tag listed in the sourceTags property. The connection does not need to match both properties for the firewall to apply.", "items": { "type": "string" } @@ -1523,11 +1614,11 @@ "properties": { "IPAddress": { "type": "string", - "description": "Value of the reserved IP address that this forwarding rule is serving on behalf of. For global forwarding rules, the address must be a global IP; for regional forwarding rules, the address must live in the same region as the forwarding rule. If left empty (default value), an ephemeral IP from the same scope (global or regional) will be assigned." + "description": "The IP address that this forwarding rule is serving on behalf of.\n\nFor global forwarding rules, the address must be a global IP; for regional forwarding rules, the address must live in the same region as the forwarding rule. By default, this field is empty and an ephemeral IP from the same scope (global or regional) will be assigned.\n\nWhen the load balancing scheme is INTERNAL, this can only be an RFC 1918 IP address belonging to the network/subnetwork configured for the forwarding rule. A reserved address cannot be used. If the field is empty, the IP address will be automatically allocated from the internal IP range of the subnetwork or network configured for this forwarding rule." }, "IPProtocol": { "type": "string", - "description": "The IP protocol to which this rule applies. Valid options are TCP, UDP, ESP, AH, SCTP or ICMP.", + "description": "The IP protocol to which this rule applies. Valid options are TCP, UDP, ESP, AH, SCTP or ICMP.\n\nWhen the load balancing scheme is INTERNAL\u003c/code, only TCP and UDP are valid.", "enum": [ "AH", "ESP", @@ -1568,7 +1659,7 @@ }, "portRange": { "type": "string", - "description": "Applicable only when IPProtocol is TCP, UDP, or SCTP, only packets addressed to ports in the specified range will be forwarded to target. Forwarding rules with the same [IPAddress, IPProtocol] pair must have disjoint port ranges." + "description": "Applicable only when IPProtocol is TCP, UDP, or SCTP, only packets addressed to ports in the specified range will be forwarded to target. Forwarding rules with the same [IPAddress, IPProtocol] pair must have disjoint port ranges.\n\nThis field is not used for internal load balancing." }, "region": { "type": "string", @@ -1580,7 +1671,7 @@ }, "target": { "type": "string", - "description": "The URL of the target resource to receive the matched traffic. For regional forwarding rules, this target must live in the same region as the forwarding rule. For global forwarding rules, this target must be a global TargetHttpProxy or TargetHttpsProxy resource. The forwarded traffic must be of a type appropriate to the target object. For example, TargetHttpProxy requires HTTP traffic, and TargetHttpsProxy requires HTTPS traffic." + "description": "The URL of the target resource to receive the matched traffic. For regional forwarding rules, this target must live in the same region as the forwarding rule. For global forwarding rules, this target must be a global TargetHttpProxy or TargetHttpsProxy resource. The forwarded traffic must be of a type appropriate to the target object. For example, TargetHttpProxy requires HTTP traffic, and TargetHttpsProxy requires HTTPS traffic.\n\nThis field is not used for internal load balancing." } } }, @@ -1668,6 +1759,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -1696,6 +1788,7 @@ "", "", "", + "", "" ] }, @@ -2012,13 +2105,17 @@ }, "family": { "type": "string", - "description": "The name of the image family to which this image belongs. You can create disks by specifying an image family instead of a specific image name. The image family always returns its latest image that is not deprecated." + "description": "The name of the image family to which this image belongs. You can create disks by specifying an image family instead of a specific image name. The image family always returns its latest image that is not deprecated. The name of the image family must comply with RFC1035." }, "id": { "type": "string", "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.", "format": "uint64" }, + "imageEncryptionKey": { + "$ref": "CustomerEncryptionKey", + "description": "Encrypts the image using a customer-supplied encryption key.\n\nAfter you encrypt an image with a customer-supplied key, you must provide the same key if you use the image later (e.g. to create a disk from the image).\n\nCustomer-supplied encryption keys do not protect access to metadata of the disk.\n\nIf you do not provide an encryption key when creating the image, then the disk will be encrypted using an automatically generated key and you do not need to provide a key to use the image later." + }, "kind": { "type": "string", "description": "[Output Only] Type of the resource. Always compute#image for images.", @@ -2026,7 +2123,7 @@ }, "licenses": { "type": "array", - "description": "Any applicable publicly visible licenses.", + "description": "Any applicable license URI.", "items": { "type": "string" } @@ -2079,6 +2176,10 @@ "type": "string", "description": "URL of the The source disk used to create this image. This can be a full or valid partial URL. You must provide either this property or the rawDisk.source property but not both to create an image. For example, the following are valid values: \n- https://www.googleapis.com/compute/v1/projects/project/zones/zone/disk/disk \n- projects/project/zones/zone/disk/disk \n- zones/zone/disks/disk" }, + "sourceDiskEncryptionKey": { + "$ref": "CustomerEncryptionKey", + "description": "The customer-supplied encryption key of the source disk. Required if the source disk is protected by a customer-supplied encryption key." + }, "sourceDiskId": { "type": "string", "description": "The ID value of the disk used to create this image. This value may be used to determine whether the image was taken from the current or a previous instance of a given disk name." @@ -2198,7 +2299,7 @@ }, "networkInterfaces": { "type": "array", - "description": "An array of configurations for this interface. This specifies how this interface is configured to interact with other network services, such as connecting to the internet.", + "description": "An array of configurations for this interface. This specifies how this interface is configured to interact with other network services, such as connecting to the internet. Only one interface is supported per instance.", "items": { "$ref": "NetworkInterface" } @@ -2213,14 +2314,14 @@ }, "serviceAccounts": { "type": "array", - "description": "A list of service accounts, with their specified scopes, authorized for this instance. Service accounts generate access tokens that can be accessed through the metadata server and used to authenticate applications on the instance. See Authenticating from Google Compute Engine for more information.", + "description": "A list of service accounts, with their specified scopes, authorized for this instance. Service accounts generate access tokens that can be accessed through the metadata server and used to authenticate applications on the instance. See Service Accounts for more information.", "items": { "$ref": "ServiceAccount" } }, "status": { "type": "string", - "description": "[Output Only] The status of the instance. One of the following values: PROVISIONING, STAGING, RUNNING, STOPPING, and TERMINATED.", + "description": "[Output Only] The status of the instance. One of the following values: PROVISIONING, STAGING, RUNNING, STOPPING, SUSPENDED, SUSPENDING, and TERMINATED.", "enum": [ "PROVISIONING", "RUNNING", @@ -2350,7 +2451,7 @@ }, "zone": { "type": "string", - "description": "[Output Only] The URL of the zone where the instance group is located." + "description": "[Output Only] The URL of the zone where the instance group is located (for zonal resources)." } } }, @@ -2419,6 +2520,7 @@ "InstanceGroupManager": { "id": "InstanceGroupManager", "type": "object", + "description": "An Instance Group Manager resource.", "properties": { "baseInstanceName": { "type": "string", @@ -2505,7 +2607,7 @@ }, "zone": { "type": "string", - "description": "The name of the zone where the managed instance group is located." + "description": "[Output Only] The URL of the zone where the managed instance group is located (for zonal resources)." } } }, @@ -2520,7 +2622,12 @@ }, "creating": { "type": "integer", - "description": "[Output Only] The number of instances in the managed instance group that are scheduled to be created or are currently being created. If the group fails to create one of these instances, it tries again until it creates the instance successfully.", + "description": "[Output Only] The number of instances in the managed instance group that are scheduled to be created or are currently being created. If the group fails to create any of these instances, it tries again until it creates the instance successfully.\n\nIf you have disabled creation retries, this field will not be populated; instead, the creatingWithoutRetries field will be populated.", + "format": "int32" + }, + "creatingWithoutRetries": { + "type": "integer", + "description": "[Output Only] The number of instances that the managed instance group will attempt to create. The group attempts to create each instance only once. If the group fails to create any of these instances, it decreases the group's target_size value accordingly.", "format": "int32" }, "deleting": { @@ -2686,6 +2793,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -2714,6 +2822,7 @@ "", "", "", + "", "" ] }, @@ -2789,7 +2898,7 @@ "properties": { "id": { "type": "string", - "description": "[Output Only] A unique identifier for this list of instance groups. The server generates this identifier." + "description": "[Output Only] A unique identifier for this list of instances in the specified instance group. The server generates this identifier." }, "items": { "type": "array", @@ -2800,7 +2909,7 @@ }, "kind": { "type": "string", - "description": "[Output Only] The resource type, which is always compute#instanceGroupsListInstances for lists of instance groups.", + "description": "[Output Only] The resource type, which is always compute#instanceGroupsListInstances for the list of instances in the specified instance group.", "default": "compute#instanceGroupsListInstances" }, "nextPageToken": { @@ -2809,7 +2918,7 @@ }, "selfLink": { "type": "string", - "description": "[Output Only] The URL for this list of instance groups. The server generates this URL." + "description": "[Output Only] The URL for this list of instances in the specified instance groups. The server generates this URL." } } }, @@ -2866,6 +2975,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -2894,6 +3004,7 @@ "", "", "", + "", "" ] }, @@ -2992,7 +3103,7 @@ "properties": { "canIpForward": { "type": "boolean", - "description": "Enables instances created based on this template to send packets with source IP addresses other than their own and receive packets with destination IP addresses other than their own. If these instances will be used as an IP gateway or it will be set as the next-hop in a Route resource, specify true. If unsure, leave this set to false. See the canIpForward documentation for more information." + "description": "Enables instances created based on this template to send packets with source IP addresses other than their own and receive packets with destination IP addresses other than their own. If these instances will be used as an IP gateway or it will be set as the next-hop in a Route resource, specify true. If unsure, leave this set to false. See the Enable IP forwarding for instances documentation for more information." }, "description": { "type": "string", @@ -3189,6 +3300,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -3217,6 +3329,7 @@ "", "", "", + "", "" ] }, @@ -3255,6 +3368,19 @@ } } }, + "InstancesStartWithEncryptionKeyRequest": { + "id": "InstancesStartWithEncryptionKeyRequest", + "type": "object", + "properties": { + "disks": { + "type": "array", + "description": "Array of disks associated with this instance that are protected with a customer-supplied encryption key.\n\nIn order to start the instance, the disk url and its corresponding key must be provided.\n\nIf the disk is not protected with a customer-supplied encryption key it should not be specified.", + "items": { + "$ref": "CustomerEncryptionKeyProtectedDisk" + } + } + } + }, "License": { "id": "License", "type": "object", @@ -3317,6 +3443,10 @@ "description": "[Deprecated] This property is deprecated and will never be populated with any relevant values.", "format": "int32" }, + "isSharedCpu": { + "type": "boolean", + "description": "[Output Only] Whether this machine type has a shared CPU. See Shared-core machine types for more information." + }, "kind": { "type": "string", "description": "[Output Only] The type of the resource. Always compute#machineType for machine types.", @@ -3450,6 +3580,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -3478,6 +3609,7 @@ "", "", "", + "", "" ] }, @@ -3512,10 +3644,11 @@ "properties": { "currentAction": { "type": "string", - "description": "[Output Only] The current action that the managed instance group has scheduled for the instance. Possible values: \n- NONE The instance is running, and the managed instance group does not have any scheduled actions for this instance. \n- CREATING The managed instance group is creating this instance. If the group fails to create this instance, it will try again until it is successful. \n- CREATING_WITHOUT_RETRIES The managed instance group is attempting to create this instance only once. If the group fails to create this instance, it does not try again and the group's target_size value is decreased. \n- RECREATING The managed instance group is recreating this instance. \n- DELETING The managed instance group is permanently deleting this instance. \n- ABANDONING The managed instance group is abandoning this instance. The instance will be removed from the instance group and from any target pools that are associated with this group. \n- RESTARTING The managed instance group is restarting the instance. \n- REFRESHING The managed instance group is applying configuration changes to the instance without stopping it. For example, the group can update the target pool list for an instance without stopping that instance.", + "description": "[Output Only] The current action that the managed instance group has scheduled for the instance. Possible values: \n- NONE The instance is running, and the managed instance group does not have any scheduled actions for this instance. \n- CREATING The managed instance group is creating this instance. If the group fails to create this instance, it will try again until it is successful. \n- CREATING_WITHOUT_RETRIES The managed instance group is attempting to create this instance only once. If the group fails to create this instance, it does not try again and the group's targetSize value is decreased instead. \n- RECREATING The managed instance group is recreating this instance. \n- DELETING The managed instance group is permanently deleting this instance. \n- ABANDONING The managed instance group is abandoning this instance. The instance will be removed from the instance group and from any target pools that are associated with this group. \n- RESTARTING The managed instance group is restarting the instance. \n- REFRESHING The managed instance group is applying configuration changes to the instance without stopping it. For example, the group can update the target pool list for an instance without stopping that instance.", "enum": [ "ABANDONING", "CREATING", + "CREATING_WITHOUT_RETRIES", "DELETING", "NONE", "RECREATING", @@ -3529,6 +3662,7 @@ "", "", "", + "", "" ] }, @@ -3734,7 +3868,7 @@ "properties": { "accessConfigs": { "type": "array", - "description": "An array of configurations for this interface. Currently, ONE_TO_ONE_NAT is the only access config supported. If there are no accessConfigs specified, then this instance will have no external internet access.", + "description": "An array of configurations for this interface. Currently, only one access config, ONE_TO_ONE_NAT, is supported. If there are no accessConfigs specified, then this instance will have no external internet access.", "items": { "$ref": "AccessConfig" } @@ -3754,7 +3888,7 @@ }, "networkIP": { "type": "string", - "description": "An IPV4 internal network address to assign to the instance for this network interface. If not specified by user an unused internal IP is assigned by system." + "description": "An IPv4 internal network address to assign to the instance for this network interface. If not specified by the user, an unused internal IP is assigned by the system." }, "subnetwork": { "type": "string", @@ -3933,6 +4067,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -3961,6 +4096,7 @@ "", "", "", + "", "" ] }, @@ -4078,6 +4214,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -4106,6 +4243,7 @@ "", "", "", + "", "" ] }, @@ -4191,6 +4329,10 @@ "type": "string", "description": "[Output Only] Creation timestamp in RFC3339 text format." }, + "defaultServiceAccount": { + "type": "string", + "description": "[Output Only] Default service account used by VMs running in this project." + }, "description": { "type": "string", "description": "An optional textual description of the resource." @@ -4262,6 +4404,7 @@ "IN_USE_ADDRESSES", "LOCAL_SSD_TOTAL_GB", "NETWORKS", + "ROUTERS", "ROUTES", "SNAPSHOTS", "SSD_TOTAL_GB", @@ -4272,6 +4415,7 @@ "TARGET_HTTP_PROXIES", "TARGET_INSTANCES", "TARGET_POOLS", + "TARGET_SSL_PROXIES", "TARGET_VPN_GATEWAYS", "URL_MAPS", "VPN_TUNNELS" @@ -4304,6 +4448,8 @@ "", "", "", + "", + "", "" ] }, @@ -4528,6 +4674,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -4556,6 +4703,7 @@ "", "", "", + "", "" ] }, @@ -4616,6 +4764,389 @@ } } }, + "Router": { + "id": "Router", + "type": "object", + "description": "Router resource.", + "properties": { + "bgp": { + "$ref": "RouterBgp", + "description": "BGP information specific to this router." + }, + "bgpPeers": { + "type": "array", + "description": "BGP information that needs to be configured into the routing stack to establish the BGP peering. It must specify peer ASN and either interface name, IP, or peer IP. Please refer to RFC4273.", + "items": { + "$ref": "RouterBgpPeer" + } + }, + "creationTimestamp": { + "type": "string", + "description": "[Output Only] Creation timestamp in RFC3339 text format." + }, + "description": { + "type": "string", + "description": "An optional description of this resource. Provide this property when you create the resource." + }, + "id": { + "type": "string", + "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server.", + "format": "uint64" + }, + "interfaces": { + "type": "array", + "description": "Router interfaces. Each interface requires either one linked resource (e.g. linkedVpnTunnel) or IP address and IP address range (e.g. ipRange).", + "items": { + "$ref": "RouterInterface" + } + }, + "kind": { + "type": "string", + "description": "[Output Only] Type of resource. Always compute#router for routers.", + "default": "compute#router" + }, + "name": { + "type": "string", + "description": "Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035. Specifically, the name must be 1-63 characters long and match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.", + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "annotations": { + "required": [ + "compute.routers.insert" + ] + } + }, + "network": { + "type": "string", + "description": "URI of the network to which this router belongs.", + "annotations": { + "required": [ + "compute.routers.insert" + ] + } + }, + "region": { + "type": "string", + "description": "[Output Only] URI of the region where the router resides." + }, + "selfLink": { + "type": "string", + "description": "[Output Only] Server-defined URL for the resource." + } + } + }, + "RouterAggregatedList": { + "id": "RouterAggregatedList", + "type": "object", + "description": "Contains a list of routers.", + "properties": { + "id": { + "type": "string", + "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + }, + "items": { + "type": "object", + "description": "A map of scoped router lists.", + "additionalProperties": { + "$ref": "RoutersScopedList", + "description": "Name of the scope containing this set of routers." + } + }, + "kind": { + "type": "string", + "description": "Type of resource.", + "default": "compute#routerAggregatedList" + }, + "nextPageToken": { + "type": "string", + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + }, + "selfLink": { + "type": "string", + "description": "[Output Only] Server-defined URL for this resource." + } + } + }, + "RouterBgp": { + "id": "RouterBgp", + "type": "object", + "properties": { + "asn": { + "type": "integer", + "description": "Local BGP Autonomous System Number (ASN). Must be an RFC6996 private ASN, either 16-bit or 32-bit. The value will be fixed for this router resource. All VPN tunnels that link to this router will have the same local ASN.", + "format": "uint32" + } + } + }, + "RouterBgpPeer": { + "id": "RouterBgpPeer", + "type": "object", + "properties": { + "advertisedRoutePriority": { + "type": "integer", + "description": "The priority of routes advertised to this BGP peer. In the case where there is more than one matching route of maximum length, the routes with lowest priority value win.", + "format": "uint32" + }, + "interfaceName": { + "type": "string", + "description": "Name of the interface the BGP peer is associated with." + }, + "ipAddress": { + "type": "string", + "description": "IP address of the interface inside Google Cloud Platform." + }, + "name": { + "type": "string", + "description": "Name of this BGP peer. The name must be 1-63 characters long and comply with RFC1035.", + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?" + }, + "peerAsn": { + "type": "integer", + "description": "Peer BGP Autonomous System Number (ASN). For VPN use case, this value can be different for every tunnel.", + "format": "uint32" + }, + "peerIpAddress": { + "type": "string", + "description": "IP address of the BGP interface outside Google cloud." + } + } + }, + "RouterInterface": { + "id": "RouterInterface", + "type": "object", + "properties": { + "ipRange": { + "type": "string", + "description": "IP address and range of the interface. The IP range must be in the RFC3927 link-local IP space. The value must be a CIDR-formatted string, for example: 169.254.0.1/30. NOTE: Do not truncate the address as it represents the IP address of the interface." + }, + "linkedVpnTunnel": { + "type": "string", + "description": "URI of linked VPN tunnel. It must be in the same region as the router. Each interface can have at most one linked resource." + }, + "name": { + "type": "string", + "description": "Name of this interface entry. The name must be 1-63 characters long and comply with RFC1035.", + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?" + } + } + }, + "RouterList": { + "id": "RouterList", + "type": "object", + "description": "Contains a list of Router resources.", + "properties": { + "id": { + "type": "string", + "description": "[Output Only] The unique identifier for the resource. This identifier is defined by the server." + }, + "items": { + "type": "array", + "description": "A list of Router resources.", + "items": { + "$ref": "Router" + } + }, + "kind": { + "type": "string", + "description": "[Output Only] Type of resource. Always compute#router for routers.", + "default": "compute#routerList" + }, + "nextPageToken": { + "type": "string", + "description": "[Output Only] This token allows you to get the next page of results for list requests. If the number of results is larger than maxResults, use the nextPageToken as a value for the query parameter pageToken in the next list request. Subsequent list requests will have their own nextPageToken to continue paging through the results." + }, + "selfLink": { + "type": "string", + "description": "[Output Only] Server-defined URL for the resource." + } + } + }, + "RouterStatus": { + "id": "RouterStatus", + "type": "object", + "properties": { + "bestRoutes": { + "type": "array", + "description": "Best routes for this router's network.", + "items": { + "$ref": "Route" + } + }, + "bgpPeerStatus": { + "type": "array", + "items": { + "$ref": "RouterStatusBgpPeerStatus" + } + }, + "network": { + "type": "string", + "description": "URI of the network to which this router belongs." + } + } + }, + "RouterStatusBgpPeerStatus": { + "id": "RouterStatusBgpPeerStatus", + "type": "object", + "properties": { + "advertisedRoutes": { + "type": "array", + "description": "Routes that were advertised to the remote BGP peer", + "items": { + "$ref": "Route" + } + }, + "ipAddress": { + "type": "string", + "description": "IP address of the local BGP interface." + }, + "linkedVpnTunnel": { + "type": "string", + "description": "URL of the VPN tunnel that this BGP peer controls." + }, + "name": { + "type": "string", + "description": "Name of this BGP peer. Unique within the Routers resource." + }, + "numLearnedRoutes": { + "type": "integer", + "description": "Number of routes learned from the remote BGP Peer.", + "format": "uint32" + }, + "peerIpAddress": { + "type": "string", + "description": "IP address of the remote BGP interface." + }, + "state": { + "type": "string", + "description": "BGP state as specified in RFC1771." + }, + "status": { + "type": "string", + "description": "Status of the BGP peer: {UP, DOWN}", + "enum": [ + "DOWN", + "UNKNOWN", + "UP" + ], + "enumDescriptions": [ + "", + "", + "" + ] + }, + "uptime": { + "type": "string", + "description": "Time this session has been up. Format: 14 years, 51 weeks, 6 days, 23 hours, 59 minutes, 59 seconds" + }, + "uptimeSeconds": { + "type": "string", + "description": "Time this session has been up, in seconds. Format: 145" + } + } + }, + "RouterStatusResponse": { + "id": "RouterStatusResponse", + "type": "object", + "properties": { + "kind": { + "type": "string", + "description": "Type of resource.", + "default": "compute#routerStatusResponse" + }, + "result": { + "$ref": "RouterStatus" + } + } + }, + "RoutersPreviewResponse": { + "id": "RoutersPreviewResponse", + "type": "object", + "properties": { + "resource": { + "$ref": "Router", + "description": "Preview of given router." + } + } + }, + "RoutersScopedList": { + "id": "RoutersScopedList", + "type": "object", + "properties": { + "routers": { + "type": "array", + "description": "List of routers contained in this scope.", + "items": { + "$ref": "Router" + } + }, + "warning": { + "type": "object", + "description": "Informational warning which replaces the list of routers when the list is empty.", + "properties": { + "code": { + "type": "string", + "description": "[Output Only] A warning code, if applicable. For example, Compute Engine returns NO_RESULTS_ON_PAGE if there are no results in the response.", + "enum": [ + "CLEANUP_FAILED", + "DEPRECATED_RESOURCE_USED", + "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", + "INJECTED_KERNELS_DEPRECATED", + "NEXT_HOP_ADDRESS_NOT_ASSIGNED", + "NEXT_HOP_CANNOT_IP_FORWARD", + "NEXT_HOP_INSTANCE_NOT_FOUND", + "NEXT_HOP_INSTANCE_NOT_ON_NETWORK", + "NEXT_HOP_NOT_RUNNING", + "NOT_CRITICAL_ERROR", + "NO_RESULTS_ON_PAGE", + "REQUIRED_TOS_AGREEMENT", + "RESOURCE_NOT_DELETED", + "SINGLE_INSTANCE_PROPERTY_TEMPLATE", + "UNREACHABLE" + ], + "enumDescriptions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "data": { + "type": "array", + "description": "[Output Only] Metadata about this warning in key: value format. For example:\n\"data\": [ { \"key\": \"scope\", \"value\": \"zones/us-east1-d\" }", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "[Output Only] A key that provides more detail on the warning being returned. For example, for warnings where there are no results in a list request for a particular zone, this key might be scope and the key value might be the zone name. Other examples might be a key indicating a deprecated resource and a suggested replacement, or a warning about invalid network settings (for example, if an instance attempts to perform IP forwarding but is not enabled for IP forwarding)." + }, + "value": { + "type": "string", + "description": "[Output Only] A warning data value corresponding to the key." + } + } + } + }, + "message": { + "type": "string", + "description": "[Output Only] A human-readable description of the warning code." + } + } + } + } + }, "Scheduling": { "id": "Scheduling", "type": "object", @@ -4725,10 +5256,18 @@ "type": "string", "description": "[Output Only] Server-defined URL for the resource." }, + "snapshotEncryptionKey": { + "$ref": "CustomerEncryptionKey", + "description": "Encrypts the snapshot using a customer-supplied encryption key.\n\nAfter you encrypt a snapshot using a customer-supplied key, you must provide the same key if you use the image later For example, you must provide the encryption key when you create a disk from the encrypted snapshot in a future request.\n\nCustomer-supplied encryption keys do not protect access to metadata of the disk.\n\nIf you do not provide an encryption key when creating the snapshot, then the snapshot will be encrypted using an automatically generated key and you do not need to provide a key to use the snapshot later." + }, "sourceDisk": { "type": "string", "description": "[Output Only] The source disk used to create this snapshot." }, + "sourceDiskEncryptionKey": { + "$ref": "CustomerEncryptionKey", + "description": "The customer-supplied encryption key of the source disk. Required if the source disk is protected by a customer-supplied encryption key." + }, "sourceDiskId": { "type": "string", "description": "[Output Only] The ID value of the disk used to create this snapshot. This value may be used to determine whether the snapshot was taken from the current or a previous instance of a given disk name." @@ -5008,6 +5547,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -5036,6 +5576,7 @@ "", "", "", + "", "" ] }, @@ -5377,6 +5918,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -5405,6 +5947,7 @@ "", "", "", + "", "" ] }, @@ -5498,9 +6041,11 @@ "enum": [ "CLIENT_IP", "CLIENT_IP_PROTO", + "GENERATED_COOKIE", "NONE" ], "enumDescriptions": [ + "", "", "", "" @@ -5661,6 +6206,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -5689,6 +6235,7 @@ "", "", "", + "", "" ] }, @@ -5892,6 +6439,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -5920,6 +6468,7 @@ "", "", "", + "", "" ] }, @@ -6210,6 +6759,17 @@ "type": "string", "description": "[Output Only] URL of the region where the VPN tunnel resides." }, + "remoteTrafficSelector": { + "type": "array", + "description": "Remote traffic selectors to use when establishing the VPN tunnel with peer VPN gateway. The value should be a CIDR formatted string, for example: 192.168.0.0/16. The ranges should be disjoint.", + "items": { + "type": "string" + } + }, + "router": { + "type": "string", + "description": "URL of router resource to be used for dynamic routing." + }, "selfLink": { "type": "string", "description": "[Output Only] Server-defined URL for the resource." @@ -6349,6 +6909,7 @@ "CLEANUP_FAILED", "DEPRECATED_RESOURCE_USED", "DISK_SIZE_LARGER_THAN_IMAGE_SIZE", + "FIELD_VALUE_OVERRIDEN", "INJECTED_KERNELS_DEPRECATED", "NEXT_HOP_ADDRESS_NOT_ASSIGNED", "NEXT_HOP_CANNOT_IP_FORWARD", @@ -6377,6 +6938,7 @@ "", "", "", + "", "" ] }, @@ -6501,7 +7063,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -6522,7 +7084,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -6555,7 +7117,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -6596,7 +7158,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -6631,7 +7193,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -6665,7 +7227,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -6686,7 +7248,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -6722,7 +7284,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -6743,7 +7305,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -6776,7 +7338,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -6817,7 +7379,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -6852,7 +7414,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -6886,7 +7448,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -6907,7 +7469,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -6948,7 +7510,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -6991,7 +7553,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -7038,7 +7600,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -7071,7 +7633,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -7104,7 +7666,7 @@ "project": { "type": "string", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -7134,7 +7696,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -7160,7 +7722,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -7181,7 +7743,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -7214,7 +7776,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -7250,7 +7812,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -7281,7 +7843,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -7302,7 +7864,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -7335,7 +7897,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -7368,7 +7930,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -7389,7 +7951,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -7425,7 +7987,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -7446,7 +8008,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -7479,7 +8041,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -7516,14 +8078,13 @@ "type": "string", "description": "Name of the persistent disk to delete.", "required": true, - "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" }, "project": { "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -7564,7 +8125,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -7599,7 +8160,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "sourceImage": { @@ -7638,7 +8199,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -7659,7 +8220,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -7700,7 +8261,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -7748,7 +8309,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -7781,7 +8342,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -7808,7 +8369,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -7834,7 +8395,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -7855,7 +8416,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -7888,7 +8449,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -7924,7 +8485,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -7955,7 +8516,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -7976,7 +8537,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8009,7 +8570,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -8050,7 +8611,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -8085,7 +8646,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -8119,7 +8680,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -8140,7 +8701,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -8181,7 +8742,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -8229,7 +8790,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8262,7 +8823,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8289,7 +8850,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8315,7 +8876,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -8336,7 +8897,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8373,7 +8934,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8406,7 +8967,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8433,7 +8994,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8459,7 +9020,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -8480,7 +9041,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8513,7 +9074,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8544,7 +9105,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -8565,7 +9126,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8598,7 +9159,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8628,7 +9189,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8653,7 +9214,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -8674,7 +9235,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8711,7 +9272,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8744,7 +9305,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8771,7 +9332,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8797,7 +9358,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -8818,7 +9379,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8851,7 +9412,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8887,7 +9448,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8927,7 +9488,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8960,7 +9521,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -8987,7 +9548,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -9013,7 +9574,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -9034,7 +9595,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -9067,7 +9628,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -9103,7 +9664,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -9143,7 +9704,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -9176,7 +9737,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -9212,7 +9773,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -9237,7 +9798,7 @@ "parameters": { "family": { "type": "string", - "description": "Name of the image resource to return.", + "description": "Name of the image family to search for.", "required": true, "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", "location": "path" @@ -9246,7 +9807,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -9273,7 +9834,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -9298,11 +9859,11 @@ "id": "compute.images.list", "path": "{project}/global/images", "httpMethod": "GET", - "description": "Retrieves the list of private images available to the specified project. Private images are images you create that belong to your project. This method does not get any images that belong to other projects, including publicly-available images, like Debian 7. If you want to get a list of publicly-available images, use this method to make a request to the respective image project, such as debian-cloud or windows-cloud.\n\nSee Accessing images for more information.", + "description": "Retrieves the list of private images available to the specified project. Private images are images you create that belong to your project. This method does not get any images that belong to other projects, including publicly-available images, like Debian 8. If you want to get a list of publicly-available images, use this method to make a request to the respective image project, such as debian-cloud or windows-cloud.", "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -9323,7 +9884,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -9359,7 +9920,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -9393,7 +9954,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -9414,7 +9975,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -9446,7 +10007,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -9485,7 +10046,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -9527,7 +10088,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -9561,7 +10122,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -9594,7 +10155,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -9615,7 +10176,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -9654,7 +10215,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -9694,7 +10255,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -9736,7 +10297,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "size": { @@ -9783,7 +10344,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -9825,7 +10386,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -9871,7 +10432,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -9905,7 +10466,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -9926,7 +10487,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -9958,7 +10519,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -9997,7 +10558,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10031,7 +10592,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10064,7 +10625,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10085,7 +10646,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10116,7 +10677,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "instanceGroup": { @@ -10143,7 +10704,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10186,7 +10747,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10228,7 +10789,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10275,7 +10836,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -10308,7 +10869,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -10335,7 +10896,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -10361,7 +10922,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10382,7 +10943,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -10425,7 +10986,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10461,7 +11022,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10482,7 +11043,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -10515,7 +11076,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10559,7 +11120,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10612,7 +11173,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10648,7 +11209,6 @@ "type": "string", "description": "Disk device name to detach.", "required": true, - "pattern": "\\w[\\w.-]{0,254}", "location": "query" }, "instance": { @@ -10662,7 +11222,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10704,7 +11264,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10755,7 +11315,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10790,7 +11350,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10824,7 +11384,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -10845,7 +11405,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10886,7 +11446,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10940,7 +11500,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -10983,7 +11543,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -11027,7 +11587,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -11071,7 +11631,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -11115,7 +11675,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -11159,7 +11719,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -11183,6 +11743,50 @@ "https://www.googleapis.com/auth/compute" ] }, + "startWithEncryptionKey": { + "id": "compute.instances.startWithEncryptionKey", + "path": "{project}/zones/{zone}/instances/{instance}/startWithEncryptionKey", + "httpMethod": "POST", + "description": "Starts an instance that was stopped using the using the instances().stop method. For more information, see Restart an instance.", + "parameters": { + "instance": { + "type": "string", + "description": "Name of the instance resource to start.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "zone": { + "type": "string", + "description": "The name of the zone for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "zone", + "instance" + ], + "request": { + "$ref": "InstancesStartWithEncryptionKeyRequest" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, "stop": { "id": "compute.instances.stop", "path": "{project}/zones/{zone}/instances/{instance}/stop", @@ -11200,7 +11804,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -11245,7 +11849,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -11274,7 +11878,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11295,7 +11899,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -11328,7 +11932,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -11361,7 +11965,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11382,7 +11986,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -11427,7 +12031,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -11460,7 +12064,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -11487,7 +12091,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -11513,7 +12117,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11534,7 +12138,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -11564,7 +12168,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -11590,7 +12194,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -11618,7 +12222,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -11646,7 +12250,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -11674,7 +12278,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -11716,7 +12320,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -11754,7 +12358,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -11787,7 +12391,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11808,7 +12412,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -11846,7 +12450,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -11878,7 +12482,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -11899,7 +12503,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -11917,6 +12521,402 @@ } } }, + "routers": { + "methods": { + "aggregatedList": { + "id": "compute.routers.aggregatedList", + "path": "{project}/aggregated/routers", + "httpMethod": "GET", + "description": "Retrieves an aggregated list of routers.", + "parameters": { + "filter": { + "type": "string", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "location": "query" + }, + "maxResults": { + "type": "integer", + "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.", + "default": "500", + "format": "uint32", + "minimum": "0", + "maximum": "500", + "location": "query" + }, + "pageToken": { + "type": "string", + "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + "location": "query" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + } + }, + "parameterOrder": [ + "project" + ], + "response": { + "$ref": "RouterAggregatedList" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, + "delete": { + "id": "compute.routers.delete", + "path": "{project}/regions/{region}/routers/{router}", + "httpMethod": "DELETE", + "description": "Deletes the specified Router resource.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "router": { + "type": "string", + "description": "Name of the Router resource to delete.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region", + "router" + ], + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "get": { + "id": "compute.routers.get", + "path": "{project}/regions/{region}/routers/{router}", + "httpMethod": "GET", + "description": "Returns the specified Router resource. Get a list of available routers by making a list() request.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "router": { + "type": "string", + "description": "Name of the Router resource to return.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region", + "router" + ], + "response": { + "$ref": "Router" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, + "getRouterStatus": { + "id": "compute.routers.getRouterStatus", + "path": "{project}/regions/{region}/routers/{router}/getRouterStatus", + "httpMethod": "GET", + "description": "Retrieves runtime information of the specified router.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "router": { + "type": "string", + "description": "Name of the Router resource to query.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region", + "router" + ], + "response": { + "$ref": "RouterStatusResponse" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, + "insert": { + "id": "compute.routers.insert", + "path": "{project}/regions/{region}/routers", + "httpMethod": "POST", + "description": "Creates a Router resource in the specified project and region using the data included in the request.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region" + ], + "request": { + "$ref": "Router" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "list": { + "id": "compute.routers.list", + "path": "{project}/regions/{region}/routers", + "httpMethod": "GET", + "description": "Retrieves a list of Router resources available to the specified project.", + "parameters": { + "filter": { + "type": "string", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "location": "query" + }, + "maxResults": { + "type": "integer", + "description": "The maximum number of results per page that should be returned. If the number of available results is larger than maxResults, Compute Engine returns a nextPageToken that can be used to get the next page of results in subsequent list requests.", + "default": "500", + "format": "uint32", + "minimum": "0", + "maximum": "500", + "location": "query" + }, + "pageToken": { + "type": "string", + "description": "Specifies a page token to use. Set pageToken to the nextPageToken returned by a previous list request to get the next page of results.", + "location": "query" + }, + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region" + ], + "response": { + "$ref": "RouterList" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, + "patch": { + "id": "compute.routers.patch", + "path": "{project}/regions/{region}/routers/{router}", + "httpMethod": "PATCH", + "description": "Updates the entire content of the Router resource. This method supports patch semantics.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "router": { + "type": "string", + "description": "Name of the Router resource to update.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region", + "router" + ], + "request": { + "$ref": "Router" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, + "preview": { + "id": "compute.routers.preview", + "path": "{project}/regions/{region}/routers/{router}/preview", + "httpMethod": "POST", + "description": "Preview fields auto-generated during router create and update operations. Calling this method does NOT create or update the router.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "router": { + "type": "string", + "description": "Name of the Router resource to query.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region", + "router" + ], + "request": { + "$ref": "Router" + }, + "response": { + "$ref": "RoutersPreviewResponse" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute", + "https://www.googleapis.com/auth/compute.readonly" + ] + }, + "update": { + "id": "compute.routers.update", + "path": "{project}/regions/{region}/routers/{router}", + "httpMethod": "PUT", + "description": "Updates the entire content of the Router resource.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "region": { + "type": "string", + "description": "Name of the region for this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + }, + "router": { + "type": "string", + "description": "Name of the Router resource to update.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "region", + "router" + ], + "request": { + "$ref": "Router" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + } + } + }, "routes": { "methods": { "delete": { @@ -11929,7 +12929,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "route": { @@ -11962,7 +12962,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "route": { @@ -11996,7 +12996,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -12022,7 +13022,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12043,7 +13043,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -12073,7 +13073,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "snapshot": { @@ -12106,7 +13106,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "snapshot": { @@ -12138,7 +13138,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12159,7 +13159,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -12189,7 +13189,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "sslCertificate": { @@ -12222,7 +13222,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "sslCertificate": { @@ -12256,7 +13256,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -12282,7 +13282,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12303,7 +13303,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -12331,7 +13331,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12352,7 +13352,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -12378,7 +13378,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -12419,7 +13419,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -12461,7 +13461,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -12495,7 +13495,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12516,7 +13516,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -12554,7 +13554,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "targetHttpProxy": { @@ -12587,7 +13587,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "targetHttpProxy": { @@ -12621,7 +13621,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -12647,7 +13647,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12668,7 +13668,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -12694,7 +13694,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "targetHttpProxy": { @@ -12734,7 +13734,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "targetHttpsProxy": { @@ -12767,7 +13767,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "targetHttpsProxy": { @@ -12801,7 +13801,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -12827,7 +13827,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12848,7 +13848,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -12874,7 +13874,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "targetHttpsProxy": { @@ -12910,7 +13910,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "targetHttpsProxy": { @@ -12948,7 +13948,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -12969,7 +13969,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -12995,7 +13995,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "targetInstance": { @@ -13036,7 +14036,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "targetInstance": { @@ -13078,7 +14078,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -13112,7 +14112,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13133,7 +14133,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -13171,7 +14171,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -13215,7 +14215,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -13257,7 +14257,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13278,7 +14278,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -13304,7 +14304,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -13345,7 +14345,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -13387,7 +14387,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -13432,7 +14432,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -13466,7 +14466,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13487,7 +14487,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -13521,7 +14521,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -13565,7 +14565,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -13615,7 +14615,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -13661,7 +14661,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13682,7 +14682,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -13708,7 +14708,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -13749,7 +14749,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -13791,7 +14791,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -13825,7 +14825,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13846,7 +14846,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -13884,7 +14884,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "urlMap": { @@ -13917,7 +14917,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "urlMap": { @@ -13951,7 +14951,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -13969,6 +14969,42 @@ "https://www.googleapis.com/auth/compute" ] }, + "invalidateCache": { + "id": "compute.urlMaps.invalidateCache", + "path": "{project}/global/urlMaps/{urlMap}/invalidateCache", + "httpMethod": "POST", + "description": "Initiates a cache invalidation operation, invalidating the specified path, scoped to the specified UrlMap.", + "parameters": { + "project": { + "type": "string", + "description": "Project ID for this request.", + "required": true, + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "location": "path" + }, + "urlMap": { + "type": "string", + "description": "Name of the UrlMap scoping this request.", + "required": true, + "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?", + "location": "path" + } + }, + "parameterOrder": [ + "project", + "urlMap" + ], + "request": { + "$ref": "CacheInvalidationRule" + }, + "response": { + "$ref": "Operation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/compute" + ] + }, "list": { "id": "compute.urlMaps.list", "path": "{project}/global/urlMaps", @@ -13977,7 +15013,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -13998,7 +15034,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -14024,7 +15060,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "urlMap": { @@ -14060,7 +15096,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "urlMap": { @@ -14096,7 +15132,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "urlMap": { @@ -14134,7 +15170,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -14155,7 +15191,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, @@ -14181,7 +15217,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -14222,7 +15258,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -14264,7 +15300,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -14298,7 +15334,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -14319,7 +15355,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "region": { @@ -14364,7 +15400,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -14402,7 +15438,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -14435,7 +15471,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -14456,7 +15492,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -14494,7 +15530,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" }, "zone": { @@ -14526,7 +15562,7 @@ "parameters": { "filter": { "type": "string", - "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nCompute Engine Beta API Only: When filtering in the Beta API, you can also filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nThe Beta API also supports filtering on multiple expressions by providing each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", + "description": "Sets a filter expression for filtering listed resources, in the form filter={expression}. Your {expression} must be in the format: field_name comparison_string literal_string.\n\nThe field_name is the name of the field you want to compare. Only atomic field types are supported (string, number, boolean). The comparison_string must be either eq (equals) or ne (not equals). The literal_string is the string value to filter to. The literal value must be valid for the type of field you are filtering by (string, number, boolean). For string fields, the literal value is interpreted as a regular expression using RE2 syntax. The literal value must match the entire field.\n\nFor example, to filter for instances that do not have a name of example-instance, you would use filter=name ne example-instance.\n\nYou can filter on nested fields. For example, you could filter on instances that have set the scheduling.automaticRestart field to true. Use filtering on nested fields to take advantage of labels to organize and search for results based on label values.\n\nTo filter on multiple expressions, provide each separate expression within parentheses. For example, (scheduling.automaticRestart eq true) (zone eq us-central1-f). Multiple expressions are treated as AND expressions, meaning that resources must match all expressions to pass the filters.", "location": "query" }, "maxResults": { @@ -14547,7 +15583,7 @@ "type": "string", "description": "Project ID for this request.", "required": true, - "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))", + "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z0-9](?:[-a-z0-9]{0,61}[a-z0-9])?))", "location": "path" } }, diff --git a/vendor/google.golang.org/api/compute/v1/compute-gen.go b/vendor/google.golang.org/api/compute/v1/compute-gen.go index cf7442c2fd..188ce80cb4 100644 --- a/vendor/google.golang.org/api/compute/v1/compute-gen.go +++ b/vendor/google.golang.org/api/compute/v1/compute-gen.go @@ -94,6 +94,7 @@ func New(client *http.Client) (*Service, error) { s.Projects = NewProjectsService(s) s.RegionOperations = NewRegionOperationsService(s) s.Regions = NewRegionsService(s) + s.Routers = NewRoutersService(s) s.Routes = NewRoutesService(s) s.Snapshots = NewSnapshotsService(s) s.SslCertificates = NewSslCertificatesService(s) @@ -161,6 +162,8 @@ type Service struct { Regions *RegionsService + Routers *RoutersService + Routes *RoutesService Snapshots *SnapshotsService @@ -402,6 +405,15 @@ type RegionsService struct { s *Service } +func NewRoutersService(s *Service) *RoutersService { + rs := &RoutersService{s: s} + return rs +} + +type RoutersService struct { + s *Service +} + func NewRoutesService(s *Service) *RoutesService { rs := &RoutesService{s: s} return rs @@ -520,7 +532,7 @@ type ZonesService struct { } // AccessConfig: An access configuration attached to an instance's -// network interface. +// network interface. Only one access config per instance is supported. type AccessConfig struct { // Kind: [Output Only] Type of the resource. Always compute#accessConfig // for access configs. @@ -747,6 +759,7 @@ type AddressesScopedListWarning struct { // "CLEANUP_FAILED" // "DEPRECATED_RESOURCE_USED" // "DISK_SIZE_LARGER_THAN_IMAGE_SIZE" + // "FIELD_VALUE_OVERRIDEN" // "INJECTED_KERNELS_DEPRECATED" // "NEXT_HOP_ADDRESS_NOT_ASSIGNED" // "NEXT_HOP_CANNOT_IP_FORWARD" @@ -837,6 +850,29 @@ type AttachedDisk struct { // persistent disks. DeviceName string `json:"deviceName,omitempty"` + // DiskEncryptionKey: Encrypts or decrypts a disk using a + // customer-supplied encryption key. + // + // If you are creating a new disk, this field encrypts the new disk + // using an encryption key that you provide. If you are attaching an + // existing disk that is already encrypted, this field decrypts the disk + // using the customer-supplied encryption key. + // + // If you encrypt a disk using a customer-supplied key, you must provide + // the same key again when you attempt to use this resource at a later + // time. For example, you must provide the key when you create a + // snapshot or an image from the disk or when you attach the disk to a + // virtual machine instance. + // + // If you do not provide an encryption key, then the disk will be + // encrypted using an automatically generated key and you do not need to + // provide a key to use the disk later. + // + // Instance templates do not store customer-supplied encryption keys, so + // you cannot use your own keys to encrypt disks in a managed instance + // group. + DiskEncryptionKey *CustomerEncryptionKey `json:"diskEncryptionKey,omitempty"` + // Index: Assigns a zero-based index to this disk, where 0 is reserved // for the boot disk. For example, if you have many disks attached to an // instance, each disk would have a unique index number. If not @@ -882,7 +918,8 @@ type AttachedDisk struct { // Source: Specifies a valid partial or full URL to an existing // Persistent Disk resource. This field is only applicable for - // persistent disks. + // persistent disks. Note that for InstanceTemplate, it is just disk + // name, not URL for the disk. Source string `json:"source,omitempty"` // Type: Specifies the type of the disk, either SCRATCH or PERSISTENT. @@ -937,7 +974,8 @@ type AttachedDiskInitializeParams struct { // - // https://www.googleapis.com/compute/v1/projects/project/zones/zone/diskTypes/diskType // - projects/project/zones/zone/diskTypes/diskType - // - zones/zone/diskTypes/diskType + // - zones/zone/diskTypes/diskType Note that for InstanceTemplate, this + // is the name of the disk type, not URL. DiskType string `json:"diskType,omitempty"` // SourceImage: The source image used to create this disk. If the source @@ -968,6 +1006,15 @@ type AttachedDiskInitializeParams struct { // global/images/family/my-private-family SourceImage string `json:"sourceImage,omitempty"` + // SourceImageEncryptionKey: The customer-supplied encryption key of the + // source image. Required if the source image is protected by a + // customer-supplied encryption key. + // + // Instance templates do not store customer-supplied encryption keys, so + // you cannot create disks for instances in a managed instance group if + // the source images are encrypted with your own keys. + SourceImageEncryptionKey *CustomerEncryptionKey `json:"sourceImageEncryptionKey,omitempty"` + // ForceSendFields is a list of field names (e.g. "DiskName") to // unconditionally include in API requests. By default, fields with // empty values are omitted from API requests. However, any non-pointer, @@ -994,7 +1041,7 @@ type Autoscaler struct { // loadBalancingUtilization. // // If none of these are specified, the default will be to autoscale - // based on cpuUtilization to 0.8 or 80%. + // based on cpuUtilization to 0.6 or 60%. AutoscalingPolicy *AutoscalingPolicy `json:"autoscalingPolicy,omitempty"` // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text @@ -1029,7 +1076,8 @@ type Autoscaler struct { // scale. Target string `json:"target,omitempty"` - // Zone: [Output Only] URL of the zone where the instance group resides. + // Zone: [Output Only] URL of the zone where the instance group resides + // (for autoscalers living in zonal scope). Zone string `json:"zone,omitempty"` // ServerResponse contains the HTTP response code and headers from the @@ -1171,6 +1219,7 @@ type AutoscalersScopedListWarning struct { // "CLEANUP_FAILED" // "DEPRECATED_RESOURCE_USED" // "DISK_SIZE_LARGER_THAN_IMAGE_SIZE" + // "FIELD_VALUE_OVERRIDEN" // "INJECTED_KERNELS_DEPRECATED" // "NEXT_HOP_ADDRESS_NOT_ASSIGNED" // "NEXT_HOP_CANNOT_IP_FORWARD" @@ -1297,7 +1346,7 @@ func (s *AutoscalingPolicy) MarshalJSON() ([]byte, error) { type AutoscalingPolicyCpuUtilization struct { // UtilizationTarget: The target CPU utilization that the autoscaler // should maintain. Must be a float value in the range (0, 1]. If not - // specified, the default is 0.8. + // specified, the default is 0.6. // // If the CPU level is below the target utilization, the autoscaler // scales down the number of instances until it reaches the minimum @@ -1408,6 +1457,8 @@ type Backend struct { // global HTTP(S) load balancing, the default is UTILIZATION. Valid // values are UTILIZATION and RATE. // + // This cannot be used for internal load balancing. + // // Possible values: // "RATE" // "UTILIZATION" @@ -1419,6 +1470,8 @@ type Backend struct { // (depending on balancingMode). A setting of 0 means the group is // completely drained, offering 0% of its available CPU or RPS. Valid // range is [0.0,1.0]. + // + // This cannot be used for internal load balancing. CapacityScaler float64 `json:"capacityScaler,omitempty"` // Description: An optional description of this resource. Provide this @@ -1434,23 +1487,33 @@ type Backend struct { // // Note that you must specify an Instance Group resource using the // fully-qualified URL, rather than a partial URL. + // + // When the BackendService has load balancing scheme INTERNAL, the + // instance group must be in a zone within the same region as the + // BackendService. Group string `json:"group,omitempty"` // MaxRate: The max requests per second (RPS) of the group. Can be used // with either RATE or UTILIZATION balancing modes, but required if RATE // mode. For RATE mode, either maxRate or maxRatePerInstance must be // set. + // + // This cannot be used for internal load balancing. MaxRate int64 `json:"maxRate,omitempty"` // MaxRatePerInstance: The max requests per second (RPS) that a single // backend instance can handle.This is used to calculate the capacity of // the group. Can be used in either balancing mode. For RATE mode, // either maxRate or maxRatePerInstance must be set. + // + // This cannot be used for internal load balancing. MaxRatePerInstance float64 `json:"maxRatePerInstance,omitempty"` // MaxUtilization: Used when balancingMode is UTILIZATION. This ratio // defines the CPU utilization target for the group. The default is 0.8. // Valid range is [0.0, 1.0]. + // + // This cannot be used for internal load balancing. MaxUtilization float64 `json:"maxUtilization,omitempty"` // ForceSendFields is a list of field names (e.g. "BalancingMode") to @@ -1471,6 +1534,14 @@ func (s *Backend) MarshalJSON() ([]byte, error) { // BackendService: A BackendService resource. This resource defines a // group of backend virtual machines and their serving capacity. type BackendService struct { + // AffinityCookieTtlSec: Lifetime of cookies in seconds if + // session_affinity is GENERATED_COOKIE. If set to 0, the cookie is + // non-persistent and lasts only until the end of the browser session + // (or equivalent). The maximum allowed value for TTL is one day. + // + // When the load balancing scheme is INTERNAL, this field is not used. + AffinityCookieTtlSec int64 `json:"affinityCookieTtlSec,omitempty"` + // Backends: The list of backends that serve this BackendService. Backends []*Backend `json:"backends,omitempty"` @@ -1482,6 +1553,11 @@ type BackendService struct { // property when you create the resource. Description string `json:"description,omitempty"` + // EnableCDN: If true, enable Cloud CDN for this BackendService. + // + // When the load balancing scheme is INTERNAL, this field is not used. + EnableCDN bool `json:"enableCDN,omitempty"` + // Fingerprint: Fingerprint of this resource. A hash of the contents // stored in this object. This field is used in optimistic locking. This // field will be ignored when inserting a BackendService. An up-to-date @@ -1492,6 +1568,9 @@ type BackendService struct { // HttpsHealthCheck resource for health checking this BackendService. // Currently at most one health check can be specified, and a health // check is required. + // + // For internal load balancing, a URL to a HealthCheck resource must be + // specified instead. HealthChecks []string `json:"healthChecks,omitempty"` // Id: [Output Only] The unique identifier for the resource. This @@ -1513,16 +1592,25 @@ type BackendService struct { // Port: Deprecated in favor of portName. The TCP port to connect on the // backend. The default value is 80. + // + // This cannot be used for internal load balancing. Port int64 `json:"port,omitempty"` // PortName: Name of backend port. The same name should appear in the - // instance groups referenced by this service. Required. + // instance groups referenced by this service. Required when the load + // balancing scheme is EXTERNAL. + // + // When the load balancing scheme is INTERNAL, this field is not used. PortName string `json:"portName,omitempty"` // Protocol: The protocol this BackendService uses to communicate with // backends. // - // Possible values are HTTP, HTTPS, HTTP2, TCP and SSL. + // Possible values are HTTP, HTTPS, HTTP2, TCP and SSL. The default is + // HTTP. + // + // For internal load balancing, the possible values are TCP and UDP, and + // the default is TCP. // // Possible values: // "HTTP" @@ -1537,6 +1625,24 @@ type BackendService struct { // SelfLink: [Output Only] Server-defined URL for the resource. SelfLink string `json:"selfLink,omitempty"` + // SessionAffinity: Type of session affinity to use. The default is + // NONE. + // + // When the load balancing scheme is EXTERNAL, can be NONE, CLIENT_IP, + // or GENERATED_COOKIE. + // + // When the load balancing scheme is INTERNAL, can be NONE, CLIENT_IP, + // CLIENT_IP_PROTO, or CLIENT_IP_PORT_PROTO. + // + // When the protocol is UDP, this field is not used. + // + // Possible values: + // "CLIENT_IP" + // "CLIENT_IP_PROTO" + // "GENERATED_COOKIE" + // "NONE" + SessionAffinity string `json:"sessionAffinity,omitempty"` + // TimeoutSec: How many seconds to wait for the backend before // considering it a failed request. Default is 30 seconds. TimeoutSec int64 `json:"timeoutSec,omitempty"` @@ -1545,12 +1651,13 @@ type BackendService struct { // server. googleapi.ServerResponse `json:"-"` - // ForceSendFields is a list of field names (e.g. "Backends") to - // unconditionally include in API requests. By default, fields with - // empty values are omitted from API requests. However, any non-pointer, - // non-interface field appearing in ForceSendFields will be sent to the - // server regardless of whether the field is empty or not. This may be - // used to include empty fields in Patch requests. + // ForceSendFields is a list of field names (e.g. + // "AffinityCookieTtlSec") to unconditionally include in API requests. + // By default, fields with empty values are omitted from API requests. + // However, any non-pointer, non-interface field appearing in + // ForceSendFields will be sent to the server regardless of whether the + // field is empty or not. This may be used to include empty fields in + // Patch requests. ForceSendFields []string `json:"-"` } @@ -1588,8 +1695,8 @@ func (s *BackendServiceGroupHealth) MarshalJSON() ([]byte, error) { // BackendServiceList: Contains a list of BackendService resources. type BackendServiceList struct { - // Id: [Output Only] The unique identifier for the resource. This - // identifier is defined by the server. + // Id: [Output Only] Unique identifier for the resource; defined by the + // server. Id string `json:"id,omitempty"` // Items: A list of BackendService resources. @@ -1599,12 +1706,8 @@ type BackendServiceList struct { // compute#backendServiceList for lists of backend services. Kind string `json:"kind,omitempty"` - // NextPageToken: [Output Only] This token allows you to get the next - // page of results for list requests. If the number of results is larger - // than maxResults, use the nextPageToken as a value for the query - // parameter pageToken in the next list request. Subsequent list - // requests will have their own nextPageToken to continue paging through - // the results. + // NextPageToken: [Output Only] A token used to continue a truncated + // list request. NextPageToken string `json:"nextPageToken,omitempty"` // SelfLink: [Output Only] Server-defined URL for this resource. @@ -1629,6 +1732,74 @@ func (s *BackendServiceList) MarshalJSON() ([]byte, error) { return gensupport.MarshalJSON(raw, s.ForceSendFields) } +type CacheInvalidationRule struct { + Path string `json:"path,omitempty"` + + // ForceSendFields is a list of field names (e.g. "Path") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` +} + +func (s *CacheInvalidationRule) MarshalJSON() ([]byte, error) { + type noMethod CacheInvalidationRule + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields) +} + +// CustomerEncryptionKey: Represents a customer-supplied encryption key +type CustomerEncryptionKey struct { + // RawKey: Specifies a 256-bit customer-supplied encryption key, encoded + // in RFC 4648 base64 to either encrypt or decrypt this resource. + RawKey string `json:"rawKey,omitempty"` + + // Sha256: [Output only] The RFC 4648 base64 encoded SHA-256 hash of the + // customer-supplied encryption key that protects this resource. + Sha256 string `json:"sha256,omitempty"` + + // ForceSendFields is a list of field names (e.g. "RawKey") to + // unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` +} + +func (s *CustomerEncryptionKey) MarshalJSON() ([]byte, error) { + type noMethod CustomerEncryptionKey + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields) +} + +type CustomerEncryptionKeyProtectedDisk struct { + // DiskEncryptionKey: Decrypts data associated with the disk with a + // customer-supplied encryption key. + DiskEncryptionKey *CustomerEncryptionKey `json:"diskEncryptionKey,omitempty"` + + // Source: Specifies a valid partial or full URL to an existing + // Persistent Disk resource. This field is only applicable for + // persistent disks. + Source string `json:"source,omitempty"` + + // ForceSendFields is a list of field names (e.g. "DiskEncryptionKey") + // to unconditionally include in API requests. By default, fields with + // empty values are omitted from API requests. However, any non-pointer, + // non-interface field appearing in ForceSendFields will be sent to the + // server regardless of whether the field is empty or not. This may be + // used to include empty fields in Patch requests. + ForceSendFields []string `json:"-"` +} + +func (s *CustomerEncryptionKeyProtectedDisk) MarshalJSON() ([]byte, error) { + type noMethod CustomerEncryptionKeyProtectedDisk + raw := noMethod(*s) + return gensupport.MarshalJSON(raw, s.ForceSendFields) +} + // DeprecationStatus: Deprecation status for a public resource. type DeprecationStatus struct { // Deleted: An optional RFC3339 timestamp on or after which the @@ -1686,6 +1857,22 @@ type Disk struct { // property when you create the resource. Description string `json:"description,omitempty"` + // DiskEncryptionKey: Encrypts the disk using a customer-supplied + // encryption key. + // + // After you encrypt a disk with a customer-supplied key, you must + // provide the same key if you use the disk later (e.g. to create a disk + // snapshot or an image, or to attach the disk to a virtual + // machine). + // + // Customer-supplied encryption keys do not protect access to metadata + // of the disk. + // + // If you do not provide an encryption key when creating the disk, then + // the disk will be encrypted using an automatically generated key and + // you do not need to provide a key to use the disk later. + DiskEncryptionKey *CustomerEncryptionKey `json:"diskEncryptionKey,omitempty"` + // Id: [Output Only] The unique identifier for the resource. This // identifier is defined by the server. Id uint64 `json:"id,omitempty,string"` @@ -1702,7 +1889,7 @@ type Disk struct { // text format. LastDetachTimestamp string `json:"lastDetachTimestamp,omitempty"` - // Licenses: [Output Only] Any applicable publicly visible licenses. + // Licenses: Any applicable publicly visible licenses. Licenses []string `json:"licenses,omitempty"` // Name: Name of the resource. Provided by the client when the resource @@ -1759,6 +1946,11 @@ type Disk struct { // global/images/family/my-private-family SourceImage string `json:"sourceImage,omitempty"` + // SourceImageEncryptionKey: The customer-supplied encryption key of the + // source image. Required if the source image is protected by a + // customer-supplied encryption key. + SourceImageEncryptionKey *CustomerEncryptionKey `json:"sourceImageEncryptionKey,omitempty"` + // SourceImageId: [Output Only] The ID value of the image used to create // this disk. This value identifies the exact image that was used to // create this persistent disk. For example, if you created the @@ -1776,6 +1968,11 @@ type Disk struct { // - global/snapshots/snapshot SourceSnapshot string `json:"sourceSnapshot,omitempty"` + // SourceSnapshotEncryptionKey: The customer-supplied encryption key of + // the source snapshot. Required if the source snapshot is protected by + // a customer-supplied encryption key. + SourceSnapshotEncryptionKey *CustomerEncryptionKey `json:"sourceSnapshotEncryptionKey,omitempty"` + // SourceSnapshotId: [Output Only] The unique ID of the snapshot used to // create this disk. This value identifies the exact snapshot that was // used to create this persistent disk. For example, if you created the @@ -2119,6 +2316,7 @@ type DiskTypesScopedListWarning struct { // "CLEANUP_FAILED" // "DEPRECATED_RESOURCE_USED" // "DISK_SIZE_LARGER_THAN_IMAGE_SIZE" + // "FIELD_VALUE_OVERRIDEN" // "INJECTED_KERNELS_DEPRECATED" // "NEXT_HOP_ADDRESS_NOT_ASSIGNED" // "NEXT_HOP_CANNOT_IP_FORWARD" @@ -2240,6 +2438,7 @@ type DisksScopedListWarning struct { // "CLEANUP_FAILED" // "DEPRECATED_RESOURCE_USED" // "DISK_SIZE_LARGER_THAN_IMAGE_SIZE" + // "FIELD_VALUE_OVERRIDEN" // "INJECTED_KERNELS_DEPRECATED" // "NEXT_HOP_ADDRESS_NOT_ASSIGNED" // "NEXT_HOP_CANNOT_IP_FORWARD" @@ -2309,9 +2508,9 @@ func (s *DisksScopedListWarningData) MarshalJSON() ([]byte, error) { // Firewall: Represents a Firewall resource. type Firewall struct { - // Allowed: The list of rules specified by this firewall. Each rule - // specifies a protocol and port-range tuple that describes a permitted - // connection. + // Allowed: The list of ALLOW rules specified by this firewall. Each + // rule specifies a protocol and port-range tuple that describes a + // permitted connection. Allowed []*FirewallAllowed `json:"allowed,omitempty"` // CreationTimestamp: [Output Only] Creation timestamp in RFC3339 text @@ -2355,23 +2554,25 @@ type Firewall struct { // SelfLink: [Output Only] Server-defined URL for the resource. SelfLink string `json:"selfLink,omitempty"` - // SourceRanges: The IP address blocks that this rule applies to, - // expressed in CIDR format. One or both of sourceRanges and sourceTags - // may be set. - // - // If both properties are set, an inbound connection is allowed if the - // range matches the sourceRanges OR the tag of the source matches the - // sourceTags property. The connection does not need to match both - // properties. + // SourceRanges: If source ranges are specified, the firewall will apply + // only to traffic that has source IP address in these ranges. These + // ranges must be expressed in CIDR format. One or both of sourceRanges + // and sourceTags may be set. If both properties are set, the firewall + // will apply to traffic that has source IP address within sourceRanges + // OR the source IP that belongs to a tag listed in the sourceTags + // property. The connection does not need to match both properties for + // the firewall to apply. SourceRanges []string `json:"sourceRanges,omitempty"` - // SourceTags: A list of instance tags which this rule applies to. One - // or both of sourceRanges and sourceTags may be set. - // - // If both properties are set, an inbound connection is allowed if the - // range matches the sourceRanges OR the tag of the source matches the - // sourceTags property. The connection does not need to match both - // properties. + // SourceTags: If source tags are specified, the firewall will apply + // only to traffic with source IP that belongs to a tag listed in source + // tags. Source tags cannot be used to control traffic to an instance's + // external IP address. Because tags are associated with an instance, + // not an IP address. One or both of sourceRanges and sourceTags may be + // set. If both properties are set, the firewall will apply to traffic + // that has source IP address within sourceRanges OR the source IP that + // belongs to a tag listed in the sourceTags property. The connection + // does not need to match both properties for the firewall to apply. SourceTags []string `json:"sourceTags,omitempty"` // TargetTags: A list of instance tags indicating sets of instances @@ -2400,16 +2601,16 @@ func (s *Firewall) MarshalJSON() ([]byte, error) { } type FirewallAllowed struct { - // IPProtocol: The IP protocol that is allowed for this rule. The - // protocol type is required when creating a firewall rule. This value - // can either be one of the following well known protocol strings (tcp, - // udp, icmp, esp, ah, sctp), or the IP protocol number. + // IPProtocol: The IP protocol to which this rule applies. The protocol + // type is required when creating a firewall rule. This value can either + // be one of the following well known protocol strings (tcp, udp, icmp, + // esp, ah, sctp), or the IP protocol number. IPProtocol string `json:"IPProtocol,omitempty"` - // Ports: An optional list of ports which are allowed. This field is - // only applicable for UDP or TCP protocol. Each entry must be either an - // integer or a range. If not specified, connections through any port - // are allowed + // Ports: An optional list of ports to which this rule applies. This + // field is only applicable for UDP or TCP protocol. Each entry must be + // either an integer or a range. If not specified, this rule applies to + // connections through any port. // // Example inputs include: ["22"], ["80","443"], and ["12345-12349"]. Ports []string `json:"ports,omitempty"` @@ -2476,17 +2677,29 @@ func (s *FirewallList) MarshalJSON() ([]byte, error) { // specifies which pool of target virtual machines to forward a packet // to if it matches the given [IPAddress, IPProtocol, portRange] tuple. type ForwardingRule struct { - // IPAddress: Value of the reserved IP address that this forwarding rule - // is serving on behalf of. For global forwarding rules, the address - // must be a global IP; for regional forwarding rules, the address must - // live in the same region as the forwarding rule. If left empty - // (default value), an ephemeral IP from the same scope (global or - // regional) will be assigned. + // IPAddress: The IP address that this forwarding rule is serving on + // behalf of. + // + // For global forwarding rules, the address must be a global IP; for + // regional forwarding rules, the address must live in the same region + // as the forwarding rule. By default, this field is empty and an + // ephemeral IP from the same scope (global or regional) will be + // assigned. + // + // When the load balancing scheme is INTERNAL, this can only be an RFC + // 1918 IP address belonging to the network/subnetwork configured for + // the forwarding rule. A reserved address cannot be used. If the field + // is empty, the IP address will be automatically allocated from the + // internal IP range of the subnetwork or network configured for this + // forwarding rule. IPAddress string `json:"IPAddress,omitempty"` // IPProtocol: The IP protocol to which this rule applies. Valid options // are TCP, UDP, ESP, AH, SCTP or ICMP. // + // When the load balancing scheme is INTERNAL= 0; i-- { + if fn := post[i]; fn != nil { + fn(resp) + } + } + return resp, err +} diff --git a/vendor/google.golang.org/api/googleapi/googleapi.go b/vendor/google.golang.org/api/googleapi/googleapi.go index 858537e00b..ad059b5d56 100644 --- a/vendor/google.golang.org/api/googleapi/googleapi.go +++ b/vendor/google.golang.org/api/googleapi/googleapi.go @@ -149,12 +149,12 @@ func IsNotModified(err error) bool { // CheckMediaResponse returns an error (of type *Error) if the response // status code is not 2xx. Unlike CheckResponse it does not assume the // body is a JSON error document. +// It is the caller's responsibility to close res.Body. func CheckMediaResponse(res *http.Response) error { if res.StatusCode >= 200 && res.StatusCode <= 299 { return nil } slurp, _ := ioutil.ReadAll(io.LimitReader(res.Body, 1<<20)) - res.Body.Close() return &Error{ Code: res.StatusCode, Body: string(slurp), @@ -278,41 +278,15 @@ func ResolveRelative(basestr, relstr string) string { return us } -// has4860Fix is whether this Go environment contains the fix for -// http://golang.org/issue/4860 -var has4860Fix bool - -// init initializes has4860Fix by checking the behavior of the net/http package. -func init() { - r := http.Request{ - URL: &url.URL{ - Scheme: "http", - Opaque: "//opaque", - }, - } - b := &bytes.Buffer{} - r.Write(b) - has4860Fix = bytes.HasPrefix(b.Bytes(), []byte("GET http")) -} - -// SetOpaque sets u.Opaque from u.Path such that HTTP requests to it -// don't alter any hex-escaped characters in u.Path. -func SetOpaque(u *url.URL) { - u.Opaque = "//" + u.Host + u.Path - if !has4860Fix { - u.Opaque = u.Scheme + ":" + u.Opaque - } -} - // Expand subsitutes any {encoded} strings in the URL passed in using // the map supplied. // // This calls SetOpaque to avoid encoding of the parameters in the URL path. func Expand(u *url.URL, expansions map[string]string) { - expanded, err := uritemplates.Expand(u.Path, expansions) + escaped, unescaped, err := uritemplates.Expand(u.Path, expansions) if err == nil { - u.Path = expanded - SetOpaque(u) + u.Path = unescaped + u.RawPath = escaped } } diff --git a/vendor/google.golang.org/api/googleapi/internal/uritemplates/uritemplates.go b/vendor/google.golang.org/api/googleapi/internal/uritemplates/uritemplates.go index 7c103ba138..63bf053830 100644 --- a/vendor/google.golang.org/api/googleapi/internal/uritemplates/uritemplates.go +++ b/vendor/google.golang.org/api/googleapi/internal/uritemplates/uritemplates.go @@ -34,11 +34,37 @@ func pctEncode(src []byte) []byte { return dst } -func escape(s string, allowReserved bool) string { +// pairWriter is a convenience struct which allows escaped and unescaped +// versions of the template to be written in parallel. +type pairWriter struct { + escaped, unescaped bytes.Buffer +} + +// Write writes the provided string directly without any escaping. +func (w *pairWriter) Write(s string) { + w.escaped.WriteString(s) + w.unescaped.WriteString(s) +} + +// Escape writes the provided string, escaping the string for the +// escaped output. +func (w *pairWriter) Escape(s string, allowReserved bool) { + w.unescaped.WriteString(s) if allowReserved { - return string(reserved.ReplaceAllFunc([]byte(s), pctEncode)) + w.escaped.Write(reserved.ReplaceAllFunc([]byte(s), pctEncode)) + } else { + w.escaped.Write(unreserved.ReplaceAllFunc([]byte(s), pctEncode)) } - return string(unreserved.ReplaceAllFunc([]byte(s), pctEncode)) +} + +// Escaped returns the escaped string. +func (w *pairWriter) Escaped() string { + return w.escaped.String() +} + +// Unescaped returns the unescaped string. +func (w *pairWriter) Unescaped() string { + return w.unescaped.String() } // A uriTemplate is a parsed representation of a URI template. @@ -170,18 +196,20 @@ func parseTerm(term string) (result templateTerm, err error) { return result, err } -// Expand expands a URI template with a set of values to produce a string. -func (t *uriTemplate) Expand(values map[string]string) string { - var buf bytes.Buffer +// Expand expands a URI template with a set of values to produce the +// resultant URI. Two forms of the result are returned: one with all the +// elements escaped, and one with the elements unescaped. +func (t *uriTemplate) Expand(values map[string]string) (escaped, unescaped string) { + var w pairWriter for _, p := range t.parts { - p.expand(&buf, values) + p.expand(&w, values) } - return buf.String() + return w.Escaped(), w.Unescaped() } -func (tp *templatePart) expand(buf *bytes.Buffer, values map[string]string) { +func (tp *templatePart) expand(w *pairWriter, values map[string]string) { if len(tp.raw) > 0 { - buf.WriteString(tp.raw) + w.Write(tp.raw) return } var first = true @@ -191,30 +219,30 @@ func (tp *templatePart) expand(buf *bytes.Buffer, values map[string]string) { continue } if first { - buf.WriteString(tp.first) + w.Write(tp.first) first = false } else { - buf.WriteString(tp.sep) + w.Write(tp.sep) } - tp.expandString(buf, term, value) + tp.expandString(w, term, value) } } -func (tp *templatePart) expandName(buf *bytes.Buffer, name string, empty bool) { +func (tp *templatePart) expandName(w *pairWriter, name string, empty bool) { if tp.named { - buf.WriteString(name) + w.Write(name) if empty { - buf.WriteString(tp.ifemp) + w.Write(tp.ifemp) } else { - buf.WriteString("=") + w.Write("=") } } } -func (tp *templatePart) expandString(buf *bytes.Buffer, t templateTerm, s string) { +func (tp *templatePart) expandString(w *pairWriter, t templateTerm, s string) { if len(s) > t.truncate && t.truncate > 0 { s = s[:t.truncate] } - tp.expandName(buf, t.name, len(s) == 0) - buf.WriteString(escape(s, tp.allowReserved)) + tp.expandName(w, t.name, len(s) == 0) + w.Escape(s, tp.allowReserved) } diff --git a/vendor/google.golang.org/api/googleapi/internal/uritemplates/utils.go b/vendor/google.golang.org/api/googleapi/internal/uritemplates/utils.go index eff260a692..2e70b81543 100644 --- a/vendor/google.golang.org/api/googleapi/internal/uritemplates/utils.go +++ b/vendor/google.golang.org/api/googleapi/internal/uritemplates/utils.go @@ -4,10 +4,14 @@ package uritemplates -func Expand(path string, values map[string]string) (string, error) { +// Expand parses then expands a URI template with a set of values to produce +// the resultant URI. Two forms of the result are returned: one with all the +// elements escaped, and one with the elements unescaped. +func Expand(path string, values map[string]string) (escaped, unescaped string, err error) { template, err := parse(path) if err != nil { - return "", err + return "", "", err } - return template.Expand(values), nil + escaped, unescaped = template.Expand(values) + return escaped, unescaped, nil } diff --git a/vendor/google.golang.org/appengine/.travis.yml b/vendor/google.golang.org/appengine/.travis.yml new file mode 100644 index 0000000000..12ea385f9c --- /dev/null +++ b/vendor/google.golang.org/appengine/.travis.yml @@ -0,0 +1,18 @@ +language: go + +go: + - 1.6.3 + - 1.7rc6 + +install: + - go get -v -t -d google.golang.org/appengine/... + - mkdir sdk + - curl -o sdk.zip "https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.40.zip" + - unzip sdk.zip -d sdk + - export APPENGINE_DEV_APPSERVER=$(pwd)/sdk/go_appengine/dev_appserver.py + +script: + - go version + - go test -v google.golang.org/appengine/... + - go test -v -race google.golang.org/appengine/... + - sdk/go_appengine/goapp test -v google.golang.org/appengine/... diff --git a/vendor/google.golang.org/appengine/LICENSE b/vendor/google.golang.org/appengine/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/vendor/google.golang.org/appengine/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/google.golang.org/appengine/README.md b/vendor/google.golang.org/appengine/README.md new file mode 100644 index 0000000000..1efd95583b --- /dev/null +++ b/vendor/google.golang.org/appengine/README.md @@ -0,0 +1,71 @@ +# Go App Engine packages + +[![Build Status](https://travis-ci.org/golang/appengine.svg)](https://travis-ci.org/golang/appengine) + +This repository supports the Go runtime on App Engine, +including both the standard App Engine and the +"App Engine flexible environment" (formerly known as "Managed VMs"). +It provides APIs for interacting with App Engine services. +Its canonical import path is `google.golang.org/appengine`. + +See https://cloud.google.com/appengine/docs/go/ +for more information. + +File issue reports and feature requests on the [Google App Engine issue +tracker](https://code.google.com/p/googleappengine/issues/entry?template=Go%20defect). + +## Directory structure +The top level directory of this repository is the `appengine` package. It +contains the +basic APIs (e.g. `appengine.NewContext`) that apply across APIs. Specific API +packages are in subdirectories (e.g. `datastore`). + +There is an `internal` subdirectory that contains service protocol buffers, +plus packages required for connectivity to make API calls. App Engine apps +should not directly import any package under `internal`. + +## Updating a Go App Engine app + +This section describes how to update an older Go App Engine app to use +these packages. A provided tool, `aefix`, can help automate steps 2 and 3 +(run `go get google.golang.org/appengine/cmd/aefix` to install it), but +read the details below since `aefix` can't perform all the changes. + +### 1. Update YAML files (App Engine flexible environment / Managed VMs only) + +The `app.yaml` file (and YAML files for modules) should have these new lines added: +``` +vm: true +``` +See https://cloud.google.com/appengine/docs/go/modules/#Go_Instance_scaling_and_class for details. + +### 2. Update import paths + +The import paths for App Engine packages are now fully qualified, based at `google.golang.org/appengine`. +You will need to update your code to use import paths starting with that; for instance, +code importing `appengine/datastore` will now need to import `google.golang.org/appengine/datastore`. + +### 3. Update code using deprecated, removed or modified APIs + +Most App Engine services are available with exactly the same API. +A few APIs were cleaned up, and some are not available yet. +This list summarises the differences: + +* `appengine.Context` has been replaced with the `Context` type from `golang.org/x/net/context`. +* Logging methods that were on `appengine.Context` are now functions in `google.golang.org/appengine/log`. +* `appengine.Timeout` has been removed. Use `context.WithTimeout` instead. +* `appengine.Datacenter` now takes a `context.Context` argument. +* `datastore.PropertyLoadSaver` has been simplified to use slices in place of channels. +* `delay.Call` now returns an error. +* `search.FieldLoadSaver` now handles document metadata. +* `urlfetch.Transport` no longer has a Deadline field; set a deadline on the + `context.Context` instead. +* `aetest` no longer declares its own Context type, and uses the standard one instead. +* `taskqueue.QueueStats` no longer takes a maxTasks argument. That argument has been + deprecated and unused for a long time. +* `appengine.BackendHostname` and `appengine.BackendInstance` were for the deprecated backends feature. + Use `appengine.ModuleHostname`and `appengine.ModuleName` instead. +* Most of `appengine/file` and parts of `appengine/blobstore` are deprecated. + Use [Google Cloud Storage](https://godoc.org/google.golang.org/cloud/storage) instead. +* `appengine/socket` is not required on App Engine flexible environment / Managed VMs. + Use the standard `net` package instead. diff --git a/vendor/google.golang.org/appengine/appengine.go b/vendor/google.golang.org/appengine/appengine.go new file mode 100644 index 0000000000..8865c49a5f --- /dev/null +++ b/vendor/google.golang.org/appengine/appengine.go @@ -0,0 +1,112 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// Package appengine provides basic functionality for Google App Engine. +// +// For more information on how to write Go apps for Google App Engine, see: +// https://cloud.google.com/appengine/docs/go/ +package appengine + +import ( + "net/http" + + "github.com/golang/protobuf/proto" + "golang.org/x/net/context" + + "google.golang.org/appengine/internal" +) + +// The gophers party all night; the rabbits provide the beats. + +// Main is the principal entry point for an app running in App Engine. +// +// On App Engine Flexible it installs a trivial health checker if one isn't +// already registered, and starts listening on port 8080 (overridden by the +// $PORT environment variable). +// +// See https://cloud.google.com/appengine/docs/flexible/custom-runtimes#health_check_requests +// for details on how to do your own health checking. +// +// Main is not yet supported on App Engine Standard. +// +// Main never returns. +// +// Main is designed so that the app's main package looks like this: +// +// package main +// +// import ( +// "google.golang.org/appengine" +// +// _ "myapp/package0" +// _ "myapp/package1" +// ) +// +// func main() { +// appengine.Main() +// } +// +// The "myapp/packageX" packages are expected to register HTTP handlers +// in their init functions. +func Main() { + internal.Main() +} + +// IsDevAppServer reports whether the App Engine app is running in the +// development App Server. +func IsDevAppServer() bool { + return internal.IsDevAppServer() +} + +// NewContext returns a context for an in-flight HTTP request. +// This function is cheap. +func NewContext(req *http.Request) context.Context { + return WithContext(context.Background(), req) +} + +// WithContext returns a copy of the parent context +// and associates it with an in-flight HTTP request. +// This function is cheap. +func WithContext(parent context.Context, req *http.Request) context.Context { + return internal.WithContext(parent, req) +} + +// TODO(dsymonds): Add a Call function here? Otherwise other packages can't access internal.Call. + +// BlobKey is a key for a blobstore blob. +// +// Conceptually, this type belongs in the blobstore package, but it lives in +// the appengine package to avoid a circular dependency: blobstore depends on +// datastore, and datastore needs to refer to the BlobKey type. +type BlobKey string + +// GeoPoint represents a location as latitude/longitude in degrees. +type GeoPoint struct { + Lat, Lng float64 +} + +// Valid returns whether a GeoPoint is within [-90, 90] latitude and [-180, 180] longitude. +func (g GeoPoint) Valid() bool { + return -90 <= g.Lat && g.Lat <= 90 && -180 <= g.Lng && g.Lng <= 180 +} + +// APICallFunc defines a function type for handling an API call. +// See WithCallOverride. +type APICallFunc func(ctx context.Context, service, method string, in, out proto.Message) error + +// WithAPICallFunc returns a copy of the parent context +// that will cause API calls to invoke f instead of their normal operation. +// +// This is intended for advanced users only. +func WithAPICallFunc(ctx context.Context, f APICallFunc) context.Context { + return internal.WithCallOverride(ctx, internal.CallOverrideFunc(f)) +} + +// APICall performs an API call. +// +// This is not intended for general use; it is exported for use in conjunction +// with WithAPICallFunc. +func APICall(ctx context.Context, service, method string, in, out proto.Message) error { + return internal.Call(ctx, service, method, in, out) +} diff --git a/vendor/google.golang.org/appengine/appengine_vm.go b/vendor/google.golang.org/appengine/appengine_vm.go new file mode 100644 index 0000000000..f4b645aad3 --- /dev/null +++ b/vendor/google.golang.org/appengine/appengine_vm.go @@ -0,0 +1,20 @@ +// Copyright 2015 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build !appengine + +package appengine + +import ( + "golang.org/x/net/context" + + "google.golang.org/appengine/internal" +) + +// BackgroundContext returns a context not associated with a request. +// This should only be used when not servicing a request. +// This only works in App Engine "flexible environment". +func BackgroundContext() context.Context { + return internal.BackgroundContext() +} diff --git a/vendor/google.golang.org/appengine/errors.go b/vendor/google.golang.org/appengine/errors.go new file mode 100644 index 0000000000..16d0772e2a --- /dev/null +++ b/vendor/google.golang.org/appengine/errors.go @@ -0,0 +1,46 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// This file provides error functions for common API failure modes. + +package appengine + +import ( + "fmt" + + "google.golang.org/appengine/internal" +) + +// IsOverQuota reports whether err represents an API call failure +// due to insufficient available quota. +func IsOverQuota(err error) bool { + callErr, ok := err.(*internal.CallError) + return ok && callErr.Code == 4 +} + +// MultiError is returned by batch operations when there are errors with +// particular elements. Errors will be in a one-to-one correspondence with +// the input elements; successful elements will have a nil entry. +type MultiError []error + +func (m MultiError) Error() string { + s, n := "", 0 + for _, e := range m { + if e != nil { + if n == 0 { + s = e.Error() + } + n++ + } + } + switch n { + case 0: + return "(0 errors)" + case 1: + return s + case 2: + return s + " (and 1 other error)" + } + return fmt.Sprintf("%s (and %d other errors)", s, n-1) +} diff --git a/vendor/google.golang.org/appengine/identity.go b/vendor/google.golang.org/appengine/identity.go new file mode 100644 index 0000000000..b8dcf8f361 --- /dev/null +++ b/vendor/google.golang.org/appengine/identity.go @@ -0,0 +1,142 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package appengine + +import ( + "time" + + "golang.org/x/net/context" + + "google.golang.org/appengine/internal" + pb "google.golang.org/appengine/internal/app_identity" + modpb "google.golang.org/appengine/internal/modules" +) + +// AppID returns the application ID for the current application. +// The string will be a plain application ID (e.g. "appid"), with a +// domain prefix for custom domain deployments (e.g. "example.com:appid"). +func AppID(c context.Context) string { return internal.AppID(c) } + +// DefaultVersionHostname returns the standard hostname of the default version +// of the current application (e.g. "my-app.appspot.com"). This is suitable for +// use in constructing URLs. +func DefaultVersionHostname(c context.Context) string { + return internal.DefaultVersionHostname(c) +} + +// ModuleName returns the module name of the current instance. +func ModuleName(c context.Context) string { + return internal.ModuleName(c) +} + +// ModuleHostname returns a hostname of a module instance. +// If module is the empty string, it refers to the module of the current instance. +// If version is empty, it refers to the version of the current instance if valid, +// or the default version of the module of the current instance. +// If instance is empty, ModuleHostname returns the load-balancing hostname. +func ModuleHostname(c context.Context, module, version, instance string) (string, error) { + req := &modpb.GetHostnameRequest{} + if module != "" { + req.Module = &module + } + if version != "" { + req.Version = &version + } + if instance != "" { + req.Instance = &instance + } + res := &modpb.GetHostnameResponse{} + if err := internal.Call(c, "modules", "GetHostname", req, res); err != nil { + return "", err + } + return *res.Hostname, nil +} + +// VersionID returns the version ID for the current application. +// It will be of the form "X.Y", where X is specified in app.yaml, +// and Y is a number generated when each version of the app is uploaded. +// It does not include a module name. +func VersionID(c context.Context) string { return internal.VersionID(c) } + +// InstanceID returns a mostly-unique identifier for this instance. +func InstanceID() string { return internal.InstanceID() } + +// Datacenter returns an identifier for the datacenter that the instance is running in. +func Datacenter(c context.Context) string { return internal.Datacenter(c) } + +// ServerSoftware returns the App Engine release version. +// In production, it looks like "Google App Engine/X.Y.Z". +// In the development appserver, it looks like "Development/X.Y". +func ServerSoftware() string { return internal.ServerSoftware() } + +// RequestID returns a string that uniquely identifies the request. +func RequestID(c context.Context) string { return internal.RequestID(c) } + +// AccessToken generates an OAuth2 access token for the specified scopes on +// behalf of service account of this application. This token will expire after +// the returned time. +func AccessToken(c context.Context, scopes ...string) (token string, expiry time.Time, err error) { + req := &pb.GetAccessTokenRequest{Scope: scopes} + res := &pb.GetAccessTokenResponse{} + + err = internal.Call(c, "app_identity_service", "GetAccessToken", req, res) + if err != nil { + return "", time.Time{}, err + } + return res.GetAccessToken(), time.Unix(res.GetExpirationTime(), 0), nil +} + +// Certificate represents a public certificate for the app. +type Certificate struct { + KeyName string + Data []byte // PEM-encoded X.509 certificate +} + +// PublicCertificates retrieves the public certificates for the app. +// They can be used to verify a signature returned by SignBytes. +func PublicCertificates(c context.Context) ([]Certificate, error) { + req := &pb.GetPublicCertificateForAppRequest{} + res := &pb.GetPublicCertificateForAppResponse{} + if err := internal.Call(c, "app_identity_service", "GetPublicCertificatesForApp", req, res); err != nil { + return nil, err + } + var cs []Certificate + for _, pc := range res.PublicCertificateList { + cs = append(cs, Certificate{ + KeyName: pc.GetKeyName(), + Data: []byte(pc.GetX509CertificatePem()), + }) + } + return cs, nil +} + +// ServiceAccount returns a string representing the service account name, in +// the form of an email address (typically app_id@appspot.gserviceaccount.com). +func ServiceAccount(c context.Context) (string, error) { + req := &pb.GetServiceAccountNameRequest{} + res := &pb.GetServiceAccountNameResponse{} + + err := internal.Call(c, "app_identity_service", "GetServiceAccountName", req, res) + if err != nil { + return "", err + } + return res.GetServiceAccountName(), err +} + +// SignBytes signs bytes using a private key unique to your application. +func SignBytes(c context.Context, bytes []byte) (keyName string, signature []byte, err error) { + req := &pb.SignForAppRequest{BytesToSign: bytes} + res := &pb.SignForAppResponse{} + + if err := internal.Call(c, "app_identity_service", "SignForApp", req, res); err != nil { + return "", nil, err + } + return res.GetKeyName(), res.GetSignatureBytes(), nil +} + +func init() { + internal.RegisterErrorCodeMap("app_identity_service", pb.AppIdentityServiceError_ErrorCode_name) + internal.RegisterErrorCodeMap("modules", modpb.ModulesServiceError_ErrorCode_name) +} diff --git a/vendor/google.golang.org/appengine/internal/api.go b/vendor/google.golang.org/appengine/internal/api.go new file mode 100644 index 0000000000..ec5aa59b39 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/api.go @@ -0,0 +1,646 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build !appengine + +package internal + +import ( + "bytes" + "errors" + "fmt" + "io/ioutil" + "log" + "net" + "net/http" + "net/url" + "os" + "runtime" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/golang/protobuf/proto" + netcontext "golang.org/x/net/context" + + basepb "google.golang.org/appengine/internal/base" + logpb "google.golang.org/appengine/internal/log" + remotepb "google.golang.org/appengine/internal/remote_api" +) + +const ( + apiPath = "/rpc_http" +) + +var ( + // Incoming headers. + ticketHeader = http.CanonicalHeaderKey("X-AppEngine-API-Ticket") + dapperHeader = http.CanonicalHeaderKey("X-Google-DapperTraceInfo") + traceHeader = http.CanonicalHeaderKey("X-Cloud-Trace-Context") + curNamespaceHeader = http.CanonicalHeaderKey("X-AppEngine-Current-Namespace") + userIPHeader = http.CanonicalHeaderKey("X-AppEngine-User-IP") + remoteAddrHeader = http.CanonicalHeaderKey("X-AppEngine-Remote-Addr") + + // Outgoing headers. + apiEndpointHeader = http.CanonicalHeaderKey("X-Google-RPC-Service-Endpoint") + apiEndpointHeaderValue = []string{"app-engine-apis"} + apiMethodHeader = http.CanonicalHeaderKey("X-Google-RPC-Service-Method") + apiMethodHeaderValue = []string{"/VMRemoteAPI.CallRemoteAPI"} + apiDeadlineHeader = http.CanonicalHeaderKey("X-Google-RPC-Service-Deadline") + apiContentType = http.CanonicalHeaderKey("Content-Type") + apiContentTypeValue = []string{"application/octet-stream"} + logFlushHeader = http.CanonicalHeaderKey("X-AppEngine-Log-Flush-Count") + + apiHTTPClient = &http.Client{ + Transport: &http.Transport{ + Proxy: http.ProxyFromEnvironment, + Dial: limitDial, + }, + } +) + +func apiURL() *url.URL { + host, port := "appengine.googleapis.internal", "10001" + if h := os.Getenv("API_HOST"); h != "" { + host = h + } + if p := os.Getenv("API_PORT"); p != "" { + port = p + } + return &url.URL{ + Scheme: "http", + Host: host + ":" + port, + Path: apiPath, + } +} + +func handleHTTP(w http.ResponseWriter, r *http.Request) { + c := &context{ + req: r, + outHeader: w.Header(), + apiURL: apiURL(), + } + stopFlushing := make(chan int) + + ctxs.Lock() + ctxs.m[r] = c + ctxs.Unlock() + defer func() { + ctxs.Lock() + delete(ctxs.m, r) + ctxs.Unlock() + }() + + // Patch up RemoteAddr so it looks reasonable. + if addr := r.Header.Get(userIPHeader); addr != "" { + r.RemoteAddr = addr + } else if addr = r.Header.Get(remoteAddrHeader); addr != "" { + r.RemoteAddr = addr + } else { + // Should not normally reach here, but pick a sensible default anyway. + r.RemoteAddr = "127.0.0.1" + } + // The address in the headers will most likely be of these forms: + // 123.123.123.123 + // 2001:db8::1 + // net/http.Request.RemoteAddr is specified to be in "IP:port" form. + if _, _, err := net.SplitHostPort(r.RemoteAddr); err != nil { + // Assume the remote address is only a host; add a default port. + r.RemoteAddr = net.JoinHostPort(r.RemoteAddr, "80") + } + + // Start goroutine responsible for flushing app logs. + // This is done after adding c to ctx.m (and stopped before removing it) + // because flushing logs requires making an API call. + go c.logFlusher(stopFlushing) + + executeRequestSafely(c, r) + c.outHeader = nil // make sure header changes aren't respected any more + + stopFlushing <- 1 // any logging beyond this point will be dropped + + // Flush any pending logs asynchronously. + c.pendingLogs.Lock() + flushes := c.pendingLogs.flushes + if len(c.pendingLogs.lines) > 0 { + flushes++ + } + c.pendingLogs.Unlock() + go c.flushLog(false) + w.Header().Set(logFlushHeader, strconv.Itoa(flushes)) + + // Avoid nil Write call if c.Write is never called. + if c.outCode != 0 { + w.WriteHeader(c.outCode) + } + if c.outBody != nil { + w.Write(c.outBody) + } +} + +func executeRequestSafely(c *context, r *http.Request) { + defer func() { + if x := recover(); x != nil { + logf(c, 4, "%s", renderPanic(x)) // 4 == critical + c.outCode = 500 + } + }() + + http.DefaultServeMux.ServeHTTP(c, r) +} + +func renderPanic(x interface{}) string { + buf := make([]byte, 16<<10) // 16 KB should be plenty + buf = buf[:runtime.Stack(buf, false)] + + // Remove the first few stack frames: + // this func + // the recover closure in the caller + // That will root the stack trace at the site of the panic. + const ( + skipStart = "internal.renderPanic" + skipFrames = 2 + ) + start := bytes.Index(buf, []byte(skipStart)) + p := start + for i := 0; i < skipFrames*2 && p+1 < len(buf); i++ { + p = bytes.IndexByte(buf[p+1:], '\n') + p + 1 + if p < 0 { + break + } + } + if p >= 0 { + // buf[start:p+1] is the block to remove. + // Copy buf[p+1:] over buf[start:] and shrink buf. + copy(buf[start:], buf[p+1:]) + buf = buf[:len(buf)-(p+1-start)] + } + + // Add panic heading. + head := fmt.Sprintf("panic: %v\n\n", x) + if len(head) > len(buf) { + // Extremely unlikely to happen. + return head + } + copy(buf[len(head):], buf) + copy(buf, head) + + return string(buf) +} + +var ctxs = struct { + sync.Mutex + m map[*http.Request]*context + bg *context // background context, lazily initialized + // dec is used by tests to decorate the netcontext.Context returned + // for a given request. This allows tests to add overrides (such as + // WithAppIDOverride) to the context. The map is nil outside tests. + dec map[*http.Request]func(netcontext.Context) netcontext.Context +}{ + m: make(map[*http.Request]*context), +} + +// context represents the context of an in-flight HTTP request. +// It implements the appengine.Context and http.ResponseWriter interfaces. +type context struct { + req *http.Request + + outCode int + outHeader http.Header + outBody []byte + + pendingLogs struct { + sync.Mutex + lines []*logpb.UserAppLogLine + flushes int + } + + apiURL *url.URL +} + +var contextKey = "holds a *context" + +func fromContext(ctx netcontext.Context) *context { + c, _ := ctx.Value(&contextKey).(*context) + return c +} + +func withContext(parent netcontext.Context, c *context) netcontext.Context { + ctx := netcontext.WithValue(parent, &contextKey, c) + if ns := c.req.Header.Get(curNamespaceHeader); ns != "" { + ctx = withNamespace(ctx, ns) + } + return ctx +} + +func toContext(c *context) netcontext.Context { + return withContext(netcontext.Background(), c) +} + +func IncomingHeaders(ctx netcontext.Context) http.Header { + if c := fromContext(ctx); c != nil { + return c.req.Header + } + return nil +} + +func WithContext(parent netcontext.Context, req *http.Request) netcontext.Context { + ctxs.Lock() + c := ctxs.m[req] + d := ctxs.dec[req] + ctxs.Unlock() + + if d != nil { + parent = d(parent) + } + + if c == nil { + // Someone passed in an http.Request that is not in-flight. + // We panic here rather than panicking at a later point + // so that stack traces will be more sensible. + log.Panic("appengine: NewContext passed an unknown http.Request") + } + return withContext(parent, c) +} + +func BackgroundContext() netcontext.Context { + ctxs.Lock() + defer ctxs.Unlock() + + if ctxs.bg != nil { + return toContext(ctxs.bg) + } + + // Compute background security ticket. + appID := partitionlessAppID() + escAppID := strings.Replace(strings.Replace(appID, ":", "_", -1), ".", "_", -1) + majVersion := VersionID(nil) + if i := strings.Index(majVersion, "."); i > 0 { + majVersion = majVersion[:i] + } + ticket := fmt.Sprintf("%s/%s.%s.%s", escAppID, ModuleName(nil), majVersion, InstanceID()) + + ctxs.bg = &context{ + req: &http.Request{ + Header: http.Header{ + ticketHeader: []string{ticket}, + }, + }, + apiURL: apiURL(), + } + + // TODO(dsymonds): Wire up the shutdown handler to do a final flush. + go ctxs.bg.logFlusher(make(chan int)) + + return toContext(ctxs.bg) +} + +// RegisterTestRequest registers the HTTP request req for testing, such that +// any API calls are sent to the provided URL. It returns a closure to delete +// the registration. +// It should only be used by aetest package. +func RegisterTestRequest(req *http.Request, apiURL *url.URL, decorate func(netcontext.Context) netcontext.Context) func() { + c := &context{ + req: req, + apiURL: apiURL, + } + ctxs.Lock() + defer ctxs.Unlock() + if _, ok := ctxs.m[req]; ok { + log.Panic("req already associated with context") + } + if _, ok := ctxs.dec[req]; ok { + log.Panic("req already associated with context") + } + if ctxs.dec == nil { + ctxs.dec = make(map[*http.Request]func(netcontext.Context) netcontext.Context) + } + ctxs.m[req] = c + ctxs.dec[req] = decorate + + return func() { + ctxs.Lock() + delete(ctxs.m, req) + delete(ctxs.dec, req) + ctxs.Unlock() + } +} + +var errTimeout = &CallError{ + Detail: "Deadline exceeded", + Code: int32(remotepb.RpcError_CANCELLED), + Timeout: true, +} + +func (c *context) Header() http.Header { return c.outHeader } + +// Copied from $GOROOT/src/pkg/net/http/transfer.go. Some response status +// codes do not permit a response body (nor response entity headers such as +// Content-Length, Content-Type, etc). +func bodyAllowedForStatus(status int) bool { + switch { + case status >= 100 && status <= 199: + return false + case status == 204: + return false + case status == 304: + return false + } + return true +} + +func (c *context) Write(b []byte) (int, error) { + if c.outCode == 0 { + c.WriteHeader(http.StatusOK) + } + if len(b) > 0 && !bodyAllowedForStatus(c.outCode) { + return 0, http.ErrBodyNotAllowed + } + c.outBody = append(c.outBody, b...) + return len(b), nil +} + +func (c *context) WriteHeader(code int) { + if c.outCode != 0 { + logf(c, 3, "WriteHeader called multiple times on request.") // error level + return + } + c.outCode = code +} + +func (c *context) post(body []byte, timeout time.Duration) (b []byte, err error) { + hreq := &http.Request{ + Method: "POST", + URL: c.apiURL, + Header: http.Header{ + apiEndpointHeader: apiEndpointHeaderValue, + apiMethodHeader: apiMethodHeaderValue, + apiContentType: apiContentTypeValue, + apiDeadlineHeader: []string{strconv.FormatFloat(timeout.Seconds(), 'f', -1, 64)}, + }, + Body: ioutil.NopCloser(bytes.NewReader(body)), + ContentLength: int64(len(body)), + Host: c.apiURL.Host, + } + if info := c.req.Header.Get(dapperHeader); info != "" { + hreq.Header.Set(dapperHeader, info) + } + if info := c.req.Header.Get(traceHeader); info != "" { + hreq.Header.Set(traceHeader, info) + } + + tr := apiHTTPClient.Transport.(*http.Transport) + + var timedOut int32 // atomic; set to 1 if timed out + t := time.AfterFunc(timeout, func() { + atomic.StoreInt32(&timedOut, 1) + tr.CancelRequest(hreq) + }) + defer t.Stop() + defer func() { + // Check if timeout was exceeded. + if atomic.LoadInt32(&timedOut) != 0 { + err = errTimeout + } + }() + + hresp, err := apiHTTPClient.Do(hreq) + if err != nil { + return nil, &CallError{ + Detail: fmt.Sprintf("service bridge HTTP failed: %v", err), + Code: int32(remotepb.RpcError_UNKNOWN), + } + } + defer hresp.Body.Close() + hrespBody, err := ioutil.ReadAll(hresp.Body) + if hresp.StatusCode != 200 { + return nil, &CallError{ + Detail: fmt.Sprintf("service bridge returned HTTP %d (%q)", hresp.StatusCode, hrespBody), + Code: int32(remotepb.RpcError_UNKNOWN), + } + } + if err != nil { + return nil, &CallError{ + Detail: fmt.Sprintf("service bridge response bad: %v", err), + Code: int32(remotepb.RpcError_UNKNOWN), + } + } + return hrespBody, nil +} + +func Call(ctx netcontext.Context, service, method string, in, out proto.Message) error { + if ns := NamespaceFromContext(ctx); ns != "" { + if fn, ok := NamespaceMods[service]; ok { + fn(in, ns) + } + } + + if f, ctx, ok := callOverrideFromContext(ctx); ok { + return f(ctx, service, method, in, out) + } + + // Handle already-done contexts quickly. + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + c := fromContext(ctx) + if c == nil { + // Give a good error message rather than a panic lower down. + return errors.New("not an App Engine context") + } + + // Apply transaction modifications if we're in a transaction. + if t := transactionFromContext(ctx); t != nil { + if t.finished { + return errors.New("transaction context has expired") + } + applyTransaction(in, &t.transaction) + } + + // Default RPC timeout is 60s. + timeout := 60 * time.Second + if deadline, ok := ctx.Deadline(); ok { + timeout = deadline.Sub(time.Now()) + } + + data, err := proto.Marshal(in) + if err != nil { + return err + } + + ticket := c.req.Header.Get(ticketHeader) + req := &remotepb.Request{ + ServiceName: &service, + Method: &method, + Request: data, + RequestId: &ticket, + } + hreqBody, err := proto.Marshal(req) + if err != nil { + return err + } + + hrespBody, err := c.post(hreqBody, timeout) + if err != nil { + return err + } + + res := &remotepb.Response{} + if err := proto.Unmarshal(hrespBody, res); err != nil { + return err + } + if res.RpcError != nil { + ce := &CallError{ + Detail: res.RpcError.GetDetail(), + Code: *res.RpcError.Code, + } + switch remotepb.RpcError_ErrorCode(ce.Code) { + case remotepb.RpcError_CANCELLED, remotepb.RpcError_DEADLINE_EXCEEDED: + ce.Timeout = true + } + return ce + } + if res.ApplicationError != nil { + return &APIError{ + Service: *req.ServiceName, + Detail: res.ApplicationError.GetDetail(), + Code: *res.ApplicationError.Code, + } + } + if res.Exception != nil || res.JavaException != nil { + // This shouldn't happen, but let's be defensive. + return &CallError{ + Detail: "service bridge returned exception", + Code: int32(remotepb.RpcError_UNKNOWN), + } + } + return proto.Unmarshal(res.Response, out) +} + +func (c *context) Request() *http.Request { + return c.req +} + +func (c *context) addLogLine(ll *logpb.UserAppLogLine) { + // Truncate long log lines. + // TODO(dsymonds): Check if this is still necessary. + const lim = 8 << 10 + if len(*ll.Message) > lim { + suffix := fmt.Sprintf("...(length %d)", len(*ll.Message)) + ll.Message = proto.String((*ll.Message)[:lim-len(suffix)] + suffix) + } + + c.pendingLogs.Lock() + c.pendingLogs.lines = append(c.pendingLogs.lines, ll) + c.pendingLogs.Unlock() +} + +var logLevelName = map[int64]string{ + 0: "DEBUG", + 1: "INFO", + 2: "WARNING", + 3: "ERROR", + 4: "CRITICAL", +} + +func logf(c *context, level int64, format string, args ...interface{}) { + s := fmt.Sprintf(format, args...) + s = strings.TrimRight(s, "\n") // Remove any trailing newline characters. + c.addLogLine(&logpb.UserAppLogLine{ + TimestampUsec: proto.Int64(time.Now().UnixNano() / 1e3), + Level: &level, + Message: &s, + }) + log.Print(logLevelName[level] + ": " + s) +} + +// flushLog attempts to flush any pending logs to the appserver. +// It should not be called concurrently. +func (c *context) flushLog(force bool) (flushed bool) { + c.pendingLogs.Lock() + // Grab up to 30 MB. We can get away with up to 32 MB, but let's be cautious. + n, rem := 0, 30<<20 + for ; n < len(c.pendingLogs.lines); n++ { + ll := c.pendingLogs.lines[n] + // Each log line will require about 3 bytes of overhead. + nb := proto.Size(ll) + 3 + if nb > rem { + break + } + rem -= nb + } + lines := c.pendingLogs.lines[:n] + c.pendingLogs.lines = c.pendingLogs.lines[n:] + c.pendingLogs.Unlock() + + if len(lines) == 0 && !force { + // Nothing to flush. + return false + } + + rescueLogs := false + defer func() { + if rescueLogs { + c.pendingLogs.Lock() + c.pendingLogs.lines = append(lines, c.pendingLogs.lines...) + c.pendingLogs.Unlock() + } + }() + + buf, err := proto.Marshal(&logpb.UserAppLogGroup{ + LogLine: lines, + }) + if err != nil { + log.Printf("internal.flushLog: marshaling UserAppLogGroup: %v", err) + rescueLogs = true + return false + } + + req := &logpb.FlushRequest{ + Logs: buf, + } + res := &basepb.VoidProto{} + c.pendingLogs.Lock() + c.pendingLogs.flushes++ + c.pendingLogs.Unlock() + if err := Call(toContext(c), "logservice", "Flush", req, res); err != nil { + log.Printf("internal.flushLog: Flush RPC: %v", err) + rescueLogs = true + return false + } + return true +} + +const ( + // Log flushing parameters. + flushInterval = 1 * time.Second + forceFlushInterval = 60 * time.Second +) + +func (c *context) logFlusher(stop <-chan int) { + lastFlush := time.Now() + tick := time.NewTicker(flushInterval) + for { + select { + case <-stop: + // Request finished. + tick.Stop() + return + case <-tick.C: + force := time.Now().Sub(lastFlush) > forceFlushInterval + if c.flushLog(force) { + lastFlush = time.Now() + } + } + } +} + +func ContextForTesting(req *http.Request) netcontext.Context { + return toContext(&context{req: req}) +} diff --git a/vendor/google.golang.org/appengine/internal/api_classic.go b/vendor/google.golang.org/appengine/internal/api_classic.go new file mode 100644 index 0000000000..597f66e6ea --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/api_classic.go @@ -0,0 +1,159 @@ +// Copyright 2015 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build appengine + +package internal + +import ( + "errors" + "fmt" + "net/http" + "time" + + "appengine" + "appengine_internal" + basepb "appengine_internal/base" + + "github.com/golang/protobuf/proto" + netcontext "golang.org/x/net/context" +) + +var contextKey = "holds an appengine.Context" + +func fromContext(ctx netcontext.Context) appengine.Context { + c, _ := ctx.Value(&contextKey).(appengine.Context) + return c +} + +// This is only for classic App Engine adapters. +func ClassicContextFromContext(ctx netcontext.Context) appengine.Context { + return fromContext(ctx) +} + +func withContext(parent netcontext.Context, c appengine.Context) netcontext.Context { + ctx := netcontext.WithValue(parent, &contextKey, c) + + s := &basepb.StringProto{} + c.Call("__go__", "GetNamespace", &basepb.VoidProto{}, s, nil) + if ns := s.GetValue(); ns != "" { + ctx = NamespacedContext(ctx, ns) + } + + return ctx +} + +func IncomingHeaders(ctx netcontext.Context) http.Header { + if c := fromContext(ctx); c != nil { + if req, ok := c.Request().(*http.Request); ok { + return req.Header + } + } + return nil +} + +func WithContext(parent netcontext.Context, req *http.Request) netcontext.Context { + c := appengine.NewContext(req) + return withContext(parent, c) +} + +type testingContext struct { + appengine.Context + + req *http.Request +} + +func (t *testingContext) FullyQualifiedAppID() string { return "dev~testcontext" } +func (t *testingContext) Call(service, method string, _, _ appengine_internal.ProtoMessage, _ *appengine_internal.CallOptions) error { + if service == "__go__" && method == "GetNamespace" { + return nil + } + return fmt.Errorf("testingContext: unsupported Call") +} +func (t *testingContext) Request() interface{} { return t.req } + +func ContextForTesting(req *http.Request) netcontext.Context { + return withContext(netcontext.Background(), &testingContext{req: req}) +} + +func Call(ctx netcontext.Context, service, method string, in, out proto.Message) error { + if ns := NamespaceFromContext(ctx); ns != "" { + if fn, ok := NamespaceMods[service]; ok { + fn(in, ns) + } + } + + if f, ctx, ok := callOverrideFromContext(ctx); ok { + return f(ctx, service, method, in, out) + } + + // Handle already-done contexts quickly. + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + c := fromContext(ctx) + if c == nil { + // Give a good error message rather than a panic lower down. + return errors.New("not an App Engine context") + } + + // Apply transaction modifications if we're in a transaction. + if t := transactionFromContext(ctx); t != nil { + if t.finished { + return errors.New("transaction context has expired") + } + applyTransaction(in, &t.transaction) + } + + var opts *appengine_internal.CallOptions + if d, ok := ctx.Deadline(); ok { + opts = &appengine_internal.CallOptions{ + Timeout: d.Sub(time.Now()), + } + } + + err := c.Call(service, method, in, out, opts) + switch v := err.(type) { + case *appengine_internal.APIError: + return &APIError{ + Service: v.Service, + Detail: v.Detail, + Code: v.Code, + } + case *appengine_internal.CallError: + return &CallError{ + Detail: v.Detail, + Code: v.Code, + Timeout: v.Timeout, + } + } + return err +} + +func handleHTTP(w http.ResponseWriter, r *http.Request) { + panic("handleHTTP called; this should be impossible") +} + +func logf(c appengine.Context, level int64, format string, args ...interface{}) { + var fn func(format string, args ...interface{}) + switch level { + case 0: + fn = c.Debugf + case 1: + fn = c.Infof + case 2: + fn = c.Warningf + case 3: + fn = c.Errorf + case 4: + fn = c.Criticalf + default: + // This shouldn't happen. + fn = c.Criticalf + } + fn(format, args...) +} diff --git a/vendor/google.golang.org/appengine/internal/api_common.go b/vendor/google.golang.org/appengine/internal/api_common.go new file mode 100644 index 0000000000..2db33a774b --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/api_common.go @@ -0,0 +1,86 @@ +// Copyright 2015 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package internal + +import ( + "github.com/golang/protobuf/proto" + netcontext "golang.org/x/net/context" +) + +type CallOverrideFunc func(ctx netcontext.Context, service, method string, in, out proto.Message) error + +var callOverrideKey = "holds []CallOverrideFunc" + +func WithCallOverride(ctx netcontext.Context, f CallOverrideFunc) netcontext.Context { + // We avoid appending to any existing call override + // so we don't risk overwriting a popped stack below. + var cofs []CallOverrideFunc + if uf, ok := ctx.Value(&callOverrideKey).([]CallOverrideFunc); ok { + cofs = append(cofs, uf...) + } + cofs = append(cofs, f) + return netcontext.WithValue(ctx, &callOverrideKey, cofs) +} + +func callOverrideFromContext(ctx netcontext.Context) (CallOverrideFunc, netcontext.Context, bool) { + cofs, _ := ctx.Value(&callOverrideKey).([]CallOverrideFunc) + if len(cofs) == 0 { + return nil, nil, false + } + // We found a list of overrides; grab the last, and reconstitute a + // context that will hide it. + f := cofs[len(cofs)-1] + ctx = netcontext.WithValue(ctx, &callOverrideKey, cofs[:len(cofs)-1]) + return f, ctx, true +} + +type logOverrideFunc func(level int64, format string, args ...interface{}) + +var logOverrideKey = "holds a logOverrideFunc" + +func WithLogOverride(ctx netcontext.Context, f logOverrideFunc) netcontext.Context { + return netcontext.WithValue(ctx, &logOverrideKey, f) +} + +var appIDOverrideKey = "holds a string, being the full app ID" + +func WithAppIDOverride(ctx netcontext.Context, appID string) netcontext.Context { + return netcontext.WithValue(ctx, &appIDOverrideKey, appID) +} + +var namespaceKey = "holds the namespace string" + +func withNamespace(ctx netcontext.Context, ns string) netcontext.Context { + return netcontext.WithValue(ctx, &namespaceKey, ns) +} + +func NamespaceFromContext(ctx netcontext.Context) string { + // If there's no namespace, return the empty string. + ns, _ := ctx.Value(&namespaceKey).(string) + return ns +} + +// FullyQualifiedAppID returns the fully-qualified application ID. +// This may contain a partition prefix (e.g. "s~" for High Replication apps), +// or a domain prefix (e.g. "example.com:"). +func FullyQualifiedAppID(ctx netcontext.Context) string { + if id, ok := ctx.Value(&appIDOverrideKey).(string); ok { + return id + } + return fullyQualifiedAppID(ctx) +} + +func Logf(ctx netcontext.Context, level int64, format string, args ...interface{}) { + if f, ok := ctx.Value(&logOverrideKey).(logOverrideFunc); ok { + f(level, format, args...) + return + } + logf(fromContext(ctx), level, format, args...) +} + +// NamespacedContext wraps a Context to support namespaces. +func NamespacedContext(ctx netcontext.Context, namespace string) netcontext.Context { + return withNamespace(ctx, namespace) +} diff --git a/vendor/google.golang.org/appengine/internal/app_id.go b/vendor/google.golang.org/appengine/internal/app_id.go new file mode 100644 index 0000000000..11df8c07b5 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/app_id.go @@ -0,0 +1,28 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package internal + +import ( + "strings" +) + +func parseFullAppID(appid string) (partition, domain, displayID string) { + if i := strings.Index(appid, "~"); i != -1 { + partition, appid = appid[:i], appid[i+1:] + } + if i := strings.Index(appid, ":"); i != -1 { + domain, appid = appid[:i], appid[i+1:] + } + return partition, domain, appid +} + +// appID returns "appid" or "domain.com:appid". +func appID(fullAppID string) string { + _, dom, dis := parseFullAppID(fullAppID) + if dom != "" { + return dom + ":" + dis + } + return dis +} diff --git a/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.pb.go b/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.pb.go new file mode 100644 index 0000000000..87d9701b8d --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.pb.go @@ -0,0 +1,296 @@ +// Code generated by protoc-gen-go. +// source: google.golang.org/appengine/internal/app_identity/app_identity_service.proto +// DO NOT EDIT! + +/* +Package app_identity is a generated protocol buffer package. + +It is generated from these files: + google.golang.org/appengine/internal/app_identity/app_identity_service.proto + +It has these top-level messages: + AppIdentityServiceError + SignForAppRequest + SignForAppResponse + GetPublicCertificateForAppRequest + PublicCertificate + GetPublicCertificateForAppResponse + GetServiceAccountNameRequest + GetServiceAccountNameResponse + GetAccessTokenRequest + GetAccessTokenResponse + GetDefaultGcsBucketNameRequest + GetDefaultGcsBucketNameResponse +*/ +package app_identity + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type AppIdentityServiceError_ErrorCode int32 + +const ( + AppIdentityServiceError_SUCCESS AppIdentityServiceError_ErrorCode = 0 + AppIdentityServiceError_UNKNOWN_SCOPE AppIdentityServiceError_ErrorCode = 9 + AppIdentityServiceError_BLOB_TOO_LARGE AppIdentityServiceError_ErrorCode = 1000 + AppIdentityServiceError_DEADLINE_EXCEEDED AppIdentityServiceError_ErrorCode = 1001 + AppIdentityServiceError_NOT_A_VALID_APP AppIdentityServiceError_ErrorCode = 1002 + AppIdentityServiceError_UNKNOWN_ERROR AppIdentityServiceError_ErrorCode = 1003 + AppIdentityServiceError_NOT_ALLOWED AppIdentityServiceError_ErrorCode = 1005 + AppIdentityServiceError_NOT_IMPLEMENTED AppIdentityServiceError_ErrorCode = 1006 +) + +var AppIdentityServiceError_ErrorCode_name = map[int32]string{ + 0: "SUCCESS", + 9: "UNKNOWN_SCOPE", + 1000: "BLOB_TOO_LARGE", + 1001: "DEADLINE_EXCEEDED", + 1002: "NOT_A_VALID_APP", + 1003: "UNKNOWN_ERROR", + 1005: "NOT_ALLOWED", + 1006: "NOT_IMPLEMENTED", +} +var AppIdentityServiceError_ErrorCode_value = map[string]int32{ + "SUCCESS": 0, + "UNKNOWN_SCOPE": 9, + "BLOB_TOO_LARGE": 1000, + "DEADLINE_EXCEEDED": 1001, + "NOT_A_VALID_APP": 1002, + "UNKNOWN_ERROR": 1003, + "NOT_ALLOWED": 1005, + "NOT_IMPLEMENTED": 1006, +} + +func (x AppIdentityServiceError_ErrorCode) Enum() *AppIdentityServiceError_ErrorCode { + p := new(AppIdentityServiceError_ErrorCode) + *p = x + return p +} +func (x AppIdentityServiceError_ErrorCode) String() string { + return proto.EnumName(AppIdentityServiceError_ErrorCode_name, int32(x)) +} +func (x *AppIdentityServiceError_ErrorCode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(AppIdentityServiceError_ErrorCode_value, data, "AppIdentityServiceError_ErrorCode") + if err != nil { + return err + } + *x = AppIdentityServiceError_ErrorCode(value) + return nil +} + +type AppIdentityServiceError struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *AppIdentityServiceError) Reset() { *m = AppIdentityServiceError{} } +func (m *AppIdentityServiceError) String() string { return proto.CompactTextString(m) } +func (*AppIdentityServiceError) ProtoMessage() {} + +type SignForAppRequest struct { + BytesToSign []byte `protobuf:"bytes,1,opt,name=bytes_to_sign" json:"bytes_to_sign,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SignForAppRequest) Reset() { *m = SignForAppRequest{} } +func (m *SignForAppRequest) String() string { return proto.CompactTextString(m) } +func (*SignForAppRequest) ProtoMessage() {} + +func (m *SignForAppRequest) GetBytesToSign() []byte { + if m != nil { + return m.BytesToSign + } + return nil +} + +type SignForAppResponse struct { + KeyName *string `protobuf:"bytes,1,opt,name=key_name" json:"key_name,omitempty"` + SignatureBytes []byte `protobuf:"bytes,2,opt,name=signature_bytes" json:"signature_bytes,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SignForAppResponse) Reset() { *m = SignForAppResponse{} } +func (m *SignForAppResponse) String() string { return proto.CompactTextString(m) } +func (*SignForAppResponse) ProtoMessage() {} + +func (m *SignForAppResponse) GetKeyName() string { + if m != nil && m.KeyName != nil { + return *m.KeyName + } + return "" +} + +func (m *SignForAppResponse) GetSignatureBytes() []byte { + if m != nil { + return m.SignatureBytes + } + return nil +} + +type GetPublicCertificateForAppRequest struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetPublicCertificateForAppRequest) Reset() { *m = GetPublicCertificateForAppRequest{} } +func (m *GetPublicCertificateForAppRequest) String() string { return proto.CompactTextString(m) } +func (*GetPublicCertificateForAppRequest) ProtoMessage() {} + +type PublicCertificate struct { + KeyName *string `protobuf:"bytes,1,opt,name=key_name" json:"key_name,omitempty"` + X509CertificatePem *string `protobuf:"bytes,2,opt,name=x509_certificate_pem" json:"x509_certificate_pem,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PublicCertificate) Reset() { *m = PublicCertificate{} } +func (m *PublicCertificate) String() string { return proto.CompactTextString(m) } +func (*PublicCertificate) ProtoMessage() {} + +func (m *PublicCertificate) GetKeyName() string { + if m != nil && m.KeyName != nil { + return *m.KeyName + } + return "" +} + +func (m *PublicCertificate) GetX509CertificatePem() string { + if m != nil && m.X509CertificatePem != nil { + return *m.X509CertificatePem + } + return "" +} + +type GetPublicCertificateForAppResponse struct { + PublicCertificateList []*PublicCertificate `protobuf:"bytes,1,rep,name=public_certificate_list" json:"public_certificate_list,omitempty"` + MaxClientCacheTimeInSecond *int64 `protobuf:"varint,2,opt,name=max_client_cache_time_in_second" json:"max_client_cache_time_in_second,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetPublicCertificateForAppResponse) Reset() { *m = GetPublicCertificateForAppResponse{} } +func (m *GetPublicCertificateForAppResponse) String() string { return proto.CompactTextString(m) } +func (*GetPublicCertificateForAppResponse) ProtoMessage() {} + +func (m *GetPublicCertificateForAppResponse) GetPublicCertificateList() []*PublicCertificate { + if m != nil { + return m.PublicCertificateList + } + return nil +} + +func (m *GetPublicCertificateForAppResponse) GetMaxClientCacheTimeInSecond() int64 { + if m != nil && m.MaxClientCacheTimeInSecond != nil { + return *m.MaxClientCacheTimeInSecond + } + return 0 +} + +type GetServiceAccountNameRequest struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetServiceAccountNameRequest) Reset() { *m = GetServiceAccountNameRequest{} } +func (m *GetServiceAccountNameRequest) String() string { return proto.CompactTextString(m) } +func (*GetServiceAccountNameRequest) ProtoMessage() {} + +type GetServiceAccountNameResponse struct { + ServiceAccountName *string `protobuf:"bytes,1,opt,name=service_account_name" json:"service_account_name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetServiceAccountNameResponse) Reset() { *m = GetServiceAccountNameResponse{} } +func (m *GetServiceAccountNameResponse) String() string { return proto.CompactTextString(m) } +func (*GetServiceAccountNameResponse) ProtoMessage() {} + +func (m *GetServiceAccountNameResponse) GetServiceAccountName() string { + if m != nil && m.ServiceAccountName != nil { + return *m.ServiceAccountName + } + return "" +} + +type GetAccessTokenRequest struct { + Scope []string `protobuf:"bytes,1,rep,name=scope" json:"scope,omitempty"` + ServiceAccountId *int64 `protobuf:"varint,2,opt,name=service_account_id" json:"service_account_id,omitempty"` + ServiceAccountName *string `protobuf:"bytes,3,opt,name=service_account_name" json:"service_account_name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetAccessTokenRequest) Reset() { *m = GetAccessTokenRequest{} } +func (m *GetAccessTokenRequest) String() string { return proto.CompactTextString(m) } +func (*GetAccessTokenRequest) ProtoMessage() {} + +func (m *GetAccessTokenRequest) GetScope() []string { + if m != nil { + return m.Scope + } + return nil +} + +func (m *GetAccessTokenRequest) GetServiceAccountId() int64 { + if m != nil && m.ServiceAccountId != nil { + return *m.ServiceAccountId + } + return 0 +} + +func (m *GetAccessTokenRequest) GetServiceAccountName() string { + if m != nil && m.ServiceAccountName != nil { + return *m.ServiceAccountName + } + return "" +} + +type GetAccessTokenResponse struct { + AccessToken *string `protobuf:"bytes,1,opt,name=access_token" json:"access_token,omitempty"` + ExpirationTime *int64 `protobuf:"varint,2,opt,name=expiration_time" json:"expiration_time,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetAccessTokenResponse) Reset() { *m = GetAccessTokenResponse{} } +func (m *GetAccessTokenResponse) String() string { return proto.CompactTextString(m) } +func (*GetAccessTokenResponse) ProtoMessage() {} + +func (m *GetAccessTokenResponse) GetAccessToken() string { + if m != nil && m.AccessToken != nil { + return *m.AccessToken + } + return "" +} + +func (m *GetAccessTokenResponse) GetExpirationTime() int64 { + if m != nil && m.ExpirationTime != nil { + return *m.ExpirationTime + } + return 0 +} + +type GetDefaultGcsBucketNameRequest struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetDefaultGcsBucketNameRequest) Reset() { *m = GetDefaultGcsBucketNameRequest{} } +func (m *GetDefaultGcsBucketNameRequest) String() string { return proto.CompactTextString(m) } +func (*GetDefaultGcsBucketNameRequest) ProtoMessage() {} + +type GetDefaultGcsBucketNameResponse struct { + DefaultGcsBucketName *string `protobuf:"bytes,1,opt,name=default_gcs_bucket_name" json:"default_gcs_bucket_name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetDefaultGcsBucketNameResponse) Reset() { *m = GetDefaultGcsBucketNameResponse{} } +func (m *GetDefaultGcsBucketNameResponse) String() string { return proto.CompactTextString(m) } +func (*GetDefaultGcsBucketNameResponse) ProtoMessage() {} + +func (m *GetDefaultGcsBucketNameResponse) GetDefaultGcsBucketName() string { + if m != nil && m.DefaultGcsBucketName != nil { + return *m.DefaultGcsBucketName + } + return "" +} + +func init() { +} diff --git a/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.proto b/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.proto new file mode 100644 index 0000000000..19610ca5b7 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.proto @@ -0,0 +1,64 @@ +syntax = "proto2"; +option go_package = "app_identity"; + +package appengine; + +message AppIdentityServiceError { + enum ErrorCode { + SUCCESS = 0; + UNKNOWN_SCOPE = 9; + BLOB_TOO_LARGE = 1000; + DEADLINE_EXCEEDED = 1001; + NOT_A_VALID_APP = 1002; + UNKNOWN_ERROR = 1003; + NOT_ALLOWED = 1005; + NOT_IMPLEMENTED = 1006; + } +} + +message SignForAppRequest { + optional bytes bytes_to_sign = 1; +} + +message SignForAppResponse { + optional string key_name = 1; + optional bytes signature_bytes = 2; +} + +message GetPublicCertificateForAppRequest { +} + +message PublicCertificate { + optional string key_name = 1; + optional string x509_certificate_pem = 2; +} + +message GetPublicCertificateForAppResponse { + repeated PublicCertificate public_certificate_list = 1; + optional int64 max_client_cache_time_in_second = 2; +} + +message GetServiceAccountNameRequest { +} + +message GetServiceAccountNameResponse { + optional string service_account_name = 1; +} + +message GetAccessTokenRequest { + repeated string scope = 1; + optional int64 service_account_id = 2; + optional string service_account_name = 3; +} + +message GetAccessTokenResponse { + optional string access_token = 1; + optional int64 expiration_time = 2; +} + +message GetDefaultGcsBucketNameRequest { +} + +message GetDefaultGcsBucketNameResponse { + optional string default_gcs_bucket_name = 1; +} diff --git a/vendor/google.golang.org/appengine/internal/base/api_base.pb.go b/vendor/google.golang.org/appengine/internal/base/api_base.pb.go new file mode 100644 index 0000000000..36a195650a --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/base/api_base.pb.go @@ -0,0 +1,133 @@ +// Code generated by protoc-gen-go. +// source: google.golang.org/appengine/internal/base/api_base.proto +// DO NOT EDIT! + +/* +Package base is a generated protocol buffer package. + +It is generated from these files: + google.golang.org/appengine/internal/base/api_base.proto + +It has these top-level messages: + StringProto + Integer32Proto + Integer64Proto + BoolProto + DoubleProto + BytesProto + VoidProto +*/ +package base + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type StringProto struct { + Value *string `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *StringProto) Reset() { *m = StringProto{} } +func (m *StringProto) String() string { return proto.CompactTextString(m) } +func (*StringProto) ProtoMessage() {} + +func (m *StringProto) GetValue() string { + if m != nil && m.Value != nil { + return *m.Value + } + return "" +} + +type Integer32Proto struct { + Value *int32 `protobuf:"varint,1,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Integer32Proto) Reset() { *m = Integer32Proto{} } +func (m *Integer32Proto) String() string { return proto.CompactTextString(m) } +func (*Integer32Proto) ProtoMessage() {} + +func (m *Integer32Proto) GetValue() int32 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Integer64Proto struct { + Value *int64 `protobuf:"varint,1,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Integer64Proto) Reset() { *m = Integer64Proto{} } +func (m *Integer64Proto) String() string { return proto.CompactTextString(m) } +func (*Integer64Proto) ProtoMessage() {} + +func (m *Integer64Proto) GetValue() int64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type BoolProto struct { + Value *bool `protobuf:"varint,1,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *BoolProto) Reset() { *m = BoolProto{} } +func (m *BoolProto) String() string { return proto.CompactTextString(m) } +func (*BoolProto) ProtoMessage() {} + +func (m *BoolProto) GetValue() bool { + if m != nil && m.Value != nil { + return *m.Value + } + return false +} + +type DoubleProto struct { + Value *float64 `protobuf:"fixed64,1,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DoubleProto) Reset() { *m = DoubleProto{} } +func (m *DoubleProto) String() string { return proto.CompactTextString(m) } +func (*DoubleProto) ProtoMessage() {} + +func (m *DoubleProto) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type BytesProto struct { + Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *BytesProto) Reset() { *m = BytesProto{} } +func (m *BytesProto) String() string { return proto.CompactTextString(m) } +func (*BytesProto) ProtoMessage() {} + +func (m *BytesProto) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +type VoidProto struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *VoidProto) Reset() { *m = VoidProto{} } +func (m *VoidProto) String() string { return proto.CompactTextString(m) } +func (*VoidProto) ProtoMessage() {} diff --git a/vendor/google.golang.org/appengine/internal/base/api_base.proto b/vendor/google.golang.org/appengine/internal/base/api_base.proto new file mode 100644 index 0000000000..56cd7a3cad --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/base/api_base.proto @@ -0,0 +1,33 @@ +// Built-in base types for API calls. Primarily useful as return types. + +syntax = "proto2"; +option go_package = "base"; + +package appengine.base; + +message StringProto { + required string value = 1; +} + +message Integer32Proto { + required int32 value = 1; +} + +message Integer64Proto { + required int64 value = 1; +} + +message BoolProto { + required bool value = 1; +} + +message DoubleProto { + required double value = 1; +} + +message BytesProto { + required bytes value = 1 [ctype=CORD]; +} + +message VoidProto { +} diff --git a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go new file mode 100644 index 0000000000..8613cb7311 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go @@ -0,0 +1,2778 @@ +// Code generated by protoc-gen-go. +// source: google.golang.org/appengine/internal/datastore/datastore_v3.proto +// DO NOT EDIT! + +/* +Package datastore is a generated protocol buffer package. + +It is generated from these files: + google.golang.org/appengine/internal/datastore/datastore_v3.proto + +It has these top-level messages: + Action + PropertyValue + Property + Path + Reference + User + EntityProto + CompositeProperty + Index + CompositeIndex + IndexPostfix + IndexPosition + Snapshot + InternalHeader + Transaction + Query + CompiledQuery + CompiledCursor + Cursor + Error + Cost + GetRequest + GetResponse + PutRequest + PutResponse + TouchRequest + TouchResponse + DeleteRequest + DeleteResponse + NextRequest + QueryResult + AllocateIdsRequest + AllocateIdsResponse + CompositeIndices + AddActionsRequest + AddActionsResponse + BeginTransactionRequest + CommitResponse +*/ +package datastore + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type Property_Meaning int32 + +const ( + Property_NO_MEANING Property_Meaning = 0 + Property_BLOB Property_Meaning = 14 + Property_TEXT Property_Meaning = 15 + Property_BYTESTRING Property_Meaning = 16 + Property_ATOM_CATEGORY Property_Meaning = 1 + Property_ATOM_LINK Property_Meaning = 2 + Property_ATOM_TITLE Property_Meaning = 3 + Property_ATOM_CONTENT Property_Meaning = 4 + Property_ATOM_SUMMARY Property_Meaning = 5 + Property_ATOM_AUTHOR Property_Meaning = 6 + Property_GD_WHEN Property_Meaning = 7 + Property_GD_EMAIL Property_Meaning = 8 + Property_GEORSS_POINT Property_Meaning = 9 + Property_GD_IM Property_Meaning = 10 + Property_GD_PHONENUMBER Property_Meaning = 11 + Property_GD_POSTALADDRESS Property_Meaning = 12 + Property_GD_RATING Property_Meaning = 13 + Property_BLOBKEY Property_Meaning = 17 + Property_ENTITY_PROTO Property_Meaning = 19 + Property_INDEX_VALUE Property_Meaning = 18 +) + +var Property_Meaning_name = map[int32]string{ + 0: "NO_MEANING", + 14: "BLOB", + 15: "TEXT", + 16: "BYTESTRING", + 1: "ATOM_CATEGORY", + 2: "ATOM_LINK", + 3: "ATOM_TITLE", + 4: "ATOM_CONTENT", + 5: "ATOM_SUMMARY", + 6: "ATOM_AUTHOR", + 7: "GD_WHEN", + 8: "GD_EMAIL", + 9: "GEORSS_POINT", + 10: "GD_IM", + 11: "GD_PHONENUMBER", + 12: "GD_POSTALADDRESS", + 13: "GD_RATING", + 17: "BLOBKEY", + 19: "ENTITY_PROTO", + 18: "INDEX_VALUE", +} +var Property_Meaning_value = map[string]int32{ + "NO_MEANING": 0, + "BLOB": 14, + "TEXT": 15, + "BYTESTRING": 16, + "ATOM_CATEGORY": 1, + "ATOM_LINK": 2, + "ATOM_TITLE": 3, + "ATOM_CONTENT": 4, + "ATOM_SUMMARY": 5, + "ATOM_AUTHOR": 6, + "GD_WHEN": 7, + "GD_EMAIL": 8, + "GEORSS_POINT": 9, + "GD_IM": 10, + "GD_PHONENUMBER": 11, + "GD_POSTALADDRESS": 12, + "GD_RATING": 13, + "BLOBKEY": 17, + "ENTITY_PROTO": 19, + "INDEX_VALUE": 18, +} + +func (x Property_Meaning) Enum() *Property_Meaning { + p := new(Property_Meaning) + *p = x + return p +} +func (x Property_Meaning) String() string { + return proto.EnumName(Property_Meaning_name, int32(x)) +} +func (x *Property_Meaning) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Property_Meaning_value, data, "Property_Meaning") + if err != nil { + return err + } + *x = Property_Meaning(value) + return nil +} + +type Property_FtsTokenizationOption int32 + +const ( + Property_HTML Property_FtsTokenizationOption = 1 + Property_ATOM Property_FtsTokenizationOption = 2 +) + +var Property_FtsTokenizationOption_name = map[int32]string{ + 1: "HTML", + 2: "ATOM", +} +var Property_FtsTokenizationOption_value = map[string]int32{ + "HTML": 1, + "ATOM": 2, +} + +func (x Property_FtsTokenizationOption) Enum() *Property_FtsTokenizationOption { + p := new(Property_FtsTokenizationOption) + *p = x + return p +} +func (x Property_FtsTokenizationOption) String() string { + return proto.EnumName(Property_FtsTokenizationOption_name, int32(x)) +} +func (x *Property_FtsTokenizationOption) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Property_FtsTokenizationOption_value, data, "Property_FtsTokenizationOption") + if err != nil { + return err + } + *x = Property_FtsTokenizationOption(value) + return nil +} + +type EntityProto_Kind int32 + +const ( + EntityProto_GD_CONTACT EntityProto_Kind = 1 + EntityProto_GD_EVENT EntityProto_Kind = 2 + EntityProto_GD_MESSAGE EntityProto_Kind = 3 +) + +var EntityProto_Kind_name = map[int32]string{ + 1: "GD_CONTACT", + 2: "GD_EVENT", + 3: "GD_MESSAGE", +} +var EntityProto_Kind_value = map[string]int32{ + "GD_CONTACT": 1, + "GD_EVENT": 2, + "GD_MESSAGE": 3, +} + +func (x EntityProto_Kind) Enum() *EntityProto_Kind { + p := new(EntityProto_Kind) + *p = x + return p +} +func (x EntityProto_Kind) String() string { + return proto.EnumName(EntityProto_Kind_name, int32(x)) +} +func (x *EntityProto_Kind) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(EntityProto_Kind_value, data, "EntityProto_Kind") + if err != nil { + return err + } + *x = EntityProto_Kind(value) + return nil +} + +type Index_Property_Direction int32 + +const ( + Index_Property_ASCENDING Index_Property_Direction = 1 + Index_Property_DESCENDING Index_Property_Direction = 2 +) + +var Index_Property_Direction_name = map[int32]string{ + 1: "ASCENDING", + 2: "DESCENDING", +} +var Index_Property_Direction_value = map[string]int32{ + "ASCENDING": 1, + "DESCENDING": 2, +} + +func (x Index_Property_Direction) Enum() *Index_Property_Direction { + p := new(Index_Property_Direction) + *p = x + return p +} +func (x Index_Property_Direction) String() string { + return proto.EnumName(Index_Property_Direction_name, int32(x)) +} +func (x *Index_Property_Direction) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Index_Property_Direction_value, data, "Index_Property_Direction") + if err != nil { + return err + } + *x = Index_Property_Direction(value) + return nil +} + +type CompositeIndex_State int32 + +const ( + CompositeIndex_WRITE_ONLY CompositeIndex_State = 1 + CompositeIndex_READ_WRITE CompositeIndex_State = 2 + CompositeIndex_DELETED CompositeIndex_State = 3 + CompositeIndex_ERROR CompositeIndex_State = 4 +) + +var CompositeIndex_State_name = map[int32]string{ + 1: "WRITE_ONLY", + 2: "READ_WRITE", + 3: "DELETED", + 4: "ERROR", +} +var CompositeIndex_State_value = map[string]int32{ + "WRITE_ONLY": 1, + "READ_WRITE": 2, + "DELETED": 3, + "ERROR": 4, +} + +func (x CompositeIndex_State) Enum() *CompositeIndex_State { + p := new(CompositeIndex_State) + *p = x + return p +} +func (x CompositeIndex_State) String() string { + return proto.EnumName(CompositeIndex_State_name, int32(x)) +} +func (x *CompositeIndex_State) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(CompositeIndex_State_value, data, "CompositeIndex_State") + if err != nil { + return err + } + *x = CompositeIndex_State(value) + return nil +} + +type Snapshot_Status int32 + +const ( + Snapshot_INACTIVE Snapshot_Status = 0 + Snapshot_ACTIVE Snapshot_Status = 1 +) + +var Snapshot_Status_name = map[int32]string{ + 0: "INACTIVE", + 1: "ACTIVE", +} +var Snapshot_Status_value = map[string]int32{ + "INACTIVE": 0, + "ACTIVE": 1, +} + +func (x Snapshot_Status) Enum() *Snapshot_Status { + p := new(Snapshot_Status) + *p = x + return p +} +func (x Snapshot_Status) String() string { + return proto.EnumName(Snapshot_Status_name, int32(x)) +} +func (x *Snapshot_Status) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Snapshot_Status_value, data, "Snapshot_Status") + if err != nil { + return err + } + *x = Snapshot_Status(value) + return nil +} + +type Query_Hint int32 + +const ( + Query_ORDER_FIRST Query_Hint = 1 + Query_ANCESTOR_FIRST Query_Hint = 2 + Query_FILTER_FIRST Query_Hint = 3 +) + +var Query_Hint_name = map[int32]string{ + 1: "ORDER_FIRST", + 2: "ANCESTOR_FIRST", + 3: "FILTER_FIRST", +} +var Query_Hint_value = map[string]int32{ + "ORDER_FIRST": 1, + "ANCESTOR_FIRST": 2, + "FILTER_FIRST": 3, +} + +func (x Query_Hint) Enum() *Query_Hint { + p := new(Query_Hint) + *p = x + return p +} +func (x Query_Hint) String() string { + return proto.EnumName(Query_Hint_name, int32(x)) +} +func (x *Query_Hint) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Query_Hint_value, data, "Query_Hint") + if err != nil { + return err + } + *x = Query_Hint(value) + return nil +} + +type Query_Filter_Operator int32 + +const ( + Query_Filter_LESS_THAN Query_Filter_Operator = 1 + Query_Filter_LESS_THAN_OR_EQUAL Query_Filter_Operator = 2 + Query_Filter_GREATER_THAN Query_Filter_Operator = 3 + Query_Filter_GREATER_THAN_OR_EQUAL Query_Filter_Operator = 4 + Query_Filter_EQUAL Query_Filter_Operator = 5 + Query_Filter_IN Query_Filter_Operator = 6 + Query_Filter_EXISTS Query_Filter_Operator = 7 +) + +var Query_Filter_Operator_name = map[int32]string{ + 1: "LESS_THAN", + 2: "LESS_THAN_OR_EQUAL", + 3: "GREATER_THAN", + 4: "GREATER_THAN_OR_EQUAL", + 5: "EQUAL", + 6: "IN", + 7: "EXISTS", +} +var Query_Filter_Operator_value = map[string]int32{ + "LESS_THAN": 1, + "LESS_THAN_OR_EQUAL": 2, + "GREATER_THAN": 3, + "GREATER_THAN_OR_EQUAL": 4, + "EQUAL": 5, + "IN": 6, + "EXISTS": 7, +} + +func (x Query_Filter_Operator) Enum() *Query_Filter_Operator { + p := new(Query_Filter_Operator) + *p = x + return p +} +func (x Query_Filter_Operator) String() string { + return proto.EnumName(Query_Filter_Operator_name, int32(x)) +} +func (x *Query_Filter_Operator) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Query_Filter_Operator_value, data, "Query_Filter_Operator") + if err != nil { + return err + } + *x = Query_Filter_Operator(value) + return nil +} + +type Query_Order_Direction int32 + +const ( + Query_Order_ASCENDING Query_Order_Direction = 1 + Query_Order_DESCENDING Query_Order_Direction = 2 +) + +var Query_Order_Direction_name = map[int32]string{ + 1: "ASCENDING", + 2: "DESCENDING", +} +var Query_Order_Direction_value = map[string]int32{ + "ASCENDING": 1, + "DESCENDING": 2, +} + +func (x Query_Order_Direction) Enum() *Query_Order_Direction { + p := new(Query_Order_Direction) + *p = x + return p +} +func (x Query_Order_Direction) String() string { + return proto.EnumName(Query_Order_Direction_name, int32(x)) +} +func (x *Query_Order_Direction) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Query_Order_Direction_value, data, "Query_Order_Direction") + if err != nil { + return err + } + *x = Query_Order_Direction(value) + return nil +} + +type Error_ErrorCode int32 + +const ( + Error_BAD_REQUEST Error_ErrorCode = 1 + Error_CONCURRENT_TRANSACTION Error_ErrorCode = 2 + Error_INTERNAL_ERROR Error_ErrorCode = 3 + Error_NEED_INDEX Error_ErrorCode = 4 + Error_TIMEOUT Error_ErrorCode = 5 + Error_PERMISSION_DENIED Error_ErrorCode = 6 + Error_BIGTABLE_ERROR Error_ErrorCode = 7 + Error_COMMITTED_BUT_STILL_APPLYING Error_ErrorCode = 8 + Error_CAPABILITY_DISABLED Error_ErrorCode = 9 + Error_TRY_ALTERNATE_BACKEND Error_ErrorCode = 10 + Error_SAFE_TIME_TOO_OLD Error_ErrorCode = 11 +) + +var Error_ErrorCode_name = map[int32]string{ + 1: "BAD_REQUEST", + 2: "CONCURRENT_TRANSACTION", + 3: "INTERNAL_ERROR", + 4: "NEED_INDEX", + 5: "TIMEOUT", + 6: "PERMISSION_DENIED", + 7: "BIGTABLE_ERROR", + 8: "COMMITTED_BUT_STILL_APPLYING", + 9: "CAPABILITY_DISABLED", + 10: "TRY_ALTERNATE_BACKEND", + 11: "SAFE_TIME_TOO_OLD", +} +var Error_ErrorCode_value = map[string]int32{ + "BAD_REQUEST": 1, + "CONCURRENT_TRANSACTION": 2, + "INTERNAL_ERROR": 3, + "NEED_INDEX": 4, + "TIMEOUT": 5, + "PERMISSION_DENIED": 6, + "BIGTABLE_ERROR": 7, + "COMMITTED_BUT_STILL_APPLYING": 8, + "CAPABILITY_DISABLED": 9, + "TRY_ALTERNATE_BACKEND": 10, + "SAFE_TIME_TOO_OLD": 11, +} + +func (x Error_ErrorCode) Enum() *Error_ErrorCode { + p := new(Error_ErrorCode) + *p = x + return p +} +func (x Error_ErrorCode) String() string { + return proto.EnumName(Error_ErrorCode_name, int32(x)) +} +func (x *Error_ErrorCode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Error_ErrorCode_value, data, "Error_ErrorCode") + if err != nil { + return err + } + *x = Error_ErrorCode(value) + return nil +} + +type PutRequest_AutoIdPolicy int32 + +const ( + PutRequest_CURRENT PutRequest_AutoIdPolicy = 0 + PutRequest_SEQUENTIAL PutRequest_AutoIdPolicy = 1 +) + +var PutRequest_AutoIdPolicy_name = map[int32]string{ + 0: "CURRENT", + 1: "SEQUENTIAL", +} +var PutRequest_AutoIdPolicy_value = map[string]int32{ + "CURRENT": 0, + "SEQUENTIAL": 1, +} + +func (x PutRequest_AutoIdPolicy) Enum() *PutRequest_AutoIdPolicy { + p := new(PutRequest_AutoIdPolicy) + *p = x + return p +} +func (x PutRequest_AutoIdPolicy) String() string { + return proto.EnumName(PutRequest_AutoIdPolicy_name, int32(x)) +} +func (x *PutRequest_AutoIdPolicy) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(PutRequest_AutoIdPolicy_value, data, "PutRequest_AutoIdPolicy") + if err != nil { + return err + } + *x = PutRequest_AutoIdPolicy(value) + return nil +} + +type Action struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *Action) Reset() { *m = Action{} } +func (m *Action) String() string { return proto.CompactTextString(m) } +func (*Action) ProtoMessage() {} + +type PropertyValue struct { + Int64Value *int64 `protobuf:"varint,1,opt,name=int64Value" json:"int64Value,omitempty"` + BooleanValue *bool `protobuf:"varint,2,opt,name=booleanValue" json:"booleanValue,omitempty"` + StringValue *string `protobuf:"bytes,3,opt,name=stringValue" json:"stringValue,omitempty"` + DoubleValue *float64 `protobuf:"fixed64,4,opt,name=doubleValue" json:"doubleValue,omitempty"` + Pointvalue *PropertyValue_PointValue `protobuf:"group,5,opt,name=PointValue" json:"pointvalue,omitempty"` + Uservalue *PropertyValue_UserValue `protobuf:"group,8,opt,name=UserValue" json:"uservalue,omitempty"` + Referencevalue *PropertyValue_ReferenceValue `protobuf:"group,12,opt,name=ReferenceValue" json:"referencevalue,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PropertyValue) Reset() { *m = PropertyValue{} } +func (m *PropertyValue) String() string { return proto.CompactTextString(m) } +func (*PropertyValue) ProtoMessage() {} + +func (m *PropertyValue) GetInt64Value() int64 { + if m != nil && m.Int64Value != nil { + return *m.Int64Value + } + return 0 +} + +func (m *PropertyValue) GetBooleanValue() bool { + if m != nil && m.BooleanValue != nil { + return *m.BooleanValue + } + return false +} + +func (m *PropertyValue) GetStringValue() string { + if m != nil && m.StringValue != nil { + return *m.StringValue + } + return "" +} + +func (m *PropertyValue) GetDoubleValue() float64 { + if m != nil && m.DoubleValue != nil { + return *m.DoubleValue + } + return 0 +} + +func (m *PropertyValue) GetPointvalue() *PropertyValue_PointValue { + if m != nil { + return m.Pointvalue + } + return nil +} + +func (m *PropertyValue) GetUservalue() *PropertyValue_UserValue { + if m != nil { + return m.Uservalue + } + return nil +} + +func (m *PropertyValue) GetReferencevalue() *PropertyValue_ReferenceValue { + if m != nil { + return m.Referencevalue + } + return nil +} + +type PropertyValue_PointValue struct { + X *float64 `protobuf:"fixed64,6,req,name=x" json:"x,omitempty"` + Y *float64 `protobuf:"fixed64,7,req,name=y" json:"y,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PropertyValue_PointValue) Reset() { *m = PropertyValue_PointValue{} } +func (m *PropertyValue_PointValue) String() string { return proto.CompactTextString(m) } +func (*PropertyValue_PointValue) ProtoMessage() {} + +func (m *PropertyValue_PointValue) GetX() float64 { + if m != nil && m.X != nil { + return *m.X + } + return 0 +} + +func (m *PropertyValue_PointValue) GetY() float64 { + if m != nil && m.Y != nil { + return *m.Y + } + return 0 +} + +type PropertyValue_UserValue struct { + Email *string `protobuf:"bytes,9,req,name=email" json:"email,omitempty"` + AuthDomain *string `protobuf:"bytes,10,req,name=auth_domain" json:"auth_domain,omitempty"` + Nickname *string `protobuf:"bytes,11,opt,name=nickname" json:"nickname,omitempty"` + FederatedIdentity *string `protobuf:"bytes,21,opt,name=federated_identity" json:"federated_identity,omitempty"` + FederatedProvider *string `protobuf:"bytes,22,opt,name=federated_provider" json:"federated_provider,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PropertyValue_UserValue) Reset() { *m = PropertyValue_UserValue{} } +func (m *PropertyValue_UserValue) String() string { return proto.CompactTextString(m) } +func (*PropertyValue_UserValue) ProtoMessage() {} + +func (m *PropertyValue_UserValue) GetEmail() string { + if m != nil && m.Email != nil { + return *m.Email + } + return "" +} + +func (m *PropertyValue_UserValue) GetAuthDomain() string { + if m != nil && m.AuthDomain != nil { + return *m.AuthDomain + } + return "" +} + +func (m *PropertyValue_UserValue) GetNickname() string { + if m != nil && m.Nickname != nil { + return *m.Nickname + } + return "" +} + +func (m *PropertyValue_UserValue) GetFederatedIdentity() string { + if m != nil && m.FederatedIdentity != nil { + return *m.FederatedIdentity + } + return "" +} + +func (m *PropertyValue_UserValue) GetFederatedProvider() string { + if m != nil && m.FederatedProvider != nil { + return *m.FederatedProvider + } + return "" +} + +type PropertyValue_ReferenceValue struct { + App *string `protobuf:"bytes,13,req,name=app" json:"app,omitempty"` + NameSpace *string `protobuf:"bytes,20,opt,name=name_space" json:"name_space,omitempty"` + Pathelement []*PropertyValue_ReferenceValue_PathElement `protobuf:"group,14,rep,name=PathElement" json:"pathelement,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PropertyValue_ReferenceValue) Reset() { *m = PropertyValue_ReferenceValue{} } +func (m *PropertyValue_ReferenceValue) String() string { return proto.CompactTextString(m) } +func (*PropertyValue_ReferenceValue) ProtoMessage() {} + +func (m *PropertyValue_ReferenceValue) GetApp() string { + if m != nil && m.App != nil { + return *m.App + } + return "" +} + +func (m *PropertyValue_ReferenceValue) GetNameSpace() string { + if m != nil && m.NameSpace != nil { + return *m.NameSpace + } + return "" +} + +func (m *PropertyValue_ReferenceValue) GetPathelement() []*PropertyValue_ReferenceValue_PathElement { + if m != nil { + return m.Pathelement + } + return nil +} + +type PropertyValue_ReferenceValue_PathElement struct { + Type *string `protobuf:"bytes,15,req,name=type" json:"type,omitempty"` + Id *int64 `protobuf:"varint,16,opt,name=id" json:"id,omitempty"` + Name *string `protobuf:"bytes,17,opt,name=name" json:"name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PropertyValue_ReferenceValue_PathElement) Reset() { + *m = PropertyValue_ReferenceValue_PathElement{} +} +func (m *PropertyValue_ReferenceValue_PathElement) String() string { return proto.CompactTextString(m) } +func (*PropertyValue_ReferenceValue_PathElement) ProtoMessage() {} + +func (m *PropertyValue_ReferenceValue_PathElement) GetType() string { + if m != nil && m.Type != nil { + return *m.Type + } + return "" +} + +func (m *PropertyValue_ReferenceValue_PathElement) GetId() int64 { + if m != nil && m.Id != nil { + return *m.Id + } + return 0 +} + +func (m *PropertyValue_ReferenceValue_PathElement) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +type Property struct { + Meaning *Property_Meaning `protobuf:"varint,1,opt,name=meaning,enum=appengine.Property_Meaning,def=0" json:"meaning,omitempty"` + MeaningUri *string `protobuf:"bytes,2,opt,name=meaning_uri" json:"meaning_uri,omitempty"` + Name *string `protobuf:"bytes,3,req,name=name" json:"name,omitempty"` + Value *PropertyValue `protobuf:"bytes,5,req,name=value" json:"value,omitempty"` + Multiple *bool `protobuf:"varint,4,req,name=multiple" json:"multiple,omitempty"` + Searchable *bool `protobuf:"varint,6,opt,name=searchable,def=0" json:"searchable,omitempty"` + FtsTokenizationOption *Property_FtsTokenizationOption `protobuf:"varint,8,opt,name=fts_tokenization_option,enum=appengine.Property_FtsTokenizationOption" json:"fts_tokenization_option,omitempty"` + Locale *string `protobuf:"bytes,9,opt,name=locale,def=en" json:"locale,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Property) Reset() { *m = Property{} } +func (m *Property) String() string { return proto.CompactTextString(m) } +func (*Property) ProtoMessage() {} + +const Default_Property_Meaning Property_Meaning = Property_NO_MEANING +const Default_Property_Searchable bool = false +const Default_Property_Locale string = "en" + +func (m *Property) GetMeaning() Property_Meaning { + if m != nil && m.Meaning != nil { + return *m.Meaning + } + return Default_Property_Meaning +} + +func (m *Property) GetMeaningUri() string { + if m != nil && m.MeaningUri != nil { + return *m.MeaningUri + } + return "" +} + +func (m *Property) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *Property) GetValue() *PropertyValue { + if m != nil { + return m.Value + } + return nil +} + +func (m *Property) GetMultiple() bool { + if m != nil && m.Multiple != nil { + return *m.Multiple + } + return false +} + +func (m *Property) GetSearchable() bool { + if m != nil && m.Searchable != nil { + return *m.Searchable + } + return Default_Property_Searchable +} + +func (m *Property) GetFtsTokenizationOption() Property_FtsTokenizationOption { + if m != nil && m.FtsTokenizationOption != nil { + return *m.FtsTokenizationOption + } + return Property_HTML +} + +func (m *Property) GetLocale() string { + if m != nil && m.Locale != nil { + return *m.Locale + } + return Default_Property_Locale +} + +type Path struct { + Element []*Path_Element `protobuf:"group,1,rep,name=Element" json:"element,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Path) Reset() { *m = Path{} } +func (m *Path) String() string { return proto.CompactTextString(m) } +func (*Path) ProtoMessage() {} + +func (m *Path) GetElement() []*Path_Element { + if m != nil { + return m.Element + } + return nil +} + +type Path_Element struct { + Type *string `protobuf:"bytes,2,req,name=type" json:"type,omitempty"` + Id *int64 `protobuf:"varint,3,opt,name=id" json:"id,omitempty"` + Name *string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Path_Element) Reset() { *m = Path_Element{} } +func (m *Path_Element) String() string { return proto.CompactTextString(m) } +func (*Path_Element) ProtoMessage() {} + +func (m *Path_Element) GetType() string { + if m != nil && m.Type != nil { + return *m.Type + } + return "" +} + +func (m *Path_Element) GetId() int64 { + if m != nil && m.Id != nil { + return *m.Id + } + return 0 +} + +func (m *Path_Element) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +type Reference struct { + App *string `protobuf:"bytes,13,req,name=app" json:"app,omitempty"` + NameSpace *string `protobuf:"bytes,20,opt,name=name_space" json:"name_space,omitempty"` + Path *Path `protobuf:"bytes,14,req,name=path" json:"path,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Reference) Reset() { *m = Reference{} } +func (m *Reference) String() string { return proto.CompactTextString(m) } +func (*Reference) ProtoMessage() {} + +func (m *Reference) GetApp() string { + if m != nil && m.App != nil { + return *m.App + } + return "" +} + +func (m *Reference) GetNameSpace() string { + if m != nil && m.NameSpace != nil { + return *m.NameSpace + } + return "" +} + +func (m *Reference) GetPath() *Path { + if m != nil { + return m.Path + } + return nil +} + +type User struct { + Email *string `protobuf:"bytes,1,req,name=email" json:"email,omitempty"` + AuthDomain *string `protobuf:"bytes,2,req,name=auth_domain" json:"auth_domain,omitempty"` + Nickname *string `protobuf:"bytes,3,opt,name=nickname" json:"nickname,omitempty"` + FederatedIdentity *string `protobuf:"bytes,6,opt,name=federated_identity" json:"federated_identity,omitempty"` + FederatedProvider *string `protobuf:"bytes,7,opt,name=federated_provider" json:"federated_provider,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *User) Reset() { *m = User{} } +func (m *User) String() string { return proto.CompactTextString(m) } +func (*User) ProtoMessage() {} + +func (m *User) GetEmail() string { + if m != nil && m.Email != nil { + return *m.Email + } + return "" +} + +func (m *User) GetAuthDomain() string { + if m != nil && m.AuthDomain != nil { + return *m.AuthDomain + } + return "" +} + +func (m *User) GetNickname() string { + if m != nil && m.Nickname != nil { + return *m.Nickname + } + return "" +} + +func (m *User) GetFederatedIdentity() string { + if m != nil && m.FederatedIdentity != nil { + return *m.FederatedIdentity + } + return "" +} + +func (m *User) GetFederatedProvider() string { + if m != nil && m.FederatedProvider != nil { + return *m.FederatedProvider + } + return "" +} + +type EntityProto struct { + Key *Reference `protobuf:"bytes,13,req,name=key" json:"key,omitempty"` + EntityGroup *Path `protobuf:"bytes,16,req,name=entity_group" json:"entity_group,omitempty"` + Owner *User `protobuf:"bytes,17,opt,name=owner" json:"owner,omitempty"` + Kind *EntityProto_Kind `protobuf:"varint,4,opt,name=kind,enum=appengine.EntityProto_Kind" json:"kind,omitempty"` + KindUri *string `protobuf:"bytes,5,opt,name=kind_uri" json:"kind_uri,omitempty"` + Property []*Property `protobuf:"bytes,14,rep,name=property" json:"property,omitempty"` + RawProperty []*Property `protobuf:"bytes,15,rep,name=raw_property" json:"raw_property,omitempty"` + Rank *int32 `protobuf:"varint,18,opt,name=rank" json:"rank,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EntityProto) Reset() { *m = EntityProto{} } +func (m *EntityProto) String() string { return proto.CompactTextString(m) } +func (*EntityProto) ProtoMessage() {} + +func (m *EntityProto) GetKey() *Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *EntityProto) GetEntityGroup() *Path { + if m != nil { + return m.EntityGroup + } + return nil +} + +func (m *EntityProto) GetOwner() *User { + if m != nil { + return m.Owner + } + return nil +} + +func (m *EntityProto) GetKind() EntityProto_Kind { + if m != nil && m.Kind != nil { + return *m.Kind + } + return EntityProto_GD_CONTACT +} + +func (m *EntityProto) GetKindUri() string { + if m != nil && m.KindUri != nil { + return *m.KindUri + } + return "" +} + +func (m *EntityProto) GetProperty() []*Property { + if m != nil { + return m.Property + } + return nil +} + +func (m *EntityProto) GetRawProperty() []*Property { + if m != nil { + return m.RawProperty + } + return nil +} + +func (m *EntityProto) GetRank() int32 { + if m != nil && m.Rank != nil { + return *m.Rank + } + return 0 +} + +type CompositeProperty struct { + IndexId *int64 `protobuf:"varint,1,req,name=index_id" json:"index_id,omitempty"` + Value []string `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompositeProperty) Reset() { *m = CompositeProperty{} } +func (m *CompositeProperty) String() string { return proto.CompactTextString(m) } +func (*CompositeProperty) ProtoMessage() {} + +func (m *CompositeProperty) GetIndexId() int64 { + if m != nil && m.IndexId != nil { + return *m.IndexId + } + return 0 +} + +func (m *CompositeProperty) GetValue() []string { + if m != nil { + return m.Value + } + return nil +} + +type Index struct { + EntityType *string `protobuf:"bytes,1,req,name=entity_type" json:"entity_type,omitempty"` + Ancestor *bool `protobuf:"varint,5,req,name=ancestor" json:"ancestor,omitempty"` + Property []*Index_Property `protobuf:"group,2,rep,name=Property" json:"property,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Index) Reset() { *m = Index{} } +func (m *Index) String() string { return proto.CompactTextString(m) } +func (*Index) ProtoMessage() {} + +func (m *Index) GetEntityType() string { + if m != nil && m.EntityType != nil { + return *m.EntityType + } + return "" +} + +func (m *Index) GetAncestor() bool { + if m != nil && m.Ancestor != nil { + return *m.Ancestor + } + return false +} + +func (m *Index) GetProperty() []*Index_Property { + if m != nil { + return m.Property + } + return nil +} + +type Index_Property struct { + Name *string `protobuf:"bytes,3,req,name=name" json:"name,omitempty"` + Direction *Index_Property_Direction `protobuf:"varint,4,opt,name=direction,enum=appengine.Index_Property_Direction,def=1" json:"direction,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Index_Property) Reset() { *m = Index_Property{} } +func (m *Index_Property) String() string { return proto.CompactTextString(m) } +func (*Index_Property) ProtoMessage() {} + +const Default_Index_Property_Direction Index_Property_Direction = Index_Property_ASCENDING + +func (m *Index_Property) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *Index_Property) GetDirection() Index_Property_Direction { + if m != nil && m.Direction != nil { + return *m.Direction + } + return Default_Index_Property_Direction +} + +type CompositeIndex struct { + AppId *string `protobuf:"bytes,1,req,name=app_id" json:"app_id,omitempty"` + Id *int64 `protobuf:"varint,2,req,name=id" json:"id,omitempty"` + Definition *Index `protobuf:"bytes,3,req,name=definition" json:"definition,omitempty"` + State *CompositeIndex_State `protobuf:"varint,4,req,name=state,enum=appengine.CompositeIndex_State" json:"state,omitempty"` + OnlyUseIfRequired *bool `protobuf:"varint,6,opt,name=only_use_if_required,def=0" json:"only_use_if_required,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompositeIndex) Reset() { *m = CompositeIndex{} } +func (m *CompositeIndex) String() string { return proto.CompactTextString(m) } +func (*CompositeIndex) ProtoMessage() {} + +const Default_CompositeIndex_OnlyUseIfRequired bool = false + +func (m *CompositeIndex) GetAppId() string { + if m != nil && m.AppId != nil { + return *m.AppId + } + return "" +} + +func (m *CompositeIndex) GetId() int64 { + if m != nil && m.Id != nil { + return *m.Id + } + return 0 +} + +func (m *CompositeIndex) GetDefinition() *Index { + if m != nil { + return m.Definition + } + return nil +} + +func (m *CompositeIndex) GetState() CompositeIndex_State { + if m != nil && m.State != nil { + return *m.State + } + return CompositeIndex_WRITE_ONLY +} + +func (m *CompositeIndex) GetOnlyUseIfRequired() bool { + if m != nil && m.OnlyUseIfRequired != nil { + return *m.OnlyUseIfRequired + } + return Default_CompositeIndex_OnlyUseIfRequired +} + +type IndexPostfix struct { + IndexValue []*IndexPostfix_IndexValue `protobuf:"bytes,1,rep,name=index_value" json:"index_value,omitempty"` + Key *Reference `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` + Before *bool `protobuf:"varint,3,opt,name=before,def=1" json:"before,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *IndexPostfix) Reset() { *m = IndexPostfix{} } +func (m *IndexPostfix) String() string { return proto.CompactTextString(m) } +func (*IndexPostfix) ProtoMessage() {} + +const Default_IndexPostfix_Before bool = true + +func (m *IndexPostfix) GetIndexValue() []*IndexPostfix_IndexValue { + if m != nil { + return m.IndexValue + } + return nil +} + +func (m *IndexPostfix) GetKey() *Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *IndexPostfix) GetBefore() bool { + if m != nil && m.Before != nil { + return *m.Before + } + return Default_IndexPostfix_Before +} + +type IndexPostfix_IndexValue struct { + PropertyName *string `protobuf:"bytes,1,req,name=property_name" json:"property_name,omitempty"` + Value *PropertyValue `protobuf:"bytes,2,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *IndexPostfix_IndexValue) Reset() { *m = IndexPostfix_IndexValue{} } +func (m *IndexPostfix_IndexValue) String() string { return proto.CompactTextString(m) } +func (*IndexPostfix_IndexValue) ProtoMessage() {} + +func (m *IndexPostfix_IndexValue) GetPropertyName() string { + if m != nil && m.PropertyName != nil { + return *m.PropertyName + } + return "" +} + +func (m *IndexPostfix_IndexValue) GetValue() *PropertyValue { + if m != nil { + return m.Value + } + return nil +} + +type IndexPosition struct { + Key *string `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` + Before *bool `protobuf:"varint,2,opt,name=before,def=1" json:"before,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *IndexPosition) Reset() { *m = IndexPosition{} } +func (m *IndexPosition) String() string { return proto.CompactTextString(m) } +func (*IndexPosition) ProtoMessage() {} + +const Default_IndexPosition_Before bool = true + +func (m *IndexPosition) GetKey() string { + if m != nil && m.Key != nil { + return *m.Key + } + return "" +} + +func (m *IndexPosition) GetBefore() bool { + if m != nil && m.Before != nil { + return *m.Before + } + return Default_IndexPosition_Before +} + +type Snapshot struct { + Ts *int64 `protobuf:"varint,1,req,name=ts" json:"ts,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Snapshot) Reset() { *m = Snapshot{} } +func (m *Snapshot) String() string { return proto.CompactTextString(m) } +func (*Snapshot) ProtoMessage() {} + +func (m *Snapshot) GetTs() int64 { + if m != nil && m.Ts != nil { + return *m.Ts + } + return 0 +} + +type InternalHeader struct { + Qos *string `protobuf:"bytes,1,opt,name=qos" json:"qos,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *InternalHeader) Reset() { *m = InternalHeader{} } +func (m *InternalHeader) String() string { return proto.CompactTextString(m) } +func (*InternalHeader) ProtoMessage() {} + +func (m *InternalHeader) GetQos() string { + if m != nil && m.Qos != nil { + return *m.Qos + } + return "" +} + +type Transaction struct { + Header *InternalHeader `protobuf:"bytes,4,opt,name=header" json:"header,omitempty"` + Handle *uint64 `protobuf:"fixed64,1,req,name=handle" json:"handle,omitempty"` + App *string `protobuf:"bytes,2,req,name=app" json:"app,omitempty"` + MarkChanges *bool `protobuf:"varint,3,opt,name=mark_changes,def=0" json:"mark_changes,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Transaction) Reset() { *m = Transaction{} } +func (m *Transaction) String() string { return proto.CompactTextString(m) } +func (*Transaction) ProtoMessage() {} + +const Default_Transaction_MarkChanges bool = false + +func (m *Transaction) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *Transaction) GetHandle() uint64 { + if m != nil && m.Handle != nil { + return *m.Handle + } + return 0 +} + +func (m *Transaction) GetApp() string { + if m != nil && m.App != nil { + return *m.App + } + return "" +} + +func (m *Transaction) GetMarkChanges() bool { + if m != nil && m.MarkChanges != nil { + return *m.MarkChanges + } + return Default_Transaction_MarkChanges +} + +type Query struct { + Header *InternalHeader `protobuf:"bytes,39,opt,name=header" json:"header,omitempty"` + App *string `protobuf:"bytes,1,req,name=app" json:"app,omitempty"` + NameSpace *string `protobuf:"bytes,29,opt,name=name_space" json:"name_space,omitempty"` + Kind *string `protobuf:"bytes,3,opt,name=kind" json:"kind,omitempty"` + Ancestor *Reference `protobuf:"bytes,17,opt,name=ancestor" json:"ancestor,omitempty"` + Filter []*Query_Filter `protobuf:"group,4,rep,name=Filter" json:"filter,omitempty"` + SearchQuery *string `protobuf:"bytes,8,opt,name=search_query" json:"search_query,omitempty"` + Order []*Query_Order `protobuf:"group,9,rep,name=Order" json:"order,omitempty"` + Hint *Query_Hint `protobuf:"varint,18,opt,name=hint,enum=appengine.Query_Hint" json:"hint,omitempty"` + Count *int32 `protobuf:"varint,23,opt,name=count" json:"count,omitempty"` + Offset *int32 `protobuf:"varint,12,opt,name=offset,def=0" json:"offset,omitempty"` + Limit *int32 `protobuf:"varint,16,opt,name=limit" json:"limit,omitempty"` + CompiledCursor *CompiledCursor `protobuf:"bytes,30,opt,name=compiled_cursor" json:"compiled_cursor,omitempty"` + EndCompiledCursor *CompiledCursor `protobuf:"bytes,31,opt,name=end_compiled_cursor" json:"end_compiled_cursor,omitempty"` + CompositeIndex []*CompositeIndex `protobuf:"bytes,19,rep,name=composite_index" json:"composite_index,omitempty"` + RequirePerfectPlan *bool `protobuf:"varint,20,opt,name=require_perfect_plan,def=0" json:"require_perfect_plan,omitempty"` + KeysOnly *bool `protobuf:"varint,21,opt,name=keys_only,def=0" json:"keys_only,omitempty"` + Transaction *Transaction `protobuf:"bytes,22,opt,name=transaction" json:"transaction,omitempty"` + Compile *bool `protobuf:"varint,25,opt,name=compile,def=0" json:"compile,omitempty"` + FailoverMs *int64 `protobuf:"varint,26,opt,name=failover_ms" json:"failover_ms,omitempty"` + Strong *bool `protobuf:"varint,32,opt,name=strong" json:"strong,omitempty"` + PropertyName []string `protobuf:"bytes,33,rep,name=property_name" json:"property_name,omitempty"` + GroupByPropertyName []string `protobuf:"bytes,34,rep,name=group_by_property_name" json:"group_by_property_name,omitempty"` + Distinct *bool `protobuf:"varint,24,opt,name=distinct" json:"distinct,omitempty"` + MinSafeTimeSeconds *int64 `protobuf:"varint,35,opt,name=min_safe_time_seconds" json:"min_safe_time_seconds,omitempty"` + SafeReplicaName []string `protobuf:"bytes,36,rep,name=safe_replica_name" json:"safe_replica_name,omitempty"` + PersistOffset *bool `protobuf:"varint,37,opt,name=persist_offset,def=0" json:"persist_offset,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Query) Reset() { *m = Query{} } +func (m *Query) String() string { return proto.CompactTextString(m) } +func (*Query) ProtoMessage() {} + +const Default_Query_Offset int32 = 0 +const Default_Query_RequirePerfectPlan bool = false +const Default_Query_KeysOnly bool = false +const Default_Query_Compile bool = false +const Default_Query_PersistOffset bool = false + +func (m *Query) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *Query) GetApp() string { + if m != nil && m.App != nil { + return *m.App + } + return "" +} + +func (m *Query) GetNameSpace() string { + if m != nil && m.NameSpace != nil { + return *m.NameSpace + } + return "" +} + +func (m *Query) GetKind() string { + if m != nil && m.Kind != nil { + return *m.Kind + } + return "" +} + +func (m *Query) GetAncestor() *Reference { + if m != nil { + return m.Ancestor + } + return nil +} + +func (m *Query) GetFilter() []*Query_Filter { + if m != nil { + return m.Filter + } + return nil +} + +func (m *Query) GetSearchQuery() string { + if m != nil && m.SearchQuery != nil { + return *m.SearchQuery + } + return "" +} + +func (m *Query) GetOrder() []*Query_Order { + if m != nil { + return m.Order + } + return nil +} + +func (m *Query) GetHint() Query_Hint { + if m != nil && m.Hint != nil { + return *m.Hint + } + return Query_ORDER_FIRST +} + +func (m *Query) GetCount() int32 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +func (m *Query) GetOffset() int32 { + if m != nil && m.Offset != nil { + return *m.Offset + } + return Default_Query_Offset +} + +func (m *Query) GetLimit() int32 { + if m != nil && m.Limit != nil { + return *m.Limit + } + return 0 +} + +func (m *Query) GetCompiledCursor() *CompiledCursor { + if m != nil { + return m.CompiledCursor + } + return nil +} + +func (m *Query) GetEndCompiledCursor() *CompiledCursor { + if m != nil { + return m.EndCompiledCursor + } + return nil +} + +func (m *Query) GetCompositeIndex() []*CompositeIndex { + if m != nil { + return m.CompositeIndex + } + return nil +} + +func (m *Query) GetRequirePerfectPlan() bool { + if m != nil && m.RequirePerfectPlan != nil { + return *m.RequirePerfectPlan + } + return Default_Query_RequirePerfectPlan +} + +func (m *Query) GetKeysOnly() bool { + if m != nil && m.KeysOnly != nil { + return *m.KeysOnly + } + return Default_Query_KeysOnly +} + +func (m *Query) GetTransaction() *Transaction { + if m != nil { + return m.Transaction + } + return nil +} + +func (m *Query) GetCompile() bool { + if m != nil && m.Compile != nil { + return *m.Compile + } + return Default_Query_Compile +} + +func (m *Query) GetFailoverMs() int64 { + if m != nil && m.FailoverMs != nil { + return *m.FailoverMs + } + return 0 +} + +func (m *Query) GetStrong() bool { + if m != nil && m.Strong != nil { + return *m.Strong + } + return false +} + +func (m *Query) GetPropertyName() []string { + if m != nil { + return m.PropertyName + } + return nil +} + +func (m *Query) GetGroupByPropertyName() []string { + if m != nil { + return m.GroupByPropertyName + } + return nil +} + +func (m *Query) GetDistinct() bool { + if m != nil && m.Distinct != nil { + return *m.Distinct + } + return false +} + +func (m *Query) GetMinSafeTimeSeconds() int64 { + if m != nil && m.MinSafeTimeSeconds != nil { + return *m.MinSafeTimeSeconds + } + return 0 +} + +func (m *Query) GetSafeReplicaName() []string { + if m != nil { + return m.SafeReplicaName + } + return nil +} + +func (m *Query) GetPersistOffset() bool { + if m != nil && m.PersistOffset != nil { + return *m.PersistOffset + } + return Default_Query_PersistOffset +} + +type Query_Filter struct { + Op *Query_Filter_Operator `protobuf:"varint,6,req,name=op,enum=appengine.Query_Filter_Operator" json:"op,omitempty"` + Property []*Property `protobuf:"bytes,14,rep,name=property" json:"property,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Query_Filter) Reset() { *m = Query_Filter{} } +func (m *Query_Filter) String() string { return proto.CompactTextString(m) } +func (*Query_Filter) ProtoMessage() {} + +func (m *Query_Filter) GetOp() Query_Filter_Operator { + if m != nil && m.Op != nil { + return *m.Op + } + return Query_Filter_LESS_THAN +} + +func (m *Query_Filter) GetProperty() []*Property { + if m != nil { + return m.Property + } + return nil +} + +type Query_Order struct { + Property *string `protobuf:"bytes,10,req,name=property" json:"property,omitempty"` + Direction *Query_Order_Direction `protobuf:"varint,11,opt,name=direction,enum=appengine.Query_Order_Direction,def=1" json:"direction,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Query_Order) Reset() { *m = Query_Order{} } +func (m *Query_Order) String() string { return proto.CompactTextString(m) } +func (*Query_Order) ProtoMessage() {} + +const Default_Query_Order_Direction Query_Order_Direction = Query_Order_ASCENDING + +func (m *Query_Order) GetProperty() string { + if m != nil && m.Property != nil { + return *m.Property + } + return "" +} + +func (m *Query_Order) GetDirection() Query_Order_Direction { + if m != nil && m.Direction != nil { + return *m.Direction + } + return Default_Query_Order_Direction +} + +type CompiledQuery struct { + Primaryscan *CompiledQuery_PrimaryScan `protobuf:"group,1,req,name=PrimaryScan" json:"primaryscan,omitempty"` + Mergejoinscan []*CompiledQuery_MergeJoinScan `protobuf:"group,7,rep,name=MergeJoinScan" json:"mergejoinscan,omitempty"` + IndexDef *Index `protobuf:"bytes,21,opt,name=index_def" json:"index_def,omitempty"` + Offset *int32 `protobuf:"varint,10,opt,name=offset,def=0" json:"offset,omitempty"` + Limit *int32 `protobuf:"varint,11,opt,name=limit" json:"limit,omitempty"` + KeysOnly *bool `protobuf:"varint,12,req,name=keys_only" json:"keys_only,omitempty"` + PropertyName []string `protobuf:"bytes,24,rep,name=property_name" json:"property_name,omitempty"` + DistinctInfixSize *int32 `protobuf:"varint,25,opt,name=distinct_infix_size" json:"distinct_infix_size,omitempty"` + Entityfilter *CompiledQuery_EntityFilter `protobuf:"group,13,opt,name=EntityFilter" json:"entityfilter,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompiledQuery) Reset() { *m = CompiledQuery{} } +func (m *CompiledQuery) String() string { return proto.CompactTextString(m) } +func (*CompiledQuery) ProtoMessage() {} + +const Default_CompiledQuery_Offset int32 = 0 + +func (m *CompiledQuery) GetPrimaryscan() *CompiledQuery_PrimaryScan { + if m != nil { + return m.Primaryscan + } + return nil +} + +func (m *CompiledQuery) GetMergejoinscan() []*CompiledQuery_MergeJoinScan { + if m != nil { + return m.Mergejoinscan + } + return nil +} + +func (m *CompiledQuery) GetIndexDef() *Index { + if m != nil { + return m.IndexDef + } + return nil +} + +func (m *CompiledQuery) GetOffset() int32 { + if m != nil && m.Offset != nil { + return *m.Offset + } + return Default_CompiledQuery_Offset +} + +func (m *CompiledQuery) GetLimit() int32 { + if m != nil && m.Limit != nil { + return *m.Limit + } + return 0 +} + +func (m *CompiledQuery) GetKeysOnly() bool { + if m != nil && m.KeysOnly != nil { + return *m.KeysOnly + } + return false +} + +func (m *CompiledQuery) GetPropertyName() []string { + if m != nil { + return m.PropertyName + } + return nil +} + +func (m *CompiledQuery) GetDistinctInfixSize() int32 { + if m != nil && m.DistinctInfixSize != nil { + return *m.DistinctInfixSize + } + return 0 +} + +func (m *CompiledQuery) GetEntityfilter() *CompiledQuery_EntityFilter { + if m != nil { + return m.Entityfilter + } + return nil +} + +type CompiledQuery_PrimaryScan struct { + IndexName *string `protobuf:"bytes,2,opt,name=index_name" json:"index_name,omitempty"` + StartKey *string `protobuf:"bytes,3,opt,name=start_key" json:"start_key,omitempty"` + StartInclusive *bool `protobuf:"varint,4,opt,name=start_inclusive" json:"start_inclusive,omitempty"` + EndKey *string `protobuf:"bytes,5,opt,name=end_key" json:"end_key,omitempty"` + EndInclusive *bool `protobuf:"varint,6,opt,name=end_inclusive" json:"end_inclusive,omitempty"` + StartPostfixValue []string `protobuf:"bytes,22,rep,name=start_postfix_value" json:"start_postfix_value,omitempty"` + EndPostfixValue []string `protobuf:"bytes,23,rep,name=end_postfix_value" json:"end_postfix_value,omitempty"` + EndUnappliedLogTimestampUs *int64 `protobuf:"varint,19,opt,name=end_unapplied_log_timestamp_us" json:"end_unapplied_log_timestamp_us,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompiledQuery_PrimaryScan) Reset() { *m = CompiledQuery_PrimaryScan{} } +func (m *CompiledQuery_PrimaryScan) String() string { return proto.CompactTextString(m) } +func (*CompiledQuery_PrimaryScan) ProtoMessage() {} + +func (m *CompiledQuery_PrimaryScan) GetIndexName() string { + if m != nil && m.IndexName != nil { + return *m.IndexName + } + return "" +} + +func (m *CompiledQuery_PrimaryScan) GetStartKey() string { + if m != nil && m.StartKey != nil { + return *m.StartKey + } + return "" +} + +func (m *CompiledQuery_PrimaryScan) GetStartInclusive() bool { + if m != nil && m.StartInclusive != nil { + return *m.StartInclusive + } + return false +} + +func (m *CompiledQuery_PrimaryScan) GetEndKey() string { + if m != nil && m.EndKey != nil { + return *m.EndKey + } + return "" +} + +func (m *CompiledQuery_PrimaryScan) GetEndInclusive() bool { + if m != nil && m.EndInclusive != nil { + return *m.EndInclusive + } + return false +} + +func (m *CompiledQuery_PrimaryScan) GetStartPostfixValue() []string { + if m != nil { + return m.StartPostfixValue + } + return nil +} + +func (m *CompiledQuery_PrimaryScan) GetEndPostfixValue() []string { + if m != nil { + return m.EndPostfixValue + } + return nil +} + +func (m *CompiledQuery_PrimaryScan) GetEndUnappliedLogTimestampUs() int64 { + if m != nil && m.EndUnappliedLogTimestampUs != nil { + return *m.EndUnappliedLogTimestampUs + } + return 0 +} + +type CompiledQuery_MergeJoinScan struct { + IndexName *string `protobuf:"bytes,8,req,name=index_name" json:"index_name,omitempty"` + PrefixValue []string `protobuf:"bytes,9,rep,name=prefix_value" json:"prefix_value,omitempty"` + ValuePrefix *bool `protobuf:"varint,20,opt,name=value_prefix,def=0" json:"value_prefix,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompiledQuery_MergeJoinScan) Reset() { *m = CompiledQuery_MergeJoinScan{} } +func (m *CompiledQuery_MergeJoinScan) String() string { return proto.CompactTextString(m) } +func (*CompiledQuery_MergeJoinScan) ProtoMessage() {} + +const Default_CompiledQuery_MergeJoinScan_ValuePrefix bool = false + +func (m *CompiledQuery_MergeJoinScan) GetIndexName() string { + if m != nil && m.IndexName != nil { + return *m.IndexName + } + return "" +} + +func (m *CompiledQuery_MergeJoinScan) GetPrefixValue() []string { + if m != nil { + return m.PrefixValue + } + return nil +} + +func (m *CompiledQuery_MergeJoinScan) GetValuePrefix() bool { + if m != nil && m.ValuePrefix != nil { + return *m.ValuePrefix + } + return Default_CompiledQuery_MergeJoinScan_ValuePrefix +} + +type CompiledQuery_EntityFilter struct { + Distinct *bool `protobuf:"varint,14,opt,name=distinct,def=0" json:"distinct,omitempty"` + Kind *string `protobuf:"bytes,17,opt,name=kind" json:"kind,omitempty"` + Ancestor *Reference `protobuf:"bytes,18,opt,name=ancestor" json:"ancestor,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompiledQuery_EntityFilter) Reset() { *m = CompiledQuery_EntityFilter{} } +func (m *CompiledQuery_EntityFilter) String() string { return proto.CompactTextString(m) } +func (*CompiledQuery_EntityFilter) ProtoMessage() {} + +const Default_CompiledQuery_EntityFilter_Distinct bool = false + +func (m *CompiledQuery_EntityFilter) GetDistinct() bool { + if m != nil && m.Distinct != nil { + return *m.Distinct + } + return Default_CompiledQuery_EntityFilter_Distinct +} + +func (m *CompiledQuery_EntityFilter) GetKind() string { + if m != nil && m.Kind != nil { + return *m.Kind + } + return "" +} + +func (m *CompiledQuery_EntityFilter) GetAncestor() *Reference { + if m != nil { + return m.Ancestor + } + return nil +} + +type CompiledCursor struct { + Position *CompiledCursor_Position `protobuf:"group,2,opt,name=Position" json:"position,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompiledCursor) Reset() { *m = CompiledCursor{} } +func (m *CompiledCursor) String() string { return proto.CompactTextString(m) } +func (*CompiledCursor) ProtoMessage() {} + +func (m *CompiledCursor) GetPosition() *CompiledCursor_Position { + if m != nil { + return m.Position + } + return nil +} + +type CompiledCursor_Position struct { + StartKey *string `protobuf:"bytes,27,opt,name=start_key" json:"start_key,omitempty"` + Indexvalue []*CompiledCursor_Position_IndexValue `protobuf:"group,29,rep,name=IndexValue" json:"indexvalue,omitempty"` + Key *Reference `protobuf:"bytes,32,opt,name=key" json:"key,omitempty"` + StartInclusive *bool `protobuf:"varint,28,opt,name=start_inclusive,def=1" json:"start_inclusive,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompiledCursor_Position) Reset() { *m = CompiledCursor_Position{} } +func (m *CompiledCursor_Position) String() string { return proto.CompactTextString(m) } +func (*CompiledCursor_Position) ProtoMessage() {} + +const Default_CompiledCursor_Position_StartInclusive bool = true + +func (m *CompiledCursor_Position) GetStartKey() string { + if m != nil && m.StartKey != nil { + return *m.StartKey + } + return "" +} + +func (m *CompiledCursor_Position) GetIndexvalue() []*CompiledCursor_Position_IndexValue { + if m != nil { + return m.Indexvalue + } + return nil +} + +func (m *CompiledCursor_Position) GetKey() *Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *CompiledCursor_Position) GetStartInclusive() bool { + if m != nil && m.StartInclusive != nil { + return *m.StartInclusive + } + return Default_CompiledCursor_Position_StartInclusive +} + +type CompiledCursor_Position_IndexValue struct { + Property *string `protobuf:"bytes,30,opt,name=property" json:"property,omitempty"` + Value *PropertyValue `protobuf:"bytes,31,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompiledCursor_Position_IndexValue) Reset() { *m = CompiledCursor_Position_IndexValue{} } +func (m *CompiledCursor_Position_IndexValue) String() string { return proto.CompactTextString(m) } +func (*CompiledCursor_Position_IndexValue) ProtoMessage() {} + +func (m *CompiledCursor_Position_IndexValue) GetProperty() string { + if m != nil && m.Property != nil { + return *m.Property + } + return "" +} + +func (m *CompiledCursor_Position_IndexValue) GetValue() *PropertyValue { + if m != nil { + return m.Value + } + return nil +} + +type Cursor struct { + Cursor *uint64 `protobuf:"fixed64,1,req,name=cursor" json:"cursor,omitempty"` + App *string `protobuf:"bytes,2,opt,name=app" json:"app,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Cursor) Reset() { *m = Cursor{} } +func (m *Cursor) String() string { return proto.CompactTextString(m) } +func (*Cursor) ProtoMessage() {} + +func (m *Cursor) GetCursor() uint64 { + if m != nil && m.Cursor != nil { + return *m.Cursor + } + return 0 +} + +func (m *Cursor) GetApp() string { + if m != nil && m.App != nil { + return *m.App + } + return "" +} + +type Error struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *Error) Reset() { *m = Error{} } +func (m *Error) String() string { return proto.CompactTextString(m) } +func (*Error) ProtoMessage() {} + +type Cost struct { + IndexWrites *int32 `protobuf:"varint,1,opt,name=index_writes" json:"index_writes,omitempty"` + IndexWriteBytes *int32 `protobuf:"varint,2,opt,name=index_write_bytes" json:"index_write_bytes,omitempty"` + EntityWrites *int32 `protobuf:"varint,3,opt,name=entity_writes" json:"entity_writes,omitempty"` + EntityWriteBytes *int32 `protobuf:"varint,4,opt,name=entity_write_bytes" json:"entity_write_bytes,omitempty"` + Commitcost *Cost_CommitCost `protobuf:"group,5,opt,name=CommitCost" json:"commitcost,omitempty"` + ApproximateStorageDelta *int32 `protobuf:"varint,8,opt,name=approximate_storage_delta" json:"approximate_storage_delta,omitempty"` + IdSequenceUpdates *int32 `protobuf:"varint,9,opt,name=id_sequence_updates" json:"id_sequence_updates,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Cost) Reset() { *m = Cost{} } +func (m *Cost) String() string { return proto.CompactTextString(m) } +func (*Cost) ProtoMessage() {} + +func (m *Cost) GetIndexWrites() int32 { + if m != nil && m.IndexWrites != nil { + return *m.IndexWrites + } + return 0 +} + +func (m *Cost) GetIndexWriteBytes() int32 { + if m != nil && m.IndexWriteBytes != nil { + return *m.IndexWriteBytes + } + return 0 +} + +func (m *Cost) GetEntityWrites() int32 { + if m != nil && m.EntityWrites != nil { + return *m.EntityWrites + } + return 0 +} + +func (m *Cost) GetEntityWriteBytes() int32 { + if m != nil && m.EntityWriteBytes != nil { + return *m.EntityWriteBytes + } + return 0 +} + +func (m *Cost) GetCommitcost() *Cost_CommitCost { + if m != nil { + return m.Commitcost + } + return nil +} + +func (m *Cost) GetApproximateStorageDelta() int32 { + if m != nil && m.ApproximateStorageDelta != nil { + return *m.ApproximateStorageDelta + } + return 0 +} + +func (m *Cost) GetIdSequenceUpdates() int32 { + if m != nil && m.IdSequenceUpdates != nil { + return *m.IdSequenceUpdates + } + return 0 +} + +type Cost_CommitCost struct { + RequestedEntityPuts *int32 `protobuf:"varint,6,opt,name=requested_entity_puts" json:"requested_entity_puts,omitempty"` + RequestedEntityDeletes *int32 `protobuf:"varint,7,opt,name=requested_entity_deletes" json:"requested_entity_deletes,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Cost_CommitCost) Reset() { *m = Cost_CommitCost{} } +func (m *Cost_CommitCost) String() string { return proto.CompactTextString(m) } +func (*Cost_CommitCost) ProtoMessage() {} + +func (m *Cost_CommitCost) GetRequestedEntityPuts() int32 { + if m != nil && m.RequestedEntityPuts != nil { + return *m.RequestedEntityPuts + } + return 0 +} + +func (m *Cost_CommitCost) GetRequestedEntityDeletes() int32 { + if m != nil && m.RequestedEntityDeletes != nil { + return *m.RequestedEntityDeletes + } + return 0 +} + +type GetRequest struct { + Header *InternalHeader `protobuf:"bytes,6,opt,name=header" json:"header,omitempty"` + Key []*Reference `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"` + Transaction *Transaction `protobuf:"bytes,2,opt,name=transaction" json:"transaction,omitempty"` + FailoverMs *int64 `protobuf:"varint,3,opt,name=failover_ms" json:"failover_ms,omitempty"` + Strong *bool `protobuf:"varint,4,opt,name=strong" json:"strong,omitempty"` + AllowDeferred *bool `protobuf:"varint,5,opt,name=allow_deferred,def=0" json:"allow_deferred,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetRequest) Reset() { *m = GetRequest{} } +func (m *GetRequest) String() string { return proto.CompactTextString(m) } +func (*GetRequest) ProtoMessage() {} + +const Default_GetRequest_AllowDeferred bool = false + +func (m *GetRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *GetRequest) GetKey() []*Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *GetRequest) GetTransaction() *Transaction { + if m != nil { + return m.Transaction + } + return nil +} + +func (m *GetRequest) GetFailoverMs() int64 { + if m != nil && m.FailoverMs != nil { + return *m.FailoverMs + } + return 0 +} + +func (m *GetRequest) GetStrong() bool { + if m != nil && m.Strong != nil { + return *m.Strong + } + return false +} + +func (m *GetRequest) GetAllowDeferred() bool { + if m != nil && m.AllowDeferred != nil { + return *m.AllowDeferred + } + return Default_GetRequest_AllowDeferred +} + +type GetResponse struct { + Entity []*GetResponse_Entity `protobuf:"group,1,rep,name=Entity" json:"entity,omitempty"` + Deferred []*Reference `protobuf:"bytes,5,rep,name=deferred" json:"deferred,omitempty"` + InOrder *bool `protobuf:"varint,6,opt,name=in_order,def=1" json:"in_order,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetResponse) Reset() { *m = GetResponse{} } +func (m *GetResponse) String() string { return proto.CompactTextString(m) } +func (*GetResponse) ProtoMessage() {} + +const Default_GetResponse_InOrder bool = true + +func (m *GetResponse) GetEntity() []*GetResponse_Entity { + if m != nil { + return m.Entity + } + return nil +} + +func (m *GetResponse) GetDeferred() []*Reference { + if m != nil { + return m.Deferred + } + return nil +} + +func (m *GetResponse) GetInOrder() bool { + if m != nil && m.InOrder != nil { + return *m.InOrder + } + return Default_GetResponse_InOrder +} + +type GetResponse_Entity struct { + Entity *EntityProto `protobuf:"bytes,2,opt,name=entity" json:"entity,omitempty"` + Key *Reference `protobuf:"bytes,4,opt,name=key" json:"key,omitempty"` + Version *int64 `protobuf:"varint,3,opt,name=version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetResponse_Entity) Reset() { *m = GetResponse_Entity{} } +func (m *GetResponse_Entity) String() string { return proto.CompactTextString(m) } +func (*GetResponse_Entity) ProtoMessage() {} + +func (m *GetResponse_Entity) GetEntity() *EntityProto { + if m != nil { + return m.Entity + } + return nil +} + +func (m *GetResponse_Entity) GetKey() *Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *GetResponse_Entity) GetVersion() int64 { + if m != nil && m.Version != nil { + return *m.Version + } + return 0 +} + +type PutRequest struct { + Header *InternalHeader `protobuf:"bytes,11,opt,name=header" json:"header,omitempty"` + Entity []*EntityProto `protobuf:"bytes,1,rep,name=entity" json:"entity,omitempty"` + Transaction *Transaction `protobuf:"bytes,2,opt,name=transaction" json:"transaction,omitempty"` + CompositeIndex []*CompositeIndex `protobuf:"bytes,3,rep,name=composite_index" json:"composite_index,omitempty"` + Trusted *bool `protobuf:"varint,4,opt,name=trusted,def=0" json:"trusted,omitempty"` + Force *bool `protobuf:"varint,7,opt,name=force,def=0" json:"force,omitempty"` + MarkChanges *bool `protobuf:"varint,8,opt,name=mark_changes,def=0" json:"mark_changes,omitempty"` + Snapshot []*Snapshot `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"` + AutoIdPolicy *PutRequest_AutoIdPolicy `protobuf:"varint,10,opt,name=auto_id_policy,enum=appengine.PutRequest_AutoIdPolicy,def=0" json:"auto_id_policy,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PutRequest) Reset() { *m = PutRequest{} } +func (m *PutRequest) String() string { return proto.CompactTextString(m) } +func (*PutRequest) ProtoMessage() {} + +const Default_PutRequest_Trusted bool = false +const Default_PutRequest_Force bool = false +const Default_PutRequest_MarkChanges bool = false +const Default_PutRequest_AutoIdPolicy PutRequest_AutoIdPolicy = PutRequest_CURRENT + +func (m *PutRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *PutRequest) GetEntity() []*EntityProto { + if m != nil { + return m.Entity + } + return nil +} + +func (m *PutRequest) GetTransaction() *Transaction { + if m != nil { + return m.Transaction + } + return nil +} + +func (m *PutRequest) GetCompositeIndex() []*CompositeIndex { + if m != nil { + return m.CompositeIndex + } + return nil +} + +func (m *PutRequest) GetTrusted() bool { + if m != nil && m.Trusted != nil { + return *m.Trusted + } + return Default_PutRequest_Trusted +} + +func (m *PutRequest) GetForce() bool { + if m != nil && m.Force != nil { + return *m.Force + } + return Default_PutRequest_Force +} + +func (m *PutRequest) GetMarkChanges() bool { + if m != nil && m.MarkChanges != nil { + return *m.MarkChanges + } + return Default_PutRequest_MarkChanges +} + +func (m *PutRequest) GetSnapshot() []*Snapshot { + if m != nil { + return m.Snapshot + } + return nil +} + +func (m *PutRequest) GetAutoIdPolicy() PutRequest_AutoIdPolicy { + if m != nil && m.AutoIdPolicy != nil { + return *m.AutoIdPolicy + } + return Default_PutRequest_AutoIdPolicy +} + +type PutResponse struct { + Key []*Reference `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"` + Cost *Cost `protobuf:"bytes,2,opt,name=cost" json:"cost,omitempty"` + Version []int64 `protobuf:"varint,3,rep,name=version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PutResponse) Reset() { *m = PutResponse{} } +func (m *PutResponse) String() string { return proto.CompactTextString(m) } +func (*PutResponse) ProtoMessage() {} + +func (m *PutResponse) GetKey() []*Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *PutResponse) GetCost() *Cost { + if m != nil { + return m.Cost + } + return nil +} + +func (m *PutResponse) GetVersion() []int64 { + if m != nil { + return m.Version + } + return nil +} + +type TouchRequest struct { + Header *InternalHeader `protobuf:"bytes,10,opt,name=header" json:"header,omitempty"` + Key []*Reference `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"` + CompositeIndex []*CompositeIndex `protobuf:"bytes,2,rep,name=composite_index" json:"composite_index,omitempty"` + Force *bool `protobuf:"varint,3,opt,name=force,def=0" json:"force,omitempty"` + Snapshot []*Snapshot `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *TouchRequest) Reset() { *m = TouchRequest{} } +func (m *TouchRequest) String() string { return proto.CompactTextString(m) } +func (*TouchRequest) ProtoMessage() {} + +const Default_TouchRequest_Force bool = false + +func (m *TouchRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *TouchRequest) GetKey() []*Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *TouchRequest) GetCompositeIndex() []*CompositeIndex { + if m != nil { + return m.CompositeIndex + } + return nil +} + +func (m *TouchRequest) GetForce() bool { + if m != nil && m.Force != nil { + return *m.Force + } + return Default_TouchRequest_Force +} + +func (m *TouchRequest) GetSnapshot() []*Snapshot { + if m != nil { + return m.Snapshot + } + return nil +} + +type TouchResponse struct { + Cost *Cost `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *TouchResponse) Reset() { *m = TouchResponse{} } +func (m *TouchResponse) String() string { return proto.CompactTextString(m) } +func (*TouchResponse) ProtoMessage() {} + +func (m *TouchResponse) GetCost() *Cost { + if m != nil { + return m.Cost + } + return nil +} + +type DeleteRequest struct { + Header *InternalHeader `protobuf:"bytes,10,opt,name=header" json:"header,omitempty"` + Key []*Reference `protobuf:"bytes,6,rep,name=key" json:"key,omitempty"` + Transaction *Transaction `protobuf:"bytes,5,opt,name=transaction" json:"transaction,omitempty"` + Trusted *bool `protobuf:"varint,4,opt,name=trusted,def=0" json:"trusted,omitempty"` + Force *bool `protobuf:"varint,7,opt,name=force,def=0" json:"force,omitempty"` + MarkChanges *bool `protobuf:"varint,8,opt,name=mark_changes,def=0" json:"mark_changes,omitempty"` + Snapshot []*Snapshot `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DeleteRequest) Reset() { *m = DeleteRequest{} } +func (m *DeleteRequest) String() string { return proto.CompactTextString(m) } +func (*DeleteRequest) ProtoMessage() {} + +const Default_DeleteRequest_Trusted bool = false +const Default_DeleteRequest_Force bool = false +const Default_DeleteRequest_MarkChanges bool = false + +func (m *DeleteRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *DeleteRequest) GetKey() []*Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *DeleteRequest) GetTransaction() *Transaction { + if m != nil { + return m.Transaction + } + return nil +} + +func (m *DeleteRequest) GetTrusted() bool { + if m != nil && m.Trusted != nil { + return *m.Trusted + } + return Default_DeleteRequest_Trusted +} + +func (m *DeleteRequest) GetForce() bool { + if m != nil && m.Force != nil { + return *m.Force + } + return Default_DeleteRequest_Force +} + +func (m *DeleteRequest) GetMarkChanges() bool { + if m != nil && m.MarkChanges != nil { + return *m.MarkChanges + } + return Default_DeleteRequest_MarkChanges +} + +func (m *DeleteRequest) GetSnapshot() []*Snapshot { + if m != nil { + return m.Snapshot + } + return nil +} + +type DeleteResponse struct { + Cost *Cost `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"` + Version []int64 `protobuf:"varint,3,rep,name=version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DeleteResponse) Reset() { *m = DeleteResponse{} } +func (m *DeleteResponse) String() string { return proto.CompactTextString(m) } +func (*DeleteResponse) ProtoMessage() {} + +func (m *DeleteResponse) GetCost() *Cost { + if m != nil { + return m.Cost + } + return nil +} + +func (m *DeleteResponse) GetVersion() []int64 { + if m != nil { + return m.Version + } + return nil +} + +type NextRequest struct { + Header *InternalHeader `protobuf:"bytes,5,opt,name=header" json:"header,omitempty"` + Cursor *Cursor `protobuf:"bytes,1,req,name=cursor" json:"cursor,omitempty"` + Count *int32 `protobuf:"varint,2,opt,name=count" json:"count,omitempty"` + Offset *int32 `protobuf:"varint,4,opt,name=offset,def=0" json:"offset,omitempty"` + Compile *bool `protobuf:"varint,3,opt,name=compile,def=0" json:"compile,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *NextRequest) Reset() { *m = NextRequest{} } +func (m *NextRequest) String() string { return proto.CompactTextString(m) } +func (*NextRequest) ProtoMessage() {} + +const Default_NextRequest_Offset int32 = 0 +const Default_NextRequest_Compile bool = false + +func (m *NextRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *NextRequest) GetCursor() *Cursor { + if m != nil { + return m.Cursor + } + return nil +} + +func (m *NextRequest) GetCount() int32 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +func (m *NextRequest) GetOffset() int32 { + if m != nil && m.Offset != nil { + return *m.Offset + } + return Default_NextRequest_Offset +} + +func (m *NextRequest) GetCompile() bool { + if m != nil && m.Compile != nil { + return *m.Compile + } + return Default_NextRequest_Compile +} + +type QueryResult struct { + Cursor *Cursor `protobuf:"bytes,1,opt,name=cursor" json:"cursor,omitempty"` + Result []*EntityProto `protobuf:"bytes,2,rep,name=result" json:"result,omitempty"` + SkippedResults *int32 `protobuf:"varint,7,opt,name=skipped_results" json:"skipped_results,omitempty"` + MoreResults *bool `protobuf:"varint,3,req,name=more_results" json:"more_results,omitempty"` + KeysOnly *bool `protobuf:"varint,4,opt,name=keys_only" json:"keys_only,omitempty"` + IndexOnly *bool `protobuf:"varint,9,opt,name=index_only" json:"index_only,omitempty"` + SmallOps *bool `protobuf:"varint,10,opt,name=small_ops" json:"small_ops,omitempty"` + CompiledQuery *CompiledQuery `protobuf:"bytes,5,opt,name=compiled_query" json:"compiled_query,omitempty"` + CompiledCursor *CompiledCursor `protobuf:"bytes,6,opt,name=compiled_cursor" json:"compiled_cursor,omitempty"` + Index []*CompositeIndex `protobuf:"bytes,8,rep,name=index" json:"index,omitempty"` + Version []int64 `protobuf:"varint,11,rep,name=version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *QueryResult) Reset() { *m = QueryResult{} } +func (m *QueryResult) String() string { return proto.CompactTextString(m) } +func (*QueryResult) ProtoMessage() {} + +func (m *QueryResult) GetCursor() *Cursor { + if m != nil { + return m.Cursor + } + return nil +} + +func (m *QueryResult) GetResult() []*EntityProto { + if m != nil { + return m.Result + } + return nil +} + +func (m *QueryResult) GetSkippedResults() int32 { + if m != nil && m.SkippedResults != nil { + return *m.SkippedResults + } + return 0 +} + +func (m *QueryResult) GetMoreResults() bool { + if m != nil && m.MoreResults != nil { + return *m.MoreResults + } + return false +} + +func (m *QueryResult) GetKeysOnly() bool { + if m != nil && m.KeysOnly != nil { + return *m.KeysOnly + } + return false +} + +func (m *QueryResult) GetIndexOnly() bool { + if m != nil && m.IndexOnly != nil { + return *m.IndexOnly + } + return false +} + +func (m *QueryResult) GetSmallOps() bool { + if m != nil && m.SmallOps != nil { + return *m.SmallOps + } + return false +} + +func (m *QueryResult) GetCompiledQuery() *CompiledQuery { + if m != nil { + return m.CompiledQuery + } + return nil +} + +func (m *QueryResult) GetCompiledCursor() *CompiledCursor { + if m != nil { + return m.CompiledCursor + } + return nil +} + +func (m *QueryResult) GetIndex() []*CompositeIndex { + if m != nil { + return m.Index + } + return nil +} + +func (m *QueryResult) GetVersion() []int64 { + if m != nil { + return m.Version + } + return nil +} + +type AllocateIdsRequest struct { + Header *InternalHeader `protobuf:"bytes,4,opt,name=header" json:"header,omitempty"` + ModelKey *Reference `protobuf:"bytes,1,opt,name=model_key" json:"model_key,omitempty"` + Size *int64 `protobuf:"varint,2,opt,name=size" json:"size,omitempty"` + Max *int64 `protobuf:"varint,3,opt,name=max" json:"max,omitempty"` + Reserve []*Reference `protobuf:"bytes,5,rep,name=reserve" json:"reserve,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *AllocateIdsRequest) Reset() { *m = AllocateIdsRequest{} } +func (m *AllocateIdsRequest) String() string { return proto.CompactTextString(m) } +func (*AllocateIdsRequest) ProtoMessage() {} + +func (m *AllocateIdsRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *AllocateIdsRequest) GetModelKey() *Reference { + if m != nil { + return m.ModelKey + } + return nil +} + +func (m *AllocateIdsRequest) GetSize() int64 { + if m != nil && m.Size != nil { + return *m.Size + } + return 0 +} + +func (m *AllocateIdsRequest) GetMax() int64 { + if m != nil && m.Max != nil { + return *m.Max + } + return 0 +} + +func (m *AllocateIdsRequest) GetReserve() []*Reference { + if m != nil { + return m.Reserve + } + return nil +} + +type AllocateIdsResponse struct { + Start *int64 `protobuf:"varint,1,req,name=start" json:"start,omitempty"` + End *int64 `protobuf:"varint,2,req,name=end" json:"end,omitempty"` + Cost *Cost `protobuf:"bytes,3,opt,name=cost" json:"cost,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *AllocateIdsResponse) Reset() { *m = AllocateIdsResponse{} } +func (m *AllocateIdsResponse) String() string { return proto.CompactTextString(m) } +func (*AllocateIdsResponse) ProtoMessage() {} + +func (m *AllocateIdsResponse) GetStart() int64 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *AllocateIdsResponse) GetEnd() int64 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +func (m *AllocateIdsResponse) GetCost() *Cost { + if m != nil { + return m.Cost + } + return nil +} + +type CompositeIndices struct { + Index []*CompositeIndex `protobuf:"bytes,1,rep,name=index" json:"index,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompositeIndices) Reset() { *m = CompositeIndices{} } +func (m *CompositeIndices) String() string { return proto.CompactTextString(m) } +func (*CompositeIndices) ProtoMessage() {} + +func (m *CompositeIndices) GetIndex() []*CompositeIndex { + if m != nil { + return m.Index + } + return nil +} + +type AddActionsRequest struct { + Header *InternalHeader `protobuf:"bytes,3,opt,name=header" json:"header,omitempty"` + Transaction *Transaction `protobuf:"bytes,1,req,name=transaction" json:"transaction,omitempty"` + Action []*Action `protobuf:"bytes,2,rep,name=action" json:"action,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *AddActionsRequest) Reset() { *m = AddActionsRequest{} } +func (m *AddActionsRequest) String() string { return proto.CompactTextString(m) } +func (*AddActionsRequest) ProtoMessage() {} + +func (m *AddActionsRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *AddActionsRequest) GetTransaction() *Transaction { + if m != nil { + return m.Transaction + } + return nil +} + +func (m *AddActionsRequest) GetAction() []*Action { + if m != nil { + return m.Action + } + return nil +} + +type AddActionsResponse struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *AddActionsResponse) Reset() { *m = AddActionsResponse{} } +func (m *AddActionsResponse) String() string { return proto.CompactTextString(m) } +func (*AddActionsResponse) ProtoMessage() {} + +type BeginTransactionRequest struct { + Header *InternalHeader `protobuf:"bytes,3,opt,name=header" json:"header,omitempty"` + App *string `protobuf:"bytes,1,req,name=app" json:"app,omitempty"` + AllowMultipleEg *bool `protobuf:"varint,2,opt,name=allow_multiple_eg,def=0" json:"allow_multiple_eg,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *BeginTransactionRequest) Reset() { *m = BeginTransactionRequest{} } +func (m *BeginTransactionRequest) String() string { return proto.CompactTextString(m) } +func (*BeginTransactionRequest) ProtoMessage() {} + +const Default_BeginTransactionRequest_AllowMultipleEg bool = false + +func (m *BeginTransactionRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *BeginTransactionRequest) GetApp() string { + if m != nil && m.App != nil { + return *m.App + } + return "" +} + +func (m *BeginTransactionRequest) GetAllowMultipleEg() bool { + if m != nil && m.AllowMultipleEg != nil { + return *m.AllowMultipleEg + } + return Default_BeginTransactionRequest_AllowMultipleEg +} + +type CommitResponse struct { + Cost *Cost `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"` + Version []*CommitResponse_Version `protobuf:"group,3,rep,name=Version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CommitResponse) Reset() { *m = CommitResponse{} } +func (m *CommitResponse) String() string { return proto.CompactTextString(m) } +func (*CommitResponse) ProtoMessage() {} + +func (m *CommitResponse) GetCost() *Cost { + if m != nil { + return m.Cost + } + return nil +} + +func (m *CommitResponse) GetVersion() []*CommitResponse_Version { + if m != nil { + return m.Version + } + return nil +} + +type CommitResponse_Version struct { + RootEntityKey *Reference `protobuf:"bytes,4,req,name=root_entity_key" json:"root_entity_key,omitempty"` + Version *int64 `protobuf:"varint,5,req,name=version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CommitResponse_Version) Reset() { *m = CommitResponse_Version{} } +func (m *CommitResponse_Version) String() string { return proto.CompactTextString(m) } +func (*CommitResponse_Version) ProtoMessage() {} + +func (m *CommitResponse_Version) GetRootEntityKey() *Reference { + if m != nil { + return m.RootEntityKey + } + return nil +} + +func (m *CommitResponse_Version) GetVersion() int64 { + if m != nil && m.Version != nil { + return *m.Version + } + return 0 +} + +func init() { +} diff --git a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto new file mode 100755 index 0000000000..e76f126ff7 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto @@ -0,0 +1,541 @@ +syntax = "proto2"; +option go_package = "datastore"; + +package appengine; + +message Action{} + +message PropertyValue { + optional int64 int64Value = 1; + optional bool booleanValue = 2; + optional string stringValue = 3; + optional double doubleValue = 4; + + optional group PointValue = 5 { + required double x = 6; + required double y = 7; + } + + optional group UserValue = 8 { + required string email = 9; + required string auth_domain = 10; + optional string nickname = 11; + optional string federated_identity = 21; + optional string federated_provider = 22; + } + + optional group ReferenceValue = 12 { + required string app = 13; + optional string name_space = 20; + repeated group PathElement = 14 { + required string type = 15; + optional int64 id = 16; + optional string name = 17; + } + } +} + +message Property { + enum Meaning { + NO_MEANING = 0; + BLOB = 14; + TEXT = 15; + BYTESTRING = 16; + + ATOM_CATEGORY = 1; + ATOM_LINK = 2; + ATOM_TITLE = 3; + ATOM_CONTENT = 4; + ATOM_SUMMARY = 5; + ATOM_AUTHOR = 6; + + GD_WHEN = 7; + GD_EMAIL = 8; + GEORSS_POINT = 9; + GD_IM = 10; + + GD_PHONENUMBER = 11; + GD_POSTALADDRESS = 12; + + GD_RATING = 13; + + BLOBKEY = 17; + ENTITY_PROTO = 19; + + INDEX_VALUE = 18; + }; + + optional Meaning meaning = 1 [default = NO_MEANING]; + optional string meaning_uri = 2; + + required string name = 3; + + required PropertyValue value = 5; + + required bool multiple = 4; + + optional bool searchable = 6 [default=false]; + + enum FtsTokenizationOption { + HTML = 1; + ATOM = 2; + } + + optional FtsTokenizationOption fts_tokenization_option = 8; + + optional string locale = 9 [default = "en"]; +} + +message Path { + repeated group Element = 1 { + required string type = 2; + optional int64 id = 3; + optional string name = 4; + } +} + +message Reference { + required string app = 13; + optional string name_space = 20; + required Path path = 14; +} + +message User { + required string email = 1; + required string auth_domain = 2; + optional string nickname = 3; + optional string federated_identity = 6; + optional string federated_provider = 7; +} + +message EntityProto { + required Reference key = 13; + required Path entity_group = 16; + optional User owner = 17; + + enum Kind { + GD_CONTACT = 1; + GD_EVENT = 2; + GD_MESSAGE = 3; + } + optional Kind kind = 4; + optional string kind_uri = 5; + + repeated Property property = 14; + repeated Property raw_property = 15; + + optional int32 rank = 18; +} + +message CompositeProperty { + required int64 index_id = 1; + repeated string value = 2; +} + +message Index { + required string entity_type = 1; + required bool ancestor = 5; + repeated group Property = 2 { + required string name = 3; + enum Direction { + ASCENDING = 1; + DESCENDING = 2; + } + optional Direction direction = 4 [default = ASCENDING]; + } +} + +message CompositeIndex { + required string app_id = 1; + required int64 id = 2; + required Index definition = 3; + + enum State { + WRITE_ONLY = 1; + READ_WRITE = 2; + DELETED = 3; + ERROR = 4; + } + required State state = 4; + + optional bool only_use_if_required = 6 [default = false]; +} + +message IndexPostfix { + message IndexValue { + required string property_name = 1; + required PropertyValue value = 2; + } + + repeated IndexValue index_value = 1; + + optional Reference key = 2; + + optional bool before = 3 [default=true]; +} + +message IndexPosition { + optional string key = 1; + + optional bool before = 2 [default=true]; +} + +message Snapshot { + enum Status { + INACTIVE = 0; + ACTIVE = 1; + } + + required int64 ts = 1; +} + +message InternalHeader { + optional string qos = 1; +} + +message Transaction { + optional InternalHeader header = 4; + required fixed64 handle = 1; + required string app = 2; + optional bool mark_changes = 3 [default = false]; +} + +message Query { + optional InternalHeader header = 39; + + required string app = 1; + optional string name_space = 29; + + optional string kind = 3; + optional Reference ancestor = 17; + + repeated group Filter = 4 { + enum Operator { + LESS_THAN = 1; + LESS_THAN_OR_EQUAL = 2; + GREATER_THAN = 3; + GREATER_THAN_OR_EQUAL = 4; + EQUAL = 5; + IN = 6; + EXISTS = 7; + } + + required Operator op = 6; + repeated Property property = 14; + } + + optional string search_query = 8; + + repeated group Order = 9 { + enum Direction { + ASCENDING = 1; + DESCENDING = 2; + } + + required string property = 10; + optional Direction direction = 11 [default = ASCENDING]; + } + + enum Hint { + ORDER_FIRST = 1; + ANCESTOR_FIRST = 2; + FILTER_FIRST = 3; + } + optional Hint hint = 18; + + optional int32 count = 23; + + optional int32 offset = 12 [default = 0]; + + optional int32 limit = 16; + + optional CompiledCursor compiled_cursor = 30; + optional CompiledCursor end_compiled_cursor = 31; + + repeated CompositeIndex composite_index = 19; + + optional bool require_perfect_plan = 20 [default = false]; + + optional bool keys_only = 21 [default = false]; + + optional Transaction transaction = 22; + + optional bool compile = 25 [default = false]; + + optional int64 failover_ms = 26; + + optional bool strong = 32; + + repeated string property_name = 33; + + repeated string group_by_property_name = 34; + + optional bool distinct = 24; + + optional int64 min_safe_time_seconds = 35; + + repeated string safe_replica_name = 36; + + optional bool persist_offset = 37 [default=false]; +} + +message CompiledQuery { + required group PrimaryScan = 1 { + optional string index_name = 2; + + optional string start_key = 3; + optional bool start_inclusive = 4; + optional string end_key = 5; + optional bool end_inclusive = 6; + + repeated string start_postfix_value = 22; + repeated string end_postfix_value = 23; + + optional int64 end_unapplied_log_timestamp_us = 19; + } + + repeated group MergeJoinScan = 7 { + required string index_name = 8; + + repeated string prefix_value = 9; + + optional bool value_prefix = 20 [default=false]; + } + + optional Index index_def = 21; + + optional int32 offset = 10 [default = 0]; + + optional int32 limit = 11; + + required bool keys_only = 12; + + repeated string property_name = 24; + + optional int32 distinct_infix_size = 25; + + optional group EntityFilter = 13 { + optional bool distinct = 14 [default=false]; + + optional string kind = 17; + optional Reference ancestor = 18; + } +} + +message CompiledCursor { + optional group Position = 2 { + optional string start_key = 27; + + repeated group IndexValue = 29 { + optional string property = 30; + required PropertyValue value = 31; + } + + optional Reference key = 32; + + optional bool start_inclusive = 28 [default=true]; + } +} + +message Cursor { + required fixed64 cursor = 1; + + optional string app = 2; +} + +message Error { + enum ErrorCode { + BAD_REQUEST = 1; + CONCURRENT_TRANSACTION = 2; + INTERNAL_ERROR = 3; + NEED_INDEX = 4; + TIMEOUT = 5; + PERMISSION_DENIED = 6; + BIGTABLE_ERROR = 7; + COMMITTED_BUT_STILL_APPLYING = 8; + CAPABILITY_DISABLED = 9; + TRY_ALTERNATE_BACKEND = 10; + SAFE_TIME_TOO_OLD = 11; + } +} + +message Cost { + optional int32 index_writes = 1; + optional int32 index_write_bytes = 2; + optional int32 entity_writes = 3; + optional int32 entity_write_bytes = 4; + optional group CommitCost = 5 { + optional int32 requested_entity_puts = 6; + optional int32 requested_entity_deletes = 7; + }; + optional int32 approximate_storage_delta = 8; + optional int32 id_sequence_updates = 9; +} + +message GetRequest { + optional InternalHeader header = 6; + + repeated Reference key = 1; + optional Transaction transaction = 2; + + optional int64 failover_ms = 3; + + optional bool strong = 4; + + optional bool allow_deferred = 5 [default=false]; +} + +message GetResponse { + repeated group Entity = 1 { + optional EntityProto entity = 2; + optional Reference key = 4; + + optional int64 version = 3; + } + + repeated Reference deferred = 5; + + optional bool in_order = 6 [default=true]; +} + +message PutRequest { + optional InternalHeader header = 11; + + repeated EntityProto entity = 1; + optional Transaction transaction = 2; + repeated CompositeIndex composite_index = 3; + + optional bool trusted = 4 [default = false]; + + optional bool force = 7 [default = false]; + + optional bool mark_changes = 8 [default = false]; + repeated Snapshot snapshot = 9; + + enum AutoIdPolicy { + CURRENT = 0; + SEQUENTIAL = 1; + } + optional AutoIdPolicy auto_id_policy = 10 [default = CURRENT]; +} + +message PutResponse { + repeated Reference key = 1; + optional Cost cost = 2; + repeated int64 version = 3; +} + +message TouchRequest { + optional InternalHeader header = 10; + + repeated Reference key = 1; + repeated CompositeIndex composite_index = 2; + optional bool force = 3 [default = false]; + repeated Snapshot snapshot = 9; +} + +message TouchResponse { + optional Cost cost = 1; +} + +message DeleteRequest { + optional InternalHeader header = 10; + + repeated Reference key = 6; + optional Transaction transaction = 5; + + optional bool trusted = 4 [default = false]; + + optional bool force = 7 [default = false]; + + optional bool mark_changes = 8 [default = false]; + repeated Snapshot snapshot = 9; +} + +message DeleteResponse { + optional Cost cost = 1; + repeated int64 version = 3; +} + +message NextRequest { + optional InternalHeader header = 5; + + required Cursor cursor = 1; + optional int32 count = 2; + + optional int32 offset = 4 [default = 0]; + + optional bool compile = 3 [default = false]; +} + +message QueryResult { + optional Cursor cursor = 1; + + repeated EntityProto result = 2; + + optional int32 skipped_results = 7; + + required bool more_results = 3; + + optional bool keys_only = 4; + + optional bool index_only = 9; + + optional bool small_ops = 10; + + optional CompiledQuery compiled_query = 5; + + optional CompiledCursor compiled_cursor = 6; + + repeated CompositeIndex index = 8; + + repeated int64 version = 11; +} + +message AllocateIdsRequest { + optional InternalHeader header = 4; + + optional Reference model_key = 1; + + optional int64 size = 2; + + optional int64 max = 3; + + repeated Reference reserve = 5; +} + +message AllocateIdsResponse { + required int64 start = 1; + required int64 end = 2; + optional Cost cost = 3; +} + +message CompositeIndices { + repeated CompositeIndex index = 1; +} + +message AddActionsRequest { + optional InternalHeader header = 3; + + required Transaction transaction = 1; + repeated Action action = 2; +} + +message AddActionsResponse { +} + +message BeginTransactionRequest { + optional InternalHeader header = 3; + + required string app = 1; + optional bool allow_multiple_eg = 2 [default = false]; +} + +message CommitResponse { + optional Cost cost = 1; + + repeated group Version = 3 { + required Reference root_entity_key = 4; + required int64 version = 5; + } +} diff --git a/vendor/google.golang.org/appengine/internal/identity.go b/vendor/google.golang.org/appengine/internal/identity.go new file mode 100644 index 0000000000..d538701ab3 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/identity.go @@ -0,0 +1,14 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package internal + +import netcontext "golang.org/x/net/context" + +// These functions are implementations of the wrapper functions +// in ../appengine/identity.go. See that file for commentary. + +func AppID(c netcontext.Context) string { + return appID(FullyQualifiedAppID(c)) +} diff --git a/vendor/google.golang.org/appengine/internal/identity_classic.go b/vendor/google.golang.org/appengine/internal/identity_classic.go new file mode 100644 index 0000000000..e6b9227c56 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/identity_classic.go @@ -0,0 +1,27 @@ +// Copyright 2015 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build appengine + +package internal + +import ( + "appengine" + + netcontext "golang.org/x/net/context" +) + +func DefaultVersionHostname(ctx netcontext.Context) string { + return appengine.DefaultVersionHostname(fromContext(ctx)) +} + +func RequestID(ctx netcontext.Context) string { return appengine.RequestID(fromContext(ctx)) } +func Datacenter(_ netcontext.Context) string { return appengine.Datacenter() } +func ServerSoftware() string { return appengine.ServerSoftware() } +func ModuleName(ctx netcontext.Context) string { return appengine.ModuleName(fromContext(ctx)) } +func VersionID(ctx netcontext.Context) string { return appengine.VersionID(fromContext(ctx)) } +func InstanceID() string { return appengine.InstanceID() } +func IsDevAppServer() bool { return appengine.IsDevAppServer() } + +func fullyQualifiedAppID(ctx netcontext.Context) string { return fromContext(ctx).FullyQualifiedAppID() } diff --git a/vendor/google.golang.org/appengine/internal/identity_vm.go b/vendor/google.golang.org/appengine/internal/identity_vm.go new file mode 100644 index 0000000000..ebe68b785b --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/identity_vm.go @@ -0,0 +1,97 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build !appengine + +package internal + +import ( + "net/http" + "os" + + netcontext "golang.org/x/net/context" +) + +// These functions are implementations of the wrapper functions +// in ../appengine/identity.go. See that file for commentary. + +const ( + hDefaultVersionHostname = "X-AppEngine-Default-Version-Hostname" + hRequestLogId = "X-AppEngine-Request-Log-Id" + hDatacenter = "X-AppEngine-Datacenter" +) + +func ctxHeaders(ctx netcontext.Context) http.Header { + return fromContext(ctx).Request().Header +} + +func DefaultVersionHostname(ctx netcontext.Context) string { + return ctxHeaders(ctx).Get(hDefaultVersionHostname) +} + +func RequestID(ctx netcontext.Context) string { + return ctxHeaders(ctx).Get(hRequestLogId) +} + +func Datacenter(ctx netcontext.Context) string { + return ctxHeaders(ctx).Get(hDatacenter) +} + +func ServerSoftware() string { + // TODO(dsymonds): Remove fallback when we've verified this. + if s := os.Getenv("SERVER_SOFTWARE"); s != "" { + return s + } + return "Google App Engine/1.x.x" +} + +// TODO(dsymonds): Remove the metadata fetches. + +func ModuleName(_ netcontext.Context) string { + if s := os.Getenv("GAE_MODULE_NAME"); s != "" { + return s + } + return string(mustGetMetadata("instance/attributes/gae_backend_name")) +} + +func VersionID(_ netcontext.Context) string { + if s1, s2 := os.Getenv("GAE_MODULE_VERSION"), os.Getenv("GAE_MINOR_VERSION"); s1 != "" && s2 != "" { + return s1 + "." + s2 + } + return string(mustGetMetadata("instance/attributes/gae_backend_version")) + "." + string(mustGetMetadata("instance/attributes/gae_backend_minor_version")) +} + +func InstanceID() string { + if s := os.Getenv("GAE_MODULE_INSTANCE"); s != "" { + return s + } + return string(mustGetMetadata("instance/attributes/gae_backend_instance")) +} + +func partitionlessAppID() string { + // gae_project has everything except the partition prefix. + appID := os.Getenv("GAE_LONG_APP_ID") + if appID == "" { + appID = string(mustGetMetadata("instance/attributes/gae_project")) + } + return appID +} + +func fullyQualifiedAppID(_ netcontext.Context) string { + appID := partitionlessAppID() + + part := os.Getenv("GAE_PARTITION") + if part == "" { + part = string(mustGetMetadata("instance/attributes/gae_partition")) + } + + if part != "" { + appID = part + "~" + appID + } + return appID +} + +func IsDevAppServer() bool { + return os.Getenv("RUN_WITH_DEVAPPSERVER") != "" +} diff --git a/vendor/google.golang.org/appengine/internal/internal.go b/vendor/google.golang.org/appengine/internal/internal.go new file mode 100644 index 0000000000..051ea3980a --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/internal.go @@ -0,0 +1,110 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// Package internal provides support for package appengine. +// +// Programs should not use this package directly. Its API is not stable. +// Use packages appengine and appengine/* instead. +package internal + +import ( + "fmt" + + "github.com/golang/protobuf/proto" + + remotepb "google.golang.org/appengine/internal/remote_api" +) + +// errorCodeMaps is a map of service name to the error code map for the service. +var errorCodeMaps = make(map[string]map[int32]string) + +// RegisterErrorCodeMap is called from API implementations to register their +// error code map. This should only be called from init functions. +func RegisterErrorCodeMap(service string, m map[int32]string) { + errorCodeMaps[service] = m +} + +type timeoutCodeKey struct { + service string + code int32 +} + +// timeoutCodes is the set of service+code pairs that represent timeouts. +var timeoutCodes = make(map[timeoutCodeKey]bool) + +func RegisterTimeoutErrorCode(service string, code int32) { + timeoutCodes[timeoutCodeKey{service, code}] = true +} + +// APIError is the type returned by appengine.Context's Call method +// when an API call fails in an API-specific way. This may be, for instance, +// a taskqueue API call failing with TaskQueueServiceError::UNKNOWN_QUEUE. +type APIError struct { + Service string + Detail string + Code int32 // API-specific error code +} + +func (e *APIError) Error() string { + if e.Code == 0 { + if e.Detail == "" { + return "APIError " + } + return e.Detail + } + s := fmt.Sprintf("API error %d", e.Code) + if m, ok := errorCodeMaps[e.Service]; ok { + s += " (" + e.Service + ": " + m[e.Code] + ")" + } else { + // Shouldn't happen, but provide a bit more detail if it does. + s = e.Service + " " + s + } + if e.Detail != "" { + s += ": " + e.Detail + } + return s +} + +func (e *APIError) IsTimeout() bool { + return timeoutCodes[timeoutCodeKey{e.Service, e.Code}] +} + +// CallError is the type returned by appengine.Context's Call method when an +// API call fails in a generic way, such as RpcError::CAPABILITY_DISABLED. +type CallError struct { + Detail string + Code int32 + // TODO: Remove this if we get a distinguishable error code. + Timeout bool +} + +func (e *CallError) Error() string { + var msg string + switch remotepb.RpcError_ErrorCode(e.Code) { + case remotepb.RpcError_UNKNOWN: + return e.Detail + case remotepb.RpcError_OVER_QUOTA: + msg = "Over quota" + case remotepb.RpcError_CAPABILITY_DISABLED: + msg = "Capability disabled" + case remotepb.RpcError_CANCELLED: + msg = "Canceled" + default: + msg = fmt.Sprintf("Call error %d", e.Code) + } + s := msg + ": " + e.Detail + if e.Timeout { + s += " (timeout)" + } + return s +} + +func (e *CallError) IsTimeout() bool { + return e.Timeout +} + +// NamespaceMods is a map from API service to a function that will mutate an RPC request to attach a namespace. +// The function should be prepared to be called on the same message more than once; it should only modify the +// RPC request the first time. +var NamespaceMods = make(map[string]func(m proto.Message, namespace string)) diff --git a/vendor/google.golang.org/appengine/internal/log/log_service.pb.go b/vendor/google.golang.org/appengine/internal/log/log_service.pb.go new file mode 100644 index 0000000000..20c595be30 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/log/log_service.pb.go @@ -0,0 +1,899 @@ +// Code generated by protoc-gen-go. +// source: google.golang.org/appengine/internal/log/log_service.proto +// DO NOT EDIT! + +/* +Package log is a generated protocol buffer package. + +It is generated from these files: + google.golang.org/appengine/internal/log/log_service.proto + +It has these top-level messages: + LogServiceError + UserAppLogLine + UserAppLogGroup + FlushRequest + SetStatusRequest + LogOffset + LogLine + RequestLog + LogModuleVersion + LogReadRequest + LogReadResponse + LogUsageRecord + LogUsageRequest + LogUsageResponse +*/ +package log + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type LogServiceError_ErrorCode int32 + +const ( + LogServiceError_OK LogServiceError_ErrorCode = 0 + LogServiceError_INVALID_REQUEST LogServiceError_ErrorCode = 1 + LogServiceError_STORAGE_ERROR LogServiceError_ErrorCode = 2 +) + +var LogServiceError_ErrorCode_name = map[int32]string{ + 0: "OK", + 1: "INVALID_REQUEST", + 2: "STORAGE_ERROR", +} +var LogServiceError_ErrorCode_value = map[string]int32{ + "OK": 0, + "INVALID_REQUEST": 1, + "STORAGE_ERROR": 2, +} + +func (x LogServiceError_ErrorCode) Enum() *LogServiceError_ErrorCode { + p := new(LogServiceError_ErrorCode) + *p = x + return p +} +func (x LogServiceError_ErrorCode) String() string { + return proto.EnumName(LogServiceError_ErrorCode_name, int32(x)) +} +func (x *LogServiceError_ErrorCode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(LogServiceError_ErrorCode_value, data, "LogServiceError_ErrorCode") + if err != nil { + return err + } + *x = LogServiceError_ErrorCode(value) + return nil +} + +type LogServiceError struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogServiceError) Reset() { *m = LogServiceError{} } +func (m *LogServiceError) String() string { return proto.CompactTextString(m) } +func (*LogServiceError) ProtoMessage() {} + +type UserAppLogLine struct { + TimestampUsec *int64 `protobuf:"varint,1,req,name=timestamp_usec" json:"timestamp_usec,omitempty"` + Level *int64 `protobuf:"varint,2,req,name=level" json:"level,omitempty"` + Message *string `protobuf:"bytes,3,req,name=message" json:"message,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *UserAppLogLine) Reset() { *m = UserAppLogLine{} } +func (m *UserAppLogLine) String() string { return proto.CompactTextString(m) } +func (*UserAppLogLine) ProtoMessage() {} + +func (m *UserAppLogLine) GetTimestampUsec() int64 { + if m != nil && m.TimestampUsec != nil { + return *m.TimestampUsec + } + return 0 +} + +func (m *UserAppLogLine) GetLevel() int64 { + if m != nil && m.Level != nil { + return *m.Level + } + return 0 +} + +func (m *UserAppLogLine) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +type UserAppLogGroup struct { + LogLine []*UserAppLogLine `protobuf:"bytes,2,rep,name=log_line" json:"log_line,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *UserAppLogGroup) Reset() { *m = UserAppLogGroup{} } +func (m *UserAppLogGroup) String() string { return proto.CompactTextString(m) } +func (*UserAppLogGroup) ProtoMessage() {} + +func (m *UserAppLogGroup) GetLogLine() []*UserAppLogLine { + if m != nil { + return m.LogLine + } + return nil +} + +type FlushRequest struct { + Logs []byte `protobuf:"bytes,1,opt,name=logs" json:"logs,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FlushRequest) Reset() { *m = FlushRequest{} } +func (m *FlushRequest) String() string { return proto.CompactTextString(m) } +func (*FlushRequest) ProtoMessage() {} + +func (m *FlushRequest) GetLogs() []byte { + if m != nil { + return m.Logs + } + return nil +} + +type SetStatusRequest struct { + Status *string `protobuf:"bytes,1,req,name=status" json:"status,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SetStatusRequest) Reset() { *m = SetStatusRequest{} } +func (m *SetStatusRequest) String() string { return proto.CompactTextString(m) } +func (*SetStatusRequest) ProtoMessage() {} + +func (m *SetStatusRequest) GetStatus() string { + if m != nil && m.Status != nil { + return *m.Status + } + return "" +} + +type LogOffset struct { + RequestId []byte `protobuf:"bytes,1,opt,name=request_id" json:"request_id,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogOffset) Reset() { *m = LogOffset{} } +func (m *LogOffset) String() string { return proto.CompactTextString(m) } +func (*LogOffset) ProtoMessage() {} + +func (m *LogOffset) GetRequestId() []byte { + if m != nil { + return m.RequestId + } + return nil +} + +type LogLine struct { + Time *int64 `protobuf:"varint,1,req,name=time" json:"time,omitempty"` + Level *int32 `protobuf:"varint,2,req,name=level" json:"level,omitempty"` + LogMessage *string `protobuf:"bytes,3,req,name=log_message" json:"log_message,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogLine) Reset() { *m = LogLine{} } +func (m *LogLine) String() string { return proto.CompactTextString(m) } +func (*LogLine) ProtoMessage() {} + +func (m *LogLine) GetTime() int64 { + if m != nil && m.Time != nil { + return *m.Time + } + return 0 +} + +func (m *LogLine) GetLevel() int32 { + if m != nil && m.Level != nil { + return *m.Level + } + return 0 +} + +func (m *LogLine) GetLogMessage() string { + if m != nil && m.LogMessage != nil { + return *m.LogMessage + } + return "" +} + +type RequestLog struct { + AppId *string `protobuf:"bytes,1,req,name=app_id" json:"app_id,omitempty"` + ModuleId *string `protobuf:"bytes,37,opt,name=module_id,def=default" json:"module_id,omitempty"` + VersionId *string `protobuf:"bytes,2,req,name=version_id" json:"version_id,omitempty"` + RequestId []byte `protobuf:"bytes,3,req,name=request_id" json:"request_id,omitempty"` + Offset *LogOffset `protobuf:"bytes,35,opt,name=offset" json:"offset,omitempty"` + Ip *string `protobuf:"bytes,4,req,name=ip" json:"ip,omitempty"` + Nickname *string `protobuf:"bytes,5,opt,name=nickname" json:"nickname,omitempty"` + StartTime *int64 `protobuf:"varint,6,req,name=start_time" json:"start_time,omitempty"` + EndTime *int64 `protobuf:"varint,7,req,name=end_time" json:"end_time,omitempty"` + Latency *int64 `protobuf:"varint,8,req,name=latency" json:"latency,omitempty"` + Mcycles *int64 `protobuf:"varint,9,req,name=mcycles" json:"mcycles,omitempty"` + Method *string `protobuf:"bytes,10,req,name=method" json:"method,omitempty"` + Resource *string `protobuf:"bytes,11,req,name=resource" json:"resource,omitempty"` + HttpVersion *string `protobuf:"bytes,12,req,name=http_version" json:"http_version,omitempty"` + Status *int32 `protobuf:"varint,13,req,name=status" json:"status,omitempty"` + ResponseSize *int64 `protobuf:"varint,14,req,name=response_size" json:"response_size,omitempty"` + Referrer *string `protobuf:"bytes,15,opt,name=referrer" json:"referrer,omitempty"` + UserAgent *string `protobuf:"bytes,16,opt,name=user_agent" json:"user_agent,omitempty"` + UrlMapEntry *string `protobuf:"bytes,17,req,name=url_map_entry" json:"url_map_entry,omitempty"` + Combined *string `protobuf:"bytes,18,req,name=combined" json:"combined,omitempty"` + ApiMcycles *int64 `protobuf:"varint,19,opt,name=api_mcycles" json:"api_mcycles,omitempty"` + Host *string `protobuf:"bytes,20,opt,name=host" json:"host,omitempty"` + Cost *float64 `protobuf:"fixed64,21,opt,name=cost" json:"cost,omitempty"` + TaskQueueName *string `protobuf:"bytes,22,opt,name=task_queue_name" json:"task_queue_name,omitempty"` + TaskName *string `protobuf:"bytes,23,opt,name=task_name" json:"task_name,omitempty"` + WasLoadingRequest *bool `protobuf:"varint,24,opt,name=was_loading_request" json:"was_loading_request,omitempty"` + PendingTime *int64 `protobuf:"varint,25,opt,name=pending_time" json:"pending_time,omitempty"` + ReplicaIndex *int32 `protobuf:"varint,26,opt,name=replica_index,def=-1" json:"replica_index,omitempty"` + Finished *bool `protobuf:"varint,27,opt,name=finished,def=1" json:"finished,omitempty"` + CloneKey []byte `protobuf:"bytes,28,opt,name=clone_key" json:"clone_key,omitempty"` + Line []*LogLine `protobuf:"bytes,29,rep,name=line" json:"line,omitempty"` + LinesIncomplete *bool `protobuf:"varint,36,opt,name=lines_incomplete" json:"lines_incomplete,omitempty"` + AppEngineRelease []byte `protobuf:"bytes,38,opt,name=app_engine_release" json:"app_engine_release,omitempty"` + ExitReason *int32 `protobuf:"varint,30,opt,name=exit_reason" json:"exit_reason,omitempty"` + WasThrottledForTime *bool `protobuf:"varint,31,opt,name=was_throttled_for_time" json:"was_throttled_for_time,omitempty"` + WasThrottledForRequests *bool `protobuf:"varint,32,opt,name=was_throttled_for_requests" json:"was_throttled_for_requests,omitempty"` + ThrottledTime *int64 `protobuf:"varint,33,opt,name=throttled_time" json:"throttled_time,omitempty"` + ServerName []byte `protobuf:"bytes,34,opt,name=server_name" json:"server_name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *RequestLog) Reset() { *m = RequestLog{} } +func (m *RequestLog) String() string { return proto.CompactTextString(m) } +func (*RequestLog) ProtoMessage() {} + +const Default_RequestLog_ModuleId string = "default" +const Default_RequestLog_ReplicaIndex int32 = -1 +const Default_RequestLog_Finished bool = true + +func (m *RequestLog) GetAppId() string { + if m != nil && m.AppId != nil { + return *m.AppId + } + return "" +} + +func (m *RequestLog) GetModuleId() string { + if m != nil && m.ModuleId != nil { + return *m.ModuleId + } + return Default_RequestLog_ModuleId +} + +func (m *RequestLog) GetVersionId() string { + if m != nil && m.VersionId != nil { + return *m.VersionId + } + return "" +} + +func (m *RequestLog) GetRequestId() []byte { + if m != nil { + return m.RequestId + } + return nil +} + +func (m *RequestLog) GetOffset() *LogOffset { + if m != nil { + return m.Offset + } + return nil +} + +func (m *RequestLog) GetIp() string { + if m != nil && m.Ip != nil { + return *m.Ip + } + return "" +} + +func (m *RequestLog) GetNickname() string { + if m != nil && m.Nickname != nil { + return *m.Nickname + } + return "" +} + +func (m *RequestLog) GetStartTime() int64 { + if m != nil && m.StartTime != nil { + return *m.StartTime + } + return 0 +} + +func (m *RequestLog) GetEndTime() int64 { + if m != nil && m.EndTime != nil { + return *m.EndTime + } + return 0 +} + +func (m *RequestLog) GetLatency() int64 { + if m != nil && m.Latency != nil { + return *m.Latency + } + return 0 +} + +func (m *RequestLog) GetMcycles() int64 { + if m != nil && m.Mcycles != nil { + return *m.Mcycles + } + return 0 +} + +func (m *RequestLog) GetMethod() string { + if m != nil && m.Method != nil { + return *m.Method + } + return "" +} + +func (m *RequestLog) GetResource() string { + if m != nil && m.Resource != nil { + return *m.Resource + } + return "" +} + +func (m *RequestLog) GetHttpVersion() string { + if m != nil && m.HttpVersion != nil { + return *m.HttpVersion + } + return "" +} + +func (m *RequestLog) GetStatus() int32 { + if m != nil && m.Status != nil { + return *m.Status + } + return 0 +} + +func (m *RequestLog) GetResponseSize() int64 { + if m != nil && m.ResponseSize != nil { + return *m.ResponseSize + } + return 0 +} + +func (m *RequestLog) GetReferrer() string { + if m != nil && m.Referrer != nil { + return *m.Referrer + } + return "" +} + +func (m *RequestLog) GetUserAgent() string { + if m != nil && m.UserAgent != nil { + return *m.UserAgent + } + return "" +} + +func (m *RequestLog) GetUrlMapEntry() string { + if m != nil && m.UrlMapEntry != nil { + return *m.UrlMapEntry + } + return "" +} + +func (m *RequestLog) GetCombined() string { + if m != nil && m.Combined != nil { + return *m.Combined + } + return "" +} + +func (m *RequestLog) GetApiMcycles() int64 { + if m != nil && m.ApiMcycles != nil { + return *m.ApiMcycles + } + return 0 +} + +func (m *RequestLog) GetHost() string { + if m != nil && m.Host != nil { + return *m.Host + } + return "" +} + +func (m *RequestLog) GetCost() float64 { + if m != nil && m.Cost != nil { + return *m.Cost + } + return 0 +} + +func (m *RequestLog) GetTaskQueueName() string { + if m != nil && m.TaskQueueName != nil { + return *m.TaskQueueName + } + return "" +} + +func (m *RequestLog) GetTaskName() string { + if m != nil && m.TaskName != nil { + return *m.TaskName + } + return "" +} + +func (m *RequestLog) GetWasLoadingRequest() bool { + if m != nil && m.WasLoadingRequest != nil { + return *m.WasLoadingRequest + } + return false +} + +func (m *RequestLog) GetPendingTime() int64 { + if m != nil && m.PendingTime != nil { + return *m.PendingTime + } + return 0 +} + +func (m *RequestLog) GetReplicaIndex() int32 { + if m != nil && m.ReplicaIndex != nil { + return *m.ReplicaIndex + } + return Default_RequestLog_ReplicaIndex +} + +func (m *RequestLog) GetFinished() bool { + if m != nil && m.Finished != nil { + return *m.Finished + } + return Default_RequestLog_Finished +} + +func (m *RequestLog) GetCloneKey() []byte { + if m != nil { + return m.CloneKey + } + return nil +} + +func (m *RequestLog) GetLine() []*LogLine { + if m != nil { + return m.Line + } + return nil +} + +func (m *RequestLog) GetLinesIncomplete() bool { + if m != nil && m.LinesIncomplete != nil { + return *m.LinesIncomplete + } + return false +} + +func (m *RequestLog) GetAppEngineRelease() []byte { + if m != nil { + return m.AppEngineRelease + } + return nil +} + +func (m *RequestLog) GetExitReason() int32 { + if m != nil && m.ExitReason != nil { + return *m.ExitReason + } + return 0 +} + +func (m *RequestLog) GetWasThrottledForTime() bool { + if m != nil && m.WasThrottledForTime != nil { + return *m.WasThrottledForTime + } + return false +} + +func (m *RequestLog) GetWasThrottledForRequests() bool { + if m != nil && m.WasThrottledForRequests != nil { + return *m.WasThrottledForRequests + } + return false +} + +func (m *RequestLog) GetThrottledTime() int64 { + if m != nil && m.ThrottledTime != nil { + return *m.ThrottledTime + } + return 0 +} + +func (m *RequestLog) GetServerName() []byte { + if m != nil { + return m.ServerName + } + return nil +} + +type LogModuleVersion struct { + ModuleId *string `protobuf:"bytes,1,opt,name=module_id,def=default" json:"module_id,omitempty"` + VersionId *string `protobuf:"bytes,2,opt,name=version_id" json:"version_id,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogModuleVersion) Reset() { *m = LogModuleVersion{} } +func (m *LogModuleVersion) String() string { return proto.CompactTextString(m) } +func (*LogModuleVersion) ProtoMessage() {} + +const Default_LogModuleVersion_ModuleId string = "default" + +func (m *LogModuleVersion) GetModuleId() string { + if m != nil && m.ModuleId != nil { + return *m.ModuleId + } + return Default_LogModuleVersion_ModuleId +} + +func (m *LogModuleVersion) GetVersionId() string { + if m != nil && m.VersionId != nil { + return *m.VersionId + } + return "" +} + +type LogReadRequest struct { + AppId *string `protobuf:"bytes,1,req,name=app_id" json:"app_id,omitempty"` + VersionId []string `protobuf:"bytes,2,rep,name=version_id" json:"version_id,omitempty"` + ModuleVersion []*LogModuleVersion `protobuf:"bytes,19,rep,name=module_version" json:"module_version,omitempty"` + StartTime *int64 `protobuf:"varint,3,opt,name=start_time" json:"start_time,omitempty"` + EndTime *int64 `protobuf:"varint,4,opt,name=end_time" json:"end_time,omitempty"` + Offset *LogOffset `protobuf:"bytes,5,opt,name=offset" json:"offset,omitempty"` + RequestId [][]byte `protobuf:"bytes,6,rep,name=request_id" json:"request_id,omitempty"` + MinimumLogLevel *int32 `protobuf:"varint,7,opt,name=minimum_log_level" json:"minimum_log_level,omitempty"` + IncludeIncomplete *bool `protobuf:"varint,8,opt,name=include_incomplete" json:"include_incomplete,omitempty"` + Count *int64 `protobuf:"varint,9,opt,name=count" json:"count,omitempty"` + CombinedLogRegex *string `protobuf:"bytes,14,opt,name=combined_log_regex" json:"combined_log_regex,omitempty"` + HostRegex *string `protobuf:"bytes,15,opt,name=host_regex" json:"host_regex,omitempty"` + ReplicaIndex *int32 `protobuf:"varint,16,opt,name=replica_index" json:"replica_index,omitempty"` + IncludeAppLogs *bool `protobuf:"varint,10,opt,name=include_app_logs" json:"include_app_logs,omitempty"` + AppLogsPerRequest *int32 `protobuf:"varint,17,opt,name=app_logs_per_request" json:"app_logs_per_request,omitempty"` + IncludeHost *bool `protobuf:"varint,11,opt,name=include_host" json:"include_host,omitempty"` + IncludeAll *bool `protobuf:"varint,12,opt,name=include_all" json:"include_all,omitempty"` + CacheIterator *bool `protobuf:"varint,13,opt,name=cache_iterator" json:"cache_iterator,omitempty"` + NumShards *int32 `protobuf:"varint,18,opt,name=num_shards" json:"num_shards,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogReadRequest) Reset() { *m = LogReadRequest{} } +func (m *LogReadRequest) String() string { return proto.CompactTextString(m) } +func (*LogReadRequest) ProtoMessage() {} + +func (m *LogReadRequest) GetAppId() string { + if m != nil && m.AppId != nil { + return *m.AppId + } + return "" +} + +func (m *LogReadRequest) GetVersionId() []string { + if m != nil { + return m.VersionId + } + return nil +} + +func (m *LogReadRequest) GetModuleVersion() []*LogModuleVersion { + if m != nil { + return m.ModuleVersion + } + return nil +} + +func (m *LogReadRequest) GetStartTime() int64 { + if m != nil && m.StartTime != nil { + return *m.StartTime + } + return 0 +} + +func (m *LogReadRequest) GetEndTime() int64 { + if m != nil && m.EndTime != nil { + return *m.EndTime + } + return 0 +} + +func (m *LogReadRequest) GetOffset() *LogOffset { + if m != nil { + return m.Offset + } + return nil +} + +func (m *LogReadRequest) GetRequestId() [][]byte { + if m != nil { + return m.RequestId + } + return nil +} + +func (m *LogReadRequest) GetMinimumLogLevel() int32 { + if m != nil && m.MinimumLogLevel != nil { + return *m.MinimumLogLevel + } + return 0 +} + +func (m *LogReadRequest) GetIncludeIncomplete() bool { + if m != nil && m.IncludeIncomplete != nil { + return *m.IncludeIncomplete + } + return false +} + +func (m *LogReadRequest) GetCount() int64 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +func (m *LogReadRequest) GetCombinedLogRegex() string { + if m != nil && m.CombinedLogRegex != nil { + return *m.CombinedLogRegex + } + return "" +} + +func (m *LogReadRequest) GetHostRegex() string { + if m != nil && m.HostRegex != nil { + return *m.HostRegex + } + return "" +} + +func (m *LogReadRequest) GetReplicaIndex() int32 { + if m != nil && m.ReplicaIndex != nil { + return *m.ReplicaIndex + } + return 0 +} + +func (m *LogReadRequest) GetIncludeAppLogs() bool { + if m != nil && m.IncludeAppLogs != nil { + return *m.IncludeAppLogs + } + return false +} + +func (m *LogReadRequest) GetAppLogsPerRequest() int32 { + if m != nil && m.AppLogsPerRequest != nil { + return *m.AppLogsPerRequest + } + return 0 +} + +func (m *LogReadRequest) GetIncludeHost() bool { + if m != nil && m.IncludeHost != nil { + return *m.IncludeHost + } + return false +} + +func (m *LogReadRequest) GetIncludeAll() bool { + if m != nil && m.IncludeAll != nil { + return *m.IncludeAll + } + return false +} + +func (m *LogReadRequest) GetCacheIterator() bool { + if m != nil && m.CacheIterator != nil { + return *m.CacheIterator + } + return false +} + +func (m *LogReadRequest) GetNumShards() int32 { + if m != nil && m.NumShards != nil { + return *m.NumShards + } + return 0 +} + +type LogReadResponse struct { + Log []*RequestLog `protobuf:"bytes,1,rep,name=log" json:"log,omitempty"` + Offset *LogOffset `protobuf:"bytes,2,opt,name=offset" json:"offset,omitempty"` + LastEndTime *int64 `protobuf:"varint,3,opt,name=last_end_time" json:"last_end_time,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogReadResponse) Reset() { *m = LogReadResponse{} } +func (m *LogReadResponse) String() string { return proto.CompactTextString(m) } +func (*LogReadResponse) ProtoMessage() {} + +func (m *LogReadResponse) GetLog() []*RequestLog { + if m != nil { + return m.Log + } + return nil +} + +func (m *LogReadResponse) GetOffset() *LogOffset { + if m != nil { + return m.Offset + } + return nil +} + +func (m *LogReadResponse) GetLastEndTime() int64 { + if m != nil && m.LastEndTime != nil { + return *m.LastEndTime + } + return 0 +} + +type LogUsageRecord struct { + VersionId *string `protobuf:"bytes,1,opt,name=version_id" json:"version_id,omitempty"` + StartTime *int32 `protobuf:"varint,2,opt,name=start_time" json:"start_time,omitempty"` + EndTime *int32 `protobuf:"varint,3,opt,name=end_time" json:"end_time,omitempty"` + Count *int64 `protobuf:"varint,4,opt,name=count" json:"count,omitempty"` + TotalSize *int64 `protobuf:"varint,5,opt,name=total_size" json:"total_size,omitempty"` + Records *int32 `protobuf:"varint,6,opt,name=records" json:"records,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogUsageRecord) Reset() { *m = LogUsageRecord{} } +func (m *LogUsageRecord) String() string { return proto.CompactTextString(m) } +func (*LogUsageRecord) ProtoMessage() {} + +func (m *LogUsageRecord) GetVersionId() string { + if m != nil && m.VersionId != nil { + return *m.VersionId + } + return "" +} + +func (m *LogUsageRecord) GetStartTime() int32 { + if m != nil && m.StartTime != nil { + return *m.StartTime + } + return 0 +} + +func (m *LogUsageRecord) GetEndTime() int32 { + if m != nil && m.EndTime != nil { + return *m.EndTime + } + return 0 +} + +func (m *LogUsageRecord) GetCount() int64 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +func (m *LogUsageRecord) GetTotalSize() int64 { + if m != nil && m.TotalSize != nil { + return *m.TotalSize + } + return 0 +} + +func (m *LogUsageRecord) GetRecords() int32 { + if m != nil && m.Records != nil { + return *m.Records + } + return 0 +} + +type LogUsageRequest struct { + AppId *string `protobuf:"bytes,1,req,name=app_id" json:"app_id,omitempty"` + VersionId []string `protobuf:"bytes,2,rep,name=version_id" json:"version_id,omitempty"` + StartTime *int32 `protobuf:"varint,3,opt,name=start_time" json:"start_time,omitempty"` + EndTime *int32 `protobuf:"varint,4,opt,name=end_time" json:"end_time,omitempty"` + ResolutionHours *uint32 `protobuf:"varint,5,opt,name=resolution_hours,def=1" json:"resolution_hours,omitempty"` + CombineVersions *bool `protobuf:"varint,6,opt,name=combine_versions" json:"combine_versions,omitempty"` + UsageVersion *int32 `protobuf:"varint,7,opt,name=usage_version" json:"usage_version,omitempty"` + VersionsOnly *bool `protobuf:"varint,8,opt,name=versions_only" json:"versions_only,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogUsageRequest) Reset() { *m = LogUsageRequest{} } +func (m *LogUsageRequest) String() string { return proto.CompactTextString(m) } +func (*LogUsageRequest) ProtoMessage() {} + +const Default_LogUsageRequest_ResolutionHours uint32 = 1 + +func (m *LogUsageRequest) GetAppId() string { + if m != nil && m.AppId != nil { + return *m.AppId + } + return "" +} + +func (m *LogUsageRequest) GetVersionId() []string { + if m != nil { + return m.VersionId + } + return nil +} + +func (m *LogUsageRequest) GetStartTime() int32 { + if m != nil && m.StartTime != nil { + return *m.StartTime + } + return 0 +} + +func (m *LogUsageRequest) GetEndTime() int32 { + if m != nil && m.EndTime != nil { + return *m.EndTime + } + return 0 +} + +func (m *LogUsageRequest) GetResolutionHours() uint32 { + if m != nil && m.ResolutionHours != nil { + return *m.ResolutionHours + } + return Default_LogUsageRequest_ResolutionHours +} + +func (m *LogUsageRequest) GetCombineVersions() bool { + if m != nil && m.CombineVersions != nil { + return *m.CombineVersions + } + return false +} + +func (m *LogUsageRequest) GetUsageVersion() int32 { + if m != nil && m.UsageVersion != nil { + return *m.UsageVersion + } + return 0 +} + +func (m *LogUsageRequest) GetVersionsOnly() bool { + if m != nil && m.VersionsOnly != nil { + return *m.VersionsOnly + } + return false +} + +type LogUsageResponse struct { + Usage []*LogUsageRecord `protobuf:"bytes,1,rep,name=usage" json:"usage,omitempty"` + Summary *LogUsageRecord `protobuf:"bytes,2,opt,name=summary" json:"summary,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogUsageResponse) Reset() { *m = LogUsageResponse{} } +func (m *LogUsageResponse) String() string { return proto.CompactTextString(m) } +func (*LogUsageResponse) ProtoMessage() {} + +func (m *LogUsageResponse) GetUsage() []*LogUsageRecord { + if m != nil { + return m.Usage + } + return nil +} + +func (m *LogUsageResponse) GetSummary() *LogUsageRecord { + if m != nil { + return m.Summary + } + return nil +} + +func init() { +} diff --git a/vendor/google.golang.org/appengine/internal/log/log_service.proto b/vendor/google.golang.org/appengine/internal/log/log_service.proto new file mode 100644 index 0000000000..8981dc4757 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/log/log_service.proto @@ -0,0 +1,150 @@ +syntax = "proto2"; +option go_package = "log"; + +package appengine; + +message LogServiceError { + enum ErrorCode { + OK = 0; + INVALID_REQUEST = 1; + STORAGE_ERROR = 2; + } +} + +message UserAppLogLine { + required int64 timestamp_usec = 1; + required int64 level = 2; + required string message = 3; +} + +message UserAppLogGroup { + repeated UserAppLogLine log_line = 2; +} + +message FlushRequest { + optional bytes logs = 1; +} + +message SetStatusRequest { + required string status = 1; +} + + +message LogOffset { + optional bytes request_id = 1; +} + +message LogLine { + required int64 time = 1; + required int32 level = 2; + required string log_message = 3; +} + +message RequestLog { + required string app_id = 1; + optional string module_id = 37 [default="default"]; + required string version_id = 2; + required bytes request_id = 3; + optional LogOffset offset = 35; + required string ip = 4; + optional string nickname = 5; + required int64 start_time = 6; + required int64 end_time = 7; + required int64 latency = 8; + required int64 mcycles = 9; + required string method = 10; + required string resource = 11; + required string http_version = 12; + required int32 status = 13; + required int64 response_size = 14; + optional string referrer = 15; + optional string user_agent = 16; + required string url_map_entry = 17; + required string combined = 18; + optional int64 api_mcycles = 19; + optional string host = 20; + optional double cost = 21; + + optional string task_queue_name = 22; + optional string task_name = 23; + + optional bool was_loading_request = 24; + optional int64 pending_time = 25; + optional int32 replica_index = 26 [default = -1]; + optional bool finished = 27 [default = true]; + optional bytes clone_key = 28; + + repeated LogLine line = 29; + + optional bool lines_incomplete = 36; + optional bytes app_engine_release = 38; + + optional int32 exit_reason = 30; + optional bool was_throttled_for_time = 31; + optional bool was_throttled_for_requests = 32; + optional int64 throttled_time = 33; + + optional bytes server_name = 34; +} + +message LogModuleVersion { + optional string module_id = 1 [default="default"]; + optional string version_id = 2; +} + +message LogReadRequest { + required string app_id = 1; + repeated string version_id = 2; + repeated LogModuleVersion module_version = 19; + + optional int64 start_time = 3; + optional int64 end_time = 4; + optional LogOffset offset = 5; + repeated bytes request_id = 6; + + optional int32 minimum_log_level = 7; + optional bool include_incomplete = 8; + optional int64 count = 9; + + optional string combined_log_regex = 14; + optional string host_regex = 15; + optional int32 replica_index = 16; + + optional bool include_app_logs = 10; + optional int32 app_logs_per_request = 17; + optional bool include_host = 11; + optional bool include_all = 12; + optional bool cache_iterator = 13; + optional int32 num_shards = 18; +} + +message LogReadResponse { + repeated RequestLog log = 1; + optional LogOffset offset = 2; + optional int64 last_end_time = 3; +} + +message LogUsageRecord { + optional string version_id = 1; + optional int32 start_time = 2; + optional int32 end_time = 3; + optional int64 count = 4; + optional int64 total_size = 5; + optional int32 records = 6; +} + +message LogUsageRequest { + required string app_id = 1; + repeated string version_id = 2; + optional int32 start_time = 3; + optional int32 end_time = 4; + optional uint32 resolution_hours = 5 [default = 1]; + optional bool combine_versions = 6; + optional int32 usage_version = 7; + optional bool versions_only = 8; +} + +message LogUsageResponse { + repeated LogUsageRecord usage = 1; + optional LogUsageRecord summary = 2; +} diff --git a/vendor/google.golang.org/appengine/internal/main.go b/vendor/google.golang.org/appengine/internal/main.go new file mode 100644 index 0000000000..49036163c2 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/main.go @@ -0,0 +1,15 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build appengine + +package internal + +import ( + "appengine_internal" +) + +func Main() { + appengine_internal.Main() +} diff --git a/vendor/google.golang.org/appengine/internal/main_vm.go b/vendor/google.golang.org/appengine/internal/main_vm.go new file mode 100644 index 0000000000..57331ad171 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/main_vm.go @@ -0,0 +1,44 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build !appengine + +package internal + +import ( + "io" + "log" + "net/http" + "net/url" + "os" +) + +func Main() { + installHealthChecker(http.DefaultServeMux) + + port := "8080" + if s := os.Getenv("PORT"); s != "" { + port = s + } + + if err := http.ListenAndServe(":"+port, http.HandlerFunc(handleHTTP)); err != nil { + log.Fatalf("http.ListenAndServe: %v", err) + } +} + +func installHealthChecker(mux *http.ServeMux) { + // If no health check handler has been installed by this point, add a trivial one. + const healthPath = "/_ah/health" + hreq := &http.Request{ + Method: "GET", + URL: &url.URL{ + Path: healthPath, + }, + } + if _, pat := mux.Handler(hreq); pat != healthPath { + mux.HandleFunc(healthPath, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, "ok") + }) + } +} diff --git a/vendor/google.golang.org/appengine/internal/metadata.go b/vendor/google.golang.org/appengine/internal/metadata.go new file mode 100644 index 0000000000..9cc1f71d10 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/metadata.go @@ -0,0 +1,61 @@ +// Copyright 2014 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package internal + +// This file has code for accessing metadata. +// +// References: +// https://cloud.google.com/compute/docs/metadata + +import ( + "fmt" + "io/ioutil" + "log" + "net/http" + "net/url" +) + +const ( + metadataHost = "metadata" + metadataPath = "/computeMetadata/v1/" +) + +var ( + metadataRequestHeaders = http.Header{ + "Metadata-Flavor": []string{"Google"}, + } +) + +// TODO(dsymonds): Do we need to support default values, like Python? +func mustGetMetadata(key string) []byte { + b, err := getMetadata(key) + if err != nil { + log.Fatalf("Metadata fetch failed: %v", err) + } + return b +} + +func getMetadata(key string) ([]byte, error) { + // TODO(dsymonds): May need to use url.Parse to support keys with query args. + req := &http.Request{ + Method: "GET", + URL: &url.URL{ + Scheme: "http", + Host: metadataHost, + Path: metadataPath + key, + }, + Header: metadataRequestHeaders, + Host: metadataHost, + } + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + if resp.StatusCode != 200 { + return nil, fmt.Errorf("metadata server returned HTTP %d", resp.StatusCode) + } + return ioutil.ReadAll(resp.Body) +} diff --git a/vendor/google.golang.org/appengine/internal/modules/modules_service.pb.go b/vendor/google.golang.org/appengine/internal/modules/modules_service.pb.go new file mode 100644 index 0000000000..a0145ed317 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/modules/modules_service.pb.go @@ -0,0 +1,375 @@ +// Code generated by protoc-gen-go. +// source: google.golang.org/appengine/internal/modules/modules_service.proto +// DO NOT EDIT! + +/* +Package modules is a generated protocol buffer package. + +It is generated from these files: + google.golang.org/appengine/internal/modules/modules_service.proto + +It has these top-level messages: + ModulesServiceError + GetModulesRequest + GetModulesResponse + GetVersionsRequest + GetVersionsResponse + GetDefaultVersionRequest + GetDefaultVersionResponse + GetNumInstancesRequest + GetNumInstancesResponse + SetNumInstancesRequest + SetNumInstancesResponse + StartModuleRequest + StartModuleResponse + StopModuleRequest + StopModuleResponse + GetHostnameRequest + GetHostnameResponse +*/ +package modules + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type ModulesServiceError_ErrorCode int32 + +const ( + ModulesServiceError_OK ModulesServiceError_ErrorCode = 0 + ModulesServiceError_INVALID_MODULE ModulesServiceError_ErrorCode = 1 + ModulesServiceError_INVALID_VERSION ModulesServiceError_ErrorCode = 2 + ModulesServiceError_INVALID_INSTANCES ModulesServiceError_ErrorCode = 3 + ModulesServiceError_TRANSIENT_ERROR ModulesServiceError_ErrorCode = 4 + ModulesServiceError_UNEXPECTED_STATE ModulesServiceError_ErrorCode = 5 +) + +var ModulesServiceError_ErrorCode_name = map[int32]string{ + 0: "OK", + 1: "INVALID_MODULE", + 2: "INVALID_VERSION", + 3: "INVALID_INSTANCES", + 4: "TRANSIENT_ERROR", + 5: "UNEXPECTED_STATE", +} +var ModulesServiceError_ErrorCode_value = map[string]int32{ + "OK": 0, + "INVALID_MODULE": 1, + "INVALID_VERSION": 2, + "INVALID_INSTANCES": 3, + "TRANSIENT_ERROR": 4, + "UNEXPECTED_STATE": 5, +} + +func (x ModulesServiceError_ErrorCode) Enum() *ModulesServiceError_ErrorCode { + p := new(ModulesServiceError_ErrorCode) + *p = x + return p +} +func (x ModulesServiceError_ErrorCode) String() string { + return proto.EnumName(ModulesServiceError_ErrorCode_name, int32(x)) +} +func (x *ModulesServiceError_ErrorCode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(ModulesServiceError_ErrorCode_value, data, "ModulesServiceError_ErrorCode") + if err != nil { + return err + } + *x = ModulesServiceError_ErrorCode(value) + return nil +} + +type ModulesServiceError struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *ModulesServiceError) Reset() { *m = ModulesServiceError{} } +func (m *ModulesServiceError) String() string { return proto.CompactTextString(m) } +func (*ModulesServiceError) ProtoMessage() {} + +type GetModulesRequest struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetModulesRequest) Reset() { *m = GetModulesRequest{} } +func (m *GetModulesRequest) String() string { return proto.CompactTextString(m) } +func (*GetModulesRequest) ProtoMessage() {} + +type GetModulesResponse struct { + Module []string `protobuf:"bytes,1,rep,name=module" json:"module,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetModulesResponse) Reset() { *m = GetModulesResponse{} } +func (m *GetModulesResponse) String() string { return proto.CompactTextString(m) } +func (*GetModulesResponse) ProtoMessage() {} + +func (m *GetModulesResponse) GetModule() []string { + if m != nil { + return m.Module + } + return nil +} + +type GetVersionsRequest struct { + Module *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetVersionsRequest) Reset() { *m = GetVersionsRequest{} } +func (m *GetVersionsRequest) String() string { return proto.CompactTextString(m) } +func (*GetVersionsRequest) ProtoMessage() {} + +func (m *GetVersionsRequest) GetModule() string { + if m != nil && m.Module != nil { + return *m.Module + } + return "" +} + +type GetVersionsResponse struct { + Version []string `protobuf:"bytes,1,rep,name=version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetVersionsResponse) Reset() { *m = GetVersionsResponse{} } +func (m *GetVersionsResponse) String() string { return proto.CompactTextString(m) } +func (*GetVersionsResponse) ProtoMessage() {} + +func (m *GetVersionsResponse) GetVersion() []string { + if m != nil { + return m.Version + } + return nil +} + +type GetDefaultVersionRequest struct { + Module *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetDefaultVersionRequest) Reset() { *m = GetDefaultVersionRequest{} } +func (m *GetDefaultVersionRequest) String() string { return proto.CompactTextString(m) } +func (*GetDefaultVersionRequest) ProtoMessage() {} + +func (m *GetDefaultVersionRequest) GetModule() string { + if m != nil && m.Module != nil { + return *m.Module + } + return "" +} + +type GetDefaultVersionResponse struct { + Version *string `protobuf:"bytes,1,req,name=version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetDefaultVersionResponse) Reset() { *m = GetDefaultVersionResponse{} } +func (m *GetDefaultVersionResponse) String() string { return proto.CompactTextString(m) } +func (*GetDefaultVersionResponse) ProtoMessage() {} + +func (m *GetDefaultVersionResponse) GetVersion() string { + if m != nil && m.Version != nil { + return *m.Version + } + return "" +} + +type GetNumInstancesRequest struct { + Module *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"` + Version *string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetNumInstancesRequest) Reset() { *m = GetNumInstancesRequest{} } +func (m *GetNumInstancesRequest) String() string { return proto.CompactTextString(m) } +func (*GetNumInstancesRequest) ProtoMessage() {} + +func (m *GetNumInstancesRequest) GetModule() string { + if m != nil && m.Module != nil { + return *m.Module + } + return "" +} + +func (m *GetNumInstancesRequest) GetVersion() string { + if m != nil && m.Version != nil { + return *m.Version + } + return "" +} + +type GetNumInstancesResponse struct { + Instances *int64 `protobuf:"varint,1,req,name=instances" json:"instances,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetNumInstancesResponse) Reset() { *m = GetNumInstancesResponse{} } +func (m *GetNumInstancesResponse) String() string { return proto.CompactTextString(m) } +func (*GetNumInstancesResponse) ProtoMessage() {} + +func (m *GetNumInstancesResponse) GetInstances() int64 { + if m != nil && m.Instances != nil { + return *m.Instances + } + return 0 +} + +type SetNumInstancesRequest struct { + Module *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"` + Version *string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"` + Instances *int64 `protobuf:"varint,3,req,name=instances" json:"instances,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SetNumInstancesRequest) Reset() { *m = SetNumInstancesRequest{} } +func (m *SetNumInstancesRequest) String() string { return proto.CompactTextString(m) } +func (*SetNumInstancesRequest) ProtoMessage() {} + +func (m *SetNumInstancesRequest) GetModule() string { + if m != nil && m.Module != nil { + return *m.Module + } + return "" +} + +func (m *SetNumInstancesRequest) GetVersion() string { + if m != nil && m.Version != nil { + return *m.Version + } + return "" +} + +func (m *SetNumInstancesRequest) GetInstances() int64 { + if m != nil && m.Instances != nil { + return *m.Instances + } + return 0 +} + +type SetNumInstancesResponse struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *SetNumInstancesResponse) Reset() { *m = SetNumInstancesResponse{} } +func (m *SetNumInstancesResponse) String() string { return proto.CompactTextString(m) } +func (*SetNumInstancesResponse) ProtoMessage() {} + +type StartModuleRequest struct { + Module *string `protobuf:"bytes,1,req,name=module" json:"module,omitempty"` + Version *string `protobuf:"bytes,2,req,name=version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *StartModuleRequest) Reset() { *m = StartModuleRequest{} } +func (m *StartModuleRequest) String() string { return proto.CompactTextString(m) } +func (*StartModuleRequest) ProtoMessage() {} + +func (m *StartModuleRequest) GetModule() string { + if m != nil && m.Module != nil { + return *m.Module + } + return "" +} + +func (m *StartModuleRequest) GetVersion() string { + if m != nil && m.Version != nil { + return *m.Version + } + return "" +} + +type StartModuleResponse struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *StartModuleResponse) Reset() { *m = StartModuleResponse{} } +func (m *StartModuleResponse) String() string { return proto.CompactTextString(m) } +func (*StartModuleResponse) ProtoMessage() {} + +type StopModuleRequest struct { + Module *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"` + Version *string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *StopModuleRequest) Reset() { *m = StopModuleRequest{} } +func (m *StopModuleRequest) String() string { return proto.CompactTextString(m) } +func (*StopModuleRequest) ProtoMessage() {} + +func (m *StopModuleRequest) GetModule() string { + if m != nil && m.Module != nil { + return *m.Module + } + return "" +} + +func (m *StopModuleRequest) GetVersion() string { + if m != nil && m.Version != nil { + return *m.Version + } + return "" +} + +type StopModuleResponse struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *StopModuleResponse) Reset() { *m = StopModuleResponse{} } +func (m *StopModuleResponse) String() string { return proto.CompactTextString(m) } +func (*StopModuleResponse) ProtoMessage() {} + +type GetHostnameRequest struct { + Module *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"` + Version *string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"` + Instance *string `protobuf:"bytes,3,opt,name=instance" json:"instance,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetHostnameRequest) Reset() { *m = GetHostnameRequest{} } +func (m *GetHostnameRequest) String() string { return proto.CompactTextString(m) } +func (*GetHostnameRequest) ProtoMessage() {} + +func (m *GetHostnameRequest) GetModule() string { + if m != nil && m.Module != nil { + return *m.Module + } + return "" +} + +func (m *GetHostnameRequest) GetVersion() string { + if m != nil && m.Version != nil { + return *m.Version + } + return "" +} + +func (m *GetHostnameRequest) GetInstance() string { + if m != nil && m.Instance != nil { + return *m.Instance + } + return "" +} + +type GetHostnameResponse struct { + Hostname *string `protobuf:"bytes,1,req,name=hostname" json:"hostname,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetHostnameResponse) Reset() { *m = GetHostnameResponse{} } +func (m *GetHostnameResponse) String() string { return proto.CompactTextString(m) } +func (*GetHostnameResponse) ProtoMessage() {} + +func (m *GetHostnameResponse) GetHostname() string { + if m != nil && m.Hostname != nil { + return *m.Hostname + } + return "" +} + +func init() { +} diff --git a/vendor/google.golang.org/appengine/internal/modules/modules_service.proto b/vendor/google.golang.org/appengine/internal/modules/modules_service.proto new file mode 100644 index 0000000000..d29f0065a2 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/modules/modules_service.proto @@ -0,0 +1,80 @@ +syntax = "proto2"; +option go_package = "modules"; + +package appengine; + +message ModulesServiceError { + enum ErrorCode { + OK = 0; + INVALID_MODULE = 1; + INVALID_VERSION = 2; + INVALID_INSTANCES = 3; + TRANSIENT_ERROR = 4; + UNEXPECTED_STATE = 5; + } +} + +message GetModulesRequest { +} + +message GetModulesResponse { + repeated string module = 1; +} + +message GetVersionsRequest { + optional string module = 1; +} + +message GetVersionsResponse { + repeated string version = 1; +} + +message GetDefaultVersionRequest { + optional string module = 1; +} + +message GetDefaultVersionResponse { + required string version = 1; +} + +message GetNumInstancesRequest { + optional string module = 1; + optional string version = 2; +} + +message GetNumInstancesResponse { + required int64 instances = 1; +} + +message SetNumInstancesRequest { + optional string module = 1; + optional string version = 2; + required int64 instances = 3; +} + +message SetNumInstancesResponse {} + +message StartModuleRequest { + required string module = 1; + required string version = 2; +} + +message StartModuleResponse {} + +message StopModuleRequest { + optional string module = 1; + optional string version = 2; +} + +message StopModuleResponse {} + +message GetHostnameRequest { + optional string module = 1; + optional string version = 2; + optional string instance = 3; +} + +message GetHostnameResponse { + required string hostname = 1; +} + diff --git a/vendor/google.golang.org/appengine/internal/net.go b/vendor/google.golang.org/appengine/internal/net.go new file mode 100644 index 0000000000..3b94cf0c6a --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/net.go @@ -0,0 +1,56 @@ +// Copyright 2014 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package internal + +// This file implements a network dialer that limits the number of concurrent connections. +// It is only used for API calls. + +import ( + "log" + "net" + "runtime" + "sync" + "time" +) + +var limitSem = make(chan int, 100) // TODO(dsymonds): Use environment variable. + +func limitRelease() { + // non-blocking + select { + case <-limitSem: + default: + // This should not normally happen. + log.Print("appengine: unbalanced limitSem release!") + } +} + +func limitDial(network, addr string) (net.Conn, error) { + limitSem <- 1 + + // Dial with a timeout in case the API host is MIA. + // The connection should normally be very fast. + conn, err := net.DialTimeout(network, addr, 500*time.Millisecond) + if err != nil { + limitRelease() + return nil, err + } + lc := &limitConn{Conn: conn} + runtime.SetFinalizer(lc, (*limitConn).Close) // shouldn't usually be required + return lc, nil +} + +type limitConn struct { + close sync.Once + net.Conn +} + +func (lc *limitConn) Close() error { + defer lc.close.Do(func() { + limitRelease() + runtime.SetFinalizer(lc, nil) + }) + return lc.Conn.Close() +} diff --git a/vendor/google.golang.org/appengine/internal/regen.sh b/vendor/google.golang.org/appengine/internal/regen.sh new file mode 100755 index 0000000000..2fdb546a63 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/regen.sh @@ -0,0 +1,40 @@ +#!/bin/bash -e +# +# This script rebuilds the generated code for the protocol buffers. +# To run this you will need protoc and goprotobuf installed; +# see https://github.com/golang/protobuf for instructions. + +PKG=google.golang.org/appengine + +function die() { + echo 1>&2 $* + exit 1 +} + +# Sanity check that the right tools are accessible. +for tool in go protoc protoc-gen-go; do + q=$(which $tool) || die "didn't find $tool" + echo 1>&2 "$tool: $q" +done + +echo -n 1>&2 "finding package dir... " +pkgdir=$(go list -f '{{.Dir}}' $PKG) +echo 1>&2 $pkgdir +base=$(echo $pkgdir | sed "s,/$PKG\$,,") +echo 1>&2 "base: $base" +cd $base + +# Run protoc once per package. +for dir in $(find $PKG/internal -name '*.proto' | xargs dirname | sort | uniq); do + echo 1>&2 "* $dir" + protoc --go_out=. $dir/*.proto +done + +for f in $(find $PKG/internal -name '*.pb.go'); do + # Remove proto.RegisterEnum calls. + # These cause duplicate registration panics when these packages + # are used on classic App Engine. proto.RegisterEnum only affects + # parsing the text format; we don't care about that. + # https://code.google.com/p/googleappengine/issues/detail?id=11670#c17 + sed -i '/proto.RegisterEnum/d' $f +done diff --git a/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go b/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go new file mode 100644 index 0000000000..526bd39e6d --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go @@ -0,0 +1,231 @@ +// Code generated by protoc-gen-go. +// source: google.golang.org/appengine/internal/remote_api/remote_api.proto +// DO NOT EDIT! + +/* +Package remote_api is a generated protocol buffer package. + +It is generated from these files: + google.golang.org/appengine/internal/remote_api/remote_api.proto + +It has these top-level messages: + Request + ApplicationError + RpcError + Response +*/ +package remote_api + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type RpcError_ErrorCode int32 + +const ( + RpcError_UNKNOWN RpcError_ErrorCode = 0 + RpcError_CALL_NOT_FOUND RpcError_ErrorCode = 1 + RpcError_PARSE_ERROR RpcError_ErrorCode = 2 + RpcError_SECURITY_VIOLATION RpcError_ErrorCode = 3 + RpcError_OVER_QUOTA RpcError_ErrorCode = 4 + RpcError_REQUEST_TOO_LARGE RpcError_ErrorCode = 5 + RpcError_CAPABILITY_DISABLED RpcError_ErrorCode = 6 + RpcError_FEATURE_DISABLED RpcError_ErrorCode = 7 + RpcError_BAD_REQUEST RpcError_ErrorCode = 8 + RpcError_RESPONSE_TOO_LARGE RpcError_ErrorCode = 9 + RpcError_CANCELLED RpcError_ErrorCode = 10 + RpcError_REPLAY_ERROR RpcError_ErrorCode = 11 + RpcError_DEADLINE_EXCEEDED RpcError_ErrorCode = 12 +) + +var RpcError_ErrorCode_name = map[int32]string{ + 0: "UNKNOWN", + 1: "CALL_NOT_FOUND", + 2: "PARSE_ERROR", + 3: "SECURITY_VIOLATION", + 4: "OVER_QUOTA", + 5: "REQUEST_TOO_LARGE", + 6: "CAPABILITY_DISABLED", + 7: "FEATURE_DISABLED", + 8: "BAD_REQUEST", + 9: "RESPONSE_TOO_LARGE", + 10: "CANCELLED", + 11: "REPLAY_ERROR", + 12: "DEADLINE_EXCEEDED", +} +var RpcError_ErrorCode_value = map[string]int32{ + "UNKNOWN": 0, + "CALL_NOT_FOUND": 1, + "PARSE_ERROR": 2, + "SECURITY_VIOLATION": 3, + "OVER_QUOTA": 4, + "REQUEST_TOO_LARGE": 5, + "CAPABILITY_DISABLED": 6, + "FEATURE_DISABLED": 7, + "BAD_REQUEST": 8, + "RESPONSE_TOO_LARGE": 9, + "CANCELLED": 10, + "REPLAY_ERROR": 11, + "DEADLINE_EXCEEDED": 12, +} + +func (x RpcError_ErrorCode) Enum() *RpcError_ErrorCode { + p := new(RpcError_ErrorCode) + *p = x + return p +} +func (x RpcError_ErrorCode) String() string { + return proto.EnumName(RpcError_ErrorCode_name, int32(x)) +} +func (x *RpcError_ErrorCode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(RpcError_ErrorCode_value, data, "RpcError_ErrorCode") + if err != nil { + return err + } + *x = RpcError_ErrorCode(value) + return nil +} + +type Request struct { + ServiceName *string `protobuf:"bytes,2,req,name=service_name" json:"service_name,omitempty"` + Method *string `protobuf:"bytes,3,req,name=method" json:"method,omitempty"` + Request []byte `protobuf:"bytes,4,req,name=request" json:"request,omitempty"` + RequestId *string `protobuf:"bytes,5,opt,name=request_id" json:"request_id,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Request) Reset() { *m = Request{} } +func (m *Request) String() string { return proto.CompactTextString(m) } +func (*Request) ProtoMessage() {} + +func (m *Request) GetServiceName() string { + if m != nil && m.ServiceName != nil { + return *m.ServiceName + } + return "" +} + +func (m *Request) GetMethod() string { + if m != nil && m.Method != nil { + return *m.Method + } + return "" +} + +func (m *Request) GetRequest() []byte { + if m != nil { + return m.Request + } + return nil +} + +func (m *Request) GetRequestId() string { + if m != nil && m.RequestId != nil { + return *m.RequestId + } + return "" +} + +type ApplicationError struct { + Code *int32 `protobuf:"varint,1,req,name=code" json:"code,omitempty"` + Detail *string `protobuf:"bytes,2,req,name=detail" json:"detail,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ApplicationError) Reset() { *m = ApplicationError{} } +func (m *ApplicationError) String() string { return proto.CompactTextString(m) } +func (*ApplicationError) ProtoMessage() {} + +func (m *ApplicationError) GetCode() int32 { + if m != nil && m.Code != nil { + return *m.Code + } + return 0 +} + +func (m *ApplicationError) GetDetail() string { + if m != nil && m.Detail != nil { + return *m.Detail + } + return "" +} + +type RpcError struct { + Code *int32 `protobuf:"varint,1,req,name=code" json:"code,omitempty"` + Detail *string `protobuf:"bytes,2,opt,name=detail" json:"detail,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *RpcError) Reset() { *m = RpcError{} } +func (m *RpcError) String() string { return proto.CompactTextString(m) } +func (*RpcError) ProtoMessage() {} + +func (m *RpcError) GetCode() int32 { + if m != nil && m.Code != nil { + return *m.Code + } + return 0 +} + +func (m *RpcError) GetDetail() string { + if m != nil && m.Detail != nil { + return *m.Detail + } + return "" +} + +type Response struct { + Response []byte `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"` + Exception []byte `protobuf:"bytes,2,opt,name=exception" json:"exception,omitempty"` + ApplicationError *ApplicationError `protobuf:"bytes,3,opt,name=application_error" json:"application_error,omitempty"` + JavaException []byte `protobuf:"bytes,4,opt,name=java_exception" json:"java_exception,omitempty"` + RpcError *RpcError `protobuf:"bytes,5,opt,name=rpc_error" json:"rpc_error,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Response) Reset() { *m = Response{} } +func (m *Response) String() string { return proto.CompactTextString(m) } +func (*Response) ProtoMessage() {} + +func (m *Response) GetResponse() []byte { + if m != nil { + return m.Response + } + return nil +} + +func (m *Response) GetException() []byte { + if m != nil { + return m.Exception + } + return nil +} + +func (m *Response) GetApplicationError() *ApplicationError { + if m != nil { + return m.ApplicationError + } + return nil +} + +func (m *Response) GetJavaException() []byte { + if m != nil { + return m.JavaException + } + return nil +} + +func (m *Response) GetRpcError() *RpcError { + if m != nil { + return m.RpcError + } + return nil +} + +func init() { +} diff --git a/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto b/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto new file mode 100644 index 0000000000..f21763a4e2 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto @@ -0,0 +1,44 @@ +syntax = "proto2"; +option go_package = "remote_api"; + +package remote_api; + +message Request { + required string service_name = 2; + required string method = 3; + required bytes request = 4; + optional string request_id = 5; +} + +message ApplicationError { + required int32 code = 1; + required string detail = 2; +} + +message RpcError { + enum ErrorCode { + UNKNOWN = 0; + CALL_NOT_FOUND = 1; + PARSE_ERROR = 2; + SECURITY_VIOLATION = 3; + OVER_QUOTA = 4; + REQUEST_TOO_LARGE = 5; + CAPABILITY_DISABLED = 6; + FEATURE_DISABLED = 7; + BAD_REQUEST = 8; + RESPONSE_TOO_LARGE = 9; + CANCELLED = 10; + REPLAY_ERROR = 11; + DEADLINE_EXCEEDED = 12; + } + required int32 code = 1; + optional string detail = 2; +} + +message Response { + optional bytes response = 1; + optional bytes exception = 2; + optional ApplicationError application_error = 3; + optional bytes java_exception = 4; + optional RpcError rpc_error = 5; +} diff --git a/vendor/google.golang.org/appengine/internal/transaction.go b/vendor/google.golang.org/appengine/internal/transaction.go new file mode 100644 index 0000000000..28a6d18120 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/transaction.go @@ -0,0 +1,107 @@ +// Copyright 2014 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package internal + +// This file implements hooks for applying datastore transactions. + +import ( + "errors" + "reflect" + + "github.com/golang/protobuf/proto" + netcontext "golang.org/x/net/context" + + basepb "google.golang.org/appengine/internal/base" + pb "google.golang.org/appengine/internal/datastore" +) + +var transactionSetters = make(map[reflect.Type]reflect.Value) + +// RegisterTransactionSetter registers a function that sets transaction information +// in a protocol buffer message. f should be a function with two arguments, +// the first being a protocol buffer type, and the second being *datastore.Transaction. +func RegisterTransactionSetter(f interface{}) { + v := reflect.ValueOf(f) + transactionSetters[v.Type().In(0)] = v +} + +// applyTransaction applies the transaction t to message pb +// by using the relevant setter passed to RegisterTransactionSetter. +func applyTransaction(pb proto.Message, t *pb.Transaction) { + v := reflect.ValueOf(pb) + if f, ok := transactionSetters[v.Type()]; ok { + f.Call([]reflect.Value{v, reflect.ValueOf(t)}) + } +} + +var transactionKey = "used for *Transaction" + +func transactionFromContext(ctx netcontext.Context) *transaction { + t, _ := ctx.Value(&transactionKey).(*transaction) + return t +} + +func withTransaction(ctx netcontext.Context, t *transaction) netcontext.Context { + return netcontext.WithValue(ctx, &transactionKey, t) +} + +type transaction struct { + transaction pb.Transaction + finished bool +} + +var ErrConcurrentTransaction = errors.New("internal: concurrent transaction") + +func RunTransactionOnce(c netcontext.Context, f func(netcontext.Context) error, xg bool) error { + if transactionFromContext(c) != nil { + return errors.New("nested transactions are not supported") + } + + // Begin the transaction. + t := &transaction{} + req := &pb.BeginTransactionRequest{ + App: proto.String(FullyQualifiedAppID(c)), + } + if xg { + req.AllowMultipleEg = proto.Bool(true) + } + if err := Call(c, "datastore_v3", "BeginTransaction", req, &t.transaction); err != nil { + return err + } + + // Call f, rolling back the transaction if f returns a non-nil error, or panics. + // The panic is not recovered. + defer func() { + if t.finished { + return + } + t.finished = true + // Ignore the error return value, since we are already returning a non-nil + // error (or we're panicking). + Call(c, "datastore_v3", "Rollback", &t.transaction, &basepb.VoidProto{}) + }() + if err := f(withTransaction(c, t)); err != nil { + return err + } + t.finished = true + + // Commit the transaction. + res := &pb.CommitResponse{} + err := Call(c, "datastore_v3", "Commit", &t.transaction, res) + if ae, ok := err.(*APIError); ok { + /* TODO: restore this conditional + if appengine.IsDevAppServer() { + */ + // The Python Dev AppServer raises an ApplicationError with error code 2 (which is + // Error.CONCURRENT_TRANSACTION) and message "Concurrency exception.". + if ae.Code == int32(pb.Error_BAD_REQUEST) && ae.Detail == "ApplicationError: 2 Concurrency exception." { + return ErrConcurrentTransaction + } + if ae.Code == int32(pb.Error_CONCURRENT_TRANSACTION) { + return ErrConcurrentTransaction + } + } + return err +} diff --git a/vendor/google.golang.org/appengine/namespace.go b/vendor/google.golang.org/appengine/namespace.go new file mode 100644 index 0000000000..21860ca082 --- /dev/null +++ b/vendor/google.golang.org/appengine/namespace.go @@ -0,0 +1,25 @@ +// Copyright 2012 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package appengine + +import ( + "fmt" + "regexp" + + "golang.org/x/net/context" + + "google.golang.org/appengine/internal" +) + +// Namespace returns a replacement context that operates within the given namespace. +func Namespace(c context.Context, namespace string) (context.Context, error) { + if !validNamespace.MatchString(namespace) { + return nil, fmt.Errorf("appengine: namespace %q does not match /%s/", namespace, validNamespace) + } + return internal.NamespacedContext(c, namespace), nil +} + +// validNamespace matches valid namespace names. +var validNamespace = regexp.MustCompile(`^[0-9A-Za-z._-]{0,100}$`) diff --git a/vendor/google.golang.org/appengine/timeout.go b/vendor/google.golang.org/appengine/timeout.go new file mode 100644 index 0000000000..05642a992a --- /dev/null +++ b/vendor/google.golang.org/appengine/timeout.go @@ -0,0 +1,20 @@ +// Copyright 2013 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package appengine + +import "golang.org/x/net/context" + +// IsTimeoutError reports whether err is a timeout error. +func IsTimeoutError(err error) bool { + if err == context.DeadlineExceeded { + return true + } + if t, ok := err.(interface { + IsTimeout() bool + }); ok { + return t.IsTimeout() + } + return false +} diff --git a/vendor/google.golang.org/cloud/internal/cloud.go b/vendor/google.golang.org/cloud/internal/cloud.go deleted file mode 100644 index 59428803dd..0000000000 --- a/vendor/google.golang.org/cloud/internal/cloud.go +++ /dev/null @@ -1,128 +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 internal provides support for the cloud packages. -// -// Users should not import this package directly. -package internal - -import ( - "fmt" - "net/http" - "sync" - - "golang.org/x/net/context" -) - -type contextKey struct{} - -func WithContext(parent context.Context, projID string, c *http.Client) context.Context { - if c == nil { - panic("nil *http.Client passed to WithContext") - } - if projID == "" { - panic("empty project ID passed to WithContext") - } - return context.WithValue(parent, contextKey{}, &cloudContext{ - ProjectID: projID, - HTTPClient: c, - }) -} - -const userAgent = "gcloud-golang/0.1" - -type cloudContext struct { - ProjectID string - HTTPClient *http.Client - - mu sync.Mutex // guards svc - svc map[string]interface{} // e.g. "storage" => *rawStorage.Service -} - -// Service returns the result of the fill function if it's never been -// called before for the given name (which is assumed to be an API -// service name, like "datastore"). If it has already been cached, the fill -// func is not run. -// It's safe for concurrent use by multiple goroutines. -func Service(ctx context.Context, name string, fill func(*http.Client) interface{}) interface{} { - return cc(ctx).service(name, fill) -} - -func (c *cloudContext) service(name string, fill func(*http.Client) interface{}) interface{} { - c.mu.Lock() - defer c.mu.Unlock() - - if c.svc == nil { - c.svc = make(map[string]interface{}) - } else if v, ok := c.svc[name]; ok { - return v - } - v := fill(c.HTTPClient) - c.svc[name] = v - return v -} - -// Transport is an http.RoundTripper that appends -// Google Cloud client's user-agent to the original -// request's user-agent header. -type Transport struct { - // Base is the actual http.RoundTripper - // requests will use. It must not be nil. - Base http.RoundTripper -} - -// RoundTrip appends a user-agent to the existing user-agent -// header and delegates the request to the base http.RoundTripper. -func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { - req = cloneRequest(req) - ua := req.Header.Get("User-Agent") - if ua == "" { - ua = userAgent - } else { - ua = fmt.Sprintf("%s %s", ua, userAgent) - } - req.Header.Set("User-Agent", ua) - return t.Base.RoundTrip(req) -} - -// cloneRequest returns a clone of the provided *http.Request. -// The clone is a shallow copy of the struct and its Header map. -func cloneRequest(r *http.Request) *http.Request { - // shallow copy of the struct - r2 := new(http.Request) - *r2 = *r - // deep copy of the Header - r2.Header = make(http.Header) - for k, s := range r.Header { - r2.Header[k] = s - } - return r2 -} - -func ProjID(ctx context.Context) string { - return cc(ctx).ProjectID -} - -func HTTPClient(ctx context.Context) *http.Client { - return cc(ctx).HTTPClient -} - -// cc returns the internal *cloudContext (cc) state for a context.Context. -// It panics if the user did it wrong. -func cc(ctx context.Context) *cloudContext { - if c, ok := ctx.Value(contextKey{}).(*cloudContext); ok { - return c - } - panic("invalid context.Context type; it should be created with cloud.NewContext") -} diff --git a/vendor/google.golang.org/grpc/.travis.yml b/vendor/google.golang.org/grpc/.travis.yml index 9bc2c12793..d7108cd645 100644 --- a/vendor/google.golang.org/grpc/.travis.yml +++ b/vendor/google.golang.org/grpc/.travis.yml @@ -1,17 +1,21 @@ language: go go: - - 1.5.3 - - 1.6 + - 1.5.4 + - 1.6.3 + +go_import_path: google.golang.org/grpc before_install: + - go get golang.org/x/tools/cmd/goimports + - go get github.com/golang/lint/golint - go get github.com/axw/gocov/gocov - go get github.com/mattn/goveralls - go get golang.org/x/tools/cmd/cover -install: - - mkdir -p "$GOPATH/src/google.golang.org" - - mv "$TRAVIS_BUILD_DIR" "$GOPATH/src/google.golang.org/grpc" - script: + - '! gofmt -s -d -l . 2>&1 | read' + - '! goimports -l . | read' + - '! golint ./... | grep -vE "(_string|\.pb)\.go:"' + - '! go tool vet -all . 2>&1 | grep -vE "constant [0-9]+ not a string in call to Errorf"' - make test testrace diff --git a/vendor/google.golang.org/grpc/call.go b/vendor/google.golang.org/grpc/call.go index 84ac178c43..fea07998d7 100644 --- a/vendor/google.golang.org/grpc/call.go +++ b/vendor/google.golang.org/grpc/call.go @@ -36,6 +36,7 @@ package grpc import ( "bytes" "io" + "math" "time" "golang.org/x/net/context" @@ -51,13 +52,20 @@ import ( func recvResponse(dopts dialOptions, t transport.ClientTransport, c *callInfo, stream *transport.Stream, reply interface{}) error { // Try to acquire header metadata from the server if there is any. var err error + defer func() { + if err != nil { + if _, ok := err.(transport.ConnectionError); !ok { + t.CloseStream(stream, err) + } + } + }() c.headerMD, err = stream.Header() if err != nil { return err } p := &parser{r: stream} for { - if err = recv(p, dopts.codec, stream, dopts.dc, reply); err != nil { + if err = recv(p, dopts.codec, stream, dopts.dc, reply, math.MaxInt32); err != nil { if err == io.EOF { break } @@ -76,6 +84,7 @@ func sendRequest(ctx context.Context, codec Codec, compressor Compressor, callHd } defer func() { if err != nil { + // If err is connection error, t will be closed, no need to close stream here. if _, ok := err.(transport.ConnectionError); !ok { t.CloseStream(stream, err) } @@ -90,7 +99,10 @@ func sendRequest(ctx context.Context, codec Codec, compressor Compressor, callHd return nil, transport.StreamErrorf(codes.Internal, "grpc: %v", err) } err = t.Write(stream, outBuf, opts) - if err != nil { + // t.NewStream(...) could lead to an early rejection of the RPC (e.g., the service/method + // does not exist.) so that t.Write could get io.EOF from wait(...). Leave the following + // recvResponse to get the final status. + if err != nil && err != io.EOF { return nil, err } // Sent successfully. @@ -158,9 +170,9 @@ func Invoke(ctx context.Context, method string, args, reply interface{}, cc *Cli if _, ok := err.(*rpcError); ok { return err } - if err == errConnClosing { + if err == errConnClosing || err == errConnUnavailable { if c.failFast { - return Errorf(codes.Unavailable, "%v", errConnClosing) + return Errorf(codes.Unavailable, "%v", err) } continue } @@ -176,7 +188,10 @@ func Invoke(ctx context.Context, method string, args, reply interface{}, cc *Cli put() put = nil } - if _, ok := err.(transport.ConnectionError); ok { + // Retry a non-failfast RPC when + // i) there is a connection error; or + // ii) the server started to drain before this RPC was initiated. + if _, ok := err.(transport.ConnectionError); ok || err == transport.ErrStreamDrain { if c.failFast { return toRPCErr(err) } @@ -184,20 +199,18 @@ func Invoke(ctx context.Context, method string, args, reply interface{}, cc *Cli } return toRPCErr(err) } - // Receive the response err = recvResponse(cc.dopts, t, &c, stream, reply) if err != nil { if put != nil { put() put = nil } - if _, ok := err.(transport.ConnectionError); ok { + if _, ok := err.(transport.ConnectionError); ok || err == transport.ErrStreamDrain { if c.failFast { return toRPCErr(err) } continue } - t.CloseStream(stream, err) return toRPCErr(err) } if c.traceInfo.tr != nil { diff --git a/vendor/google.golang.org/grpc/clientconn.go b/vendor/google.golang.org/grpc/clientconn.go index c3c7691dc0..27e74e6f22 100644 --- a/vendor/google.golang.org/grpc/clientconn.go +++ b/vendor/google.golang.org/grpc/clientconn.go @@ -43,7 +43,6 @@ import ( "golang.org/x/net/context" "golang.org/x/net/trace" - "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" "google.golang.org/grpc/grpclog" "google.golang.org/grpc/transport" @@ -68,13 +67,15 @@ var ( // errCredentialsConflict indicates that grpc.WithTransportCredentials() // and grpc.WithInsecure() are both called for a connection. errCredentialsConflict = errors.New("grpc: transport credentials are set for an insecure connection (grpc.WithTransportCredentials() and grpc.WithInsecure() are both called)") - // errNetworkIP indicates that the connection is down due to some network I/O error. + // errNetworkIO indicates that the connection is down due to some network I/O error. errNetworkIO = errors.New("grpc: failed with network I/O error") // errConnDrain indicates that the connection starts to be drained and does not accept any new RPCs. errConnDrain = errors.New("grpc: the connection is drained") // errConnClosing indicates that the connection is closing. errConnClosing = errors.New("grpc: the connection is closing") - errNoAddr = errors.New("grpc: there is no address available to dial") + // errConnUnavailable indicates that the connection is unavailable. + errConnUnavailable = errors.New("grpc: the connection is unavailable") + errNoAddr = errors.New("grpc: there is no address available to dial") // minimum time to give a connection to complete minConnectTimeout = 20 * time.Second ) @@ -196,9 +197,14 @@ func WithTimeout(d time.Duration) DialOption { } // WithDialer returns a DialOption that specifies a function to use for dialing network addresses. -func WithDialer(f func(addr string, timeout time.Duration) (net.Conn, error)) DialOption { +func WithDialer(f func(string, time.Duration) (net.Conn, error)) DialOption { return func(o *dialOptions) { - o.copts.Dialer = f + o.copts.Dialer = func(ctx context.Context, addr string) (net.Conn, error) { + if deadline, ok := ctx.Deadline(); ok { + return f(addr, deadline.Sub(time.Now())) + } + return f(addr, 0) + } } } @@ -209,12 +215,19 @@ func WithUserAgent(s string) DialOption { } } -// Dial creates a client connection the given target. +// Dial creates a client connection to the given target. func Dial(target string, opts ...DialOption) (*ClientConn, error) { + return DialContext(context.Background(), target, opts...) +} + +// DialContext creates a client connection to the given target +// using the supplied context. +func DialContext(ctx context.Context, target string, opts ...DialOption) (*ClientConn, error) { cc := &ClientConn{ target: target, conns: make(map[Address]*addrConn), } + cc.ctx, cc.cancel = context.WithCancel(ctx) for _, opt := range opts { opt(&cc.dopts) } @@ -226,31 +239,33 @@ func Dial(target string, opts ...DialOption) (*ClientConn, error) { if cc.dopts.bs == nil { cc.dopts.bs = DefaultBackoffConfig } - if cc.dopts.balancer == nil { - cc.dopts.balancer = RoundRobin(nil) - } - if err := cc.dopts.balancer.Start(target); err != nil { - return nil, err - } var ( ok bool addrs []Address ) - ch := cc.dopts.balancer.Notify() - if ch == nil { - // There is no name resolver installed. + if cc.dopts.balancer == nil { + // Connect to target directly if balancer is nil. addrs = append(addrs, Address{Addr: target}) } else { - addrs, ok = <-ch - if !ok || len(addrs) == 0 { - return nil, errNoAddr + if err := cc.dopts.balancer.Start(target); err != nil { + return nil, err + } + ch := cc.dopts.balancer.Notify() + if ch == nil { + // There is no name resolver installed. + addrs = append(addrs, Address{Addr: target}) + } else { + addrs, ok = <-ch + if !ok || len(addrs) == 0 { + return nil, errNoAddr + } } } waitC := make(chan error, 1) go func() { for _, a := range addrs { - if err := cc.newAddrConn(a, false); err != nil { + if err := cc.resetAddrConn(a, false, nil); err != nil { waitC <- err return } @@ -267,10 +282,15 @@ func Dial(target string, opts ...DialOption) (*ClientConn, error) { cc.Close() return nil, err } + case <-cc.ctx.Done(): + cc.Close() + return nil, cc.ctx.Err() case <-timeoutCh: cc.Close() return nil, ErrClientConnTimeout } + // If balancer is nil or balancer.Notify() is nil, ok will be false here. + // The lbWatcher goroutine will not be created. if ok { go cc.lbWatcher() } @@ -317,6 +337,9 @@ func (s ConnectivityState) String() string { // ClientConn represents a client connection to an RPC server. type ClientConn struct { + ctx context.Context + cancel context.CancelFunc + target string authority string dopts dialOptions @@ -347,11 +370,12 @@ func (cc *ClientConn) lbWatcher() { } if !keep { del = append(del, c) + delete(cc.conns, c.addr) } } cc.mu.Unlock() for _, a := range add { - cc.newAddrConn(a, true) + cc.resetAddrConn(a, true, nil) } for _, c := range del { c.tearDown(errConnDrain) @@ -359,13 +383,17 @@ func (cc *ClientConn) lbWatcher() { } } -func (cc *ClientConn) newAddrConn(addr Address, skipWait bool) error { +// resetAddrConn creates an addrConn for addr and adds it to cc.conns. +// If there is an old addrConn for addr, it will be torn down, using tearDownErr as the reason. +// If tearDownErr is nil, errConnDrain will be used instead. +func (cc *ClientConn) resetAddrConn(addr Address, skipWait bool, tearDownErr error) error { ac := &addrConn{ - cc: cc, - addr: addr, - dopts: cc.dopts, - shutdownChan: make(chan struct{}), + cc: cc, + addr: addr, + dopts: cc.dopts, } + ac.ctx, ac.cancel = context.WithCancel(cc.ctx) + ac.stateCV = sync.NewCond(&ac.mu) if EnableTracing { ac.events = trace.NewEventLog("grpc.ClientConn", ac.addr.Addr) } @@ -383,26 +411,44 @@ func (cc *ClientConn) newAddrConn(addr Address, skipWait bool) error { } } } - // Insert ac into ac.cc.conns. This needs to be done before any getTransport(...) is called. - ac.cc.mu.Lock() - if ac.cc.conns == nil { - ac.cc.mu.Unlock() + // Track ac in cc. This needs to be done before any getTransport(...) is called. + cc.mu.Lock() + if cc.conns == nil { + cc.mu.Unlock() return ErrClientConnClosing } - stale := ac.cc.conns[ac.addr] - ac.cc.conns[ac.addr] = ac - ac.cc.mu.Unlock() + stale := cc.conns[ac.addr] + cc.conns[ac.addr] = ac + cc.mu.Unlock() if stale != nil { // There is an addrConn alive on ac.addr already. This could be due to - // i) stale's Close is undergoing; - // ii) a buggy Balancer notifies duplicated Addresses. - stale.tearDown(errConnDrain) + // 1) a buggy Balancer notifies duplicated Addresses; + // 2) goaway was received, a new ac will replace the old ac. + // The old ac should be deleted from cc.conns, but the + // underlying transport should drain rather than close. + if tearDownErr == nil { + // tearDownErr is nil if resetAddrConn is called by + // 1) Dial + // 2) lbWatcher + // In both cases, the stale ac should drain, not close. + stale.tearDown(errConnDrain) + } else { + stale.tearDown(tearDownErr) + } } - ac.stateCV = sync.NewCond(&ac.mu) // skipWait may overwrite the decision in ac.dopts.block. if ac.dopts.block && !skipWait { if err := ac.resetTransport(false); err != nil { - ac.tearDown(err) + if err != errConnClosing { + // Tear down ac and delete it from cc.conns. + cc.mu.Lock() + delete(cc.conns, ac.addr) + cc.mu.Unlock() + ac.tearDown(err) + } + if e, ok := err.(transport.ConnectionError); ok && !e.Temporary() { + return e.Origin() + } return err } // Start to monitor the error status of transport. @@ -412,7 +458,10 @@ func (cc *ClientConn) newAddrConn(addr Address, skipWait bool) error { go func() { if err := ac.resetTransport(false); err != nil { grpclog.Printf("Failed to dial %s: %v; please retry.", ac.addr.Addr, err) - ac.tearDown(err) + if err != errConnClosing { + // Keep this ac in cc.conns, to get the reason it's torn down. + ac.tearDown(err) + } return } ac.transportMonitor() @@ -422,24 +471,48 @@ func (cc *ClientConn) newAddrConn(addr Address, skipWait bool) error { } func (cc *ClientConn) getTransport(ctx context.Context, opts BalancerGetOptions) (transport.ClientTransport, func(), error) { - addr, put, err := cc.dopts.balancer.Get(ctx, opts) - if err != nil { - return nil, nil, toRPCErr(err) - } - cc.mu.RLock() - if cc.conns == nil { + var ( + ac *addrConn + ok bool + put func() + ) + if cc.dopts.balancer == nil { + // If balancer is nil, there should be only one addrConn available. + cc.mu.RLock() + if cc.conns == nil { + cc.mu.RUnlock() + return nil, nil, toRPCErr(ErrClientConnClosing) + } + for _, ac = range cc.conns { + // Break after the first iteration to get the first addrConn. + ok = true + break + } + cc.mu.RUnlock() + } else { + var ( + addr Address + err error + ) + addr, put, err = cc.dopts.balancer.Get(ctx, opts) + if err != nil { + return nil, nil, toRPCErr(err) + } + cc.mu.RLock() + if cc.conns == nil { + cc.mu.RUnlock() + return nil, nil, toRPCErr(ErrClientConnClosing) + } + ac, ok = cc.conns[addr] cc.mu.RUnlock() - return nil, nil, toRPCErr(ErrClientConnClosing) } - ac, ok := cc.conns[addr] - cc.mu.RUnlock() if !ok { if put != nil { put() } - return nil, nil, Errorf(codes.Internal, "grpc: failed to find the transport to send the rpc") + return nil, nil, errConnClosing } - t, err := ac.wait(ctx, !opts.BlockingWait) + t, err := ac.wait(ctx, cc.dopts.balancer != nil, !opts.BlockingWait) if err != nil { if put != nil { put() @@ -451,6 +524,8 @@ func (cc *ClientConn) getTransport(ctx context.Context, opts BalancerGetOptions) // Close tears down the ClientConn and all underlying connections. func (cc *ClientConn) Close() error { + cc.cancel() + cc.mu.Lock() if cc.conns == nil { cc.mu.Unlock() @@ -459,7 +534,9 @@ func (cc *ClientConn) Close() error { conns := cc.conns cc.conns = nil cc.mu.Unlock() - cc.dopts.balancer.Close() + if cc.dopts.balancer != nil { + cc.dopts.balancer.Close() + } for _, ac := range conns { ac.tearDown(ErrClientConnClosing) } @@ -468,11 +545,13 @@ func (cc *ClientConn) Close() error { // addrConn is a network connection to a given address. type addrConn struct { - cc *ClientConn - addr Address - dopts dialOptions - shutdownChan chan struct{} - events trace.EventLog + ctx context.Context + cancel context.CancelFunc + + cc *ClientConn + addr Address + dopts dialOptions + events trace.EventLog mu sync.Mutex state ConnectivityState @@ -482,6 +561,9 @@ type addrConn struct { // due to timeout. ready chan struct{} transport transport.ClientTransport + + // The reason this addrConn is torn down. + tearDownErr error } // printf records an event in ac's event log, unless ac has been closed. @@ -537,8 +619,7 @@ func (ac *addrConn) waitForStateChange(ctx context.Context, sourceState Connecti } func (ac *addrConn) resetTransport(closeTransport bool) error { - var retries int - for { + for retries := 0; ; retries++ { ac.mu.Lock() ac.printf("connecting") if ac.state == Shutdown { @@ -558,13 +639,20 @@ func (ac *addrConn) resetTransport(closeTransport bool) error { t.Close() } sleepTime := ac.dopts.bs.backoff(retries) - ac.dopts.copts.Timeout = sleepTime - if sleepTime < minConnectTimeout { - ac.dopts.copts.Timeout = minConnectTimeout + timeout := minConnectTimeout + if timeout < sleepTime { + timeout = sleepTime } + ctx, cancel := context.WithTimeout(ac.ctx, timeout) connectTime := time.Now() - newTransport, err := transport.NewClientTransport(ac.addr.Addr, &ac.dopts.copts) + newTransport, err := transport.NewClientTransport(ctx, ac.addr.Addr, ac.dopts.copts) if err != nil { + cancel() + + if e, ok := err.(transport.ConnectionError); ok && !e.Temporary() { + return err + } + grpclog.Printf("grpc: addrConn.resetTransport failed to create client transport: %v; Reconnecting to %q", err, ac.addr) ac.mu.Lock() if ac.state == Shutdown { // ac.tearDown(...) has been invoked. @@ -579,17 +667,12 @@ func (ac *addrConn) resetTransport(closeTransport bool) error { ac.ready = nil } ac.mu.Unlock() - sleepTime -= time.Since(connectTime) - if sleepTime < 0 { - sleepTime = 0 - } closeTransport = false select { - case <-time.After(sleepTime): - case <-ac.shutdownChan: + case <-time.After(sleepTime - time.Since(connectTime)): + case <-ac.ctx.Done(): + return ac.ctx.Err() } - retries++ - grpclog.Printf("grpc: addrConn.resetTransport failed to create client transport: %v; Reconnecting to %q", err, ac.addr) continue } ac.mu.Lock() @@ -607,7 +690,9 @@ func (ac *addrConn) resetTransport(closeTransport bool) error { close(ac.ready) ac.ready = nil } - ac.down = ac.cc.dopts.balancer.Up(ac.addr) + if ac.cc.dopts.balancer != nil { + ac.down = ac.cc.dopts.balancer.Up(ac.addr) + } ac.mu.Unlock() return nil } @@ -621,14 +706,42 @@ func (ac *addrConn) transportMonitor() { t := ac.transport ac.mu.Unlock() select { - // shutdownChan is needed to detect the teardown when + // This is needed to detect the teardown when // the addrConn is idle (i.e., no RPC in flight). - case <-ac.shutdownChan: + case <-ac.ctx.Done(): + select { + case <-t.Error(): + t.Close() + default: + } + return + case <-t.GoAway(): + // If GoAway happens without any network I/O error, ac is closed without shutting down the + // underlying transport (the transport will be closed when all the pending RPCs finished or + // failed.). + // If GoAway and some network I/O error happen concurrently, ac and its underlying transport + // are closed. + // In both cases, a new ac is created. + select { + case <-t.Error(): + ac.cc.resetAddrConn(ac.addr, true, errNetworkIO) + default: + ac.cc.resetAddrConn(ac.addr, true, errConnDrain) + } return case <-t.Error(): + select { + case <-ac.ctx.Done(): + t.Close() + return + case <-t.GoAway(): + ac.cc.resetAddrConn(ac.addr, true, errNetworkIO) + return + default: + } ac.mu.Lock() if ac.state == Shutdown { - // ac.tearDown(...) has been invoked. + // ac has been shutdown. ac.mu.Unlock() return } @@ -640,6 +753,10 @@ func (ac *addrConn) transportMonitor() { ac.printf("transport exiting: %v", err) ac.mu.Unlock() grpclog.Printf("grpc: addrConn.transportMonitor exits due to: %v", err) + if err != errConnClosing { + // Keep this ac in cc.conns, to get the reason it's torn down. + ac.tearDown(err) + } return } } @@ -647,35 +764,42 @@ func (ac *addrConn) transportMonitor() { } // wait blocks until i) the new transport is up or ii) ctx is done or iii) ac is closed or -// iv) transport is in TransientFailure and the RPC is fail-fast. -func (ac *addrConn) wait(ctx context.Context, failFast bool) (transport.ClientTransport, error) { +// iv) transport is in TransientFailure and there's no balancer/failfast is true. +func (ac *addrConn) wait(ctx context.Context, hasBalancer, failfast bool) (transport.ClientTransport, error) { for { ac.mu.Lock() switch { case ac.state == Shutdown: + if failfast || !hasBalancer { + // RPC is failfast or balancer is nil. This RPC should fail with ac.tearDownErr. + err := ac.tearDownErr + ac.mu.Unlock() + return nil, err + } ac.mu.Unlock() return nil, errConnClosing case ac.state == Ready: ct := ac.transport ac.mu.Unlock() return ct, nil - case ac.state == TransientFailure && failFast: - ac.mu.Unlock() - return nil, Errorf(codes.Unavailable, "grpc: RPC failed fast due to transport failure") - default: - ready := ac.ready - if ready == nil { - ready = make(chan struct{}) - ac.ready = ready - } - ac.mu.Unlock() - select { - case <-ctx.Done(): - return nil, toRPCErr(ctx.Err()) - // Wait until the new transport is ready or failed. - case <-ready: + case ac.state == TransientFailure: + if failfast || hasBalancer { + ac.mu.Unlock() + return nil, errConnUnavailable } } + ready := ac.ready + if ready == nil { + ready = make(chan struct{}) + ac.ready = ready + } + ac.mu.Unlock() + select { + case <-ctx.Done(): + return nil, toRPCErr(ctx.Err()) + // Wait until the new transport is ready or failed. + case <-ready: + } } } @@ -683,24 +807,28 @@ func (ac *addrConn) wait(ctx context.Context, failFast bool) (transport.ClientTr // TODO(zhaoq): Make this synchronous to avoid unbounded memory consumption in // some edge cases (e.g., the caller opens and closes many addrConn's in a // tight loop. +// tearDown doesn't remove ac from ac.cc.conns. func (ac *addrConn) tearDown(err error) { + ac.cancel() + ac.mu.Lock() - defer func() { - ac.mu.Unlock() - ac.cc.mu.Lock() - if ac.cc.conns != nil { - delete(ac.cc.conns, ac.addr) - } - ac.cc.mu.Unlock() - }() - if ac.state == Shutdown { - return - } - ac.state = Shutdown + defer ac.mu.Unlock() if ac.down != nil { ac.down(downErrorf(false, false, "%v", err)) ac.down = nil } + if err == errConnDrain && ac.transport != nil { + // GracefulClose(...) may be executed multiple times when + // i) receiving multiple GoAway frames from the server; or + // ii) there are concurrent name resolver/Balancer triggered + // address removal and GoAway. + ac.transport.GracefulClose() + } + if ac.state == Shutdown { + return + } + ac.state = Shutdown + ac.tearDownErr = err ac.stateCV.Broadcast() if ac.events != nil { ac.events.Finish() @@ -710,15 +838,8 @@ func (ac *addrConn) tearDown(err error) { close(ac.ready) ac.ready = nil } - if ac.transport != nil { - if err == errConnDrain { - ac.transport.GracefulClose() - } else { - ac.transport.Close() - } - } - if ac.shutdownChan != nil { - close(ac.shutdownChan) + if ac.transport != nil && err != errConnDrain { + ac.transport.Close() } return } diff --git a/vendor/google.golang.org/grpc/credentials/credentials.go b/vendor/google.golang.org/grpc/credentials/credentials.go index b021e1eb7d..001f134d78 100644 --- a/vendor/google.golang.org/grpc/credentials/credentials.go +++ b/vendor/google.golang.org/grpc/credentials/credentials.go @@ -44,7 +44,6 @@ import ( "io/ioutil" "net" "strings" - "time" "golang.org/x/net/context" ) @@ -93,11 +92,12 @@ type TransportCredentials interface { // ClientHandshake does the authentication handshake specified by the corresponding // authentication protocol on rawConn for clients. It returns the authenticated // connection and the corresponding auth information about the connection. - ClientHandshake(addr string, rawConn net.Conn, timeout time.Duration) (net.Conn, AuthInfo, error) + // Implementations must use the provided context to implement timely cancellation. + ClientHandshake(context.Context, string, net.Conn) (net.Conn, AuthInfo, error) // ServerHandshake does the authentication handshake for servers. It returns // the authenticated connection and the corresponding auth information about // the connection. - ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error) + ServerHandshake(net.Conn) (net.Conn, AuthInfo, error) // Info provides the ProtocolInfo of this TransportCredentials. Info() ProtocolInfo } @@ -136,42 +136,28 @@ func (c *tlsCreds) RequireTransportSecurity() bool { return true } -type timeoutError struct{} - -func (timeoutError) Error() string { return "credentials: Dial timed out" } -func (timeoutError) Timeout() bool { return true } -func (timeoutError) Temporary() bool { return true } - -func (c *tlsCreds) ClientHandshake(addr string, rawConn net.Conn, timeout time.Duration) (_ net.Conn, _ AuthInfo, err error) { - // borrow some code from tls.DialWithDialer - var errChannel chan error - if timeout != 0 { - errChannel = make(chan error, 2) - time.AfterFunc(timeout, func() { - errChannel <- timeoutError{} - }) - } +func (c *tlsCreds) ClientHandshake(ctx context.Context, addr string, rawConn net.Conn) (_ net.Conn, _ AuthInfo, err error) { // use local cfg to avoid clobbering ServerName if using multiple endpoints - cfg := *c.config - if c.config.ServerName == "" { + cfg := cloneTLSConfig(c.config) + if cfg.ServerName == "" { colonPos := strings.LastIndex(addr, ":") if colonPos == -1 { colonPos = len(addr) } cfg.ServerName = addr[:colonPos] } - conn := tls.Client(rawConn, &cfg) - if timeout == 0 { - err = conn.Handshake() - } else { - go func() { - errChannel <- conn.Handshake() - }() - err = <-errChannel - } - if err != nil { - rawConn.Close() - return nil, nil, err + conn := tls.Client(rawConn, cfg) + errChannel := make(chan error, 1) + go func() { + errChannel <- conn.Handshake() + }() + select { + case err := <-errChannel: + if err != nil { + return nil, nil, err + } + case <-ctx.Done(): + return nil, nil, ctx.Err() } // TODO(zhaoq): Omit the auth info for client now. It is more for // information than anything else. @@ -181,7 +167,6 @@ func (c *tlsCreds) ClientHandshake(addr string, rawConn net.Conn, timeout time.D func (c *tlsCreds) ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error) { conn := tls.Server(rawConn, c.config) if err := conn.Handshake(); err != nil { - rawConn.Close() return nil, nil, err } return conn, TLSInfo{conn.ConnectionState()}, nil @@ -189,7 +174,7 @@ func (c *tlsCreds) ServerHandshake(rawConn net.Conn) (net.Conn, AuthInfo, error) // NewTLS uses c to construct a TransportCredentials based on TLS. func NewTLS(c *tls.Config) TransportCredentials { - tc := &tlsCreds{c} + tc := &tlsCreds{cloneTLSConfig(c)} tc.config.NextProtos = alpnProtoStr return tc } diff --git a/vendor/google.golang.org/grpc/credentials/credentials_util_go17.go b/vendor/google.golang.org/grpc/credentials/credentials_util_go17.go new file mode 100644 index 0000000000..9647b9ec83 --- /dev/null +++ b/vendor/google.golang.org/grpc/credentials/credentials_util_go17.go @@ -0,0 +1,76 @@ +// +build go1.7 + +/* + * + * Copyright 2016, Google Inc. + * 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. + * + */ + +package credentials + +import ( + "crypto/tls" +) + +// cloneTLSConfig returns a shallow clone of the exported +// fields of cfg, ignoring the unexported sync.Once, which +// contains a mutex and must not be copied. +// +// If cfg is nil, a new zero tls.Config is returned. +// +// TODO replace this function with official clone function. +func cloneTLSConfig(cfg *tls.Config) *tls.Config { + if cfg == nil { + return &tls.Config{} + } + return &tls.Config{ + Rand: cfg.Rand, + Time: cfg.Time, + Certificates: cfg.Certificates, + NameToCertificate: cfg.NameToCertificate, + GetCertificate: cfg.GetCertificate, + RootCAs: cfg.RootCAs, + NextProtos: cfg.NextProtos, + ServerName: cfg.ServerName, + ClientAuth: cfg.ClientAuth, + ClientCAs: cfg.ClientCAs, + InsecureSkipVerify: cfg.InsecureSkipVerify, + CipherSuites: cfg.CipherSuites, + PreferServerCipherSuites: cfg.PreferServerCipherSuites, + SessionTicketsDisabled: cfg.SessionTicketsDisabled, + SessionTicketKey: cfg.SessionTicketKey, + ClientSessionCache: cfg.ClientSessionCache, + MinVersion: cfg.MinVersion, + MaxVersion: cfg.MaxVersion, + CurvePreferences: cfg.CurvePreferences, + DynamicRecordSizingDisabled: cfg.DynamicRecordSizingDisabled, + Renegotiation: cfg.Renegotiation, + } +} diff --git a/vendor/google.golang.org/grpc/credentials/credentials_util_pre_go17.go b/vendor/google.golang.org/grpc/credentials/credentials_util_pre_go17.go new file mode 100644 index 0000000000..09b8d12c79 --- /dev/null +++ b/vendor/google.golang.org/grpc/credentials/credentials_util_pre_go17.go @@ -0,0 +1,74 @@ +// +build !go1.7 + +/* + * + * Copyright 2016, Google Inc. + * 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. + * + */ + +package credentials + +import ( + "crypto/tls" +) + +// cloneTLSConfig returns a shallow clone of the exported +// fields of cfg, ignoring the unexported sync.Once, which +// contains a mutex and must not be copied. +// +// If cfg is nil, a new zero tls.Config is returned. +// +// TODO replace this function with official clone function. +func cloneTLSConfig(cfg *tls.Config) *tls.Config { + if cfg == nil { + return &tls.Config{} + } + return &tls.Config{ + Rand: cfg.Rand, + Time: cfg.Time, + Certificates: cfg.Certificates, + NameToCertificate: cfg.NameToCertificate, + GetCertificate: cfg.GetCertificate, + RootCAs: cfg.RootCAs, + NextProtos: cfg.NextProtos, + ServerName: cfg.ServerName, + ClientAuth: cfg.ClientAuth, + ClientCAs: cfg.ClientCAs, + InsecureSkipVerify: cfg.InsecureSkipVerify, + CipherSuites: cfg.CipherSuites, + PreferServerCipherSuites: cfg.PreferServerCipherSuites, + SessionTicketsDisabled: cfg.SessionTicketsDisabled, + SessionTicketKey: cfg.SessionTicketKey, + ClientSessionCache: cfg.ClientSessionCache, + MinVersion: cfg.MinVersion, + MaxVersion: cfg.MaxVersion, + CurvePreferences: cfg.CurvePreferences, + } +} diff --git a/vendor/google.golang.org/grpc/metadata/metadata.go b/vendor/google.golang.org/grpc/metadata/metadata.go index 58469ddd3f..b320015682 100644 --- a/vendor/google.golang.org/grpc/metadata/metadata.go +++ b/vendor/google.golang.org/grpc/metadata/metadata.go @@ -60,15 +60,21 @@ func encodeKeyValue(k, v string) (string, string) { // DecodeKeyValue returns the original key and value corresponding to the // encoded data in k, v. +// If k is a binary header and v contains comma, v is split on comma before decoded, +// and the decoded v will be joined with comma before returned. func DecodeKeyValue(k, v string) (string, string, error) { if !strings.HasSuffix(k, binHdrSuffix) { return k, v, nil } - val, err := base64.StdEncoding.DecodeString(v) - if err != nil { - return "", "", err + vvs := strings.Split(v, ",") + for i, vv := range vvs { + val, err := base64.StdEncoding.DecodeString(vv) + if err != nil { + return "", "", err + } + vvs[i] = string(val) } - return k, string(val), nil + return k, strings.Join(vvs, ","), nil } // MD is a mapping from metadata keys to values. Users should use the following diff --git a/vendor/google.golang.org/grpc/rpc_util.go b/vendor/google.golang.org/grpc/rpc_util.go index d628717560..35ac9cc7b0 100644 --- a/vendor/google.golang.org/grpc/rpc_util.go +++ b/vendor/google.golang.org/grpc/rpc_util.go @@ -227,7 +227,7 @@ type parser struct { // No other error values or types must be returned, which also means // that the underlying io.Reader must not return an incompatible // error. -func (p *parser) recvMsg() (pf payloadFormat, msg []byte, err error) { +func (p *parser) recvMsg(maxMsgSize int) (pf payloadFormat, msg []byte, err error) { if _, err := io.ReadFull(p.r, p.header[:]); err != nil { return 0, nil, err } @@ -238,6 +238,9 @@ func (p *parser) recvMsg() (pf payloadFormat, msg []byte, err error) { if length == 0 { return pf, nil, nil } + if length > uint32(maxMsgSize) { + return 0, nil, Errorf(codes.Internal, "grpc: received message length %d exceeding the max size %d", length, maxMsgSize) + } // TODO(bradfitz,zhaoq): garbage. reuse buffer after proto decoding instead // of making it for each message: msg = make([]byte, int(length)) @@ -308,8 +311,8 @@ func checkRecvPayload(pf payloadFormat, recvCompress string, dc Decompressor) er return nil } -func recv(p *parser, c Codec, s *transport.Stream, dc Decompressor, m interface{}) error { - pf, d, err := p.recvMsg() +func recv(p *parser, c Codec, s *transport.Stream, dc Decompressor, m interface{}, maxMsgSize int) error { + pf, d, err := p.recvMsg(maxMsgSize) if err != nil { return err } @@ -319,11 +322,16 @@ func recv(p *parser, c Codec, s *transport.Stream, dc Decompressor, m interface{ if pf == compressionMade { d, err = dc.Do(bytes.NewReader(d)) if err != nil { - return transport.StreamErrorf(codes.Internal, "grpc: failed to decompress the received message %v", err) + return Errorf(codes.Internal, "grpc: failed to decompress the received message %v", err) } } + if len(d) > maxMsgSize { + // TODO: Revisit the error code. Currently keep it consistent with java + // implementation. + return Errorf(codes.Internal, "grpc: received a message of %d bytes exceeding %d limit", len(d), maxMsgSize) + } if err := c.Unmarshal(d, m); err != nil { - return transport.StreamErrorf(codes.Internal, "grpc: failed to unmarshal the received message %v", err) + return Errorf(codes.Internal, "grpc: failed to unmarshal the received message %v", err) } return nil } diff --git a/vendor/google.golang.org/grpc/server.go b/vendor/google.golang.org/grpc/server.go index a2b2b94d48..1ed8aac9eb 100644 --- a/vendor/google.golang.org/grpc/server.go +++ b/vendor/google.golang.org/grpc/server.go @@ -89,9 +89,13 @@ type service struct { type Server struct { opts options - mu sync.Mutex // guards following - lis map[net.Listener]bool - conns map[io.Closer]bool + mu sync.Mutex // guards following + lis map[net.Listener]bool + conns map[io.Closer]bool + drain bool + // A CondVar to let GracefulStop() blocks until all the pending RPCs are finished + // and all the transport goes away. + cv *sync.Cond m map[string]*service // service name -> service info events trace.EventLog } @@ -101,12 +105,15 @@ type options struct { codec Codec cp Compressor dc Decompressor + maxMsgSize int unaryInt UnaryServerInterceptor streamInt StreamServerInterceptor maxConcurrentStreams uint32 useHandlerImpl bool // use http.Handler-based server } +var defaultMaxMsgSize = 1024 * 1024 * 4 // use 4MB as the default message size limit + // A ServerOption sets options. type ServerOption func(*options) @@ -117,20 +124,28 @@ func CustomCodec(codec Codec) ServerOption { } } -// RPCCompressor returns a ServerOption that sets a compressor for outbound message. +// RPCCompressor returns a ServerOption that sets a compressor for outbound messages. func RPCCompressor(cp Compressor) ServerOption { return func(o *options) { o.cp = cp } } -// RPCDecompressor returns a ServerOption that sets a decompressor for inbound message. +// RPCDecompressor returns a ServerOption that sets a decompressor for inbound messages. func RPCDecompressor(dc Decompressor) ServerOption { return func(o *options) { o.dc = dc } } +// MaxMsgSize returns a ServerOption to set the max message size in bytes for inbound mesages. +// If this is not set, gRPC uses the default 4MB. +func MaxMsgSize(m int) ServerOption { + return func(o *options) { + o.maxMsgSize = m + } +} + // MaxConcurrentStreams returns a ServerOption that will apply a limit on the number // of concurrent streams to each ServerTransport. func MaxConcurrentStreams(n uint32) ServerOption { @@ -173,6 +188,7 @@ func StreamInterceptor(i StreamServerInterceptor) ServerOption { // started to accept requests yet. func NewServer(opt ...ServerOption) *Server { var opts options + opts.maxMsgSize = defaultMaxMsgSize for _, o := range opt { o(&opts) } @@ -186,6 +202,7 @@ func NewServer(opt ...ServerOption) *Server { conns: make(map[io.Closer]bool), m: make(map[string]*service), } + s.cv = sync.NewCond(&s.mu) if EnableTracing { _, file, line, _ := runtime.Caller(1) s.events = trace.NewEventLog("grpc.Server", fmt.Sprintf("%s:%d", file, line)) @@ -264,8 +281,8 @@ type ServiceInfo struct { // GetServiceInfo returns a map from service names to ServiceInfo. // Service names include the package names, in the form of .. -func (s *Server) GetServiceInfo() map[string]*ServiceInfo { - ret := make(map[string]*ServiceInfo) +func (s *Server) GetServiceInfo() map[string]ServiceInfo { + ret := make(map[string]ServiceInfo) for n, srv := range s.m { methods := make([]MethodInfo, 0, len(srv.md)+len(srv.sd)) for m := range srv.md { @@ -283,7 +300,7 @@ func (s *Server) GetServiceInfo() map[string]*ServiceInfo { }) } - ret[n] = &ServiceInfo{ + ret[n] = ServiceInfo{ Methods: methods, Metadata: srv.mdata, } @@ -468,7 +485,7 @@ func (s *Server) traceInfo(st transport.ServerTransport, stream *transport.Strea func (s *Server) addConn(c io.Closer) bool { s.mu.Lock() defer s.mu.Unlock() - if s.conns == nil { + if s.conns == nil || s.drain { return false } s.conns[c] = true @@ -480,6 +497,7 @@ func (s *Server) removeConn(c io.Closer) { defer s.mu.Unlock() if s.conns != nil { delete(s.conns, c) + s.cv.Signal() } } @@ -520,7 +538,7 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. } p := &parser{r: stream} for { - pf, req, err := p.recvMsg() + pf, req, err := p.recvMsg(s.opts.maxMsgSize) if err == io.EOF { // The entire stream is done (for unary RPC only). return err @@ -530,6 +548,10 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. } if err != nil { switch err := err.(type) { + case *rpcError: + if err := t.WriteStatus(stream, err.code, err.desc); err != nil { + grpclog.Printf("grpc: Server.processUnaryRPC failed to write status %v", err) + } case transport.ConnectionError: // Nothing to do here. case transport.StreamError: @@ -569,6 +591,12 @@ func (s *Server) processUnaryRPC(t transport.ServerTransport, stream *transport. return err } } + if len(req) > s.opts.maxMsgSize { + // TODO: Revisit the error code. Currently keep it consistent with + // java implementation. + statusCode = codes.Internal + statusDesc = fmt.Sprintf("grpc: server received a message of %d bytes exceeding %d limit", len(req), s.opts.maxMsgSize) + } if err := s.opts.codec.Unmarshal(req, v); err != nil { return err } @@ -628,13 +656,14 @@ func (s *Server) processStreamingRPC(t transport.ServerTransport, stream *transp stream.SetSendCompress(s.opts.cp.Type()) } ss := &serverStream{ - t: t, - s: stream, - p: &parser{r: stream}, - codec: s.opts.codec, - cp: s.opts.cp, - dc: s.opts.dc, - trInfo: trInfo, + t: t, + s: stream, + p: &parser{r: stream}, + codec: s.opts.codec, + cp: s.opts.cp, + dc: s.opts.dc, + maxMsgSize: s.opts.maxMsgSize, + trInfo: trInfo, } if ss.cp != nil { ss.cbuf = new(bytes.Buffer) @@ -766,14 +795,16 @@ func (s *Server) Stop() { s.mu.Lock() listeners := s.lis s.lis = nil - cs := s.conns + st := s.conns s.conns = nil + // interrupt GracefulStop if Stop and GracefulStop are called concurrently. + s.cv.Signal() s.mu.Unlock() for lis := range listeners { lis.Close() } - for c := range cs { + for c := range st { c.Close() } @@ -785,6 +816,32 @@ func (s *Server) Stop() { s.mu.Unlock() } +// GracefulStop stops the gRPC server gracefully. It stops the server to accept new +// connections and RPCs and blocks until all the pending RPCs are finished. +func (s *Server) GracefulStop() { + s.mu.Lock() + defer s.mu.Unlock() + if s.drain == true || s.conns == nil { + return + } + s.drain = true + for lis := range s.lis { + lis.Close() + } + s.lis = nil + for c := range s.conns { + c.(transport.ServerTransport).Drain() + } + for len(s.conns) != 0 { + s.cv.Wait() + } + s.conns = nil + if s.events != nil { + s.events.Finish() + s.events = nil + } +} + func init() { internal.TestingCloseConns = func(arg interface{}) { arg.(*Server).testingCloseConns() diff --git a/vendor/google.golang.org/grpc/stream.go b/vendor/google.golang.org/grpc/stream.go index 7a3bef511b..51df3f01da 100644 --- a/vendor/google.golang.org/grpc/stream.go +++ b/vendor/google.golang.org/grpc/stream.go @@ -37,6 +37,7 @@ import ( "bytes" "errors" "io" + "math" "sync" "time" @@ -84,12 +85,9 @@ type ClientStream interface { // Header returns the header metadata received from the server if there // is any. It blocks if the metadata is not ready to read. Header() (metadata.MD, error) - // Trailer returns the trailer metadata from the server. It must be called - // after stream.Recv() returns non-nil error (including io.EOF) for - // bi-directional streaming and server streaming or stream.CloseAndRecv() - // returns for client streaming in order to receive trailer metadata if - // present. Otherwise, it could returns an empty MD even though trailer - // is present. + // Trailer returns the trailer metadata from the server, if there is any. + // It must only be called after stream.CloseAndRecv has returned, or + // stream.Recv has returned a non-nil error (including io.EOF). Trailer() metadata.MD // CloseSend closes the send direction of the stream. It closes the stream // when non-nil error is met. @@ -99,11 +97,10 @@ type ClientStream interface { // NewClientStream creates a new Stream for the client side. This is called // by generated code. -func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (ClientStream, error) { +func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, method string, opts ...CallOption) (_ ClientStream, err error) { var ( t transport.ClientTransport s *transport.Stream - err error put func() ) c := defaultCallInfo @@ -120,27 +117,24 @@ func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth if cc.dopts.cp != nil { callHdr.SendCompress = cc.dopts.cp.Type() } - cs := &clientStream{ - opts: opts, - c: c, - desc: desc, - codec: cc.dopts.codec, - cp: cc.dopts.cp, - dc: cc.dopts.dc, - tracing: EnableTracing, - } - if cc.dopts.cp != nil { - callHdr.SendCompress = cc.dopts.cp.Type() - cs.cbuf = new(bytes.Buffer) - } - if cs.tracing { - cs.trInfo.tr = trace.New("grpc.Sent."+methodFamily(method), method) - cs.trInfo.firstLine.client = true + var trInfo traceInfo + if EnableTracing { + trInfo.tr = trace.New("grpc.Sent."+methodFamily(method), method) + trInfo.firstLine.client = true if deadline, ok := ctx.Deadline(); ok { - cs.trInfo.firstLine.deadline = deadline.Sub(time.Now()) + trInfo.firstLine.deadline = deadline.Sub(time.Now()) } - cs.trInfo.tr.LazyLog(&cs.trInfo.firstLine, false) - ctx = trace.NewContext(ctx, cs.trInfo.tr) + trInfo.tr.LazyLog(&trInfo.firstLine, false) + ctx = trace.NewContext(ctx, trInfo.tr) + defer func() { + if err != nil { + // Need to call tr.finish() if error is returned. + // Because tr will not be returned to caller. + trInfo.tr.LazyPrintf("RPC: [%v]", err) + trInfo.tr.SetError() + trInfo.tr.Finish() + } + }() } gopts := BalancerGetOptions{ BlockingWait: !c.failFast, @@ -152,9 +146,9 @@ func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth if _, ok := err.(*rpcError); ok { return nil, err } - if err == errConnClosing { + if err == errConnClosing || err == errConnUnavailable { if c.failFast { - return nil, Errorf(codes.Unavailable, "%v", errConnClosing) + return nil, Errorf(codes.Unavailable, "%v", err) } continue } @@ -168,9 +162,8 @@ func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth put() put = nil } - if _, ok := err.(transport.ConnectionError); ok { + if _, ok := err.(transport.ConnectionError); ok || err == transport.ErrStreamDrain { if c.failFast { - cs.finish(err) return nil, toRPCErr(err) } continue @@ -179,16 +172,43 @@ func NewClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth } break } - cs.put = put - cs.t = t - cs.s = s - cs.p = &parser{r: s} - // Listen on ctx.Done() to detect cancellation when there is no pending - // I/O operations on this stream. + cs := &clientStream{ + opts: opts, + c: c, + desc: desc, + codec: cc.dopts.codec, + cp: cc.dopts.cp, + dc: cc.dopts.dc, + + put: put, + t: t, + s: s, + p: &parser{r: s}, + + tracing: EnableTracing, + trInfo: trInfo, + } + if cc.dopts.cp != nil { + cs.cbuf = new(bytes.Buffer) + } + // Listen on ctx.Done() to detect cancellation and s.Done() to detect normal termination + // when there is no pending I/O operations on this stream. go func() { select { case <-t.Error(): // Incur transport error, simply exit. + case <-s.Done(): + // TODO: The trace of the RPC is terminated here when there is no pending + // I/O, which is probably not the optimal solution. + if s.StatusCode() == codes.OK { + cs.finish(nil) + } else { + cs.finish(Errorf(s.StatusCode(), "%s", s.StatusDesc())) + } + cs.closeTransportStream(nil) + case <-s.GoAway(): + cs.finish(errConnDrain) + cs.closeTransportStream(errConnDrain) case <-s.Context().Done(): err := s.Context().Err() cs.finish(err) @@ -251,7 +271,17 @@ func (cs *clientStream) SendMsg(m interface{}) (err error) { if err != nil { cs.finish(err) } - if err == nil || err == io.EOF { + if err == nil { + return + } + if err == io.EOF { + // Specialize the process for server streaming. SendMesg is only called + // once when creating the stream object. io.EOF needs to be skipped when + // the rpc is early finished (before the stream object is created.). + // TODO: It is probably better to move this into the generated code. + if !cs.desc.ClientStreams && cs.desc.ServerStreams { + err = nil + } return } if _, ok := err.(transport.ConnectionError); !ok { @@ -272,7 +302,7 @@ func (cs *clientStream) SendMsg(m interface{}) (err error) { } func (cs *clientStream) RecvMsg(m interface{}) (err error) { - err = recv(cs.p, cs.codec, cs.s, cs.dc, m) + err = recv(cs.p, cs.codec, cs.s, cs.dc, m, math.MaxInt32) defer func() { // err != nil indicates the termination of the stream. if err != nil { @@ -291,7 +321,7 @@ func (cs *clientStream) RecvMsg(m interface{}) (err error) { return } // Special handling for client streaming rpc. - err = recv(cs.p, cs.codec, cs.s, cs.dc, m) + err = recv(cs.p, cs.codec, cs.s, cs.dc, m, math.MaxInt32) cs.closeTransportStream(err) if err == nil { return toRPCErr(errors.New("grpc: client streaming protocol violation: get , want ")) @@ -326,7 +356,7 @@ func (cs *clientStream) CloseSend() (err error) { } }() if err == nil || err == io.EOF { - return + return nil } if _, ok := err.(transport.ConnectionError); !ok { cs.closeTransportStream(err) @@ -392,6 +422,7 @@ type serverStream struct { cp Compressor dc Decompressor cbuf *bytes.Buffer + maxMsgSize int statusCode codes.Code statusDesc string trInfo *traceInfo @@ -458,5 +489,5 @@ func (ss *serverStream) RecvMsg(m interface{}) (err error) { ss.mu.Unlock() } }() - return recv(ss.p, ss.codec, ss.s, ss.dc, m) + return recv(ss.p, ss.codec, ss.s, ss.dc, m, ss.maxMsgSize) } diff --git a/vendor/google.golang.org/grpc/transport/control.go b/vendor/google.golang.org/grpc/transport/control.go index 7e9bdf3350..4ef0830b56 100644 --- a/vendor/google.golang.org/grpc/transport/control.go +++ b/vendor/google.golang.org/grpc/transport/control.go @@ -72,6 +72,11 @@ type resetStream struct { func (*resetStream) item() {} +type goAway struct { +} + +func (*goAway) item() {} + type flushIO struct { } diff --git a/vendor/google.golang.org/grpc/transport/go16.go b/vendor/google.golang.org/grpc/transport/go16.go new file mode 100644 index 0000000000..ee1c46bad5 --- /dev/null +++ b/vendor/google.golang.org/grpc/transport/go16.go @@ -0,0 +1,46 @@ +// +build go1.6,!go1.7 + +/* + * Copyright 2016, Google Inc. + * 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. + * + */ + +package transport + +import ( + "net" + + "golang.org/x/net/context" +) + +// dialContext connects to the address on the named network. +func dialContext(ctx context.Context, network, address string) (net.Conn, error) { + return (&net.Dialer{Cancel: ctx.Done()}).Dial(network, address) +} diff --git a/vendor/google.golang.org/grpc/transport/go17.go b/vendor/google.golang.org/grpc/transport/go17.go new file mode 100644 index 0000000000..356f13ff19 --- /dev/null +++ b/vendor/google.golang.org/grpc/transport/go17.go @@ -0,0 +1,46 @@ +// +build go1.7 + +/* + * Copyright 2016, Google Inc. + * 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. + * + */ + +package transport + +import ( + "net" + + "golang.org/x/net/context" +) + +// dialContext connects to the address on the named network. +func dialContext(ctx context.Context, network, address string) (net.Conn, error) { + return (&net.Dialer{}).DialContext(ctx, network, address) +} diff --git a/vendor/google.golang.org/grpc/transport/handler_server.go b/vendor/google.golang.org/grpc/transport/handler_server.go index 4b0d525243..30e21ac0f4 100644 --- a/vendor/google.golang.org/grpc/transport/handler_server.go +++ b/vendor/google.golang.org/grpc/transport/handler_server.go @@ -83,7 +83,7 @@ func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request) (ServerTr } if v := r.Header.Get("grpc-timeout"); v != "" { - to, err := timeoutDecode(v) + to, err := decodeTimeout(v) if err != nil { return nil, StreamErrorf(codes.Internal, "malformed time-out: %v", err) } @@ -194,7 +194,7 @@ func (ht *serverHandlerTransport) WriteStatus(s *Stream, statusCode codes.Code, h := ht.rw.Header() h.Set("Grpc-Status", fmt.Sprintf("%d", statusCode)) if statusDesc != "" { - h.Set("Grpc-Message", statusDesc) + h.Set("Grpc-Message", encodeGrpcMessage(statusDesc)) } if md := s.Trailer(); len(md) > 0 { for k, vv := range md { @@ -370,6 +370,10 @@ func (ht *serverHandlerTransport) runStream() { } } +func (ht *serverHandlerTransport) Drain() { + panic("Drain() is not implemented") +} + // mapRecvMsgError returns the non-nil err into the appropriate // error value as expected by callers of *grpc.parser.recvMsg. // In particular, in can only be: diff --git a/vendor/google.golang.org/grpc/transport/http2_client.go b/vendor/google.golang.org/grpc/transport/http2_client.go index f66435fdbd..5819cb8a43 100644 --- a/vendor/google.golang.org/grpc/transport/http2_client.go +++ b/vendor/google.golang.org/grpc/transport/http2_client.go @@ -35,6 +35,7 @@ package transport import ( "bytes" + "fmt" "io" "math" "net" @@ -71,6 +72,9 @@ type http2Client struct { shutdownChan chan struct{} // errorChan is closed to notify the I/O error to the caller. errorChan chan struct{} + // goAway is closed to notify the upper layer (i.e., addrConn.transportMonitor) + // that the server sent GoAway on this transport. + goAway chan struct{} framer *framer hBuf *bytes.Buffer // the buffer for HPACK encoding @@ -97,41 +101,44 @@ type http2Client struct { maxStreams int // the per-stream outbound flow control window size set by the peer. streamSendQuota uint32 + // goAwayID records the Last-Stream-ID in the GoAway frame from the server. + goAwayID uint32 + // prevGoAway ID records the Last-Stream-ID in the previous GOAway frame. + prevGoAwayID uint32 +} + +func dial(fn func(context.Context, string) (net.Conn, error), ctx context.Context, addr string) (net.Conn, error) { + if fn != nil { + return fn(ctx, addr) + } + return dialContext(ctx, "tcp", addr) } // newHTTP2Client constructs a connected ClientTransport to addr based on HTTP2 // and starts to receive messages on it. Non-nil error returns if construction // fails. -func newHTTP2Client(addr string, opts *ConnectOptions) (_ ClientTransport, err error) { - if opts.Dialer == nil { - // Set the default Dialer. - opts.Dialer = func(addr string, timeout time.Duration) (net.Conn, error) { - return net.DialTimeout("tcp", addr, timeout) - } - } +func newHTTP2Client(ctx context.Context, addr string, opts ConnectOptions) (_ ClientTransport, err error) { scheme := "http" - startT := time.Now() - timeout := opts.Timeout - conn, connErr := opts.Dialer(addr, timeout) + conn, connErr := dial(opts.Dialer, ctx, addr) if connErr != nil { - return nil, ConnectionErrorf("transport: %v", connErr) + return nil, ConnectionErrorf(true, connErr, "transport: %v", connErr) } - var authInfo credentials.AuthInfo - if opts.TransportCredentials != nil { - scheme = "https" - if timeout > 0 { - timeout -= time.Since(startT) - } - conn, authInfo, connErr = opts.TransportCredentials.ClientHandshake(addr, conn, timeout) - } - if connErr != nil { - return nil, ConnectionErrorf("transport: %v", connErr) - } - defer func() { + // Any further errors will close the underlying connection + defer func(conn net.Conn) { if err != nil { conn.Close() } - }() + }(conn) + var authInfo credentials.AuthInfo + if creds := opts.TransportCredentials; creds != nil { + scheme = "https" + conn, authInfo, connErr = creds.ClientHandshake(ctx, addr, conn) + } + if connErr != nil { + // Credentials handshake error is not a temporary error (unless the error + // was the connection closing). + return nil, ConnectionErrorf(connErr == io.EOF, connErr, "transport: %v", connErr) + } ua := primaryUA if opts.UserAgent != "" { ua = opts.UserAgent + " " + ua @@ -147,6 +154,7 @@ func newHTTP2Client(addr string, opts *ConnectOptions) (_ ClientTransport, err e writableChan: make(chan int, 1), shutdownChan: make(chan struct{}), errorChan: make(chan struct{}), + goAway: make(chan struct{}), framer: newFramer(conn), hBuf: &buf, hEnc: hpack.NewEncoder(&buf), @@ -168,11 +176,11 @@ func newHTTP2Client(addr string, opts *ConnectOptions) (_ ClientTransport, err e n, err := t.conn.Write(clientPreface) if err != nil { t.Close() - return nil, ConnectionErrorf("transport: %v", err) + return nil, ConnectionErrorf(true, err, "transport: %v", err) } if n != len(clientPreface) { t.Close() - return nil, ConnectionErrorf("transport: preface mismatch, wrote %d bytes; want %d", n, len(clientPreface)) + return nil, ConnectionErrorf(true, err, "transport: preface mismatch, wrote %d bytes; want %d", n, len(clientPreface)) } if initialWindowSize != defaultWindowSize { err = t.framer.writeSettings(true, http2.Setting{ @@ -184,13 +192,13 @@ func newHTTP2Client(addr string, opts *ConnectOptions) (_ ClientTransport, err e } if err != nil { t.Close() - return nil, ConnectionErrorf("transport: %v", err) + return nil, ConnectionErrorf(true, err, "transport: %v", err) } // Adjust the connection flow control window if needed. if delta := uint32(initialConnWindowSize - defaultWindowSize); delta > 0 { if err := t.framer.writeWindowUpdate(true, 0, delta); err != nil { t.Close() - return nil, ConnectionErrorf("transport: %v", err) + return nil, ConnectionErrorf(true, err, "transport: %v", err) } } go t.controller() @@ -202,6 +210,8 @@ func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *Stream { // TODO(zhaoq): Handle uint32 overflow of Stream.id. s := &Stream{ id: t.nextID, + done: make(chan struct{}), + goAway: make(chan struct{}), method: callHdr.Method, sendCompress: callHdr.SendCompress, buf: newRecvBuffer(), @@ -216,8 +226,9 @@ func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *Stream { // Make a stream be able to cancel the pending operations by itself. s.ctx, s.cancel = context.WithCancel(ctx) s.dec = &recvBufferReader{ - ctx: s.ctx, - recv: s.buf, + ctx: s.ctx, + goAway: s.goAway, + recv: s.buf, } return s } @@ -271,6 +282,10 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea t.mu.Unlock() return nil, ErrConnClosing } + if t.state == draining { + t.mu.Unlock() + return nil, ErrStreamDrain + } if t.state != reachable { t.mu.Unlock() return nil, ErrConnClosing @@ -278,7 +293,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea checkStreamsQuota := t.streamsQuota != nil t.mu.Unlock() if checkStreamsQuota { - sq, err := wait(ctx, t.shutdownChan, t.streamsQuota.acquire()) + sq, err := wait(ctx, nil, nil, t.shutdownChan, t.streamsQuota.acquire()) if err != nil { return nil, err } @@ -287,7 +302,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea t.streamsQuota.add(sq - 1) } } - if _, err := wait(ctx, t.shutdownChan, t.writableChan); err != nil { + if _, err := wait(ctx, nil, nil, t.shutdownChan, t.writableChan); err != nil { // Return the quota back now because there is no stream returned to the caller. if _, ok := err.(StreamError); ok && checkStreamsQuota { t.streamsQuota.add(1) @@ -295,6 +310,15 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea return nil, err } t.mu.Lock() + if t.state == draining { + t.mu.Unlock() + if checkStreamsQuota { + t.streamsQuota.add(1) + } + // Need to make t writable again so that the rpc in flight can still proceed. + t.writableChan <- 0 + return nil, ErrStreamDrain + } if t.state != reachable { t.mu.Unlock() return nil, ErrConnClosing @@ -329,7 +353,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-encoding", Value: callHdr.SendCompress}) } if timeout > 0 { - t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-timeout", Value: timeoutEncode(timeout)}) + t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-timeout", Value: encodeTimeout(timeout)}) } for k, v := range authData { // Capital header names are illegal in HTTP/2. @@ -384,7 +408,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea } if err != nil { t.notifyError(err) - return nil, ConnectionErrorf("transport: %v", err) + return nil, ConnectionErrorf(true, err, "transport: %v", err) } } t.writableChan <- 0 @@ -403,22 +427,17 @@ func (t *http2Client) CloseStream(s *Stream, err error) { if t.streamsQuota != nil { updateStreams = true } - if t.state == draining && len(t.activeStreams) == 1 { + delete(t.activeStreams, s.id) + if t.state == draining && len(t.activeStreams) == 0 { // The transport is draining and s is the last live stream on t. t.mu.Unlock() t.Close() return } - delete(t.activeStreams, s.id) t.mu.Unlock() if updateStreams { t.streamsQuota.add(1) } - // In case stream sending and receiving are invoked in separate - // goroutines (e.g., bi-directional streaming), the caller needs - // to call cancel on the stream to interrupt the blocking on - // other goroutines. - s.cancel() s.mu.Lock() if q := s.fc.resetPendingData(); q > 0 { if n := t.fc.onRead(q); n > 0 { @@ -445,13 +464,13 @@ func (t *http2Client) CloseStream(s *Stream, err error) { // accessed any more. func (t *http2Client) Close() (err error) { t.mu.Lock() - if t.state == reachable { - close(t.errorChan) - } if t.state == closing { t.mu.Unlock() return } + if t.state == reachable || t.state == draining { + close(t.errorChan) + } t.state = closing t.mu.Unlock() close(t.shutdownChan) @@ -475,10 +494,35 @@ func (t *http2Client) Close() (err error) { func (t *http2Client) GracefulClose() error { t.mu.Lock() - if t.state == closing { + switch t.state { + case unreachable: + // The server may close the connection concurrently. t is not available for + // any streams. Close it now. + t.mu.Unlock() + t.Close() + return nil + case closing: t.mu.Unlock() return nil } + // Notify the streams which were initiated after the server sent GOAWAY. + select { + case <-t.goAway: + n := t.prevGoAwayID + if n == 0 && t.nextID > 1 { + n = t.nextID - 2 + } + m := t.goAwayID + 2 + if m == 2 { + m = 1 + } + for i := m; i <= n; i += 2 { + if s, ok := t.activeStreams[i]; ok { + close(s.goAway) + } + } + default: + } if t.state == draining { t.mu.Unlock() return nil @@ -504,15 +548,15 @@ func (t *http2Client) Write(s *Stream, data []byte, opts *Options) error { size := http2MaxFrameLen s.sendQuotaPool.add(0) // Wait until the stream has some quota to send the data. - sq, err := wait(s.ctx, t.shutdownChan, s.sendQuotaPool.acquire()) + sq, err := wait(s.ctx, s.done, s.goAway, t.shutdownChan, s.sendQuotaPool.acquire()) if err != nil { return err } t.sendQuotaPool.add(0) // Wait until the transport has some quota to send the data. - tq, err := wait(s.ctx, t.shutdownChan, t.sendQuotaPool.acquire()) + tq, err := wait(s.ctx, s.done, s.goAway, t.shutdownChan, t.sendQuotaPool.acquire()) if err != nil { - if _, ok := err.(StreamError); ok { + if _, ok := err.(StreamError); ok || err == io.EOF { t.sendQuotaPool.cancel() } return err @@ -544,8 +588,8 @@ func (t *http2Client) Write(s *Stream, data []byte, opts *Options) error { // Indicate there is a writer who is about to write a data frame. t.framer.adjustNumWriters(1) // Got some quota. Try to acquire writing privilege on the transport. - if _, err := wait(s.ctx, t.shutdownChan, t.writableChan); err != nil { - if _, ok := err.(StreamError); ok { + if _, err := wait(s.ctx, s.done, s.goAway, t.shutdownChan, t.writableChan); err != nil { + if _, ok := err.(StreamError); ok || err == io.EOF { // Return the connection quota back. t.sendQuotaPool.add(len(p)) } @@ -578,7 +622,7 @@ func (t *http2Client) Write(s *Stream, data []byte, opts *Options) error { // invoked. if err := t.framer.writeData(forceFlush, s.id, endStream, p); err != nil { t.notifyError(err) - return ConnectionErrorf("transport: %v", err) + return ConnectionErrorf(true, err, "transport: %v", err) } if t.framer.adjustNumWriters(-1) == 0 { t.framer.flushWrite() @@ -593,11 +637,7 @@ func (t *http2Client) Write(s *Stream, data []byte, opts *Options) error { } s.mu.Lock() if s.state != streamDone { - if s.state == streamReadDone { - s.state = streamDone - } else { - s.state = streamWriteDone - } + s.state = streamWriteDone } s.mu.Unlock() return nil @@ -630,7 +670,7 @@ func (t *http2Client) updateWindow(s *Stream, n uint32) { func (t *http2Client) handleData(f *http2.DataFrame) { size := len(f.Data()) if err := t.fc.onData(uint32(size)); err != nil { - t.notifyError(ConnectionErrorf("%v", err)) + t.notifyError(ConnectionErrorf(true, err, "%v", err)) return } // Select the right stream to dispatch. @@ -655,6 +695,7 @@ func (t *http2Client) handleData(f *http2.DataFrame) { s.state = streamDone s.statusCode = codes.Internal s.statusDesc = err.Error() + close(s.done) s.mu.Unlock() s.write(recvMsg{err: io.EOF}) t.controlBuf.put(&resetStream{s.id, http2.ErrCodeFlowControl}) @@ -672,13 +713,14 @@ func (t *http2Client) handleData(f *http2.DataFrame) { // the read direction is closed, and set the status appropriately. if f.FrameHeader.Flags.Has(http2.FlagDataEndStream) { s.mu.Lock() - if s.state == streamWriteDone { - s.state = streamDone - } else { - s.state = streamReadDone + if s.state == streamDone { + s.mu.Unlock() + return } + s.state = streamDone s.statusCode = codes.Internal s.statusDesc = "server closed the stream without sending trailers" + close(s.done) s.mu.Unlock() s.write(recvMsg{err: io.EOF}) } @@ -704,6 +746,8 @@ func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) { grpclog.Println("transport: http2Client.handleRSTStream found no mapped gRPC status for the received http2 error ", f.ErrCode) s.statusCode = codes.Unknown } + s.statusDesc = fmt.Sprintf("stream terminated by RST_STREAM with error code: %d", f.ErrCode) + close(s.done) s.mu.Unlock() s.write(recvMsg{err: io.EOF}) } @@ -728,7 +772,32 @@ func (t *http2Client) handlePing(f *http2.PingFrame) { } func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) { - // TODO(zhaoq): GoAwayFrame handler to be implemented + t.mu.Lock() + if t.state == reachable || t.state == draining { + if f.LastStreamID > 0 && f.LastStreamID%2 != 1 { + t.mu.Unlock() + t.notifyError(ConnectionErrorf(true, nil, "received illegal http2 GOAWAY frame: stream ID %d is even", f.LastStreamID)) + return + } + select { + case <-t.goAway: + id := t.goAwayID + // t.goAway has been closed (i.e.,multiple GoAways). + if id < f.LastStreamID { + t.mu.Unlock() + t.notifyError(ConnectionErrorf(true, nil, "received illegal http2 GOAWAY frame: previously recv GOAWAY frame with LastStramID %d, currently recv %d", id, f.LastStreamID)) + return + } + t.prevGoAwayID = id + t.goAwayID = f.LastStreamID + t.mu.Unlock() + return + default: + } + t.goAwayID = f.LastStreamID + close(t.goAway) + } + t.mu.Unlock() } func (t *http2Client) handleWindowUpdate(f *http2.WindowUpdateFrame) { @@ -780,11 +849,11 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { if len(state.mdata) > 0 { s.trailer = state.mdata } - s.state = streamDone s.statusCode = state.statusCode s.statusDesc = state.statusDesc + close(s.done) + s.state = streamDone s.mu.Unlock() - s.write(recvMsg{err: io.EOF}) } @@ -937,13 +1006,22 @@ func (t *http2Client) Error() <-chan struct{} { return t.errorChan } +func (t *http2Client) GoAway() <-chan struct{} { + return t.goAway +} + func (t *http2Client) notifyError(err error) { t.mu.Lock() - defer t.mu.Unlock() // make sure t.errorChan is closed only once. + if t.state == draining { + t.mu.Unlock() + t.Close() + return + } if t.state == reachable { t.state = unreachable close(t.errorChan) grpclog.Printf("transport: http2Client.notifyError got notified that the client transport was broken %v.", err) } + t.mu.Unlock() } diff --git a/vendor/google.golang.org/grpc/transport/http2_server.go b/vendor/google.golang.org/grpc/transport/http2_server.go index cee1542976..16010d55fb 100644 --- a/vendor/google.golang.org/grpc/transport/http2_server.go +++ b/vendor/google.golang.org/grpc/transport/http2_server.go @@ -111,12 +111,12 @@ func newHTTP2Server(conn net.Conn, maxStreams uint32, authInfo credentials.AuthI Val: uint32(initialWindowSize)}) } if err := framer.writeSettings(true, settings...); err != nil { - return nil, ConnectionErrorf("transport: %v", err) + return nil, ConnectionErrorf(true, err, "transport: %v", err) } // Adjust the connection flow control window if needed. if delta := uint32(initialConnWindowSize - defaultWindowSize); delta > 0 { if err := framer.writeWindowUpdate(true, 0, delta); err != nil { - return nil, ConnectionErrorf("transport: %v", err) + return nil, ConnectionErrorf(true, err, "transport: %v", err) } } var buf bytes.Buffer @@ -142,7 +142,7 @@ func newHTTP2Server(conn net.Conn, maxStreams uint32, authInfo credentials.AuthI } // operateHeader takes action on the decoded headers. -func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(*Stream)) { +func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(*Stream)) (close bool) { buf := newRecvBuffer() s := &Stream{ id: frame.Header().StreamID, @@ -205,6 +205,13 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( t.controlBuf.put(&resetStream{s.id, http2.ErrCodeRefusedStream}) return } + if s.id%2 != 1 || s.id <= t.maxStreamID { + t.mu.Unlock() + // illegal gRPC stream id. + grpclog.Println("transport: http2Server.HandleStreams received an illegal stream id: ", s.id) + return true + } + t.maxStreamID = s.id s.sendQuotaPool = newQuotaPool(int(t.streamSendQuota)) t.activeStreams[s.id] = s t.mu.Unlock() @@ -212,6 +219,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func( t.updateWindow(s, uint32(n)) } handle(s) + return } // HandleStreams receives incoming streams using the given handler. This is @@ -231,6 +239,10 @@ func (t *http2Server) HandleStreams(handle func(*Stream)) { } frame, err := t.framer.readFrame() + if err == io.EOF || err == io.ErrUnexpectedEOF { + t.Close() + return + } if err != nil { grpclog.Printf("transport: http2Server.HandleStreams failed to read frame: %v", err) t.Close() @@ -257,20 +269,20 @@ func (t *http2Server) HandleStreams(handle func(*Stream)) { t.controlBuf.put(&resetStream{se.StreamID, se.Code}) continue } + if err == io.EOF || err == io.ErrUnexpectedEOF { + t.Close() + return + } + grpclog.Printf("transport: http2Server.HandleStreams failed to read frame: %v", err) t.Close() return } switch frame := frame.(type) { case *http2.MetaHeadersFrame: - id := frame.Header().StreamID - if id%2 != 1 || id <= t.maxStreamID { - // illegal gRPC stream id. - grpclog.Println("transport: http2Server.HandleStreams received an illegal stream id: ", id) + if t.operateHeaders(frame, handle) { t.Close() break } - t.maxStreamID = id - t.operateHeaders(frame, handle) case *http2.DataFrame: t.handleData(frame) case *http2.RSTStreamFrame: @@ -282,7 +294,7 @@ func (t *http2Server) HandleStreams(handle func(*Stream)) { case *http2.WindowUpdateFrame: t.handleWindowUpdate(frame) case *http2.GoAwayFrame: - break + // TODO: Handle GoAway from the client appropriately. default: grpclog.Printf("transport: http2Server.HandleStreams found unhandled frame type %v.", frame) } @@ -364,11 +376,7 @@ func (t *http2Server) handleData(f *http2.DataFrame) { // Received the end of stream from the client. s.mu.Lock() if s.state != streamDone { - if s.state == streamWriteDone { - s.state = streamDone - } else { - s.state = streamReadDone - } + s.state = streamReadDone } s.mu.Unlock() s.write(recvMsg{err: io.EOF}) @@ -440,7 +448,7 @@ func (t *http2Server) writeHeaders(s *Stream, b *bytes.Buffer, endStream bool) e } if err != nil { t.Close() - return ConnectionErrorf("transport: %v", err) + return ConnectionErrorf(true, err, "transport: %v", err) } } return nil @@ -455,7 +463,7 @@ func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { } s.headerOk = true s.mu.Unlock() - if _, err := wait(s.ctx, t.shutdownChan, t.writableChan); err != nil { + if _, err := wait(s.ctx, nil, nil, t.shutdownChan, t.writableChan); err != nil { return err } t.hBuf.Reset() @@ -495,7 +503,7 @@ func (t *http2Server) WriteStatus(s *Stream, statusCode codes.Code, statusDesc s headersSent = true } s.mu.Unlock() - if _, err := wait(s.ctx, t.shutdownChan, t.writableChan); err != nil { + if _, err := wait(s.ctx, nil, nil, t.shutdownChan, t.writableChan); err != nil { return err } t.hBuf.Reset() @@ -508,7 +516,7 @@ func (t *http2Server) WriteStatus(s *Stream, statusCode codes.Code, statusDesc s Name: "grpc-status", Value: strconv.Itoa(int(statusCode)), }) - t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-message", Value: statusDesc}) + t.hEnc.WriteField(hpack.HeaderField{Name: "grpc-message", Value: encodeGrpcMessage(statusDesc)}) // Attach the trailer metadata. for k, v := range s.trailer { // Clients don't tolerate reading restricted headers after some non restricted ones were sent. @@ -544,7 +552,7 @@ func (t *http2Server) Write(s *Stream, data []byte, opts *Options) error { } s.mu.Unlock() if writeHeaderFrame { - if _, err := wait(s.ctx, t.shutdownChan, t.writableChan); err != nil { + if _, err := wait(s.ctx, nil, nil, t.shutdownChan, t.writableChan); err != nil { return err } t.hBuf.Reset() @@ -560,7 +568,7 @@ func (t *http2Server) Write(s *Stream, data []byte, opts *Options) error { } if err := t.framer.writeHeaders(false, p); err != nil { t.Close() - return ConnectionErrorf("transport: %v", err) + return ConnectionErrorf(true, err, "transport: %v", err) } t.writableChan <- 0 } @@ -572,13 +580,13 @@ func (t *http2Server) Write(s *Stream, data []byte, opts *Options) error { size := http2MaxFrameLen s.sendQuotaPool.add(0) // Wait until the stream has some quota to send the data. - sq, err := wait(s.ctx, t.shutdownChan, s.sendQuotaPool.acquire()) + sq, err := wait(s.ctx, nil, nil, t.shutdownChan, s.sendQuotaPool.acquire()) if err != nil { return err } t.sendQuotaPool.add(0) // Wait until the transport has some quota to send the data. - tq, err := wait(s.ctx, t.shutdownChan, t.sendQuotaPool.acquire()) + tq, err := wait(s.ctx, nil, nil, t.shutdownChan, t.sendQuotaPool.acquire()) if err != nil { if _, ok := err.(StreamError); ok { t.sendQuotaPool.cancel() @@ -604,7 +612,7 @@ func (t *http2Server) Write(s *Stream, data []byte, opts *Options) error { t.framer.adjustNumWriters(1) // Got some quota. Try to acquire writing privilege on the // transport. - if _, err := wait(s.ctx, t.shutdownChan, t.writableChan); err != nil { + if _, err := wait(s.ctx, nil, nil, t.shutdownChan, t.writableChan); err != nil { if _, ok := err.(StreamError); ok { // Return the connection quota back. t.sendQuotaPool.add(ps) @@ -634,7 +642,7 @@ func (t *http2Server) Write(s *Stream, data []byte, opts *Options) error { } if err := t.framer.writeData(forceFlush, s.id, false, p); err != nil { t.Close() - return ConnectionErrorf("transport: %v", err) + return ConnectionErrorf(true, err, "transport: %v", err) } if t.framer.adjustNumWriters(-1) == 0 { t.framer.flushWrite() @@ -679,6 +687,17 @@ func (t *http2Server) controller() { } case *resetStream: t.framer.writeRSTStream(true, i.streamID, i.code) + case *goAway: + t.mu.Lock() + if t.state == closing { + t.mu.Unlock() + // The transport is closing. + return + } + sid := t.maxStreamID + t.state = draining + t.mu.Unlock() + t.framer.writeGoAway(true, sid, http2.ErrCodeNo, nil) case *flushIO: t.framer.flushWrite() case *ping: @@ -724,6 +743,9 @@ func (t *http2Server) Close() (err error) { func (t *http2Server) closeStream(s *Stream) { t.mu.Lock() delete(t.activeStreams, s.id) + if t.state == draining && len(t.activeStreams) == 0 { + defer t.Close() + } t.mu.Unlock() // In case stream sending and receiving are invoked in separate // goroutines (e.g., bi-directional streaming), cancel needs to be @@ -746,3 +768,7 @@ func (t *http2Server) closeStream(s *Stream) { func (t *http2Server) RemoteAddr() net.Addr { return t.conn.RemoteAddr() } + +func (t *http2Server) Drain() { + t.controlBuf.put(&goAway{}) +} diff --git a/vendor/google.golang.org/grpc/transport/http_util.go b/vendor/google.golang.org/grpc/transport/http_util.go index f2e23dcec3..3e16e4df42 100644 --- a/vendor/google.golang.org/grpc/transport/http_util.go +++ b/vendor/google.golang.org/grpc/transport/http_util.go @@ -35,6 +35,7 @@ package transport import ( "bufio" + "bytes" "fmt" "io" "net" @@ -174,11 +175,11 @@ func (d *decodeState) processHeaderField(f hpack.HeaderField) { } d.statusCode = codes.Code(code) case "grpc-message": - d.statusDesc = f.Value + d.statusDesc = decodeGrpcMessage(f.Value) case "grpc-timeout": d.timeoutSet = true var err error - d.timeout, err = timeoutDecode(f.Value) + d.timeout, err = decodeTimeout(f.Value) if err != nil { d.setErr(StreamErrorf(codes.Internal, "transport: malformed time-out: %v", err)) return @@ -251,7 +252,7 @@ func div(d, r time.Duration) int64 { } // TODO(zhaoq): It is the simplistic and not bandwidth efficient. Improve it. -func timeoutEncode(t time.Duration) string { +func encodeTimeout(t time.Duration) string { if d := div(t, time.Nanosecond); d <= maxTimeoutValue { return strconv.FormatInt(d, 10) + "n" } @@ -271,7 +272,7 @@ func timeoutEncode(t time.Duration) string { return strconv.FormatInt(div(t, time.Hour), 10) + "H" } -func timeoutDecode(s string) (time.Duration, error) { +func decodeTimeout(s string) (time.Duration, error) { size := len(s) if size < 2 { return 0, fmt.Errorf("transport: timeout string is too short: %q", s) @@ -288,6 +289,80 @@ func timeoutDecode(s string) (time.Duration, error) { return d * time.Duration(t), nil } +const ( + spaceByte = ' ' + tildaByte = '~' + percentByte = '%' +) + +// encodeGrpcMessage is used to encode status code in header field +// "grpc-message". +// It checks to see if each individual byte in msg is an +// allowable byte, and then either percent encoding or passing it through. +// When percent encoding, the byte is converted into hexadecimal notation +// with a '%' prepended. +func encodeGrpcMessage(msg string) string { + if msg == "" { + return "" + } + lenMsg := len(msg) + for i := 0; i < lenMsg; i++ { + c := msg[i] + if !(c >= spaceByte && c < tildaByte && c != percentByte) { + return encodeGrpcMessageUnchecked(msg) + } + } + return msg +} + +func encodeGrpcMessageUnchecked(msg string) string { + var buf bytes.Buffer + lenMsg := len(msg) + for i := 0; i < lenMsg; i++ { + c := msg[i] + if c >= spaceByte && c < tildaByte && c != percentByte { + buf.WriteByte(c) + } else { + buf.WriteString(fmt.Sprintf("%%%02X", c)) + } + } + return buf.String() +} + +// decodeGrpcMessage decodes the msg encoded by encodeGrpcMessage. +func decodeGrpcMessage(msg string) string { + if msg == "" { + return "" + } + lenMsg := len(msg) + for i := 0; i < lenMsg; i++ { + if msg[i] == percentByte && i+2 < lenMsg { + return decodeGrpcMessageUnchecked(msg) + } + } + return msg +} + +func decodeGrpcMessageUnchecked(msg string) string { + var buf bytes.Buffer + lenMsg := len(msg) + for i := 0; i < lenMsg; i++ { + c := msg[i] + if c == percentByte && i+2 < lenMsg { + parsed, err := strconv.ParseInt(msg[i+1:i+3], 16, 8) + if err != nil { + buf.WriteByte(c) + } else { + buf.WriteByte(byte(parsed)) + i += 2 + } + } else { + buf.WriteByte(c) + } + } + return buf.String() +} + type framer struct { numWriters int32 reader io.Reader diff --git a/vendor/google.golang.org/grpc/transport/pre_go16.go b/vendor/google.golang.org/grpc/transport/pre_go16.go new file mode 100644 index 0000000000..33d91c17c4 --- /dev/null +++ b/vendor/google.golang.org/grpc/transport/pre_go16.go @@ -0,0 +1,51 @@ +// +build !go1.6 + +/* + * Copyright 2016, Google Inc. + * 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. + * + */ + +package transport + +import ( + "net" + "time" + + "golang.org/x/net/context" +) + +// dialContext connects to the address on the named network. +func dialContext(ctx context.Context, network, address string) (net.Conn, error) { + var dialer net.Dialer + if deadline, ok := ctx.Deadline(); ok { + dialer.Timeout = deadline.Sub(time.Now()) + } + return dialer.Dial(network, address) +} diff --git a/vendor/google.golang.org/grpc/transport/transport.go b/vendor/google.golang.org/grpc/transport/transport.go index 599f25d177..f0885da23b 100644 --- a/vendor/google.golang.org/grpc/transport/transport.go +++ b/vendor/google.golang.org/grpc/transport/transport.go @@ -44,7 +44,6 @@ import ( "io" "net" "sync" - "time" "golang.org/x/net/context" "golang.org/x/net/trace" @@ -120,10 +119,11 @@ func (b *recvBuffer) get() <-chan item { // recvBufferReader implements io.Reader interface to read the data from // recvBuffer. type recvBufferReader struct { - ctx context.Context - recv *recvBuffer - last *bytes.Reader // Stores the remaining data in the previous calls. - err error + ctx context.Context + goAway chan struct{} + recv *recvBuffer + last *bytes.Reader // Stores the remaining data in the previous calls. + err error } // Read reads the next len(p) bytes from last. If last is drained, it tries to @@ -141,6 +141,8 @@ func (r *recvBufferReader) Read(p []byte) (n int, err error) { select { case <-r.ctx.Done(): return 0, ContextErr(r.ctx.Err()) + case <-r.goAway: + return 0, ErrStreamDrain case i := <-r.recv.get(): r.recv.load() m := i.(*recvMsg) @@ -158,7 +160,7 @@ const ( streamActive streamState = iota streamWriteDone // EndStream sent streamReadDone // EndStream received - streamDone // sendDone and recvDone or RSTStreamFrame is sent or received. + streamDone // the entire stream is finished. ) // Stream represents an RPC in the transport layer. @@ -169,6 +171,10 @@ type Stream struct { // ctx is the associated context of the stream. ctx context.Context cancel context.CancelFunc + // done is closed when the final status arrives. + done chan struct{} + // goAway is closed when the server sent GoAways signal before this stream was initiated. + goAway chan struct{} // method records the associated RPC method of the stream. method string recvCompress string @@ -214,6 +220,18 @@ func (s *Stream) SetSendCompress(str string) { s.sendCompress = str } +// Done returns a chanel which is closed when it receives the final status +// from the server. +func (s *Stream) Done() <-chan struct{} { + return s.done +} + +// GoAway returns a channel which is closed when the server sent GoAways signal +// before this stream was initiated. +func (s *Stream) GoAway() <-chan struct{} { + return s.goAway +} + // Header acquires the key-value pairs of header metadata once it // is available. It blocks until i) the metadata is ready or ii) there is no // header metadata or iii) the stream is cancelled/expired. @@ -221,6 +239,8 @@ func (s *Stream) Header() (metadata.MD, error) { select { case <-s.ctx.Done(): return nil, ContextErr(s.ctx.Err()) + case <-s.goAway: + return nil, ErrStreamDrain case <-s.headerChan: return s.header.Copy(), nil } @@ -335,19 +355,17 @@ type ConnectOptions struct { // UserAgent is the application user agent. UserAgent string // Dialer specifies how to dial a network address. - Dialer func(string, time.Duration) (net.Conn, error) + Dialer func(context.Context, string) (net.Conn, error) // PerRPCCredentials stores the PerRPCCredentials required to issue RPCs. PerRPCCredentials []credentials.PerRPCCredentials // TransportCredentials stores the Authenticator required to setup a client connection. TransportCredentials credentials.TransportCredentials - // Timeout specifies the timeout for dialing a ClientTransport. - Timeout time.Duration } // NewClientTransport establishes the transport with the required ConnectOptions // and returns it to the caller. -func NewClientTransport(target string, opts *ConnectOptions) (ClientTransport, error) { - return newHTTP2Client(target, opts) +func NewClientTransport(ctx context.Context, target string, opts ConnectOptions) (ClientTransport, error) { + return newHTTP2Client(ctx, target, opts) } // Options provides additional hints and information for message @@ -417,6 +435,11 @@ type ClientTransport interface { // and create a new one) in error case. It should not return nil // once the transport is initiated. Error() <-chan struct{} + + // GoAway returns a channel that is closed when ClientTranspor + // receives the draining signal from the server (e.g., GOAWAY frame in + // HTTP/2). + GoAway() <-chan struct{} } // ServerTransport is the common interface for all gRPC server-side transport @@ -448,6 +471,9 @@ type ServerTransport interface { // RemoteAddr returns the remote network address. RemoteAddr() net.Addr + + // Drain notifies the client this ServerTransport stops accepting new RPCs. + Drain() } // StreamErrorf creates an StreamError with the specified error code and description. @@ -459,9 +485,11 @@ func StreamErrorf(c codes.Code, format string, a ...interface{}) StreamError { } // ConnectionErrorf creates an ConnectionError with the specified error description. -func ConnectionErrorf(format string, a ...interface{}) ConnectionError { +func ConnectionErrorf(temp bool, e error, format string, a ...interface{}) ConnectionError { return ConnectionError{ Desc: fmt.Sprintf(format, a...), + temp: temp, + err: e, } } @@ -469,14 +497,36 @@ func ConnectionErrorf(format string, a ...interface{}) ConnectionError { // entire connection and the retry of all the active streams. type ConnectionError struct { Desc string + temp bool + err error } func (e ConnectionError) Error() string { return fmt.Sprintf("connection error: desc = %q", e.Desc) } -// ErrConnClosing indicates that the transport is closing. -var ErrConnClosing = ConnectionError{Desc: "transport is closing"} +// Temporary indicates if this connection error is temporary or fatal. +func (e ConnectionError) Temporary() bool { + return e.temp +} + +// Origin returns the original error of this connection error. +func (e ConnectionError) Origin() error { + // Never return nil error here. + // If the original error is nil, return itself. + if e.err == nil { + return e + } + return e.err +} + +var ( + // ErrConnClosing indicates that the transport is closing. + ErrConnClosing = ConnectionError{Desc: "transport is closing", temp: true} + // ErrStreamDrain indicates that the stream is rejected by the server because + // the server stops accepting new RPCs. + ErrStreamDrain = StreamErrorf(codes.Unavailable, "the server stops accepting new RPCs") +) // StreamError is an error that only affects one stream within a connection. type StreamError struct { @@ -501,12 +551,25 @@ func ContextErr(err error) StreamError { // wait blocks until it can receive from ctx.Done, closing, or proceed. // If it receives from ctx.Done, it returns 0, the StreamError for ctx.Err. +// If it receives from done, it returns 0, io.EOF if ctx is not done; otherwise +// it return the StreamError for ctx.Err. +// If it receives from goAway, it returns 0, ErrStreamDrain. // If it receives from closing, it returns 0, ErrConnClosing. // If it receives from proceed, it returns the received integer, nil. -func wait(ctx context.Context, closing <-chan struct{}, proceed <-chan int) (int, error) { +func wait(ctx context.Context, done, goAway, closing <-chan struct{}, proceed <-chan int) (int, error) { select { case <-ctx.Done(): return 0, ContextErr(ctx.Err()) + case <-done: + // User cancellation has precedence. + select { + case <-ctx.Done(): + return 0, ContextErr(ctx.Err()) + default: + } + return 0, io.EOF + case <-goAway: + return 0, ErrStreamDrain case <-closing: return 0, ErrConnClosing case i := <-proceed: diff --git a/vendor/k8s.io/kubernetes/cmd/kubelet/app/server.go b/vendor/k8s.io/kubernetes/cmd/kubelet/app/server.go index 3cde7cb089..bfce17bce8 100644 --- a/vendor/k8s.io/kubernetes/cmd/kubelet/app/server.go +++ b/vendor/k8s.io/kubernetes/cmd/kubelet/app/server.go @@ -395,7 +395,7 @@ func run(s *options.KubeletServer, kubeDeps *kubelet.KubeletDeps) (err error) { } if kubeDeps.CAdvisorInterface == nil { - kubeDeps.CAdvisorInterface, err = cadvisor.New(uint(s.CAdvisorPort), s.ContainerRuntime) + kubeDeps.CAdvisorInterface, err = cadvisor.New(uint(s.CAdvisorPort), s.ContainerRuntime, s.RootDirectory) if err != nil { return err } diff --git a/vendor/k8s.io/kubernetes/pkg/api/v1/types.go b/vendor/k8s.io/kubernetes/pkg/api/v1/types.go index e5fa084fea..73b3eb97d9 100644 --- a/vendor/k8s.io/kubernetes/pkg/api/v1/types.go +++ b/vendor/k8s.io/kubernetes/pkg/api/v1/types.go @@ -1237,7 +1237,7 @@ type Container struct { Resources ResourceRequirements `json:"resources,omitempty" protobuf:"bytes,8,opt,name=resources"` // Pod volumes to mount into the container's filesystem. // Cannot be updated. - VolumeMounts []VolumeMount `json:"volumeMounts,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,9,rep,name=volumeMounts"` + VolumeMounts []VolumeMount `json:"volumeMounts,omitempty" patchStrategy:"merge" patchMergeKey:"mountPath" protobuf:"bytes,9,rep,name=volumeMounts"` // Periodic probe of container liveness. // Container will be restarted if the probe fails. // Cannot be updated. diff --git a/vendor/k8s.io/kubernetes/pkg/apis/imagepolicy/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/kubernetes/pkg/apis/imagepolicy/v1alpha1/types_swagger_doc_generated.go new file mode 100644 index 0000000000..f4b26f5e8f --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/apis/imagepolicy/v1alpha1/types_swagger_doc_generated.go @@ -0,0 +1,70 @@ +/* +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 v1alpha1 + +// 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 +var map_ImageReview = map[string]string{ + "": "ImageReview checks if the set of images in a pod are allowed.", + "spec": "Spec holds information about the pod being evaluated", + "status": "Status is filled in by the backend and indicates whether the pod should be allowed.", +} + +func (ImageReview) SwaggerDoc() map[string]string { + return map_ImageReview +} + +var map_ImageReviewContainerSpec = map[string]string{ + "": "ImageReviewContainerSpec is a description of a container within the pod creation request.", + "image": "This can be in the form image:tag or image@SHA:012345679abcdef.", +} + +func (ImageReviewContainerSpec) SwaggerDoc() map[string]string { + return map_ImageReviewContainerSpec +} + +var map_ImageReviewSpec = map[string]string{ + "": "ImageReviewSpec is a description of the pod creation request.", + "containers": "Containers is a list of a subset of the information in each container of the Pod being created.", + "annotations": "Annotations is a list of key-value pairs extracted from the Pod's annotations. It only includes keys which match the pattern `*.image-policy.k8s.io/*`. It is up to each webhook backend to determine how to interpret these annotations, if at all.", + "namespace": "Namespace is the namespace the pod is being created in.", +} + +func (ImageReviewSpec) SwaggerDoc() map[string]string { + return map_ImageReviewSpec +} + +var map_ImageReviewStatus = map[string]string{ + "": "ImageReviewStatus is the result of the token authentication request.", + "allowed": "Allowed indicates that all images were allowed to be run.", + "reason": "Reason should be empty unless Allowed is false in which case it may contain a short description of what is wrong. Kubernetes may truncate excessively long errors when displaying to the user.", +} + +func (ImageReviewStatus) SwaggerDoc() map[string]string { + return map_ImageReviewStatus +} + +// AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/kubernetes/pkg/apiserver/resthandler.go b/vendor/k8s.io/kubernetes/pkg/apiserver/resthandler.go index 7cbb05a21f..46444f4f43 100644 --- a/vendor/k8s.io/kubernetes/pkg/apiserver/resthandler.go +++ b/vendor/k8s.io/kubernetes/pkg/apiserver/resthandler.go @@ -277,7 +277,7 @@ func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch if hasName { // metadata.name is the canonical internal name. - // generic.SelectionPredicate will notice that this is + // SelectionPredicate will notice that this is // a request for a single object and optimize the // storage query accordingly. nameSelector := fields.OneTermEqualSelector("metadata.name", name) diff --git a/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure.go b/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure.go index 8fefc76a65..7e7d1fd80a 100644 --- a/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure.go +++ b/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure.go @@ -33,15 +33,16 @@ const CloudProviderName = "azure" // Config holds the configuration parsed from the --cloud-config flag type Config struct { - Cloud string `json:"cloud" yaml:"cloud"` - TenantID string `json:"tenantId" yaml:"tenantId"` - SubscriptionID string `json:"subscriptionId" yaml:"subscriptionId"` - ResourceGroup string `json:"resourceGroup" yaml:"resourceGroup"` - Location string `json:"location" yaml:"location"` - VnetName string `json:"vnetName" yaml:"vnetName"` - SubnetName string `json:"subnetName" yaml:"subnetName"` - SecurityGroupName string `json:"securityGroupName" yaml:"securityGroupName"` - RouteTableName string `json:"routeTableName" yaml:"routeTableName"` + Cloud string `json:"cloud" yaml:"cloud"` + TenantID string `json:"tenantId" yaml:"tenantId"` + SubscriptionID string `json:"subscriptionId" yaml:"subscriptionId"` + ResourceGroup string `json:"resourceGroup" yaml:"resourceGroup"` + Location string `json:"location" yaml:"location"` + VnetName string `json:"vnetName" yaml:"vnetName"` + SubnetName string `json:"subnetName" yaml:"subnetName"` + SecurityGroupName string `json:"securityGroupName" yaml:"securityGroupName"` + RouteTableName string `json:"routeTableName" yaml:"routeTableName"` + PrimaryAvailabilitySetName string `json:"primaryAvailabilitySetName" yaml:"primaryAvailabilitySetName"` AADClientID string `json:"aadClientId" yaml:"aadClientId"` AADClientSecret string `json:"aadClientSecret" yaml:"aadClientSecret"` diff --git a/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_loadbalancer.go b/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_loadbalancer.go index 3d04c5f003..6cade973d1 100644 --- a/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_loadbalancer.go +++ b/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_loadbalancer.go @@ -571,6 +571,17 @@ func (az *Cloud) ensureHostInPool(serviceName, machineName string, backendPoolID return err } + // Check availability set + if az.PrimaryAvailabilitySetName != "" { + expectedAvailabilitySetName := az.getAvailabilitySetID(az.PrimaryAvailabilitySetName) + if !strings.EqualFold(*machine.Properties.AvailabilitySet.ID, expectedAvailabilitySetName) { + glog.V(3).Infof( + "nicupdate(%s): skipping nic (%s) since it is not in the primaryAvailabilitSet(%s)", + serviceName, nicName, az.PrimaryAvailabilitySetName) + return nil + } + } + nic, err := az.InterfacesClient.Get(az.ResourceGroup, nicName, "") if err != nil { return err diff --git a/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_util.go b/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_util.go index 4fe5aa4ebd..fc2e6472f4 100644 --- a/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_util.go +++ b/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/azure/azure_util.go @@ -31,7 +31,8 @@ const ( loadBalancerMinimumPriority = 500 loadBalancerMaximumPriority = 4096 - machineResourceIDTemplate = "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Compute/virtualMachines/%s" + machineIDTemplate = "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Compute/virtualMachines/%s" + availabilitySetIDTemplate = "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Compute/availabilitySets/%s" frontendIPConfigIDTemplate = "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/loadBalancers/%s/frontendIPConfigurations/%s" backendPoolIDTemplate = "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/loadBalancers/%s/backendAddressPools/%s" loadBalancerRuleIDTemplate = "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/loadBalancers/%s/loadBalancingRules/%s" @@ -42,12 +43,21 @@ const ( // returns the full identifier of a machine func (az *Cloud) getMachineID(machineName string) string { return fmt.Sprintf( - machineResourceIDTemplate, + machineIDTemplate, az.SubscriptionID, az.ResourceGroup, machineName) } +// returns the full identifier of an availabilitySet +func (az *Cloud) getAvailabilitySetID(availabilitySetName string) string { + return fmt.Sprintf( + availabilitySetIDTemplate, + az.SubscriptionID, + az.ResourceGroup, + availabilitySetName) +} + // returns the full identifier of a loadbalancer frontendipconfiguration. func (az *Cloud) getFrontendIPConfigID(lbName, backendPoolName string) string { return fmt.Sprintf( diff --git a/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/gce/gce.go b/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/gce/gce.go index a5920656c9..20dcacfc22 100644 --- a/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/gce/gce.go +++ b/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/gce/gce.go @@ -28,6 +28,8 @@ import ( "strings" "time" + gcfg "gopkg.in/gcfg.v1" + "k8s.io/kubernetes/pkg/api" apiservice "k8s.io/kubernetes/pkg/api/service" "k8s.io/kubernetes/pkg/api/unversioned" @@ -39,14 +41,13 @@ import ( "k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/wait" + "cloud.google.com/go/compute/metadata" "github.com/golang/glog" "golang.org/x/oauth2" "golang.org/x/oauth2/google" compute "google.golang.org/api/compute/v1" container "google.golang.org/api/container/v1" "google.golang.org/api/googleapi" - "google.golang.org/cloud/compute/metadata" - "gopkg.in/gcfg.v1" ) const ( diff --git a/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vsphere.go b/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vsphere.go index edaf74ee40..77a204e344 100644 --- a/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/vendor/k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -34,6 +34,7 @@ import ( "github.com/vmware/govmomi/object" "github.com/vmware/govmomi/property" "github.com/vmware/govmomi/vim25/mo" + "github.com/vmware/govmomi/vim25/soap" "github.com/vmware/govmomi/vim25/types" "golang.org/x/net/context" @@ -46,14 +47,16 @@ const ( ProviderName = "vsphere" ActivePowerState = "poweredOn" SCSIControllerType = "scsi" - LSILogicControllerType = "lsilogic" - BusLogicControllerType = "buslogic" + LSILogicControllerType = "lsiLogic" + BusLogicControllerType = "busLogic" PVSCSIControllerType = "pvscsi" - LSILogicSASControllerType = "lsilogic-sas" + LSILogicSASControllerType = "lsiLogic-sas" SCSIControllerLimit = 4 SCSIControllerDeviceLimit = 15 SCSIDeviceSlots = 16 SCSIReservedSlot = 7 + ThinDiskType = "thin" + VolDir = "kubevols" ) // Controller types that are currently supported for hot attach of disks @@ -61,12 +64,13 @@ const ( // it fails to remove the device from the /dev path (which should be manually done) // making the subsequent attaches to the node to fail. // TODO: Add support for lsilogic driver type -var supportedSCSIControllerType = []string{"lsilogic-sas", "pvscsi"} +var supportedSCSIControllerType = []string{strings.ToLower(LSILogicSASControllerType), PVSCSIControllerType} var ErrNoDiskUUIDFound = errors.New("No disk UUID found") var ErrNoDiskIDFound = errors.New("No vSphere disk ID found") var ErrNoDevicesFound = errors.New("No devices found") var ErrNonSupportedControllerType = errors.New("Disk is attached to non-supported controller type") +var ErrFileAlreadyExist = errors.New("File requested already exist") // VSphere is an implementation of cloud provider Interface for VSphere. type VSphere struct { @@ -215,7 +219,7 @@ func readInstance(cfg *VSphereConfig) (string, string, error) { var rp mo.ResourcePool err = s.Properties(ctx, *vm.ResourcePool, []string{"parent"}, &rp) if err == nil { - var ccr mo.ClusterComputeResource + var ccr mo.ComputeResource err = s.Properties(ctx, *rp.Parent, []string{"name"}, &ccr) if err == nil { cluster = ccr.Name @@ -804,7 +808,7 @@ func getSCSIControllers(vmDevices object.VirtualDeviceList) []*types.VirtualCont for _, device := range vmDevices { devType := vmDevices.Type(device) switch devType { - case SCSIControllerType, LSILogicControllerType, BusLogicControllerType, PVSCSIControllerType, LSILogicSASControllerType: + case SCSIControllerType, strings.ToLower(LSILogicControllerType), strings.ToLower(BusLogicControllerType), PVSCSIControllerType, strings.ToLower(LSILogicSASControllerType): if c, ok := device.(types.BaseVirtualController); ok { scsiControllers = append(scsiControllers, c.GetVirtualController()) } @@ -1076,8 +1080,29 @@ func (vs *VSphere) CreateVolume(name string, size int, tags *map[string]string) dc, err := f.Datacenter(ctx, vs.cfg.Global.Datacenter) f.SetDatacenter(dc) + ds, err := f.Datastore(ctx, vs.cfg.Global.Datastore) + if err != nil { + glog.Errorf("Failed while searching for datastore %+q. err %s", vs.cfg.Global.Datastore, err) + return "", err + } + + if (*tags)["adapterType"] == "" { + (*tags)["adapterType"] = LSILogicControllerType + } + if (*tags)["diskType"] == "" { + (*tags)["diskType"] = ThinDiskType + } + + // vmdks will be created inside kubevols directory + kubeVolsPath := filepath.Clean(ds.Path(VolDir)) + "/" + err = makeDirectoryInDatastore(c, dc, kubeVolsPath, false) + if err != nil && err != ErrFileAlreadyExist { + glog.Errorf("Cannot create dir %#v. err %s", kubeVolsPath, err) + return "", err + } + + vmDiskPath := kubeVolsPath + name + ".vmdk" // Create a virtual disk manager - vmDiskPath := "[" + vs.cfg.Global.Datastore + "] " + name + ".vmdk" virtualDiskManager := object.NewVirtualDiskManager(c.Client) // Create specification for new virtual disk @@ -1173,3 +1198,26 @@ func (vs *VSphere) NodeExists(c *govmomi.Client, nodeName string) (bool, error) return false, nil } + +// Creates a folder using the specified name. +// If the intermediate level folders do not exist, +// and the parameter createParents is true, +// all the non-existent folders are created. +func makeDirectoryInDatastore(c *govmomi.Client, dc *object.Datacenter, path string, createParents bool) error { + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + fileManager := object.NewFileManager(c.Client) + err := fileManager.MakeDirectory(ctx, path, dc, createParents) + if err != nil { + if soap.IsSoapFault(err) { + soapFault := soap.ToSoapFault(err) + if _, ok := soapFault.VimFault().(types.FileAlreadyExists); ok { + return ErrFileAlreadyExist + } + } + } + + return err +} diff --git a/vendor/k8s.io/kubernetes/pkg/controller/podautoscaler/horizontal.go b/vendor/k8s.io/kubernetes/pkg/controller/podautoscaler/horizontal.go index e2f870f641..56d3b06378 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/podautoscaler/horizontal.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/podautoscaler/horizontal.go @@ -48,8 +48,15 @@ const ( HpaCustomMetricsTargetAnnotationName = "alpha/target.custom-metrics.podautoscaler.kubernetes.io" HpaCustomMetricsStatusAnnotationName = "alpha/status.custom-metrics.podautoscaler.kubernetes.io" + + scaleUpLimitFactor = 2 + scaleUpLimitMinimum = 4 ) +func calculateScaleUpLimit(currentReplicas int32) int32 { + return int32(math.Max(scaleUpLimitFactor*float64(currentReplicas), scaleUpLimitMinimum)) +} + type HorizontalController struct { scaleNamespacer unversionedextensions.ScalesGetter hpaNamespacer unversionedautoscaling.HorizontalPodAutoscalersGetter @@ -148,7 +155,7 @@ func (a *HorizontalController) computeReplicasForCPUUtilization(hpa *autoscaling a.eventRecorder.Event(hpa, api.EventTypeWarning, "InvalidSelector", errMsg) return 0, nil, time.Time{}, fmt.Errorf(errMsg) } - currentUtilization, timestamp, err := a.metricsClient.GetCPUUtilization(hpa.Namespace, selector) + currentUtilization, numRunningPods, timestamp, err := a.metricsClient.GetCPUUtilization(hpa.Namespace, selector) // TODO: what to do on partial errors (like metrics obtained for 75% of pods). if err != nil { @@ -159,11 +166,17 @@ func (a *HorizontalController) computeReplicasForCPUUtilization(hpa *autoscaling utilization := int32(*currentUtilization) usageRatio := float64(utilization) / float64(targetUtilization) - if math.Abs(1.0-usageRatio) > tolerance { - return int32(math.Ceil(usageRatio * float64(currentReplicas))), &utilization, timestamp, nil + if math.Abs(1.0-usageRatio) <= tolerance { + return currentReplicas, &utilization, timestamp, nil } - return currentReplicas, &utilization, timestamp, nil + desiredReplicas := math.Ceil(usageRatio * float64(numRunningPods)) + + a.eventRecorder.Eventf(hpa, api.EventTypeNormal, "DesiredReplicasComputed", + "Computed the desired num of replicas: %d, on a base of %d report(s) (avgCPUutil: %d, current replicas: %d)", + int32(desiredReplicas), numRunningPods, utilization, scale.Status.Replicas) + + return int32(desiredReplicas), &utilization, timestamp, nil } // Computes the desired number of replicas based on the CustomMetrics passed in cmAnnotation as json-serialized @@ -329,6 +342,12 @@ func (a *HorizontalController) reconcileAutoscaler(hpa *autoscaling.HorizontalPo if desiredReplicas > hpa.Spec.MaxReplicas { desiredReplicas = hpa.Spec.MaxReplicas } + + // Do not upscale too much to prevent incorrect rapid increase of the number of master replicas caused by + // bogus CPU usage report from heapster/kubelet (like in issue #32304). + if desiredReplicas > calculateScaleUpLimit(currentReplicas) { + desiredReplicas = calculateScaleUpLimit(currentReplicas) + } } rescale := shouldScale(hpa, currentReplicas, desiredReplicas, timestamp) diff --git a/vendor/k8s.io/kubernetes/pkg/controller/podautoscaler/metrics/metrics_client.go b/vendor/k8s.io/kubernetes/pkg/controller/podautoscaler/metrics/metrics_client.go index 692e961648..422e986e37 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/podautoscaler/metrics/metrics_client.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/podautoscaler/metrics/metrics_client.go @@ -45,9 +45,9 @@ var heapsterQueryStart = -5 * time.Minute // MetricsClient is an interface for getting metrics for pods. type MetricsClient interface { // GetCPUUtilization returns the average utilization over all pods represented as a percent of requested CPU - // (e.g. 70 means that an average pod uses 70% of the requested CPU) - // and the time of generation of the oldest of utilization reports for pods. - GetCPUUtilization(namespace string, selector labels.Selector) (*int, time.Time, error) + // (e.g. 70 means that an average pod uses 70% of the requested CPU), + // the number of running pods from which CPU usage was collected and the time of generation of the oldest of utilization reports for pods. + GetCPUUtilization(namespace string, selector labels.Selector) (*int, int, time.Time, error) // GetCustomMetric returns the average value of the given custom metrics from the // pods picked using the namespace and selector passed as arguments. @@ -101,23 +101,23 @@ func NewHeapsterMetricsClient(client clientset.Interface, namespace, scheme, ser } } -func (h *HeapsterMetricsClient) GetCPUUtilization(namespace string, selector labels.Selector) (*int, time.Time, error) { - avgConsumption, avgRequest, timestamp, err := h.GetCpuConsumptionAndRequestInMillis(namespace, selector) +func (h *HeapsterMetricsClient) GetCPUUtilization(namespace string, selector labels.Selector) (utilization *int, numRunningPods int, timestamp time.Time, err error) { + avgConsumption, avgRequest, numRunningPods, timestamp, err := h.GetCpuConsumptionAndRequestInMillis(namespace, selector) if err != nil { - return nil, time.Time{}, fmt.Errorf("failed to get CPU consumption and request: %v", err) + return nil, 0, time.Time{}, fmt.Errorf("failed to get CPU consumption and request: %v", err) } - utilization := int((avgConsumption * 100) / avgRequest) - return &utilization, timestamp, nil + tmp := int((avgConsumption * 100) / avgRequest) + return &tmp, numRunningPods, timestamp, nil } func (h *HeapsterMetricsClient) GetCpuConsumptionAndRequestInMillis(namespace string, selector labels.Selector) (avgConsumption int64, - avgRequest int64, timestamp time.Time, err error) { + avgRequest int64, numRunningPods int, timestamp time.Time, err error) { podList, err := h.client.Core().Pods(namespace). List(api.ListOptions{LabelSelector: selector}) if err != nil { - return 0, 0, time.Time{}, fmt.Errorf("failed to get pod list: %v", err) + return 0, 0, 0, time.Time{}, fmt.Errorf("failed to get pod list: %v", err) } podNames := map[string]struct{}{} requestSum := int64(0) @@ -138,19 +138,19 @@ func (h *HeapsterMetricsClient) GetCpuConsumptionAndRequestInMillis(namespace st } } if len(podNames) == 0 && len(podList.Items) > 0 { - return 0, 0, time.Time{}, fmt.Errorf("no running pods") + return 0, 0, 0, time.Time{}, fmt.Errorf("no running pods") } if missing || requestSum == 0 { - return 0, 0, time.Time{}, fmt.Errorf("some pods do not have request for cpu") + return 0, 0, 0, time.Time{}, fmt.Errorf("some pods do not have request for cpu") } glog.V(4).Infof("%s %s - sum of CPU requested: %d", namespace, selector, requestSum) requestAvg := requestSum / int64(len(podNames)) // Consumption is already averaged and in millis. consumption, timestamp, err := h.getCpuUtilizationForPods(namespace, selector, podNames) if err != nil { - return 0, 0, time.Time{}, err + return 0, 0, 0, time.Time{}, err } - return consumption, requestAvg, timestamp, nil + return consumption, requestAvg, len(podNames), timestamp, nil } func (h *HeapsterMetricsClient) getCpuUtilizationForPods(namespace string, selector labels.Selector, podNames map[string]struct{}) (int64, time.Time, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/controller/volume/attachdetach/statusupdater/node_status_updater.go b/vendor/k8s.io/kubernetes/pkg/controller/volume/attachdetach/statusupdater/node_status_updater.go index 1c41b7daf3..120be84c60 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/volume/attachdetach/statusupdater/node_status_updater.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/volume/attachdetach/statusupdater/node_status_updater.go @@ -28,6 +28,7 @@ import ( kcache "k8s.io/kubernetes/pkg/client/cache" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "k8s.io/kubernetes/pkg/controller/volume/attachdetach/cache" + "k8s.io/kubernetes/pkg/conversion" "k8s.io/kubernetes/pkg/util/strategicpatch" ) @@ -62,20 +63,30 @@ func (nsu *nodeStatusUpdater) UpdateNodeStatuses() error { for nodeName, attachedVolumes := range nodesToUpdate { nodeObj, exists, err := nsu.nodeInformer.GetStore().GetByKey(nodeName) if nodeObj == nil || !exists || err != nil { - // If node does not exist, its status cannot be updated, log error and move on. - glog.V(5).Infof( + // If node does not exist, its status cannot be updated, log error and + // reset flag statusUpdateNeeded back to true to indicate this node status + // needs to be udpated again + glog.V(2).Infof( "Could not update node status. Failed to find node %q in NodeInformer cache. %v", nodeName, err) + nsu.actualStateOfWorld.SetNodeStatusUpdateNeeded(nodeName) continue } - node, ok := nodeObj.(*api.Node) + clonedNode, err := conversion.NewCloner().DeepCopy(nodeObj) + if err != nil { + return fmt.Errorf("error cloning node %q: %v", + nodeName, + err) + } + + node, ok := clonedNode.(*api.Node) if !ok || node == nil { return fmt.Errorf( "failed to cast %q object %#v to Node", nodeName, - nodeObj) + clonedNode) } oldData, err := json.Marshal(node) @@ -115,11 +126,12 @@ func (nsu *nodeStatusUpdater) UpdateNodeStatuses() error { nodeName, err) } - - glog.V(3).Infof( - "Updating status for node %q succeeded. patchBytes: %q", + glog.V(2).Infof( + "Updating status for node %q succeeded. patchBytes: %q VolumesAttached: %v", nodeName, - string(patchBytes)) + string(patchBytes), + node.Status.VolumesAttached) + } return nil } 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 853e0d5d56..98db0ef3c3 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cadvisor/cadvisor_linux.go @@ -40,7 +40,8 @@ import ( ) type cadvisorClient struct { - runtime string + runtime string + rootPath string manager.Manager } @@ -93,7 +94,7 @@ 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(port uint, runtime string) (Interface, error) { +func New(port uint, runtime string, rootPath string) (Interface, error) { sysFs, err := sysfs.NewRealSysFs() if err != nil { return nil, err @@ -106,8 +107,9 @@ func New(port uint, runtime string) (Interface, error) { } cadvisorClient := &cadvisorClient{ - runtime: runtime, - Manager: m, + runtime: runtime, + rootPath: rootPath, + Manager: m, } err = cadvisorClient.exportHTTP(port) @@ -202,7 +204,7 @@ func (cc *cadvisorClient) ImagesFsInfo() (cadvisorapiv2.FsInfo, error) { } func (cc *cadvisorClient) RootFsInfo() (cadvisorapiv2.FsInfo, error) { - return cc.getFsInfo(cadvisorfs.LabelSystemRoot) + return cc.GetDirFsInfo(cc.rootPath) } func (cc *cadvisorClient) getFsInfo(label string) (cadvisorapiv2.FsInfo, error) { 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 f8036e1b3f..fc3b316687 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(port uint, runtime string) (Interface, error) { +func New(port uint, runtime string, rootPath string) (Interface, error) { return &cadvisorUnsupported{}, nil } 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 561244c281..54bb3cfb60 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/cm/helpers_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/cm/helpers_linux.go @@ -25,7 +25,7 @@ import ( // GetCgroupSubsystems returns information about the mounted cgroup subsystems func GetCgroupSubsystems() (*CgroupSubsystems, error) { // get all cgroup mounts. - allCgroups, err := libcontainercgroups.GetCgroupMounts() + allCgroups, err := libcontainercgroups.GetCgroupMounts(true) if err != nil { return &CgroupSubsystems{}, err } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go index 8b3dbbb1f8..a2da9cf0d1 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_getters.go @@ -239,9 +239,9 @@ func (kl *Kubelet) GetExtraSupplementalGroupsForPod(pod *api.Pod) []int64 { return kl.volumeManager.GetExtraSupplementalGroupsForPod(pod) } -// getPodVolumeNameListFromDisk returns a list of the volume names by reading the +// getPodVolumePathListFromDisk returns a list of the volume paths by reading the // volume directories for the given pod from the disk. -func (kl *Kubelet) getPodVolumeNameListFromDisk(podUID types.UID) ([]string, error) { +func (kl *Kubelet) getPodVolumePathListFromDisk(podUID types.UID) ([]string, error) { volumes := []string{} podVolDir := kl.getPodVolumesDir(podUID) volumePluginDirs, err := ioutil.ReadDir(podVolDir) @@ -258,11 +258,10 @@ func (kl *Kubelet) getPodVolumeNameListFromDisk(podUID types.UID) ([]string, err } for i, volumeDir := range volumeDirs { if volumeDir != nil { - volumes = append(volumes, volumeDir.Name()) + volumes = append(volumes, path.Join(volumePluginPath, volumeDir.Name())) continue } glog.Errorf("Could not read directory %s: %v", podVolDir, volumeDirsStatErrs[i]) - } } return volumes, nil diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status.go index b155de781d..e93462a1bf 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_node_status.go @@ -341,6 +341,8 @@ func (kl *Kubelet) tryUpdateNodeStatus() error { } // Update the current status on the API server updatedNode, err := kl.kubeClient.Core().Nodes().UpdateStatus(node) + // If update finishes sucessfully, mark the volumeInUse as reportedInUse to indicate + // those volumes are already updated in the node's status if err == nil { kl.volumeManager.MarkVolumesAsReportedInUse( updatedNode.Status.VolumesInUse) @@ -801,9 +803,13 @@ func (kl *Kubelet) recordNodeSchedulableEvent(node *api.Node) { } } -// Update VolumesInUse field in Node Status +// Update VolumesInUse field in Node Status only after states are synced up at least once +// in volume reconciler. func (kl *Kubelet) setNodeVolumesInUseStatus(node *api.Node) { - node.Status.VolumesInUse = kl.volumeManager.GetVolumesInUse() + // 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 diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go index a11b711d16..9c28a2b391 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_volumes.go @@ -27,6 +27,7 @@ import ( "k8s.io/kubernetes/pkg/securitycontext" "k8s.io/kubernetes/pkg/types" utilerrors "k8s.io/kubernetes/pkg/util/errors" + "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/util/selinux" "k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/volume" @@ -153,8 +154,20 @@ func (kl *Kubelet) cleanupOrphanedPodDirs( continue } // Check whether volume is still mounted on disk. If so, do not delete directory - if volumeNames, err := kl.getPodVolumeNameListFromDisk(uid); err != nil || len(volumeNames) != 0 { - glog.V(3).Infof("Orphaned pod %q found, but volumes are still mounted; err: %v, volumes: %v ", uid, err, volumeNames) + volumePaths, err := kl.getPodVolumePathListFromDisk(uid) + if err != nil { + glog.Errorf("Orphaned pod %q found, but error %v occured during reading volume dir from disk", uid, err) + continue + } else if len(volumePaths) > 0 { + for _, path := range volumePaths { + notMount, err := mount.IsNotMountPoint(path) + if err == nil && notMount { + glog.V(2).Infof("Volume path %q is no longer mounted, remove it", path) + os.Remove(path) + } else { + glog.Errorf("Orphaned pod %q found, but it might still mounted with error %v", uid, err) + } + } continue } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/network/hostport/hostport.go b/vendor/k8s.io/kubernetes/pkg/kubelet/network/hostport/hostport.go index bf8e498975..35d4ac2c8e 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/network/hostport/hostport.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/network/hostport/hostport.go @@ -42,11 +42,11 @@ const ( ) type HostportHandler interface { - OpenPodHostportsAndSync(newPod *RunningPod, natInterfaceName string, runningPods []*RunningPod) error - SyncHostports(natInterfaceName string, runningPods []*RunningPod) error + OpenPodHostportsAndSync(newPod *ActivePod, natInterfaceName string, activePods []*ActivePod) error + SyncHostports(natInterfaceName string, activePods []*ActivePod) error } -type RunningPod struct { +type ActivePod struct { Pod *api.Pod IP net.IP } @@ -131,9 +131,9 @@ func (h *handler) openHostports(pod *api.Pod) error { // gatherAllHostports returns all hostports that should be presented on node, // given the list of pods running on that node and ignoring host network // pods (which don't need hostport <-> container port mapping). -func gatherAllHostports(runningPods []*RunningPod) (map[api.ContainerPort]targetPod, error) { +func gatherAllHostports(activePods []*ActivePod) (map[api.ContainerPort]targetPod, error) { podHostportMap := make(map[api.ContainerPort]targetPod) - for _, r := range runningPods { + for _, r := range activePods { if r.IP.To4() == nil { return nil, fmt.Errorf("Invalid or missing pod %s IP", kubecontainer.GetPodFullName(r.Pod)) } @@ -171,36 +171,37 @@ func hostportChainName(cp api.ContainerPort, podFullName string) utiliptables.Ch } // OpenPodHostportsAndSync opens hostports for a new pod, gathers all hostports on -// node, sets up iptables rules enable them. And finally clean up stale hostports -func (h *handler) OpenPodHostportsAndSync(newPod *RunningPod, natInterfaceName string, runningPods []*RunningPod) error { +// node, sets up iptables rules enable them. And finally clean up stale hostports. +// 'newPod' must also be present in 'activePods'. +func (h *handler) OpenPodHostportsAndSync(newPod *ActivePod, natInterfaceName string, activePods []*ActivePod) error { // try to open pod host port if specified if err := h.openHostports(newPod.Pod); err != nil { return err } - // Add the new pod to running pods if it's not running already (e.g. in rkt's case). + // Add the new pod to active pods if it's not present. var found bool - for _, p := range runningPods { + for _, p := range activePods { if p.Pod.UID == newPod.Pod.UID { found = true break } } if !found { - runningPods = append(runningPods, newPod) + activePods = append(activePods, newPod) } - return h.SyncHostports(natInterfaceName, runningPods) + return h.SyncHostports(natInterfaceName, activePods) } // SyncHostports gathers all hostports on node and setup iptables rules enable them. And finally clean up stale hostports -func (h *handler) SyncHostports(natInterfaceName string, runningPods []*RunningPod) error { +func (h *handler) SyncHostports(natInterfaceName string, activePods []*ActivePod) error { start := time.Now() defer func() { glog.V(4).Infof("syncHostportsRules took %v", time.Since(start)) }() - containerPortMap, err := gatherAllHostports(runningPods) + containerPortMap, err := gatherAllHostports(activePods) if err != nil { return err } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/network/kubenet/kubenet_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/network/kubenet/kubenet_linux.go index 0ca229ff34..83bcedf8b0 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/network/kubenet/kubenet_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/network/kubenet/kubenet_linux.go @@ -20,7 +20,9 @@ package kubenet import ( "fmt" + "io/ioutil" "net" + "path/filepath" "strings" "sync" "syscall" @@ -45,8 +47,9 @@ import ( utilsets "k8s.io/kubernetes/pkg/util/sets" utilsysctl "k8s.io/kubernetes/pkg/util/sysctl" - "k8s.io/kubernetes/pkg/kubelet/network/hostport" "strconv" + + "k8s.io/kubernetes/pkg/kubelet/network/hostport" ) const ( @@ -67,6 +70,10 @@ const ( // ebtables Chain to store dedup rules dedupChain = utilebtables.Chain("KUBE-DEDUP") + + // defaultIPAMDir is the default location for the checkpoint files stored by host-local ipam + // https://github.com/containernetworking/cni/tree/master/plugins/ipam/host-local#backends + defaultIPAMDir = "/var/lib/cni/networks" ) // CNI plugins required by kubenet in /opt/cni/bin or vendor directory @@ -394,13 +401,13 @@ func (plugin *kubenetNetworkPlugin) setup(namespace string, name string, id kube plugin.podIPs[id] = ip4.String() // Open any hostports the pod's containers want - runningPods, err := plugin.getRunningPods() + activePods, err := plugin.getActivePods() if err != nil { return err } - newPod := &hostport.RunningPod{Pod: pod, IP: ip4} - if err := plugin.hostportHandler.OpenPodHostportsAndSync(newPod, BridgeName, runningPods); err != nil { + newPod := &hostport.ActivePod{Pod: pod, IP: ip4} + if err := plugin.hostportHandler.OpenPodHostportsAndSync(newPod, BridgeName, activePods); err != nil { return err } @@ -432,6 +439,16 @@ func (plugin *kubenetNetworkPlugin) SetUpPod(namespace string, name string, id k // Not a hard error or warning glog.V(4).Infof("Failed to clean up %s/%s after SetUpPod failure: %v", namespace, name, err) } + + // TODO: Remove this hack once we've figured out how to retrieve the netns + // of an exited container. Currently, restarting docker will leak a bunch of + // ips. This will exhaust available ip space unless we cleanup old ips. At the + // same time we don't want to try GC'ing them periodically as that could lead + // to a performance regression in starting pods. So on each setup failure, try + // GC on the assumption that the kubelet is going to retry pod creation, and + // when it does, there will be ips. + plugin.ipamGarbageCollection() + return err } @@ -468,9 +485,9 @@ func (plugin *kubenetNetworkPlugin) teardown(namespace string, name string, id k } } - runningPods, err := plugin.getRunningPods() + activePods, err := plugin.getActivePods() if err == nil { - err = plugin.hostportHandler.SyncHostports(BridgeName, runningPods) + err = plugin.hostportHandler.SyncHostports(BridgeName, activePods) } if err != nil { errList = append(errList, err) @@ -571,15 +588,31 @@ func (plugin *kubenetNetworkPlugin) checkCNIPluginInDir(dir string) bool { return true } -// Returns a list of pods running on this node and each pod's IP address. Assumes -// PodSpecs retrieved from the runtime include the name and ID of containers in -// each pod. -func (plugin *kubenetNetworkPlugin) getRunningPods() ([]*hostport.RunningPod, error) { - pods, err := plugin.host.GetRuntime().GetPods(false) +// getNonExitedPods returns a list of pods that have at least one running container. +func (plugin *kubenetNetworkPlugin) getNonExitedPods() ([]*kubecontainer.Pod, error) { + ret := []*kubecontainer.Pod{} + pods, err := plugin.host.GetRuntime().GetPods(true) if err != nil { return nil, fmt.Errorf("Failed to retrieve pods from runtime: %v", err) } - runningPods := make([]*hostport.RunningPod, 0) + for _, p := range pods { + if podIsExited(p) { + continue + } + ret = append(ret, p) + } + return ret, nil +} + +// Returns a list of pods running or ready to run on this node and each pod's IP address. +// Assumes PodSpecs retrieved from the runtime include the name and ID of containers in +// each pod. +func (plugin *kubenetNetworkPlugin) getActivePods() ([]*hostport.ActivePod, error) { + pods, err := plugin.getNonExitedPods() + if err != nil { + return nil, err + } + activePods := make([]*hostport.ActivePod, 0) for _, p := range pods { containerID, err := plugin.host.GetRuntime().GetPodContainerID(p) if err != nil { @@ -594,13 +627,94 @@ func (plugin *kubenetNetworkPlugin) getRunningPods() ([]*hostport.RunningPod, er continue } if pod, ok := plugin.host.GetPodByName(p.Namespace, p.Name); ok { - runningPods = append(runningPods, &hostport.RunningPod{ + activePods = append(activePods, &hostport.ActivePod{ Pod: pod, IP: podIP, }) } } - return runningPods, nil + return activePods, nil +} + +// ipamGarbageCollection will release unused IP. +// kubenet uses the CNI bridge plugin, which stores allocated ips on file. Each +// file created under defaultIPAMDir has the format: ip/container-hash. So this +// routine looks for hashes that are not reported by the currently running docker, +// and invokes DelNetwork on each one. Note that this will only work for the +// current CNI bridge plugin, because we have no way of finding the NetNs. +func (plugin *kubenetNetworkPlugin) ipamGarbageCollection() { + glog.V(2).Infof("Starting IP garbage collection") + + ipamDir := filepath.Join(defaultIPAMDir, KubenetPluginName) + files, err := ioutil.ReadDir(ipamDir) + if err != nil { + glog.Errorf("Failed to list files in %q: %v", ipamDir, err) + return + } + + // gather containerIDs for allocated ips + ipContainerIdMap := make(map[string]string) + for _, file := range files { + // skip non checkpoint file + if ip := net.ParseIP(file.Name()); ip == nil { + continue + } + + content, err := ioutil.ReadFile(filepath.Join(ipamDir, file.Name())) + if err != nil { + glog.Errorf("Failed to read file %v: %v", file, err) + } + ipContainerIdMap[file.Name()] = strings.TrimSpace(string(content)) + } + + // gather infra container IDs of current running Pods + runningContainerIDs := utilsets.String{} + pods, err := plugin.getNonExitedPods() + if err != nil { + glog.Errorf("Failed to get pods: %v", err) + return + } + for _, pod := range pods { + containerID, err := plugin.host.GetRuntime().GetPodContainerID(pod) + if err != nil { + glog.Warningf("Failed to get infra containerID of %q/%q: %v", pod.Namespace, pod.Name, err) + continue + } + + runningContainerIDs.Insert(strings.TrimSpace(containerID.ID)) + } + + // release leaked ips + for ip, containerID := range ipContainerIdMap { + // if the container is not running, release IP + if runningContainerIDs.Has(containerID) { + continue + } + // CNI requires all config to be presented, although only containerID is needed in this case + rt := &libcni.RuntimeConf{ + ContainerID: containerID, + IfName: network.DefaultInterfaceName, + // TODO: How do we find the NetNs of an exited container? docker inspect + // doesn't show us the pid, so we probably need to checkpoint + NetNS: "", + } + + glog.V(2).Infof("Releasing IP %q allocated to %q.", ip, containerID) + // CNI bridge plugin should try to release IP and then return + if err := plugin.cniConfig.DelNetwork(plugin.netConfig, rt); err != nil { + glog.Errorf("Error while releasing IP: %v", err) + } + } +} + +// podIsExited returns true if the pod is exited (all containers inside are exited). +func podIsExited(p *kubecontainer.Pod) bool { + for _, c := range p.Containers { + if c.State != kubecontainer.ContainerStateExited { + return false + } + } + return true } func (plugin *kubenetNetworkPlugin) buildCNIRuntimeConf(ifName string, id kubecontainer.ContainerID) (*libcni.RuntimeConf, error) { 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 index 8fea2d80f8..e748cc843a 100644 --- 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 @@ -193,6 +193,7 @@ type actualStateOfWorld struct { // 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[api.UniqueVolumeName]attachedVolume + // volumePluginMgr is the volume plugin manager used to create volume // plugin objects. volumePluginMgr *volume.VolumePluginMgr 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 index 6bcbef8e27..65b4765f9e 100644 --- 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 @@ -58,7 +58,8 @@ type DesiredStateOfWorld interface { // 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. + // 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 []api.UniqueVolumeName) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go index 29a5627168..7beea7e684 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/reconciler/reconciler.go @@ -36,7 +36,7 @@ import ( "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/util/strings" "k8s.io/kubernetes/pkg/util/wait" - "k8s.io/kubernetes/pkg/volume" + volumepkg "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations" "k8s.io/kubernetes/pkg/volume/util/operationexecutor" volumetypes "k8s.io/kubernetes/pkg/volume/util/types" @@ -58,6 +58,10 @@ type Reconciler interface { // volumes that should be attached are attached and volumes that should // be detached are detached and trigger attach/detach operations as needed. Run(sourcesReady config.SourcesReady, 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. @@ -67,7 +71,7 @@ type Reconciler interface { // this node, and therefore the volume manager should not // loopSleepDuration - the amount of time the reconciler loop sleeps between // successive executions -// reconstructDuration - the amount of time the reconstruct sleeps between +// 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 @@ -83,20 +87,20 @@ func NewReconciler( kubeClient internalclientset.Interface, controllerAttachDetachEnabled bool, loopSleepDuration time.Duration, - reconstructDuration time.Duration, + syncDuration time.Duration, waitForAttachTimeout time.Duration, hostName string, desiredStateOfWorld cache.DesiredStateOfWorld, actualStateOfWorld cache.ActualStateOfWorld, operationExecutor operationexecutor.OperationExecutor, mounter mount.Interface, - volumePluginMgr *volume.VolumePluginMgr, + volumePluginMgr *volumepkg.VolumePluginMgr, kubeletPodsDir string) Reconciler { return &reconciler{ kubeClient: kubeClient, controllerAttachDetachEnabled: controllerAttachDetachEnabled, loopSleepDuration: loopSleepDuration, - reconstructDuration: reconstructDuration, + syncDuration: syncDuration, waitForAttachTimeout: waitForAttachTimeout, hostName: hostName, desiredStateOfWorld: desiredStateOfWorld, @@ -105,7 +109,7 @@ func NewReconciler( mounter: mounter, volumePluginMgr: volumePluginMgr, kubeletPodsDir: kubeletPodsDir, - timeOfLastReconstruct: time.Now(), + timeOfLastSync: time.Time{}, } } @@ -113,16 +117,16 @@ type reconciler struct { kubeClient internalclientset.Interface controllerAttachDetachEnabled bool loopSleepDuration time.Duration - reconstructDuration time.Duration + syncDuration time.Duration waitForAttachTimeout time.Duration hostName string desiredStateOfWorld cache.DesiredStateOfWorld actualStateOfWorld cache.ActualStateOfWorld operationExecutor operationexecutor.OperationExecutor mounter mount.Interface - volumePluginMgr *volume.VolumePluginMgr + volumePluginMgr *volumepkg.VolumePluginMgr kubeletPodsDir string - timeOfLastReconstruct time.Time + timeOfLastSync time.Time } func (rc *reconciler) Run(sourcesReady config.SourcesReady, stopCh <-chan struct{}) { @@ -138,9 +142,9 @@ func (rc *reconciler) reconciliationLoopFunc(sourcesReady config.SourcesReady) f // reconciler's reconstruct process may add incomplete volume information and cause confusion. // In addition, if some sources are not ready, the reconstruct process may clean up pods' volumes // that are still in use because desired states could not get a complete list of pods. - if sourcesReady.AllReady() && time.Since(rc.timeOfLastReconstruct) > rc.reconstructDuration { + if sourcesReady.AllReady() && time.Since(rc.timeOfLastSync) > rc.syncDuration { glog.V(5).Infof("Sources are all ready, starting reconstruct state function") - rc.reconstruct() + rc.sync() } } } @@ -291,12 +295,17 @@ func (rc *reconciler) reconcile() { err) } if err == nil { - glog.Infof("MountVolume operation started for volume %q (spec.Name: %q) to pod %q (UID: %q). %s", + logMsg := fmt.Sprintf("MountVolume operation started for volume %q (spec.Name: %q) to pod %q (UID: %q). %s", volumeToMount.VolumeName, volumeToMount.VolumeSpec.Name(), volumeToMount.PodName, volumeToMount.Pod.UID, remountingLogStr) + if remountingLogStr == "" { + glog.V(1).Infof(logMsg) + } else { + glog.V(5).Infof(logMsg) + } } } } @@ -365,18 +374,22 @@ func (rc *reconciler) reconcile() { } } -// reconstruct process tries to observe the real world by scanning all pods' volume directories from the disk. +// 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 udpate the actual and desired states. In the following reconciler loop, those volumes will // be cleaned up. -func (rc *reconciler) reconstruct() { - defer rc.updateReconstructTime() - rc.reconstructStates(rc.kubeletPodsDir) +func (rc *reconciler) sync() { + defer rc.updateLastSyncTime() + rc.syncStates(rc.kubeletPodsDir) } -func (rc *reconciler) updateReconstructTime() { - rc.timeOfLastReconstruct = time.Now() +func (rc *reconciler) updateLastSyncTime() { + rc.timeOfLastSync = time.Now() +} + +func (rc *reconciler) StatesHasBeenSynced() bool { + return !rc.timeOfLastSync.IsZero() } type podVolume struct { @@ -386,25 +399,39 @@ type podVolume struct { pluginName string } +type reconstructedVolume struct { + volumeName api.UniqueVolumeName + podName volumetypes.UniquePodName + volumeSpec *volumepkg.Spec + outerVolumeSpecName string + pod *api.Pod + pluginIsAttachable bool + volumeGidValue string + devicePath string + reportedInUse bool + mounter volumepkg.Mounter +} + // reconstructFromDisk scans the volume directories under the given pod directory. If the volume is not // in either actual or desired state of world, or pending operation, this function will reconstruct // the volume spec and put it in both the actual and desired state of worlds. If no running // container is mounting the volume, the volume will be removed by desired state of world's populator and // cleaned up by the reconciler. -func (rc *reconciler) reconstructStates(podsDir string) { +func (rc *reconciler) syncStates(podsDir string) { // Get volumes information by reading the pod's directory podVolumes, err := getVolumesFromPodDir(podsDir) if err != nil { glog.Errorf("Cannot get volumes from disk %v", err) return } + + volumesNeedUpdate := make(map[api.UniqueVolumeName]*reconstructedVolume) for _, volume := range podVolumes { - volumeToMount, err := rc.reconstructVolume(volume) + reconstructedVolume, err := rc.reconstructVolume(volume) if err != nil { glog.Errorf("Could not construct volume information: %v", err) continue } - // Check if there is an pending operation for the given pod and volume. // Need to check pending operation before checking the actual and desired // states to avoid race condition during checking. For example, the following @@ -412,26 +439,50 @@ func (rc *reconciler) reconstructStates(podsDir string) { // 1. Checking the pod and it does not exist in either actual or desired state. // 2. An operation for the given pod finishes and the actual state is updated. // 3. Checking and there is no pending operation for the given pod. - if rc.operationExecutor.IsOperationPending(volumeToMount.VolumeName, volumeToMount.PodName) { - continue - } - desiredPods := rc.desiredStateOfWorld.GetPods() - actualPods := rc.actualStateOfWorld.GetPods() - if desiredPods[volume.podName] || actualPods[volume.podName] { - continue + // During state reconstruction period, no new volume operations could be issued. If the + // mounted path is not in either pending operation, or actual or desired states, this + // volume needs to be reconstructed back to the states. + pending := rc.operationExecutor.IsOperationPending(reconstructedVolume.volumeName, reconstructedVolume.podName) + dswExist := rc.desiredStateOfWorld.PodExistsInVolume(reconstructedVolume.podName, reconstructedVolume.volumeName) + aswExist, _, _ := rc.actualStateOfWorld.PodExistsInVolume(reconstructedVolume.podName, reconstructedVolume.volumeName) + + if !rc.StatesHasBeenSynced() { + // In case this is the first time to reconstruct state after kubelet starts, for a persistant volume, it must have + // been mounted before kubelet restarts because no mount operations could be started at this time (node + // status has not yet been updated before this very first syncStates finishes, so that VerifyControllerAttachedVolume will fail), + // In this case, the volume state should be put back to actual state now no matter desired state has it or not. + // This is to prevent node status from being updated to empty for attachable volumes. This might happen because + // in the case that a volume is discovered on disk, and it is part of desired state, but is then quickly deleted + // from the desired state. If in such situation, the volume is not added to the actual state, the node status updater will + // not get this volume from either actual or desired state. In turn, this might cause master controller + // detaching while the volume is still mounted. + if aswExist || !reconstructedVolume.pluginIsAttachable { + continue + } + } else { + // Check pending first since no new operations could be started at this point. + // Otherwise there might a race condition in checking actual states and pending operations + if pending || dswExist || aswExist { + continue + } } - glog.V(3).Infof( - "Could not find pod information in desired or actual states or pending operation, update it in both states: %+v", - volumeToMount) - if err = rc.updateStates(volumeToMount); err != nil { + glog.V(2).Infof( + "Reconciler sync states: could not find pod information in desired or actual states or pending operation, update it in both states: %+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) } } + } -// Reconstruct Volume object and volumeToMount data structure by reading the pod's volume directories -func (rc *reconciler) reconstructVolume(volume podVolume) (*operationexecutor.VolumeToMount, error) { +// Reconstruct Volume object and reconstructedVolume data structure by reading the pod's volume directories +func (rc *reconciler) reconstructVolume(volume podVolume) (*reconstructedVolume, error) { plugin, err := rc.volumePluginMgr.FindPluginByName(volume.pluginName) if err != nil { return nil, err @@ -460,48 +511,83 @@ func (rc *reconciler) reconstructVolume(volume podVolume) (*operationexecutor.Vo uniqueVolumeName = volumehelper.GetUniqueVolumeNameForNonAttachableVolume(volume.podName, plugin, volumeSpec) } - volumeToMount := &operationexecutor.VolumeToMount{ - VolumeName: uniqueVolumeName, - PodName: volume.podName, - VolumeSpec: volumeSpec, - OuterVolumeSpecName: volumeName, /*volumeName is InnerVolumeSpecName. But this information will not be used for cleanup*/ - Pod: pod, - PluginIsAttachable: attachablePlugin != nil, - VolumeGidValue: "", - DevicePath: "", + volumeMounter, newMounterErr := plugin.NewMounter( + volumeSpec, + pod, + volumepkg.VolumeOptions{}) + if newMounterErr != nil { + return nil, fmt.Errorf( + "MountVolume.NewMounter failed for volume %q (spec.Name: %q) pod %q (UID: %q) with: %v", + uniqueVolumeName, + volumeSpec.Name(), + volume.podName, + pod.UID, + newMounterErr) } - return volumeToMount, nil + + reconstructedVolume := &reconstructedVolume{ + volumeName: uniqueVolumeName, + podName: volume.podName, + volumeSpec: volumeSpec, + outerVolumeSpecName: volumeName, /* volumeName is InnerVolumeSpecName. But this information will not be used for cleanup */ + pod: pod, + pluginIsAttachable: attachablePlugin != nil, + volumeGidValue: "", + devicePath: "", + mounter: volumeMounter, + } + return reconstructedVolume, nil } -func (rc *reconciler) updateStates(volumeToMount *operationexecutor.VolumeToMount) error { - err := rc.actualStateOfWorld.MarkVolumeAsAttached( - volumeToMount.VolumeName, volumeToMount.VolumeSpec, "", volumeToMount.DevicePath) - if err != nil { - return fmt.Errorf("Could not add volume information to actual state of world: %v", err) - } - err = rc.actualStateOfWorld.AddPodToVolume( - volumeToMount.PodName, - types.UID(volumeToMount.PodName), - volumeToMount.VolumeName, - nil, - volumeToMount.OuterVolumeSpecName, - volumeToMount.DevicePath) - if err != nil { - return fmt.Errorf("Could not add pod to volume information to actual state of world: %v", err) - } - if volumeToMount.PluginIsAttachable { - err = rc.actualStateOfWorld.MarkDeviceAsMounted(volumeToMount.VolumeName) - if err != nil { - return fmt.Errorf("Could not mark device is mounted to actual state of world: %v", err) +func (rc *reconciler) updateStates(volumesNeedUpdate map[api.UniqueVolumeName]*reconstructedVolume) error { + // Get the node status to retrieve volume device path information. + node, fetchErr := rc.kubeClient.Core().Nodes().Get(rc.hostName) + 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("Get devicePath from node status for volume (%q): %q", attachedVolume.Name, volume.devicePath) + } } } - _, err = rc.desiredStateOfWorld.AddPodToVolume(volumeToMount.PodName, - volumeToMount.Pod, - volumeToMount.VolumeSpec, - volumeToMount.OuterVolumeSpecName, - volumeToMount.VolumeGidValue) - if err != nil { - return fmt.Errorf("Could not add pod to volume information to desired state of world: %v", err) + + for _, volume := range volumesNeedUpdate { + err := rc.actualStateOfWorld.MarkVolumeAsAttached( + 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.AddPodToVolume( + volume.podName, + types.UID(volume.podName), + volume.volumeName, + volume.mounter, + volume.outerVolumeSpecName, + volume.devicePath) + if err != nil { + glog.Errorf("Could not add pod to volume information to actual state of world: %v", err) + continue + } + if volume.pluginIsAttachable { + err = rc.actualStateOfWorld.MarkDeviceAsMounted(volume.volumeName) + if err != nil { + glog.Errorf("Could not mark device is mounted to actual state of world: %v", err) + continue + } + } + _, err = rc.desiredStateOfWorld.AddPodToVolume(volume.podName, + volume.pod, + volume.volumeSpec, + volume.outerVolumeSpecName, + volume.volumeGidValue) + if err != nil { + glog.Errorf("Could not add pod to volume information to desired state of world: %v", err) + } } return 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 index d291117392..1d57f22a78 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/volume_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/volumemanager/volume_manager.go @@ -48,9 +48,9 @@ const ( // between successive executions reconcilerLoopSleepPeriod time.Duration = 100 * time.Millisecond - // reconcilerReconstructSleepPeriod is the amount of time the reconciler reconstruct process + // reconcilerSyncStatesSleepPeriod is the amount of time the reconciler reconstruct process // waits between successive executions - reconcilerReconstructSleepPeriod time.Duration = 3 * time.Minute + reconcilerSyncStatesSleepPeriod time.Duration = 3 * time.Minute // desiredStateOfWorldPopulatorLoopSleepPeriod is the amount of time the // DesiredStateOfWorldPopulator loop waits between successive executions @@ -114,7 +114,7 @@ type VolumeManager interface { // from annotations on persistent volumes that the pod depends on. GetExtraSupplementalGroupsForPod(pod *api.Pod) []int64 - // Returns a list of all volumes that implement the volume.Attacher + // 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 @@ -125,6 +125,11 @@ type VolumeManager interface { // restarts. GetVolumesInUse() []api.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 api.UniqueVolumeName) bool @@ -167,7 +172,7 @@ func NewVolumeManager( kubeClient, controllerAttachDetachEnabled, reconcilerLoopSleepPeriod, - reconcilerReconstructSleepPeriod, + reconcilerSyncStatesSleepPeriod, waitForAttachTimeout, hostName, vm.desiredStateOfWorld, @@ -304,6 +309,10 @@ func (vm *volumeManager) GetVolumesInUse() []api.UniqueVolumeName { return volumesToReportInUse } +func (vm *volumeManager) ReconcilerStatesHasBeenSynced() bool { + return vm.reconciler.StatesHasBeenSynced() +} + func (vm *volumeManager) VolumeIsAttached( volumeName api.UniqueVolumeName) bool { return vm.actualStateOfWorld.VolumeExists(volumeName) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/certificates/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/certificates/etcd/etcd.go index 2dbeb09aaa..e453461b99 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/certificates/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/certificates/etcd/etcd.go @@ -40,7 +40,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *ApprovalREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &certificates.CertificateSigningRequestList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.CertificateSigningRequests), &certificates.CertificateSigningRequest{}, @@ -62,7 +62,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *ApprovalREST) { ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*certificates.CertificateSigningRequest).Name, nil }, - PredicateFunc: func(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { + PredicateFunc: func(label labels.Selector, field fields.Selector) storage.SelectionPredicate { return csrregistry.Matcher(label, field) }, QualifiedResource: certificates.Resource("certificatesigningrequests"), @@ -72,7 +72,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *ApprovalREST) { UpdateStrategy: csrregistry.Strategy, DeleteStrategy: csrregistry.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } // Subresources use the same store and creation strategy, which only diff --git a/vendor/k8s.io/kubernetes/pkg/registry/certificates/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/certificates/strategy.go index da6385451c..b19f613f73 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/certificates/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/certificates/strategy.go @@ -26,6 +26,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -168,8 +169,8 @@ func (csrApprovalStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Obje } // Matcher returns a generic matcher for a given label and field selector. -func Matcher(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/clusterrole/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/clusterrole/etcd/etcd.go index f3b4e16f4d..034621a4dc 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/clusterrole/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/clusterrole/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &rbac.ClusterRoleList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.ClusterRoles), &rbac.ClusterRole{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: clusterrole.Strategy, DeleteStrategy: clusterrole.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/clusterrole/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/clusterrole/strategy.go index 68950ea455..3edf4bc13c 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/clusterrole/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/clusterrole/strategy.go @@ -25,8 +25,8 @@ import ( "k8s.io/kubernetes/pkg/apis/rbac/validation" "k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -102,8 +102,8 @@ func (s strategy) Export(ctx api.Context, obj runtime.Object, exact bool) error } // Matcher returns a generic matcher for a given label and field selector. -func Matcher(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/clusterrolebinding/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/clusterrolebinding/etcd/etcd.go index 4d2b3cd82e..ae88503efb 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/clusterrolebinding/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/clusterrolebinding/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &rbac.ClusterRoleBindingList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.ClusterRoleBindings), &rbac.ClusterRoleBinding{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: clusterrolebinding.Strategy, DeleteStrategy: clusterrolebinding.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/clusterrolebinding/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/clusterrolebinding/strategy.go index 102a8533ef..31f0c4a38b 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/clusterrolebinding/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/clusterrolebinding/strategy.go @@ -25,8 +25,8 @@ import ( "k8s.io/kubernetes/pkg/apis/rbac/validation" "k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -102,8 +102,8 @@ func (s strategy) Export(ctx api.Context, obj runtime.Object, exact bool) error } // Matcher returns a generic matcher for a given label and field selector. -func Matcher(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/configmap/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/configmap/etcd/etcd.go index f3adfa9f3e..74c54090a4 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/configmap/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/configmap/etcd/etcd.go @@ -36,7 +36,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.ConfigMapList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.ConfigMaps), &api.ConfigMap{}, @@ -81,7 +81,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: configmap.Strategy, DeleteStrategy: configmap.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/configmap/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/configmap/strategy.go index 3a06e1a16c..02539ed4df 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/configmap/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/configmap/strategy.go @@ -26,6 +26,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -88,8 +89,8 @@ func ConfigMapToSelectableFields(cfg *api.ConfigMap) fields.Set { } // MatchConfigMap returns a generic matcher for a given label and field selector. -func MatchConfigMap(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchConfigMap(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/controller/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/controller/etcd/etcd.go index 41a3b320cc..3fb538dbf9 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/controller/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/controller/etcd/etcd.go @@ -62,7 +62,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.ReplicationControllerList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Controllers), &api.ReplicationController{}, @@ -104,7 +104,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: controller.Strategy, DeleteStrategy: controller.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = controller.StatusStrategy diff --git a/vendor/k8s.io/kubernetes/pkg/registry/controller/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/controller/strategy.go index 944779a759..2f7e6da1b5 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/controller/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/controller/strategy.go @@ -30,6 +30,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -120,8 +121,8 @@ func ControllerToSelectableFields(controller *api.ReplicationController) fields. // MatchController is the filter used by the generic etcd backend to route // watch events from etcd to clients of the apiserver only interested in specific // labels/fields. -func MatchController(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchController(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/daemonset/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/daemonset/etcd/etcd.go index 0c1d3a89e7..cf3ee4593a 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/daemonset/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/daemonset/etcd/etcd.go @@ -38,7 +38,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &extensions.DaemonSetList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Daemonsets), &extensions.DaemonSet{}, @@ -79,7 +79,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: daemonset.Strategy, DeleteStrategy: daemonset.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = daemonset.StatusStrategy diff --git a/vendor/k8s.io/kubernetes/pkg/registry/daemonset/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/daemonset/strategy.go index b19eb890ae..f5b73963b3 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/daemonset/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/daemonset/strategy.go @@ -27,6 +27,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -112,8 +113,8 @@ func DaemonSetToSelectableFields(daemon *extensions.DaemonSet) fields.Set { // MatchSetDaemon is the filter used by the generic etcd backend to route // watch events from etcd to clients of the apiserver only interested in specific // labels/fields. -func MatchDaemonSet(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchDaemonSet(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/deployment/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/deployment/etcd/etcd.go index 502d681a94..1e93d6a90a 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/deployment/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/deployment/etcd/etcd.go @@ -62,7 +62,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *RollbackREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &extensions.DeploymentList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Deployments), &extensions.Deployment{}, @@ -102,7 +102,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *RollbackREST) { UpdateStrategy: deployment.Strategy, DeleteStrategy: deployment.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = deployment.StatusStrategy diff --git a/vendor/k8s.io/kubernetes/pkg/registry/deployment/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/deployment/strategy.go index 3dbb50269e..68356bd04e 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/deployment/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/deployment/strategy.go @@ -30,6 +30,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -130,8 +131,8 @@ func DeploymentToSelectableFields(deployment *extensions.Deployment) fields.Set // MatchDeployment is the filter used by the generic etcd backend to route // watch events from etcd to clients of the apiserver only interested in specific // labels/fields. -func MatchDeployment(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchDeployment(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/endpoint/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/endpoint/etcd/etcd.go index 9baf0e7472..ed70ffbf2b 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/endpoint/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/endpoint/etcd/etcd.go @@ -35,7 +35,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.EndpointsList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Endpoints), &api.Endpoints{}, @@ -65,7 +65,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: endpoint.Strategy, DeleteStrategy: endpoint.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/endpoint/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/endpoint/strategy.go index ed2d16ec27..078fcf1151 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/endpoint/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/endpoint/strategy.go @@ -26,6 +26,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -79,12 +80,12 @@ func (endpointsStrategy) AllowUnconditionalUpdate() bool { } // MatchEndpoints returns a generic matcher for a given label and field selector. -func MatchEndpoints(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{Label: label, Field: field, GetAttrs: EndpointsAttributes} +func MatchEndpoints(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{Label: label, Field: field, GetAttrs: EndpointsAttributes} } // EndpointsAttributes returns the attributes of an endpoint such that a -// generic.SelectionPredicate can match appropriately. +// SelectionPredicate can match appropriately. func EndpointsAttributes(obj runtime.Object) (objLabels labels.Set, objFields fields.Set, err error) { endpoints, ok := obj.(*api.Endpoints) if !ok { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/event/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/event/etcd/etcd.go index ee5f650639..01574a5fa2 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/event/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/event/etcd/etcd.go @@ -34,7 +34,7 @@ func NewREST(opts generic.RESTOptions, ttl uint64) *REST { // We explicitly do NOT do any decoration here - switching on Cacher // for events will lead to too high memory consumption. - storageInterface, _ := generic.NewRawStorage(opts.StorageConfig) + storageInterface, dFunc := generic.NewRawStorage(opts.StorageConfig) store := ®istry.Store{ NewFunc: func() runtime.Object { return &api.Event{} }, @@ -59,7 +59,8 @@ func NewREST(opts generic.RESTOptions, ttl uint64) *REST { UpdateStrategy: event.Strategy, DeleteStrategy: event.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/event/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/event/strategy.go index 731c00e422..43616e6965 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/event/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/event/strategy.go @@ -25,6 +25,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -69,8 +70,8 @@ func (eventStrategy) AllowUnconditionalUpdate() bool { return true } -func MatchEvent(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchEvent(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/generic/matcher.go b/vendor/k8s.io/kubernetes/pkg/registry/generic/matcher.go index 16e5851b8f..4ea2c68848 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/generic/matcher.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/generic/matcher.go @@ -19,14 +19,8 @@ package generic import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/fields" - "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/runtime" - "k8s.io/kubernetes/pkg/storage" ) -// AttrFunc returns label and field sets for List or Watch to compare against, or an error. -type AttrFunc func(obj runtime.Object) (label labels.Set, field fields.Set, err error) - // ObjectMetaFieldsSet returns a fields that represents the ObjectMeta. func ObjectMetaFieldsSet(objectMeta *api.ObjectMeta, hasNamespaceField bool) fields.Set { if !hasNamespaceField { @@ -47,79 +41,3 @@ func MergeFieldsSets(source fields.Set, fragment fields.Set) fields.Set { } return source } - -// SelectionPredicate implements a generic predicate that can be passed to -// GenericRegistry's List or Watch methods. Implements the Matcher interface. -type SelectionPredicate struct { - Label labels.Selector - Field fields.Selector - GetAttrs AttrFunc - IndexFields []string -} - -// Matches returns true if the given object's labels and fields (as -// returned by s.GetAttrs) match s.Label and s.Field. An error is -// returned if s.GetAttrs fails. -func (s *SelectionPredicate) Matches(obj runtime.Object) (bool, error) { - if s.Label.Empty() && s.Field.Empty() { - return true, nil - } - labels, fields, err := s.GetAttrs(obj) - if err != nil { - return false, err - } - matched := s.Label.Matches(labels) - if s.Field != nil { - matched = (matched && s.Field.Matches(fields)) - } - return matched, nil -} - -// MatchesSingle will return (name, true) if and only if s.Field matches on the object's -// name. -func (s *SelectionPredicate) MatchesSingle() (string, bool) { - // TODO: should be namespace.name - if name, ok := s.Field.RequiresExactMatch("metadata.name"); ok { - return name, true - } - return "", false -} - -// For any index defined by IndexFields, if a matcher can match only (a subset) -// of objects that return for a given index, a pair (, ) -// wil be returned. -// TODO: Consider supporting also labels. -func (s *SelectionPredicate) MatcherIndex() []storage.MatchValue { - var result []storage.MatchValue - for _, field := range s.IndexFields { - if value, ok := s.Field.RequiresExactMatch(field); ok { - result = append(result, storage.MatchValue{IndexName: field, Value: value}) - } - } - return result -} - -// Matcher can return true if an object matches the Matcher's selection -// criteria. If it is known that the matcher will match only a single object -// then MatchesSingle should return the key of that object and true. This is an -// optimization only--Matches() should continue to work. -type Matcher interface { - // Matches should return true if obj matches this matcher's requirements. - Matches(obj runtime.Object) (matchesThisObject bool, err error) - - // If this matcher matches a single object, return the key for that - // object and true here. This will greatly increase efficiency. You - // must still implement Matches(). Note that key does NOT need to - // include the object's namespace. - MatchesSingle() (key string, matchesSingleObject bool) - - // For any known index, if a matcher can match only (a subset) of objects - // that return for a given index, a pair (, ) - // will be returned. - MatcherIndex() []storage.MatchValue -} - -var ( - // Assert implementations match the interface. - _ = Matcher(&SelectionPredicate{}) -) diff --git a/vendor/k8s.io/kubernetes/pkg/registry/generic/registry/decorated_watcher.go b/vendor/k8s.io/kubernetes/pkg/registry/generic/registry/decorated_watcher.go new file mode 100644 index 0000000000..2bf3049af5 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/registry/generic/registry/decorated_watcher.go @@ -0,0 +1,98 @@ +/* +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 registry + +import ( + "net/http" + + "golang.org/x/net/context" + + "k8s.io/kubernetes/pkg/api/rest" + "k8s.io/kubernetes/pkg/api/unversioned" + "k8s.io/kubernetes/pkg/watch" +) + +type decoratedWatcher struct { + w watch.Interface + decorator rest.ObjectFunc + cancel context.CancelFunc + resultCh chan watch.Event +} + +func newDecoratedWatcher(w watch.Interface, decorator rest.ObjectFunc) *decoratedWatcher { + ctx, cancel := context.WithCancel(context.Background()) + d := &decoratedWatcher{ + w: w, + decorator: decorator, + cancel: cancel, + resultCh: make(chan watch.Event), + } + go d.run(ctx) + return d +} + +func (d *decoratedWatcher) run(ctx context.Context) { + var recv, send watch.Event + for { + select { + case recv = <-d.w.ResultChan(): + switch recv.Type { + case watch.Added, watch.Modified, watch.Deleted: + err := d.decorator(recv.Object) + if err != nil { + send = makeStatusErrorEvent(err) + break + } + send = recv + case watch.Error: + send = recv + } + select { + case d.resultCh <- send: + if send.Type == watch.Error { + d.cancel() + } + case <-ctx.Done(): + } + case <-ctx.Done(): + d.w.Stop() + close(d.resultCh) + return + } + } +} + +func (d *decoratedWatcher) Stop() { + d.cancel() +} + +func (d *decoratedWatcher) ResultChan() <-chan watch.Event { + return d.resultCh +} + +func makeStatusErrorEvent(err error) watch.Event { + status := &unversioned.Status{ + Status: unversioned.StatusFailure, + Message: err.Error(), + Code: http.StatusInternalServerError, + Reason: unversioned.StatusReasonInternalError, + } + return watch.Event{ + Type: watch.Error, + Object: status, + } +} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/generic/registry/store.go b/vendor/k8s.io/kubernetes/pkg/registry/generic/registry/store.go index 9fb4911ae4..5b9f246bb2 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/generic/registry/store.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/generic/registry/store.go @@ -32,7 +32,6 @@ import ( "k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/storage" utilruntime "k8s.io/kubernetes/pkg/util/runtime" @@ -89,17 +88,20 @@ type Store struct { TTLFunc func(obj runtime.Object, existing uint64, update bool) (uint64, error) // Returns a matcher corresponding to the provided labels and fields. - PredicateFunc func(label labels.Selector, field fields.Selector) *generic.SelectionPredicate + PredicateFunc func(label labels.Selector, field fields.Selector) storage.SelectionPredicate + + // Called to cleanup storage clients. + DestroyFunc func() // DeleteCollectionWorkers is the maximum number of workers in a single // DeleteCollection call. DeleteCollectionWorkers int - // Called on all objects returned from the underlying store, after - // the exit hooks are invoked. Decorators are intended for integrations - // that are above storage and should only be used for specific cases where - // storage of the value is not appropriate, since they cannot - // be watched. + // Decorator is called as exit hook on object returned from the underlying storage. + // The returned object could be individual object (e.g. Pod) or the list type (e.g. PodList). + // Decorator is intended for integrations that are above storage and + // should only be used for specific cases where storage of the value is + // not appropriate, since they cannot be watched. Decorator rest.ObjectFunc // Allows extended behavior during creation, required CreateStrategy rest.RESTCreateStrategy @@ -185,16 +187,24 @@ func (e *Store) List(ctx api.Context, options *api.ListOptions) (runtime.Object, if options != nil && options.FieldSelector != nil { field = options.FieldSelector } - return e.ListPredicate(ctx, e.PredicateFunc(label, field), options) + out, err := e.ListPredicate(ctx, e.PredicateFunc(label, field), options) + if err != nil { + return nil, err + } + if e.Decorator != nil { + if err := e.Decorator(out); err != nil { + return nil, err + } + } + return out, nil } // ListPredicate returns a list of all the items matching m. -func (e *Store) ListPredicate(ctx api.Context, m *generic.SelectionPredicate, options *api.ListOptions) (runtime.Object, error) { +func (e *Store) ListPredicate(ctx api.Context, p storage.SelectionPredicate, options *api.ListOptions) (runtime.Object, error) { list := e.NewListFunc() - filter := e.createFilter(m) - if name, ok := m.MatchesSingle(); ok { + if name, ok := p.MatchesSingle(); ok { if key, err := e.KeyFunc(ctx, name); err == nil { - err := e.Storage.GetToList(ctx, key, filter, list) + err := e.Storage.GetToList(ctx, key, p, list) return list, storeerr.InterpretListError(err, e.QualifiedResource) } // if we cannot extract a key based on the current context, the optimization is skipped @@ -203,7 +213,7 @@ func (e *Store) ListPredicate(ctx api.Context, m *generic.SelectionPredicate, op if options == nil { options = &api.ListOptions{ResourceVersion: "0"} } - err := e.Storage.List(ctx, e.KeyRootFunc(ctx), options.ResourceVersion, filter, list) + err := e.Storage.List(ctx, e.KeyRootFunc(ctx), options.ResourceVersion, p, list) return list, storeerr.InterpretListError(err, e.QualifiedResource) } @@ -841,7 +851,7 @@ func (e *Store) finalizeDelete(obj runtime.Object, runHooks bool) (runtime.Objec // Watch makes a matcher for the given label and field, and calls // WatchPredicate. If possible, you should customize PredicateFunc to produre a -// matcher that matches by key. generic.SelectionPredicate does this for you +// matcher that matches by key. SelectionPredicate does this for you // automatically. func (e *Store) Watch(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { label := labels.Everything() @@ -860,38 +870,32 @@ func (e *Store) Watch(ctx api.Context, options *api.ListOptions) (watch.Interfac } // WatchPredicate starts a watch for the items that m matches. -func (e *Store) WatchPredicate(ctx api.Context, m *generic.SelectionPredicate, resourceVersion string) (watch.Interface, error) { - filter := e.createFilter(m) - - if name, ok := m.MatchesSingle(); ok { +func (e *Store) WatchPredicate(ctx api.Context, p storage.SelectionPredicate, resourceVersion string) (watch.Interface, error) { + if name, ok := p.MatchesSingle(); ok { if key, err := e.KeyFunc(ctx, name); err == nil { if err != nil { return nil, err } - return e.Storage.Watch(ctx, key, resourceVersion, filter) + w, err := e.Storage.Watch(ctx, key, resourceVersion, p) + if err != nil { + return nil, err + } + if e.Decorator != nil { + return newDecoratedWatcher(w, e.Decorator), nil + } + return w, nil } // if we cannot extract a key based on the current context, the optimization is skipped } - return e.Storage.WatchList(ctx, e.KeyRootFunc(ctx), resourceVersion, filter) -} - -func (e *Store) createFilter(m *generic.SelectionPredicate) storage.Filter { - filterFunc := func(obj runtime.Object) bool { - matches, err := m.Matches(obj) - if err != nil { - glog.Errorf("unable to match watch: %v", err) - return false - } - if matches && e.Decorator != nil { - if err := e.Decorator(obj); err != nil { - glog.Errorf("unable to decorate watch: %v", err) - return false - } - } - return matches + w, err := e.Storage.WatchList(ctx, e.KeyRootFunc(ctx), resourceVersion, p) + if err != nil { + return nil, err } - return storage.NewSimpleFilter(filterFunc, m.MatcherIndex) + if e.Decorator != nil { + return newDecoratedWatcher(w, e.Decorator), nil + } + return w, nil } // calculateTTL is a helper for retrieving the updated TTL for an object or returning an error diff --git a/vendor/k8s.io/kubernetes/pkg/registry/horizontalpodautoscaler/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/horizontalpodautoscaler/etcd/etcd.go index b9b238bdc1..7a34f36f7f 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/horizontalpodautoscaler/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/horizontalpodautoscaler/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &autoscaling.HorizontalPodAutoscalerList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.HorizontalPodAutoscalers), &autoscaling.HorizontalPodAutoscaler{}, @@ -77,7 +77,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: horizontalpodautoscaler.Strategy, DeleteStrategy: horizontalpodautoscaler.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = horizontalpodautoscaler.StatusStrategy diff --git a/vendor/k8s.io/kubernetes/pkg/registry/horizontalpodautoscaler/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/horizontalpodautoscaler/strategy.go index 3ba063c0ad..a1b7e203fe 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/horizontalpodautoscaler/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/horizontalpodautoscaler/strategy.go @@ -24,8 +24,8 @@ import ( "k8s.io/kubernetes/pkg/apis/autoscaling/validation" "k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -88,8 +88,8 @@ func AutoscalerToSelectableFields(hpa *autoscaling.HorizontalPodAutoscaler) fiel return nil } -func MatchAutoscaler(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchAutoscaler(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/ingress/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/ingress/etcd/etcd.go index afa05ca0d4..3b991c9046 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/ingress/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/ingress/etcd/etcd.go @@ -38,7 +38,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &extensions.IngressList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Ingress), &extensions.Ingress{}, @@ -79,7 +79,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: ingress.Strategy, DeleteStrategy: ingress.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = ingress.StatusStrategy diff --git a/vendor/k8s.io/kubernetes/pkg/registry/ingress/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/ingress/strategy.go index f9ec9a3a3a..f134dfd39d 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/ingress/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/ingress/strategy.go @@ -27,6 +27,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -105,8 +106,8 @@ func IngressToSelectableFields(ingress *extensions.Ingress) fields.Set { // MatchIngress is the filter used by the generic etcd backend to ingress // watch events from etcd to clients of the apiserver only interested in specific // labels/fields. -func MatchIngress(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchIngress(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/job/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/job/etcd/etcd.go index fe7f300b62..08507a77c4 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/job/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/job/etcd/etcd.go @@ -38,7 +38,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &batch.JobList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Jobs), &batch.Job{}, @@ -79,7 +79,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: job.Strategy, DeleteStrategy: job.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/vendor/k8s.io/kubernetes/pkg/registry/job/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/job/strategy.go index 4cc66f575d..1c996511c8 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/job/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/job/strategy.go @@ -28,6 +28,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -166,8 +167,8 @@ func JobToSelectableFields(job *batch.Job) fields.Set { // MatchJob is the filter used by the generic etcd backend to route // watch events from etcd to clients of the apiserver only interested in specific // labels/fields. -func MatchJob(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchJob(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/limitrange/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/limitrange/etcd/etcd.go index b39343e6c0..ddfd4662fd 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/limitrange/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/limitrange/etcd/etcd.go @@ -35,7 +35,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.LimitRangeList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.LimitRanges), &api.LimitRange{}, @@ -66,7 +66,8 @@ func NewREST(opts generic.RESTOptions) *REST { DeleteStrategy: limitrange.Strategy, ExportStrategy: limitrange.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/limitrange/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/limitrange/strategy.go index 96fc19590d..14eb0555ad 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/limitrange/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/limitrange/strategy.go @@ -23,8 +23,8 @@ import ( "k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/uuid" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -85,8 +85,8 @@ func (limitrangeStrategy) Export(api.Context, runtime.Object, bool) error { return nil } -func MatchLimitRange(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchLimitRange(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/namespace/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/namespace/etcd/etcd.go index 3adc1eca3d..047692b459 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/namespace/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/namespace/etcd/etcd.go @@ -53,7 +53,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *FinalizeREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.NamespaceList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Namespaces), &api.Namespace{}, @@ -84,7 +84,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *FinalizeREST) { DeleteStrategy: namespace.Strategy, ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/vendor/k8s.io/kubernetes/pkg/registry/namespace/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/namespace/strategy.go index aa1b572d82..d29f3673b7 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/namespace/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/namespace/strategy.go @@ -25,6 +25,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -135,8 +136,8 @@ func (namespaceFinalizeStrategy) PrepareForUpdate(ctx api.Context, obj, old runt } // MatchNamespace returns a generic matcher for a given label and field selector. -func MatchNamespace(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchNamespace(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/networkpolicy/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/networkpolicy/etcd/etcd.go index 135e6eee20..00460004ec 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/networkpolicy/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/networkpolicy/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &extensionsapi.NetworkPolicyList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.NetworkPolicys), &extensionsapi.NetworkPolicy{}, @@ -78,7 +78,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: networkpolicy.Strategy, DeleteStrategy: networkpolicy.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/networkpolicy/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/networkpolicy/strategy.go index a2ddb6c913..5cdb0c4590 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/networkpolicy/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/networkpolicy/strategy.go @@ -27,6 +27,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -97,8 +98,8 @@ func NetworkPolicyToSelectableFields(networkPolicy *extensions.NetworkPolicy) fi // MatchNetworkPolicy is the filter used by the generic etcd backend to watch events // from etcd to clients of the apiserver only interested in specific labels/fields. -func MatchNetworkPolicy(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchNetworkPolicy(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/node/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/node/etcd/etcd.go index 4f215f2e2a..862cfe9898 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/node/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/node/etcd/etcd.go @@ -69,7 +69,7 @@ func NewStorage(opts generic.RESTOptions, connection client.ConnectionInfoGetter prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.NodeList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Nodes), &api.Node{}, @@ -99,7 +99,8 @@ func NewStorage(opts generic.RESTOptions, connection client.ConnectionInfoGetter DeleteStrategy: node.Strategy, ExportStrategy: node.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/vendor/k8s.io/kubernetes/pkg/registry/node/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/node/strategy.go index 3f05168ff6..077f7b5bf9 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/node/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/node/strategy.go @@ -147,8 +147,8 @@ func NodeToSelectableFields(node *api.Node) fields.Set { } // MatchNode returns a generic matcher for a given label and field selector. -func MatchNode(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchNode(label labels.Selector, field fields.Selector) pkgstorage.SelectionPredicate { + return pkgstorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/persistentvolume/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/persistentvolume/etcd/etcd.go index 63fd220c2d..3ae4c63612 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/persistentvolume/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/persistentvolume/etcd/etcd.go @@ -36,7 +36,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.PersistentVolumeList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.PersistentVolumes), &api.PersistentVolume{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { DeleteStrategy: persistentvolume.Strategy, ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/vendor/k8s.io/kubernetes/pkg/registry/persistentvolume/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/persistentvolume/strategy.go index 3866dc0f09..2f466c33da 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/persistentvolume/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/persistentvolume/strategy.go @@ -25,6 +25,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -95,8 +96,8 @@ func (persistentvolumeStatusStrategy) ValidateUpdate(ctx api.Context, obj, old r } // MatchPersistentVolume returns a generic matcher for a given label and field selector. -func MatchPersistentVolumes(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchPersistentVolumes(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/persistentvolumeclaim/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/persistentvolumeclaim/etcd/etcd.go index 8637bd5a4f..677e9317a9 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/persistentvolumeclaim/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/persistentvolumeclaim/etcd/etcd.go @@ -36,7 +36,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.PersistentVolumeClaimList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.PersistentVolumeClaims), &api.PersistentVolumeClaim{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { DeleteStrategy: persistentvolumeclaim.Strategy, ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/vendor/k8s.io/kubernetes/pkg/registry/persistentvolumeclaim/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/persistentvolumeclaim/strategy.go index e0058aac95..c33d55b2ac 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/persistentvolumeclaim/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/persistentvolumeclaim/strategy.go @@ -25,6 +25,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -95,8 +96,8 @@ func (persistentvolumeclaimStatusStrategy) ValidateUpdate(ctx api.Context, obj, } // MatchPersistentVolumeClaim returns a generic matcher for a given label and field selector. -func MatchPersistentVolumeClaim(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchPersistentVolumeClaim(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/petset/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/petset/etcd/etcd.go index d256414cff..e52367930a 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/petset/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/petset/etcd/etcd.go @@ -38,7 +38,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &appsapi.PetSetList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.PetSet), &appsapi.PetSet{}, @@ -79,7 +79,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: petset.Strategy, DeleteStrategy: petset.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = petset.StatusStrategy diff --git a/vendor/k8s.io/kubernetes/pkg/registry/petset/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/petset/strategy.go index e614362c01..2a87a8491f 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/petset/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/petset/strategy.go @@ -27,6 +27,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -103,8 +104,8 @@ func PetSetToSelectableFields(petSet *apps.PetSet) fields.Set { // MatchPetSet is the filter used by the generic etcd backend to watch events // from etcd to clients of the apiserver only interested in specific labels/fields. -func MatchPetSet(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchPetSet(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/pod/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/pod/etcd/etcd.go index dc4fa3e37c..a5650beec6 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/pod/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/pod/etcd/etcd.go @@ -63,7 +63,7 @@ func NewStorage(opts generic.RESTOptions, k client.ConnectionInfoGetter, proxyTr prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.PodList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Pods), &api.Pod{}, @@ -94,7 +94,8 @@ func NewStorage(opts generic.RESTOptions, k client.ConnectionInfoGetter, proxyTr DeleteStrategy: pod.Strategy, ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/vendor/k8s.io/kubernetes/pkg/registry/pod/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/pod/strategy.go index 7ac59d7d43..aa16a924a9 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/pod/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/pod/strategy.go @@ -155,8 +155,8 @@ func (podStatusStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Object } // MatchPod returns a generic matcher for a given label and field selector. -func MatchPod(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchPod(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/poddisruptionbudget/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/poddisruptionbudget/etcd/etcd.go index 9a5eef5a5e..3bf6620433 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/poddisruptionbudget/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/poddisruptionbudget/etcd/etcd.go @@ -38,7 +38,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &policyapi.PodDisruptionBudgetList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.PodDisruptionBudget), &policyapi.PodDisruptionBudget{}, @@ -79,7 +79,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: poddisruptionbudget.Strategy, DeleteStrategy: poddisruptionbudget.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = poddisruptionbudget.StatusStrategy diff --git a/vendor/k8s.io/kubernetes/pkg/registry/poddisruptionbudget/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/poddisruptionbudget/strategy.go index 04c143bcd6..04e853adc1 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/poddisruptionbudget/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/poddisruptionbudget/strategy.go @@ -27,6 +27,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -102,8 +103,8 @@ func PodDisruptionBudgetToSelectableFields(podDisruptionBudget *policy.PodDisrup // MatchPodDisruptionBudget is the filter used by the generic etcd backend to watch events // from etcd to clients of the apiserver only interested in specific labels/fields. -func MatchPodDisruptionBudget(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchPodDisruptionBudget(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/podsecuritypolicy/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/podsecuritypolicy/etcd/etcd.go index b5991f84ba..2a62230cff 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/podsecuritypolicy/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/podsecuritypolicy/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &extensions.PodSecurityPolicyList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.PodSecurityPolicies), &extensions.PodSecurityPolicy{}, @@ -68,6 +68,7 @@ func NewREST(opts generic.RESTOptions) *REST { DeleteStrategy: podsecuritypolicy.Strategy, ReturnDeletedObject: true, Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/podsecuritypolicy/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/podsecuritypolicy/strategy.go index aa6cd8c343..8edf6954a6 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/podsecuritypolicy/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/podsecuritypolicy/strategy.go @@ -27,6 +27,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -74,8 +75,8 @@ func (strategy) ValidateUpdate(ctx api.Context, obj, old runtime.Object) field.E } // Matcher returns a generic matcher for a given label and field selector. -func MatchPodSecurityPolicy(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchPodSecurityPolicy(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/podtemplate/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/podtemplate/etcd/etcd.go index 0394c94016..0371ad5ad9 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/podtemplate/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/podtemplate/etcd/etcd.go @@ -35,7 +35,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.PodTemplateList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.PodTemplates), &api.PodTemplate{}, @@ -68,7 +68,8 @@ func NewREST(opts generic.RESTOptions) *REST { ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/podtemplate/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/podtemplate/strategy.go index 4478928004..8cc3a69a56 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/podtemplate/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/podtemplate/strategy.go @@ -23,8 +23,8 @@ import ( "k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -86,8 +86,8 @@ func PodTemplateToSelectableFields(podTemplate *api.PodTemplate) fields.Set { return nil } -func MatchPodTemplate(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchPodTemplate(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/replicaset/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/replicaset/etcd/etcd.go index 9bed4db74a..ce078ff3e4 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/replicaset/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/replicaset/etcd/etcd.go @@ -61,7 +61,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &extensions.ReplicaSetList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Replicasets), &extensions.ReplicaSet{}, @@ -102,7 +102,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: replicaset.Strategy, DeleteStrategy: replicaset.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = replicaset.StatusStrategy diff --git a/vendor/k8s.io/kubernetes/pkg/registry/replicaset/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/replicaset/strategy.go index d438dd2afb..6bf3f7a0a0 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/replicaset/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/replicaset/strategy.go @@ -31,6 +31,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -121,8 +122,8 @@ func ReplicaSetToSelectableFields(rs *extensions.ReplicaSet) fields.Set { // MatchReplicaSet is the filter used by the generic etcd backend to route // watch events from etcd to clients of the apiserver only interested in specific // labels/fields. -func MatchReplicaSet(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchReplicaSet(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/resourcequota/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/resourcequota/etcd/etcd.go index 404eddc0e1..6d2c55341a 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/resourcequota/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/resourcequota/etcd/etcd.go @@ -36,7 +36,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.ResourceQuotaList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.ResourceQuotas), &api.ResourceQuota{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { DeleteStrategy: resourcequota.Strategy, ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/vendor/k8s.io/kubernetes/pkg/registry/resourcequota/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/resourcequota/strategy.go index 6b8dc9a89c..422acc749f 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/resourcequota/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/resourcequota/strategy.go @@ -25,6 +25,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -98,8 +99,8 @@ func (resourcequotaStatusStrategy) ValidateUpdate(ctx api.Context, obj, old runt } // MatchResourceQuota returns a generic matcher for a given label and field selector. -func MatchResourceQuota(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchResourceQuota(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/role/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/role/etcd/etcd.go index 4f6c5235da..2464fb1b21 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/role/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/role/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &rbac.RoleList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Roles), &rbac.Role{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: role.Strategy, DeleteStrategy: role.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/role/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/role/strategy.go index 02d30e36a4..a2c69ddb1c 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/role/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/role/strategy.go @@ -25,8 +25,8 @@ import ( "k8s.io/kubernetes/pkg/apis/rbac/validation" "k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -102,8 +102,8 @@ func (s strategy) Export(ctx api.Context, obj runtime.Object, exact bool) error } // Matcher returns a generic matcher for a given label and field selector. -func Matcher(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rolebinding/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/rolebinding/etcd/etcd.go index af43741fc3..c5b5c97a55 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/rolebinding/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/rolebinding/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &rbac.RoleBindingList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.RoleBindings), &rbac.RoleBinding{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: rolebinding.Strategy, DeleteStrategy: rolebinding.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/rolebinding/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/rolebinding/strategy.go index 2aca8190a2..180dd1813c 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/rolebinding/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/rolebinding/strategy.go @@ -25,8 +25,8 @@ import ( "k8s.io/kubernetes/pkg/apis/rbac/validation" "k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -102,8 +102,8 @@ func (s strategy) Export(ctx api.Context, obj runtime.Object, exact bool) error } // Matcher returns a generic matcher for a given label and field selector. -func Matcher(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/scheduledjob/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/scheduledjob/etcd/etcd.go index 5e55afcaca..d67e0ace74 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/scheduledjob/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/scheduledjob/etcd/etcd.go @@ -38,7 +38,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &batch.ScheduledJobList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.ScheduledJobs), &batch.ScheduledJob{}, @@ -79,7 +79,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { UpdateStrategy: scheduledjob.Strategy, DeleteStrategy: scheduledjob.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store diff --git a/vendor/k8s.io/kubernetes/pkg/registry/scheduledjob/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/scheduledjob/strategy.go index a0523bbb3c..9536e96883 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/scheduledjob/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/scheduledjob/strategy.go @@ -26,6 +26,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -104,8 +105,8 @@ func ScheduledJobToSelectableFields(scheduledJob *batch.ScheduledJob) fields.Set // MatchScheduledJob is the filter used by the generic etcd backend to route // watch events from etcd to clients of the apiserver only interested in specific // labels/fields. -func MatchScheduledJob(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchScheduledJob(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/secret/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/secret/etcd/etcd.go index 30a759aa96..0d9151c550 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/secret/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/secret/etcd/etcd.go @@ -35,7 +35,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.SecretList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Secrets), &api.Secret{}, @@ -65,7 +65,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: secret.Strategy, DeleteStrategy: secret.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/secret/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/secret/strategy.go index 83c4229fd3..687d84d6b9 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/secret/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/secret/strategy.go @@ -27,6 +27,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -94,8 +95,8 @@ func (s strategy) Export(ctx api.Context, obj runtime.Object, exact bool) error } // Matcher returns a generic matcher for a given label and field selector. -func Matcher(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/service/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/service/etcd/etcd.go index 9c137b96ff..ac91b6db3c 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/service/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/service/etcd/etcd.go @@ -36,7 +36,7 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.ServiceList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Services), &api.Service{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { DeleteStrategy: service.Strategy, ExportStrategy: service.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = service.StatusStrategy diff --git a/vendor/k8s.io/kubernetes/pkg/registry/service/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/service/strategy.go index e499c07566..1d64c7338d 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/service/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/service/strategy.go @@ -25,6 +25,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -100,8 +101,8 @@ func (svcStrategy) Export(ctx api.Context, obj runtime.Object, exact bool) error return nil } -func MatchServices(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchServices(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/serviceaccount/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/serviceaccount/etcd/etcd.go index 22dc642441..22b853e83a 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/serviceaccount/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/serviceaccount/etcd/etcd.go @@ -35,7 +35,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.ServiceAccountList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.ServiceAccounts), &api.ServiceAccount{}, @@ -66,7 +66,8 @@ func NewREST(opts generic.RESTOptions) *REST { DeleteStrategy: serviceaccount.Strategy, ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} } diff --git a/vendor/k8s.io/kubernetes/pkg/registry/serviceaccount/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/serviceaccount/strategy.go index d1db5ed3d5..9c352be74c 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/serviceaccount/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/serviceaccount/strategy.go @@ -25,6 +25,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -77,8 +78,8 @@ func (strategy) AllowUnconditionalUpdate() bool { } // Matcher returns a generic matcher for a given label and field selector. -func Matcher(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storageclass/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/storageclass/etcd/etcd.go index 7b26058d97..44ea28bcb3 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/storageclass/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/storageclass/etcd/etcd.go @@ -36,7 +36,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &storageapi.StorageClassList{} } - storageInterface, _ := opts.Decorator( + storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.StorageClasses), &storageapi.StorageClass{}, @@ -67,7 +67,8 @@ func NewREST(opts generic.RESTOptions) *REST { DeleteStrategy: storageclass.Strategy, ReturnDeletedObject: true, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/storageclass/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/storageclass/strategy.go index a0de384829..6eca78ffe5 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/storageclass/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/storageclass/strategy.go @@ -26,6 +26,7 @@ import ( "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -77,8 +78,8 @@ func (storageClassStrategy) AllowUnconditionalUpdate() bool { } // MatchStorageClass returns a generic matcher for a given label and field selector. -func MatchStorageClasses(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func MatchStorageClasses(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresource/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresource/etcd/etcd.go index 8da3c6b32f..e9e974d688 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresource/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresource/etcd/etcd.go @@ -35,7 +35,7 @@ func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix // We explicitly do NOT do any decoration here yet. - storageInterface, _ := generic.NewRawStorage(opts.StorageConfig) + storageInterface, dFunc := generic.NewRawStorage(opts.StorageConfig) store := ®istry.Store{ NewFunc: func() runtime.Object { return &extensions.ThirdPartyResource{} }, @@ -56,7 +56,8 @@ func NewREST(opts generic.RESTOptions) *REST { UpdateStrategy: thirdpartyresource.Strategy, DeleteStrategy: thirdpartyresource.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{store} diff --git a/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresource/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresource/strategy.go index 39b20a874f..8e02f5558f 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresource/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresource/strategy.go @@ -25,8 +25,8 @@ import ( "k8s.io/kubernetes/pkg/apis/extensions/validation" "k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -78,8 +78,8 @@ func (strategy) AllowUnconditionalUpdate() bool { } // Matcher returns a generic matcher for a given label and field selector. -func Matcher(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func Matcher(label labels.Selector, field fields.Selector) storage.SelectionPredicate { + return storage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd/etcd.go b/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd/etcd.go index 768411dea8..eeda2785bb 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd/etcd.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd/etcd.go @@ -38,7 +38,7 @@ func NewREST(opts generic.RESTOptions, group, kind string) *REST { prefix := "/ThirdPartyResourceData/" + group + "/" + strings.ToLower(kind) + "s" // We explicitly do NOT do any decoration here yet. - storageInterface, _ := generic.NewRawStorage(opts.StorageConfig) + storageInterface, dFunc := generic.NewRawStorage(opts.StorageConfig) store := ®istry.Store{ NewFunc: func() runtime.Object { return &extensions.ThirdPartyResourceData{} }, @@ -59,7 +59,8 @@ func NewREST(opts generic.RESTOptions, group, kind string) *REST { UpdateStrategy: thirdpartyresourcedata.Strategy, DeleteStrategy: thirdpartyresourcedata.Strategy, - Storage: storageInterface, + Storage: storageInterface, + DestroyFunc: dFunc, } return &REST{ diff --git a/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/strategy.go b/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/strategy.go index 5ed76ed45a..e5c93e78d1 100644 --- a/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/strategy.go +++ b/vendor/k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/strategy.go @@ -25,8 +25,8 @@ import ( "k8s.io/kubernetes/pkg/apis/extensions/validation" "k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/labels" - "k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/runtime" + apistorage "k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/util/validation/field" ) @@ -75,8 +75,8 @@ func (strategy) AllowUnconditionalUpdate() bool { } // Matcher returns a generic matcher for a given label and field selector. -func Matcher(label labels.Selector, field fields.Selector) *generic.SelectionPredicate { - return &generic.SelectionPredicate{ +func Matcher(label labels.Selector, field fields.Selector) apistorage.SelectionPredicate { + return apistorage.SelectionPredicate{ Label: label, Field: field, GetAttrs: func(obj runtime.Object) (labels.Set, fields.Set, error) { diff --git a/vendor/k8s.io/kubernetes/pkg/storage/cacher.go b/vendor/k8s.io/kubernetes/pkg/storage/cacher.go index 982ecdaea6..b7e579e2ea 100644 --- a/vendor/k8s.io/kubernetes/pkg/storage/cacher.go +++ b/vendor/k8s.io/kubernetes/pkg/storage/cacher.go @@ -271,7 +271,7 @@ func (c *Cacher) Delete(ctx context.Context, key string, out runtime.Object, pre } // Implements storage.Interface. -func (c *Cacher) Watch(ctx context.Context, key string, resourceVersion string, filter Filter) (watch.Interface, error) { +func (c *Cacher) Watch(ctx context.Context, key string, resourceVersion string, pred SelectionPredicate) (watch.Interface, error) { watchRV, err := ParseWatchResourceVersion(resourceVersion) if err != nil { return nil, err @@ -295,17 +295,17 @@ func (c *Cacher) Watch(ctx context.Context, key string, resourceVersion string, } triggerValue, triggerSupported := "", false - // TODO: Currently we assume that in a given Cacher object, any that is + // 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 := filter.Trigger(); len(matchValues) > 0 { + if matchValues := pred.MatcherIndex(); len(matchValues) > 0 { triggerValue, triggerSupported = matchValues[0].Value, true } c.Lock() defer c.Unlock() forget := forgetWatcher(c, c.watcherIdx, triggerValue, triggerSupported) - watcher := newCacheWatcher(watchRV, initEvents, filterFunction(key, c.keyFunc, filter), forget) + watcher := newCacheWatcher(watchRV, initEvents, filterFunction(key, c.keyFunc, pred), forget) c.watchers.addWatcher(watcher, c.watcherIdx, triggerValue, triggerSupported) c.watcherIdx++ @@ -313,8 +313,8 @@ func (c *Cacher) Watch(ctx context.Context, key string, resourceVersion string, } // Implements storage.Interface. -func (c *Cacher) WatchList(ctx context.Context, key string, resourceVersion string, filter Filter) (watch.Interface, error) { - return c.Watch(ctx, key, resourceVersion, filter) +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. @@ -323,16 +323,16 @@ func (c *Cacher) Get(ctx context.Context, key string, objPtr runtime.Object, ign } // Implements storage.Interface. -func (c *Cacher) GetToList(ctx context.Context, key string, filter Filter, listObj runtime.Object) error { - return c.storage.GetToList(ctx, key, filter, listObj) +func (c *Cacher) GetToList(ctx context.Context, key string, pred SelectionPredicate, listObj runtime.Object) error { + return c.storage.GetToList(ctx, key, pred, listObj) } // Implements storage.Interface. -func (c *Cacher) List(ctx context.Context, key string, resourceVersion string, filter Filter, listObj runtime.Object) error { +func (c *Cacher) List(ctx context.Context, key string, resourceVersion string, pred SelectionPredicate, listObj runtime.Object) error { if resourceVersion == "" { // If resourceVersion is not specified, serve it from underlying // storage (for backward compatibility). - return c.storage.List(ctx, key, resourceVersion, filter, listObj) + return c.storage.List(ctx, key, resourceVersion, pred, listObj) } // If resourceVersion is specified, serve it from cache. @@ -355,7 +355,7 @@ func (c *Cacher) List(ctx context.Context, key string, resourceVersion string, f if err != nil || listVal.Kind() != reflect.Slice { return fmt.Errorf("need a pointer to slice, got %v", listVal.Kind()) } - filterFunc := filterFunction(key, c.keyFunc, filter) + filter := filterFunction(key, c.keyFunc, pred) objs, readResourceVersion, err := c.watchCache.WaitUntilFreshAndList(listRV) if err != nil { @@ -366,7 +366,7 @@ func (c *Cacher) List(ctx context.Context, key string, resourceVersion string, f if !ok { return fmt.Errorf("non runtime.Object returned from storage: %v", obj) } - if filterFunc.Filter(object) { + if filter(object) { listVal.Set(reflect.Append(listVal, reflect.ValueOf(object).Elem())) } } @@ -498,19 +498,20 @@ func forgetWatcher(c *Cacher, index int, triggerValue string, triggerSupported b } } -func filterFunction(key string, keyFunc func(runtime.Object) (string, error), filter Filter) Filter { +func filterFunction(key string, keyFunc func(runtime.Object) (string, error), p SelectionPredicate) FilterFunc { + f := SimpleFilter(p) filterFunc := func(obj runtime.Object) bool { objKey, err := keyFunc(obj) if err != nil { - glog.Errorf("invalid object for filter: %v", obj) + glog.Errorf("invalid object for filter. Obj: %v. Err: %v", obj, err) return false } if !hasPathPrefix(objKey, key) { return false } - return filter.Filter(obj) + return f(obj) } - return NewSimpleFilter(filterFunc, filter.Trigger) + return filterFunc } // Returns resource version to which the underlying cache is synced. @@ -599,12 +600,12 @@ type cacheWatcher struct { sync.Mutex input chan watchCacheEvent result chan watch.Event - filter Filter + filter FilterFunc stopped bool forget func(bool) } -func newCacheWatcher(resourceVersion uint64, initEvents []watchCacheEvent, filter Filter, forget func(bool)) *cacheWatcher { +func newCacheWatcher(resourceVersion uint64, initEvents []watchCacheEvent, filter FilterFunc, forget func(bool)) *cacheWatcher { watcher := &cacheWatcher{ input: make(chan watchCacheEvent, 10), result: make(chan watch.Event, 10), @@ -678,10 +679,10 @@ func (c *cacheWatcher) add(event *watchCacheEvent) { } func (c *cacheWatcher) sendWatchCacheEvent(event watchCacheEvent) { - curObjPasses := event.Type != watch.Deleted && c.filter.Filter(event.Object) + curObjPasses := event.Type != watch.Deleted && c.filter(event.Object) oldObjPasses := false if event.PrevObject != nil { - oldObjPasses = c.filter.Filter(event.PrevObject) + oldObjPasses = c.filter(event.PrevObject) } if !curObjPasses && !oldObjPasses { // Watcher is not interested in that object. diff --git a/vendor/k8s.io/kubernetes/pkg/storage/etcd/etcd_helper.go b/vendor/k8s.io/kubernetes/pkg/storage/etcd/etcd_helper.go index 523d50b18b..066d20d51c 100644 --- a/vendor/k8s.io/kubernetes/pkg/storage/etcd/etcd_helper.go +++ b/vendor/k8s.io/kubernetes/pkg/storage/etcd/etcd_helper.go @@ -202,7 +202,7 @@ func (h *etcdHelper) Delete(ctx context.Context, key string, out runtime.Object, } // Implements storage.Interface. -func (h *etcdHelper) Watch(ctx context.Context, key string, resourceVersion string, filter storage.Filter) (watch.Interface, error) { +func (h *etcdHelper) Watch(ctx context.Context, key string, resourceVersion string, pred storage.SelectionPredicate) (watch.Interface, error) { if ctx == nil { glog.Errorf("Context is nil") } @@ -211,13 +211,13 @@ func (h *etcdHelper) Watch(ctx context.Context, key string, resourceVersion stri return nil, err } key = h.prefixEtcdKey(key) - w := newEtcdWatcher(false, h.quorum, nil, filter, h.codec, h.versioner, nil, h) + w := newEtcdWatcher(false, h.quorum, nil, storage.SimpleFilter(pred), h.codec, h.versioner, nil, h) go w.etcdWatch(ctx, h.etcdKeysAPI, key, watchRV) return w, nil } // Implements storage.Interface. -func (h *etcdHelper) WatchList(ctx context.Context, key string, resourceVersion string, filter storage.Filter) (watch.Interface, error) { +func (h *etcdHelper) WatchList(ctx context.Context, key string, resourceVersion string, pred storage.SelectionPredicate) (watch.Interface, error) { if ctx == nil { glog.Errorf("Context is nil") } @@ -226,7 +226,7 @@ func (h *etcdHelper) WatchList(ctx context.Context, key string, resourceVersion return nil, err } key = h.prefixEtcdKey(key) - w := newEtcdWatcher(true, h.quorum, exceptKey(key), filter, h.codec, h.versioner, nil, h) + w := newEtcdWatcher(true, h.quorum, exceptKey(key), storage.SimpleFilter(pred), h.codec, h.versioner, nil, h) go w.etcdWatch(ctx, h.etcdKeysAPI, key, watchRV) return w, nil } @@ -297,7 +297,7 @@ func (h *etcdHelper) extractObj(response *etcd.Response, inErr error, objPtr run } // Implements storage.Interface. -func (h *etcdHelper) GetToList(ctx context.Context, key string, filter storage.Filter, listObj runtime.Object) error { +func (h *etcdHelper) GetToList(ctx context.Context, key string, pred storage.SelectionPredicate, listObj runtime.Object) error { if ctx == nil { glog.Errorf("Context is nil") } @@ -326,7 +326,7 @@ func (h *etcdHelper) GetToList(ctx context.Context, key string, filter storage.F nodes := make([]*etcd.Node, 0) nodes = append(nodes, response.Node) - if err := h.decodeNodeList(nodes, filter, listPtr); err != nil { + if err := h.decodeNodeList(nodes, storage.SimpleFilter(pred), listPtr); err != nil { return err } trace.Step("Object decoded") @@ -337,7 +337,7 @@ func (h *etcdHelper) GetToList(ctx context.Context, key string, filter storage.F } // decodeNodeList walks the tree of each node in the list and decodes into the specified object -func (h *etcdHelper) decodeNodeList(nodes []*etcd.Node, filter storage.Filter, slicePtr interface{}) error { +func (h *etcdHelper) decodeNodeList(nodes []*etcd.Node, filter storage.FilterFunc, slicePtr interface{}) error { trace := util.NewTrace("decodeNodeList " + getTypeName(slicePtr)) defer trace.LogIfLong(400 * time.Millisecond) v, err := conversion.EnforcePtr(slicePtr) @@ -366,7 +366,7 @@ func (h *etcdHelper) decodeNodeList(nodes []*etcd.Node, filter storage.Filter, s } // being unable to set the version does not prevent the object from being extracted _ = h.versioner.UpdateObject(obj, node.ModifiedIndex) - if filter.Filter(obj) { + if filter(obj) { v.Set(reflect.Append(v, reflect.ValueOf(obj).Elem())) } if node.ModifiedIndex != 0 { @@ -379,7 +379,7 @@ func (h *etcdHelper) decodeNodeList(nodes []*etcd.Node, filter storage.Filter, s } // Implements storage.Interface. -func (h *etcdHelper) List(ctx context.Context, key string, resourceVersion string, filter storage.Filter, listObj runtime.Object) error { +func (h *etcdHelper) List(ctx context.Context, key string, resourceVersion string, pred storage.SelectionPredicate, listObj runtime.Object) error { if ctx == nil { glog.Errorf("Context is nil") } @@ -398,7 +398,7 @@ func (h *etcdHelper) List(ctx context.Context, key string, resourceVersion strin if err != nil { return err } - if err := h.decodeNodeList(nodes, filter, listPtr); err != nil { + if err := h.decodeNodeList(nodes, storage.SimpleFilter(pred), listPtr); err != nil { return err } trace.Step("Node list decoded") @@ -548,7 +548,7 @@ func (h *etcdHelper) prefixEtcdKey(key string) string { // their Node.ModifiedIndex, which is unique across all types. // All implementations must be thread-safe. type etcdCache interface { - getFromCache(index uint64, filter storage.Filter) (runtime.Object, bool) + getFromCache(index uint64, filter storage.FilterFunc) (runtime.Object, bool) addToCache(index uint64, obj runtime.Object) } @@ -556,14 +556,14 @@ func getTypeName(obj interface{}) string { return reflect.TypeOf(obj).String() } -func (h *etcdHelper) getFromCache(index uint64, filter storage.Filter) (runtime.Object, bool) { +func (h *etcdHelper) getFromCache(index uint64, filter storage.FilterFunc) (runtime.Object, bool) { startTime := time.Now() defer func() { metrics.ObserveGetCache(startTime) }() obj, found := h.cache.Get(index) if found { - if !filter.Filter(obj.(runtime.Object)) { + if !filter(obj.(runtime.Object)) { return nil, true } // We should not return the object itself to avoid polluting the cache if someone diff --git a/vendor/k8s.io/kubernetes/pkg/storage/etcd/etcd_watcher.go b/vendor/k8s.io/kubernetes/pkg/storage/etcd/etcd_watcher.go index 2ffcad479e..d00d51e19c 100644 --- a/vendor/k8s.io/kubernetes/pkg/storage/etcd/etcd_watcher.go +++ b/vendor/k8s.io/kubernetes/pkg/storage/etcd/etcd_watcher.go @@ -95,7 +95,7 @@ type etcdWatcher struct { list bool // If we're doing a recursive watch, should be true. quorum bool // If we enable quorum, shoule be true include includeFunc - filter storage.Filter + filter storage.FilterFunc etcdIncoming chan *etcd.Response etcdError chan error @@ -123,7 +123,7 @@ 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, filter storage.Filter, + list bool, quorum bool, include includeFunc, filter storage.FilterFunc, encoding runtime.Codec, versioner storage.Versioner, transform TransformFunc, cache etcdCache) *etcdWatcher { w := &etcdWatcher{ @@ -328,7 +328,7 @@ func (w *etcdWatcher) translate() { } func (w *etcdWatcher) decodeObject(node *etcd.Node) (runtime.Object, error) { - if obj, found := w.cache.getFromCache(node.ModifiedIndex, storage.Everything); found { + if obj, found := w.cache.getFromCache(node.ModifiedIndex, storage.SimpleFilter(storage.Everything)); found { return obj, nil } @@ -373,7 +373,7 @@ func (w *etcdWatcher) sendAdd(res *etcd.Response) { // the resourceVersion to resume will never be able to get past a bad value. return } - if !w.filter.Filter(obj) { + if !w.filter(obj) { return } action := watch.Added @@ -402,7 +402,7 @@ func (w *etcdWatcher) sendModify(res *etcd.Response) { // the resourceVersion to resume will never be able to get past a bad value. return } - curObjPasses := w.filter.Filter(curObj) + curObjPasses := w.filter(curObj) oldObjPasses := false var oldObj runtime.Object if res.PrevNode != nil && res.PrevNode.Value != "" { @@ -411,7 +411,7 @@ func (w *etcdWatcher) sendModify(res *etcd.Response) { if err := w.versioner.UpdateObject(oldObj, res.Node.ModifiedIndex); err != nil { utilruntime.HandleError(fmt.Errorf("failure to version api object (%d) %#v: %v", res.Node.ModifiedIndex, oldObj, err)) } - oldObjPasses = w.filter.Filter(oldObj) + oldObjPasses = w.filter(oldObj) } } // Some changes to an object may cause it to start or stop matching a filter. @@ -460,7 +460,7 @@ func (w *etcdWatcher) sendDelete(res *etcd.Response) { // the resourceVersion to resume will never be able to get past a bad value. return } - if !w.filter.Filter(obj) { + if !w.filter(obj) { return } w.emit(watch.Event{ diff --git a/vendor/k8s.io/kubernetes/pkg/storage/etcd3/event.go b/vendor/k8s.io/kubernetes/pkg/storage/etcd3/event.go index 585c371b5d..4746dafb42 100644 --- a/vendor/k8s.io/kubernetes/pkg/storage/etcd3/event.go +++ b/vendor/k8s.io/kubernetes/pkg/storage/etcd3/event.go @@ -24,15 +24,17 @@ import ( type event struct { key string value []byte + prevValue []byte rev int64 isDeleted bool isCreated bool } -func parseKV(kv *mvccpb.KeyValue) *event { +func parseKV(kv *mvccpb.KeyValue, prevVal []byte) *event { return &event{ key: string(kv.Key), value: kv.Value, + prevValue: prevVal, rev: kv.ModRevision, isDeleted: false, isCreated: kv.ModRevision == kv.CreateRevision, @@ -40,11 +42,15 @@ func parseKV(kv *mvccpb.KeyValue) *event { } func parseEvent(e *clientv3.Event) *event { - return &event{ + ret := &event{ key: string(e.Kv.Key), value: e.Kv.Value, rev: e.Kv.ModRevision, isDeleted: e.Type == clientv3.EventTypeDelete, isCreated: e.IsCreate(), } + if e.PrevKv != nil { + ret.prevValue = e.PrevKv.Value + } + return ret } diff --git a/vendor/k8s.io/kubernetes/pkg/storage/etcd3/store.go b/vendor/k8s.io/kubernetes/pkg/storage/etcd3/store.go index 83b74a5636..9eb5fda3c6 100644 --- a/vendor/k8s.io/kubernetes/pkg/storage/etcd3/store.go +++ b/vendor/k8s.io/kubernetes/pkg/storage/etcd3/store.go @@ -255,7 +255,7 @@ func (s *store) GuaranteedUpdate(ctx context.Context, key string, out runtime.Ob } // GetToList implements storage.Interface.GetToList. -func (s *store) GetToList(ctx context.Context, key string, filter storage.Filter, listObj runtime.Object) error { +func (s *store) GetToList(ctx context.Context, key string, pred storage.SelectionPredicate, listObj runtime.Object) error { listPtr, err := meta.GetItemsPtr(listObj) if err != nil { return err @@ -273,7 +273,7 @@ func (s *store) GetToList(ctx context.Context, key string, filter storage.Filter data: getResp.Kvs[0].Value, rev: uint64(getResp.Kvs[0].ModRevision), }} - if err := decodeList(elems, filter, listPtr, s.codec, s.versioner); err != nil { + if err := decodeList(elems, storage.SimpleFilter(pred), listPtr, s.codec, s.versioner); err != nil { return err } // update version with cluster level revision @@ -281,7 +281,7 @@ func (s *store) GetToList(ctx context.Context, key string, filter storage.Filter } // List implements storage.Interface.List. -func (s *store) List(ctx context.Context, key, resourceVersion string, filter storage.Filter, listObj runtime.Object) error { +func (s *store) List(ctx context.Context, key, resourceVersion string, pred storage.SelectionPredicate, listObj runtime.Object) error { listPtr, err := meta.GetItemsPtr(listObj) if err != nil { return err @@ -305,7 +305,7 @@ func (s *store) List(ctx context.Context, key, resourceVersion string, filter st rev: uint64(kv.ModRevision), } } - if err := decodeList(elems, filter, listPtr, s.codec, s.versioner); err != nil { + if err := decodeList(elems, storage.SimpleFilter(pred), listPtr, s.codec, s.versioner); err != nil { return err } // update version with cluster level revision @@ -313,22 +313,22 @@ func (s *store) List(ctx context.Context, key, resourceVersion string, filter st } // Watch implements storage.Interface.Watch. -func (s *store) Watch(ctx context.Context, key string, resourceVersion string, filter storage.Filter) (watch.Interface, error) { - return s.watch(ctx, key, resourceVersion, filter, false) +func (s *store) Watch(ctx context.Context, key string, resourceVersion string, pred storage.SelectionPredicate) (watch.Interface, error) { + return s.watch(ctx, key, resourceVersion, pred, false) } // WatchList implements storage.Interface.WatchList. -func (s *store) WatchList(ctx context.Context, key string, resourceVersion string, filter storage.Filter) (watch.Interface, error) { - return s.watch(ctx, key, resourceVersion, filter, true) +func (s *store) WatchList(ctx context.Context, key string, resourceVersion string, pred storage.SelectionPredicate) (watch.Interface, error) { + return s.watch(ctx, key, resourceVersion, pred, true) } -func (s *store) watch(ctx context.Context, key string, rv string, filter storage.Filter, recursive bool) (watch.Interface, error) { +func (s *store) watch(ctx context.Context, key string, rv string, pred storage.SelectionPredicate, recursive bool) (watch.Interface, error) { rev, err := storage.ParseWatchResourceVersion(rv) if err != nil { return nil, err } key = keyWithPrefix(s.pathPrefix, key) - return s.watcher.Watch(ctx, key, int64(rev), recursive, filter) + return s.watcher.Watch(ctx, key, int64(rev), recursive, pred) } func (s *store) getState(getResp *clientv3.GetResponse, key string, v reflect.Value, ignoreNotFound bool) (*objState, error) { @@ -416,7 +416,7 @@ func decode(codec runtime.Codec, versioner storage.Versioner, value []byte, objP // decodeList decodes a list of values into a list of objects, with resource version set to corresponding rev. // On success, ListPtr would be set to the list of objects. -func decodeList(elems []*elemForDecode, filter storage.Filter, ListPtr interface{}, codec runtime.Codec, versioner storage.Versioner) error { +func decodeList(elems []*elemForDecode, filter storage.FilterFunc, ListPtr interface{}, codec runtime.Codec, versioner storage.Versioner) error { v, err := conversion.EnforcePtr(ListPtr) if err != nil || v.Kind() != reflect.Slice { panic("need ptr to slice") @@ -428,7 +428,7 @@ func decodeList(elems []*elemForDecode, filter storage.Filter, ListPtr interface } // being unable to set the version does not prevent the object from being extracted versioner.UpdateObject(obj, elem.rev) - if filter.Filter(obj) { + if filter(obj) { v.Set(reflect.Append(v, reflect.ValueOf(obj).Elem())) } } @@ -444,7 +444,7 @@ func checkPreconditions(key string, preconditions *storage.Preconditions, out ru 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.UID { - errMsg := fmt.Sprintf("Precondition failed: UID in precondition: %v, UID in object meta: %v", preconditions.UID, objMeta.UID) + errMsg := fmt.Sprintf("Precondition failed: UID in precondition: %v, UID in object meta: %v", *preconditions.UID, objMeta.UID) return storage.NewInvalidObjError(key, errMsg) } return nil diff --git a/vendor/k8s.io/kubernetes/pkg/storage/etcd3/watcher.go b/vendor/k8s.io/kubernetes/pkg/storage/etcd3/watcher.go index 0b3b39baee..7ccb61cb01 100644 --- a/vendor/k8s.io/kubernetes/pkg/storage/etcd3/watcher.go +++ b/vendor/k8s.io/kubernetes/pkg/storage/etcd3/watcher.go @@ -31,8 +31,6 @@ import ( etcdrpc "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" "github.com/golang/glog" "golang.org/x/net/context" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" ) const ( @@ -53,7 +51,7 @@ type watchChan struct { key string initialRev int64 recursive bool - filter storage.Filter + internalFilter storage.FilterFunc ctx context.Context cancel context.CancelFunc incomingEventChan chan *event @@ -75,33 +73,38 @@ func newWatcher(client *clientv3.Client, codec runtime.Codec, versioner storage. // If rev is non-zero, it will watch events happened after given revision. // If recursive is false, it watches on given key. // If recursive is true, it watches any children and directories under the key, excluding the root key itself. -// filter must be non-nil. Only if filter returns true will the changes be returned. -func (w *watcher) Watch(ctx context.Context, key string, rev int64, recursive bool, filter storage.Filter) (watch.Interface, error) { +// pred must be non-nil. Only if pred matches the change, it will be returned. +func (w *watcher) Watch(ctx context.Context, key string, rev int64, recursive bool, pred storage.SelectionPredicate) (watch.Interface, error) { if recursive && !strings.HasSuffix(key, "/") { key += "/" } - wc := w.createWatchChan(ctx, key, rev, recursive, filter) + wc := w.createWatchChan(ctx, key, rev, recursive, pred) go wc.run() return wc, nil } -func (w *watcher) createWatchChan(ctx context.Context, key string, rev int64, recursive bool, filter storage.Filter) *watchChan { +func (w *watcher) createWatchChan(ctx context.Context, key string, rev int64, recursive bool, pred storage.SelectionPredicate) *watchChan { wc := &watchChan{ watcher: w, key: key, initialRev: rev, recursive: recursive, - filter: filter, + internalFilter: storage.SimpleFilter(pred), incomingEventChan: make(chan *event, incomingBufSize), resultChan: make(chan watch.Event, outgoingBufSize), errChan: make(chan error, 1), } + if pred.Label.Empty() && pred.Field.Empty() { + // The filter doesn't filter out any object. + wc.internalFilter = nil + } wc.ctx, wc.cancel = context.WithCancel(ctx) return wc } func (wc *watchChan) run() { - go wc.startWatching() + watchClosedCh := make(chan struct{}) + go wc.startWatching(watchClosedCh) var resultChanWG sync.WaitGroup resultChanWG.Add(1) @@ -109,6 +112,9 @@ func (wc *watchChan) run() { select { case err := <-wc.errChan: + if err == context.Canceled { + break + } errResult := parseError(err) if errResult != nil { // error result is guaranteed to be received by user before closing ResultChan. @@ -117,10 +123,15 @@ func (wc *watchChan) run() { case <-wc.ctx.Done(): // user has given up all results } } - wc.cancel() - case <-wc.ctx.Done(): + case <-watchClosedCh: + case <-wc.ctx.Done(): // user cancel } - // we need to wait until resultChan wouldn't be sent to anymore + + // We use wc.ctx to reap all goroutines. Under whatever condition, we should stop them all. + // It's fine to double cancel. + wc.cancel() + + // we need to wait until resultChan wouldn't be used anymore resultChanWG.Wait() close(wc.resultChan) } @@ -147,7 +158,15 @@ func (wc *watchChan) sync() error { wc.initialRev = getResp.Header.Revision for _, kv := range getResp.Kvs { - wc.sendEvent(parseKV(kv)) + prevResp, err := wc.watcher.client.Get(wc.ctx, string(kv.Key), clientv3.WithRev(kv.ModRevision-1)) + if err != nil { + return err + } + var prevVal []byte + if len(prevResp.Kvs) > 0 { + prevVal = prevResp.Kvs[0].Value + } + wc.sendEvent(parseKV(kv, prevVal)) } return nil } @@ -155,28 +174,36 @@ func (wc *watchChan) sync() error { // startWatching does: // - get current objects if initialRev=0; set initialRev to current rev // - watch on given key and send events to process. -func (wc *watchChan) startWatching() { +func (wc *watchChan) startWatching(watchClosedCh chan struct{}) { if wc.initialRev == 0 { if err := wc.sync(); err != nil { + glog.Errorf("failed to sync with latest state: %v", err) wc.sendError(err) return } } - opts := []clientv3.OpOption{clientv3.WithRev(wc.initialRev + 1)} + opts := []clientv3.OpOption{clientv3.WithRev(wc.initialRev + 1), clientv3.WithPrevKV()} if wc.recursive { opts = append(opts, clientv3.WithPrefix()) } wch := wc.watcher.client.Watch(wc.ctx, wc.key, opts...) for wres := range wch { if wres.Err() != nil { + err := wres.Err() // If there is an error on server (e.g. compaction), the channel will return it before closed. - wc.sendError(wres.Err()) + glog.Errorf("watch chan error: %v", err) + wc.sendError(err) return } for _, e := range wres.Events { wc.sendEvent(parseEvent(e)) } } + // When we come to this point, it's only possible that client side ends the watch. + // e.g. cancel the context, close the client. + // If this watch chan is broken and context isn't cancelled, other goroutines will still hang. + // We should notify the main thread that this goroutine has exited. + close(watchClosedCh) } // processEvent processes events from etcd watcher and sends results to resultChan. @@ -208,24 +235,29 @@ func (wc *watchChan) processEvent(wg *sync.WaitGroup) { } } +func (wc *watchChan) filter(obj runtime.Object) bool { + if wc.internalFilter == nil { + return true + } + return wc.internalFilter(obj) +} + +func (wc *watchChan) acceptAll() bool { + return wc.internalFilter == nil +} + // transform transforms an event into a result for user if not filtered. -// TODO (Optimization): -// - Save remote round-trip. -// Currently, DELETE and PUT event don't contain the previous value. -// We need to do another Get() in order to get previous object and have logic upon it. -// We could potentially do some optimizations: -// - For PUT, we can save current and previous objects into the value. -// - For DELETE, See https://github.com/coreos/etcd/issues/4620 func (wc *watchChan) transform(e *event) (res *watch.Event) { - curObj, oldObj, err := prepareObjs(wc.ctx, e, wc.watcher.client, wc.watcher.codec, wc.watcher.versioner) + curObj, oldObj, err := wc.prepareObjs(e) if err != nil { + glog.Errorf("failed to prepare current and previous objects: %v", err) wc.sendError(err) return nil } switch { case e.isDeleted: - if !wc.filter.Filter(oldObj) { + if !wc.filter(oldObj) { return nil } res = &watch.Event{ @@ -233,7 +265,7 @@ func (wc *watchChan) transform(e *event) (res *watch.Event) { Object: oldObj, } case e.isCreated: - if !wc.filter.Filter(curObj) { + if !wc.filter(curObj) { return nil } res = &watch.Event{ @@ -241,8 +273,15 @@ func (wc *watchChan) transform(e *event) (res *watch.Event) { Object: curObj, } default: - curObjPasses := wc.filter.Filter(curObj) - oldObjPasses := wc.filter.Filter(oldObj) + if wc.acceptAll() { + res = &watch.Event{ + Type: watch.Modified, + Object: curObj, + } + return res + } + curObjPasses := wc.filter(curObj) + oldObjPasses := wc.filter(oldObj) switch { case curObjPasses && oldObjPasses: res = &watch.Event{ @@ -290,12 +329,6 @@ func parseError(err error) *watch.Event { } func (wc *watchChan) sendError(err error) { - // Context.canceled is an expected behavior. - // We should just stop all goroutines in watchChan without returning error. - // TODO: etcd client should return context.Canceled instead of grpc specific error. - if grpc.Code(err) == codes.Canceled || err == context.Canceled { - return - } select { case wc.errChan <- err: case <-wc.ctx.Done(): @@ -314,23 +347,22 @@ func (wc *watchChan) sendEvent(e *event) { } } -func prepareObjs(ctx context.Context, e *event, client *clientv3.Client, codec runtime.Codec, versioner storage.Versioner) (curObj runtime.Object, oldObj runtime.Object, err error) { +func (wc *watchChan) prepareObjs(e *event) (curObj runtime.Object, oldObj runtime.Object, err error) { if !e.isDeleted { - curObj, err = decodeObj(codec, versioner, e.value, e.rev) + curObj, err = decodeObj(wc.watcher.codec, wc.watcher.versioner, e.value, e.rev) if err != nil { return nil, nil, err } } - if e.isDeleted || !e.isCreated { - getResp, err := client.Get(ctx, e.key, clientv3.WithRev(e.rev-1)) - if err != nil { - return nil, nil, err - } + // We need to decode prevValue, only if this is deletion event or + // the underlying filter doesn't accept all objects (otherwise we + // know that the filter for previous object will return true and + // we need the object only to compute whether it was filtered out + // before). + if len(e.prevValue) > 0 && (e.isDeleted || !wc.acceptAll()) { // Note that this sends the *old* object with the etcd revision for the time at // which it gets deleted. - // We assume old object is returned only in Deleted event. Users (e.g. cacher) need - // to have larger than previous rev to tell the ordering. - oldObj, err = decodeObj(codec, versioner, getResp.Kvs[0].Value, e.rev) + oldObj, err = decodeObj(wc.watcher.codec, wc.watcher.versioner, e.prevValue, e.rev) if err != nil { return nil, nil, err } diff --git a/vendor/k8s.io/kubernetes/pkg/storage/interfaces.go b/vendor/k8s.io/kubernetes/pkg/storage/interfaces.go index 900a4a2e27..71c4bcf94f 100644 --- a/vendor/k8s.io/kubernetes/pkg/storage/interfaces.go +++ b/vendor/k8s.io/kubernetes/pkg/storage/interfaces.go @@ -18,6 +18,8 @@ package storage import ( "golang.org/x/net/context" + "k8s.io/kubernetes/pkg/fields" + "k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/watch" @@ -62,34 +64,14 @@ type MatchValue struct { // to that function. type TriggerPublisherFunc func(obj runtime.Object) []MatchValue -// Filter is interface that is used to pass filtering mechanism. -type Filter interface { - // Filter is a predicate which takes an API object and returns true - // if and only if the object should remain in the set. - Filter(obj runtime.Object) bool - // For any triggers known to the Filter, if Filter() can return only - // (a subset of) objects for which indexing function returns , - // (, pair would be returned. - // - // This is optimization to avoid computing Filter() function (which are - // usually relatively expensive) in case we are sure they will return - // false anyway. - Trigger() []MatchValue -} +// FilterFunc takes an API object and returns true if the object satisfies some requirements. +// TODO: We will remove this type and use SelectionPredicate everywhere. +type FilterFunc func(obj runtime.Object) bool -// Everything is a Filter which accepts all objects. -var Everything Filter = everything{} - -// everything is implementation of Everything. -type everything struct { -} - -func (e everything) Filter(runtime.Object) bool { - return true -} - -func (e everything) Trigger() []MatchValue { - return nil +// Everything accepts all objects. +var Everything = SelectionPredicate{ + Label: labels.Everything(), + Field: fields.Everything(), } // Pass an UpdateFunc to Interface.GuaranteedUpdate to make an update @@ -125,18 +107,18 @@ type Interface interface { Delete(ctx context.Context, key string, out runtime.Object, preconditions *Preconditions) error // Watch begins watching the specified key. Events are decoded into API objects, - // and any items passing 'filter' are sent down to returned watch.Interface. + // and any items selected by 'p' are sent down to returned watch.Interface. // resourceVersion may be used to specify what version to begin watching, // which should be the current resourceVersion, and no longer rv+1 // (e.g. reconnecting without missing any updates). - Watch(ctx context.Context, key string, resourceVersion string, filter Filter) (watch.Interface, error) + Watch(ctx context.Context, key string, resourceVersion string, p SelectionPredicate) (watch.Interface, error) // WatchList begins watching the specified key's items. Items are decoded into API - // objects and any item passing 'filter' are sent down to returned watch.Interface. + // objects and any item selected by 'p' are sent down to returned watch.Interface. // resourceVersion may be used to specify what version to begin watching, // which should be the current resourceVersion, and no longer rv+1 // (e.g. reconnecting without missing any updates). - WatchList(ctx context.Context, key string, resourceVersion string, filter Filter) (watch.Interface, error) + WatchList(ctx context.Context, key string, resourceVersion string, p SelectionPredicate) (watch.Interface, error) // Get unmarshals json found at key into objPtr. On a not found error, will either // return a zero object of the requested type, or an error, depending on ignoreNotFound. @@ -145,13 +127,13 @@ type Interface interface { // GetToList unmarshals json found at key and opaque it into *List api object // (an object that satisfies the runtime.IsList definition). - GetToList(ctx context.Context, key string, filter Filter, listObj runtime.Object) error + GetToList(ctx context.Context, key string, p SelectionPredicate, listObj runtime.Object) error // List unmarshalls jsons found at directory defined by key and opaque them // into *List api object (an object that satisfies runtime.IsList definition). // The returned contents may be delayed, but it is guaranteed that they will // be have at least 'resourceVersion'. - List(ctx context.Context, key string, resourceVersion string, filter Filter, listObj runtime.Object) error + List(ctx context.Context, key string, resourceVersion string, p SelectionPredicate, listObj runtime.Object) error // GuaranteedUpdate keeps calling 'tryUpdate()' to update key 'key' (of type 'ptrToType') // retrying the update until success if there is index conflict. diff --git a/vendor/k8s.io/kubernetes/pkg/storage/selection_predicate.go b/vendor/k8s.io/kubernetes/pkg/storage/selection_predicate.go new file mode 100644 index 0000000000..f4083bc916 --- /dev/null +++ b/vendor/k8s.io/kubernetes/pkg/storage/selection_predicate.go @@ -0,0 +1,77 @@ +/* +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 ( + "k8s.io/kubernetes/pkg/fields" + "k8s.io/kubernetes/pkg/labels" + "k8s.io/kubernetes/pkg/runtime" +) + +// AttrFunc returns label and field sets for List or Watch to match. +// In any failure to parse given object, it returns error. +type AttrFunc func(obj runtime.Object) (labels.Set, fields.Set, error) + +// SelectionPredicate is used to represent the way to select objects from api storage. +type SelectionPredicate struct { + Label labels.Selector + Field fields.Selector + GetAttrs AttrFunc + IndexFields []string +} + +// Matches returns true if the given object's labels and fields (as +// returned by s.GetAttrs) match s.Label and s.Field. An error is +// returned if s.GetAttrs fails. +func (s *SelectionPredicate) Matches(obj runtime.Object) (bool, error) { + if s.Label.Empty() && s.Field.Empty() { + return true, nil + } + labels, fields, err := s.GetAttrs(obj) + if err != nil { + return false, err + } + matched := s.Label.Matches(labels) + if s.Field != nil { + matched = (matched && s.Field.Matches(fields)) + } + return matched, nil +} + +// MatchesSingle will return (name, true) if and only if s.Field matches on the object's +// name. +func (s *SelectionPredicate) MatchesSingle() (string, bool) { + // TODO: should be namespace.name + if name, ok := s.Field.RequiresExactMatch("metadata.name"); ok { + return name, true + } + return "", false +} + +// For any index defined by IndexFields, if a matcher can match only (a subset) +// of objects that return for a given index, a pair (, ) +// wil be returned. +// TODO: Consider supporting also labels. +func (s *SelectionPredicate) MatcherIndex() []MatchValue { + var result []MatchValue + for _, field := range s.IndexFields { + if value, ok := s.Field.RequiresExactMatch(field); ok { + result = append(result, MatchValue{IndexName: field, Value: value}) + } + } + return result +} diff --git a/vendor/k8s.io/kubernetes/pkg/storage/storagebackend/factory/etcd3.go b/vendor/k8s.io/kubernetes/pkg/storage/storagebackend/factory/etcd3.go index ee5d1d9326..f860f91814 100644 --- a/vendor/k8s.io/kubernetes/pkg/storage/storagebackend/factory/etcd3.go +++ b/vendor/k8s.io/kubernetes/pkg/storage/storagebackend/factory/etcd3.go @@ -36,7 +36,11 @@ func newETCD3Storage(c storagebackend.Config) (storage.Interface, DestroyFunc, e if err != nil { return nil, nil, err } - + // NOTE: Client relies on nil tlsConfig + // for non-secure connections, update the implicit variable + if len(c.CertFile) == 0 && len(c.KeyFile) == 0 && len(c.CAFile) == 0 { + tlsConfig = nil + } cfg := clientv3.Config{ Endpoints: c.ServerList, TLS: tlsConfig, diff --git a/vendor/k8s.io/kubernetes/pkg/storage/util.go b/vendor/k8s.io/kubernetes/pkg/storage/util.go index 571e104d93..98ed520b4c 100644 --- a/vendor/k8s.io/kubernetes/pkg/storage/util.go +++ b/vendor/k8s.io/kubernetes/pkg/storage/util.go @@ -21,6 +21,8 @@ import ( "strconv" "strings" + "github.com/golang/glog" + "k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/runtime" @@ -37,26 +39,16 @@ func SimpleUpdate(fn SimpleUpdateFunc) UpdateFunc { } } -// SimpleFilter implements Filter interface. -type SimpleFilter struct { - filterFunc func(runtime.Object) bool - triggerFunc func() []MatchValue -} - -func (s *SimpleFilter) Filter(obj runtime.Object) bool { - return s.filterFunc(obj) -} - -func (s *SimpleFilter) Trigger() []MatchValue { - return s.triggerFunc() -} - -func NewSimpleFilter( - filterFunc func(runtime.Object) bool, - triggerFunc func() []MatchValue) Filter { - return &SimpleFilter{ - filterFunc: filterFunc, - triggerFunc: triggerFunc, +// SimpleFilter converts a selection predicate into a FilterFunc. +// It ignores any error from Matches(). +func SimpleFilter(p SelectionPredicate) FilterFunc { + return func(obj runtime.Object) bool { + matches, err := p.Matches(obj) + if err != nil { + glog.Errorf("invalid object for matching. Obj: %v. Err: %v", obj, err) + return false + } + return matches } } 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 2c94f32d76..5381937cad 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/mount_linux.go @@ -102,6 +102,7 @@ func isBind(options []string) (bool, []string) { func doMount(source string, target string, fstype string, options []string) error { glog.V(5).Infof("Mounting %s %s %s %v", source, target, fstype, options) mountArgs := makeMountArgs(source, target, fstype, options) + glog.V(4).Infof("Mounting with arguments (%s)", mountArgs) command := exec.Command("mount", mountArgs...) output, err := command.CombinedOutput() if err != nil { @@ -133,7 +134,7 @@ func makeMountArgs(source, target, fstype string, options []string) []string { // Unmount unmounts the target. func (mounter *Mounter) Unmount(target string) error { - glog.V(5).Infof("Unmounting %s", target) + glog.V(4).Infof("Unmounting %s", target) command := exec.Command("umount", target) output, err := command.CombinedOutput() if err != nil { @@ -154,6 +155,10 @@ func (*Mounter) List() ([]MountPoint, error) { // will return true. When in fact /tmp/b is a mount point. If this situation // if of interest to you, don't use this function... func (mounter *Mounter) IsLikelyNotMountPoint(file string) (bool, error) { + return IsNotMountPoint(file) +} + +func IsNotMountPoint(file string) (bool, error) { stat, err := os.Stat(file) if err != nil { return true, err @@ -171,9 +176,10 @@ func (mounter *Mounter) IsLikelyNotMountPoint(file string) (bool, error) { } // DeviceOpened checks if block device in use by calling Open with O_EXCL flag. -// Returns true if open returns errno EBUSY, and false if errno is nil. -// Returns an error if errno is any error other than EBUSY. -// Returns with error if pathname is not a device. +// If pathname is not a device, log and return false with nil error. +// If open returns errno EBUSY, return true with nil error. +// If open returns nil, return false with nil error. +// Otherwise, return false with error func (mounter *Mounter) DeviceOpened(pathname string) (bool, error) { return exclusiveOpenFailsOnDevice(pathname) } @@ -185,12 +191,17 @@ func (mounter *Mounter) PathIsDevice(pathname string) (bool, error) { } func exclusiveOpenFailsOnDevice(pathname string) (bool, error) { - if isDevice, err := pathIsDevice(pathname); !isDevice { + isDevice, err := pathIsDevice(pathname) + if err != nil { return false, fmt.Errorf( "PathIsDevice failed for path %q: %v", pathname, err) } + if !isDevice { + glog.Errorf("Path %q is not refering to a device.", pathname) + return false, nil + } fd, errno := syscall.Open(pathname, syscall.O_RDONLY|syscall.O_EXCL, 0) // If the device is in use, open will return an invalid fd. // When this happens, it is expected that Close will fail and throw an error. 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 c22ba30bdb..c031cfb9f2 100644 --- a/vendor/k8s.io/kubernetes/pkg/util/mount/mount_unsupported.go +++ b/vendor/k8s.io/kubernetes/pkg/util/mount/mount_unsupported.go @@ -55,3 +55,7 @@ func (mounter *SafeFormatAndMount) formatAndMount(source string, target string, func (mounter *SafeFormatAndMount) diskLooksUnformatted(disk string) (bool, error) { return true, nil } + +func IsNotMountPoint(file string) (bool, error) { + return true, nil +} diff --git a/vendor/k8s.io/kubernetes/pkg/version/base.go b/vendor/k8s.io/kubernetes/pkg/version/base.go index 7fdebe1fd1..96af977f14 100644 --- a/vendor/k8s.io/kubernetes/pkg/version/base.go +++ b/vendor/k8s.io/kubernetes/pkg/version/base.go @@ -51,7 +51,7 @@ var ( // semantic version is a git hash, but the version itself is no // longer the direct output of "git describe", but a slight // translation to be semver compliant. - gitVersion string = "v1.4.3+$Format:%h$" + gitVersion string = "v1.4.5+$Format:%h$" gitCommit string = "$Format:%H$" // sha1 from git, output of $(git rev-parse HEAD) gitTreeState string = "not a git tree" // state of git tree, either "clean" or "dirty" diff --git a/vendor/k8s.io/kubernetes/pkg/volume/gce_pd/gce_pd.go b/vendor/k8s.io/kubernetes/pkg/volume/gce_pd/gce_pd.go index cc0431e1c7..32d2e30875 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/gce_pd/gce_pd.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/gce_pd/gce_pd.go @@ -250,7 +250,7 @@ func (b *gcePersistentDiskMounter) SetUp(fsGroup *int64) error { func (b *gcePersistentDiskMounter) SetUpAt(dir string, fsGroup *int64) error { // TODO: handle failed mounts here. notMnt, err := b.mounter.IsLikelyNotMountPoint(dir) - glog.V(4).Infof("PersistentDisk set up: %s %v %v, pd name %v readOnly %v", dir, !notMnt, err, b.pdName, b.readOnly) + glog.V(4).Infof("GCE PersistentDisk set up: Dir (%s) PD name (%q) Mounted (%t) Error (%v), ReadOnly (%t)", dir, b.pdName, !notMnt, err, b.readOnly) if err != nil && !os.IsNotExist(err) { glog.Errorf("cannot validate mount point: %s %v", dir, err) return err 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 index c09de91159..c8cb6ba9aa 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_executor.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_executor.go @@ -758,11 +758,12 @@ func (oe *operationExecutor) generateMountVolumeFunc( } glog.Infof( - "MountVolume.MountDevice succeeded for volume %q (spec.Name: %q) pod %q (UID: %q).", + "MountVolume.MountDevice succeeded for volume %q (spec.Name: %q) pod %q (UID: %q) device mount path %q", volumeToMount.VolumeName, volumeToMount.VolumeSpec.Name(), volumeToMount.PodName, - volumeToMount.Pod.UID) + volumeToMount.Pod.UID, + deviceMountPath) // Update actual state of world to reflect volume is globally mounted markDeviceMountedErr := actualStateOfWorld.MarkDeviceAsMounted( diff --git a/vendor/k8s.io/kubernetes/plugin/pkg/admission/initialresources/gcm.go b/vendor/k8s.io/kubernetes/plugin/pkg/admission/initialresources/gcm.go index a60d4519a9..ce981e3e8c 100644 --- a/vendor/k8s.io/kubernetes/plugin/pkg/admission/initialresources/gcm.go +++ b/vendor/k8s.io/kubernetes/plugin/pkg/admission/initialresources/gcm.go @@ -23,10 +23,10 @@ import ( "k8s.io/kubernetes/pkg/api" + gce "cloud.google.com/go/compute/metadata" "golang.org/x/oauth2" "golang.org/x/oauth2/google" gcm "google.golang.org/api/cloudmonitoring/v2beta2" - gce "google.golang.org/cloud/compute/metadata" ) const (