this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

cmd/cue/cmd: hook up protobuf encodings types

Closes #606

Change-Id: I712ed6f9fc37d53b633a44ed87e4c71c1e018b0f
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/9372
Reviewed-by: CUE cueckoo <cueckoo@gmail.com>
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>

+275 -42
+20 -3
cmd/cue/cmd/common.go
··· 296 296 if schema := i.b.encConfig.Schema; schema.Exists() { 297 297 i.e = schema.Err() 298 298 if i.e == nil { 299 - i.v = i.v.Unify(schema) 299 + i.v = i.v.Unify(schema) // TODO(required fields): don't merge in schema 300 300 i.e = i.v.Err() 301 301 } 302 302 i.f = nil ··· 409 409 for _, f := range b.OrphanedFiles { 410 410 switch f.Encoding { 411 411 case build.Protobuf, build.YAML, build.JSON, build.JSONL, build.Text: 412 + if f.Interpretation == build.ProtobufJSON { 413 + // Need a schema. 414 + values = append(values, &decoderInfo{f, nil}) 415 + continue 416 + } 417 + case build.TextProto: 418 + if p.importing { 419 + return schemas, values, errors.Newf(token.NoPos, 420 + "cannot import textproto files") 421 + } 422 + // Needs to be decoded after any schema. 423 + values = append(values, &decoderInfo{f, nil}) 424 + continue 412 425 default: 413 426 return schemas, values, errors.Newf(token.NoPos, 414 427 "unsupported encoding %q", f.Encoding) ··· 569 582 } 570 583 571 584 switch { 585 + default: 586 + fallthrough 587 + 588 + case p.schema != nil: 589 + p.orphaned = values 590 + 572 591 case p.mergeData, p.usePlacement(), p.importing: 573 592 if err = p.placeOrphans(b, values); err != nil { 574 593 return nil, err 575 594 } 576 595 577 - default: 578 - p.orphaned = values 579 596 } 580 597 581 598 if len(b.Files) > 0 {
+4 -3
cmd/cue/cmd/help.go
··· 185 185 jsonl .jsonl/.ldjson Line-separated JSON values. 186 186 jsonschema JSON Schema. 187 187 openapi OpenAPI schema. 188 + pb Use Protobuf mappings (e.g. json+pb) 189 + textproto .textproto Text-based protocol buffers. 188 190 proto .proto Protocol Buffer definitions. 189 - go .go Go source files. 190 - text .txt Raw text file; the evaluated 191 + go .go Go source files. 192 + text .txt Raw text file; the evaluated 191 193 value must be of type string. 192 194 193 195 OpenAPI, JSON Schema and Protocol Buffer definitions are ··· 495 497 // - id=<url> 496 498 497 499 // TODO: filetypes: 498 - // - textpb 499 500 // - binpb 500 501 501 502 // TODO: cue.mod help topic
+18
cmd/cue/cmd/orphans.go
··· 27 27 "cuelang.org/go/cue/errors" 28 28 "cuelang.org/go/cue/parser" 29 29 "cuelang.org/go/cue/token" 30 + "cuelang.org/go/encoding/protobuf/jsonpb" 30 31 "cuelang.org/go/internal" 31 32 "cuelang.org/go/internal/astinternal" 32 33 "cuelang.org/go/internal/encoding" ··· 172 173 expr := internal.ToExpr(file) 173 174 p, _, _ := internal.PackageInfo(file) 174 175 176 + var path cue.Path 175 177 var labels []ast.Label 176 178 177 179 switch { ··· 226 228 } 227 229 a = append(a, cue.Label(label)) 228 230 labels = append(labels, label) 231 + } 232 + 233 + path = cue.MakePath(a...) 234 + } 235 + 236 + switch d.Interpretation() { 237 + case build.ProtobufJSON: 238 + v := b.instance.Value().LookupPath(path) 239 + if b.useList { 240 + v, _ = v.Elem() 241 + } 242 + if !v.Exists() { 243 + break 244 + } 245 + if err := jsonpb.NewDecoder(v).RewriteFile(file); err != nil { 246 + return nil, err 229 247 } 230 248 } 231 249
+81
cmd/cue/cmd/testdata/script/cmd_jsonpb.txt
··· 1 + cue eval schema.cue json+pb: data.json 2 + cmp stdout out/data1 3 + 4 + cue eval schemaflag.cue -d '#X' json+pb: data.json 5 + cmp stdout out/data1 6 + 7 + ! cue eval schema.cue json+pb: data-err.json 8 + cmp stderr out/data-err 9 + 10 + cue eval .:nested yaml+pb: stream.yaml -l kind 11 + cmp stdout out/stream 12 + 13 + -- schema.cue -- 14 + a: int @protobuf(1,int64) // to string 15 + b: int @protobuf(2,int32) // also allow string 16 + c: int // also allow 17 + d: float 18 + s: string 19 + t: bytes 20 + 21 + -- nested.cue -- 22 + package nested 23 + 24 + A: { 25 + a: int @protobuf(1,int64) // to string 26 + b: bytes 27 + } 28 + 29 + B: { 30 + a: int @protobuf(1,int64) // to string 31 + s: string 32 + } 33 + 34 + -- schemaflag.cue -- 35 + #X: { 36 + a: int @protobuf(1,int64) // to string 37 + b: int @protobuf(2,int32) // also allow string 38 + c: int // also allow 39 + d: float 40 + s: string 41 + t: bytes 42 + } 43 + 44 + -- data.json -- 45 + {"a": "10", "b": "20", "c": 30, "d": "1.2", 46 + "s":"SGVsbG8sIOS4lueVjA==", 47 + "t": "SGVsbG8sIOS4lueVjA=="} 48 + 49 + -- data-err.json -- 50 + {"a": "10", "b": "20", "c": "30", "t": "SGVsbG8sIOS4lue???VjA==" } 51 + 52 + -- stream.yaml -- 53 + kind: "A" 54 + a: "10" 55 + b: "SGVsbG8sIOS4lueVjA==" 56 + --- 57 + kind: "B" 58 + a: "10" 59 + s: "SGVsbG8sIOS4lueVjA==" 60 + 61 + -- out/data1 -- 62 + a: 10 63 + b: 20 64 + c: 30 65 + d: 1.2 66 + s: "SGVsbG8sIOS4lueVjA==" 67 + t: 'Hello, 世界' 68 + -- out/stream -- 69 + A: { 70 + kind: "A" 71 + a: 10 72 + b: 'Hello, 世界' 73 + } 74 + B: { 75 + kind: "B" 76 + a: 10 77 + s: "SGVsbG8sIOS4lueVjA==" 78 + } 79 + -- out/data-err -- 80 + t: failed to decode base64: illegal base64 data at input byte 15: 81 + ./data-err.json:1:40
+37
cmd/cue/cmd/testdata/script/cmd_textproto.txt
··· 1 + cue eval topschema.cue foo.textproto 2 + cmp stdout out/topfoo.textproto 3 + 4 + cue eval -d '#X' schema.cue foo.textproto 5 + cmp stdout out/foo.textproto 6 + 7 + ! cue eval -d '#X' schema.cue foo.textproto -l c 8 + cmp stderr out/stderr3 9 + 10 + -- topschema.cue -- 11 + a: int 12 + b: [...int] 13 + c: string 14 + -- schema.cue -- 15 + #X: { 16 + a: int 17 + b: [...int] 18 + c: string 19 + } 20 + -- foo.textproto -- 21 + a: 4 22 + b: 1 23 + b: 2 24 + b: 3 25 + b: 4 26 + b: 5 27 + c: "foo" 28 + -- out/topfoo.textproto -- 29 + a: 4 30 + b: [1, 2, 3, 4, 5] 31 + c: "foo" 32 + -- out/foo.textproto -- 33 + a: 4 34 + b: [1, 2, 3, 4, 5] 35 + c: "foo" 36 + -- out/stderr3 -- 37 + cannot combine --schema flag with flag "path", "list", or "files"
+12 -11
cue/build/file.go
··· 30 30 type Encoding string 31 31 32 32 const ( 33 - CUE Encoding = "cue" 34 - JSON Encoding = "json" 35 - YAML Encoding = "yaml" 36 - JSONL Encoding = "jsonl" 37 - Text Encoding = "text" 38 - Protobuf Encoding = "proto" 33 + CUE Encoding = "cue" 34 + JSON Encoding = "json" 35 + YAML Encoding = "yaml" 36 + JSONL Encoding = "jsonl" 37 + Text Encoding = "text" 38 + Protobuf Encoding = "proto" 39 + TextProto Encoding = "textproto" 40 + BinaryProto Encoding = "pb" 39 41 40 42 // TODO: 41 43 // TOML 42 - // TextProto 43 - // BinProto 44 44 45 45 Code Encoding = "code" // Programming languages 46 46 ) ··· 62 62 // the info.title and info.version fields. 63 63 // 64 64 // In all other cases, the underlying data is interpreted as is. 65 - Auto Interpretation = "auto" 66 - JSONSchema Interpretation = "jsonschema" 67 - OpenAPI Interpretation = "openapi" 65 + Auto Interpretation = "auto" 66 + JSONSchema Interpretation = "jsonschema" 67 + OpenAPI Interpretation = "openapi" 68 + ProtobufJSON Interpretation = "pb" 68 69 ) 69 70 70 71 // A Form specifies the form in which a program should be represented.
+22
internal/encoding/encoder.go
··· 30 30 "cuelang.org/go/cue/format" 31 31 "cuelang.org/go/cue/token" 32 32 "cuelang.org/go/encoding/openapi" 33 + "cuelang.org/go/encoding/protobuf/jsonpb" 34 + "cuelang.org/go/encoding/protobuf/textproto" 33 35 "cuelang.org/go/internal" 34 36 "cuelang.org/go/internal/filetypes" 35 37 "cuelang.org/go/pkg/encoding/yaml" ··· 87 89 } 88 90 return openapi.Generate(i, cfg) 89 91 } 92 + case build.ProtobufJSON: 93 + e.interpret = func(v cue.Value) (*ast.File, error) { 94 + f := valueToFile(v) 95 + return f, jsonpb.NewEncoder(v).RewriteFile(f) 96 + } 97 + 90 98 // case build.JSONSchema: 91 99 // // TODO: get encoding options 92 100 // cfg := openapi.Config{} ··· 179 187 return err 180 188 } 181 189 _, err = fmt.Fprint(w, str) 190 + return err 191 + } 192 + 193 + case build.TextProto: 194 + // TODO: verify that the schema is given. Otherwise err out. 195 + e.concrete = true 196 + e.encValue = func(v cue.Value) error { 197 + v = v.Unify(cfg.Schema) 198 + b, err := textproto.NewEncoder().Encode(v) 199 + if err != nil { 200 + return err 201 + } 202 + 203 + _, err = w.Write(b) 182 204 return err 183 205 } 184 206
+33 -1
internal/encoding/encoding.go
··· 37 37 "cuelang.org/go/encoding/jsonschema" 38 38 "cuelang.org/go/encoding/openapi" 39 39 "cuelang.org/go/encoding/protobuf" 40 + "cuelang.org/go/encoding/protobuf/jsonpb" 41 + "cuelang.org/go/encoding/protobuf/textproto" 40 42 "cuelang.org/go/internal" 41 43 "cuelang.org/go/internal/filetypes" 42 44 "cuelang.org/go/internal/third_party/yaml" ··· 48 50 cfg *Config 49 51 closer io.Closer 50 52 next func() (ast.Expr, error) 53 + rewriteFunc rewriteFunc 51 54 interpretFunc interpretFunc 52 55 interpretation build.Interpretation 53 56 expr ast.Expr ··· 59 62 } 60 63 61 64 type interpretFunc func(*cue.Instance) (file *ast.File, id string, err error) 65 + type rewriteFunc func(*ast.File) (file *ast.File, err error) 62 66 63 67 // ID returns a canonical identifier for the decoded object or "" if no such 64 68 // identifier could be found. ··· 89 93 } 90 94 91 95 func (i *Decoder) doInterpret() { 92 - // Interpretations 96 + if i.rewriteFunc != nil { 97 + i.file = i.File() 98 + var err error 99 + i.file, err = i.rewriteFunc(i.file) 100 + if err != nil { 101 + i.err = err 102 + return 103 + } 104 + } 93 105 if i.interpretFunc != nil { 94 106 var r cue.Runtime 95 107 i.file = i.File() ··· 208 220 case build.JSONSchema: 209 221 i.interpretation = build.JSONSchema 210 222 i.interpretFunc = jsonSchemaFunc(cfg, f) 223 + case build.ProtobufJSON: 224 + i.interpretation = build.ProtobufJSON 225 + i.rewriteFunc = protobufJSONFunc(cfg, f) 211 226 default: 212 227 i.err = fmt.Errorf("unsupported interpretation %q", f.Interpretation) 213 228 } ··· 242 257 PkgName: cfg.PkgName, 243 258 } 244 259 i.file, i.err = protobuf.Extract(path, r, paths) 260 + case build.TextProto: 261 + b, err := ioutil.ReadAll(r) 262 + i.err = err 263 + if err == nil { 264 + d := textproto.NewDecoder() 265 + i.expr, i.err = d.Parse(cfg.Schema, path, b) 266 + } 245 267 default: 246 268 i.err = fmt.Errorf("unsupported encoding %q", f.Encoding) 247 269 } ··· 283 305 // TODO: simplify currently erases file line info. Reintroduce after fix. 284 306 // file, err = simplify(file, err) 285 307 return file, "", err 308 + } 309 + } 310 + 311 + func protobufJSONFunc(cfg *Config, file *build.File) rewriteFunc { 312 + return func(f *ast.File) (*ast.File, error) { 313 + if !cfg.Schema.Exists() { 314 + return f, errors.Newf(token.NoPos, 315 + "no schema specified for protobuf interpretation.") 316 + } 317 + return f, jsonpb.NewDecoder(cfg.Schema).RewriteFile(f) 286 318 } 287 319 } 288 320
+46 -22
internal/filetypes/types.cue
··· 139 139 140 140 // Extension maps file extensions to default file properties. 141 141 extensions: { 142 - "": _ 143 - ".cue": tags.cue 144 - ".json": tags.json 145 - ".jsonl": tags.jsonl 146 - ".ldjson": tags.jsonl 147 - ".ndjson": tags.jsonl 148 - ".yaml": tags.yaml 149 - ".yml": tags.yaml 150 - ".txt": tags.text 151 - ".go": tags.go 152 - ".proto": tags.proto 142 + "": _ 143 + ".cue": tags.cue 144 + ".json": tags.json 145 + ".jsonl": tags.jsonl 146 + ".ldjson": tags.jsonl 147 + ".ndjson": tags.jsonl 148 + ".yaml": tags.yaml 149 + ".yml": tags.yaml 150 + ".txt": tags.text 151 + ".go": tags.go 152 + ".proto": tags.proto 153 + ".textproto": tags.textproto 154 + ".textpb": tags.textproto // perhaps also pbtxt 155 + 153 156 // TODO: jsonseq, 154 - // ".textproto": tags.textpb 155 - // ".pb": tags.binpb 157 + // ".pb": tags.binpb // binarypb 156 158 } 157 159 158 160 // A Encoding indicates a file format for representing a program. ··· 179 181 180 182 cue: encoding: "cue" 181 183 182 - json: encoding: "json" 183 - jsonl: encoding: "jsonl" 184 - yaml: encoding: "yaml" 185 - proto: encoding: "proto" 186 - // "textpb": encodings.textproto 184 + json: encoding: "json" 185 + jsonl: encoding: "jsonl" 186 + yaml: encoding: "yaml" 187 + proto: encoding: "proto" 188 + textproto: encoding: "textproto" 187 189 // "binpb": encodings.binproto 190 + 191 + // pb is used either to indicate binary encoding, or to indicate 192 + pb: *{ 193 + encoding: "binarypb" 194 + interpretation: "" 195 + } | { 196 + encoding: !="binarypb" 197 + interpretation: "pb" 198 + } 199 + 188 200 text: { 189 201 encoding: "text" 190 202 form: "data" ··· 308 320 encoding: "proto" 309 321 } 310 322 311 - // encodings: textproto: { 312 - // forms.DataEncoding 313 - // encoding: "textproto" 314 - // } 323 + encodings: textproto: { 324 + forms.data 325 + encoding: "textproto" 326 + stream: false 327 + } 328 + 329 + encodings: binarypb: { 330 + forms.data 331 + encoding: "binarypb" 332 + stream: false 333 + } 315 334 316 335 // encodings: binproto: { 317 336 // forms.DataEncoding ··· 340 359 forms.schema 341 360 encoding: *"json" | _ 342 361 } 362 + 363 + interpretations: pb: { 364 + forms.data 365 + stream: true 366 + }
+2 -2
internal/filetypes/types.go
··· 41 41 return v 42 42 } 43 43 44 - // Data size: 1624 bytes. 45 - var cuegenInstanceData = []byte("\x01\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xacW\xddo\xd4H\x12\xb7CN:\xb7\xb8{\xe2\xf5\xa4\xc2H\x88\x8b\xc0\x11\x0f\b4R\x84\x80\xc0)/\xc7\xe9\xc4=!\x14\xf5\xd8\xe5\x99>\xecn\xaf\xbb\r\x89\xc8<\xec.\xcb\xee_\u036c\xaa\xbb\xfd9\xe6#\xbb\xc9K\xc6\xf5\xd5U\xd5\xfd\xab\x8f\xbfm\u007f\xdd\v\xf7\xb6\xbf\x05\xe1\xf6\xa7 x\xb8\xfd\xf1Z\x18^\x17R\x1b.S<\xe6\x86\x13=\xbc\x16\xee\xffW)\x13\xee\x05\xe1\xfe\u007f\xb8Y\x87\u05c3\xf0//D\x81:\xdc~\n\x82\xe0\x1f\xdb_\xf6\xc2\xf0\xef\xaf\u07e4\r&\xb9(\xbc\xe6\xa7 \xdc~\f\x82;\u06df\xaf\x85\xe1_{\xfa\xc7 \xdc\v\xf7\xff\xcdK$C\xfb\x96\u0202 \xf8|\xe3\x1ey\x12\x86{a\x18\x99\xf3\nu\x926\x18~\xbeq\xa3\xe2\xe9[\xbeBX6\xa2\xc8\x18;<\x84'@\xe7C\xaa\xea\x1au\xa5d\xa6\xc1(\xe0\xf0/\xe5\x84\x12b'\xec\x16\xfd[\xc0\a\x16\xd1\U000525f8\x00\xff\xa7M-\xe4\x8aE(S\x95\t\xb9\xea\x18\xb7\x9e{\n\x8b\x844XW5\x1an\x84\x92\x8f\x17p\xebdDaQ\xae\xea\xf2q\xa7J\xda/T]\xb2\xc8\xf0\x95~l\x0f\x8e^\xbb\x93\xde,\xba#7lc\x838\u019c7\x85\x01\xa1\xc1\xac\x11\xc8Eh4f\x90\xab\x1a\xb4\u0244\x04.3\xfa\xa5\x1a\x93\xc0\xab5\x82Fc\x84\\i\u0230B\x99\x91\x15%{\xedRe\x14\xb57\xbc\x00\x1b?\xdc\x1e'\xe0 \xbe\x17\xc3E\xeb\xcdf\x90\xcf\x13\x99+\xc80\x17\x125\xac\xd5{\xe0\u03ac\xd0`\u04c4\x99u\xa8K\vf>\u0164h\xa3\xb5_,\u02b8\xe1}V\x0eL\xdd \\@\xce\v\x8d,\xaa1\xc7\x1ae\x8az\xb1\xcbL\xcf\xd3\xc21f4\xadk\x822O\x12K\xa5\n\x16\xa9\x8a\xbey\xe1T\x1c-UR\x9b\x9a\viz\xb9\xb7\x88\x95\u03cb^x\x9a\x90\xa9*\xab\x02\x8d}\x16\x9eVV\xaa6\xad\a\x8e\xa6M\x8d\xbcl\x9dr\xb4L\xa5\xba\x0f\xd1\u04781\xb5X6\xc6\x05`i.\xbdt/\x9a.\x8f.\xce\xf9`/9\x13\xb9\u0345\x01Ua\xcd]$N:a\x87\x87\xa4\xfaj\x8d\x1a\xc1`Y\x15\u0720\x06^\xa3\xbd\x00I\xb7a\x14,\x11\x1a)r\x81t/\xc0\x8d}\f\xb5R\x06T\x0ef-4\x19I\x95\xcc\u016aq'$\xcc\x1e`\xef\ub512P5\xc6=\xd5\xfe\xe1\xd0\xd7\x00\x1a\aq\xda =\x9aS\xa2'I\u00a2h\u00e2\xa8@\x03gp\xe4\u0107\x19\x99\\\\4J\u0354I\x96\x06\xcf\xe8\x8c\xf5Gk\xefJ\xda\xd0\xc3%\xb4\xe9D\xa7k,\xb9w\x86t\xf1\u0320\xd4\xeeUX\xe98\xf9\xbfV2\xf6_\x13\x18S4\xbc1\xaa\vg\xe3T\xceyY\\V\xe5r\x1a\x1b\x82~\x84g\xf4\xc0\xbe\x99p\x1b\xc1\x172~z\u007f.\xe7>\xab\a\xb39\x9f2\xa79?\xbd\xff\x8d\xac\x13\xa4\xfb\x9coX\xa4\x9a\u02b4\x0f\xc7y\xf5\xe8\xc1\u057b\xf5\xe8\xc1e\xfd\xc2wT\f\xfe\xf8s>}\xfa\xe4\xea\xc3x\xfa\xe4\x1ba\u4090?\x8c#\xc3\xfcO\x85\xf1\xe0\xe1\xb3GW\x0eMk\xf5\x92\xf8l\xdb\xdd\xf3\x16\xa6P\xf2J\xbb\xce\xd2C\x97j\x99\xaf\x8d\x8eU\xd5T\x13\x8d\xa0R8Ax\x1cw\x95\xf7\x94E1\x8d\t\x8eBm\x97\xbeX_\x02<\x91\xbeZ*\x81\xb6\xa7\x16D.2/>&\xcby\xb2/\x15\xde\b}\xb1\xae\x1aL\xa9\xe6\xcc\f\xa8\x06\xcf\fQW\u0287`\xa9+E\xb4\xaaVFu\xae\xd9/\x16Q\axy\xfcr\x01t\xb8\xc6\x1f\xeeZRl\r\xb5\n\x9d\xe5j\xe9\xb9\u0572\u03d0\xe5.\x85\xac\x96]\xafo'\x1c\x102\x13\xa9k+.\xe9t\x83\xdc\xd8\xdeTcU\xa3FI\xf3\x06p\xba\x8eU\xcd\u02c4u\xf3\xd1\x02n\x1e\u01713)a<\x19A\x86\x06\xebr0H\xa4X\x1b.dk\a\xf4Z5EF\xedk4N\x1c\x1e\xc2\vUC;\x83\xde\x05\x8b\uf49fO$\x81S+\xd5i-\x96\xce?\xf7\xea\xee\xc2\xfb\xb5H\xd7 \x8c\xc6\"\xb7\xad\x8fKRM\x95|\x87\xb5q=\x93\u00f3\xff=\xf7\x1a\t\x9b\fu\u075cfG\xb9\xe1l\xe7\u9e5d)G3_;;M&\xad8W\u02bdC7):\xad\xd8\x1d\x1c\xfb\xeb\xa0\xfbq\x88HUY\xd2|U\b\x89\x8el\xd4.\x16\x88aQ\xe0\xcc8\x00:\xeb\x9de\x82\u076a\xe6\xd5z\u0135\x14\xc7\xcc\xf8j\xc4\xca\xf8\xaae\x18>\xe1\x18o\xd0b\xfc\x03\x1bV [\x80,\x93\xa2\xdc\xe1\xfa\xd0=\xbb\x98\xe5\x17N\x80\xe0\xb2\u00f78\xb3l\xfb\xd4w\xf8\x0e\x00V\x80\x9e\xbd\x83@\xbc\x80\xae:\xf50q\x12\x16\x06\x04\x8d^\x82HN\x80dw\x8e b\xdce\xc3^_\x9f\x91\u054eK\xee/\xa6Y\x99\xb4\xa6CAL\xc4\xee\x02\xa3\xa8\xe0\xf6\x90\x15\x05\xe1\xcb>\xa9^\x89\xd5v\xdb\xf0vi\x1aq\xfc\x1du;\xa8\xcc\x1c8\x1aB\xfc%\x0e\x1f\u074e\xa1^\xe0{\u0329\n%\xaf\xc4\x17ly\xeew\x18r0\xb2\xbd\xa7[^|\x0f\xa2:\u018b\xc21\x1381\x90)\xd4 \x95\x01!\u04e2\xc9\xd0\xedN\xaa.\xe1\xe48aV\xce:d77\xdaQ\x8f\xba\xf5\xad\x83\xb9\xf5\x9ez\xd0\xe9\x1c\b\xbb\xad\xa7E#\\@l\u06fb\xfd\u0542p\xb2TL'\x88\xf1j2m\xcb\xe3Eh\xca\x1d\xafDwF\xec\u007f\xc2\xed)\x85E\x93\x85ijo\xbc:M\xb9\xe3\x85i\xc2\xddP9\x94\xed@6\x9c\x0fv\xf2\xe5s\xb4s\xde|T\xbd\xfd\x9d:\xd7_\x80\xcb5e\x9d\xea\x9b\xfbo\xb1;YP\xc9\u775c\xcf\xe7\xfa\xab\xdeL\xf28\x9f\xbf\xf9\xbc\xf5\xf1\x8cJ\xb3Nl\f\x83\xd8n\x1e\xf5O\xa8]\x96\x87\xca\xc3\xf2M\xd3\xf1j\x9a\x97\x9bG\xbe\u068f\xbdm\xdd\x1am\xe7]\\\u00ed|6\x80\u067ct~m\xd8x`\xecZI\v\x82>\x82\xbe\x91\xf4\xf3\xfd\x04-\x0e$p\xd1\xde\xdbp\xbam\xfd\x18\x0e\xb5\xbd\xf1\xbe\u02cc\x93;r\x83`\xe8,\x8f\x1b\u05ec?\x9d`\xdf=f\xe5z\x1f\x8c*\xbff\xb0\x17\x1c\xf4\xbc\tp\xe6[`\xdf9&\xe2;\xa67l\\n/Q\xf2\xec\xc4\xedz\xc9\xf8\x94is\xf8\xa2\xcb_m\x03\u07eb\xb5aA\xf0{\x00\x00\x00\xff\xff\xf8\xf7_\xa3\xbd\x14\x00\x00") 44 + // Data size: 1709 bytes. 45 + var cuegenInstanceData = []byte("\x01\x1f\x8b\b\x00\x00\x00\x00\x00\x00\xff\xacX_\x8f\u0736\x11\x97\xce.P\x11i\xdf\xf2X`,\x03Azpu\u0203\x11c\x81\x83\xe1\xc4v\u15e6(\u04a7 8p\xa5\xd1.\x1b\x89TI*\xb9Cn\x1f\u06a6i\xbfQ\xbfF?Q\xae\x18\x92\x12%\xad\xee\xeck|/\xb7;?\xcep\xe6G\xce\x1f\xee\xafn\xfeu\x92\x9e\xdc\xfc;Io\xfe\x9e$\x9f\xde\xfc\xedA\x9a~ \xa4\xb1\\\x96\xf8\x92[N\xf2\xf4A\xfa\xf0OJ\xd9\xf4$I\x1f\xfe\x91\xdb}\xfaA\x92\xfe\xe2\xb5h\u04247?&I\xf2\x9b\x9b\u007f\x9e\xa4\u9bff\xfa\xba\ucc68E\x134\u007fL\u049b\x1f\x92\xe4\xe3\x9b\u007f<H\xd3_F\xf9\x0fIz\x92>\xfc\x03o\x91\f=tB\x96$\xc9O\x1f\xfe\x97<I\u04d34\xcd\xecU\x87\xa6({L\u007f\xfa\xf0?\x1d/\xbf\xe1;\x84m/\x9a\x8a\xb1\xb33x\x01\xb4?\x94Jk4\x9d\x92\x95\x01\xab\x80\xc3\xef\x95_T\x10\\\xb0\xc7\xf4o\x03\u07f3\x8c\xb6\x97\xbc\xc5\r\x84?c\xb5\x90;\x96\xa1,U%\xe4n\x04\x1e\xbf\n\x12\x96\tiQw\x1a-\xb7B\xc9\xe7\x1bx\xfcf&aY\xadt\xfb|T%\xed\xd7J\xb7,\xb3|g\x9e\xbb\x8d\xb3\xaf\xfcN_o\xc6-\x0f\xec\xe0\x82x\x895\xef\x1b\v\u0080\xdd#\x90\x8b\xd0\x1b\xac\xa0V\x1a\x8c\xad\x84\x04.+\xfa\xa4z[\xc0\x97{\x04\x83\xd6\n\xb93Pa\x87\xb2\"+JF\xedVU\x14u0\xbc\x01\x17?|4'\xe04\xff]\x0e\u05c37\x87\t\x9fod\xad\xa0\xc2ZH4\xb0W\xdf\x01\xf7f\x85\x01G\x13V\u03a1\x91\x16\xac\x02\u0164\xe8\xa2u\xdfXVq\xcb#+\xa7V\xf7\b\xd7P\xf3\xc6 \xcb4\u05a8Q\x96h6\xc7`yU6\x1eX\xd1t\xae\tb\x9eVl\x95jX\xa6:\xfa\xce\x1b\xaf\xe2e\xa5\x92\xc6j.\xa4\x8d\xeb\xbeA\xec\x02/f\x13dB\x96\xaa\xed\x1a\xb4\xeeZ\x04Y\xdb)m\a\x0f\xbc\xccX\x8d\xbc\x1d\x9c\xf2\xb2J\x95&\x86\xe8e\xdcZ-\xb6\xbd\xf5\x018\x99\xa7\x97\xce\xc5\xd0\xe1\xd1\xc1y\x1f\xdc!W\xa2v\\XP\x1dj\xee#\xf1\xab\vvvF\xaa_\xee\xd1 Xl\xbb\x86[4\xc05\xba\x03\x90t\x1aV\xc1\x16\xa1\x97\xa2\x16H\xe7\x02\u073a\u02e0\x95\xb2\xa0j\xb0{a\xc8H\xa9d-v\xbd\u07e1`n\x03w^\x17DB\xd7[\u007fU\xe3\u0161o\x93\xd48\xcd\xcb\x1e\xe9\xd2\\\x90\xbc(\n\x96e\a\x96e\rZ\xb8\x84s\xbf|\xca\xc8\xe2\xe0\xb2\x195K\x90,M\xae\xd1%\x8b[\x9b\xe0J\xd9\xd3\u0165l3\x85)\xf7\xd8\xf2\xe0\f\xe9\xe2\xa5Ei\xfc\xadp\xab\xf3\xe2/F\xc9<|[\xa41E\xc3{\xab\xc6p\x0e^\u52b7\xcd}U\xee\xa7q\xa0\xd4\xcf\xf0\x92.\xd8[\tw\x11\xdc\xc2\xf8\xc5'k\x9c\aVOW9_\x82K\xce/>y\v\xeb\x94\u0491\xf3\x03\xcbT\xdf\xd9\xe1\xe2x\xaf\x9e=}\xffn={z_\xbf\xf0[*\x06\xff\xffu\xbe\xf8\xec\xc5\xfb\x0f\xe3\xb3\x17o\t\xa3\x16\x94\xf9\xd38*\xac\u007fV\x18O?\xfd\xfc\xd9{OMg\xf5\x9e\xf99\xb4\xbbWC\x9aB\xcb;\xe3;KL]\xaae\xa16z\xa8\xd3T\x13\xad\xa0R\xb8\xc8\xf0<\x9f\xb6\xdc\v\x96\xe54)\x8cBj\xbe$`\xb1\x10D9\t\x06\xa0\t\xc8\b4\x844UT\x9a#\xf2V$\x14\x8fh\x8d\x04l,\x11+\x80\xbd\xb4s\xc0\xe2\xa5%`\xa7bt\x0e\xd8)\x12wZY5\xf5\xd7\t\x9c%\xbc\xb4\x03:Z\x9a\xa3\u06c9\xcf\x11e\x19\xf5\x97/^~\xb1\x01\n\xc4\xe0_\x9f8Q^\f\n\xa3\xd2V\xc8n\vgg\xb0\x15\x92\xeb\xabn;\xce\r\u00f4\x04BV\xa2\xf4-\xca\x1f \xdd\x06n]\x9f\xd3\xd8i4(iv\x01NG\xbb\u04fc-\xd88km\xe0\xd1y\x9e{\x93\x12\xe6S\x16ThQ\xb7\x93\xa1\xa4Dm\xb9\x90\x83\x1d0{\xd57\x15\xb5\xc2\xd9hrv\x06\xaf\x95\x86a\x9e}\x02\xaeV\xb4\xfcj\xb1\x128\xb5eSj\xb1\xf5\xfe\xf9\x1b\xfc\x04\xbe\u06cbr\x0f\xc2\x1alj\xd7F\xb9$\xd5R\xc9oQ[\xdf\u007f9|\xfe\xe7WA\xa3`\x8b\x01q\x9c\xf9\xdcX8\xbd\xb4A^\xbb\xf9t6?\x0es\xd8bj\xcbk\xa5\xfcm\xf6S\xa7\xd7\xca\xfd\xc6y8\x0e:+\x9f]\xa5j[\x9a\xd5\x1a!\u044b\xad:\xce+\x02\\Fy3>\x99\xbd\xf5\xd12\xa5\xf0N\xf3n?C\x9d\u0103\x15\xdf\u0360\x8a\xef\x06\xc0\xf2\x05b\x83AW/\xbeg\xd3j\u6299\x03)\xca#4\x84\x1e\xe0f\x15o\xfc\x02J\xb1#\xdce\xa8\x83\xdd\xe5?\xc2}\x06\xb9\x05c\x86\x1c-\x8a\xa9F\v]\xb2t[\x1a\x8f\xdd\u060e\xc2\xeeQ\x13\xd1C.\x84t\x81\xc1\xc4\x13P3\x9ce\xddv\x03\xa7\xf3]\xfc_>dZ\u038e\x87\x8b\x9c\xf6\x87kXS|t~\xb7\xaa\x13\x87(W\x03\xcc\xc7\x03s~\xc4C\xdb\x1d\x11\x12\\\xa5\xa7\xc1mnf\xe3\x1d\u02f2\x86\xbbMvD_\xe8r\xa4\xfa^\xac\x0e\x8f\xab`\x97\x86/\x8f\x1f\xa9\xbb\xb9le\xc3\xd9\xcc\x15\xee\xd94/\x8e\f\xc5\x05\xefbNu(y'n\xb1\x15\xd0w0\xe43\u0775\xda\xf1\xad\x16Z.\x95Z\xde4\x1e,\xe0\x8d\x85J\xa1\x01\xa9,\bY6}\x85\xfe\xa9\xa8t\vo^\x16\u032ds\x0e\xb9\x87*=\xc9\xcf\xc7\xd7\xeaX\x89\x9c\xf7\xd4r/\xd6\xea\x04\x8c^\x06*\xe0\x1ar7\u0378OC\x9dX\xbc\xa1\x96\x03\xd3\xfc%\xb6\x9cB\xe6\xef\xbe%:\u007f\x01~<\x83\u007f\v\x1f-%,[\xbc\x0f\x97\xf6\xe6/\xc5%:\u007f\x1f.\xd0\x03Ul9\u031f\xd3q\u822f\xc0\xd1\xd1~\xebQE\xfbG\xa58\x1e\x80\xe7\x9aX\xa7\x12\xec\xff\xbb\xdc]\xbc\xc7\xc9\xe7#\xce\u05f9\xbe\u04db\x05\x8f\xeb\xfc\xad\xf3\x16\xe3\x99u\x0fS\xb8\x18&\xb1=:\x8fWh\xf8m`\xaa<\xed0\xf4\x18\xd8-yyt\x1e\x1a\xd2\xdc\xdb\xc1\xad\u064f\x11c\\\xd3\x1f!V\x03X\xe5e\xf4\xeb\xc0\xe6\xf3\xf1\xd8\xed\x86$\x88\x11\xc4^\x17\x9f3\x8bl\xf1I\x02\xd7\u00f9M\x87\xf9\xc1\x8f\xe9\f\x1f\x8d\xc7F8'w\xe6\x06\xa5\xa1\xb7<\ufb6b\xfe\x8c\vc\xf7X]\x17}\xb0\xaa\xbd\xcb`\\8\u9e0b\xc4y\xa7.=\xb3~K\u02de\xd0\x1a\xf7\x1d\x9a\xe5\xddf\xa6-u\xcdJ\xecc\v\xe7\x8f\x02=\xb0y\xf1\xbfG\x01vo\x1d\xdf\xd9\xe6\xbb,[\u056d\x04\xde\u0654\xdeYk\x95\xac\xe5\x159\xb0$\xf9_\x00\x00\x00\xff\xff\x13*\xa9\xaf`\x16\x00\x00")