├── .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 |
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, "
"
30 | }
31 | return str
32 | }
33 |
34 | func getImg(str string) string {
35 | 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 |
--------------------------------------------------------------------------------