├── .gitignore ├── .vscode └── settings.json ├── README.md ├── assets └── cirno.png ├── ciweimao ├── catalog.go ├── common.go ├── content.go ├── detail.go ├── epub.go ├── login.go ├── search.go └── txt.go ├── config ├── read.go └── write.go ├── go.mod ├── go.sum ├── main.go ├── structure ├── chapter.go ├── config.go ├── content.go ├── detail.go ├── division.go ├── key.go ├── login.go └── search.go └── util ├── decode.go ├── err.go ├── file.go ├── http.go └── zip.go /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, built with `go test -c` 9 | *.test 10 | 11 | # Output of the go coverage tool, specifically when used with LiteIDE 12 | *.out 13 | 14 | # Dependency directories (remove the comment below to include it) 15 | # vendor/ 16 | 17 | # General 18 | .DS_Store 19 | .AppleDouble 20 | .LSOverride 21 | 22 | # Icon must end with two \r 23 | Icon 24 | 25 | 26 | # Thumbnails 27 | ._* 28 | 29 | # Files that might appear in the root of a volume 30 | .DocumentRevisions-V100 31 | .fseventsd 32 | .Spotlight-V100 33 | .TemporaryItems 34 | .Trashes 35 | .VolumeIcon.icns 36 | .com.apple.timemachine.donotpresent 37 | 38 | # Directories potentially created on remote AFP share 39 | .AppleDB 40 | .AppleDesktop 41 | Network Trash Folder 42 | Temporary Items 43 | .apdisk 44 | 45 | .vscode/* 46 | !.vscode/settings.json 47 | !.vscode/tasks.json 48 | !.vscode/launch.json 49 | !.vscode/extensions.json 50 | *.code-workspace 51 | 52 | # Local History for Visual Studio Code 53 | .history/ 54 | 55 | bin/* 56 | download/* 57 | config.yaml 58 | cirno 59 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "golang.go", 3 | "go.autocompleteUnimportedPackages": true, 4 | "go.inferGopath": false, 5 | "go.useCodeSnippetsOnFunctionSuggest": true, 6 | "go.lintTool": "golangci-lint" 7 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |

3 | Cirno 4 |
Cirno-go
5 |

6 | 7 |

A tool for downloading books from hbooker in Go.

8 | 9 | ## Features 10 | 11 | - ~~Login your own account~~ 12 | - Search books by book name 13 | - Download books as txt and epub files ([epub3.0](http://idpf.org/epub/30/)) 14 | - Download vip chapters 15 | - Multi-threads support 16 | - Cache images in chapters 17 | 18 | ## ⚠️ Notice 19 | 20 | - Now, a third-party captcha([geetest](https://www.geetest.com/)) has been add to the official server. If you login failed with the right account and password, please capture packets of the app to get the token and account, then, locate to `$HOME/cirno` dir, create a file named `config.yaml`: 21 | ```yaml 22 | app: 23 | account: 24 | login_token: 25 | ``` 26 | 27 | ## Usage 28 | 29 | - ~~`cirno login` to Log in to your account.~~ 30 | - `cirno search xxxx` to search books. 31 | - `cirno download bid` to download books. 32 | - You can add `--type` flag to specify the books type, support `txt` and `epub`, default value is `txt`. 33 | 34 | ```shell 35 | cirno -t epub download 100003327 36 | cirno -t epub search happyend 37 | ``` 38 | 39 | ## Config 40 | 41 | - All files about `Cirno-go` are located in `$HOME/Cirno/` 42 | - Do not delete `config.yaml`, otherwise you need to do `cirno login` again. 43 | - Cache chapter images is an extra feature, you need open it manually, Such as: 44 | 45 | ```yaml 46 | app: 47 | account: 48 | login_token: 49 | user_name: 50 | host_url: # you can use another official api https://app.happybooker.cn if you can't visit the default one. 51 | 52 | extra: 53 | cpic: true #set true to cache images automatically. 54 | ``` 55 | - There is a little extra properties waiting for you to discover. 56 | 57 | 58 | 59 | ## Download 60 | 61 | No pre-build binaries to download, please build the source by yourself. 62 | 63 | - if you want to run it on Android devices, please use `termux`, and run 64 | 65 | `pkg install proot resolv-conf && proot -b $PREFIX/etc/resolv.conf:/etc/resolv.conf` 66 | 67 | 68 | ## Notice 69 | 70 | - This tool is for learning only. Please delete it from your computer within 24 hours after downloading. 71 | 72 | - Please respect the copyright and do not spread the crawled books by yourself. 73 | 74 | -------------------------------------------------------------------------------- /assets/cirno.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zsakvo/Cirno-go/cc54311ea4553547db61c358ecda2405dadf92dc/assets/cirno.png -------------------------------------------------------------------------------- /ciweimao/catalog.go: -------------------------------------------------------------------------------- 1 | package ciweimao 2 | 3 | import ( 4 | "github.com/imroc/req" 5 | jsoniter "github.com/json-iterator/go" 6 | "github.com/zsakvo/Cirno-go/structure" 7 | "github.com/zsakvo/Cirno-go/util" 8 | ) 9 | 10 | func GetCatalog(bid string) []structure.ChapterList { 11 | var chapterList []structure.ChapterList 12 | divisions := getDivision(bid) 13 | for _, division := range divisions { 14 | chapters := getChapters(division.DivisionID) 15 | for _, chapter := range chapters { 16 | if chapter.IsValid == "1" { 17 | chapterList = append(chapterList, chapter) 18 | } 19 | } 20 | } 21 | return chapterList 22 | } 23 | 24 | func getDivision(bid string) []structure.DivisionList { 25 | var err error 26 | var res []byte 27 | paras := req.Param{ 28 | "book_id": bid, 29 | } 30 | res, err = util.Get("/book/get_division_list", paras) 31 | util.PanicErr(err) 32 | var json = jsoniter.ConfigCompatibleWithStandardLibrary 33 | var result structure.DivisionStruct 34 | err = json.Unmarshal(res, &result) 35 | util.PanicErr(err) 36 | return result.Data.DivisionList 37 | } 38 | 39 | func getChapters(did string) []structure.ChapterList { 40 | var err error 41 | var res []byte 42 | paras := req.Param{ 43 | "division_id": did, 44 | } 45 | res, err = util.Get("/chapter/get_updated_chapter_by_division_id", paras) 46 | util.PanicErr(err) 47 | var json = jsoniter.ConfigCompatibleWithStandardLibrary 48 | var result structure.ChapterStruct 49 | err = json.Unmarshal(res, &result) 50 | util.PanicErr(err) 51 | return result.Data.ChapterList 52 | } 53 | -------------------------------------------------------------------------------- /ciweimao/common.go: -------------------------------------------------------------------------------- 1 | package ciweimao 2 | 3 | import ( 4 | "io/ioutil" 5 | "os" 6 | "path/filepath" 7 | 8 | "github.com/zsakvo/Cirno-go/structure" 9 | "github.com/zsakvo/Cirno-go/util" 10 | ) 11 | 12 | type chapterStruct struct { 13 | Text string 14 | Cid string 15 | } 16 | 17 | type contentStruct struct { 18 | CName string 19 | ChapterParas []string 20 | } 21 | 22 | type opfStruct struct { 23 | Name string 24 | Author string 25 | Chapters []structure.ChapterList 26 | } 27 | 28 | type bookTocStruct struct { 29 | Name string 30 | Chapters []structure.ChapterList 31 | } 32 | 33 | func cleanDestBook(dir, name, bType string) { 34 | os.Remove(dir + name + "." + bType) 35 | } 36 | 37 | func splitArray(arr []structure.ChapterList, num int) [][]structure.ChapterList { 38 | var segmens = make([][]structure.ChapterList, 0) 39 | max := len(arr) 40 | if max < num { 41 | segmens = append(segmens, arr) 42 | return segmens 43 | } 44 | quantity := max / num 45 | end := 0 46 | for i := 1; i <= num; i++ { 47 | qu := i * quantity 48 | if i != num { 49 | segmens = append(segmens, arr[i-1+end:qu]) 50 | } else { 51 | segmens = append(segmens, arr[i-1+end:]) 52 | } 53 | end = qu - i 54 | } 55 | return segmens 56 | } 57 | 58 | func isExist(path string) bool { 59 | _, err := os.Stat(path) 60 | if err != nil { 61 | return os.IsExist(err) 62 | } 63 | return true 64 | } 65 | 66 | func writeOut(content, dirPath, fileName string) error { 67 | if !isExist(dirPath) { 68 | err := os.MkdirAll(dirPath, os.ModePerm) 69 | util.PanicErr(err) 70 | } 71 | outPath := filepath.Join(dirPath, fileName) 72 | d := []byte(content) 73 | err := ioutil.WriteFile(outPath, d, 0644) 74 | return err 75 | } 76 | 77 | var mimetype = `application/epub+zip` 78 | 79 | var containerXml = ` 80 | 81 | 82 | 83 | 84 | 85 | ` 86 | 87 | var epubCss = `@charset "UTF-8"; 88 | 89 | /* O'Reilly Media, 2012; version 2.5.1 - New code fonts and syntax highlighting */ 90 | 91 | /* reset */ 92 | 93 | html, 94 | body, 95 | div, 96 | span, 97 | applet, 98 | object, 99 | iframe, 100 | h1, 101 | h2, 102 | h3, 103 | h4, 104 | h5, 105 | h6, 106 | p, 107 | blockquote, 108 | pre, 109 | a, 110 | abbr, 111 | acronym, 112 | address, 113 | big, 114 | cite, 115 | code, 116 | del, 117 | dfn, 118 | em, 119 | font, 120 | img, 121 | ins, 122 | kbd, 123 | q, 124 | s, 125 | samp, 126 | small, 127 | strike, 128 | strong, 129 | sub, 130 | sup, 131 | tt, 132 | var, 133 | b, 134 | u, 135 | i, 136 | center, 137 | dl, 138 | dt, 139 | dd, 140 | ol, 141 | ul, 142 | li, 143 | fieldset, 144 | form, 145 | label, 146 | legend, 147 | table, 148 | caption, 149 | tbody, 150 | tfoot, 151 | thead, 152 | tr, 153 | th, 154 | td { 155 | margin: 0; 156 | padding: 0; 157 | border: 0; 158 | outline: 0; 159 | font-size: 100%; 160 | vertical-align: baseline; 161 | background: transparent; 162 | } 163 | 164 | /* end reset */ 165 | 166 | @page { 167 | margin: 5px !important; 168 | } 169 | 170 | /* p margin */ 171 | 172 | p { 173 | margin: 8px 0 0; 174 | } 175 | 176 | /* inlines; code and monospace in the code section below */ 177 | 178 | span.bolditalic { 179 | font-weight: bold; 180 | font-style: italic; 181 | } 182 | 183 | strong, 184 | span.bold { 185 | font-weight: bold; 186 | font-family: serif; 187 | } 188 | 189 | a.ulink, 190 | a.xref, 191 | a.email { 192 | text-decoration: none; 193 | color: #8e0012; 194 | } 195 | 196 | sup { 197 | /* bug in webkit? */ 198 | font-size: x-small; 199 | vertical-align: super; 200 | } 201 | 202 | sub { 203 | font-size: smaller; 204 | vertical-align: sub; 205 | } 206 | 207 | span.lineannotation { 208 | font-style: italic; 209 | color: red; 210 | font-family: serif, "Free Serif"; 211 | } 212 | 213 | span.underline { 214 | text-decoration: underline; 215 | } 216 | 217 | span.strikethrough { 218 | text-decoration: line-through; 219 | } 220 | 221 | span.smallcaps { 222 | font-variant: small-caps; 223 | } 224 | 225 | span.cursor { 226 | background: #000; 227 | color: #fff; 228 | } /* for Learning GNU Emacs, 3e */ 229 | 230 | /* added for special formatting in Regular Expressions Cookbook, 1e (9780596802783.EBOOK) */ 231 | 232 | .boxedtext, 233 | .keycap { 234 | border-style: solid; 235 | border-width: 1px; 236 | border-color: #000; 237 | padding: 1px; 238 | } 239 | 240 | span.gray50 { 241 | color: #7f7f7f; /* 50 % gray */ 242 | } 243 | 244 | /* added for special formatting in Bioinformatics Programming Using Python, 1e (9781449378677.EBOOK) */ 245 | 246 | .gray-background, 247 | .reverse-video { 248 | background: #2e2e2e; 249 | color: #fff; 250 | } 251 | 252 | /* added for special formatting in Working with Microsoft Visual Studio 2005, 1e (9780735649958.EBOOK) */ 253 | 254 | .light-gray-background { 255 | background: #a0a0a0; 256 | } 257 | 258 | /* preserve whitespace in non-pre elements */ 259 | /* Used for special formatting in Using SQLite (9781449394042.EBOOK), which needs verbatim space preserved in a
element, which cannot contain a pre */ 260 | /* See EBK-2920 */ 261 | 262 | .preserve-whitespace { 263 | white-space: pre-wrap; 264 | } 265 | 266 | /* headings */ 267 | 268 | h1 { 269 | font-size: 1.5em; 270 | font-weight: bold; 271 | font-family: "Free Sans Bold", sans-serif; 272 | margin-top: 20px !important; 273 | } 274 | 275 | h2 { 276 | font-size: 1.3em; 277 | font-weight: bold; 278 | font-family: "Free Sans Bold", sans-serif; 279 | color: #8e0012; 280 | margin: 15px 0 8px 0 !important; 281 | } 282 | 283 | h3 { 284 | font-size: 1.1em; 285 | font-weight: bold; 286 | font-family: "Free Sans Bold", sans-serif; 287 | margin: 10px 0 8px 0 !important; 288 | } 289 | 290 | h4 { 291 | font-size: bold; 292 | font-weight: 1em; 293 | font-family: "Free Sans Bold", sans-serif; 294 | color: #555; 295 | margin: 9px 0 !important; 296 | } 297 | 298 | /* Appropriate heading hyphenation suppression for different ereaders */ 299 | h1, 300 | h2, 301 | h3, 302 | h4 { 303 | -epub-hyphens: none; 304 | -webkit-hyphens: none; 305 | hyphens: none; 306 | } 307 | 308 | section.chapter > h1.title, 309 | section.preface > h1.title, 310 | section.appendix > h1.title { 311 | /* larger chapter title */ 312 | font-size: 2em; 313 | line-height: 1; 314 | margin-bottom: 15px; 315 | } 316 | 317 | /* images */ 318 | 319 | img { 320 | max-width: 95%; 321 | margin: 0 auto; 322 | padding: 0; 323 | } 324 | 325 | figure { 326 | margin: 10px 0 !important; 327 | text-align: center; 328 | -webkit-border-radius: 5px; 329 | border-radius: 5px; 330 | border: 1px solid #000; 331 | background-color: transparent; 332 | padding: 5px !important; 333 | page-break-inside: avoid; 334 | } 335 | 336 | figure figcaption { 337 | font-size: 90%; 338 | text-align: center; 339 | font-weight: normal; 340 | font-style: italic; 341 | font-family: "Free Serif", serif; 342 | color: #000; 343 | padding: 5px !important; 344 | page-break-before: avoid; 345 | page-break-after: avoid; 346 | } 347 | 348 | div.informalfigure { 349 | text-align: center; 350 | padding: 5px 0 !important; 351 | } 352 | 353 | /* sidebars */ 354 | 355 | div.sidebar { 356 | margin: 10px 0 !important; 357 | -webkit-border-radius: 5px; 358 | border-radius: 5px; 359 | border: 1px solid #000; 360 | background-color: transparent; 361 | font-size: 90%; 362 | padding: 10px 8px !important; 363 | page-break-inside: avoid; 364 | } 365 | 366 | div.sidebar p.title { 367 | font: bold 1em; 368 | font-family: "Free Sans Bold", sans-serif; 369 | text-transform: uppercase; 370 | letter-spacing: 1px; 371 | text-align: center; 372 | margin: 4px 0 6px 0 !important; 373 | page-break-inside: avoid; 374 | } 375 | 376 | div.sidebar ol { 377 | margin-left: 15px; 378 | } 379 | 380 | div.sidebar div.tip, 381 | div.sidebar div.note, 382 | div.sidebar div.warning, 383 | div.sidebar div.caution, 384 | div.sidebar div.important { 385 | margin: 10px 12.5% !important; 386 | font-size: 90%; 387 | padding: 10px 5px !important; 388 | width: 75%; 389 | } 390 | 391 | div.sidebar div.tip, 392 | div.sidebar div.note { 393 | background-color: #f1f6fc; 394 | border: none; 395 | } 396 | 397 | div.sidebar div.warning, 398 | div.sidebar div.caution { 399 | background-color: #fce5e8; 400 | } 401 | 402 | div.sidebar div.important { 403 | background-color: #fbec5d; 404 | } 405 | 406 | div.sidebar div.figure { 407 | border: none; 408 | } 409 | 410 | /* code */ 411 | 412 | pre { 413 | white-space: pre-wrap; 414 | font-family: "Ubuntu Mono", monospace; 415 | margin: 10px 0 10px 20px; 416 | font-size: 85%; 417 | display: block; 418 | -epub-hyphens: none; 419 | -webkit-hyphens: none; 420 | hyphens: none; 421 | } 422 | 423 | code { 424 | font-family: "Ubuntu Mono", monospace; 425 | } 426 | 427 | code strong em, 428 | code em strong, 429 | pre em strong, 430 | pre strong em, 431 | strong code em code, 432 | em code strong code, 433 | span.bolditalic code { 434 | /* yes, all of these variations are needed */ 435 | font-weight: bold; 436 | font-style: italic; 437 | font-family: "Ubuntu Mono BoldItal", monospace; 438 | } 439 | 440 | code em, 441 | em code, 442 | pre em, 443 | em.replaceable { 444 | font-family: "Ubuntu Mono Ital", monospace; 445 | font-style: italic; 446 | } 447 | 448 | code strong, 449 | strong code, 450 | pre strong, 451 | strong.userinput { 452 | font-family: "Ubuntu Mono Bold", monospace; 453 | font-weight: bold; 454 | } 455 | 456 | div.example { 457 | margin: 10px 0 15px 0 !important; 458 | } 459 | 460 | div.example p.title { 461 | font-style: italic; 462 | font-weight: normal; 463 | font-family: "Free Serif", serif; 464 | margin: 10px 0 5px 0 !important; 465 | } 466 | 467 | li pre.example { 468 | padding: 10px 0 !important; 469 | } 470 | 471 | div.example-contents pre.programlisting, 472 | div.example-contents pre.screen { 473 | margin: 0; 474 | } 475 | 476 | /* title and copyright page */ 477 | 478 | div.book div.titlepage h1.title { 479 | font-size: 2.2em; 480 | text-align: center; 481 | margin-bottom: 10px !important; 482 | line-height: 1; 483 | } 484 | 485 | div.book div.titlepage div.author h3 { 486 | font-size: 1.6em; 487 | font-family: "Free Sans Bold", sans-serif; 488 | text-align: center; 489 | color: #8e0012; 490 | margin: 10px 0 !important; 491 | } 492 | 493 | h2.subtitle { 494 | font: bold italic 1.1em; 495 | font-family: "Free Sans Bold", sans-serif; 496 | text-align: center; 497 | color: #000; 498 | margin-top: 5px !important; 499 | } 500 | 501 | div.titlepage p.copyright { 502 | margin: 20px 0 !important; 503 | } 504 | 505 | div.legalnotice { 506 | margin: 0 !important; 507 | font-size: 90%; 508 | } 509 | 510 | div.legalnotice p { 511 | margin: 5px 0 !important; 512 | } 513 | 514 | div.titlepage hr { 515 | width: 50%; 516 | } 517 | 518 | div.editor h4 { 519 | color: #000; 520 | margin: 20px 0 0 0 !important; 521 | font-weight: bold; 522 | font-style: normal; 523 | font-size: 1em; 524 | } 525 | 526 | div.editor h3 { 527 | margin: 0; 528 | font-family: serif; 529 | font-size: 1em; 530 | font-weight: normal; 531 | } 532 | 533 | div.dedication p { 534 | text-align: center; 535 | font-style: italic; 536 | font-family: "Free Serif", serif; 537 | } 538 | 539 | div.dedication div.titlepage h1.title { 540 | text-transform: uppercase; 541 | font-size: 1em; 542 | } 543 | 544 | div.affiliation span.orgname, 545 | span.jobtitle { 546 | padding-left: 30px !important; 547 | font-size: smaller; 548 | } 549 | 550 | /* epigraphs, blockquotes, attributions */ 551 | 552 | div.attribution { 553 | margin: 5px 0 0 50px !important; 554 | } 555 | 556 | h3.author span.orgname { 557 | display: none; 558 | } /* to work around bug */ 559 | 560 | div.epigraph { 561 | margin: 10px 0 10px 20px !important; 562 | page-break-inside: avoid; 563 | font-size: 90%; 564 | } 565 | 566 | blockquote, 567 | div.blockquote { 568 | margin: 10px 0 10px 5px !important; 569 | page-break-inside: avoid; 570 | font-size: 95%; 571 | } 572 | 573 | blockquote p, 574 | div.blockquote p { 575 | font-style: italic; 576 | font-family: "Free Serif", serif; 577 | } 578 | 579 | blockquote div.attribution { 580 | margin: 5px 0 0 30px !important; 581 | text-align: right; 582 | width: 80%; 583 | } 584 | 585 | blockquote div.attribution p { 586 | font-style: normal; 587 | } 588 | 589 | /* footnotes */ 590 | 591 | div.footnote { 592 | font-size: 90%; 593 | } 594 | 595 | /* refentries */ 596 | 597 | div.refnamediv h2, 598 | div.refnamediv h3, 599 | div.refsynopsisdiv h2 { 600 | font-size: 1.1em; 601 | color: #000; 602 | margin-top: 15px !important; 603 | margin-bottom: 0px !important; 604 | } 605 | 606 | div.refentry div.refsect1 h2 { 607 | font-size: 1.1em; 608 | color: #000; 609 | margin-top: 15px !important; 610 | margin-bottom: 0px !important; 611 | } 612 | 613 | div.refsect2 h3 { 614 | font-size: 1em; 615 | color: #000; 616 | margin-top: 10px !important; 617 | margin-bottom: 0 !important; 618 | } 619 | 620 | div.refnamediv p { 621 | margin-left: 15px !important; 622 | } 623 | 624 | /* lists */ 625 | 626 | dt { 627 | padding-top: 10px !important; 628 | padding-bottom: 0 !important; 629 | } 630 | 631 | dd { 632 | margin-left: 1.5em !important; 633 | } 634 | 635 | ol { 636 | list-style-type: decimal; 637 | margin-top: 8px !important; 638 | margin-bottom: 8px !important; 639 | margin-left: 20px !important; 640 | padding-left: 25px !important; 641 | } 642 | 643 | ol ol { 644 | list-style-type: lower-alpha; 645 | } 646 | 647 | ol ol ol { 648 | list-style-type: lower-roman; 649 | } 650 | 651 | ul { 652 | list-style-type: square; 653 | margin-top: 8px !important; 654 | margin-bottom: 8px !important; 655 | margin-left: 5px !important; 656 | padding-left: 20px !important; 657 | } 658 | 659 | ul ul { 660 | list-style-type: none; 661 | padding-left: 0 !important; 662 | margin-left: 0 !important; 663 | } 664 | 665 | ul ul li p:before { 666 | content: "\2014 \0020"; 667 | } 668 | 669 | ul ul ul li p:before { 670 | content: ""; 671 | } 672 | 673 | ul ul ul { 674 | list-style-type: square; 675 | margin-left: 20px !important; 676 | padding-left: 30px !important; 677 | } 678 | 679 | div.orderedlistalpha { 680 | list-style-type: upper-alpha; 681 | } 682 | 683 | table.simplelist { 684 | margin-left: 20px !important; 685 | margin-bottom: 10px; 686 | } 687 | 688 | table.simplelist td { 689 | border: none; 690 | font-size: 90%; 691 | } 692 | 693 | table.simplelist tr { 694 | border-bottom: none; 695 | } 696 | 697 | table.simplelist tr:nth-of-type(even) { 698 | background-color: transparent; 699 | } 700 | 701 | div.calloutlist p:first-child { 702 | margin-top: -25px !important; 703 | } 704 | 705 | div.calloutlist dd { 706 | padding-left: 40px !important; 707 | } 708 | 709 | div.calloutlist img { 710 | padding: 0; 711 | } 712 | 713 | a.co img { 714 | padding: 0; 715 | } 716 | 717 | /* admonitions */ 718 | 719 | div.tip, 720 | aside.note, 721 | div.warning, 722 | div.caution, 723 | div.important { 724 | margin: 10px 0 !important; 725 | -webkit-border-radius: 5px; 726 | border-radius: 5px; 727 | font-size: 90%; 728 | padding: 10px 8px 20px 8px !important; 729 | page-break-inside: avoid; 730 | } 731 | 732 | div.tip, 733 | aside.note { 734 | border: 1px solid #6cafd0; 735 | background-color: transparent; 736 | } 737 | 738 | div.warning, 739 | div.caution { 740 | border: 1px solid #8e0012; 741 | background-color: #fce5e8; 742 | } 743 | 744 | div.important { 745 | background-color: #fff68f; 746 | border: 1px solid #615e3f; 747 | } 748 | 749 | div.tip h3, 750 | aside.note h3, 751 | div.warning h3, 752 | div.caution h3, 753 | div.important h3 { 754 | font: bold 90%; 755 | font-family: "Free Sans Bold", sans-serif; 756 | text-transform: uppercase; 757 | letter-spacing: 1px; 758 | text-align: center; 759 | margin: 4px 0 6px !important; 760 | color: #000; 761 | } 762 | 763 | /* tables */ 764 | 765 | div.table, 766 | table { 767 | margin: 10px auto !important; 768 | max-width: 95%; 769 | border-collapse: collapse; 770 | border-spacing: 0; 771 | } 772 | 773 | div.table, 774 | div.informaltable { 775 | page-break-inside: avoid; 776 | } 777 | 778 | tr { 779 | border-bottom: 1px solid #c3c3c3; 780 | } 781 | 782 | tr th { 783 | border-bottom: #9d9d9d 2px solid !important; 784 | border-top: #9d9d9d 2px solid !important; 785 | } 786 | 787 | tr:nth-of-type(even) { 788 | background-color: #f1f6fc; 789 | } 790 | 791 | th { 792 | font-family: "Free Sans Bold", sans-serif; 793 | color: #000; 794 | font-weight: bold; 795 | } 796 | 797 | td, 798 | th { 799 | padding: 0.3em; 800 | text-align: left; 801 | vertical-align: baseline; 802 | font-size: 80%; 803 | } 804 | 805 | div.informaltable table { 806 | margin: 10px auto !important; 807 | } 808 | 809 | div.informaltable table tr { 810 | border-bottom: none; 811 | } 812 | 813 | div.informaltable table tr:nth-of-type(even) { 814 | background-color: transparent; 815 | } 816 | 817 | div.informaltable td, 818 | div.informaltable th { 819 | border: #9d9d9d 1px solid; 820 | } 821 | 822 | div.table p.title { 823 | font-weight: normal; 824 | font-style: italic; 825 | font-family: "Free Serif", serif; 826 | margin: 20px 0 0 0 !important; 827 | text-align: center; 828 | padding: 0; 829 | } 830 | 831 | table code { 832 | font-size: smaller; 833 | } 834 | 835 | /* syntax highlighting and coloring text in general */ 836 | 837 | /* legacy stuff */ 838 | code.boolean, 839 | .navy { 840 | color: rgb(0, 0, 128); /* navy */ 841 | } 842 | code.character, 843 | .olive { 844 | color: rgb(128, 128, 0); /* olive */ 845 | } 846 | code.comment, 847 | .blue { 848 | color: rgb(0, 0, 255); /* blue */ 849 | } 850 | code.conditional, 851 | .limegreen { 852 | color: rgb(50, 205, 50); /* limegreen */ 853 | } 854 | code.constant, 855 | .darkorange { 856 | color: rgb(255, 140, 0); /* darkorange */ 857 | } 858 | code.debug, 859 | .darkred { 860 | color: rgb(139, 0, 0); /* darkred */ 861 | } 862 | code.define, 863 | .darkgoldenrod, 864 | .gold { 865 | color: rgb(184, 134, 11); /* darkgoldenrod */ 866 | } 867 | code.delimiter, 868 | .dimgray { 869 | color: rgb(105, 105, 105); /* dimgray */ 870 | } 871 | code.error, 872 | .red { 873 | color: rgb(255, 0, 0); /* red */ 874 | } 875 | code.exception, 876 | .salmon { 877 | color: rgb(250, 128, 11); /* salmon */ 878 | } 879 | code.float, 880 | .steelblue { 881 | color: rgb(70, 130, 180); /* steelblue */ 882 | } 883 | code.function, 884 | .green { 885 | color: rgb(0, 128, 0); /* green */ 886 | } 887 | code.identifier, 888 | .royalblue { 889 | color: rgb(65, 105, 225); /* royalblue */ 890 | } 891 | code.ignore, 892 | .gray { 893 | color: rgb(128, 128, 128); /* gray */ 894 | } 895 | code.include, 896 | .purple { 897 | color: rgb(128, 0, 128); /* purple */ 898 | } 899 | code.keyword, 900 | .sienna { 901 | color: rgb(160, 82, 45); /* sienna */ 902 | } 903 | code.label, 904 | .deeppink { 905 | color: rgb(255, 20, 147); /* deeppink */ 906 | } 907 | code.macro, 908 | .orangered { 909 | color: rgb(255, 69, 0); /* orangered */ 910 | } 911 | code.number, 912 | .brown { 913 | color: rgb(165, 42, 42); /* brown */ 914 | } 915 | code.operator, 916 | .black { 917 | color: #000; /* black */ 918 | } 919 | code.preCondit, 920 | .teal { 921 | color: rgb(0, 128, 128); /* teal */ 922 | } 923 | code.preProc, 924 | .fuschia { 925 | color: rgb(255, 0, 255); /* fuschia */ 926 | } 927 | code.repeat, 928 | .indigo { 929 | color: rgb(75, 0, 130); /* indigo */ 930 | } 931 | code.special, 932 | .saddlebrown { 933 | color: rgb(139, 69, 19); /* saddlebrown */ 934 | } 935 | code.specialchar, 936 | .magenta { 937 | color: rgb(255, 0, 255); /* magenta */ 938 | } 939 | code.specialcomment, 940 | .seagreen { 941 | color: rgb(46, 139, 87); /* seagreen */ 942 | } 943 | code.statement, 944 | .forestgreen { 945 | color: rgb(34, 139, 34); /* forestgreen */ 946 | } 947 | code.storageclass, 948 | .plum { 949 | color: rgb(221, 160, 221); /* plum */ 950 | } 951 | code.string, 952 | .darkred { 953 | color: rgb(139, 0, 0); /* darkred */ 954 | } 955 | code.structure, 956 | .chocolate { 957 | color: rgb(210, 106, 30); /* chocolate */ 958 | } 959 | code.tag, 960 | .darkcyan { 961 | color: rgb(0, 139, 139); /* darkcyan */ 962 | } 963 | code.todo, 964 | .black { 965 | color: #000; /* black */ 966 | } 967 | code.type, 968 | .mediumslateblue { 969 | color: rgb(123, 104, 238); /* mediumslateblue */ 970 | } 971 | code.typedef, 972 | .darkgreen { 973 | color: rgb(0, 100, 0); /* darkgreen */ 974 | } 975 | code.underlined { 976 | text-decoration: underline; /* guess what */ 977 | } 978 | 979 | /* Pygments with manni theme */ 980 | pre code.hll { 981 | background-color: #ffffcc; 982 | } 983 | pre code.c { 984 | color: #0099ff; 985 | font-style: italic; 986 | } /* Comment */ 987 | pre code.err { 988 | color: #aa0000; 989 | } /* Error */ 990 | pre code.k { 991 | color: #006699; 992 | font-weight: bold; 993 | } /* Keyword */ 994 | pre code.o { 995 | color: #555555; 996 | } /* Operator */ 997 | pre code.cm { 998 | color: #35586c; 999 | font-style: italic; 1000 | } /* Comment.Multiline */ 1001 | pre code.cp { 1002 | color: #009999; 1003 | } /* Comment.Preproc */ 1004 | pre code.c1 { 1005 | color: #35586c; 1006 | font-style: italic; 1007 | } /* Comment.Single */ 1008 | pre code.cs { 1009 | color: #35586c; 1010 | font-weight: bold; 1011 | font-style: italic; 1012 | } /* Comment.Special */ 1013 | pre code.gd { 1014 | background-color: #ffcccc; 1015 | } /* Generic.Deleted */ 1016 | pre code.ge { 1017 | font-style: italic; 1018 | } /* Generic.Emph */ 1019 | pre code.gr { 1020 | color: #ff0000; 1021 | } /* Generic.Error */ 1022 | pre code.gh { 1023 | color: #003300; 1024 | font-weight: bold; 1025 | } /* Generic.Heading */ 1026 | pre code.gi { 1027 | background-color: #ccffcc; 1028 | } /* Generic.Inserted */ 1029 | pre code.go { 1030 | color: #aaaaaa; 1031 | } /* Generic.Output */ 1032 | pre code.gp { 1033 | color: #000099; 1034 | font-weight: bold; 1035 | } /* Generic.Prompt */ 1036 | pre code.gs { 1037 | font-weight: bold; 1038 | } /* Generic.Strong */ 1039 | pre code.gu { 1040 | color: #003300; 1041 | font-weight: bold; 1042 | } /* Generic.Subheading */ 1043 | pre code.gt { 1044 | color: #99cc66; 1045 | } /* Generic.Traceback */ 1046 | pre code.kc { 1047 | color: #006699; 1048 | font-weight: bold; 1049 | } /* Keyword.Constant */ 1050 | pre code.kd { 1051 | color: #006699; 1052 | font-weight: bold; 1053 | } /* Keyword.Declaration */ 1054 | pre code.kn { 1055 | color: #006699; 1056 | font-weight: bold; 1057 | } /* Keyword.Namespace */ 1058 | pre code.kp { 1059 | color: #006699; 1060 | } /* Keyword.Pseudo */ 1061 | pre code.kr { 1062 | color: #006699; 1063 | font-weight: bold; 1064 | } /* Keyword.Reserved */ 1065 | pre code.kt { 1066 | color: #007788; 1067 | font-weight: bold; 1068 | } /* Keyword.Type */ 1069 | pre code.m { 1070 | color: #ff6600; 1071 | } /* Literal.Number */ 1072 | pre code.s { 1073 | color: #cc3300; 1074 | } /* Literal.String */ 1075 | pre code.na { 1076 | color: #330099; 1077 | } /* Name.Attribute */ 1078 | pre code.nb { 1079 | color: #336666; 1080 | } /* Name.Builtin */ 1081 | pre code.nc { 1082 | color: #00aa88; 1083 | font-weight: bold; 1084 | } /* Name.Class */ 1085 | pre code.no { 1086 | color: #336600; 1087 | } /* Name.Constant */ 1088 | pre code.nd { 1089 | color: #9999ff; 1090 | } /* Name.Decorator */ 1091 | pre code.ni { 1092 | color: #999999; 1093 | font-weight: bold; 1094 | } /* Name.Entity */ 1095 | pre code.ne { 1096 | color: #cc0000; 1097 | font-weight: bold; 1098 | } /* Name.Exception */ 1099 | pre code.nf { 1100 | color: #cc00ff; 1101 | } /* Name.Function */ 1102 | pre code.nl { 1103 | color: #9999ff; 1104 | } /* Name.Label */ 1105 | pre code.nn { 1106 | color: #00ccff; 1107 | font-weight: bold; 1108 | } /* Name.Namespace */ 1109 | pre code.nt { 1110 | color: #330099; 1111 | font-weight: bold; 1112 | } /* Name.Tag */ 1113 | pre code.nv { 1114 | color: #003333; 1115 | } /* Name.Variable */ 1116 | pre code.ow { 1117 | color: #000000; 1118 | font-weight: bold; 1119 | } /* Operator.Word */ 1120 | pre code.w { 1121 | color: #bbbbbb; 1122 | } /* Text.Whitespace */ 1123 | pre code.mf { 1124 | color: #ff6600; 1125 | } /* Literal.Number.Float */ 1126 | pre code.mh { 1127 | color: #ff6600; 1128 | } /* Literal.Number.Hex */ 1129 | pre code.mi { 1130 | color: #ff6600; 1131 | } /* Literal.Number.Integer */ 1132 | pre code.mo { 1133 | color: #ff6600; 1134 | } /* Literal.Number.Oct */ 1135 | pre code.sb { 1136 | color: #cc3300; 1137 | } /* Literal.String.Backtick */ 1138 | pre code.sc { 1139 | color: #cc3300; 1140 | } /* Literal.String.Char */ 1141 | pre code.sd { 1142 | color: #cc3300; 1143 | font-style: italic; 1144 | } /* Literal.String.Doc */ 1145 | pre code.s2 { 1146 | color: #cc3300; 1147 | } /* Literal.String.Double */ 1148 | pre code.se { 1149 | color: #cc3300; 1150 | font-weight: bold; 1151 | } /* Literal.String.Escape */ 1152 | pre code.sh { 1153 | color: #cc3300; 1154 | } /* Literal.String.Heredoc */ 1155 | pre code.si { 1156 | color: #aa0000; 1157 | } /* Literal.String.Interpol */ 1158 | pre code.sx { 1159 | color: #cc3300; 1160 | } /* Literal.String.Other */ 1161 | pre code.sr { 1162 | color: #33aaaa; 1163 | } /* Literal.String.Regex */ 1164 | pre code.s1 { 1165 | color: #cc3300; 1166 | } /* Literal.String.Single */ 1167 | pre code.ss { 1168 | color: #ffcc33; 1169 | } /* Literal.String.Symbol */ 1170 | pre code.bp { 1171 | color: #336666; 1172 | } /* Name.Builtin.Pseudo */ 1173 | pre code.vc { 1174 | color: #003333; 1175 | } /* Name.Variable.Class */ 1176 | pre code.vg { 1177 | color: #003333; 1178 | } /* Name.Variable.Global */ 1179 | pre code.vi { 1180 | color: #003333; 1181 | } /* Name.Variable.Instance */ 1182 | pre code.il { 1183 | color: #ff6600; 1184 | } /* Literal.Number.Integer.Long */ 1185 | 1186 | /* Sanders's additions to manni */ 1187 | pre code.g { 1188 | color: #005500; 1189 | } /* Generic */ 1190 | pre code.l { 1191 | color: #cc6600; 1192 | } /* Literal */ 1193 | pre code.l { 1194 | color: #ff9900; 1195 | } /* Literal.Date */ 1196 | pre code.n { 1197 | color: #000088; 1198 | } /* Name */ 1199 | pre code.nx { 1200 | color: #000088; 1201 | } /* Name.Other */ 1202 | pre code.py { 1203 | color: #9966ff; 1204 | } /* Name.Property */ 1205 | pre code.p { 1206 | color: #000000; 1207 | } /* Punctuation */ 1208 | pre code.x { 1209 | color: #ff0066; 1210 | } /* Other */ 1211 | 1212 | /* Special handling for sampler TOC entry rendering */ 1213 | 1214 | div.blockquote_sampler_toc { 1215 | width: 95%; 1216 | margin: 5px 5px 5px 10px !important; 1217 | } 1218 | 1219 | /* fonts (keep at bottom); using Free Serif and Sans as a fallback for its rich set of glyphs */ 1220 | 1221 | /* keep this body statement last */ 1222 | 1223 | body { 1224 | font-family: "Free Serif", serif; 1225 | } 1226 | 1227 | /* remove numbering from nav ol */ 1228 | 1229 | nav#toc ol { 1230 | list-style-type: none; 1231 | } 1232 | ` 1233 | var synthCss = `@media speech { 1234 | .digits { 1235 | -epub-speak-as: digits; 1236 | } 1237 | 1238 | .spell { 1239 | -epub-speak-as: spell-out; 1240 | } 1241 | } 1242 | ` 1243 | var bookTocTpl = ` 1244 | 1245 | 1251 | 1252 | {{.Name}} 1253 | 1254 | 1255 | 1256 |

{{.Name}}

1257 | 1263 | 1264 | 1265 | ` 1266 | var chapterTpl = ` 1267 | 1268 | 1274 | 1275 | {{.CName}} 1276 | 1277 | 1278 | 1279 |
1280 |

{{.CName}}

1281 | {{ range $value := .ChapterParas }}

{{fixImg $value}}

1282 | {{ end }}
1283 | 1284 | 1285 | ` 1286 | var opfTpl = ` 1287 | 1290 | 1291 | {{.Name}} 1292 | zh 1293 | {{.Author}} 1294 | Cirno 1295 | Copyright © 2015 Hangzhou Fantasy Technology NetworkCo.,Ltd. 1296 | 1297 | 1298 | 1299 | 1300 | 1301 | 1302 | 1303 | {{ range .Chapters }} 1304 | {{ end }} 1305 | 1306 | 1307 | 1308 | {{ range .Chapters }} 1309 | {{ end }} 1310 | 1311 | ` 1312 | -------------------------------------------------------------------------------- /ciweimao/content.go: -------------------------------------------------------------------------------- 1 | package ciweimao 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/imroc/req" 7 | jsoniter "github.com/json-iterator/go" 8 | "github.com/zsakvo/Cirno-go/structure" 9 | "github.com/zsakvo/Cirno-go/util" 10 | ) 11 | 12 | func GetContent(cid string) (structure.ChapterInfo, error) { 13 | var err error 14 | var key string 15 | key, err = getKey(cid) 16 | if err != nil { 17 | fmt.Println(err) 18 | return structure.ChapterInfo{}, err 19 | } 20 | return getDecrypt(key, cid) 21 | } 22 | 23 | func getKey(chapterId string) (string, error) { 24 | var err error 25 | var res []byte 26 | paras := req.Param{ 27 | "chapter_id": chapterId, 28 | } 29 | res, err = util.Get("/chapter/get_chapter_cmd", paras) 30 | if err != nil { 31 | return "", err 32 | } 33 | var json = jsoniter.ConfigCompatibleWithStandardLibrary 34 | var result structure.KeyStruct 35 | err = json.Unmarshal(res, &result) 36 | if err != nil { 37 | return "", err 38 | } 39 | return result.Data.Command, nil 40 | } 41 | 42 | func getDecrypt(key, chapterId string) (structure.ChapterInfo, error) { 43 | var err error 44 | var res []byte 45 | paras := req.Param{ 46 | "chapter_id": chapterId, 47 | "chapter_command": key, 48 | } 49 | res, err = util.Get("/chapter/get_cpt_ifm", paras) 50 | if err != nil { 51 | fmt.Println(err) 52 | return structure.ChapterInfo{}, err 53 | } 54 | var json = jsoniter.ConfigCompatibleWithStandardLibrary 55 | var result structure.ContentStruct 56 | err = json.Unmarshal(res, &result) 57 | if err != nil { 58 | return structure.ChapterInfo{}, err 59 | } 60 | var bytes []byte 61 | bytes, err = util.Decode(result.Data.ChapterInfo.TxtContent, key) 62 | if err != nil { 63 | return structure.ChapterInfo{}, err 64 | } 65 | result.Data.ChapterInfo.TxtContent = string(bytes) 66 | return result.Data.ChapterInfo, nil 67 | } 68 | -------------------------------------------------------------------------------- /ciweimao/detail.go: -------------------------------------------------------------------------------- 1 | package ciweimao 2 | 3 | import ( 4 | "github.com/imroc/req" 5 | jsoniter "github.com/json-iterator/go" 6 | "github.com/zsakvo/Cirno-go/structure" 7 | "github.com/zsakvo/Cirno-go/util" 8 | ) 9 | 10 | func GetDetail(bid string) structure.BookInfo { 11 | var err error 12 | var res []byte 13 | paras := req.Param{ 14 | "book_id": bid, 15 | } 16 | res, err = util.Get("/book/get_info_by_id", paras) 17 | util.PanicErr(err) 18 | var json = jsoniter.ConfigCompatibleWithStandardLibrary 19 | var result structure.DetailStruct 20 | err = json.Unmarshal(res, &result) 21 | util.PanicErr(err) 22 | return result.Data.BookInfo 23 | } 24 | -------------------------------------------------------------------------------- /ciweimao/epub.go: -------------------------------------------------------------------------------- 1 | package ciweimao 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | "path/filepath" 7 | "regexp" 8 | "strings" 9 | "text/template" 10 | "time" 11 | 12 | "github.com/cheggaaa/pb" 13 | "github.com/imroc/req" 14 | "github.com/mitchellh/go-homedir" 15 | "github.com/zsakvo/Cirno-go/config" 16 | "github.com/zsakvo/Cirno-go/structure" 17 | "github.com/zsakvo/Cirno-go/util" 18 | ) 19 | 20 | var epubBar *pb.ProgressBar 21 | var tmpPath string 22 | var bookPath string 23 | var oebpsPath string 24 | var cpic bool 25 | var cacheNoPaid bool 26 | 27 | func fixImgTag(str string) string { 28 | if strings.Contains(str, "` 45 | } else { 46 | return str 47 | } 48 | } 49 | 50 | func initTemp(name, author, cover string, chapters []structure.ChapterList) { 51 | var err error 52 | err = util.RemoveContents(tmpPath) 53 | util.PanicErr(err) 54 | dir, _ := homedir.Dir() 55 | expandedDir, _ := homedir.Expand(dir) 56 | cleanDestBook(expandedDir+"/Cirno/download/", name, "epub") 57 | tmpPath = expandedDir + "/Cirno/download/tmp/" 58 | bookPath = tmpPath + name 59 | oebpsPath = bookPath + "/EPUB" 60 | err = writeOut(mimetype, bookPath, "mimetype") 61 | util.PanicErr(err) 62 | err = writeOut(containerXml, bookPath+"/META-INF", "container.xml") 63 | util.PanicErr(err) 64 | err = writeOut(getCover(cover), oebpsPath+"/covers", "cover.jpg") 65 | util.PanicErr(err) 66 | err = writeOut(epubCss, oebpsPath+"/css", "epub.css") 67 | util.PanicErr(err) 68 | err = writeOut(synthCss, oebpsPath+"/css", "synth.css") 69 | genBookToc(name, chapters) 70 | util.PanicErr(err) 71 | genContentOpf(name, author, chapters) 72 | } 73 | 74 | func DownloadEpub(bid string) { 75 | cpic = config.Config.Extra.Cpic 76 | cacheNoPaid = config.Config.Extra.CacheNoPaid 77 | var err error 78 | epubDetail := GetDetail(bid) 79 | fmt.Println(epubDetail.BookName, "/", epubDetail.AuthorName) 80 | epubChapters := GetCatalog(bid) 81 | var chapters []structure.ChapterList 82 | if !cacheNoPaid { 83 | for _, c := range epubChapters { 84 | if c.AuthAccess == "1" { 85 | chapters = append(chapters, c) 86 | } 87 | } 88 | } else { 89 | chapters = epubChapters 90 | } 91 | fmt.Println("fetching datas…") 92 | initTemp(epubDetail.BookName, epubDetail.AuthorName, epubDetail.Cover, epubChapters) 93 | epubTotalCount := len(chapters) 94 | epubBar = pb.StartNew(epubTotalCount) 95 | epubContainer := []int{} 96 | epubc := make(chan int, 1024) 97 | epubErrc := make(chan structure.ChapterList, 102400) 98 | coroutine := config.Config.Extra.Coroutines 99 | epubChaptersArr := splitArray(chapters, coroutine) 100 | for _, cs := range epubChaptersArr { 101 | go getChapterEpub(cs, epubc, epubErrc) 102 | } 103 | for { 104 | select { 105 | case epub := <-epubc: 106 | epubContainer = append(epubContainer, epub) 107 | epubBar.Increment() 108 | case e := <-epubErrc: 109 | go getChapterEpub([]structure.ChapterList{e}, epubc, epubErrc) 110 | } 111 | if len(epubContainer) == len(chapters) { 112 | break 113 | } 114 | } 115 | epubBar.Finish() 116 | fmt.Println("writing out files…") 117 | epubPath := filepath.Join(tmpPath, "..", epubDetail.BookName+".epub") 118 | err = util.CompressEpub(bookPath, epubPath) 119 | util.PanicErr(err) 120 | close(epubc) 121 | close(epubErrc) 122 | err = util.RemoveContents(tmpPath) 123 | util.PanicErr(err) 124 | fmt.Println("download success!") 125 | os.Exit(0) 126 | } 127 | 128 | func getChapterEpub(chapters []structure.ChapterList, epubc chan int, epubErrc chan structure.ChapterList) { 129 | for _, chapter := range chapters { 130 | chapterInfo, err := GetContent(chapter.ChapterID) 131 | if err != nil { 132 | epubErrc <- chapter 133 | } else { 134 | content := chapterInfo.TxtContent 135 | content += chapterInfo.AuthorSay 136 | content = strings.Replace(content, "&", "&", -1) 137 | contentParas := strings.Split(content, "\n") 138 | contentS := contentStruct{chapterInfo.ChapterTitle, contentParas} 139 | fileName := oebpsPath + "/" + chapter.ChapterID + ".xhtml" 140 | var tmpl *template.Template 141 | if cpic { 142 | tmpl, _ = template.New("content").Funcs(template.FuncMap{"fixImg": getImg}).Parse(chapterTpl) 143 | } else { 144 | tmpl, _ = template.New("content").Funcs(template.FuncMap{"fixImg": fixImgTag}).Parse(chapterTpl) 145 | } 146 | file, _ := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0777) 147 | err := tmpl.Execute(file, contentS) 148 | if err != nil { 149 | epubErrc <- chapter 150 | } 151 | epubc <- 0 152 | } 153 | } 154 | } 155 | 156 | func genBookToc(name string, chapters []structure.ChapterList) { 157 | tocS := bookTocStruct{name, chapters} 158 | fileName := oebpsPath + "/book-toc.xhtml" 159 | tmpl, _ := template.New("toc").Parse(bookTocTpl) 160 | file, _ := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0777) 161 | err := tmpl.Execute(file, tocS) 162 | util.PanicErr(err) 163 | } 164 | 165 | func genContentOpf(name, author string, chapters []structure.ChapterList) { 166 | opfS := opfStruct{name, author, chapters} 167 | fileName := oebpsPath + "/package.opf" 168 | tmpl, _ := template.New("opf").Parse(opfTpl) 169 | file, _ := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0777) 170 | err := tmpl.Execute(file, opfS) 171 | util.PanicErr(err) 172 | } 173 | 174 | func getCover(url string) string { 175 | client := req.New() 176 | client.SetTimeout(20 * time.Second) 177 | r, _ := client.Get(url) 178 | return r.String() 179 | } 180 | -------------------------------------------------------------------------------- /ciweimao/login.go: -------------------------------------------------------------------------------- 1 | package ciweimao 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/imroc/req" 7 | jsoniter "github.com/json-iterator/go" 8 | "github.com/zsakvo/Cirno-go/config" 9 | "github.com/zsakvo/Cirno-go/structure" 10 | "github.com/zsakvo/Cirno-go/util" 11 | ) 12 | 13 | func Login() { 14 | var err error 15 | var res []byte 16 | var name string 17 | var passwd string 18 | fmt.Printf("account: ") 19 | fmt.Scanln(&name) 20 | fmt.Printf("password: ") 21 | fmt.Scanln(&passwd) 22 | paras := req.Param{ 23 | "login_name": name, 24 | "passwd": passwd, 25 | } 26 | res, err = util.Get("/signup/login", paras) 27 | util.PanicErr(err) 28 | var json = jsoniter.ConfigCompatibleWithStandardLibrary 29 | var result structure.LoginStruct 30 | err = json.Unmarshal(res, &result) 31 | if err != nil { 32 | panic(err) 33 | } else { 34 | config.Write(name, result.Data.LoginToken, result.Data.ReaderInfo.Account) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /ciweimao/search.go: -------------------------------------------------------------------------------- 1 | package ciweimao 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | "strconv" 7 | 8 | "github.com/imroc/req" 9 | jsoniter "github.com/json-iterator/go" 10 | "github.com/zsakvo/Cirno-go/structure" 11 | "github.com/zsakvo/Cirno-go/util" 12 | ) 13 | 14 | func Search(bookName string, page int, bookType string) { 15 | var err error 16 | var res []byte 17 | paras := req.Param{ 18 | "count": 10, 19 | "page": page, 20 | "category_index": 0, 21 | "key": bookName, 22 | } 23 | res, err = util.Get("/bookcity/get_filter_search_book_list", paras) 24 | util.PanicErr(err) 25 | var json = jsoniter.ConfigCompatibleWithStandardLibrary 26 | var result structure.SearchStruct 27 | err = json.Unmarshal(res, &result) 28 | util.PanicErr(err) 29 | bookList := result.Data.BookList 30 | for i, book := range bookList { 31 | fmt.Println(i, "-", book.BookName) 32 | } 33 | enterCmd(bookName, page, bookList, bookType) 34 | } 35 | 36 | func enterCmd(bookName string, page int, bookList []structure.BookList, bookType string) { 37 | var input string 38 | fmt.Printf("enter the number to download, n to next page, and p to previous page: ") 39 | fmt.Scanln(&input) 40 | fmt.Println("") 41 | switch input { 42 | case "n": 43 | if len(bookList) < 10 { 44 | fmt.Println("already the last page.") 45 | enterCmd(bookName, page, bookList, bookType) 46 | } 47 | fmt.Printf("\x1bc") 48 | fmt.Printf("search result:") 49 | fmt.Println("") 50 | Search(bookName, page+1, bookType) 51 | case "p": 52 | if page-1 < 0 { 53 | fmt.Println("already the first page.") 54 | enterCmd(bookName, page, bookList, bookType) 55 | } 56 | fmt.Printf("\x1bc") 57 | fmt.Printf("search result:") 58 | fmt.Println("") 59 | Search(bookName, page-1, bookType) 60 | default: 61 | bidNum, err := strconv.Atoi(input) 62 | if err != nil { 63 | fmt.Println("invalid num code") 64 | enterCmd(bookName, page, bookList, bookType) 65 | } 66 | switch bookType { 67 | case "txt": 68 | fmt.Printf("\x1bc") 69 | fmt.Printf("downloading…") 70 | fmt.Println("") 71 | DownloadText(bookList[bidNum].BookID) 72 | case "epub": 73 | fmt.Printf("\x1bc") 74 | fmt.Printf("downloading…") 75 | fmt.Println("") 76 | DownloadEpub(bookList[bidNum].BookID) 77 | default: 78 | fmt.Println("invlid type.") 79 | os.Exit(0) 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /ciweimao/txt.go: -------------------------------------------------------------------------------- 1 | package ciweimao 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | "os" 7 | 8 | "github.com/cheggaaa/pb" 9 | "github.com/mitchellh/go-homedir" 10 | "github.com/zsakvo/Cirno-go/config" 11 | "github.com/zsakvo/Cirno-go/structure" 12 | ) 13 | 14 | var txtBar *pb.ProgressBar 15 | var cacheNoPaidTxt bool 16 | 17 | func DownloadText(bid string) { 18 | cacheNoPaidTxt = config.Config.Extra.CacheNoPaid 19 | txtDetail := GetDetail(bid) 20 | fmt.Println(txtDetail.BookName, "/", txtDetail.AuthorName) 21 | txtName := txtDetail.BookName 22 | txtChapters := GetCatalog(bid) 23 | var chapters []structure.ChapterList 24 | if !cacheNoPaidTxt { 25 | for _, c := range txtChapters { 26 | if c.AuthAccess == "1" { 27 | chapters = append(chapters, c) 28 | } 29 | } 30 | } else { 31 | chapters = txtChapters 32 | } 33 | txtTotalCount := len(chapters) 34 | txtBar = pb.StartNew(txtTotalCount) 35 | txtContainer := make(map[string]string) 36 | txtc := make(chan chapterStruct, 409600) 37 | errc := make(chan structure.ChapterList, 102400) 38 | coroutine := config.Config.Extra.Coroutines 39 | txtChaptersArr := splitArray(chapters, coroutine) 40 | for _, cs := range txtChaptersArr { 41 | go getChapterText(cs, txtc, errc) 42 | } 43 | for { 44 | select { 45 | case t := <-txtc: 46 | txtContainer[t.Cid] = t.Text 47 | txtBar.Increment() 48 | case e := <-errc: 49 | go getChapterText([]structure.ChapterList{e}, txtc, errc) 50 | } 51 | if len(txtContainer) == len(chapters) { 52 | close(txtc) 53 | close(errc) 54 | break 55 | } 56 | } 57 | txtBar.Finish() 58 | fmt.Println("writing out files…") 59 | writeText(txtName, txtContainer, chapters) 60 | fmt.Println("download success!") 61 | os.Exit(0) 62 | } 63 | 64 | func writeText(bookName string, txtContainer map[string]string, chapters []structure.ChapterList) { 65 | bookText := "" 66 | dir, _ := homedir.Dir() 67 | expandedDir, _ := homedir.Expand(dir) 68 | cleanDestBook(expandedDir+"/Cirno/download/", bookName, "txt") 69 | for _, chapter := range chapters { 70 | bookText += txtContainer[chapter.ChapterID] 71 | } 72 | fileName := expandedDir + "/Cirno/download/" + bookName + ".txt" 73 | if isExist(fileName) { 74 | os.Remove(fileName) 75 | } 76 | file, err := os.Create(fileName) 77 | if err != nil { 78 | fmt.Println(err.Error()) 79 | } 80 | _, err = file.WriteString(bookText) 81 | if err != nil { 82 | log.Fatalln(err) 83 | } 84 | defer file.Close() 85 | } 86 | 87 | func getChapterText(chapters []structure.ChapterList, txt chan chapterStruct, errc chan structure.ChapterList) { 88 | for _, chapter := range chapters { 89 | text := "" 90 | chapterInfo, err := GetContent(chapter.ChapterID) 91 | if err != nil { 92 | errc <- chapter 93 | } else { 94 | text += chapterInfo.ChapterTitle 95 | text += "\n\n" 96 | text += chapterInfo.TxtContent 97 | text += chapterInfo.AuthorSay 98 | text += "\n\n\n" 99 | txtstr := chapterStruct{text, chapter.ChapterID} 100 | txt <- txtstr 101 | } 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /config/read.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | "os" 7 | 8 | "github.com/mitchellh/go-homedir" 9 | "github.com/spf13/viper" 10 | "github.com/zsakvo/Cirno-go/structure" 11 | ) 12 | 13 | var Config structure.ConfigStruct 14 | 15 | func InitConfig(hasConfig bool) { 16 | if hasConfig { 17 | dir, _ := homedir.Dir() 18 | expandedDir, _ := homedir.Expand(dir) 19 | viper.SetConfigName("config") 20 | viper.AddConfigPath(expandedDir + "/Cirno") 21 | viper.SetConfigType("yaml") 22 | viper.SetDefault("app.app_version", "2.9.290") 23 | viper.SetDefault("app.device_token", "ciweimao_") 24 | viper.SetDefault("app.user_agent", "Android com.kuangxiangciweimao.novel 2.9.290,Pixel,6A,32") 25 | viper.SetDefault("app.default_key", "zG2nSeEfSHfvTCHy5LCcqtBbQehKNLXn") 26 | viper.SetDefault("app.host_url", "https://app.hbooker.com") 27 | viper.SetDefault("extra.coroutines", 3) 28 | viper.SetDefault("extra.cpic", false) 29 | viper.SetDefault("extra.cache_no_paid", false) 30 | err := viper.ReadInConfig() 31 | if err != nil { 32 | fmt.Printf("config file error: %s\n", err) 33 | os.Exit(1) 34 | } 35 | err = viper.Unmarshal(&Config) // 将配置解析到 config 变量 36 | if err != nil { 37 | log.Fatalf("unable to decode into struct, %v", err) 38 | } 39 | } else { 40 | Config = structure.ConfigStruct{ 41 | App: structure.App{ 42 | AppVersion: "2.9.290", 43 | DeviceToken: "ciweimao_", 44 | UserAgent: "Android com.kuangxiangciweimao.novel 2.9.290,Pixel,6A,32", 45 | DefaultKey: "zG2nSeEfSHfvTCHy5LCcqtBbQehKNLXn", 46 | HostUrl: "http://app.hbooker.com", 47 | }, 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /config/write.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/mitchellh/go-homedir" 8 | "github.com/spf13/viper" 9 | ) 10 | 11 | func Write(name, token, account string) { 12 | dir, _ := homedir.Dir() 13 | expandedDir, _ := homedir.Expand(dir) 14 | filePath := expandedDir + "/Cirno/config.yaml" 15 | if isExist(filePath) { 16 | os.Remove(filePath) 17 | } 18 | file, _ := os.Create(filePath) 19 | defer file.Close() 20 | viper.SetConfigName("config") 21 | viper.AddConfigPath(expandedDir + "/Cirno") 22 | viper.SetConfigType("yaml") 23 | err := viper.ReadInConfig() 24 | if err != nil { 25 | fmt.Printf("config file error: %s\n", err) 26 | os.Exit(1) 27 | } 28 | viper.Set("app.login_token", token) 29 | viper.Set("app.account", account) 30 | viper.Set("app.user_name", name) 31 | err1 := viper.WriteConfig() 32 | if err1 != nil { 33 | fmt.Printf("writeout config file error: %s\n", err1) 34 | os.Exit(1) 35 | } 36 | fmt.Println("登陆成功,可以开始使用了") 37 | os.Exit(0) 38 | } 39 | 40 | func isExist(path string) bool { 41 | _, err := os.Stat(path) 42 | if err != nil { 43 | return os.IsExist(err) 44 | } 45 | return true 46 | } 47 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/zsakvo/Cirno-go 2 | 3 | go 1.15 4 | 5 | require ( 6 | github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c // indirect 7 | github.com/cheggaaa/pb v1.0.29 8 | github.com/coreos/bbolt v1.3.2 // indirect 9 | github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e // indirect 10 | github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect 11 | github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect 12 | github.com/gorilla/websocket v1.4.2 // indirect 13 | github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 // indirect 14 | github.com/imroc/req v0.3.2 15 | github.com/jonboulle/clockwork v0.1.0 // indirect 16 | github.com/json-iterator/go v1.1.12 17 | github.com/mattn/go-runewidth v0.0.13 // indirect 18 | github.com/mitchellh/go-homedir v1.1.0 19 | github.com/pelletier/go-toml/v2 v2.0.2 // indirect 20 | github.com/prometheus/tsdb v0.7.1 // indirect 21 | github.com/russross/blackfriday/v2 v2.1.0 // indirect 22 | github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect 23 | github.com/smartystreets/goconvey v1.6.4 // indirect 24 | github.com/soheilhy/cmux v0.1.4 // indirect 25 | github.com/spf13/viper v1.12.0 26 | github.com/subosito/gotenv v1.4.0 // indirect 27 | github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect 28 | github.com/urfave/cli/v2 v2.10.2 29 | github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect 30 | go.etcd.io/bbolt v1.3.2 // indirect 31 | golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c // indirect 32 | gopkg.in/ini.v1 v1.66.6 // indirect 33 | gopkg.in/resty.v1 v1.12.0 // indirect 34 | ) 35 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 3 | cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 4 | cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= 5 | cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= 6 | cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= 7 | cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= 8 | cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= 9 | cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= 10 | cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= 11 | cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= 12 | cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= 13 | cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= 14 | cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= 15 | cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= 16 | cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= 17 | cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= 18 | cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= 19 | cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= 20 | cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= 21 | cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= 22 | cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= 23 | cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= 24 | cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= 25 | cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= 26 | cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= 27 | cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= 28 | cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= 29 | cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= 30 | cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= 31 | cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= 32 | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= 33 | cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= 34 | cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= 35 | cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= 36 | cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= 37 | cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= 38 | cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= 39 | cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= 40 | cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= 41 | cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= 42 | cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= 43 | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= 44 | cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= 45 | cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= 46 | cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= 47 | cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= 48 | cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= 49 | cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= 50 | cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= 51 | cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= 52 | cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= 53 | cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= 54 | cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= 55 | cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= 56 | cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= 57 | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 58 | github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= 59 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 60 | github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= 61 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= 62 | github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= 63 | github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= 64 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 65 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 66 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 67 | github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 68 | github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= 69 | github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= 70 | github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= 71 | github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= 72 | github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= 73 | github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= 74 | github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= 75 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 76 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 77 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 78 | github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= 79 | github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= 80 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 81 | github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= 82 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 83 | github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= 84 | github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= 85 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= 86 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= 87 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 88 | github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= 89 | github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= 90 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 91 | github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= 92 | github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= 93 | github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= 94 | github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= 95 | github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 96 | github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 97 | github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 98 | github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 99 | github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= 100 | github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= 101 | github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= 102 | github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= 103 | github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 104 | github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= 105 | github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= 106 | github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= 107 | github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 108 | github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= 109 | github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 110 | github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= 111 | github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 112 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 113 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 114 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 115 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 116 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= 117 | github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= 118 | github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 119 | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 120 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 121 | github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= 122 | github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= 123 | github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= 124 | github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= 125 | github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= 126 | github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= 127 | github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= 128 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 129 | github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= 130 | github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= 131 | github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= 132 | github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= 133 | github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= 134 | github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= 135 | github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= 136 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 137 | github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= 138 | github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= 139 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 140 | github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= 141 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 142 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 143 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 144 | github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 145 | github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= 146 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 147 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 148 | github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= 149 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 150 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 151 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 152 | github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= 153 | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 154 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 155 | github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 156 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 157 | github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 158 | github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 159 | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 160 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 161 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 162 | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= 163 | github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 164 | github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 165 | github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 166 | github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= 167 | github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= 168 | github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= 169 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 170 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 171 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 172 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 173 | github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 174 | github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= 175 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 176 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 177 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 178 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 179 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 180 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= 181 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 182 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 183 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 184 | github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= 185 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 186 | github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 187 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 188 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 189 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 190 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 191 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 192 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 193 | github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 194 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 195 | github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 196 | github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 197 | github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 198 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 199 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 200 | github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 201 | github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= 202 | github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 203 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 204 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 205 | github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= 206 | github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= 207 | github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= 208 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 209 | github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 210 | github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 211 | github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 212 | github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 213 | github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 214 | github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 215 | github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 216 | github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 217 | github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 218 | github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 219 | github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 220 | github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 221 | github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 222 | github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 223 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 224 | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 225 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 226 | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= 227 | github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= 228 | github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= 229 | github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= 230 | github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= 231 | github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= 232 | github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= 233 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= 234 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 235 | github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 236 | github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= 237 | github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= 238 | github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= 239 | github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= 240 | github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= 241 | github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= 242 | github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= 243 | github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= 244 | github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 245 | github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= 246 | github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= 247 | github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= 248 | github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= 249 | github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= 250 | github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= 251 | github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= 252 | github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= 253 | github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= 254 | github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= 255 | github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= 256 | github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= 257 | github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= 258 | github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= 259 | github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= 260 | github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 261 | github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 262 | github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= 263 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 264 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 265 | github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 266 | github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= 267 | github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= 268 | github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= 269 | github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= 270 | github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= 271 | github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= 272 | github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= 273 | github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= 274 | github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= 275 | github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= 276 | github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= 277 | github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= 278 | github.com/imroc/req v0.3.0 h1:3EioagmlSG+z+KySToa+Ylo3pTFZs+jh3Brl7ngU12U= 279 | github.com/imroc/req v0.3.0/go.mod h1:F+NZ+2EFSo6EFXdeIbpfE9hcC233id70kf0byW97Caw= 280 | github.com/imroc/req v0.3.2 h1:M/JkeU6RPmX+WYvT2vaaOL0K+q8ufL5LxwvJc4xeB4o= 281 | github.com/imroc/req v0.3.2/go.mod h1:F+NZ+2EFSo6EFXdeIbpfE9hcC233id70kf0byW97Caw= 282 | github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= 283 | github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 284 | github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= 285 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 286 | github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 287 | github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 288 | github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 289 | github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= 290 | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 291 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= 292 | github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= 293 | github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= 294 | github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 295 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 296 | github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= 297 | github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= 298 | github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= 299 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 300 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 301 | github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 302 | github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= 303 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 304 | github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= 305 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 306 | github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 307 | github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= 308 | github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= 309 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 310 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= 311 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 312 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 313 | github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= 314 | github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= 315 | github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= 316 | github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= 317 | github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 318 | github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= 319 | github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 320 | github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= 321 | github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= 322 | github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= 323 | github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 324 | github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= 325 | github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= 326 | github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM= 327 | github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= 328 | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 329 | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= 330 | github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= 331 | github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 332 | github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= 333 | github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 334 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 335 | github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= 336 | github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= 337 | github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= 338 | github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= 339 | github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= 340 | github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 341 | github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= 342 | github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 343 | github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= 344 | github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= 345 | github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= 346 | github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 347 | github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= 348 | github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 349 | github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 350 | github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= 351 | github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 352 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 353 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 354 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 355 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 356 | github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= 357 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 358 | github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= 359 | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 360 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 361 | github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 362 | github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= 363 | github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= 364 | github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= 365 | github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= 366 | github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= 367 | github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= 368 | github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= 369 | github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= 370 | github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw= 371 | github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= 372 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 373 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 374 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 375 | github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= 376 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 377 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 378 | github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= 379 | github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= 380 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 381 | github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= 382 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 383 | github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= 384 | github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= 385 | github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= 386 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 387 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 388 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 389 | github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 390 | github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= 391 | github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 392 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 393 | github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= 394 | github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= 395 | github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= 396 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 397 | github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 398 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 399 | github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= 400 | github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 401 | github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= 402 | github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= 403 | github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= 404 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 405 | github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 406 | github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= 407 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 408 | github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= 409 | github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= 410 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 411 | github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= 412 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 413 | github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= 414 | github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= 415 | github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= 416 | github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= 417 | github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 418 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 419 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 420 | github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= 421 | github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= 422 | github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= 423 | github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= 424 | github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= 425 | github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= 426 | github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 427 | github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= 428 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= 429 | github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= 430 | github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= 431 | github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= 432 | github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= 433 | github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= 434 | github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= 435 | github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= 436 | github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= 437 | github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= 438 | github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= 439 | github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= 440 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 441 | github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= 442 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 443 | github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= 444 | github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= 445 | github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= 446 | github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= 447 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 448 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 449 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 450 | github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= 451 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 452 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 453 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 454 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 455 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 456 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 457 | github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= 458 | github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= 459 | github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= 460 | github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= 461 | github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= 462 | github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= 463 | github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= 464 | github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= 465 | github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= 466 | github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= 467 | github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= 468 | github.com/urfave/cli/v2 v2.10.2 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y= 469 | github.com/urfave/cli/v2 v2.10.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= 470 | github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= 471 | github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= 472 | github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= 473 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 474 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 475 | github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 476 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 477 | github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 478 | go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= 479 | go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= 480 | go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= 481 | go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= 482 | go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= 483 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 484 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= 485 | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 486 | go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 487 | go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 488 | go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= 489 | go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= 490 | go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= 491 | go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= 492 | go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= 493 | go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= 494 | go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= 495 | go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 496 | go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= 497 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 498 | golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 499 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 500 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 501 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 502 | golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= 503 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 504 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 505 | golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= 506 | golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 507 | golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= 508 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 509 | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 510 | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= 511 | golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= 512 | golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= 513 | golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 514 | golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 515 | golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 516 | golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= 517 | golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= 518 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= 519 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 520 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 521 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 522 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 523 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 524 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 525 | golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 526 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 527 | golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= 528 | golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 529 | golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 530 | golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 531 | golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 532 | golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= 533 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= 534 | golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 535 | golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= 536 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 537 | golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 538 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 539 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 540 | golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 541 | golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 542 | golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 543 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 544 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 545 | golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 546 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 547 | golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 548 | golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 549 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 550 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 551 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 552 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 553 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 554 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 555 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 556 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 557 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 558 | golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 559 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 560 | golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 561 | golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 562 | golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 563 | golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 564 | golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 565 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 566 | golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 567 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 568 | golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 569 | golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 570 | golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 571 | golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 572 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 573 | golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 574 | golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 575 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 576 | golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 577 | golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 578 | golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 579 | golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 580 | golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 581 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 582 | golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= 583 | golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= 584 | golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= 585 | golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 586 | golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 587 | golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= 588 | golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= 589 | golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= 590 | golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= 591 | golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= 592 | golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= 593 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 594 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 595 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 596 | golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 597 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 598 | golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 599 | golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 600 | golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 601 | golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 602 | golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 603 | golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 604 | golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 605 | golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 606 | golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 607 | golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 608 | golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 609 | golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 610 | golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= 611 | golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= 612 | golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= 613 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 614 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 615 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 616 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 617 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 618 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 619 | golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 620 | golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 621 | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 622 | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 623 | golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 624 | golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 625 | golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 626 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 627 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 628 | golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 629 | golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 630 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 631 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 632 | golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 633 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 634 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 635 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 636 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 637 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 638 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 639 | golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 640 | golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 641 | golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 642 | golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 643 | golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 644 | golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 645 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= 646 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 647 | golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 648 | golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 649 | golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 650 | golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 651 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 652 | golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 653 | golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 654 | golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 655 | golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 656 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 657 | golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 658 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 659 | golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 660 | golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 661 | golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 662 | golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 663 | golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 664 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 665 | golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= 666 | golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 667 | golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 668 | golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 669 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 670 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 671 | golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 672 | golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 673 | golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 674 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 675 | golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 676 | golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 677 | golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 678 | golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 679 | golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 680 | golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 681 | golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 682 | golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 683 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 684 | golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 685 | golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 686 | golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 687 | golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 688 | golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 689 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 690 | golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 691 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 692 | golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 693 | golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 694 | golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 695 | golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 696 | golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 697 | golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 698 | golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 699 | golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 700 | golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 701 | golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 702 | golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 703 | golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 704 | golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 705 | golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 706 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 707 | golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c h1:aFV+BgZ4svzjfabn8ERpuB4JI4N6/rdy1iusx77G3oU= 708 | golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 709 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 710 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 711 | golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 712 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 713 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 714 | golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= 715 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 716 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 717 | golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 718 | golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 719 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 720 | golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= 721 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 722 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 723 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 724 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 725 | golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 726 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 727 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 728 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 729 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 730 | golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 731 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 732 | golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 733 | golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 734 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 735 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 736 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 737 | golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 738 | golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 739 | golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 740 | golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 741 | golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 742 | golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 743 | golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 744 | golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 745 | golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 746 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 747 | golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 748 | golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 749 | golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 750 | golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 751 | golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 752 | golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 753 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 754 | golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 755 | golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 756 | golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 757 | golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 758 | golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 759 | golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= 760 | golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= 761 | golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= 762 | golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 763 | golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 764 | golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 765 | golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 766 | golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 767 | golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 768 | golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 769 | golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 770 | golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= 771 | golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 772 | golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 773 | golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 774 | golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 775 | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 776 | golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 777 | golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= 778 | golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 779 | golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 780 | golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 781 | golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 782 | golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 783 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 784 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 785 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 786 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 787 | golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 788 | golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= 789 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 790 | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= 791 | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 792 | google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 793 | google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 794 | google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 795 | google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 796 | google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 797 | google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 798 | google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 799 | google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 800 | google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 801 | google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= 802 | google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= 803 | google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= 804 | google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= 805 | google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= 806 | google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= 807 | google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= 808 | google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= 809 | google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= 810 | google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= 811 | google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= 812 | google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= 813 | google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= 814 | google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= 815 | google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= 816 | google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= 817 | google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= 818 | google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= 819 | google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= 820 | google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= 821 | google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= 822 | google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= 823 | google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= 824 | google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= 825 | google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= 826 | google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= 827 | google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= 828 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 829 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 830 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 831 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 832 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 833 | google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 834 | google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 835 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 836 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 837 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 838 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 839 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 840 | google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 841 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 842 | google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= 843 | google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 844 | google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 845 | google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 846 | google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 847 | google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 848 | google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 849 | google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= 850 | google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 851 | google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 852 | google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 853 | google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 854 | google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 855 | google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 856 | google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 857 | google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 858 | google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 859 | google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= 860 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= 861 | google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= 862 | google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 863 | google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 864 | google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 865 | google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 866 | google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 867 | google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 868 | google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 869 | google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 870 | google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 871 | google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 872 | google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 873 | google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 874 | google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 875 | google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 876 | google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= 877 | google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= 878 | google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= 879 | google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= 880 | google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= 881 | google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= 882 | google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= 883 | google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= 884 | google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= 885 | google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= 886 | google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= 887 | google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= 888 | google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= 889 | google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= 890 | google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= 891 | google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= 892 | google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= 893 | google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= 894 | google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= 895 | google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= 896 | google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= 897 | google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= 898 | google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= 899 | google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= 900 | google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= 901 | google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= 902 | google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= 903 | google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= 904 | google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= 905 | google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= 906 | google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= 907 | google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= 908 | google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= 909 | google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= 910 | google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= 911 | google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= 912 | google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= 913 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 914 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= 915 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 916 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 917 | google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= 918 | google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 919 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 920 | google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 921 | google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= 922 | google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= 923 | google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 924 | google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 925 | google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 926 | google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= 927 | google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= 928 | google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= 929 | google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= 930 | google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= 931 | google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= 932 | google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= 933 | google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= 934 | google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= 935 | google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= 936 | google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= 937 | google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= 938 | google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= 939 | google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= 940 | google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= 941 | google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= 942 | google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= 943 | google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= 944 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 945 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 946 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 947 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 948 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 949 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 950 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 951 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 952 | google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= 953 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 954 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 955 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 956 | google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 957 | google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 958 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 959 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 960 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= 961 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 962 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= 963 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 964 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 965 | gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= 966 | gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 967 | gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 968 | gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= 969 | gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 970 | gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 971 | gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 972 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 973 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 974 | gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 975 | gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= 976 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 977 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 978 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 979 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 980 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 981 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 982 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 983 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 984 | gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 985 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 986 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 987 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 988 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 989 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 990 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 991 | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 992 | honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 993 | honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 994 | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 995 | rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= 996 | rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= 997 | sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= 998 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | "os" 7 | 8 | "github.com/mitchellh/go-homedir" 9 | "github.com/urfave/cli/v2" 10 | "github.com/zsakvo/Cirno-go/ciweimao" 11 | "github.com/zsakvo/Cirno-go/config" 12 | "github.com/zsakvo/Cirno-go/util" 13 | ) 14 | 15 | var canExec bool 16 | 17 | func init() { 18 | dir, _ := homedir.Dir() 19 | expandedDir, _ := homedir.Expand(dir) 20 | if !util.IsExist(expandedDir + "/Cirno/download") { 21 | err := os.MkdirAll(expandedDir+"/Cirno/download", os.ModePerm) 22 | util.PanicErr(err) 23 | } 24 | if util.IsExist(expandedDir + "/Cirno/config.yaml") { 25 | canExec = true 26 | } else { 27 | canExec = false 28 | } 29 | config.InitConfig(canExec) 30 | } 31 | 32 | func main() { 33 | bookType := "txt" 34 | app := &cli.App{ 35 | Name: "cirno", 36 | Usage: "download e-books from hbooker.com", 37 | Flags: []cli.Flag{ 38 | &cli.StringFlag{ 39 | Name: "type", 40 | Value: "txt", 41 | Usage: "set books type", 42 | Aliases: []string{"t"}, 43 | Destination: &bookType, 44 | }, 45 | }, 46 | Action: func(c *cli.Context) error { 47 | var args = c.Args() 48 | if args.Get(0) == "login" { 49 | ciweimao.Login() 50 | } else { 51 | if !canExec { 52 | fmt.Println("Please login first.") 53 | os.Exit(0) 54 | } 55 | switch args.Get(0) { 56 | case "login": 57 | ciweimao.Login() 58 | case "search": 59 | ciweimao.Search(args.Get(1), 0, bookType) 60 | case "download": 61 | switch bookType { 62 | case "txt": 63 | ciweimao.DownloadText(args.Get(1)) 64 | case "epub": 65 | ciweimao.DownloadEpub(args.Get(1)) 66 | default: 67 | fmt.Println("invlid type.") 68 | os.Exit(0) 69 | } 70 | default: 71 | fmt.Println("invlid args.") 72 | os.Exit(0) 73 | } 74 | } 75 | 76 | return nil 77 | }, 78 | } 79 | 80 | err := app.Run(os.Args) 81 | if err != nil { 82 | log.Fatal(err) 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /structure/chapter.go: -------------------------------------------------------------------------------- 1 | package structure 2 | 3 | type ChapterStruct struct { 4 | Code string `json:"code"` 5 | Data ChapterData `json:"data"` 6 | } 7 | 8 | type ChapterData struct { 9 | ChapterList []ChapterList `json:"chapter_list"` 10 | MaxUpdateTime string `json:"max_update_time"` 11 | MaxChapterIndex string `json:"max_chapter_index"` 12 | } 13 | 14 | type ChapterList struct { 15 | ChapterID string `json:"chapter_id"` 16 | ChapterIndex string `json:"chapter_index"` 17 | ChapterTitle string `json:"chapter_title"` 18 | WordCount string `json:"word_count"` 19 | TsukkomiAmount string `json:"tsukkomi_amount"` 20 | IsPaid string `json:"is_paid"` 21 | Mtime string `json:"mtime"` 22 | IsValid string `json:"is_valid"` 23 | AuthAccess string `json:"auth_access"` 24 | } 25 | -------------------------------------------------------------------------------- /structure/config.go: -------------------------------------------------------------------------------- 1 | package structure 2 | 3 | type ConfigStruct struct { 4 | App App `mapstructure:"app"` 5 | Web Web `mapstructure:"web"` 6 | Extra Extra `mapstructure:"extra"` 7 | } 8 | 9 | type App struct { 10 | UserName string `mapstructure:"user_name"` 11 | Password string `mapstructure:"password"` 12 | Account string `mapstructure:"account"` 13 | LoginToken string `mapstructure:"login_token"` 14 | DeviceToken string `mapstructure:"device_token"` 15 | AppVersion string `mapstructure:"app_version"` 16 | UserAgent string `mapstructure:"user_agent"` 17 | DefaultKey string `mapstructure:"default_key"` 18 | HostUrl string `mapstructure:"host_url"` 19 | } 20 | 21 | type Web struct { 22 | Port int `mapstructure:"port"` 23 | } 24 | 25 | type Extra struct { 26 | Coroutines int `mapstructure:"coroutines"` 27 | Cpic bool `mapstructure:"cpic"` 28 | CacheNoPaid bool `mapstructure:"cache_no_paid"` 29 | } 30 | -------------------------------------------------------------------------------- /structure/content.go: -------------------------------------------------------------------------------- 1 | package structure 2 | 3 | type ContentStruct struct { 4 | Code string `json:"code"` 5 | Data ContentData `json:"data"` 6 | } 7 | 8 | type ContentData struct { 9 | ChapterInfo ChapterInfo `json:"chapter_info"` 10 | } 11 | 12 | type ChapterInfo struct { 13 | ChapterID string `json:"chapter_id"` 14 | BookID string `json:"book_id"` 15 | DivisionID string `json:"division_id"` 16 | UnitHlb string `json:"unit_hlb"` 17 | ChapterIndex string `json:"chapter_index"` 18 | ChapterTitle string `json:"chapter_title"` 19 | AuthorSay string `json:"author_say"` 20 | WordCount string `json:"word_count"` 21 | Discount string `json:"discount"` 22 | IsPaid string `json:"is_paid"` 23 | AuthAccess string `json:"auth_access"` 24 | BuyAmount string `json:"buy_amount"` 25 | TsukkomiAmount string `json:"tsukkomi_amount"` 26 | TotalHlb string `json:"total_hlb"` 27 | Uptime string `json:"uptime"` 28 | Mtime string `json:"mtime"` 29 | RecommendBookInfo string `json:"recommend_book_info"` 30 | TxtContent string `json:"txt_content"` 31 | } 32 | -------------------------------------------------------------------------------- /structure/detail.go: -------------------------------------------------------------------------------- 1 | package structure 2 | 3 | type DetailStruct struct { 4 | Code string `json:"code"` 5 | Data DetailData `json:"data"` 6 | ScrollChests []ScrollChest `json:"scroll_chests"` 7 | } 8 | 9 | type DetailData struct { 10 | BookInfo BookInfo `json:"book_info"` 11 | IsInshelf string `json:"is_inshelf"` 12 | IsBuy string `json:"is_buy"` 13 | UpReaderInfo UpReaderInfo `json:"up_reader_info"` 14 | RelatedList []BookInfo `json:"related_list"` 15 | BookShortageReommendList []BookShortageReommendList `json:"book_shortage_reommend_list"` 16 | } 17 | 18 | type BookInfo struct { 19 | BookID string `json:"book_id"` 20 | BookName string `json:"book_name"` 21 | Description string `json:"description"` 22 | BookSrc string `json:"book_src"` 23 | CategoryIndex string `json:"category_index"` 24 | Tag string `json:"tag"` 25 | TotalWordCount string `json:"total_word_count"` 26 | UpStatus string `json:"up_status"` 27 | UpdateStatus string `json:"update_status"` 28 | IsPaid string `json:"is_paid"` 29 | Discount string `json:"discount"` 30 | DiscountEndTime string `json:"discount_end_time"` 31 | Cover string `json:"cover"` 32 | AuthorName string `json:"author_name"` 33 | Uptime string `json:"uptime"` 34 | Newtime string `json:"newtime"` 35 | ReviewAmount string `json:"review_amount"` 36 | RewardAmount string `json:"reward_amount"` 37 | ChapterAmount string `json:"chapter_amount"` 38 | IsOriginal string `json:"is_original"` 39 | TotalClick string `json:"total_click"` 40 | MonthClick string `json:"month_click"` 41 | WeekClick string `json:"week_click"` 42 | MonthNoVipClick string `json:"month_no_vip_click"` 43 | WeekNoVipClick string `json:"week_no_vip_click"` 44 | TotalRecommend string `json:"total_recommend"` 45 | MonthRecommend string `json:"month_recommend"` 46 | WeekRecommend string `json:"week_recommend"` 47 | TotalFavor string `json:"total_favor"` 48 | MonthFavor string `json:"month_favor"` 49 | WeekFavor string `json:"week_favor"` 50 | CurrentYp string `json:"current_yp"` 51 | TotalYp string `json:"total_yp"` 52 | CurrentBlade string `json:"current_blade"` 53 | TotalBlade string `json:"total_blade"` 54 | WeekFansValue string `json:"week_fans_value"` 55 | MonthFansValue string `json:"month_fans_value"` 56 | TotalFansValue string `json:"total_fans_value"` 57 | LastChapterInfo LastChapterInfo `json:"last_chapter_info"` 58 | TagList []TagList `json:"tag_list"` 59 | BookType string `json:"book_type"` 60 | TransverseCover string `json:"transverse_cover"` 61 | } 62 | 63 | type LastChapterInfo struct { 64 | ChapterID string `json:"chapter_id"` 65 | BookID string `json:"book_id"` 66 | ChapterIndex string `json:"chapter_index"` 67 | ChapterTitle string `json:"chapter_title"` 68 | Uptime string `json:"uptime"` 69 | Mtime string `json:"mtime"` 70 | RecommendBookInfo string `json:"recommend_book_info"` 71 | } 72 | 73 | type TagList struct { 74 | TagID string `json:"tag_id"` 75 | TagType string `json:"tag_type"` 76 | TagName string `json:"tag_name"` 77 | } 78 | 79 | type BookShortageReommendList struct { 80 | BookID string `json:"book_id"` 81 | BookName string `json:"book_name"` 82 | Cover string `json:"cover"` 83 | Discount string `json:"discount"` 84 | DiscountEndTime string `json:"discount_end_time"` 85 | Introduce string `json:"introduce"` 86 | Tag string `json:"tag"` 87 | TotalFavor string `json:"total_favor"` 88 | } 89 | 90 | type UpReaderInfo struct { 91 | ReaderID string `json:"reader_id"` 92 | Account string `json:"account"` 93 | ReaderName string `json:"reader_name"` 94 | AvatarURL string `json:"avatar_url"` 95 | AvatarThumbURL string `json:"avatar_thumb_url"` 96 | BaseStatus string `json:"base_status"` 97 | ExpLV string `json:"exp_lv"` 98 | ExpValue string `json:"exp_value"` 99 | Gender string `json:"gender"` 100 | VipLV string `json:"vip_lv"` 101 | VipValue string `json:"vip_value"` 102 | IsAuthor string `json:"is_author"` 103 | IsUploader string `json:"is_uploader"` 104 | IsFollowing string `json:"is_following"` 105 | UsedDecoration []interface{} `json:"used_decoration"` 106 | IsInBlacklist string `json:"is_in_blacklist"` 107 | Ctime string `json:"ctime"` 108 | } 109 | 110 | type ScrollChest struct { 111 | ChestID string `json:"chest_id"` 112 | ReaderName string `json:"reader_name"` 113 | Gender string `json:"gender"` 114 | AvatarURL string `json:"avatar_url"` 115 | BookName string `json:"book_name"` 116 | Cost int64 `json:"cost"` 117 | ChestImgURL string `json:"chest_img_url"` 118 | PropID int64 `json:"prop_id"` 119 | Content string `json:"content"` 120 | } 121 | -------------------------------------------------------------------------------- /structure/division.go: -------------------------------------------------------------------------------- 1 | package structure 2 | 3 | type DivisionStruct struct { 4 | Code string `json:"code"` 5 | Data DivisionData `json:"data"` 6 | } 7 | 8 | type DivisionData struct { 9 | DivisionList []DivisionList `json:"division_list"` 10 | } 11 | 12 | type DivisionList struct { 13 | DivisionID string `json:"division_id"` 14 | DivisionIndex string `json:"division_index"` 15 | DivisionName string `json:"division_name"` 16 | Description string `json:"description"` 17 | } 18 | -------------------------------------------------------------------------------- /structure/key.go: -------------------------------------------------------------------------------- 1 | package structure 2 | 3 | type KeyStruct struct { 4 | Code string `json:"code"` 5 | Data KeyData `json:"data"` 6 | } 7 | 8 | type KeyData struct { 9 | Command string `json:"command"` 10 | } 11 | -------------------------------------------------------------------------------- /structure/login.go: -------------------------------------------------------------------------------- 1 | package structure 2 | 3 | type LoginStruct struct { 4 | Code string `json:"code"` 5 | Data LoginData `json:"data"` 6 | } 7 | 8 | type LoginData struct { 9 | LoginToken string `json:"login_token"` 10 | UserCode string `json:"user_code"` 11 | ReaderInfo ReaderInfo `json:"reader_info"` 12 | PropInfo PropInfo `json:"prop_info"` 13 | IsSetYoung string `json:"is_set_young"` 14 | } 15 | 16 | type PropInfo struct { 17 | RESTGiftHlb string `json:"rest_gift_hlb"` 18 | RESTHlb string `json:"rest_hlb"` 19 | RESTYp string `json:"rest_yp"` 20 | RESTRecommend string `json:"rest_recommend"` 21 | RESTTotalBlade string `json:"rest_total_blade"` 22 | RESTMonthBlade string `json:"rest_month_blade"` 23 | RESTTotal100 string `json:"rest_total_100"` 24 | RESTTotal588 string `json:"rest_total_588"` 25 | RESTTotal1688 string `json:"rest_total_1688"` 26 | RESTTotal5000 string `json:"rest_total_5000"` 27 | RESTTotal10000 string `json:"rest_total_10000"` 28 | RESTTotal100000 string `json:"rest_total_100000"` 29 | RESTTotal50000 string `json:"rest_total_50000"` 30 | RESTTotal160000 string `json:"rest_total_160000"` 31 | } 32 | 33 | type ReaderInfo struct { 34 | ReaderID string `json:"reader_id"` 35 | Account string `json:"account"` 36 | IsBind string `json:"is_bind"` 37 | IsBindQq string `json:"is_bind_qq"` 38 | IsBindWeixin string `json:"is_bind_weixin"` 39 | IsBindHuawei string `json:"is_bind_huawei"` 40 | IsBindApple string `json:"is_bind_apple"` 41 | PhoneNum string `json:"phone_num"` 42 | MobileVal string `json:"mobileVal"` 43 | Email string `json:"email"` 44 | License string `json:"license"` 45 | ReaderName string `json:"reader_name"` 46 | AvatarURL string `json:"avatar_url"` 47 | AvatarThumbURL string `json:"avatar_thumb_url"` 48 | BaseStatus string `json:"base_status"` 49 | ExpLV string `json:"exp_lv"` 50 | ExpValue string `json:"exp_value"` 51 | Gender string `json:"gender"` 52 | VipLV string `json:"vip_lv"` 53 | VipValue string `json:"vip_value"` 54 | IsAuthor string `json:"is_author"` 55 | IsUploader string `json:"is_uploader"` 56 | BookAge string `json:"book_age"` 57 | CategoryPrefer []interface{} `json:"category_prefer"` 58 | UsedDecoration []interface{} `json:"used_decoration"` 59 | Rank string `json:"rank"` 60 | Ctime string `json:"ctime"` 61 | } 62 | -------------------------------------------------------------------------------- /structure/search.go: -------------------------------------------------------------------------------- 1 | package structure 2 | 3 | type SearchStruct struct { 4 | Code string `json:"code"` 5 | Data SearchData `json:"data"` 6 | } 7 | 8 | type SearchData struct { 9 | TagList []SearchTagList `json:"tag_list"` 10 | BookList []BookList `json:"book_list"` 11 | } 12 | 13 | type BookList struct { 14 | BookID string `json:"book_id"` 15 | BookName string `json:"book_name"` 16 | Description string `json:"description"` 17 | BookSrc string `json:"book_src"` 18 | CategoryIndex string `json:"category_index"` 19 | Tag string `json:"tag"` 20 | TotalWordCount string `json:"total_word_count"` 21 | UpStatus string `json:"up_status"` 22 | UpdateStatus string `json:"update_status"` 23 | IsPaid string `json:"is_paid"` 24 | Discount string `json:"discount"` 25 | DiscountEndTime string `json:"discount_end_time"` 26 | Cover string `json:"cover"` 27 | AuthorName string `json:"author_name"` 28 | Uptime string `json:"uptime"` 29 | Newtime string `json:"newtime"` 30 | ReviewAmount string `json:"review_amount"` 31 | RewardAmount string `json:"reward_amount"` 32 | ChapterAmount string `json:"chapter_amount"` 33 | IsOriginal string `json:"is_original"` 34 | TotalClick string `json:"total_click"` 35 | MonthClick string `json:"month_click"` 36 | WeekClick string `json:"week_click"` 37 | MonthNoVipClick string `json:"month_no_vip_click"` 38 | WeekNoVipClick string `json:"week_no_vip_click"` 39 | TotalRecommend string `json:"total_recommend"` 40 | MonthRecommend string `json:"month_recommend"` 41 | WeekRecommend string `json:"week_recommend"` 42 | TotalFavor string `json:"total_favor"` 43 | MonthFavor string `json:"month_favor"` 44 | WeekFavor string `json:"week_favor"` 45 | CurrentYp string `json:"current_yp"` 46 | TotalYp string `json:"total_yp"` 47 | CurrentBlade string `json:"current_blade"` 48 | TotalBlade string `json:"total_blade"` 49 | WeekFansValue string `json:"week_fans_value"` 50 | MonthFansValue string `json:"month_fans_value"` 51 | TotalFansValue string `json:"total_fans_value"` 52 | LastChapterInfo SearchLastChapterInfo `json:"last_chapter_info"` 53 | BookType string `json:"book_type"` 54 | TransverseCover string `json:"transverse_cover"` 55 | } 56 | 57 | type SearchLastChapterInfo struct { 58 | ChapterID string `json:"chapter_id"` 59 | BookID string `json:"book_id"` 60 | ChapterIndex string `json:"chapter_index"` 61 | ChapterTitle string `json:"chapter_title"` 62 | Uptime string `json:"uptime"` 63 | Mtime string `json:"mtime"` 64 | RecommendBookInfo string `json:"recommend_book_info"` 65 | } 66 | 67 | type SearchTagList struct { 68 | TagName string `json:"tag_name"` 69 | Num string `json:"num"` 70 | } 71 | -------------------------------------------------------------------------------- /util/decode.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "crypto/aes" 5 | "crypto/cipher" 6 | "crypto/sha256" 7 | "encoding/base64" 8 | ) 9 | 10 | var ( 11 | //IV 偏移量 12 | IV = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 13 | ) 14 | 15 | //SHA256 sha256 编码 16 | func SHA256(data []byte) []byte { 17 | ret := sha256.Sum256(data) 18 | return ret[:] 19 | } 20 | 21 | //Base64Decode Base64 解码 22 | func Base64Decode(encoded string) ([]byte, error) { 23 | decoded, err := base64.StdEncoding.DecodeString(encoded) 24 | if err != nil { 25 | return nil, err 26 | } 27 | return decoded, nil 28 | } 29 | 30 | //LoadKey 读取解密密钥 31 | func LoadKey(EncryptKey string) []byte { 32 | Key := SHA256([]byte(EncryptKey)) 33 | return Key[:32] 34 | } 35 | 36 | //AESDecrypt AES 解密 37 | func AESDecrypt(EncryptKey string, ciphertext []byte) ([]byte, error) { 38 | key := LoadKey(EncryptKey) 39 | block, err := aes.NewCipher(key) 40 | if err != nil { 41 | return nil, err 42 | } 43 | blockModel := cipher.NewCBCDecrypter(block, IV) 44 | plainText := make([]byte, len(ciphertext)) 45 | blockModel.CryptBlocks(plainText, ciphertext) 46 | plainText = PKCS7UnPadding(plainText) 47 | return plainText, nil 48 | } 49 | 50 | //PKCS7UnPadding 对齐 51 | func PKCS7UnPadding(plainText []byte) []byte { 52 | length := len(plainText) 53 | unpadding := int(plainText[length-1]) 54 | return plainText[:(length - unpadding)] 55 | } 56 | 57 | //Decode 入口函数 58 | func Decode(str string, EncryptKey string) ([]byte, error) { 59 | var err error 60 | var decoded, raw []byte 61 | decoded, err = Base64Decode(str) 62 | if err != nil { 63 | panic(err) 64 | } 65 | raw, err = AESDecrypt(EncryptKey, decoded) 66 | if err != nil { 67 | panic(err) 68 | } 69 | return raw, err 70 | } 71 | -------------------------------------------------------------------------------- /util/err.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | "regexp" 7 | "strconv" 8 | "strings" 9 | ) 10 | 11 | func unicodeToZh(raw []byte) ([]byte, error) { 12 | str, err := strconv.Unquote(strings.Replace(strconv.Quote(string(raw)), `\\u`, `\u`, -1)) 13 | if err != nil { 14 | return nil, err 15 | } 16 | return []byte(str), nil 17 | } 18 | 19 | func PanicErr(err error) { 20 | if err != nil { 21 | fmt.Println(err) 22 | os.Exit(0) 23 | } 24 | } 25 | 26 | func ErrTip(str string) string { 27 | var valid = regexp.MustCompile(`"tip":"(\S*)"`) 28 | var unicode = valid.FindAllStringSubmatch(str, -1)[0][1] 29 | v, _ := unicodeToZh([]byte(unicode)) 30 | return "err: " + string(v) 31 | } 32 | -------------------------------------------------------------------------------- /util/file.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "os" 5 | "path/filepath" 6 | ) 7 | 8 | func IsExist(path string) bool { 9 | _, err := os.Stat(path) 10 | if err != nil { 11 | return os.IsExist(err) 12 | } 13 | return true 14 | } 15 | 16 | func RemoveContents(dir string) error { 17 | d, err := os.Open(dir) 18 | if err != nil { 19 | return nil 20 | } 21 | defer d.Close() 22 | names, err := d.Readdirnames(-1) 23 | if err != nil { 24 | return err 25 | } 26 | for _, name := range names { 27 | err = os.RemoveAll(filepath.Join(dir, name)) 28 | if err != nil { 29 | return err 30 | } 31 | } 32 | os.RemoveAll(dir) 33 | return nil 34 | } 35 | -------------------------------------------------------------------------------- /util/http.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "errors" 5 | "strings" 6 | "time" 7 | 8 | "github.com/imroc/req" 9 | "github.com/zsakvo/Cirno-go/config" 10 | ) 11 | 12 | var client *req.Req 13 | 14 | func Get(url string, paras req.Param) ([]byte, error) { 15 | cfg := config.Config 16 | var err error 17 | var r *req.Resp 18 | var res []byte 19 | var param req.Param 20 | if url == "/signup/login" { 21 | param = req.Param{ 22 | "app_version": cfg.App.AppVersion, 23 | "device_token": cfg.App.DeviceToken, 24 | } 25 | } else { 26 | param = req.Param{ 27 | "account": cfg.App.Account, 28 | "device_token": cfg.App.DeviceToken, 29 | "app_version": cfg.App.AppVersion, 30 | "login_token": cfg.App.LoginToken, 31 | } 32 | } 33 | for k, v := range paras { 34 | param[k] = v 35 | } 36 | if client == nil { 37 | client = req.New() 38 | } 39 | client.SetTimeout(20 * time.Second) 40 | r, err = client.Get(cfg.App.HostUrl+url, param, req.Header{"User-Agent": cfg.App.UserAgent}) 41 | if err != nil { 42 | return nil, err 43 | } 44 | res, err = Decode(r.String(), cfg.App.DefaultKey) 45 | if !strings.Contains(string(res), "100000") { 46 | err = errors.New(ErrTip(string(res))) 47 | } 48 | return res, err 49 | } 50 | -------------------------------------------------------------------------------- /util/zip.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import ( 4 | "archive/zip" 5 | "io" 6 | "log" 7 | "os" 8 | "path/filepath" 9 | "strings" 10 | ) 11 | 12 | func isExist(path string) bool { 13 | _, err := os.Stat(path) 14 | if err != nil { 15 | return os.IsExist(err) 16 | } 17 | return true 18 | } 19 | 20 | func CompressEpub(tmp, dst string) error { 21 | 22 | //检测是否存在,若存在,则移除 23 | if isExist(dst) { 24 | err := os.Remove(dst) 25 | PanicErr(err) 26 | } 27 | 28 | // 创建准备写入的文件 29 | fw, err := os.Create(dst) 30 | if err != nil { 31 | return err 32 | } 33 | defer fw.Close() 34 | 35 | // 通过 fw 来创建 zip.Write 36 | zw := zip.NewWriter(fw) 37 | defer func() { 38 | // 检测一下是否成功关闭 39 | if err := zw.Close(); err != nil { 40 | log.Fatalln(err) 41 | } 42 | }() 43 | 44 | // 下面来将文件写入 zw,因为有可能会有很多个目录及文件,所以递归处理 45 | return filepath.Walk(tmp, func(path string, fi os.FileInfo, errBack error) (err error) { 46 | if errBack != nil { 47 | return errBack 48 | } 49 | 50 | // 通过文件信息,创建 zip 的文件信息 51 | fh, err := zip.FileInfoHeader(fi) 52 | if err != nil { 53 | return 54 | } 55 | 56 | // 替换文件信息中的文件名 57 | if path == tmp { 58 | return 59 | } 60 | 61 | s := strings.Replace(path, tmp, "", -1) 62 | s = strings.TrimPrefix(s, "/") 63 | s = strings.Replace(s, "\\", "/", -1) 64 | fh.Name = s 65 | 66 | // 这步开始没有加,会发现解压的时候说它不是个目录 67 | if fi.IsDir() { 68 | fh.Name += "/" 69 | } 70 | 71 | // 写入文件信息,并返回一个 Write 结构 72 | w, err := zw.CreateHeader(fh) 73 | if err != nil { 74 | return 75 | } 76 | 77 | // 检测,如果不是标准文件就只写入头信息,不写入文件数据到 w 78 | // 如目录,也没有数据需要写 79 | if !fh.Mode().IsRegular() { 80 | return nil 81 | } 82 | 83 | // 打开要压缩的文件 84 | fr, err := os.Open(path) 85 | if err != nil { 86 | return 87 | } 88 | defer fr.Close() 89 | if err != nil { 90 | return 91 | } 92 | // 将打开的文件 Copy 到 w 93 | _, err = io.Copy(w, fr) 94 | if err != nil { 95 | return 96 | } 97 | // n, err := io.Copy(w, fr) 98 | // 输出压缩的内容 99 | return nil 100 | }) 101 | } 102 | --------------------------------------------------------------------------------