diff --git a/docs/categories/all.html b/docs/categories/all.html
index 04703ac9..5f68deeb 100644
--- a/docs/categories/all.html
+++ b/docs/categories/all.html
@@ -334,7 +334,7 @@
Yes
Yes |
No |
- 214 |
+ 215 |
@@ -357,7 +357,7 @@ Yes |
Yes |
Yes |
- 6276 |
+ 6290 |
@@ -380,7 +380,7 @@ Yes |
No |
No |
- 1181 |
+ 1182 |
@@ -466,7 +466,7 @@ Yes |
Yes |
Yes |
- 23386 |
+ 23390 |
@@ -887,7 +887,7 @@ No |
Yes |
Yes |
- 21485 |
+ 21490 |
@@ -956,7 +956,7 @@ No |
Yes |
No |
- 154 |
+ 153 |
@@ -1091,7 +1091,7 @@ Yes |
Yes |
Yes |
- 8892 |
+ 8893 |
@@ -1587,7 +1587,7 @@ Yes |
Yes |
Yes |
- 1102 |
+ 1105 |
@@ -1610,7 +1610,7 @@ No |
Yes |
No |
- 1107 |
+ 1108 |
@@ -1702,7 +1702,7 @@ No |
Yes |
Yes |
- 8553 |
+ 8555 |
@@ -1834,7 +1834,7 @@ No |
Yes |
No |
- 1682 |
+ 1683 |
@@ -1989,7 +1989,7 @@ No |
Yes |
No |
- 1639 |
+ 1640 |
@@ -2033,7 +2033,7 @@ Yes |
Yes |
Yes |
- 2479 |
+ 2480 |
@@ -2230,7 +2230,7 @@ No |
Yes |
Yes |
- 1097 |
+ 1096 |
@@ -2402,7 +2402,7 @@ No |
Yes |
No |
- 469 |
+ 470 |
@@ -2641,7 +2641,7 @@ No |
No |
Yes |
- 9493 |
+ 9494 |
@@ -2687,7 +2687,7 @@ No |
Yes |
Yes |
- 1867 |
+ 1868 |
@@ -2710,7 +2710,7 @@ No |
Yes |
Yes |
- 6730 |
+ 6734 |
@@ -2756,7 +2756,7 @@ No |
Yes |
Yes |
- 16938 |
+ 16940 |
@@ -2777,7 +2777,7 @@ No |
Yes |
Yes |
- 4602 |
+ 4603 |
@@ -3279,7 +3279,7 @@ No |
Yes |
No |
- 5045 |
+ 5046 |
@@ -3302,7 +3302,7 @@ No |
Yes |
No |
- 483 |
+ 485 |
@@ -3415,7 +3415,7 @@ Yes |
Yes |
No |
- 3918 |
+ 3917 |
@@ -3438,7 +3438,7 @@ No |
Yes |
No |
- 4355 |
+ 4357 |
@@ -3549,7 +3549,7 @@ Yes |
Yes |
No |
- 94 |
+ 95 |
@@ -3593,7 +3593,7 @@ No |
Yes |
Yes |
- 5927 |
+ 5928 |
@@ -3637,7 +3637,7 @@ No |
Yes |
Yes |
- 12576 |
+ 12577 |
@@ -3878,7 +3878,7 @@ No |
Yes |
No |
- 28227 |
+ 28232 |
@@ -4053,7 +4053,7 @@ Yes |
Yes |
Yes |
- 1739 |
+ 1738 |
@@ -4145,7 +4145,7 @@ Yes |
Yes |
No |
- 1122 |
+ 1123 |
@@ -4279,7 +4279,7 @@ Yes |
Yes |
Yes |
- 77 |
+ 78 |
@@ -4874,7 +4874,7 @@ No |
Yes |
No |
- 1973 |
+ 1974 |
@@ -4897,7 +4897,7 @@ Yes |
Yes |
Yes |
- 2605 |
+ 2612 |
@@ -4964,7 +4964,7 @@ Yes |
Yes |
No |
- 1385 |
+ 1388 |
@@ -5121,7 +5121,7 @@ No |
Yes |
No |
- 822 |
+ 824 |
@@ -5144,7 +5144,7 @@ Yes |
Yes |
No |
- 1946 |
+ 1951 |
@@ -5282,7 +5282,7 @@ Yes |
Yes |
No |
- 62 |
+ 64 |
@@ -5305,7 +5305,7 @@ No |
Yes |
No |
- 76264 |
+ 76290 |
@@ -5328,7 +5328,7 @@ Yes |
Yes |
No |
- 26410 |
+ 26418 |
@@ -5351,7 +5351,7 @@ Yes |
Yes |
No |
- 23386 |
+ 23390 |
@@ -5372,7 +5372,7 @@ No |
Yes |
No |
- 7374 |
+ 7375 |
@@ -5393,7 +5393,7 @@ No |
Yes |
No |
- 6308 |
+ 6311 |
@@ -5416,7 +5416,7 @@ No |
Yes |
No |
- 6116 |
+ 6120 |
@@ -5439,7 +5439,7 @@ Yes |
Yes |
Yes |
- 5651 |
+ 5652 |
@@ -5481,7 +5481,7 @@ No |
Yes |
No |
- 3849 |
+ 3851 |
@@ -5504,7 +5504,7 @@ No |
Yes |
No |
- 3261 |
+ 3263 |
@@ -5525,7 +5525,7 @@ No |
Yes |
No |
- 2695 |
+ 2697 |
@@ -5546,7 +5546,7 @@ Yes |
Yes |
No |
- 2621 |
+ 2622 |
@@ -5567,7 +5567,7 @@ No |
Yes |
No |
- 2342 |
+ 2343 |
@@ -5588,7 +5588,7 @@ No |
Yes |
No |
- 2294 |
+ 2297 |
@@ -5718,7 +5718,7 @@ No |
Yes |
No |
- 1339 |
+ 1338 |
@@ -5781,7 +5781,7 @@ No |
Yes |
No |
- 919 |
+ 920 |
@@ -5951,7 +5951,7 @@ Yes |
Yes |
No |
- 639 |
+ 638 |
@@ -6604,7 +6604,7 @@ No |
Yes |
No |
- 267 |
+ 268 |
@@ -6986,7 +6986,7 @@ No |
Yes |
No |
- 197 |
+ 198 |
@@ -7112,7 +7112,7 @@ No |
Yes |
No |
- 186 |
+ 187 |
@@ -7133,7 +7133,7 @@ No |
Yes |
No |
- 182 |
+ 184 |
@@ -7786,7 +7786,7 @@ No |
Yes |
No |
- 103 |
+ 104 |
@@ -8101,7 +8101,7 @@ No |
Yes |
No |
- 77 |
+ 78 |
@@ -9505,23 +9505,23 @@
- vitepress-theme-openapi |
+ vitepress-openapi |
Generate VitePress API Docs from OpenAPI specifications |
No
|
- Link
+ Link
|
Yes |
Yes |
No |
- 33 |
+ 35 |
-
+
@@ -10610,7 +10610,7 @@ No |
Yes |
No |
- 19 |
+ 20 |
@@ -12907,7 +12907,7 @@ No |
Yes |
No |
- 8 |
+ 7 |
@@ -24751,7 +24751,7 @@ Yes |
Yes |
No |
- 2245 |
+ 2249 |
@@ -25318,7 +25318,7 @@ No |
Yes |
Yes |
- 2902 |
+ 2907 |
@@ -25927,7 +25927,7 @@ No |
Yes |
Yes |
- 499 |
+ 500 |
@@ -26264,7 +26264,7 @@ No |
Yes |
Yes |
- 1109 |
+ 1110 |
@@ -27023,7 +27023,7 @@ Yes |
Yes |
Yes |
- 669 |
+ 670 |
@@ -27107,7 +27107,7 @@ No |
Yes |
No |
- 26639 |
+ 26657 |
@@ -31165,7 +31165,7 @@ No |
No |
No |
- 7374 |
+ 7375 |
@@ -32155,7 +32155,7 @@ No |
Yes |
No |
- 4942 |
+ 4944 |
@@ -32749,7 +32749,7 @@ No |
Yes |
No |
- 1107 |
+ 1108 |
@@ -33330,7 +33330,7 @@ Connexion (link)
|
Forks |
- 761 |
+ 762 |
Created |
@@ -33577,7 +33577,7 @@ Rate My OpenAPI (link)
Stars |
- 214 |
+ 215 |
Watchers |
@@ -33593,7 +33593,7 @@ Rate My OpenAPI (link)
Last Updated |
- 2024-10-04T21:39:44Z |
+ 2024-10-06T04:37:07Z |
Archived |
@@ -33628,7 +33628,7 @@ Scalar (link)
Stars |
- 6276 |
+ 6290 |
Watchers |
@@ -33636,7 +33636,7 @@ Scalar (link)
Forks |
- 204 |
+ 203 |
Created |
@@ -33644,7 +33644,7 @@ Scalar (link)
Last Updated |
- 2024-10-06T03:22:27Z |
+ 2024-10-07T00:58:53Z |
Archived |
@@ -33679,7 +33679,7 @@ Scramble (link)
Stars |
- 1181 |
+ 1182 |
Watchers |
@@ -33695,7 +33695,7 @@ Scramble (link)
Last Updated |
- 2024-10-05T06:55:35Z |
+ 2024-10-06T14:56:36Z |
Archived |
@@ -33883,7 +33883,7 @@ ReDoc (link)
Stars |
- 23386 |
+ 23390 |
Watchers |
@@ -33891,7 +33891,7 @@ ReDoc (link)
Forks |
- 2291 |
+ 2292 |
Created |
@@ -33899,7 +33899,7 @@ ReDoc (link)
Last Updated |
- 2024-10-06T02:17:29Z |
+ 2024-10-07T02:51:20Z |
Archived |
@@ -34852,7 +34852,7 @@ OpenAPI Generator (link)
Stars |
- 21485 |
+ 21490 |
Watchers |
@@ -34860,7 +34860,7 @@ OpenAPI Generator (link)
Forks |
- 6504 |
+ 6505 |
Created |
@@ -34868,7 +34868,7 @@ OpenAPI Generator (link)
Last Updated |
- 2024-10-06T02:23:29Z |
+ 2024-10-07T03:28:34Z |
Archived |
@@ -34962,7 +34962,7 @@ Kiota Api Client Generator (link)
Forks |
- 195 |
+ 197 |
Created |
@@ -35005,7 +35005,7 @@ FabriKt (link)
Stars |
- 154 |
+ 153 |
Watchers |
@@ -35013,7 +35013,7 @@ FabriKt (link)
Forks |
- 40 |
+ 41 |
Created |
@@ -35021,7 +35021,7 @@ FabriKt (link)
Last Updated |
- 2024-10-02T16:53:14Z |
+ 2024-10-06T19:26:04Z |
Archived |
@@ -35311,7 +35311,7 @@ Swagger Editor (link)
Stars |
- 8892 |
+ 8893 |
Watchers |
@@ -35319,7 +35319,7 @@ Swagger Editor (link)
Forks |
- 2253 |
+ 2254 |
Created |
@@ -35327,7 +35327,7 @@ Swagger Editor (link)
Last Updated |
- 2024-10-06T02:09:24Z |
+ 2024-10-06T22:02:51Z |
Archived |
@@ -36484,7 +36484,7 @@ @hey-api/openapi-ts (link)
Stars |
- 1102 |
+ 1105 |
Watchers |
@@ -36492,7 +36492,7 @@ @hey-api/openapi-ts (link)
Forks |
- 90 |
+ 92 |
Created |
@@ -36500,7 +36500,7 @@ @hey-api/openapi-ts (link)
Last Updated |
- 2024-10-05T17:42:33Z |
+ 2024-10-07T01:51:17Z |
Archived |
@@ -36535,7 +36535,7 @@ Vert.x Web Api Contract (link)
Stars |
- 1107 |
+ 1108 |
Watchers |
@@ -36543,7 +36543,7 @@ Vert.x Web Api Contract (link)
Forks |
- 531 |
+ 532 |
Created |
@@ -36551,7 +36551,7 @@ Vert.x Web Api Contract (link)
Last Updated |
- 2024-10-05T21:15:29Z |
+ 2024-10-06T04:26:21Z |
Archived |
@@ -36739,7 +36739,7 @@ API Platform (link)
Stars |
- 8553 |
+ 8555 |
Watchers |
@@ -36755,7 +36755,7 @@ API Platform (link)
Last Updated |
- 2024-10-05T18:34:42Z |
+ 2024-10-06T10:41:47Z |
Archived |
@@ -37045,7 +37045,7 @@ @nestjs/swagger (link)
Stars |
- 1682 |
+ 1683 |
Watchers |
@@ -37061,7 +37061,7 @@ @nestjs/swagger (link)
Last Updated |
- 2024-10-05T00:11:30Z |
+ 2024-10-06T13:21:43Z |
Archived |
@@ -37402,7 +37402,7 @@ Step CI (link)
Stars |
- 1639 |
+ 1640 |
Watchers |
@@ -37418,7 +37418,7 @@ Step CI (link)
Last Updated |
- 2024-10-06T02:44:48Z |
+ 2024-10-07T00:52:57Z |
Archived |
@@ -37504,7 +37504,7 @@ Spectral (link)
Stars |
- 2479 |
+ 2480 |
Watchers |
@@ -37520,7 +37520,7 @@ Spectral (link)
Last Updated |
- 2024-10-04T18:19:30Z |
+ 2024-10-06T10:51:51Z |
Archived |
@@ -37920,7 +37920,7 @@ swagger-parser (link)
Forks |
- 526 |
+ 527 |
Created |
@@ -37963,7 +37963,7 @@ APIDevTools/swagger-parser (link)
Stars |
- 1097 |
+ 1096 |
Watchers |
@@ -37979,7 +37979,7 @@ APIDevTools/swagger-parser (link)
Last Updated |
- 2024-09-27T11:29:50Z |
+ 2024-10-06T21:05:01Z |
Archived |
@@ -38371,7 +38371,7 @@ php-openapi (link)
Stars |
- 469 |
+ 470 |
Watchers |
@@ -38387,7 +38387,7 @@ php-openapi (link)
Last Updated |
- 2024-10-04T04:16:38Z |
+ 2024-10-06T14:58:56Z |
Archived |
@@ -38932,7 +38932,7 @@ go-swagger (link)
Stars |
- 9493 |
+ 9494 |
Watchers |
@@ -38940,7 +38940,7 @@ go-swagger (link)
Forks |
- 1249 |
+ 1250 |
Created |
@@ -38948,7 +38948,7 @@ go-swagger (link)
Last Updated |
- 2024-10-05T05:00:06Z |
+ 2024-10-06T18:02:33Z |
Archived |
@@ -39034,7 +39034,7 @@ restful-react (link)
Stars |
- 1867 |
+ 1868 |
Watchers |
@@ -39050,7 +39050,7 @@ restful-react (link)
Last Updated |
- 2024-09-30T01:16:42Z |
+ 2024-10-06T09:20:30Z |
Archived |
@@ -39085,7 +39085,7 @@ NSwag (link)
Stars |
- 6730 |
+ 6734 |
Watchers |
@@ -39101,7 +39101,7 @@ NSwag (link)
Last Updated |
- 2024-10-06T02:52:20Z |
+ 2024-10-06T13:46:59Z |
Archived |
@@ -39187,7 +39187,7 @@ Swagger-Codegen (link)
Stars |
- 16938 |
+ 16940 |
Watchers |
@@ -39195,7 +39195,7 @@ Swagger-Codegen (link)
Forks |
- 6026 |
+ 6028 |
Created |
@@ -39203,7 +39203,7 @@ Swagger-Codegen (link)
Last Updated |
- 2024-10-05T22:24:20Z |
+ 2024-10-06T16:45:35Z |
Archived |
@@ -39238,7 +39238,7 @@ Azure AutoRest (link)
Stars |
- 4602 |
+ 4603 |
Watchers |
@@ -39254,7 +39254,7 @@ Azure AutoRest (link)
Last Updated |
- 2024-10-05T04:55:49Z |
+ 2024-10-06T11:32:11Z |
Archived |
@@ -39756,7 +39756,7 @@ Tcases for OpenAPI (link)
Forks |
- 53 |
+ 54 |
Created |
@@ -40019,7 +40019,7 @@ cats (link)
Last Updated |
- 2024-10-05T21:47:11Z |
+ 2024-10-06T20:07:05Z |
Archived |
@@ -40411,7 +40411,7 @@ mitmproxy2swagger (link)
Stars |
- 5045 |
+ 5046 |
Watchers |
@@ -40427,7 +40427,7 @@ mitmproxy2swagger (link)
Last Updated |
- 2024-10-05T07:55:55Z |
+ 2024-10-07T01:48:17Z |
Archived |
@@ -40462,7 +40462,7 @@ OpenApiSpecGeneratorPlugin (link)
Stars |
- 483 |
+ 485 |
Watchers |
@@ -40470,7 +40470,7 @@ OpenApiSpecGeneratorPlugin (link)
Forks |
- 56 |
+ 57 |
Created |
@@ -40478,7 +40478,7 @@ OpenApiSpecGeneratorPlugin (link)
Last Updated |
- 2024-10-06T02:08:31Z |
+ 2024-10-07T02:17:34Z |
Archived |
@@ -40717,7 +40717,7 @@ OpenAPI DevTools (link)
Stars |
- 3918 |
+ 3917 |
Watchers |
@@ -40733,7 +40733,7 @@ OpenAPI DevTools (link)
Last Updated |
- 2024-10-04T18:25:02Z |
+ 2024-10-07T01:48:50Z |
Archived |
@@ -40768,7 +40768,7 @@ TypeSpec (link)
Stars |
- 4355 |
+ 4357 |
Watchers |
@@ -40784,7 +40784,7 @@ TypeSpec (link)
Last Updated |
- 2024-10-05T03:58:03Z |
+ 2024-10-06T19:26:20Z |
Archived |
@@ -41023,7 +41023,7 @@ openapi-format (link)
Stars |
- 94 |
+ 95 |
Watchers |
@@ -41039,7 +41039,7 @@ openapi-format (link)
Last Updated |
- 2024-10-04T18:54:42Z |
+ 2024-10-06T12:30:26Z |
Archived |
@@ -41125,7 +41125,7 @@ SpringFox (link)
Stars |
- 5927 |
+ 5928 |
Watchers |
@@ -41141,7 +41141,7 @@ SpringFox (link)
Last Updated |
- 2024-10-03T00:56:37Z |
+ 2024-10-06T04:49:09Z |
Archived |
@@ -41227,7 +41227,7 @@ OWASP ZAP (link)
Stars |
- 12576 |
+ 12577 |
Watchers |
@@ -41243,7 +41243,7 @@ OWASP ZAP (link)
Last Updated |
- 2024-10-05T15:08:34Z |
+ 2024-10-06T03:55:45Z |
Archived |
@@ -41788,11 +41788,11 @@ Django REST Framework (link)
Stars |
- 28227 |
+ 28232 |
Watchers |
- 626 |
+ 628 |
Forks |
@@ -41804,7 +41804,7 @@ Django REST Framework (link)
Last Updated |
- 2024-10-06T03:34:40Z |
+ 2024-10-07T02:54:51Z |
Archived |
@@ -42196,7 +42196,7 @@ Elements (link)
Stars |
- 1739 |
+ 1738 |
Watchers |
@@ -42212,7 +42212,7 @@ Elements (link)
Last Updated |
- 2024-10-05T10:20:20Z |
+ 2024-10-06T18:16:37Z |
Archived |
@@ -42400,7 +42400,7 @@ Cherrybomb (link)
Stars |
- 1122 |
+ 1123 |
Watchers |
@@ -42416,7 +42416,7 @@ Cherrybomb (link)
Last Updated |
- 2024-10-05T15:06:44Z |
+ 2024-10-06T10:31:08Z |
Archived |
@@ -42706,7 +42706,7 @@ MkDocs Swagger UI Tag (link)
Stars |
- 77 |
+ 78 |
Watchers |
@@ -42722,7 +42722,7 @@ MkDocs Swagger UI Tag (link)
Last Updated |
- 2024-10-03T14:21:43Z |
+ 2024-10-06T04:47:04Z |
Archived |
@@ -42824,7 +42824,7 @@ Counterfact (link)
Last Updated |
- 2024-10-04T07:16:55Z |
+ 2024-10-06T21:05:56Z |
Archived |
@@ -43079,7 +43079,7 @@ libopenapi (link)
Last Updated |
- 2024-10-04T20:01:27Z |
+ 2024-10-06T11:15:58Z |
Archived |
@@ -43538,7 +43538,7 @@ Specmatic (link)
Last Updated |
- 2024-10-02T16:34:15Z |
+ 2024-10-06T20:18:26Z |
Archived |
@@ -44083,7 +44083,7 @@ rswag (link)
Stars |
- 1973 |
+ 1974 |
Watchers |
@@ -44099,7 +44099,7 @@ rswag (link)
Last Updated |
- 2024-10-04T08:39:39Z |
+ 2024-10-06T13:29:50Z |
Archived |
@@ -44134,7 +44134,7 @@ 🌿 Fern (link)
Stars |
- 2605 |
+ 2612 |
Watchers |
@@ -44142,7 +44142,7 @@ 🌿 Fern (link)
Forks |
- 139 |
+ 140 |
Created |
@@ -44150,7 +44150,7 @@ 🌿 Fern (link)
Last Updated |
- 2024-10-05T23:25:29Z |
+ 2024-10-07T02:40:03Z |
Archived |
@@ -44287,7 +44287,7 @@ Swift OpenAPI Generator (link)
Stars |
- 1385 |
+ 1388 |
Watchers |
@@ -44295,7 +44295,7 @@ Swift OpenAPI Generator (link)
Forks |
- 114 |
+ 115 |
Created |
@@ -44303,7 +44303,7 @@ Swift OpenAPI Generator (link)
Last Updated |
- 2024-10-05T23:39:07Z |
+ 2024-10-06T20:45:13Z |
Archived |
@@ -44644,7 +44644,7 @@ Fuego (link)
Stars |
- 822 |
+ 824 |
Watchers |
@@ -44660,7 +44660,7 @@ Fuego (link)
Last Updated |
- 2024-10-05T09:13:24Z |
+ 2024-10-06T11:40:38Z |
Archived |
@@ -44695,7 +44695,7 @@ Huma (link)
Stars |
- 1946 |
+ 1951 |
Watchers |
@@ -44703,7 +44703,7 @@ Huma (link)
Forks |
- 143 |
+ 144 |
Created |
@@ -44711,7 +44711,7 @@ Huma (link)
Last Updated |
- 2024-10-05T07:01:05Z |
+ 2024-10-07T01:18:36Z |
Archived |
@@ -45001,7 +45001,7 @@ Zudoku (link)
Stars |
- 62 |
+ 64 |
Watchers |
@@ -45017,7 +45017,7 @@ Zudoku (link)
Last Updated |
- 2024-10-04T19:08:41Z |
+ 2024-10-07T03:32:42Z |
Archived |
@@ -45052,7 +45052,7 @@ FastAPI (link)
Stars |
- 76264 |
+ 76290 |
Watchers |
@@ -45060,7 +45060,7 @@ FastAPI (link)
Forks |
- 6429 |
+ 6433 |
Created |
@@ -45068,7 +45068,7 @@ FastAPI (link)
Last Updated |
- 2024-10-06T02:29:46Z |
+ 2024-10-07T03:24:57Z |
Archived |
@@ -45103,7 +45103,7 @@ swagger-ui (link)
Stars |
- 26410 |
+ 26418 |
Watchers |
@@ -45111,7 +45111,7 @@ swagger-ui (link)
Forks |
- 8926 |
+ 8927 |
Created |
@@ -45119,7 +45119,7 @@ swagger-ui (link)
Last Updated |
- 2024-10-06T02:09:19Z |
+ 2024-10-07T03:07:20Z |
Archived |
@@ -45154,7 +45154,7 @@ Redoc (link)
Stars |
- 23386 |
+ 23390 |
Watchers |
@@ -45162,7 +45162,7 @@ Redoc (link)
Forks |
- 2291 |
+ 2292 |
Created |
@@ -45170,7 +45170,7 @@ Redoc (link)
Last Updated |
- 2024-10-06T02:17:29Z |
+ 2024-10-07T02:51:20Z |
Archived |
@@ -45205,7 +45205,7 @@ swagger-core (link)
Stars |
- 7374 |
+ 7375 |
Watchers |
@@ -45213,7 +45213,7 @@ swagger-core (link)
Forks |
- 2174 |
+ 2176 |
Created |
@@ -45221,7 +45221,7 @@ swagger-core (link)
Last Updated |
- 2024-10-05T03:10:13Z |
+ 2024-10-06T16:45:42Z |
Archived |
@@ -45256,7 +45256,7 @@ mockoon (link)
Stars |
- 6308 |
+ 6311 |
Watchers |
@@ -45272,7 +45272,7 @@ mockoon (link)
Last Updated |
- 2024-10-06T01:42:19Z |
+ 2024-10-07T01:39:27Z |
Archived |
@@ -45307,7 +45307,7 @@ OpenAPI Server Code Generator (oapi-cod
Stars |
- 6116 |
+ 6120 |
Watchers |
@@ -45323,7 +45323,7 @@ OpenAPI Server Code Generator (oapi-cod
Last Updated |
- 2024-10-06T01:47:50Z |
+ 2024-10-07T03:12:59Z |
Archived |
@@ -45358,7 +45358,7 @@ OpenAPI TypeScript (link)
Stars |
- 5651 |
+ 5652 |
Watchers |
@@ -45374,7 +45374,7 @@ OpenAPI TypeScript (link)
Last Updated |
- 2024-10-06T02:40:07Z |
+ 2024-10-07T01:12:43Z |
Archived |
@@ -45460,7 +45460,7 @@ openapi-directory (link)
Stars |
- 3849 |
+ 3851 |
Watchers |
@@ -45476,7 +45476,7 @@ openapi-directory (link)
Last Updated |
- 2024-10-05T15:30:52Z |
+ 2024-10-07T02:37:36Z |
Archived |
@@ -45511,7 +45511,7 @@ springdoc-openapi (link)
Stars |
- 3261 |
+ 3263 |
Watchers |
@@ -45527,7 +45527,7 @@ springdoc-openapi (link)
Last Updated |
- 2024-10-05T23:54:09Z |
+ 2024-10-06T20:24:20Z |
Archived |
@@ -45562,7 +45562,7 @@ uvicorn-gunicorn-fastapi-docker (link)<
Stars |
- 2695 |
+ 2697 |
Watchers |
@@ -45578,7 +45578,7 @@ uvicorn-gunicorn-fastapi-docker (link)<
Last Updated |
- 2024-10-01T23:36:39Z |
+ 2024-10-06T19:15:39Z |
Archived |
@@ -45613,7 +45613,7 @@ swagger-js (link)
Stars |
- 2621 |
+ 2622 |
Watchers |
@@ -45621,7 +45621,7 @@ swagger-js (link)
Forks |
- 759 |
+ 760 |
Created |
@@ -45629,7 +45629,7 @@ swagger-js (link)
Last Updated |
- 2024-10-03T23:57:45Z |
+ 2024-10-06T16:45:56Z |
Archived |
@@ -45664,7 +45664,7 @@ drf-spectacular (link)
Stars |
- 2342 |
+ 2343 |
Watchers |
@@ -45680,7 +45680,7 @@ drf-spectacular (link)
Last Updated |
- 2024-10-03T15:10:09Z |
+ 2024-10-06T17:35:11Z |
Archived |
@@ -45715,7 +45715,7 @@ msgspec (link)
Stars |
- 2294 |
+ 2297 |
Watchers |
@@ -45731,7 +45731,7 @@ msgspec (link)
Last Updated |
- 2024-10-05T16:23:14Z |
+ 2024-10-07T01:37:35Z |
Archived |
@@ -45782,7 +45782,7 @@ Schemathesis (link)
Last Updated |
- 2024-10-05T20:11:39Z |
+ 2024-10-06T07:02:06Z |
Archived |
@@ -45884,7 +45884,7 @@ rapidoc (link)
Last Updated |
- 2024-10-05T01:54:33Z |
+ 2024-10-06T19:54:04Z |
Archived |
@@ -45927,7 +45927,7 @@ openapi-generator-cli (link)
Forks |
- 146 |
+ 147 |
Created |
@@ -46021,7 +46021,7 @@ ogen (link)
Stars |
- 1339 |
+ 1338 |
Watchers |
@@ -46037,7 +46037,7 @@ ogen (link)
Last Updated |
- 2024-10-04T16:25:59Z |
+ 2024-10-06T20:45:46Z |
Archived |
@@ -46174,7 +46174,7 @@ zod-to-openapi (link)
Stars |
- 919 |
+ 920 |
Watchers |
@@ -46190,7 +46190,7 @@ zod-to-openapi (link)
Last Updated |
- 2024-10-05T13:51:00Z |
+ 2024-10-06T18:43:57Z |
Archived |
@@ -46582,7 +46582,7 @@ openapi-tui (link)
Stars |
- 639 |
+ 638 |
Watchers |
@@ -46598,7 +46598,7 @@ openapi-tui (link)
Last Updated |
- 2024-10-05T06:45:02Z |
+ 2024-10-06T22:26:12Z |
Archived |
@@ -47304,7 +47304,7 @@ safrs (link)
Forks |
- 72 |
+ 73 |
Created |
@@ -47567,7 +47567,7 @@ rest (link)
Last Updated |
- 2024-10-05T18:35:56Z |
+ 2024-10-06T10:49:49Z |
Archived |
@@ -47924,7 +47924,7 @@ modelina (link)
Last Updated |
- 2024-10-06T00:30:09Z |
+ 2024-10-07T00:29:25Z |
Archived |
@@ -48163,7 +48163,7 @@ zod-openapi (link)
Stars |
- 267 |
+ 268 |
Watchers |
@@ -48171,7 +48171,7 @@ zod-openapi (link)
Forks |
- 12 |
+ 13 |
Created |
@@ -48179,7 +48179,7 @@ zod-openapi (link)
Last Updated |
- 2024-10-05T21:03:26Z |
+ 2024-10-07T02:29:17Z |
Archived |
@@ -48630,7 +48630,7 @@ tcases (link)
Forks |
- 53 |
+ 54 |
Created |
@@ -49081,7 +49081,7 @@ typescript-backend-toolkit (link)
Stars |
- 197 |
+ 198 |
Watchers |
@@ -49097,7 +49097,7 @@ typescript-backend-toolkit (link)
Last Updated |
- 2024-10-03T09:16:13Z |
+ 2024-10-06T13:36:22Z |
Archived |
@@ -49387,7 +49387,7 @@ flask-openapi3 (link)
Stars |
- 186 |
+ 187 |
Watchers |
@@ -49403,7 +49403,7 @@ flask-openapi3 (link)
Last Updated |
- 2024-10-05T06:09:47Z |
+ 2024-10-06T21:44:52Z |
Archived |
@@ -49438,7 +49438,7 @@ speakeasy (link)
Stars |
- 182 |
+ 184 |
Watchers |
@@ -49454,7 +49454,7 @@ speakeasy (link)
Last Updated |
- 2024-10-04T17:37:33Z |
+ 2024-10-06T21:32:10Z |
Archived |
@@ -49658,7 +49658,7 @@ apiclientcodegen (link)
Last Updated |
- 2024-10-04T17:07:40Z |
+ 2024-10-06T22:03:59Z |
Archived |
@@ -50015,7 +50015,7 @@ deeptest (link)
Last Updated |
- 2024-10-05T03:56:13Z |
+ 2024-10-07T02:52:54Z |
Archived |
@@ -50568,7 +50568,7 @@ learn.openapis.org (link)
Forks |
- 56 |
+ 57 |
Created |
@@ -51019,7 +51019,7 @@ go-swagger3 (link)
Stars |
- 103 |
+ 104 |
Watchers |
@@ -51035,7 +51035,7 @@ go-swagger3 (link)
Last Updated |
- 2024-09-25T16:32:45Z |
+ 2024-10-07T01:19:56Z |
Archived |
@@ -51137,7 +51137,7 @@ tools.openapis.org (link)
Last Updated |
- 2024-10-05T03:33:42Z |
+ 2024-10-06T03:37:32Z |
Archived |
@@ -51784,7 +51784,7 @@ httpgenerator (link)
Stars |
- 77 |
+ 78 |
Watchers |
@@ -51800,7 +51800,7 @@ httpgenerator (link)
Last Updated |
- 2024-10-03T12:17:01Z |
+ 2024-10-06T19:04:46Z |
Archived |
@@ -51894,7 +51894,7 @@ openapi-delphi-generator (link)
Forks |
- 12 |
+ 13 |
Created |
@@ -52353,7 +52353,7 @@ openapi (link)
Forks |
- 93 |
+ 94 |
Created |
@@ -53432,7 +53432,7 @@ sample-quarkus-applications (link)
Last Updated |
- 2024-09-30T10:58:16Z |
+ 2024-10-06T15:24:32Z |
Archived |
@@ -54299,7 +54299,7 @@ openapi-processor-spring (link)
Last Updated |
- 2024-10-04T08:31:09Z |
+ 2024-10-06T08:02:16Z |
Archived |
@@ -55182,10 +55182,10 @@ apispec (link)
-
Stars |
- 33 |
+ 35 |
Watchers |
@@ -55209,7 +55209,7 @@ vitepress-theme-openapi (link)
Forks |
- 6 |
+ 7 |
Created |
@@ -55217,7 +55217,7 @@ vitepress-theme-openapi (link)
Last Updated |
- 2024-10-06T01:39:50Z |
+ 2024-10-06T17:57:22Z |
Archived |
@@ -57104,7 +57104,7 @@ sbt-openapi-schema (link)
Last Updated |
- 2024-09-26T23:09:48Z |
+ 2024-10-06T06:26:14Z |
Archived |
@@ -57853,7 +57853,7 @@ cloudedbats_wurb_2020 (link)
Stars |
- 19 |
+ 20 |
Watchers |
@@ -57869,7 +57869,7 @@ cloudedbats_wurb_2020 (link)
Last Updated |
- 2024-05-04T22:49:25Z |
+ 2024-10-06T07:48:48Z |
Archived |
@@ -63412,7 +63412,7 @@ go-goa (link)
Stars |
- 8 |
+ 7 |
Watchers |
@@ -63428,7 +63428,7 @@ go-goa (link)
Last Updated |
- 2024-08-06T16:59:54Z |
+ 2024-10-06T20:33:01Z |
Archived |
@@ -70670,7 +70670,7 @@ pulumi-provider-template (link)
Last Updated |
- 2024-10-04T14:53:39Z |
+ 2024-10-07T00:37:25Z |
Archived |
@@ -75464,7 +75464,7 @@ programming-machine-learning (link)
Last Updated |
- 2024-10-06T02:29:11Z |
+ 2024-10-06T22:04:14Z |
Archived |
@@ -77249,7 +77249,7 @@ api-frontend (link)
Last Updated |
- 2024-06-24T09:45:42Z |
+ 2024-10-06T14:18:59Z |
Archived |
@@ -81584,7 +81584,7 @@ openapi-workflow-parser (link)
Last Updated |
- 2024-09-25T20:11:37Z |
+ 2024-10-06T16:57:17Z |
Archived |
@@ -85613,7 +85613,7 @@ bs-api-specification (link)
Last Updated |
- 2024-07-28T11:54:23Z |
+ 2024-10-06T13:20:46Z |
Archived |
@@ -85766,7 +85766,7 @@ openapi-native-mock-server (link)
Last Updated |
- 2024-09-01T08:19:17Z |
+ 2024-10-06T14:30:26Z |
Archived |
@@ -87857,7 +87857,7 @@ api-flows-studio (link)
Last Updated |
- 2024-10-05T17:07:09Z |
+ 2024-10-06T16:45:05Z |
Archived |
@@ -88308,7 +88308,7 @@ hub (link)
Forks |
- 6 |
+ 7 |
Created |
@@ -92176,7 +92176,7 @@ utoipa (link)
Stars |
- 2245 |
+ 2249 |
Watchers |
@@ -92192,7 +92192,7 @@ utoipa (link)
Last Updated |
- 2024-10-05T14:31:59Z |
+ 2024-10-06T22:40:42Z |
Archived |
@@ -92345,7 +92345,7 @@ oas3-rs (link)
Last Updated |
- 2024-09-30T03:05:55Z |
+ 2024-10-07T03:00:50Z |
Archived |
@@ -93553,7 +93553,7 @@ orval (link)
Stars |
- 2902 |
+ 2907 |
Watchers |
@@ -93561,7 +93561,7 @@ orval (link)
Forks |
- 325 |
+ 326 |
Created |
@@ -93569,7 +93569,7 @@ orval (link)
Last Updated |
- 2024-10-06T01:27:46Z |
+ 2024-10-07T03:04:31Z |
Archived |
@@ -95032,7 +95032,7 @@ EvoMaster (link)
Stars |
- 499 |
+ 500 |
Watchers |
@@ -95048,7 +95048,7 @@ EvoMaster (link)
Last Updated |
- 2024-10-05T16:53:25Z |
+ 2024-10-06T20:34:56Z |
Archived |
@@ -95848,7 +95848,7 @@ LucyBot api-spec-converter (link)
Stars |
- 1109 |
+ 1110 |
Watchers |
@@ -95864,7 +95864,7 @@ LucyBot api-spec-converter (link)
Last Updated |
- 2024-10-02T18:32:57Z |
+ 2024-10-06T14:23:32Z |
Archived |
@@ -97684,7 +97684,7 @@ kubb (link)
Stars |
- 669 |
+ 670 |
Watchers |
@@ -97692,7 +97692,7 @@ kubb (link)
Forks |
- 53 |
+ 54 |
Created |
@@ -97700,7 +97700,7 @@ kubb (link)
Last Updated |
- 2024-10-05T13:02:51Z |
+ 2024-10-06T19:07:09Z |
Archived |
@@ -97888,15 +97888,15 @@ full-stack-fastapi-template (link)
Stars |
- 26639 |
+ 26657 |
Watchers |
- 263 |
+ 262 |
Forks |
- 4693 |
+ 4694 |
Created |
@@ -97904,7 +97904,7 @@ full-stack-fastapi-template (link)
Last Updated |
- 2024-10-06T02:27:02Z |
+ 2024-10-07T03:11:49Z |
Archived |
@@ -106064,7 +106064,7 @@ sqlcrud (link)
Last Updated |
- 2024-04-24T00:33:51Z |
+ 2024-10-07T00:17:39Z |
Archived |
@@ -107782,7 +107782,7 @@ swagger-models (link)
Stars |
- 7374 |
+ 7375 |
Watchers |
@@ -107790,7 +107790,7 @@ swagger-models (link)
Forks |
- 2174 |
+ 2176 |
Created |
@@ -107798,7 +107798,7 @@ swagger-models (link)
Last Updated |
- 2024-10-05T03:10:13Z |
+ 2024-10-06T16:45:42Z |
Archived |
@@ -108402,7 +108402,7 @@ Tcases for OpenAPI (link)
Forks |
- 53 |
+ 54 |
Created |
@@ -110128,7 +110128,7 @@ LoopBack 4 (link)
Stars |
- 4942 |
+ 4944 |
Watchers |
@@ -110144,7 +110144,7 @@ LoopBack 4 (link)
Last Updated |
- 2024-10-06T02:17:36Z |
+ 2024-10-07T00:55:49Z |
Archived |
@@ -111556,7 +111556,7 @@ Vert.x Web API Service (link)
Stars |
- 1107 |
+ 1108 |
Watchers |
@@ -111564,7 +111564,7 @@ Vert.x Web API Service (link)
Forks |
- 531 |
+ 532 |
Created |
@@ -111572,7 +111572,7 @@ Vert.x Web API Service (link)
Last Updated |
- 2024-10-05T21:15:29Z |
+ 2024-10-06T04:26:21Z |
Archived |
@@ -118503,10 +118503,10 @@ odata2openapi (link)
document
- .getElementById("74ef0931b8963642c1eb5febd3ab5aca-open-button")
+ .getElementById("6b0b55df8cbd772582e7b1db14781e00-open-button")
.onclick = function () {
const wrapper = document.getElementById("tool-content")
- const content = document.getElementById("74ef0931b8963642c1eb5febd3ab5aca-info")
+ const content = document.getElementById("6b0b55df8cbd772582e7b1db14781e00-info")
content.removeAttribute("hidden")
diff --git a/docs/categories/auto-generators.html b/docs/categories/auto-generators.html
index 690e7103..9ecb2057 100644
--- a/docs/categories/auto-generators.html
+++ b/docs/categories/auto-generators.html
@@ -91,7 +91,7 @@ Yes
No |
No |
- 1181 |
+ 1182 |
@@ -114,7 +114,7 @@ No |
Yes |
No |
- 5045 |
+ 5046 |
@@ -137,7 +137,7 @@ No |
Yes |
No |
- 483 |
+ 485 |
@@ -250,7 +250,7 @@ Yes |
Yes |
No |
- 3918 |
+ 3917 |
@@ -273,7 +273,7 @@ No |
Yes |
No |
- 4355 |
+ 4357 |
@@ -296,7 +296,7 @@ No |
Yes |
No |
- 822 |
+ 824 |
@@ -319,7 +319,7 @@ Yes |
Yes |
No |
- 1946 |
+ 1951 |
@@ -373,7 +373,7 @@ Scramble (link)
|
Stars |
- 1181 |
+ 1182 |
Watchers |
@@ -389,7 +389,7 @@ Scramble (link)
Last Updated |
- 2024-10-05T06:55:35Z |
+ 2024-10-06T14:56:36Z |
Archived |
@@ -424,7 +424,7 @@ mitmproxy2swagger (link)
Stars |
- 5045 |
+ 5046 |
Watchers |
@@ -440,7 +440,7 @@ mitmproxy2swagger (link)
Last Updated |
- 2024-10-05T07:55:55Z |
+ 2024-10-07T01:48:17Z |
Archived |
@@ -475,7 +475,7 @@ OpenApiSpecGeneratorPlugin (link)
Stars |
- 483 |
+ 485 |
Watchers |
@@ -483,7 +483,7 @@ OpenApiSpecGeneratorPlugin (link)
Forks |
- 56 |
+ 57 |
Created |
@@ -491,7 +491,7 @@ OpenApiSpecGeneratorPlugin (link)
Last Updated |
- 2024-10-06T02:08:31Z |
+ 2024-10-07T02:17:34Z |
Archived |
@@ -730,7 +730,7 @@ OpenAPI DevTools (link)
Stars |
- 3918 |
+ 3917 |
Watchers |
@@ -746,7 +746,7 @@ OpenAPI DevTools (link)
Last Updated |
- 2024-10-04T18:25:02Z |
+ 2024-10-07T01:48:50Z |
Archived |
@@ -781,7 +781,7 @@ TypeSpec (link)
Stars |
- 4355 |
+ 4357 |
Watchers |
@@ -797,7 +797,7 @@ TypeSpec (link)
Last Updated |
- 2024-10-05T03:58:03Z |
+ 2024-10-06T19:26:20Z |
Archived |
@@ -832,7 +832,7 @@ Fuego (link)
Stars |
- 822 |
+ 824 |
Watchers |
@@ -848,7 +848,7 @@ Fuego (link)
Last Updated |
- 2024-10-05T09:13:24Z |
+ 2024-10-06T11:40:38Z |
Archived |
@@ -883,7 +883,7 @@ Huma (link)
Stars |
- 1946 |
+ 1951 |
Watchers |
@@ -891,7 +891,7 @@ Huma (link)
Forks |
- 143 |
+ 144 |
Created |
@@ -899,7 +899,7 @@ Huma (link)
Last Updated |
- 2024-10-05T07:01:05Z |
+ 2024-10-07T01:18:36Z |
Archived |
diff --git a/docs/categories/code-generators.html b/docs/categories/code-generators.html
index 1c5263b4..2c526cf3 100644
--- a/docs/categories/code-generators.html
+++ b/docs/categories/code-generators.html
@@ -114,7 +114,7 @@ No
Yes |
Yes |
- 21485 |
+ 21490 |
@@ -183,7 +183,7 @@ No |
Yes |
No |
- 154 |
+ 153 |
@@ -248,7 +248,7 @@ No |
Yes |
Yes |
- 16938 |
+ 16940 |
@@ -340,7 +340,7 @@ Yes |
Yes |
Yes |
- 2605 |
+ 2612 |
@@ -386,7 +386,7 @@ Yes |
Yes |
No |
- 26410 |
+ 26418 |
@@ -407,7 +407,7 @@ No |
Yes |
No |
- 7374 |
+ 7375 |
@@ -430,7 +430,7 @@ No |
Yes |
No |
- 6116 |
+ 6120 |
@@ -451,7 +451,7 @@ Yes |
Yes |
No |
- 2621 |
+ 2622 |
@@ -1381,7 +1381,7 @@ No |
Yes |
Yes |
- 2902 |
+ 2907 |
@@ -1591,7 +1591,7 @@ Yes |
Yes |
Yes |
- 669 |
+ 670 |
@@ -1868,7 +1868,7 @@ No |
No |
No |
- 7374 |
+ 7375 |
@@ -2168,7 +2168,7 @@ OpenAPI Generator (link)
|
Stars |
- 21485 |
+ 21490 |
Watchers |
@@ -2176,7 +2176,7 @@ OpenAPI Generator (link)
Forks |
- 6504 |
+ 6505 |
Created |
@@ -2184,7 +2184,7 @@ OpenAPI Generator (link)
Last Updated |
- 2024-10-06T02:23:29Z |
+ 2024-10-07T03:28:34Z |
Archived |
@@ -2278,7 +2278,7 @@ Kiota Api Client Generator (link)
Forks |
- 195 |
+ 197 |
Created |
@@ -2321,7 +2321,7 @@ FabriKt (link)
Stars |
- 154 |
+ 153 |
Watchers |
@@ -2329,7 +2329,7 @@ FabriKt (link)
Forks |
- 40 |
+ 41 |
Created |
@@ -2337,7 +2337,7 @@ FabriKt (link)
Last Updated |
- 2024-10-02T16:53:14Z |
+ 2024-10-06T19:26:04Z |
Archived |
@@ -2474,7 +2474,7 @@ Swagger-Codegen (link)
Stars |
- 16938 |
+ 16940 |
Watchers |
@@ -2482,7 +2482,7 @@ Swagger-Codegen (link)
Forks |
- 6026 |
+ 6028 |
Created |
@@ -2490,7 +2490,7 @@ Swagger-Codegen (link)
Last Updated |
- 2024-10-05T22:24:20Z |
+ 2024-10-06T16:45:35Z |
Archived |
@@ -2678,7 +2678,7 @@ 🌿 Fern (link)
Stars |
- 2605 |
+ 2612 |
Watchers |
@@ -2686,7 +2686,7 @@ 🌿 Fern (link)
Forks |
- 139 |
+ 140 |
Created |
@@ -2694,7 +2694,7 @@ 🌿 Fern (link)
Last Updated |
- 2024-10-05T23:25:29Z |
+ 2024-10-07T02:40:03Z |
Archived |
@@ -2780,7 +2780,7 @@ swagger-ui (link)
Stars |
- 26410 |
+ 26418 |
Watchers |
@@ -2788,7 +2788,7 @@ swagger-ui (link)
Forks |
- 8926 |
+ 8927 |
Created |
@@ -2796,7 +2796,7 @@ swagger-ui (link)
Last Updated |
- 2024-10-06T02:09:19Z |
+ 2024-10-07T03:07:20Z |
Archived |
@@ -2831,7 +2831,7 @@ swagger-core (link)
Stars |
- 7374 |
+ 7375 |
Watchers |
@@ -2839,7 +2839,7 @@ swagger-core (link)
Forks |
- 2174 |
+ 2176 |
Created |
@@ -2847,7 +2847,7 @@ swagger-core (link)
Last Updated |
- 2024-10-05T03:10:13Z |
+ 2024-10-06T16:45:42Z |
Archived |
@@ -2882,7 +2882,7 @@ OpenAPI Server Code Generator (oapi-cod
Stars |
- 6116 |
+ 6120 |
Watchers |
@@ -2898,7 +2898,7 @@ OpenAPI Server Code Generator (oapi-cod
Last Updated |
- 2024-10-06T01:47:50Z |
+ 2024-10-07T03:12:59Z |
Archived |
@@ -2933,7 +2933,7 @@ swagger-js (link)
Stars |
- 2621 |
+ 2622 |
Watchers |
@@ -2941,7 +2941,7 @@ swagger-js (link)
Forks |
- 759 |
+ 760 |
Created |
@@ -2949,7 +2949,7 @@ swagger-js (link)
Last Updated |
- 2024-10-03T23:57:45Z |
+ 2024-10-06T16:45:56Z |
Archived |
@@ -2992,7 +2992,7 @@ openapi-generator-cli (link)
Forks |
- 146 |
+ 147 |
Created |
@@ -5177,7 +5177,7 @@ orval (link)
Stars |
- 2902 |
+ 2907 |
Watchers |
@@ -5185,7 +5185,7 @@ orval (link)
Forks |
- 325 |
+ 326 |
Created |
@@ -5193,7 +5193,7 @@ orval (link)
Last Updated |
- 2024-10-06T01:27:46Z |
+ 2024-10-07T03:04:31Z |
Archived |
@@ -5687,7 +5687,7 @@ kubb (link)
Stars |
- 669 |
+ 670 |
Watchers |
@@ -5695,7 +5695,7 @@ kubb (link)
Forks |
- 53 |
+ 54 |
Created |
@@ -5703,7 +5703,7 @@ kubb (link)
Last Updated |
- 2024-10-05T13:02:51Z |
+ 2024-10-06T19:07:09Z |
Archived |
@@ -6350,7 +6350,7 @@ swagger-models (link)
Stars |
- 7374 |
+ 7375 |
Watchers |
@@ -6358,7 +6358,7 @@ swagger-models (link)
Forks |
- 2174 |
+ 2176 |
Created |
@@ -6366,7 +6366,7 @@ swagger-models (link)
Last Updated |
- 2024-10-05T03:10:13Z |
+ 2024-10-06T16:45:42Z |
Archived |
diff --git a/docs/categories/converters.html b/docs/categories/converters.html
index ed614c48..12702824 100644
--- a/docs/categories/converters.html
+++ b/docs/categories/converters.html
@@ -221,7 +221,7 @@ Yes
Yes |
Yes |
- 1102 |
+ 1105 |
@@ -267,7 +267,7 @@ No |
Yes |
No |
- 1639 |
+ 1640 |
@@ -290,7 +290,7 @@ No |
No |
Yes |
- 9493 |
+ 9494 |
@@ -470,7 +470,7 @@ Yes |
Yes |
No |
- 94 |
+ 95 |
@@ -604,7 +604,7 @@ Yes |
Yes |
Yes |
- 5651 |
+ 5652 |
@@ -984,7 +984,7 @@ No |
Yes |
Yes |
- 1109 |
+ 1110 |
@@ -1470,7 +1470,7 @@ @hey-api/openapi-ts (link)
|
Stars |
- 1102 |
+ 1105 |
Watchers |
@@ -1478,7 +1478,7 @@ @hey-api/openapi-ts (link)
Forks |
- 90 |
+ 92 |
Created |
@@ -1486,7 +1486,7 @@ @hey-api/openapi-ts (link)
Last Updated |
- 2024-10-05T17:42:33Z |
+ 2024-10-07T01:51:17Z |
Archived |
@@ -1572,7 +1572,7 @@ Step CI (link)
Stars |
- 1639 |
+ 1640 |
Watchers |
@@ -1588,7 +1588,7 @@ Step CI (link)
Last Updated |
- 2024-10-06T02:44:48Z |
+ 2024-10-07T00:52:57Z |
Archived |
@@ -1623,7 +1623,7 @@ go-swagger (link)
Stars |
- 9493 |
+ 9494 |
Watchers |
@@ -1631,7 +1631,7 @@ go-swagger (link)
Forks |
- 1249 |
+ 1250 |
Created |
@@ -1639,7 +1639,7 @@ go-swagger (link)
Last Updated |
- 2024-10-05T05:00:06Z |
+ 2024-10-06T18:02:33Z |
Archived |
@@ -2031,7 +2031,7 @@ openapi-format (link)
Stars |
- 94 |
+ 95 |
Watchers |
@@ -2047,7 +2047,7 @@ openapi-format (link)
Last Updated |
- 2024-10-04T18:54:42Z |
+ 2024-10-06T12:30:26Z |
Archived |
@@ -2337,7 +2337,7 @@ OpenAPI TypeScript (link)
Stars |
- 5651 |
+ 5652 |
Watchers |
@@ -2353,7 +2353,7 @@ OpenAPI TypeScript (link)
Last Updated |
- 2024-10-06T02:40:07Z |
+ 2024-10-07T01:12:43Z |
Archived |
@@ -3255,7 +3255,7 @@ LucyBot api-spec-converter (link)
Stars |
- 1109 |
+ 1110 |
Watchers |
@@ -3271,7 +3271,7 @@ LucyBot api-spec-converter (link)
Last Updated |
- 2024-10-02T18:32:57Z |
+ 2024-10-06T14:23:32Z |
Archived |
diff --git a/docs/categories/data-validators.html b/docs/categories/data-validators.html
index 90e29301..b773462a 100644
--- a/docs/categories/data-validators.html
+++ b/docs/categories/data-validators.html
@@ -177,7 +177,7 @@ No
Yes |
No |
- 1639 |
+ 1640 |
@@ -663,7 +663,7 @@ No |
Yes |
No |
- 822 |
+ 824 |
@@ -686,7 +686,7 @@ Yes |
Yes |
No |
- 1946 |
+ 1951 |
@@ -2172,7 +2172,7 @@ Step CI (link)
|
Stars |
- 1639 |
+ 1640 |
Watchers |
@@ -2188,7 +2188,7 @@ Step CI (link)
Last Updated |
- 2024-10-06T02:44:48Z |
+ 2024-10-07T00:52:57Z |
Archived |
@@ -3294,7 +3294,7 @@ Fuego (link)
Stars |
- 822 |
+ 824 |
Watchers |
@@ -3310,7 +3310,7 @@ Fuego (link)
Last Updated |
- 2024-10-05T09:13:24Z |
+ 2024-10-06T11:40:38Z |
Archived |
@@ -3345,7 +3345,7 @@ Huma (link)
Stars |
- 1946 |
+ 1951 |
Watchers |
@@ -3353,7 +3353,7 @@ Huma (link)
Forks |
- 143 |
+ 144 |
Created |
@@ -3361,7 +3361,7 @@ Huma (link)
Last Updated |
- 2024-10-05T07:01:05Z |
+ 2024-10-07T01:18:36Z |
Archived |
diff --git a/docs/categories/description-validators.html b/docs/categories/description-validators.html
index 9665b6d0..93c23eed 100644
--- a/docs/categories/description-validators.html
+++ b/docs/categories/description-validators.html
@@ -112,7 +112,7 @@ Yes
Yes |
No |
- 214 |
+ 215 |
@@ -197,7 +197,7 @@ Yes |
Yes |
Yes |
- 2479 |
+ 2480 |
@@ -306,7 +306,7 @@ No |
Yes |
No |
- 469 |
+ 470 |
@@ -417,7 +417,7 @@ Yes |
Yes |
No |
- 1122 |
+ 1123 |
@@ -1708,7 +1708,7 @@ Rate My OpenAPI (link)
|
Stars |
- 214 |
+ 215 |
Watchers |
@@ -1724,7 +1724,7 @@ Rate My OpenAPI (link)
Last Updated |
- 2024-10-04T21:39:44Z |
+ 2024-10-06T04:37:07Z |
Archived |
@@ -1912,7 +1912,7 @@ Spectral (link)
Stars |
- 2479 |
+ 2480 |
Watchers |
@@ -1928,7 +1928,7 @@ Spectral (link)
Last Updated |
- 2024-10-04T18:19:30Z |
+ 2024-10-06T10:51:51Z |
Archived |
@@ -2167,7 +2167,7 @@ php-openapi (link)
Stars |
- 469 |
+ 470 |
Watchers |
@@ -2183,7 +2183,7 @@ php-openapi (link)
Last Updated |
- 2024-10-04T04:16:38Z |
+ 2024-10-06T14:58:56Z |
Archived |
@@ -2422,7 +2422,7 @@ Cherrybomb (link)
Stars |
- 1122 |
+ 1123 |
Watchers |
@@ -2438,7 +2438,7 @@ Cherrybomb (link)
Last Updated |
- 2024-10-05T15:06:44Z |
+ 2024-10-06T10:31:08Z |
Archived |
diff --git a/docs/categories/documentation.html b/docs/categories/documentation.html
index b4096f38..3bfba13f 100644
--- a/docs/categories/documentation.html
+++ b/docs/categories/documentation.html
@@ -169,7 +169,7 @@ Yes
Yes |
Yes |
- 6276 |
+ 6290 |
@@ -192,7 +192,7 @@ Yes |
No |
No |
- 1181 |
+ 1182 |
@@ -259,7 +259,7 @@ Yes |
Yes |
Yes |
- 23386 |
+ 23390 |
@@ -634,7 +634,7 @@ Yes |
Yes |
No |
- 3918 |
+ 3917 |
@@ -722,7 +722,7 @@ Yes |
Yes |
Yes |
- 1739 |
+ 1738 |
@@ -810,7 +810,7 @@ Yes |
Yes |
Yes |
- 77 |
+ 78 |
@@ -959,7 +959,7 @@ Yes |
Yes |
Yes |
- 2605 |
+ 2612 |
@@ -1072,7 +1072,7 @@ Yes |
Yes |
No |
- 62 |
+ 64 |
@@ -2602,7 +2602,7 @@ Scalar (link)
|
Stars |
- 6276 |
+ 6290 |
Watchers |
@@ -2610,7 +2610,7 @@ Scalar (link)
Forks |
- 204 |
+ 203 |
Created |
@@ -2618,7 +2618,7 @@ Scalar (link)
Last Updated |
- 2024-10-06T03:22:27Z |
+ 2024-10-07T00:58:53Z |
Archived |
@@ -2653,7 +2653,7 @@ Scramble (link)
Stars |
- 1181 |
+ 1182 |
Watchers |
@@ -2669,7 +2669,7 @@ Scramble (link)
Last Updated |
- 2024-10-05T06:55:35Z |
+ 2024-10-06T14:56:36Z |
Archived |
@@ -2806,7 +2806,7 @@ ReDoc (link)
Stars |
- 23386 |
+ 23390 |
Watchers |
@@ -2814,7 +2814,7 @@ ReDoc (link)
Forks |
- 2291 |
+ 2292 |
Created |
@@ -2822,7 +2822,7 @@ ReDoc (link)
Last Updated |
- 2024-10-06T02:17:29Z |
+ 2024-10-07T02:51:20Z |
Archived |
@@ -3673,7 +3673,7 @@ OpenAPI DevTools (link)
Stars |
- 3918 |
+ 3917 |
Watchers |
@@ -3689,7 +3689,7 @@ OpenAPI DevTools (link)
Last Updated |
- 2024-10-04T18:25:02Z |
+ 2024-10-07T01:48:50Z |
Archived |
@@ -3877,7 +3877,7 @@ Elements (link)
Stars |
- 1739 |
+ 1738 |
Watchers |
@@ -3893,7 +3893,7 @@ Elements (link)
Last Updated |
- 2024-10-05T10:20:20Z |
+ 2024-10-06T18:16:37Z |
Archived |
@@ -4081,7 +4081,7 @@ MkDocs Swagger UI Tag (link)
Stars |
- 77 |
+ 78 |
Watchers |
@@ -4097,7 +4097,7 @@ MkDocs Swagger UI Tag (link)
Last Updated |
- 2024-10-03T14:21:43Z |
+ 2024-10-06T04:47:04Z |
Archived |
@@ -4438,7 +4438,7 @@ 🌿 Fern (link)
Stars |
- 2605 |
+ 2612 |
Watchers |
@@ -4446,7 +4446,7 @@ 🌿 Fern (link)
Forks |
- 139 |
+ 140 |
Created |
@@ -4454,7 +4454,7 @@ 🌿 Fern (link)
Last Updated |
- 2024-10-05T23:25:29Z |
+ 2024-10-07T02:40:03Z |
Archived |
@@ -4693,7 +4693,7 @@ Zudoku (link)
Stars |
- 62 |
+ 64 |
Watchers |
@@ -4709,7 +4709,7 @@ Zudoku (link)
Last Updated |
- 2024-10-04T19:08:41Z |
+ 2024-10-07T03:32:42Z |
Archived |
@@ -4760,7 +4760,7 @@ rapidoc (link)
Last Updated |
- 2024-10-05T01:54:33Z |
+ 2024-10-06T19:54:04Z |
Archived |
diff --git a/docs/categories/dsl.html b/docs/categories/dsl.html
index 79d3b345..bfa9de86 100644
--- a/docs/categories/dsl.html
+++ b/docs/categories/dsl.html
@@ -215,7 +215,7 @@ No
Yes |
No |
- 1973 |
+ 1974 |
@@ -619,7 +619,7 @@ rswag (link)
|
Stars |
- 1973 |
+ 1974 |
Watchers |
@@ -635,7 +635,7 @@ rswag (link)
Last Updated |
- 2024-10-04T08:39:39Z |
+ 2024-10-06T13:29:50Z |
Archived |
diff --git a/docs/categories/low-level-tooling.html b/docs/categories/low-level-tooling.html
index c45ed9c1..2f3858c2 100644
--- a/docs/categories/low-level-tooling.html
+++ b/docs/categories/low-level-tooling.html
@@ -91,7 +91,7 @@ No
Yes |
No |
- 3261 |
+ 3263 |
@@ -1277,7 +1277,7 @@ No |
No |
No |
- 7374 |
+ 7375 |
@@ -1440,7 +1440,7 @@ springdoc-openapi (link)
|
Stars |
- 3261 |
+ 3263 |
Watchers |
@@ -1456,7 +1456,7 @@ springdoc-openapi (link)
Last Updated |
- 2024-10-05T23:54:09Z |
+ 2024-10-06T20:24:20Z |
Archived |
@@ -4296,7 +4296,7 @@ swagger-models (link)
Stars |
- 7374 |
+ 7375 |
Watchers |
@@ -4304,7 +4304,7 @@ swagger-models (link)
Forks |
- 2174 |
+ 2176 |
Created |
@@ -4312,7 +4312,7 @@ swagger-models (link)
Last Updated |
- 2024-10-05T03:10:13Z |
+ 2024-10-06T16:45:42Z |
Archived |
diff --git a/docs/categories/mock.html b/docs/categories/mock.html
index 8876c073..2abb1dc5 100644
--- a/docs/categories/mock.html
+++ b/docs/categories/mock.html
@@ -543,7 +543,7 @@ No
Yes |
Yes |
- 2902 |
+ 2907 |
@@ -1296,7 +1296,7 @@ Counterfact (link)
|
Last Updated |
- 2024-10-04T07:16:55Z |
+ 2024-10-06T21:05:56Z |
Archived |
@@ -1449,7 +1449,7 @@ Specmatic (link)
Last Updated |
- 2024-10-02T16:34:15Z |
+ 2024-10-06T20:18:26Z |
Archived |
@@ -1841,7 +1841,7 @@ orval (link)
Stars |
- 2902 |
+ 2907 |
Watchers |
@@ -1849,7 +1849,7 @@ orval (link)
Forks |
- 325 |
+ 326 |
Created |
@@ -1857,7 +1857,7 @@ orval (link)
Last Updated |
- 2024-10-06T01:27:46Z |
+ 2024-10-07T03:04:31Z |
Archived |
diff --git a/docs/categories/parsers.html b/docs/categories/parsers.html
index 63d6a4e9..e57320c8 100644
--- a/docs/categories/parsers.html
+++ b/docs/categories/parsers.html
@@ -91,7 +91,7 @@ Yes
Yes |
Yes |
- 23386 |
+ 23390 |
@@ -608,7 +608,7 @@ No |
Yes |
Yes |
- 1097 |
+ 1096 |
@@ -740,7 +740,7 @@ No |
Yes |
No |
- 469 |
+ 470 |
@@ -918,7 +918,7 @@ No |
No |
Yes |
- 9493 |
+ 9494 |
@@ -1259,7 +1259,7 @@ Yes |
Yes |
No |
- 94 |
+ 95 |
@@ -1483,7 +1483,7 @@ Yes |
Yes |
Yes |
- 77 |
+ 78 |
@@ -1686,7 +1686,7 @@ No |
Yes |
No |
- 1973 |
+ 1974 |
@@ -1801,7 +1801,7 @@ Yes |
Yes |
No |
- 23386 |
+ 23390 |
@@ -1843,7 +1843,7 @@ No |
Yes |
No |
- 1339 |
+ 1338 |
@@ -1885,7 +1885,7 @@ No |
Yes |
No |
- 919 |
+ 920 |
@@ -1990,7 +1990,7 @@ Yes |
Yes |
No |
- 639 |
+ 638 |
@@ -2221,7 +2221,7 @@ No |
Yes |
No |
- 267 |
+ 268 |
@@ -2456,7 +2456,7 @@ No |
Yes |
No |
- 182 |
+ 184 |
@@ -2941,7 +2941,7 @@ No |
Yes |
No |
- 77 |
+ 78 |
@@ -3564,23 +3564,23 @@
- vitepress-theme-openapi |
+ vitepress-openapi |
Generate VitePress API Docs from OpenAPI specifications |
No
|
- Link
+ Link
|
Yes |
Yes |
No |
- 33 |
+ 35 |
-
+
| |
@@ -8938,7 +8938,7 @@ Yes |
Yes |
No |
- 2245 |
+ 2249 |
@@ -11026,7 +11026,7 @@ ReDoc (link)
|
Stars |
- 23386 |
+ 23390 |
Watchers |
@@ -11034,7 +11034,7 @@ ReDoc (link)
Forks |
- 2291 |
+ 2292 |
Created |
@@ -11042,7 +11042,7 @@ ReDoc (link)
Last Updated |
- 2024-10-06T02:17:29Z |
+ 2024-10-07T02:51:20Z |
Archived |
@@ -12156,7 +12156,7 @@ swagger-parser (link)
Forks |
- 526 |
+ 527 |
Created |
@@ -12199,7 +12199,7 @@ APIDevTools/swagger-parser (link)
Stars |
- 1097 |
+ 1096 |
Watchers |
@@ -12215,7 +12215,7 @@ APIDevTools/swagger-parser (link)
Last Updated |
- 2024-09-27T11:29:50Z |
+ 2024-10-06T21:05:01Z |
Archived |
@@ -12505,7 +12505,7 @@ php-openapi (link)
Stars |
- 469 |
+ 470 |
Watchers |
@@ -12521,7 +12521,7 @@ php-openapi (link)
Last Updated |
- 2024-10-04T04:16:38Z |
+ 2024-10-06T14:58:56Z |
Archived |
@@ -12913,7 +12913,7 @@ go-swagger (link)
Stars |
- 9493 |
+ 9494 |
Watchers |
@@ -12921,7 +12921,7 @@ go-swagger (link)
Forks |
- 1249 |
+ 1250 |
Created |
@@ -12929,7 +12929,7 @@ go-swagger (link)
Last Updated |
- 2024-10-05T05:00:06Z |
+ 2024-10-06T18:02:33Z |
Archived |
@@ -13678,7 +13678,7 @@ openapi-format (link)
Stars |
- 94 |
+ 95 |
Watchers |
@@ -13694,7 +13694,7 @@ openapi-format (link)
Last Updated |
- 2024-10-04T18:54:42Z |
+ 2024-10-06T12:30:26Z |
Archived |
@@ -14188,7 +14188,7 @@ MkDocs Swagger UI Tag (link)
Stars |
- 77 |
+ 78 |
Watchers |
@@ -14204,7 +14204,7 @@ MkDocs Swagger UI Tag (link)
Last Updated |
- 2024-10-03T14:21:43Z |
+ 2024-10-06T04:47:04Z |
Archived |
@@ -14306,7 +14306,7 @@ libopenapi (link)
Last Updated |
- 2024-10-04T20:01:27Z |
+ 2024-10-06T11:15:58Z |
Archived |
@@ -14647,7 +14647,7 @@ rswag (link)
Stars |
- 1973 |
+ 1974 |
Watchers |
@@ -14663,7 +14663,7 @@ rswag (link)
Last Updated |
- 2024-10-04T08:39:39Z |
+ 2024-10-06T13:29:50Z |
Archived |
@@ -14902,7 +14902,7 @@ Redoc (link)
Stars |
- 23386 |
+ 23390 |
Watchers |
@@ -14910,7 +14910,7 @@ Redoc (link)
Forks |
- 2291 |
+ 2292 |
Created |
@@ -14918,7 +14918,7 @@ Redoc (link)
Last Updated |
- 2024-10-06T02:17:29Z |
+ 2024-10-07T02:51:20Z |
Archived |
@@ -14961,7 +14961,7 @@ openapi-generator-cli (link)
Forks |
- 146 |
+ 147 |
Created |
@@ -15004,7 +15004,7 @@ ogen (link)
Stars |
- 1339 |
+ 1338 |
Watchers |
@@ -15020,7 +15020,7 @@ ogen (link)
Last Updated |
- 2024-10-04T16:25:59Z |
+ 2024-10-06T20:45:46Z |
Archived |
@@ -15106,7 +15106,7 @@ zod-to-openapi (link)
Stars |
- 919 |
+ 920 |
Watchers |
@@ -15122,7 +15122,7 @@ zod-to-openapi (link)
Last Updated |
- 2024-10-05T13:51:00Z |
+ 2024-10-06T18:43:57Z |
Archived |
@@ -15361,7 +15361,7 @@ openapi-tui (link)
Stars |
- 639 |
+ 638 |
Watchers |
@@ -15377,7 +15377,7 @@ openapi-tui (link)
Last Updated |
- 2024-10-05T06:45:02Z |
+ 2024-10-06T22:26:12Z |
Archived |
@@ -15922,7 +15922,7 @@ zod-openapi (link)
Stars |
- 267 |
+ 268 |
Watchers |
@@ -15930,7 +15930,7 @@ zod-openapi (link)
Forks |
- 12 |
+ 13 |
Created |
@@ -15938,7 +15938,7 @@ zod-openapi (link)
Last Updated |
- 2024-10-05T21:03:26Z |
+ 2024-10-07T02:29:17Z |
Archived |
@@ -16483,7 +16483,7 @@ speakeasy (link)
Stars |
- 182 |
+ 184 |
Watchers |
@@ -16499,7 +16499,7 @@ speakeasy (link)
Last Updated |
- 2024-10-04T17:37:33Z |
+ 2024-10-06T21:32:10Z |
Archived |
@@ -17052,7 +17052,7 @@ learn.openapis.org (link)
Forks |
- 56 |
+ 57 |
Created |
@@ -17656,7 +17656,7 @@ httpgenerator (link)
Stars |
- 77 |
+ 78 |
Watchers |
@@ -17672,7 +17672,7 @@ httpgenerator (link)
Last Updated |
- 2024-10-03T12:17:01Z |
+ 2024-10-06T19:04:46Z |
Archived |
@@ -17766,7 +17766,7 @@ openapi-delphi-generator (link)
Forks |
- 12 |
+ 13 |
Created |
@@ -18072,7 +18072,7 @@ openapi (link)
Forks |
- 93 |
+ 94 |
Created |
@@ -19167,10 +19167,10 @@ openapi-schemas (link)
-
Stars |
- 33 |
+ 35 |
Watchers |
@@ -19194,7 +19194,7 @@ vitepress-theme-openapi (link)
Forks |
- 6 |
+ 7 |
Created |
@@ -19202,7 +19202,7 @@ vitepress-theme-openapi (link)
Last Updated |
- 2024-10-06T01:39:50Z |
+ 2024-10-06T17:57:22Z |
Archived |
@@ -20069,7 +20069,7 @@ sbt-openapi-schema (link)
Last Updated |
- 2024-09-26T23:09:48Z |
+ 2024-10-06T06:26:14Z |
Archived |
@@ -28688,7 +28688,7 @@ openapi-workflow-parser (link)
Last Updated |
- 2024-09-25T20:11:37Z |
+ 2024-10-06T16:57:17Z |
Archived |
@@ -32191,7 +32191,7 @@ utoipa (link)
Stars |
- 2245 |
+ 2249 |
Watchers |
@@ -32207,7 +32207,7 @@ utoipa (link)
Last Updated |
- 2024-10-05T14:31:59Z |
+ 2024-10-06T22:40:42Z |
Archived |
@@ -32309,7 +32309,7 @@ oas3-rs (link)
Last Updated |
- 2024-09-30T03:05:55Z |
+ 2024-10-07T03:00:50Z |
Archived |
@@ -39786,10 +39786,10 @@ prettyrestdoc (link)
document
- .getElementById("74ef0931b8963642c1eb5febd3ab5aca-open-button")
+ .getElementById("6b0b55df8cbd772582e7b1db14781e00-open-button")
.onclick = function () {
const wrapper = document.getElementById("tool-content")
- const content = document.getElementById("74ef0931b8963642c1eb5febd3ab5aca-info")
+ const content = document.getElementById("6b0b55df8cbd772582e7b1db14781e00-info")
content.removeAttribute("hidden")
diff --git a/docs/categories/sdk.html b/docs/categories/sdk.html
index 0b9d01c2..548307df 100644
--- a/docs/categories/sdk.html
+++ b/docs/categories/sdk.html
@@ -114,7 +114,7 @@ No
Yes |
Yes |
- 21485 |
+ 21490 |
@@ -183,7 +183,7 @@ No |
Yes |
No |
- 154 |
+ 153 |
@@ -229,7 +229,7 @@ Yes |
Yes |
Yes |
- 1102 |
+ 1105 |
@@ -313,7 +313,7 @@ No |
No |
Yes |
- 9493 |
+ 9494 |
@@ -359,7 +359,7 @@ No |
Yes |
Yes |
- 1867 |
+ 1868 |
@@ -382,7 +382,7 @@ No |
Yes |
Yes |
- 6730 |
+ 6734 |
@@ -426,7 +426,7 @@ No |
Yes |
Yes |
- 4602 |
+ 4603 |
@@ -537,7 +537,7 @@ No |
Yes |
Yes |
- 12576 |
+ 12577 |
@@ -765,7 +765,7 @@ Yes |
Yes |
Yes |
- 2605 |
+ 2612 |
@@ -832,7 +832,7 @@ Yes |
Yes |
No |
- 1385 |
+ 1388 |
@@ -878,7 +878,7 @@ Yes |
Yes |
Yes |
- 5651 |
+ 5652 |
@@ -920,7 +920,7 @@ No |
Yes |
No |
- 3849 |
+ 3851 |
@@ -3169,7 +3169,7 @@ OpenAPI Generator (link)
|
Stars |
- 21485 |
+ 21490 |
Watchers |
@@ -3177,7 +3177,7 @@ OpenAPI Generator (link)
Forks |
- 6504 |
+ 6505 |
Created |
@@ -3185,7 +3185,7 @@ OpenAPI Generator (link)
Last Updated |
- 2024-10-06T02:23:29Z |
+ 2024-10-07T03:28:34Z |
Archived |
@@ -3279,7 +3279,7 @@ Kiota Api Client Generator (link)
Forks |
- 195 |
+ 197 |
Created |
@@ -3322,7 +3322,7 @@ FabriKt (link)
Stars |
- 154 |
+ 153 |
Watchers |
@@ -3330,7 +3330,7 @@ FabriKt (link)
Forks |
- 40 |
+ 41 |
Created |
@@ -3338,7 +3338,7 @@ FabriKt (link)
Last Updated |
- 2024-10-02T16:53:14Z |
+ 2024-10-06T19:26:04Z |
Archived |
@@ -3424,7 +3424,7 @@ @hey-api/openapi-ts (link)
Stars |
- 1102 |
+ 1105 |
Watchers |
@@ -3432,7 +3432,7 @@ @hey-api/openapi-ts (link)
Forks |
- 90 |
+ 92 |
Created |
@@ -3440,7 +3440,7 @@ @hey-api/openapi-ts (link)
Last Updated |
- 2024-10-05T17:42:33Z |
+ 2024-10-07T01:51:17Z |
Archived |
@@ -3628,7 +3628,7 @@ go-swagger (link)
Stars |
- 9493 |
+ 9494 |
Watchers |
@@ -3636,7 +3636,7 @@ go-swagger (link)
Forks |
- 1249 |
+ 1250 |
Created |
@@ -3644,7 +3644,7 @@ go-swagger (link)
Last Updated |
- 2024-10-05T05:00:06Z |
+ 2024-10-06T18:02:33Z |
Archived |
@@ -3730,7 +3730,7 @@ restful-react (link)
Stars |
- 1867 |
+ 1868 |
Watchers |
@@ -3746,7 +3746,7 @@ restful-react (link)
Last Updated |
- 2024-09-30T01:16:42Z |
+ 2024-10-06T09:20:30Z |
Archived |
@@ -3781,7 +3781,7 @@ NSwag (link)
Stars |
- 6730 |
+ 6734 |
Watchers |
@@ -3797,7 +3797,7 @@ NSwag (link)
Last Updated |
- 2024-10-06T02:52:20Z |
+ 2024-10-06T13:46:59Z |
Archived |
@@ -3883,7 +3883,7 @@ Azure AutoRest (link)
Stars |
- 4602 |
+ 4603 |
Watchers |
@@ -3899,7 +3899,7 @@ Azure AutoRest (link)
Last Updated |
- 2024-10-05T04:55:49Z |
+ 2024-10-06T11:32:11Z |
Archived |
@@ -4138,7 +4138,7 @@ OWASP ZAP (link)
Stars |
- 12576 |
+ 12577 |
Watchers |
@@ -4154,7 +4154,7 @@ OWASP ZAP (link)
Last Updated |
- 2024-10-05T15:08:34Z |
+ 2024-10-06T03:55:45Z |
Archived |
@@ -4460,7 +4460,7 @@ Counterfact (link)
Last Updated |
- 2024-10-04T07:16:55Z |
+ 2024-10-06T21:05:56Z |
Archived |
@@ -4648,7 +4648,7 @@ 🌿 Fern (link)
Stars |
- 2605 |
+ 2612 |
Watchers |
@@ -4656,7 +4656,7 @@ 🌿 Fern (link)
Forks |
- 139 |
+ 140 |
Created |
@@ -4664,7 +4664,7 @@ 🌿 Fern (link)
Last Updated |
- 2024-10-05T23:25:29Z |
+ 2024-10-07T02:40:03Z |
Archived |
@@ -4801,7 +4801,7 @@ Swift OpenAPI Generator (link)
Stars |
- 1385 |
+ 1388 |
Watchers |
@@ -4809,7 +4809,7 @@ Swift OpenAPI Generator (link)
Forks |
- 114 |
+ 115 |
Created |
@@ -4817,7 +4817,7 @@ Swift OpenAPI Generator (link)
Last Updated |
- 2024-10-05T23:39:07Z |
+ 2024-10-06T20:45:13Z |
Archived |
@@ -4903,7 +4903,7 @@ OpenAPI TypeScript (link)
Stars |
- 5651 |
+ 5652 |
Watchers |
@@ -4919,7 +4919,7 @@ OpenAPI TypeScript (link)
Last Updated |
- 2024-10-06T02:40:07Z |
+ 2024-10-07T01:12:43Z |
Archived |
@@ -5005,7 +5005,7 @@ openapi-directory (link)
Stars |
- 3849 |
+ 3851 |
Watchers |
@@ -5021,7 +5021,7 @@ openapi-directory (link)
Last Updated |
- 2024-10-05T15:30:52Z |
+ 2024-10-07T02:37:36Z |
Archived |
@@ -5378,7 +5378,7 @@ apiclientcodegen (link)
Last Updated |
- 2024-10-04T17:07:40Z |
+ 2024-10-06T22:03:59Z |
Archived |
@@ -5684,7 +5684,7 @@ sample-quarkus-applications (link)
Last Updated |
- 2024-09-30T10:58:16Z |
+ 2024-10-06T15:24:32Z |
Archived |
diff --git a/docs/categories/security.html b/docs/categories/security.html
index a37a638c..d26f4811 100644
--- a/docs/categories/security.html
+++ b/docs/categories/security.html
@@ -91,7 +91,7 @@ Yes
Yes |
No |
- 214 |
+ 215 |
@@ -240,7 +240,7 @@ No |
Yes |
Yes |
- 12576 |
+ 12577 |
@@ -380,7 +380,7 @@ Rate My OpenAPI (link)
|
Stars |
- 214 |
+ 215 |
Watchers |
@@ -396,7 +396,7 @@ Rate My OpenAPI (link)
Last Updated |
- 2024-10-04T21:39:44Z |
+ 2024-10-06T04:37:07Z |
Archived |
@@ -651,7 +651,7 @@ cats (link)
Last Updated |
- 2024-10-05T21:47:11Z |
+ 2024-10-06T20:07:05Z |
Archived |
@@ -737,7 +737,7 @@ OWASP ZAP (link)
Stars |
- 12576 |
+ 12577 |
Watchers |
@@ -753,7 +753,7 @@ OWASP ZAP (link)
Last Updated |
- 2024-10-05T15:08:34Z |
+ 2024-10-06T03:55:45Z |
Archived |
diff --git a/docs/categories/server-implementations.html b/docs/categories/server-implementations.html
index a2a06e15..81735730 100644
--- a/docs/categories/server-implementations.html
+++ b/docs/categories/server-implementations.html
@@ -114,7 +114,7 @@ Yes
Yes |
No |
- 214 |
+ 215 |
@@ -137,7 +137,7 @@ Yes |
No |
No |
- 1181 |
+ 1182 |
@@ -298,7 +298,7 @@ Yes |
Yes |
Yes |
- 8892 |
+ 8893 |
@@ -367,7 +367,7 @@ No |
Yes |
Yes |
- 8553 |
+ 8555 |
@@ -480,7 +480,7 @@ No |
Yes |
No |
- 5045 |
+ 5046 |
@@ -503,7 +503,7 @@ No |
Yes |
No |
- 483 |
+ 485 |
@@ -549,7 +549,7 @@ No |
Yes |
No |
- 4355 |
+ 4357 |
@@ -616,7 +616,7 @@ No |
Yes |
No |
- 28227 |
+ 28232 |
@@ -777,7 +777,7 @@ No |
Yes |
No |
- 76264 |
+ 76290 |
@@ -800,7 +800,7 @@ No |
Yes |
No |
- 3261 |
+ 3263 |
@@ -821,7 +821,7 @@ No |
Yes |
No |
- 2695 |
+ 2697 |
@@ -842,7 +842,7 @@ No |
Yes |
No |
- 2342 |
+ 2343 |
@@ -863,7 +863,7 @@ No |
Yes |
No |
- 2294 |
+ 2297 |
@@ -1333,7 +1333,7 @@ No |
Yes |
No |
- 197 |
+ 198 |
@@ -1354,7 +1354,7 @@ No |
Yes |
No |
- 186 |
+ 187 |
@@ -1522,7 +1522,7 @@ No |
Yes |
No |
- 103 |
+ 104 |
@@ -2362,7 +2362,7 @@ No |
Yes |
No |
- 19 |
+ 20 |
@@ -3141,7 +3141,7 @@ No |
Yes |
No |
- 8 |
+ 7 |
@@ -9256,7 +9256,7 @@ No |
Yes |
No |
- 26639 |
+ 26657 |
@@ -11705,7 +11705,7 @@ Connexion (link)
|
Forks |
- 761 |
+ 762 |
Created |
@@ -11748,7 +11748,7 @@ Rate My OpenAPI (link)
Stars |
- 214 |
+ 215 |
Watchers |
@@ -11764,7 +11764,7 @@ Rate My OpenAPI (link)
Last Updated |
- 2024-10-04T21:39:44Z |
+ 2024-10-06T04:37:07Z |
Archived |
@@ -11799,7 +11799,7 @@ Scramble (link)
Stars |
- 1181 |
+ 1182 |
Watchers |
@@ -11815,7 +11815,7 @@ Scramble (link)
Last Updated |
- 2024-10-05T06:55:35Z |
+ 2024-10-06T14:56:36Z |
Archived |
@@ -12156,7 +12156,7 @@ Swagger Editor (link)
Stars |
- 8892 |
+ 8893 |
Watchers |
@@ -12164,7 +12164,7 @@ Swagger Editor (link)
Forks |
- 2253 |
+ 2254 |
Created |
@@ -12172,7 +12172,7 @@ Swagger Editor (link)
Last Updated |
- 2024-10-06T02:09:24Z |
+ 2024-10-06T22:02:51Z |
Archived |
@@ -12309,7 +12309,7 @@ API Platform (link)
Stars |
- 8553 |
+ 8555 |
Watchers |
@@ -12325,7 +12325,7 @@ API Platform (link)
Last Updated |
- 2024-10-05T18:34:42Z |
+ 2024-10-06T10:41:47Z |
Archived |
@@ -12529,7 +12529,7 @@ cats (link)
Last Updated |
- 2024-10-05T21:47:11Z |
+ 2024-10-06T20:07:05Z |
Archived |
@@ -12564,7 +12564,7 @@ mitmproxy2swagger (link)
Stars |
- 5045 |
+ 5046 |
Watchers |
@@ -12580,7 +12580,7 @@ mitmproxy2swagger (link)
Last Updated |
- 2024-10-05T07:55:55Z |
+ 2024-10-07T01:48:17Z |
Archived |
@@ -12615,7 +12615,7 @@ OpenApiSpecGeneratorPlugin (link)
Stars |
- 483 |
+ 485 |
Watchers |
@@ -12623,7 +12623,7 @@ OpenApiSpecGeneratorPlugin (link)
Forks |
- 56 |
+ 57 |
Created |
@@ -12631,7 +12631,7 @@ OpenApiSpecGeneratorPlugin (link)
Last Updated |
- 2024-10-06T02:08:31Z |
+ 2024-10-07T02:17:34Z |
Archived |
@@ -12717,7 +12717,7 @@ TypeSpec (link)
Stars |
- 4355 |
+ 4357 |
Watchers |
@@ -12733,7 +12733,7 @@ TypeSpec (link)
Last Updated |
- 2024-10-05T03:58:03Z |
+ 2024-10-06T19:26:20Z |
Archived |
@@ -12870,11 +12870,11 @@ Django REST Framework (link)
Stars |
- 28227 |
+ 28232 |
Watchers |
- 626 |
+ 628 |
Forks |
@@ -12886,7 +12886,7 @@ Django REST Framework (link)
Last Updated |
- 2024-10-06T03:34:40Z |
+ 2024-10-07T02:54:51Z |
Archived |
@@ -13039,7 +13039,7 @@ Counterfact (link)
Last Updated |
- 2024-10-04T07:16:55Z |
+ 2024-10-06T21:05:56Z |
Archived |
@@ -13227,7 +13227,7 @@ FastAPI (link)
Stars |
- 76264 |
+ 76290 |
Watchers |
@@ -13235,7 +13235,7 @@ FastAPI (link)
Forks |
- 6429 |
+ 6433 |
Created |
@@ -13243,7 +13243,7 @@ FastAPI (link)
Last Updated |
- 2024-10-06T02:29:46Z |
+ 2024-10-07T03:24:57Z |
Archived |
@@ -13278,7 +13278,7 @@ springdoc-openapi (link)
Stars |
- 3261 |
+ 3263 |
Watchers |
@@ -13294,7 +13294,7 @@ springdoc-openapi (link)
Last Updated |
- 2024-10-05T23:54:09Z |
+ 2024-10-06T20:24:20Z |
Archived |
@@ -13329,7 +13329,7 @@ uvicorn-gunicorn-fastapi-docker (link)<
Stars |
- 2695 |
+ 2697 |
Watchers |
@@ -13345,7 +13345,7 @@ uvicorn-gunicorn-fastapi-docker (link)<
Last Updated |
- 2024-10-01T23:36:39Z |
+ 2024-10-06T19:15:39Z |
Archived |
@@ -13380,7 +13380,7 @@ drf-spectacular (link)
Stars |
- 2342 |
+ 2343 |
Watchers |
@@ -13396,7 +13396,7 @@ drf-spectacular (link)
Last Updated |
- 2024-10-03T15:10:09Z |
+ 2024-10-06T17:35:11Z |
Archived |
@@ -13431,7 +13431,7 @@ msgspec (link)
Stars |
- 2294 |
+ 2297 |
Watchers |
@@ -13447,7 +13447,7 @@ msgspec (link)
Last Updated |
- 2024-10-05T16:23:14Z |
+ 2024-10-07T01:37:35Z |
Archived |
@@ -13498,7 +13498,7 @@ Schemathesis (link)
Last Updated |
- 2024-10-05T20:11:39Z |
+ 2024-10-06T07:02:06Z |
Archived |
@@ -13549,7 +13549,7 @@ rapidoc (link)
Last Updated |
- 2024-10-05T01:54:33Z |
+ 2024-10-06T19:54:04Z |
Archived |
@@ -13949,7 +13949,7 @@ safrs (link)
Forks |
- 72 |
+ 73 |
Created |
@@ -14110,7 +14110,7 @@ rest (link)
Last Updated |
- 2024-10-05T18:35:56Z |
+ 2024-10-06T10:49:49Z |
Archived |
@@ -14553,7 +14553,7 @@ typescript-backend-toolkit (link)
Stars |
- 197 |
+ 198 |
Watchers |
@@ -14569,7 +14569,7 @@ typescript-backend-toolkit (link)
Last Updated |
- 2024-10-03T09:16:13Z |
+ 2024-10-06T13:36:22Z |
Archived |
@@ -14604,7 +14604,7 @@ flask-openapi3 (link)
Stars |
- 186 |
+ 187 |
Watchers |
@@ -14620,7 +14620,7 @@ flask-openapi3 (link)
Last Updated |
- 2024-10-05T06:09:47Z |
+ 2024-10-06T21:44:52Z |
Archived |
@@ -14722,7 +14722,7 @@ deeptest (link)
Last Updated |
- 2024-10-05T03:56:13Z |
+ 2024-10-07T02:52:54Z |
Archived |
@@ -14816,7 +14816,7 @@ learn.openapis.org (link)
Forks |
- 56 |
+ 57 |
Created |
@@ -15012,7 +15012,7 @@ go-swagger3 (link)
Stars |
- 103 |
+ 104 |
Watchers |
@@ -15028,7 +15028,7 @@ go-swagger3 (link)
Last Updated |
- 2024-09-25T16:32:45Z |
+ 2024-10-07T01:19:56Z |
Archived |
@@ -15079,7 +15079,7 @@ tools.openapis.org (link)
Last Updated |
- 2024-10-05T03:33:42Z |
+ 2024-10-06T03:37:32Z |
Archived |
@@ -17052,7 +17052,7 @@ cloudedbats_wurb_2020 (link)
Stars |
- 19 |
+ 20 |
Watchers |
@@ -17068,7 +17068,7 @@ cloudedbats_wurb_2020 (link)
Last Updated |
- 2024-05-04T22:49:25Z |
+ 2024-10-06T07:48:48Z |
Archived |
@@ -18939,7 +18939,7 @@ go-goa (link)
Stars |
- 8 |
+ 7 |
Watchers |
@@ -18955,7 +18955,7 @@ go-goa (link)
Last Updated |
- 2024-08-06T16:59:54Z |
+ 2024-10-06T20:33:01Z |
Archived |
@@ -21913,7 +21913,7 @@ pulumi-provider-template (link)
Last Updated |
- 2024-10-04T14:53:39Z |
+ 2024-10-07T00:37:25Z |
Archived |
@@ -23647,7 +23647,7 @@ programming-machine-learning (link)
Last Updated |
- 2024-10-06T02:29:11Z |
+ 2024-10-06T22:04:14Z |
Archived |
@@ -27880,7 +27880,7 @@ bs-api-specification (link)
Last Updated |
- 2024-07-28T11:54:23Z |
+ 2024-10-06T13:20:46Z |
Archived |
@@ -27931,7 +27931,7 @@ openapi-native-mock-server (link)
Last Updated |
- 2024-09-01T08:19:17Z |
+ 2024-10-06T14:30:26Z |
Archived |
@@ -28798,7 +28798,7 @@ api-flows-studio (link)
Last Updated |
- 2024-10-05T17:07:09Z |
+ 2024-10-06T16:45:05Z |
Archived |
@@ -29096,7 +29096,7 @@ hub (link)
Forks |
- 6 |
+ 7 |
Created |
@@ -33780,15 +33780,15 @@ full-stack-fastapi-template (link)
Stars |
- 26639 |
+ 26657 |
Watchers |
- 263 |
+ 262 |
Forks |
- 4693 |
+ 4694 |
Created |
@@ -33796,7 +33796,7 @@ full-stack-fastapi-template (link)
Last Updated |
- 2024-10-06T02:27:02Z |
+ 2024-10-07T03:11:49Z |
Archived |
@@ -37264,7 +37264,7 @@ sqlcrud (link)
Last Updated |
- 2024-04-24T00:33:51Z |
+ 2024-10-07T00:17:39Z |
Archived |
diff --git a/docs/categories/server.html b/docs/categories/server.html
index 8d1a34e4..76fd7148 100644
--- a/docs/categories/server.html
+++ b/docs/categories/server.html
@@ -137,7 +137,7 @@ No
Yes |
No |
- 1107 |
+ 1108 |
@@ -229,7 +229,7 @@ No |
Yes |
Yes |
- 8553 |
+ 8555 |
@@ -342,7 +342,7 @@ No |
Yes |
No |
- 1682 |
+ 1683 |
@@ -433,7 +433,7 @@ No |
Yes |
Yes |
- 5927 |
+ 5928 |
@@ -546,7 +546,7 @@ Yes |
Yes |
Yes |
- 2605 |
+ 2612 |
@@ -569,7 +569,7 @@ Yes |
Yes |
No |
- 1385 |
+ 1388 |
@@ -592,7 +592,7 @@ No |
Yes |
No |
- 822 |
+ 824 |
@@ -615,7 +615,7 @@ Yes |
Yes |
No |
- 1946 |
+ 1951 |
@@ -2771,7 +2771,7 @@ No |
Yes |
No |
- 4942 |
+ 4944 |
@@ -2838,7 +2838,7 @@ No |
Yes |
No |
- 1107 |
+ 1108 |
@@ -2900,7 +2900,7 @@ Connexion (link)
|
Forks |
- 761 |
+ 762 |
Created |
@@ -2994,7 +2994,7 @@ Vert.x Web Api Contract (link)
Stars |
- 1107 |
+ 1108 |
Watchers |
@@ -3002,7 +3002,7 @@ Vert.x Web Api Contract (link)
Forks |
- 531 |
+ 532 |
Created |
@@ -3010,7 +3010,7 @@ Vert.x Web Api Contract (link)
Last Updated |
- 2024-10-05T21:15:29Z |
+ 2024-10-06T04:26:21Z |
Archived |
@@ -3198,7 +3198,7 @@ API Platform (link)
Stars |
- 8553 |
+ 8555 |
Watchers |
@@ -3214,7 +3214,7 @@ API Platform (link)
Last Updated |
- 2024-10-05T18:34:42Z |
+ 2024-10-06T10:41:47Z |
Archived |
@@ -3453,7 +3453,7 @@ @nestjs/swagger (link)
Stars |
- 1682 |
+ 1683 |
Watchers |
@@ -3469,7 +3469,7 @@ @nestjs/swagger (link)
Last Updated |
- 2024-10-05T00:11:30Z |
+ 2024-10-06T13:21:43Z |
Archived |
@@ -3657,7 +3657,7 @@ SpringFox (link)
Stars |
- 5927 |
+ 5928 |
Watchers |
@@ -3673,7 +3673,7 @@ SpringFox (link)
Last Updated |
- 2024-10-03T00:56:37Z |
+ 2024-10-06T04:49:09Z |
Archived |
@@ -3912,7 +3912,7 @@ 🌿 Fern (link)
Stars |
- 2605 |
+ 2612 |
Watchers |
@@ -3920,7 +3920,7 @@ 🌿 Fern (link)
Forks |
- 139 |
+ 140 |
Created |
@@ -3928,7 +3928,7 @@ 🌿 Fern (link)
Last Updated |
- 2024-10-05T23:25:29Z |
+ 2024-10-07T02:40:03Z |
Archived |
@@ -3963,7 +3963,7 @@ Swift OpenAPI Generator (link)
Stars |
- 1385 |
+ 1388 |
Watchers |
@@ -3971,7 +3971,7 @@ Swift OpenAPI Generator (link)
Forks |
- 114 |
+ 115 |
Created |
@@ -3979,7 +3979,7 @@ Swift OpenAPI Generator (link)
Last Updated |
- 2024-10-05T23:39:07Z |
+ 2024-10-06T20:45:13Z |
Archived |
@@ -4014,7 +4014,7 @@ Fuego (link)
Stars |
- 822 |
+ 824 |
Watchers |
@@ -4030,7 +4030,7 @@ Fuego (link)
Last Updated |
- 2024-10-05T09:13:24Z |
+ 2024-10-06T11:40:38Z |
Archived |
@@ -4065,7 +4065,7 @@ Huma (link)
Stars |
- 1946 |
+ 1951 |
Watchers |
@@ -4073,7 +4073,7 @@ Huma (link)
Forks |
- 143 |
+ 144 |
Created |
@@ -4081,7 +4081,7 @@ Huma (link)
Last Updated |
- 2024-10-05T07:01:05Z |
+ 2024-10-07T01:18:36Z |
Archived |
@@ -4387,7 +4387,7 @@ openapi-processor-spring (link)
Last Updated |
- 2024-10-04T08:31:09Z |
+ 2024-10-06T08:02:16Z |
Archived |
@@ -9267,7 +9267,7 @@ LoopBack 4 (link)
Stars |
- 4942 |
+ 4944 |
Watchers |
@@ -9283,7 +9283,7 @@ LoopBack 4 (link)
Last Updated |
- 2024-10-06T02:17:36Z |
+ 2024-10-07T00:55:49Z |
Archived |
@@ -9420,7 +9420,7 @@ Vert.x Web API Service (link)
Stars |
- 1107 |
+ 1108 |
Watchers |
@@ -9428,7 +9428,7 @@ Vert.x Web API Service (link)
Forks |
- 531 |
+ 532 |
Created |
@@ -9436,7 +9436,7 @@ Vert.x Web API Service (link)
Last Updated |
- 2024-10-05T21:15:29Z |
+ 2024-10-06T04:26:21Z |
Archived |
diff --git a/docs/categories/testing-tools.html b/docs/categories/testing-tools.html
index e4492b40..414d1467 100644
--- a/docs/categories/testing-tools.html
+++ b/docs/categories/testing-tools.html
@@ -258,7 +258,7 @@ Schemathesis (link)
Last Updated |
- 2024-10-05T20:11:39Z |
+ 2024-10-06T07:02:06Z |
Archived |
@@ -301,7 +301,7 @@ Tcases for OpenAPI (link)
Forks |
- 53 |
+ 54 |
Created |
diff --git a/docs/categories/testing.html b/docs/categories/testing.html
index e8e35b05..fc169f93 100644
--- a/docs/categories/testing.html
+++ b/docs/categories/testing.html
@@ -240,7 +240,7 @@ No
Yes |
No |
- 1639 |
+ 1640 |
@@ -717,7 +717,7 @@ No |
Yes |
No |
- 6308 |
+ 6311 |
@@ -2040,7 +2040,7 @@ No |
Yes |
Yes |
- 499 |
+ 500 |
@@ -3091,7 +3091,7 @@ Step CI (link)
|
Stars |
- 1639 |
+ 1640 |
Watchers |
@@ -3107,7 +3107,7 @@ Step CI (link)
Last Updated |
- 2024-10-06T02:44:48Z |
+ 2024-10-07T00:52:57Z |
Archived |
@@ -3354,7 +3354,7 @@ Tcases for OpenAPI (link)
Forks |
- 53 |
+ 54 |
Created |
@@ -3974,7 +3974,7 @@ Specmatic (link)
Last Updated |
- 2024-10-02T16:34:15Z |
+ 2024-10-06T20:18:26Z |
Archived |
@@ -4213,7 +4213,7 @@ mockoon (link)
Stars |
- 6308 |
+ 6311 |
Watchers |
@@ -4229,7 +4229,7 @@ mockoon (link)
Last Updated |
- 2024-10-06T01:42:19Z |
+ 2024-10-07T01:39:27Z |
Archived |
@@ -4374,7 +4374,7 @@ tcases (link)
Forks |
- 53 |
+ 54 |
Created |
@@ -6626,7 +6626,7 @@ api-frontend (link)
Last Updated |
- 2024-06-24T09:45:42Z |
+ 2024-10-06T14:18:59Z |
Archived |
@@ -7426,7 +7426,7 @@ EvoMaster (link)
Stars |
- 499 |
+ 500 |
Watchers |
@@ -7442,7 +7442,7 @@ EvoMaster (link)
Last Updated |
- 2024-10-05T16:53:25Z |
+ 2024-10-06T20:34:56Z |
Archived |
@@ -8505,7 +8505,7 @@ Tcases for OpenAPI (link)
Forks |
- 53 |
+ 54 |
Created |
diff --git a/docs/categories/text-editors.html b/docs/categories/text-editors.html
index 2695eb18..9ed90eda 100644
--- a/docs/categories/text-editors.html
+++ b/docs/categories/text-editors.html
@@ -157,7 +157,7 @@ Yes
Yes |
Yes |
- 8892 |
+ 8893 |
@@ -594,7 +594,7 @@ Swagger Editor (link)
|
Stars |
- 8892 |
+ 8893 |
Watchers |
@@ -602,7 +602,7 @@ Swagger Editor (link)
Forks |
- 2253 |
+ 2254 |
Created |
@@ -610,7 +610,7 @@ Swagger Editor (link)
Last Updated |
- 2024-10-06T02:09:24Z |
+ 2024-10-06T22:02:51Z |
Archived |
diff --git a/docs/categories/unclassified.html b/docs/categories/unclassified.html
index b253e9f0..dca4dce0 100644
--- a/docs/categories/unclassified.html
+++ b/docs/categories/unclassified.html
@@ -1216,7 +1216,7 @@ modelina (link)
Last Updated |
- 2024-10-06T00:30:09Z |
+ 2024-10-07T00:29:25Z |
Archived |
diff --git a/docs/categories/user-interfaces.html b/docs/categories/user-interfaces.html
index 123f4504..28354c84 100644
--- a/docs/categories/user-interfaces.html
+++ b/docs/categories/user-interfaces.html
@@ -91,7 +91,7 @@ Yes
Yes |
No |
- 26410 |
+ 26418 |
@@ -114,7 +114,7 @@ Yes |
Yes |
No |
- 23386 |
+ 23390 |
@@ -275,7 +275,7 @@ swagger-ui (link)
|
Stars |
- 26410 |
+ 26418 |
Watchers |
@@ -283,7 +283,7 @@ swagger-ui (link)
Forks |
- 8926 |
+ 8927 |
Created |
@@ -291,7 +291,7 @@ swagger-ui (link)
Last Updated |
- 2024-10-06T02:09:19Z |
+ 2024-10-07T03:07:20Z |
Archived |
@@ -326,7 +326,7 @@ Redoc (link)
Stars |
- 23386 |
+ 23390 |
Watchers |
@@ -334,7 +334,7 @@ Redoc (link)
Forks |
- 2291 |
+ 2292 |
Created |
@@ -342,7 +342,7 @@ Redoc (link)
Last Updated |
- 2024-10-06T02:17:29Z |
+ 2024-10-07T02:51:20Z |
Archived |
diff --git a/src/_data/tools.yaml b/src/_data/tools.yaml
index 730761a7..f043635e 100644
--- a/src/_data/tools.yaml
+++ b/src/_data/tools.yaml
@@ -147,11 +147,11 @@
archived: false
stars: 4475
watchers: 84
- forks: 761
+ forks: 762
owner: spec-first
logo: https://avatars.githubusercontent.com/u/58754196?v=4
license: Apache-2.0
- repoEtag: '"63f91568e9b42936918d806912183177a5e96fd8ff6bc1883d62cdf72232abca"'
+ repoEtag: '"cc7944e4c5e1869ed1a279eed32ffdc3ae71de1fdf2f91e926faed2e5a818aab"'
repoLastModified: Fri, 04 Oct 2024 03:34:57 GMT
foundInMaster: true
homepage: https://github.com/zalando/connexion
@@ -241,17 +241,17 @@
repositoryId: 653466139
description: null
created: '2023-06-14T05:39:38Z'
- updated: '2024-10-04T21:39:44Z'
+ updated: '2024-10-06T04:37:07Z'
language: TypeScript
archived: false
- stars: 214
+ stars: 215
watchers: 4
forks: 5
owner: zuplo
logo: https://avatars.githubusercontent.com/u/85497839?v=4
license: MIT
- repoEtag: '"0b1cd828f52e0ff7e391536cbada46f4e73837229ff0e58374b62e978a498c8f"'
- repoLastModified: Fri, 04 Oct 2024 21:39:44 GMT
+ repoEtag: '"5c26bc22ae4a1dc674e9b13d7c1e190a5f42859cab3cade88b260ac4f33f7d22"'
+ repoLastModified: Sun, 06 Oct 2024 04:37:07 GMT
foundInMaster: true
- source:
- https://openapi.tools/
@@ -279,17 +279,17 @@
References ✨ 1st-Class
OpenAPI/Swagger Support
created: '2023-08-16T13:42:32Z'
- updated: '2024-10-06T03:22:27Z'
+ updated: '2024-10-07T00:58:53Z'
language: TypeScript
archived: false
- stars: 6276
+ stars: 6290
watchers: 21
- forks: 204
+ forks: 203
owner: scalar
logo: https://avatars.githubusercontent.com/u/301879?v=4
license: MIT
- repoEtag: '"9af1d47f04038058dbb663d401f644c60ef3c02f04685bd8ebdeb95ea0890b2e"'
- repoLastModified: Sun, 06 Oct 2024 03:22:27 GMT
+ repoEtag: '"f6c3bb72e89c6d4a2424f9ceef054cffde3ed590665d9d59f2c0a41de7d98724"'
+ repoLastModified: Mon, 07 Oct 2024 00:58:53 GMT
foundInMaster: true
- source: https://openapi.tools/
name: Scramble
@@ -317,17 +317,17 @@
Modern Laravel OpenAPI (Swagger) documentation generator. No PHPDoc
annotations required.
created: '2022-08-05T17:16:20Z'
- updated: '2024-10-05T06:55:35Z'
+ updated: '2024-10-06T14:56:36Z'
language: PHP
archived: false
- stars: 1181
+ stars: 1182
watchers: 14
forks: 112
owner: dedoc
logo: https://avatars.githubusercontent.com/u/93313138?v=4
license: MIT
- repoEtag: '"471044a09a6bb9dbfb1c545a2b551f74247721e35c706b1ba0ed06ed5d1c9806"'
- repoLastModified: Sat, 05 Oct 2024 06:55:35 GMT
+ repoEtag: '"e28eff8392154d1ede0db4eedc76108c9bbfd31a29a22f935ebc3955dbf97500"'
+ repoLastModified: Sun, 06 Oct 2024 14:56:36 GMT
foundInMaster: true
- source: https://openapi.tools/
name: Scribe
@@ -405,17 +405,17 @@
repositoryId: 45250726
description: 📘 OpenAPI/Swagger-generated API Reference Documentation
created: '2015-10-30T12:53:02Z'
- updated: '2024-10-06T02:17:29Z'
+ updated: '2024-10-07T02:51:20Z'
language: TypeScript
archived: false
- stars: 23386
+ stars: 23390
watchers: 297
- forks: 2291
+ forks: 2292
owner: Redocly
logo: https://avatars.githubusercontent.com/u/32099856?v=4
license: MIT
- repoEtag: '"40a9e20d11ee3f561103875e390006d1a698b6a53e1fc6251b2f554d871dab13"'
- repoLastModified: Sun, 06 Oct 2024 02:17:29 GMT
+ repoEtag: '"3d8e3b33bf3135be1a261c40f3aae4c222bad24ee0ce10fe23b5fa5503e70864"'
+ repoLastModified: Mon, 07 Oct 2024 02:51:20 GMT
foundInMaster: true
- source: https://openapi.tools/
name: RestCase Docs
@@ -579,7 +579,7 @@
owner: opticdev
logo: https://avatars.githubusercontent.com/u/34556970?v=4
license: MIT
- repoEtag: '"a1efc70bec20ec92d27b790b377760e3a67aea6d7f8d90b0f54ff71cf28bb4da"'
+ repoEtag: '"0c3ef4cafb206bc9b95c117e13faa8ea68346ffaa1953c1958cd9ea6dbbc7f6d"'
repoLastModified: Sat, 05 Oct 2024 20:00:18 GMT
foundInMaster: true
id: 8c3d08406ca659662808d51ddc10b4e4
@@ -966,7 +966,7 @@
owner: airtasker
logo: https://avatars.githubusercontent.com/u/1745680?v=4
license: NOASSERTION
- repoEtag: '"8ba8c5f3f064e336ab8acb804ab4f30cb3cfc4d367de07550c7c228eee7501ee"'
+ repoEtag: '"ba70716677ee067d372deaf6c1ae211fc6943d24cf2404ebe3b525c2534bcd6a"'
repoLastModified: Sat, 21 Sep 2024 22:59:01 GMT
foundInMaster: true
id: 7c28c31ae17b20b046f57bb6765c3939
@@ -1035,17 +1035,17 @@
generation), server stubs, documentation and configuration automatically
given an OpenAPI Spec (v2, v3)
created: '2018-05-12T09:57:56Z'
- updated: '2024-10-06T02:23:29Z'
+ updated: '2024-10-07T03:28:34Z'
language: Java
archived: false
- stars: 21485
+ stars: 21490
watchers: 220
- forks: 6504
+ forks: 6505
owner: OpenAPITools
logo: https://avatars.githubusercontent.com/u/37325267?v=4
license: Apache-2.0
- repoEtag: '"b869e25181c57286a266b708dad35e03720f50c326c867c6a73b5ef8ece68ead"'
- repoLastModified: Sun, 06 Oct 2024 02:23:29 GMT
+ repoEtag: '"4595b8a0b89ad8c6e708cf826c21f0dfc870f82d55f4d4ce1df1736df5e2507c"'
+ repoLastModified: Mon, 07 Oct 2024 03:28:34 GMT
foundInMaster: true
id: 0418f8afcd0196c648d1a46c0c5c20d1
v3_1_link: https://github.com/OpenAPITools/openapi-generator/issues/9083
@@ -1124,11 +1124,11 @@
archived: false
stars: 2870
watchers: 43
- forks: 195
+ forks: 197
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"501d3d7d953025ba631161aa1ce5feec0361a24184ba25281aa8b70eee9395dd"'
+ repoEtag: '"a55dbe402f2d24b774b573337176c214d0874834abc362b297bd44f7aad48d13"'
repoLastModified: Sat, 05 Oct 2024 18:30:32 GMT
foundInMaster: true
- source: https://openapi.tools/
@@ -1157,17 +1157,17 @@
repositoryId: 229844927
description: Generates Kotlin Code from OpenApi3 Specifications
created: '2019-12-24T00:56:42Z'
- updated: '2024-10-02T16:53:14Z'
+ updated: '2024-10-06T19:26:04Z'
language: Kotlin
archived: false
- stars: 154
+ stars: 153
watchers: 12
- forks: 40
+ forks: 41
owner: cjbooms
logo: https://avatars.githubusercontent.com/u/868640?v=4
license: Apache-2.0
- repoEtag: '"4e42ab450213d7e2b658f76309f4c95f1901706ab47f1c3680f11f94c3930270"'
- repoLastModified: Wed, 02 Oct 2024 16:53:14 GMT
+ repoEtag: '"10200286994176daec7581abb063855b1dc1d3dbdad24c21fdeac31b76fc66f6"'
+ repoLastModified: Sun, 06 Oct 2024 19:26:04 GMT
foundInMaster: true
- source:
- https://openapi.tools/
@@ -1359,17 +1359,17 @@
repositoryId: 19390712
description: Swagger Editor
created: '2014-05-02T22:47:10Z'
- updated: '2024-10-06T02:09:24Z'
+ updated: '2024-10-06T22:02:51Z'
language: JavaScript
archived: false
- stars: 8892
+ stars: 8893
watchers: 262
- forks: 2253
+ forks: 2254
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"d6d477fc5eea215b3c1bd9e1ef83e51e989d1afabd774cbf829480268cfc2a3d"'
- repoLastModified: Sun, 06 Oct 2024 02:09:24 GMT
+ repoEtag: '"e4dbff0a3e7d40251b39b7251f240ad6618efcf0da9ade8aa401fa1d0a8f2543"'
+ repoLastModified: Sun, 06 Oct 2024 22:02:51 GMT
foundInMaster: true
id: 951cf61d12c812ef9b201ad76b5d278d
v3_1: true
@@ -1960,7 +1960,7 @@
owner: lukeautry
logo: https://avatars.githubusercontent.com/u/8770560?v=4
license: MIT
- repoEtag: '"67900a35d7754cbcebed4c4606780dbbea5f48e3eff59be441554893c38dd535"'
+ repoEtag: '"d8c77559704f9c9653bff73f02309cb34f53bca1138661127feb7e3d57a1c641"'
repoLastModified: Sat, 05 Oct 2024 01:53:14 GMT
foundInMaster: true
id: 2529db76d3d9f042b0c624f65b13fc41
@@ -1978,17 +1978,17 @@
repositoryId: 741524414
description: ✨ Turn your OpenAPI specification into a beautiful TypeScript client
created: '2024-01-10T15:19:25Z'
- updated: '2024-10-05T17:42:33Z'
+ updated: '2024-10-07T01:51:17Z'
language: TypeScript
archived: false
- stars: 1102
+ stars: 1105
watchers: 8
- forks: 90
+ forks: 92
owner: hey-api
logo: https://avatars.githubusercontent.com/u/164436240?v=4
license: NOASSERTION
- repoEtag: '"8cda7e4637a7b5c5db165c5dfa99f2f55bd4df0e58e1bb0fd621e54ea98ad54b"'
- repoLastModified: Sat, 05 Oct 2024 17:42:33 GMT
+ repoEtag: '"a5081cdd893284c4312d2a46c05749a7c937f1fee05d2064bd1c36bd9ef12bd0"'
+ repoLastModified: Mon, 07 Oct 2024 01:51:17 GMT
category:
- Converters
- SDK
@@ -2024,17 +2024,17 @@
repositoryId: 26628954
description: HTTP web applications for Vert.x
created: '2014-11-14T08:15:20Z'
- updated: '2024-10-05T21:15:29Z'
+ updated: '2024-10-06T04:26:21Z'
language: Java
archived: false
- stars: 1107
+ stars: 1108
watchers: 82
- forks: 531
+ forks: 532
owner: vert-x3
logo: https://avatars.githubusercontent.com/u/8124623?v=4
license: Apache-2.0
- repoEtag: '"a36e949a4a3e58361b393993b2fd638c11367fac72760b773cfa81bf5da47297"'
- repoLastModified: Sat, 05 Oct 2024 21:15:29 GMT
+ repoEtag: '"e7048822bcaabff0001441c6a6e04f57e720df85e023f419af9ed0d4ba398728"'
+ repoLastModified: Sun, 06 Oct 2024 04:26:21 GMT
foundInMaster: true
v3_link: https://github.com/vert-x3/vertx-web/issues/1872
id: 2657bfe401922934e35bc38fbbef6b6d
@@ -2165,17 +2165,17 @@
🕸️ Create REST and GraphQL APIs, scaffold Jamstack webapps, stream
changes in real-time.
created: '2015-03-06T21:46:05Z'
- updated: '2024-10-05T18:34:42Z'
+ updated: '2024-10-06T10:41:47Z'
language: TypeScript
archived: false
- stars: 8553
+ stars: 8555
watchers: 213
forks: 960
owner: api-platform
logo: https://avatars.githubusercontent.com/u/13420081?v=4
license: MIT
- repoEtag: '"15ad730a500f8700ba86de7ff359c602dc5a7b21126d8ec1241a17002b9e1232"'
- repoLastModified: Sat, 05 Oct 2024 18:34:42 GMT
+ repoEtag: '"489bf898b98c0a95f54b28cb250fbc0acbed29ac48403addfa6679ee888f14bf"'
+ repoLastModified: Sun, 06 Oct 2024 10:41:47 GMT
foundInMaster: true
id: d14f5904300aabf1ceef4660a6b3d57e
- source: https://openapi.tools/
@@ -2347,17 +2347,17 @@
repositoryId: 105440153
description: 'OpenAPI (Swagger) module for Nest framework (node.js) :earth_americas:'
created: '2017-10-01T12:20:24Z'
- updated: '2024-10-05T00:11:30Z'
+ updated: '2024-10-06T13:21:43Z'
language: TypeScript
archived: false
- stars: 1682
+ stars: 1683
watchers: 31
forks: 469
owner: nestjs
logo: https://avatars.githubusercontent.com/u/28507035?v=4
license: MIT
- repoEtag: '"4b9a2809aa9b2fc6e1cb7b8e03a4511c1049af972e783b4b03065b3512601516"'
- repoLastModified: Sat, 05 Oct 2024 00:11:30 GMT
+ repoEtag: '"2f31781307e86b1908619cde70b733ed971c9c3165c81155080201c084e0a53c"'
+ repoLastModified: Sun, 06 Oct 2024 13:21:43 GMT
foundInMaster: true
id: 7071babd9853fc901c5decfa9b465b67
- source:
@@ -2600,17 +2600,17 @@
repositoryId: 537500924
description: Automated API Testing and Quality Assurance
created: '2022-09-16T14:48:21Z'
- updated: '2024-10-06T02:44:48Z'
+ updated: '2024-10-07T00:52:57Z'
language: TypeScript
archived: false
- stars: 1639
+ stars: 1640
watchers: 14
forks: 76
owner: stepci
logo: https://avatars.githubusercontent.com/u/61350067?v=4
license: MPL-2.0
- repoEtag: '"a19f61b706bf8e7340905222d5db92aaddb16f3e53959c2030667acb2a11e767"'
- repoLastModified: Sun, 06 Oct 2024 02:44:48 GMT
+ repoEtag: '"5d655dfafe8e2c2ea479fc0d50b0c02c287739cbe55179efc4a9415e40f911fb"'
+ repoLastModified: Mon, 07 Oct 2024 00:52:57 GMT
foundInMaster: true
- source:
- https://openapi.tools/
@@ -2681,17 +2681,17 @@
baked in support for OpenAPI (v3.1, v3.0, and v2.0), Arazzo v1.0, as well
as AsyncAPI v2.x.
created: '2018-08-15T18:43:18Z'
- updated: '2024-10-04T18:19:30Z'
+ updated: '2024-10-06T10:51:51Z'
language: TypeScript
archived: false
- stars: 2479
+ stars: 2480
watchers: 34
forks: 233
owner: stoplightio
logo: https://avatars.githubusercontent.com/u/10767217?v=4
license: Apache-2.0
- repoEtag: '"ce86a226a05c526f3483d7504f5c6272230d2db1f040bafddeaf407f9816cb8e"'
- repoLastModified: Fri, 04 Oct 2024 18:19:30 GMT
+ repoEtag: '"a3888b7107c2114c15160a1b0c124e9af9de545e5e95f52bd1ddf83caa045777"'
+ repoLastModified: Sun, 06 Oct 2024 10:51:51 GMT
foundInMaster: true
id: fab3cc58898cd8953a30e43cc622e0fe
- source: https://openapi.tools/
@@ -2977,11 +2977,11 @@
archived: false
stars: 781
watchers: 46
- forks: 526
+ forks: 527
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"f64f0d894eb1cffb4884983fbd824d0814ed9c13041050b7926546de69435cd9"'
+ repoEtag: '"d48996f477c711de5b9a5bf8a2262c175eafb11739c90c663c8045b8f833423b"'
repoLastModified: Fri, 04 Oct 2024 22:29:51 GMT
foundInMaster: true
id: 45f46a8f7ac698cfe3926303bf3dff9d
@@ -3001,17 +3001,17 @@
repositoryId: 25453221
description: Swagger 2.0 and OpenAPI 3.0 parser/validator
created: '2014-10-20T06:14:51Z'
- updated: '2024-09-27T11:29:50Z'
+ updated: '2024-10-06T21:05:01Z'
language: JavaScript
archived: false
- stars: 1097
+ stars: 1096
watchers: 18
forks: 155
owner: APIDevTools
logo: https://avatars.githubusercontent.com/u/43750074?v=4
license: MIT
- repoEtag: '"1a896f5b8e7305055ed8763dc68fbcc999bab6422375defaecdb0d6e1e7a348e"'
- repoLastModified: Fri, 27 Sep 2024 11:29:50 GMT
+ repoEtag: '"5a8a2938f632c5e1c497b7072c177e6ab1c7dca7d7ba13d18ef9d3454cbe7318"'
+ repoLastModified: Sun, 06 Oct 2024 21:05:01 GMT
category: Parsers
foundInMaster: true
name: APIDevTools/swagger-parser
@@ -3178,7 +3178,7 @@
owner: getkin
logo: https://avatars.githubusercontent.com/u/40365715?v=4
license: MIT
- repoEtag: '"094fda60b9d9909fdfd16c8ab0ea26abbeda40b5013446ce715b8a46aeeb9c56"'
+ repoEtag: '"2060c7339c62a5bc16182bd1632ebf7f9d26a943ae0805ee56361d80aa57dcd9"'
repoLastModified: Fri, 04 Oct 2024 17:58:45 GMT
foundInMaster: true
v2: true
@@ -3252,17 +3252,17 @@
Read and write OpenAPI yaml/json files and make the content accessible in
PHP objects.
created: '2018-10-23T10:46:11Z'
- updated: '2024-10-04T04:16:38Z'
+ updated: '2024-10-06T14:58:56Z'
language: PHP
archived: false
- stars: 469
+ stars: 470
watchers: 22
forks: 89
owner: cebe
logo: https://avatars.githubusercontent.com/u/189796?v=4
license: MIT
- repoEtag: '"7ec8f365812faf030a05abe219606d255601f356b8a50439a4849929b0c74710"'
- repoLastModified: Fri, 04 Oct 2024 04:16:38 GMT
+ repoEtag: '"7878bd928e84e528323ffcf612b7250dd905907d5f84e42a92c7ad53e76d4f18"'
+ repoLastModified: Sun, 06 Oct 2024 14:58:56 GMT
foundInMaster: true
v3_1_link: https://github.com/cebe/php-openapi/pull/128
id: 3a26d5049f03c42cb9771c179db0f35f
@@ -3585,17 +3585,17 @@
repositoryId: 26726495
description: Swagger 2.0 implementation for go
created: '2014-11-16T20:13:15Z'
- updated: '2024-10-05T05:00:06Z'
+ updated: '2024-10-06T18:02:33Z'
language: Go
archived: false
- stars: 9493
+ stars: 9494
watchers: 120
- forks: 1249
+ forks: 1250
owner: go-swagger
logo: https://avatars.githubusercontent.com/u/10362650?v=4
license: Apache-2.0
- repoEtag: '"4a1476a35c66e015160d5f3fc944214dd095abb13a094a911369e57a2d7146f8"'
- repoLastModified: Sat, 05 Oct 2024 05:00:06 GMT
+ repoEtag: '"3e4f171bf821fbce6c4b95967ba0990a9c1464def338dffbe89b8997ff2ec875"'
+ repoLastModified: Sun, 06 Oct 2024 18:02:33 GMT
foundInMaster: true
id: ef136df9ffb40bb33ccbd76665d8f5b4
- source: https://openapi.tools/
@@ -3658,17 +3658,17 @@
A consistent, declarative way of interacting with RESTful backends,
featuring code-generation from Swagger and OpenAPI specs 🔥
created: '2018-06-29T12:52:25Z'
- updated: '2024-09-30T01:16:42Z'
+ updated: '2024-10-06T09:20:30Z'
language: TypeScript
archived: true
- stars: 1867
+ stars: 1868
watchers: 19
forks: 109
owner: contiamo
logo: https://avatars.githubusercontent.com/u/862286?v=4
license: MIT
- repoEtag: '"ee45d38cd7859d2e7745bf2e4edf9cc680cf5231e0e67b7f91206b6591272ab6"'
- repoLastModified: Mon, 30 Sep 2024 01:16:42 GMT
+ repoEtag: '"8d5741d940cc128624a5a84f78d3a5e1749bdc2e0d43b3ad8721bf31c2efa894"'
+ repoLastModified: Sun, 06 Oct 2024 09:20:30 GMT
foundInMaster: true
id: 7fa6fa97d3fc13594a92cd5594506906
- source: https://openapi.tools/
@@ -3688,17 +3688,17 @@
repositoryId: 41822320
description: 'The Swagger/OpenAPI toolchain for .NET, ASP.NET Core and TypeScript. '
created: '2015-09-02T19:11:57Z'
- updated: '2024-10-06T02:52:20Z'
+ updated: '2024-10-06T13:46:59Z'
language: C#
archived: false
- stars: 6730
+ stars: 6734
watchers: 167
forks: 1290
owner: RicoSuter
logo: https://avatars.githubusercontent.com/u/2603405?v=4
license: MIT
- repoEtag: '"025fc0ffd2b58bca4d4ce8a0d021f3d9f62b74e1c6223ba8cd5b133c2e391804"'
- repoLastModified: Sun, 06 Oct 2024 02:52:20 GMT
+ repoEtag: '"875341ab825dd6570286847357d95da0ab05a5aa4599d9f934d3111cc65d52dd"'
+ repoLastModified: Sun, 06 Oct 2024 13:46:59 GMT
foundInMaster: true
id: 93636e95435e95198d7d15c9d507f0d3
- source: https://openapi.tools/
@@ -3761,17 +3761,17 @@
documentation, API clients and server stubs in different languages by
parsing your OpenAPI / Swagger definition.
created: '2011-07-06T14:26:48Z'
- updated: '2024-10-05T22:24:20Z'
+ updated: '2024-10-06T16:45:35Z'
language: Mustache
archived: false
- stars: 16938
+ stars: 16940
watchers: 413
- forks: 6026
+ forks: 6028
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"98d2c5c30627e9751551ff9b1fe73e10283405e752c9f0dda09547628bf8b8cd"'
- repoLastModified: Sat, 05 Oct 2024 22:24:20 GMT
+ repoEtag: '"57ec0a016844c70f69f89398ad9fed2bc7ca56b99b6bcfd86b27e775eb331b27"'
+ repoLastModified: Sun, 06 Oct 2024 16:45:35 GMT
foundInMaster: true
id: eda1e66e1b7805496e42f57851791a32
- source: https://openapi.tools/
@@ -3795,17 +3795,17 @@
OpenAPI (f.k.a Swagger) Specification code generator. Supports C#,
PowerShell, Go, Java, Node.js, TypeScript, Python
created: '2015-02-20T23:02:54Z'
- updated: '2024-10-05T04:55:49Z'
+ updated: '2024-10-06T11:32:11Z'
language: TypeScript
archived: false
- stars: 4602
+ stars: 4603
watchers: 898
forks: 734
owner: Azure
logo: https://avatars.githubusercontent.com/u/6844498?v=4
license: MIT
- repoEtag: '"c71513cad9cd8647d7ce59997597a3e80a5f464426ed1b3a60fbfb4dc5d1943d"'
- repoLastModified: Sat, 05 Oct 2024 04:55:49 GMT
+ repoEtag: '"8f9e5787f7d8ea91967dcbb1f1a72031d7ad663ba769d44e84738c67b75c0409"'
+ repoLastModified: Sun, 06 Oct 2024 11:32:11 GMT
foundInMaster: true
id: 648d92bca90bf58cd74407e0bcad2936
- source: https://openapi.tools/
@@ -4116,11 +4116,11 @@
archived: false
stars: 218
watchers: 20
- forks: 53
+ forks: 54
owner: Cornutum
logo: https://avatars.githubusercontent.com/u/11477145?v=4
license: MIT
- repoEtag: '"4e21dbadfcd911dd3971b921ae955857f1f7e1501602300b587f29f62645963d"'
+ repoEtag: '"b70e0ee59614dee78e192e25ce9b905c342d5ee0e492c1706ef454549bb780b5"'
repoLastModified: Fri, 04 Oct 2024 18:31:46 GMT
foundInMaster: true
id: 64dc602f01798a9a39aba18c09d655ae
@@ -4230,7 +4230,7 @@
configuration and no coding effort. Tests are self-healing and do not
require maintenance.
created: '2020-04-02T13:14:39Z'
- updated: '2024-10-05T21:47:11Z'
+ updated: '2024-10-06T20:07:05Z'
language: Java
archived: false
stars: 1175
@@ -4239,8 +4239,8 @@
owner: Endava
logo: https://avatars.githubusercontent.com/u/19396140?v=4
license: Apache-2.0
- repoEtag: '"64af94f86658a4216a7728e186d96a43988ea1b18c5d9914137ec12484a5c825"'
- repoLastModified: Sat, 05 Oct 2024 21:47:11 GMT
+ repoEtag: '"32c2f3c4aa11c801fb2e0b5098ef0531185dd80cc155c366652289dee2a46227"'
+ repoLastModified: Sun, 06 Oct 2024 20:07:05 GMT
foundInMaster: true
- source: https://openapi.tools/
name: API Insights
@@ -4471,16 +4471,16 @@
repositoryId: 491304964
description: Automagically reverse-engineer REST APIs via capturing traffic
created: '2022-05-11T23:48:49Z'
- updated: '2024-10-05T07:55:55Z'
+ updated: '2024-10-07T01:48:17Z'
language: HTML
archived: false
- stars: 5045
+ stars: 5046
watchers: 23
forks: 219
owner: alufers
logo: https://avatars.githubusercontent.com/u/5400940?v=4
- repoEtag: '"fffdd9e126aa13922f22d2b0533f58561ebd230fd621d390ef8cd2d349aecffc"'
- repoLastModified: Sat, 05 Oct 2024 07:55:55 GMT
+ repoEtag: '"06ec5e200580d29fcd7e834718aa3e449ec23a6cc7715de5aba4a2da3a1580dc"'
+ repoLastModified: Mon, 07 Oct 2024 01:48:17 GMT
foundInMaster: true
- source: https://openapi.tools/
name: OpenApiSpecGeneratorPlugin
@@ -4506,17 +4506,17 @@
Dev Proxy is an API simulator that helps you effortlessly test your app
beyond the happy path.
created: '2022-09-09T18:11:29Z'
- updated: '2024-10-06T02:08:31Z'
+ updated: '2024-10-07T02:17:34Z'
language: C#
archived: false
- stars: 483
+ stars: 485
watchers: 16
- forks: 56
+ forks: 57
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"0b6cb464c666e467a42e1be4360b555c25e74305878529417648055d9d6e8859"'
- repoLastModified: Sun, 06 Oct 2024 02:08:31 GMT
+ repoEtag: '"84755762af0207f0b62c3fd53bcc1f3444d0f25f3d4cda0738f20aa32caec4af"'
+ repoLastModified: Mon, 07 Oct 2024 02:17:34 GMT
foundInMaster: true
- source: https://openapi.tools/
name: har2openapi
@@ -4649,17 +4649,17 @@
repositoryId: 709571808
description: Browser extension that generates API specs for any app or website
created: '2023-10-25T00:36:06Z'
- updated: '2024-10-04T18:25:02Z'
+ updated: '2024-10-07T01:48:50Z'
language: TypeScript
archived: false
- stars: 3918
+ stars: 3917
watchers: 22
forks: 72
owner: AndrewWalsh
logo: https://avatars.githubusercontent.com/u/15863952?v=4
license: MIT
- repoEtag: '"58d150518f9ec0e073877df2eccfb75d02b66a4cb3d7446bd10b69b0879bd4bc"'
- repoLastModified: Fri, 04 Oct 2024 18:25:02 GMT
+ repoEtag: '"7f3c3eb455d96cc17ad93d1014befcc83178a0286a4f8530ba1be8cb77dc139c"'
+ repoLastModified: Mon, 07 Oct 2024 01:48:50 GMT
category:
- Auto Generators
- Documentation
@@ -4686,17 +4686,17 @@
repositoryId: 381857226
description: null
created: '2021-06-30T23:29:49Z'
- updated: '2024-10-05T03:58:03Z'
+ updated: '2024-10-06T19:26:20Z'
language: Java
archived: false
- stars: 4355
+ stars: 4357
watchers: 45
forks: 203
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"7c96d2de1c5cd9d24a37d2e65698c1c0cc73769f76337a8c4d26d07f7f1b6f42"'
- repoLastModified: Sat, 05 Oct 2024 03:58:03 GMT
+ repoEtag: '"4bc73f122ea318560d9269d549e3cd8212ad3695b37b787cc8abb60459a0a918"'
+ repoLastModified: Sun, 06 Oct 2024 19:26:20 GMT
category:
- Auto Generators
- Server Implementations
@@ -4817,7 +4817,7 @@
owner: codekie
logo: https://avatars.githubusercontent.com/u/1512840?v=4
license: MIT
- repoEtag: '"0ad2af8eaad99f74204ac9b060a750bfb1521d65e59d9ea6c4cc70094295b14c"'
+ repoEtag: '"5085a4ceb1f983860e4b9cc88270179f4bfee4312315284c298002e80a0bbe6a"'
repoLastModified: Wed, 28 Aug 2024 16:03:44 GMT
foundInMaster: true
id: 301e3f380f248daf345a88c8971d2a71
@@ -4881,17 +4881,17 @@
repositoryId: 345077537
description: Format an OpenAPI document by ordering, formatting and filtering fields.
created: '2021-03-06T11:31:52Z'
- updated: '2024-10-04T18:54:42Z'
+ updated: '2024-10-06T12:30:26Z'
language: JavaScript
archived: false
- stars: 94
+ stars: 95
watchers: 4
forks: 15
owner: thim81
logo: https://avatars.githubusercontent.com/u/952446?v=4
license: MIT
- repoEtag: '"2605a298bb85ed5a92cbcfb9e23bf8567fdee46cbf64c5c657d80a36c541f05d"'
- repoLastModified: Fri, 04 Oct 2024 18:54:42 GMT
+ repoEtag: '"5466ee3667fc1c5f5ffaa1833291204e36aafcb476331798e7d6751df076c2ca"'
+ repoLastModified: Sun, 06 Oct 2024 12:30:26 GMT
foundInMaster: true
id: 788dd625de099d0d3403fe30067f3743
v3_1: true
@@ -4926,7 +4926,7 @@
owner: github
logo: https://avatars.githubusercontent.com/u/9919?v=4
license: MIT
- repoEtag: '"3d401cb8aee58ab4f15763e1d34c7c7df5327817ca45849f334cdf8ae9c8d9ec"'
+ repoEtag: '"ae42543bc95b413e915789a5f7d3ad8440496fd7d527e3732d41dab95ba6c1e4"'
repoLastModified: Sat, 05 Oct 2024 16:14:07 GMT
foundInMaster: true
id: ec6a7a1e4a69a9beeb95bdebb88cb36d
@@ -4952,17 +4952,17 @@
repositoryId: 4238977
description: Automated JSON API documentation for API's built with Spring
created: '2012-05-06T06:38:57Z'
- updated: '2024-10-03T00:56:37Z'
+ updated: '2024-10-06T04:49:09Z'
language: Java
archived: false
- stars: 5927
+ stars: 5928
watchers: 265
forks: 1537
owner: springfox
logo: https://avatars.githubusercontent.com/u/11529357?v=4
license: Apache-2.0
- repoEtag: '"3370b9183826850098c620aa0b1d1d5b6af6a552bdf670e5a6d81363594cbd0b"'
- repoLastModified: Thu, 03 Oct 2024 00:56:37 GMT
+ repoEtag: '"b0d393cca42455b999a906d04d33096464047b0b49f7d2aa4b5d28446b58ba8d"'
+ repoLastModified: Sun, 06 Oct 2024 04:49:09 GMT
foundInMaster: true
id: 2addde4c497bf582f20025ccac2cda86
- source:
@@ -5020,17 +5020,17 @@
repositoryId: 36817565
description: The ZAP by Checkmarx Core project
created: '2015-06-03T16:55:01Z'
- updated: '2024-10-05T15:08:34Z'
+ updated: '2024-10-06T03:55:45Z'
language: Java
archived: false
- stars: 12576
+ stars: 12577
watchers: 394
forks: 2249
owner: zaproxy
logo: https://avatars.githubusercontent.com/u/6716868?v=4
license: Apache-2.0
- repoEtag: '"31c54f81e9e60f916399e4f22233ad039593c3f05be8d61d1167907c612d812d"'
- repoLastModified: Sat, 05 Oct 2024 15:08:34 GMT
+ repoEtag: '"a650bd10d941d9193e0d36f6200a72ea71981f50edbff32e02b7e1fee0a6de99"'
+ repoLastModified: Sun, 06 Oct 2024 03:55:45 GMT
foundInMaster: true
id: 9eedc1be44837a65f912bcf562844f39
- source:
@@ -5364,17 +5364,17 @@
repositoryId: 1431547
description: Web APIs for Django. 🎸
created: '2011-03-02T17:13:56Z'
- updated: '2024-10-06T03:34:40Z'
+ updated: '2024-10-07T02:54:51Z'
language: Python
archived: false
- stars: 28227
- watchers: 626
+ stars: 28232
+ watchers: 628
forks: 6818
owner: encode
logo: https://avatars.githubusercontent.com/u/19159390?v=4
license: NOASSERTION
- repoEtag: '"820297583d8031e2ecdf862a08b96639668b76418191fb69aec0975a92b50e9d"'
- repoLastModified: Sun, 06 Oct 2024 03:34:40 GMT
+ repoEtag: '"f8d8ee18e2cda2eae97e274ec5d9207846ffb10149d296c9136cf27c37bc32aa"'
+ repoLastModified: Mon, 07 Oct 2024 02:54:51 GMT
foundInMaster: true
id: fb8994c078a380cc3510b024f6ed1202
category: Server Implementations
@@ -5599,17 +5599,17 @@
Build beautiful, interactive API Docs with embeddable React or Web
Components, powered by OpenAPI and Markdown.
created: '2019-05-03T01:05:01Z'
- updated: '2024-10-05T10:20:20Z'
+ updated: '2024-10-06T18:16:37Z'
language: TypeScript
archived: false
- stars: 1739
+ stars: 1738
watchers: 18
forks: 202
owner: stoplightio
logo: https://avatars.githubusercontent.com/u/10767217?v=4
license: Apache-2.0
- repoEtag: '"081be052912dbc1db3fc2dc3e8738132369a221fdf6eb282bfd56cebd0242328"'
- repoLastModified: Sat, 05 Oct 2024 10:20:20 GMT
+ repoEtag: '"49002c3ce31b6692b9ed2aab7584979ce9728da139b75ae28a68caef6d0e93d5"'
+ repoLastModified: Sun, 06 Oct 2024 18:16:37 GMT
foundInMaster: true
id: 2f94cc1fc980953b17a9979d4ff2e7ec
- source:
@@ -5735,17 +5735,17 @@
undefined user behaviour by auditing your API specifications, validating
them and running API security tests.
created: '2021-11-17T07:02:22Z'
- updated: '2024-10-05T15:06:44Z'
+ updated: '2024-10-06T10:31:08Z'
language: Rust
archived: false
- stars: 1122
+ stars: 1123
watchers: 12
forks: 78
owner: blst-security
logo: https://avatars.githubusercontent.com/u/54233087?v=4
license: Apache-2.0
- repoEtag: '"6b46d960f1e463d527ada59b3dad4bd182a9a8cc3ef0395b2b2c2984c9efefa3"'
- repoLastModified: Sat, 05 Oct 2024 15:06:44 GMT
+ repoEtag: '"868bb5843d12453a43668696041839e0c9e27a3cdcdc2525f6b3c199a359d412"'
+ repoLastModified: Sun, 06 Oct 2024 10:31:08 GMT
foundInMaster: true
name: Cherrybomb
category: Description Validators
@@ -5938,17 +5938,17 @@
repositoryId: 502576077
description: A MkDocs plugin supports adding Swagger UI to the page.
created: '2022-06-12T09:49:37Z'
- updated: '2024-10-03T14:21:43Z'
+ updated: '2024-10-06T04:47:04Z'
language: CSS
archived: false
- stars: 77
+ stars: 78
watchers: 1
forks: 8
owner: blueswen
logo: https://avatars.githubusercontent.com/u/1564148?v=4
license: MIT
- repoEtag: '"d1c205e7805c28e21c2a8def7c23dcbdfa5cedc69db4da943c5368d2e6541189"'
- repoLastModified: Thu, 03 Oct 2024 14:21:43 GMT
+ repoEtag: '"4351cb700556f4e8f4f845e2ae9e9f319bee7ff9e93510b4cca37da171c37a4f"'
+ repoLastModified: Sun, 06 Oct 2024 04:47:04 GMT
category:
- Documentation
- Parsers
@@ -6011,7 +6011,7 @@
repositoryId: 479515560
description: OpenAPI / Swagger to TypeScript generator and mock server
created: '2022-04-08T19:32:15Z'
- updated: '2024-10-04T07:16:55Z'
+ updated: '2024-10-06T21:05:56Z'
language: TypeScript
archived: false
stars: 104
@@ -6020,8 +6020,8 @@
owner: pmcelhaney
logo: https://avatars.githubusercontent.com/u/51504?v=4
license: MIT
- repoEtag: '"9bb442bab6aaec63b2da956e959458e87565605eef8f516700b844804c52c9b8"'
- repoLastModified: Fri, 04 Oct 2024 07:16:55 GMT
+ repoEtag: '"7f76e2aa196ae0360df6efe5576b1f4284f6f24cf5f4c5a219e0e8d595669593"'
+ repoLastModified: Sun, 06 Oct 2024 21:05:56 GMT
category:
- Mock
- SDK
@@ -6169,7 +6169,7 @@
libopenapi is a fully featured, high performance OpenAPI 3.1, 3.0 and
Swagger parser, library, validator and toolkit for golang applications.
created: '2022-07-17T19:41:10Z'
- updated: '2024-10-04T20:01:27Z'
+ updated: '2024-10-06T11:15:58Z'
language: Go
archived: false
stars: 452
@@ -6178,8 +6178,8 @@
owner: pb33f
logo: https://avatars.githubusercontent.com/u/104016643?v=4
license: NOASSERTION
- repoEtag: '"f9ce2c0fc86acc19e7c3d52916ec50abe17f84023ac428d1782dd2044c68ae6c"'
- repoLastModified: Fri, 04 Oct 2024 20:01:27 GMT
+ repoEtag: '"bb4bb4ae68fb421dd1a024220c5e81a73beedcc6457e5dbd4441723b9ed514d4"'
+ repoLastModified: Sun, 06 Oct 2024 11:15:58 GMT
category: Parsers
foundInMaster: true
name: libopenapi
@@ -6474,7 +6474,7 @@
Development - Collaboratively Design & Independently Deploy MicroServices
& MicroFrontends.
created: '2020-03-16T13:33:07Z'
- updated: '2024-10-02T16:34:15Z'
+ updated: '2024-10-06T20:18:26Z'
language: Kotlin
archived: false
stars: 275
@@ -6483,8 +6483,8 @@
owner: znsio
logo: https://avatars.githubusercontent.com/u/75619722?v=4
license: MIT
- repoEtag: '"30f410b3acfb271fb2629fabc27fedf581f6f768c11fef85512f19927df5403e"'
- repoLastModified: Wed, 02 Oct 2024 16:34:15 GMT
+ repoEtag: '"c0ea651a040e3ca302e49379f684ae18c95178b2b4b31366f4e07937e24e4e8f"'
+ repoLastModified: Sun, 06 Oct 2024 20:18:26 GMT
foundInMaster: true
- source:
- https://openapi.tools/
@@ -6670,7 +6670,7 @@
owner: gcatanese
logo: https://avatars.githubusercontent.com/u/1771700?v=4
license: Apache-2.0
- repoEtag: '"c8ff50eba0083659ed3edd2a5b7296b8d9969728317b3e1bc70a972ad4029a7b"'
+ repoEtag: '"68cc1c5264ab3e03999d03ca7c6342de1f636b8ce891f9140e8295517a6d5b00"'
repoLastModified: Tue, 01 Oct 2024 12:44:48 GMT
foundInMaster: true
- source: https://openapi.tools/
@@ -6824,17 +6824,17 @@
repositoryId: 29151578
description: Seamlessly adds a Swagger to Rails-based API's
created: '2015-01-12T19:08:10Z'
- updated: '2024-10-04T08:39:39Z'
+ updated: '2024-10-06T13:29:50Z'
language: Ruby
archived: false
- stars: 1973
+ stars: 1974
watchers: 28
forks: 428
owner: rswag
logo: https://avatars.githubusercontent.com/u/55741034?v=4
license: MIT
- repoEtag: '"385b44ba82d99a5a466ddad2f8fd7021ba6ece87ef8162ee26631c3d731c0c20"'
- repoLastModified: Fri, 04 Oct 2024 08:39:39 GMT
+ repoEtag: '"282438b181648a3e9f403b7ecc394b1b413a0209d883435bcac88b585dd58dbc"'
+ repoLastModified: Sun, 06 Oct 2024 13:29:50 GMT
foundInMaster: true
v3_1_link: https://github.com/rswag/rswag/pull/714
- source: https://openapi.tools/
@@ -6872,23 +6872,23 @@
id: 9a06b3cc23e65a92ab1f012b26743de1
repositoryMetadata:
base64Readme: >-
- PGJyLz4KPGRpdiBhbGlnbj0iY2VudGVyIj4KICA8YSBocmVmPSJodHRwczovL3d3dy5idWlsZHdpdGhmZXJuLmNvbS8/dXRtX3NvdXJjZT1naXRodWImdXRtX21lZGl1bT1yZWFkbWUmdXRtX2NhbXBhaWduPWZlcm4mdXRtX2NvbnRlbnQ9bG9nbyI+CiAgICA8aW1nIHNyYz0iL2Zlcm4vaW1hZ2VzL2xvZ28tcHJpbWFyeS5wbmciIGhlaWdodD0iODAiIGFsaWduPSJjZW50ZXIiIGFsdD0iaGVhZGVyIiAvPgogIDwvYT4KPGJyLz4KCjxici8+CgpbIVsyMDIzIFkgQ29tYmluYXRvciBTdGFydHVwXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL1klMjBDb21iaW5hdG9yLTIwMjMtb3JhbmdlKV0oaHR0cHM6Ly93d3cueWNvbWJpbmF0b3IuY29tL2NvbXBhbmllcy9mZXJuKQohW0xpY2Vuc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvTGljZW5zZS1NSVQtYmx1ZSkKClshW1NsYWNrXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL3NsYWNrLXBpbmsuc3ZnKV0oaHR0cHM6Ly9qb2luLnNsYWNrLmNvbS90L2Zlcm4tY29tbXVuaXR5L3NoYXJlZF9pbnZpdGUvenQtMmRwZnRmbWlmLU11QWVnbDhBZlBfUEs4czJ0eDM1MFEpClshW0RvY3VtZW50YXRpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvUmVhZCUyMG91ciUyMERvY3VtZW50YXRpb24tYmxhY2s/bG9nbz1ib29rKV0oaHR0cHM6Ly9idWlsZHdpdGhmZXJuLmNvbS9sZWFybi9ob21lP3V0bV9zb3VyY2U9ZmVybi1hcGkvZmVybi9yZWFkbWUtcmVhZC1vdXItZG9jdW1lbnRhdGlvbikKCjwvZGl2PgoKRmVybiBpcyBhIHRvb2xraXQgdGhhdCBhbGxvd3MgeW91IHRvIGlucHV0IHlvdXIgQVBJIERlZmluaXRpb24gYW5kIG91dHB1dCBTREtzIGFuZCBBUEkgZG9jdW1lbnRhdGlvbi4gRmVybiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiAoZm9ybWVybHkgU3dhZ2dlcikuCgo8ZGl2IGFsaWduPSJjZW50ZXIiPgogICAgPGltZyBzcmM9Ii9mZXJuL2ltYWdlcy9vdmVydmlldy5wbmciIHdpZHRoPSI3MDAiIGFsdD0iT3ZlcnZpZXcgRGlhZ3JhbSI+CjwvZGl2PgoKIyMg8J+MvyBTREtzCgpUaGUgRmVybiB0b29sa2l0IGlzIGF2YWlsYWJsZSB2aWEgYSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlIChDTEkpIGFuZCByZXF1aXJlcyBOb2RlIDE4Ky4gVG8gaW5zdGFsbCBpdCwgcnVuOgoKYGBgYmFzaApucG0gaW5zdGFsbCAtZyBmZXJuLWFwaQpgYGAKCkluaXRpYWxpemUgRmVybiB3aXRoIHlvdXIgT3BlbkFQSSBzcGVjOgoKYGBgYmFzaApmZXJuIGluaXQgLS1vcGVuYXBpIC4vcGF0aC90by9vcGVuYXBpLnltbAojIG9yCmZlcm4gaW5pdCAtLW9wZW5hcGkgaHR0cHM6Ly9saW5rLmJ1aWxkd2l0aGZlcm4uY29tL3BldHN0b3JlLW9wZW5hcGkKYGBgCgpZb3VyIGRpcmVjdG9yeSBzaG91bGQgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmc6CgpgYGB5YW1sCmZlcm4vCuKUnOKUgCBmZXJuLmNvbmZpZy5qc29uCuKUnOKUgCBnZW5lcmF0b3JzLnltbCAjIGdlbmVyYXRvcnMgeW91J3JlIHVzaW5nCuKUlOKUgCBvcGVuYXBpLwogIOKUlOKUgCBvcGVuYXBpLmpzb24gIyB5b3VyIG9wZW5hcGkgZG9jdW1lbnQKYGBgCgpGaW5hbGx5LCB0byBpbnZva2UgdGhlIGdlbmVyYXRvciwgcnVuOgoKYGBgYmFzaApmZXJuIGdlbmVyYXRlCmBgYAoK8J+OiSBPbmNlIHRoZSBjb21tYW5kIGNvbXBsZXRlcywgeW91J2xsIHNlZSB5b3VyIFNESyBpbiBgL2dlbmVyYXRlZC9zZGtzL3R5cGVzY3JpcHRgLgoKIyMg8J+MvyBBUEkgRG9jdW1lbnRhdGlvbgoKRmVybiBjYW4gYWxzbyBidWlsZCBhbmQgaG9zdCBhIGRvY3VtZW50YXRpb24gd2Vic2l0ZSB3aXRoIGFuIGF1dG8tZ2VuZXJhdGVkIEFQSSByZWZlcmVuY2UuIFdyaXRlIGFkZGl0aW9uYWwgcGFnZXMgaW4gbWFya2Rvd24gYW5kIGhhdmUgdGhlbSB2ZXJzaW9uZWQgd2l0aCBnaXQuIFNlYXJjaCwgU0VPLCBkYXJrIG1vZGUsIGFuZCBwb3B1bGFyIGNvbXBvbmVudHMgYXJlIHByb3ZpZGVkIG91dC1vZi10aGUtYm94LiBQbHVzLCB5b3UgY2FuIGN1c3RvbWl6ZSB0aGUgY29sb3JzLCBmb250LCBsb2dvLCBhbmQgZG9tYWluIG5hbWUuCgpDaGVjayBvdXQgZG9jcyBidWlsdCB3aXRoIEZlcm46CgotIFtkb2NzLnZlbGx1bS5haV0oaHR0cHM6Ly9kb2NzLnZlbGx1bS5haSkKLSBbZG9jcy5zdXBlcmFnZW50LnNoXShodHRwczovL2RvY3Muc3VwZXJhZ2VudC5zaC8pCi0gW2RvY3MuaHVtZS5haV0oaHR0cHM6Ly9kb2NzLmh1bWUuYWkvKQoKR2V0IHN0YXJ0ZWQgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJuLWFwaS9kb2NzLXN0YXJ0ZXItb3BlbmFwaSkuCgojIyDwn4y/IEdlbmVyYXRvcnMKCkdlbmVyYXRvcnMgYXJlIHByb2Nlc3MgdGhhdCB0YWtlIHlvdXIgQVBJIERlZmluaXRpb24gYXMgaW5wdXQgYW5kIG91dHB1dCBhcnRpZmFjdHMgKFNES3MsClBvc3RtYW4gQ29sbGVjdGlvbnMsIFNlcnZlciBib2lsZXJwbGF0ZSwgZXRjLikuIFRvIGFkZCBhIGdlbmVyYXRvciBydW4gYGZlcm4gYWRkIDxnZW5lcmF0b3IgaWQ+YAoKIyMjIFNESyBHZW5lcmF0b3JzCgp8IEdlbmVyYXRvciBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTGF0ZXN0IFZlcnNpb24gfCBFbnRyeXBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CnwgYGZlcm5hcGkvZmVybi10eXBlc2NyaXB0LW5vZGUtc2RrYCAgICAgfCAhW1R5cGVzY3JpcHQgR2VuZXJhdG9yIFZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZG9ja2VyL3YvZmVybmFwaS9mZXJuLXR5cGVzY3JpcHQtbm9kZS1zZGspIHwgIFtjbGkudHNdKC4vZ2VuZXJhdG9ycy90eXBlc2NyaXB0L3Nkay9jbGkvc3JjL25vZGVDbGkudHMpICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGBmZXJuYXBpL2Zlcm4tcHl0aG9uLXNka2AgICAgICAgICAgICAgIHwgIVtQeXRob24gR2VuZXJhdG9yIFZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZG9ja2VyL3YvZmVybmFwaS9mZXJuLXB5dGhvbi1zZGspICAgICAgICAgICAgICAgICAgfCBbY2xpLnB5XSguL2dlbmVyYXRvcnMvcHl0aG9uL3NyYy9mZXJuX3B5dGhvbi9nZW5lcmF0b3JzL3Nkay9jbGkucHkpICAgICAgICAgICAgIHwKfCBgZmVybmFwaS9mZXJuLWphdmEtc2RrYCAgICAgICAgICAgICAgICB8ICFbSmF2YSBHZW5lcmF0b3IgVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9kb2NrZXIvdi9mZXJuYXBpL2Zlcm4tamF2YS1zZGspICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBbQ2xpLmphdmFdKC4vZ2VuZXJhdG9ycy9qYXZhL3Nkay9zcmMvbWFpbi9qYXZhL2NvbS9mZXJuL2phdmEvY2xpZW50L0NsaS5qYXZhKSAgIHwKfCBgZmVybmFwaS9mZXJuLXJ1Ynktc2RrYCAgICAgICAgICAgICAgICB8ICFbUnVieSBHZW5lcmF0b3IgVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9kb2NrZXIvdi9mZXJuYXBpL2Zlcm4tcnVieS1zZGspICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgW2NsaS50c10oLi9nZW5lcmF0b3JzL3J1Ynkvc2RrL3NyYy9jbGkudHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYGZlcm5hcGkvZmVybi1nby1zZGtgICAgICAgICAgICAgICAgICAgfCAhW0dvIEdlbmVyYXRvciBWZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL2RvY2tlci92L2Zlcm5hcGkvZmVybi1nby1zZGspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFttYWluLmdvXSguL2dlbmVyYXRvcnMvZ28vY21kL2Zlcm4tZ28tc2RrL21haW4uZ28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGBmZXJuYXBpL2Zlcm4tY3NoYXJwLXNka2AgICAgICAgICAgICAgIHwgIVtDIyBHZW5lcmF0b3IgVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9kb2NrZXIvdi9mZXJuYXBpL2Zlcm4tY3NoYXJwLXNkaykgICAgICAgICAgICAgICAgICAgICAgfCAgICAgW2NsaS50c10oLi9nZW5lcmF0b3JzL2NzaGFycC9zZGsvc3JjL2NsaS50cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgojIyMgU2VydmVyLXNpZGUgR2VuZXJhdG9ycwoKRmVybidzIHNlcnZlci1zaWRlIGdlbmVyYXRvcnMgb3V0cHV0IGJvaWxlcnBsYXRlIGFwcGxpY2F0aW9uIGNvZGUgKG1vZGVscyBhbmQgbmV0d29ya2luZyBsb2dpYykuIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHNwZWMtZmlyc3Qgb3IgQVBJLWZpcnN0IGRldmVsb3BlcnMsIHdobyB3cml0ZSB0aGVpciBBUEkgZGVmaW5pdGlvbiAoYXMgYW4gT3BlbkFQSSBzcGVjIG9yIEZlcm4gZGVmaW5pdGlvbikgYW5kIHdhbnQgdG8gZ2VuZXJhdGUgYmFja2VuZCBjb2RlLgoKfCBHZW5lcmF0b3IgSUQgICAgICAgICAgICAgICAgICB8IExhdGVzdCBWZXJzaW9uIHwgRW50cnlwb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAp8IGBmZXJuYXBpL2Zlcm4tdHlwZXNjcmlwdC1leHByZXNzYCB8ICFbVHlwZXNjcmlwdCBFeHByZXNzIFNlcnZlciBHZW5lcmF0b3IgVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9kb2NrZXIvdi9mZXJuYXBpL2Zlcm4tdHlwZXNjcmlwdC1leHByZXNzKSB8W2NsaS50c10oLi9nZW5lcmF0b3JzL3R5cGVzY3JpcHQvZXhwcmVzcy9jbGkvc3JjL2NsaS50cykgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGBmZXJuYXBpL2Zlcm4tZmFzdGFwaS1zZXJ2ZXJgIHwgIVtQeXRob24gRmFzdEFQSSBTZXJ2ZXIgR2VuZXJhdG9yIFZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZG9ja2VyL3YvZmVybmFwaS9mZXJuLWZhc3RhcGktc2VydmVyKSB8ICAgW2NsaS5weV0oLi9nZW5lcmF0b3JzL3B5dGhvbi9zcmMvZmVybl9weXRob24vZ2VuZXJhdG9ycy9zZGsvY2xpLnB5KSAgICAgICAgICAgICAgfAp8IGBmZXJuYXBpL2Zlcm4tamF2YS1zcHJpbmdgICAgIHwgIVtKYXZhIFNwcmluZyBTZXJ2ZXIgR2VuZXJhdG9yIFZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZG9ja2VyL3YvZmVybmFwaS9mZXJuLWphdmEtc3ByaW5nKSB8ICAgIFtDbGkuamF2YV0oLi9nZW5lcmF0b3JzL2phdmEvc3ByaW5nL3NyYy9tYWluL2phdmEvY29tL2Zlcm4vamF2YS9zcHJpbmcvQ2xpLmphdmEpIHwKCiMjIyBNb2RlbCBHZW5lcmF0b3JzCgpGZXJuJ3MgbW9kZWwgZ2VuZXJhdG9ycyB3aWxsIG91dHB1dCBzY2hlbWFzIG9yIHR5cGVzIGRlZmluZWQgaW4geW91ciBPcGVuQVBJIHNwZWMgb3IgRmVybiBEZWZpbml0aW9uLgoKfCBHZW5lcmF0b3IgSUQgICAgICAgICAgICAgICAgICB8IExhdGVzdCBWZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFbnRyeXBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CnwgYGZlcm5hcGkvZmVybi1weWRhbnRpYy1tb2RlbGAgfCAhW1B5ZGFudGljIE1vZGVsIEdlbmVyYXRvciBWZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL2RvY2tlci92L2Zlcm5hcGkvZmVybi1weWRhbnRpYy1tb2RlbCkgfCAgW2NsaS5weV0oLi9nZW5lcmF0b3JzL3B5dGhvbi9zcmMvZmVybl9weXRob24vZ2VuZXJhdG9ycy9zZGsvY2xpLnB5KSAgICAgICAgICAgfAp8IGBmZXJuYXBpL2phdmEtbW9kZWxgICAgICB8ICFbSmF2YSBNb2RlbCBHZW5lcmF0b3IgVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9kb2NrZXIvdi9mZXJuYXBpL2phdmEtbW9kZWwpIHwgICAgICAgIFtDbGkuamF2YV0oLi9nZW5lcmF0b3JzL2phdmEvc2RrL3NyYy9tYWluL2phdmEvY29tL2Zlcm4vamF2YS9jbGllbnQvQ2xpLmphdmEpIHwKfCBgZmVybmFwaS9mZXJuLXJ1YnktbW9kZWxgICAgICB8ICFbUnVieSBNb2RlbCBHZW5lcmF0b3IgVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9kb2NrZXIvdi9mZXJuYXBpL2Zlcm4tcnVieS1tb2RlbCkgfCAgICAgW2NsaS50c10oLi9nZW5lcmF0b3JzL3J1YnkvbW9kZWwvc3JjL2NsaS50cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGBmZXJuYXBpL2Zlcm4tZ28tbW9kZWxgICAgICB8ICFbR28gTW9kZWwgR2VuZXJhdG9yIFZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZG9ja2VyL3YvZmVybmFwaS9mZXJuLWdvLW1vZGVsKSB8ICAgICBbbWFpbi5nb10oLi9nZW5lcmF0b3JzL2dvL2NtZC9mZXJuLWdvLW1vZGVsL21haW4uZ28pICAgICAgICAgICAgICAgICAgICAgICAgICB8CgojIyMgU3BlYyBHZW5lcmF0b3JzCgpGZXJuJ3Mgc3BlYyBnZW5lcmF0b3JzIGNhbiBvdXRwdXQgYW4gT3BlbkFQSSBzcGVjIG9yIGEgUG9zdG1hbiBjb2xsZWN0aW9uLgoKPiAqKk5vdGUqKjogVGhlIE9wZW5BUEkgc3BlYyBnZW5lcmF0b3IgaXMgcHJpbWFyaWx5IGludGVuZGVkIGZvciBGZXJuIERlZmluaXRpb24gdXNlcnMuIFRoaXMgcHJldmVudHMgbG9jay1pbiBzbyB0aGF0IG9uZSBjYW4gYWx3YXlzIGV4cG9ydCB0byBPcGVuQVBJLgoKfCBHZW5lcmF0b3IgSUQgICAgICAgICAgIHwgTGF0ZXN0IFZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRW50cnlwb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CnwgYGZlcm5hcGkvZmVybi1vcGVuYXBpYCB8ICFbT3BlbkFQSSBHZW5lcmF0b3IgVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9kb2NrZXIvdi9mZXJuYXBpL2Zlcm4tb3BlbmFwaSkgfCAgW2NsaS50c10oLi9nZW5lcmF0b3JzL29wZW5hcGkvc3JjL2NsaS50cykgIHwKfCBgZmVybmFwaS9mZXJuLXBvc3RtYW5gIHwgIVtQb3N0bWFuIEdlbmVyYXRvciBWZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL2RvY2tlci92L2Zlcm5hcGkvZmVybi1wb3N0bWFuKSB8ICBbY2xpLnRzXSguL2dlbmVyYXRvcnMvcG9zdG1hbi9zcmMvY2xpLnRzKSB8CgoKIyMg8J+MvyBDTEkgQ29tbWFuZHMKCkhlcmUncyBhIHF1aWNrIGxvb2sgYXQgdGhlIG1vc3QgcG9wdWxhciBDTEkgY29tbWFuZHMuIFZpZXcgdGhlIGRvY3VtZW50YXRpb24gZm9yIFthbGwgQ0xJIGNvbW1hbmRzXShodHRwczovL2J1aWxkd2l0aGZlcm4uY29tL2xlYXJuL2NsaS1hcGkvY2xpLXJlZmVyZW5jZS9jb21tYW5kcykuCgpgZmVybiBpbml0YDogYWRkcyBhIG5ldyBzdGFydGVyIEFQSSB0byB5b3VyIHJlcG9zaXRvcnkuCgpgZmVybiBjaGVja2A6IHZhbGlkYXRlIHlvdXIgQVBJIGRlZmluaXRpb24gYW5kIEZlcm4gY29uZmlndXJhdGlvbi4KCmBmZXJuIGdlbmVyYXRlYDogcnVuIHRoZSBnZW5lcmF0b3JzIHNwZWNpZmllZCBpbiBgZ2VuZXJhdG9ycy55bWxgIGluIHRoZSBjbG91ZC4KCmBmZXJuIGdlbmVyYXRlIC0tbG9jYWxgOiBydW4gdGhlIGdlbmVyYXRvcnMgc3BlY2lmaWVkIGluIGBnZW5lcmF0b3JzLnltbGAgaW4gZG9ja2VyIGxvY2FsbHkuCgpgZmVybiBhZGQgPGdlbmVyYXRvcj5gOiBpbmNsdWRlIGEgbmV3IGdlbmVyYXRvciBpbiB5b3VyIGBnZW5lcmF0b3JzLnltbGAuIEZvciBleGFtcGxlLCBgZmVybiBhZGQgZmVybi1weXRob24tc2RrYC4KCiMjIEFkdmFuY2VkCgojIyMgQVBJIEZpcnN0CgpGZXJuIHN1cHBvcnRzIGRldmVsb3BlcnMgYW5kIHRlYW1zIHRoYXQgd2FudCB0byBiZSBBUEktZmlyc3Qgb3IgU3BlYy1maXJzdC4KCkRlZmluZSB5b3VyIEFQSSwgYW5kIHVzZSBGZXJuIHRvIGdlbmVyYXRlIG1vZGVscywgbmV0d29ya2luZyBjb2RlIGFuZCBib2lsZXJwbGF0ZSBhcHBsaWNhdGlvbiBjb2RlLiBUaGUgZ2VuZXJhdGVkIGNvZGUgYWRkcwp0eXBlIHNhZmV0eSB0byB5b3VyIEFQSSBpbXBsZW1lbnRhdGlvbiAtIGlmIHlvdXIgYmFja2VuZCBkb2Vzbid0IGltcGxlbWVudCB0aGUgQVBJIGNvcnJlY3RseSwgaXQgd29uJ3QgY29tcGlsZS4KCkZyYW1ld29ya3MgY3VycmVudGx5IHN1cHBvcnRlZDoKCi0gW0V4cHJlc3NdKC4vZ2VuZXJhdG9ycy90eXBlc2NyaXB0KQotIFtTcHJpbmcgQm9vdF0oLi9nZW5lcmF0b3JzL2phdmEpCi0gW0Zhc3RBUEldKC4vZ2VuZXJhdG9ycy9weXRob24pCgojIyMgRmVybiBEZWZpbml0aW9uCgpXaGlsZSB3ZSBhcmUgYmlnIGZhbnMgb2YgT3BlbkFQSSwgd2Uga25vdyBpdCBpc24ndCB0aGUgX2Vhc2llc3RfIGZvcm1hdCB0byByZWFkIGFuZCB3cml0ZS4gSWYgeW91J3JlIGxvb2tpbmcgZm9yIGFuIGFsdGVybmF0aXZlLApnaXZlIHRoZSBGZXJuIERlZmluaXRpb24gYSB0cnkuCgpJbnN0YWxsIHRoZSBGZXJuIENMSSBhbmQgaW5pdGlhbGl6ZSBhIEZlcm4gUHJvamVjdC4KCmBgYGJhc2gKbnBtIGluc3RhbGwgLWcgZmVybi1hcGkKZmVybiBpbml0CmBgYAoKVGhpcyB3aWxsIGNyZWF0ZSB0aGUgZm9sbG93aW5nIGZvbGRlciBzdHJ1Y3R1cmUgaW4geW91ciBwcm9qZWN0OgoKYGBgeWFtbApmZXJuLwrilJzilIAgZmVybi5jb25maWcuanNvbiAjIHJvb3QtbGV2ZWwgY29uZmlndXJhdGlvbgrilJzilIAgZ2VuZXJhdG9ycy55bWwgIyBnZW5lcmF0b3JzIHlvdSdyZSB1c2luZwrilJTilIAgZGVmaW5pdGlvbi8KICDilJzilIAgYXBpLnltbCAgIyBBUEktbGV2ZWwgY29uZmlndXJhdGlvbgogIOKUlOKUgCBpbWRiLnltbCAjIGVuZHBvaW50cywgdHlwZXMsIGFuZCBlcnJvcnMKYGBgCgpIZXJlJ3Mgd2hhdCB0aGUgYGltZGIueW1sYCBzdGFydGVyIGZpbGUgbG9va3MgbGlrZToKCmBgYHlhbWwKdHlwZXM6CiAgTW92aWVJZDogc3RyaW5nCgogIE1vdmllOgogICAgcHJvcGVydGllczoKICAgICAgaWQ6IE1vdmllSWQKICAgICAgdGl0bGU6IHN0cmluZwogICAgICByYXRpbmc6CiAgICAgICAgdHlwZTogZG91YmxlCiAgICAgICAgZG9jczogVGhlIHJhdGluZyBzY2FsZSBpcyBvbmUgdG8gZml2ZSBzdGFycwoKICBDcmVhdGVNb3ZpZVJlcXVlc3Q6CiAgICBwcm9wZXJ0aWVzOgogICAgICB0aXRsZTogc3RyaW5nCiAgICAgIHJhdGluZzogZG91YmxlCgpzZXJ2aWNlOgogIGF1dGg6IGZhbHNlCiAgYmFzZS1wYXRoOiAvbW92aWVzCiAgZW5kcG9pbnRzOgogICAgY3JlYXRlTW92aWU6CiAgICAgIGRvY3M6IEFkZCBhIG1vdmllIHRvIHRoZSBkYXRhYmFzZQogICAgICBtZXRob2Q6IFBPU1QKICAgICAgcGF0aDogL2NyZWF0ZS1tb3ZpZQogICAgICByZXF1ZXN0OiBDcmVhdGVNb3ZpZVJlcXVlc3QKICAgICAgcmVzcG9uc2U6IE1vdmllSWQKCiAgICBnZXRNb3ZpZToKICAgICAgbWV0aG9kOiBHRVQKICAgICAgcGF0aDogL3ttb3ZpZUlkfQogICAgICBwYXRoLXBhcmFtZXRlcnM6CiAgICAgICAgbW92aWVJZDogTW92aWVJZAogICAgICByZXNwb25zZTogTW92aWUKICAgICAgZXJyb3JzOgogICAgICAgIC0gTW92aWVEb2VzTm90RXhpc3RFcnJvcgoKZXJyb3JzOgogIE1vdmllRG9lc05vdEV4aXN0RXJyb3I6CiAgICBzdGF0dXMtY29kZTogNDA0CiAgICB0eXBlOiBNb3ZpZUlkCmBgYAoKQ2hlY2tvdXQgb3BlbiBzb3VyY2UgcHJvamVjdHMgdGhhdCBhcmUgdXNpbmcgRmVybiBEZWZpbml0aW9uczoKCi0gW01ldHJpcG9ydF0oaHR0cHM6Ly9naXRodWIuY29tL21ldHJpcG9ydC9tZXRyaXBvcnQvdHJlZS9kZXZlbG9wL2Zlcm4vZGVmaW5pdGlvbikKLSBbUml2ZXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9yaXZldC1nZy9yaXZldC90cmVlL21haW4vZmVybi9kZWZpbml0aW9uKQoKIyMgSW5zcGlyYXRpb24KCkZlcm4gaXMgaW5zcGlyZWQgYnkgaW50ZXJuYWwgdG9vbGluZyBidWlsdCB0byBlbmhhbmNlIHRoZSBkZXZlbG9wZXIgZXhwZXJpZW5jZS4gV2Ugc3RhbmQgb24gdGhlIHNob3VsZGVycyBvZiBnaWFudHMuIFdoaWxlIHRlYW1zIHdlcmUgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIHRoZSBmb2xsb3dpbmcgdG9vbHMsIHdlIHdhbnQgdG8gZ2l2ZSBhIHNob3V0IG91dCB0byBNYXJrIEVsbGlvdCAoY3JlYXRvciBvZiBDb25qdXJlIGF0IFBhbGFudGlyKSwgTWljaGFlbCBEb3dsaW5nIChjcmVhdG9yIG9mIFNtaXRoeSBhdCBBV1MpLCBhbmQgSWFuIE1jQ3J5c3RhbCAoY3JlYXRvciBvZiBTdHJpcGUgRG9jcykuCgojIyBDb21tdW5pdHkKCltKb2luIG91ciBEaXNjb3JkIV0oaHR0cHM6Ly9kaXNjb3JkLmNvbS9pbnZpdGUvSmtrWHVtUHpjRykgV2UgYXJlIGhlcmUgdG8gYW5zd2VyIHF1ZXN0aW9ucyBhbmQgaGVscCB5b3UgZ2V0IHRoZSBtb3N0IG91dCBvZiBGZXJuLgoKIyMgQ29udHJpYnV0aW5nCgpXZSB3ZWxjb21lIGNvbW11bml0eSBjb250cmlidXRpb25zLiBGb3IgZ3VpZGVsaW5lcywgcmVmZXIgdG8gb3VyIFtDT05UUklCVVRJTkcubWRdKC9DT05UUklCVVRJTkcubWQpLgoKIVtGZXJuIENvbnRyaWJ1dG9yc10oaHR0cHM6Ly9jb250cmliLnJvY2tzL2ltYWdlP3JlcG89ZmVybi1hcGkvZmVybikK
- readmeEtag: '"f3c0e04d27508ed8507fdb100164fd092fe31343"'
- readmeLastModified: Wed, 18 Sep 2024 23:01:40 GMT
+ PGJyLz4KPGRpdiBhbGlnbj0iY2VudGVyIj4KICA8YSBocmVmPSJodHRwczovL3d3dy5idWlsZHdpdGhmZXJuLmNvbS8/dXRtX3NvdXJjZT1naXRodWImdXRtX21lZGl1bT1yZWFkbWUmdXRtX2NhbXBhaWduPWZlcm4mdXRtX2NvbnRlbnQ9bG9nbyI+CiAgICA8aW1nIHNyYz0iL2Zlcm4vaW1hZ2VzL2xvZ28tcHJpbWFyeS5wbmciIGhlaWdodD0iODAiIGFsaWduPSJjZW50ZXIiIGFsdD0iaGVhZGVyIiAvPgogIDwvYT4KPGJyLz4KCjxici8+CgpbIVsyMDIzIFkgQ29tYmluYXRvciBTdGFydHVwXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL1klMjBDb21iaW5hdG9yLTIwMjMtb3JhbmdlKV0oaHR0cHM6Ly93d3cueWNvbWJpbmF0b3IuY29tL2NvbXBhbmllcy9mZXJuKQohW0xpY2Vuc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvTGljZW5zZS1NSVQtYmx1ZSkKClshW1NsYWNrXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL3NsYWNrLXBpbmsuc3ZnKV0oaHR0cHM6Ly9qb2luLnNsYWNrLmNvbS90L2Zlcm4tY29tbXVuaXR5L3NoYXJlZF9pbnZpdGUvenQtMmRwZnRmbWlmLU11QWVnbDhBZlBfUEs4czJ0eDM1MFEpClshW0RvY3VtZW50YXRpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvUmVhZCUyMG91ciUyMERvY3VtZW50YXRpb24tYmxhY2s/bG9nbz1ib29rKV0oaHR0cHM6Ly9idWlsZHdpdGhmZXJuLmNvbS9sZWFybi9ob21lP3V0bV9zb3VyY2U9ZmVybi1hcGkvZmVybi9yZWFkbWUtcmVhZC1vdXItZG9jdW1lbnRhdGlvbikKCjwvZGl2PgoKRmVybiBpcyBhIHRvb2xraXQgdGhhdCBhbGxvd3MgeW91IHRvIGlucHV0IHlvdXIgQVBJIERlZmluaXRpb24gYW5kIG91dHB1dCBTREtzIGFuZCBBUEkgZG9jdW1lbnRhdGlvbi4gRmVybiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiAoZm9ybWVybHkgU3dhZ2dlcikuCgo8ZGl2IGFsaWduPSJjZW50ZXIiPgogICAgPGEgaHJlZj0iL2Zlcm4vaW1hZ2VzL292ZXJ2aWV3LWRhcmsucG5nIiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgPHBpY3R1cmU+CiAgICAgICAgICAgIDxzb3VyY2Ugc3Jjc2V0PSIvZmVybi9pbWFnZXMvb3ZlcnZpZXctZGFyay5wbmciIG1lZGlhPSIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIj4KICAgICAgICAgICAgPHNvdXJjZSBzcmNzZXQ9Ii9mZXJuL2ltYWdlcy9vdmVydmlldy1saWdodC5wbmciIG1lZGlhPSIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSI+CiAgICAgICAgICAgIDxpbWcgc3JjPSIvZmVybi9pbWFnZXMvb3ZlcnZpZXctbGlnaHQucG5nIiB3aWR0aD0iNzAwIiBhbHQ9Ik92ZXJ2aWV3IERpYWdyYW0iPgogICAgICAgIDwvcGljdHVyZT4KICAgIDwvYT4KPC9kaXY+CgoKIyMg8J+MvyBTREtzCgpUaGUgRmVybiB0b29sa2l0IGlzIGF2YWlsYWJsZSB2aWEgYSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlIChDTEkpIGFuZCByZXF1aXJlcyBOb2RlIDE4Ky4gVG8gaW5zdGFsbCBpdCwgcnVuOgoKYGBgYmFzaApucG0gaW5zdGFsbCAtZyBmZXJuLWFwaQpgYGAKCkluaXRpYWxpemUgRmVybiB3aXRoIHlvdXIgT3BlbkFQSSBzcGVjOgoKYGBgYmFzaApmZXJuIGluaXQgLS1vcGVuYXBpIC4vcGF0aC90by9vcGVuYXBpLnltbAojIG9yCmZlcm4gaW5pdCAtLW9wZW5hcGkgaHR0cHM6Ly9saW5rLmJ1aWxkd2l0aGZlcm4uY29tL3BldHN0b3JlLW9wZW5hcGkKYGBgCgpZb3VyIGRpcmVjdG9yeSBzaG91bGQgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmc6CgpgYGB5YW1sCmZlcm4vCuKUnOKUgCBmZXJuLmNvbmZpZy5qc29uCuKUnOKUgCBnZW5lcmF0b3JzLnltbCAjIGdlbmVyYXRvcnMgeW91J3JlIHVzaW5nCuKUlOKUgCBvcGVuYXBpLwogIOKUlOKUgCBvcGVuYXBpLmpzb24gIyB5b3VyIG9wZW5hcGkgZG9jdW1lbnQKYGBgCgpGaW5hbGx5LCB0byBpbnZva2UgdGhlIGdlbmVyYXRvciwgcnVuOgoKYGBgYmFzaApmZXJuIGdlbmVyYXRlCmBgYAoK8J+OiSBPbmNlIHRoZSBjb21tYW5kIGNvbXBsZXRlcywgeW91J2xsIHNlZSB5b3VyIFNESyBpbiBgL2dlbmVyYXRlZC9zZGtzL3R5cGVzY3JpcHRgLgoKIyMg8J+MvyBBUEkgRG9jdW1lbnRhdGlvbgoKRmVybiBjYW4gYWxzbyBidWlsZCBhbmQgaG9zdCBhIGRvY3VtZW50YXRpb24gd2Vic2l0ZSB3aXRoIGFuIGF1dG8tZ2VuZXJhdGVkIEFQSSByZWZlcmVuY2UuIFdyaXRlIGFkZGl0aW9uYWwgcGFnZXMgaW4gbWFya2Rvd24gYW5kIGhhdmUgdGhlbSB2ZXJzaW9uZWQgd2l0aCBnaXQuIFNlYXJjaCwgU0VPLCBkYXJrIG1vZGUsIGFuZCBwb3B1bGFyIGNvbXBvbmVudHMgYXJlIHByb3ZpZGVkIG91dC1vZi10aGUtYm94LiBQbHVzLCB5b3UgY2FuIGN1c3RvbWl6ZSB0aGUgY29sb3JzLCBmb250LCBsb2dvLCBhbmQgZG9tYWluIG5hbWUuCgpDaGVjayBvdXQgZG9jcyBidWlsdCB3aXRoIEZlcm46CgotIFtkb2NzLnZlbGx1bS5haV0oaHR0cHM6Ly9kb2NzLnZlbGx1bS5haSkKLSBbZG9jcy5zdXBlcmFnZW50LnNoXShodHRwczovL2RvY3Muc3VwZXJhZ2VudC5zaC8pCi0gW2RvY3MuaHVtZS5haV0oaHR0cHM6Ly9kb2NzLmh1bWUuYWkvKQoKR2V0IHN0YXJ0ZWQgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJuLWFwaS9kb2NzLXN0YXJ0ZXItb3BlbmFwaSkuCgojIyDwn4y/IEdlbmVyYXRvcnMKCkdlbmVyYXRvcnMgYXJlIHByb2Nlc3MgdGhhdCB0YWtlIHlvdXIgQVBJIERlZmluaXRpb24gYXMgaW5wdXQgYW5kIG91dHB1dCBhcnRpZmFjdHMgKFNES3MsClBvc3RtYW4gQ29sbGVjdGlvbnMsIFNlcnZlciBib2lsZXJwbGF0ZSwgZXRjLikuIFRvIGFkZCBhIGdlbmVyYXRvciBydW4gYGZlcm4gYWRkIDxnZW5lcmF0b3IgaWQ+YAoKIyMjIFNESyBHZW5lcmF0b3JzCgp8IEdlbmVyYXRvciBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTGF0ZXN0IFZlcnNpb24gfCBFbnRyeXBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CnwgYGZlcm5hcGkvZmVybi10eXBlc2NyaXB0LW5vZGUtc2RrYCAgICAgfCAhW1R5cGVzY3JpcHQgR2VuZXJhdG9yIFZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZG9ja2VyL3YvZmVybmFwaS9mZXJuLXR5cGVzY3JpcHQtbm9kZS1zZGspIHwgIFtjbGkudHNdKC4vZ2VuZXJhdG9ycy90eXBlc2NyaXB0L3Nkay9jbGkvc3JjL25vZGVDbGkudHMpICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGBmZXJuYXBpL2Zlcm4tcHl0aG9uLXNka2AgICAgICAgICAgICAgIHwgIVtQeXRob24gR2VuZXJhdG9yIFZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZG9ja2VyL3YvZmVybmFwaS9mZXJuLXB5dGhvbi1zZGspICAgICAgICAgICAgICAgICAgfCBbY2xpLnB5XSguL2dlbmVyYXRvcnMvcHl0aG9uL3NyYy9mZXJuX3B5dGhvbi9nZW5lcmF0b3JzL3Nkay9jbGkucHkpICAgICAgICAgICAgIHwKfCBgZmVybmFwaS9mZXJuLWphdmEtc2RrYCAgICAgICAgICAgICAgICB8ICFbSmF2YSBHZW5lcmF0b3IgVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9kb2NrZXIvdi9mZXJuYXBpL2Zlcm4tamF2YS1zZGspICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBbQ2xpLmphdmFdKC4vZ2VuZXJhdG9ycy9qYXZhL3Nkay9zcmMvbWFpbi9qYXZhL2NvbS9mZXJuL2phdmEvY2xpZW50L0NsaS5qYXZhKSAgIHwKfCBgZmVybmFwaS9mZXJuLXJ1Ynktc2RrYCAgICAgICAgICAgICAgICB8ICFbUnVieSBHZW5lcmF0b3IgVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9kb2NrZXIvdi9mZXJuYXBpL2Zlcm4tcnVieS1zZGspICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgW2NsaS50c10oLi9nZW5lcmF0b3JzL3J1Ynkvc2RrL3NyYy9jbGkudHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYGZlcm5hcGkvZmVybi1nby1zZGtgICAgICAgICAgICAgICAgICAgfCAhW0dvIEdlbmVyYXRvciBWZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL2RvY2tlci92L2Zlcm5hcGkvZmVybi1nby1zZGspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFttYWluLmdvXSguL2dlbmVyYXRvcnMvZ28vY21kL2Zlcm4tZ28tc2RrL21haW4uZ28pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGBmZXJuYXBpL2Zlcm4tY3NoYXJwLXNka2AgICAgICAgICAgICAgIHwgIVtDIyBHZW5lcmF0b3IgVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9kb2NrZXIvdi9mZXJuYXBpL2Zlcm4tY3NoYXJwLXNkaykgICAgICAgICAgICAgICAgICAgICAgfCAgICAgW2NsaS50c10oLi9nZW5lcmF0b3JzL2NzaGFycC9zZGsvc3JjL2NsaS50cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgojIyMgU2VydmVyLXNpZGUgR2VuZXJhdG9ycwoKRmVybidzIHNlcnZlci1zaWRlIGdlbmVyYXRvcnMgb3V0cHV0IGJvaWxlcnBsYXRlIGFwcGxpY2F0aW9uIGNvZGUgKG1vZGVscyBhbmQgbmV0d29ya2luZyBsb2dpYykuIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHNwZWMtZmlyc3Qgb3IgQVBJLWZpcnN0IGRldmVsb3BlcnMsIHdobyB3cml0ZSB0aGVpciBBUEkgZGVmaW5pdGlvbiAoYXMgYW4gT3BlbkFQSSBzcGVjIG9yIEZlcm4gZGVmaW5pdGlvbikgYW5kIHdhbnQgdG8gZ2VuZXJhdGUgYmFja2VuZCBjb2RlLgoKfCBHZW5lcmF0b3IgSUQgICAgICAgICAgICAgICAgICB8IExhdGVzdCBWZXJzaW9uIHwgRW50cnlwb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAp8IGBmZXJuYXBpL2Zlcm4tdHlwZXNjcmlwdC1leHByZXNzYCB8ICFbVHlwZXNjcmlwdCBFeHByZXNzIFNlcnZlciBHZW5lcmF0b3IgVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9kb2NrZXIvdi9mZXJuYXBpL2Zlcm4tdHlwZXNjcmlwdC1leHByZXNzKSB8W2NsaS50c10oLi9nZW5lcmF0b3JzL3R5cGVzY3JpcHQvZXhwcmVzcy9jbGkvc3JjL2NsaS50cykgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGBmZXJuYXBpL2Zlcm4tZmFzdGFwaS1zZXJ2ZXJgIHwgIVtQeXRob24gRmFzdEFQSSBTZXJ2ZXIgR2VuZXJhdG9yIFZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZG9ja2VyL3YvZmVybmFwaS9mZXJuLWZhc3RhcGktc2VydmVyKSB8ICAgW2NsaS5weV0oLi9nZW5lcmF0b3JzL3B5dGhvbi9zcmMvZmVybl9weXRob24vZ2VuZXJhdG9ycy9zZGsvY2xpLnB5KSAgICAgICAgICAgICAgfAp8IGBmZXJuYXBpL2Zlcm4tamF2YS1zcHJpbmdgICAgIHwgIVtKYXZhIFNwcmluZyBTZXJ2ZXIgR2VuZXJhdG9yIFZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZG9ja2VyL3YvZmVybmFwaS9mZXJuLWphdmEtc3ByaW5nKSB8ICAgIFtDbGkuamF2YV0oLi9nZW5lcmF0b3JzL2phdmEvc3ByaW5nL3NyYy9tYWluL2phdmEvY29tL2Zlcm4vamF2YS9zcHJpbmcvQ2xpLmphdmEpIHwKCiMjIyBNb2RlbCBHZW5lcmF0b3JzCgpGZXJuJ3MgbW9kZWwgZ2VuZXJhdG9ycyB3aWxsIG91dHB1dCBzY2hlbWFzIG9yIHR5cGVzIGRlZmluZWQgaW4geW91ciBPcGVuQVBJIHNwZWMgb3IgRmVybiBEZWZpbml0aW9uLgoKfCBHZW5lcmF0b3IgSUQgICAgICAgICAgICAgICAgICB8IExhdGVzdCBWZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFbnRyeXBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CnwgYGZlcm5hcGkvZmVybi1weWRhbnRpYy1tb2RlbGAgfCAhW1B5ZGFudGljIE1vZGVsIEdlbmVyYXRvciBWZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL2RvY2tlci92L2Zlcm5hcGkvZmVybi1weWRhbnRpYy1tb2RlbCkgfCAgW2NsaS5weV0oLi9nZW5lcmF0b3JzL3B5dGhvbi9zcmMvZmVybl9weXRob24vZ2VuZXJhdG9ycy9zZGsvY2xpLnB5KSAgICAgICAgICAgfAp8IGBmZXJuYXBpL2phdmEtbW9kZWxgICAgICB8ICFbSmF2YSBNb2RlbCBHZW5lcmF0b3IgVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9kb2NrZXIvdi9mZXJuYXBpL2phdmEtbW9kZWwpIHwgICAgICAgIFtDbGkuamF2YV0oLi9nZW5lcmF0b3JzL2phdmEvc2RrL3NyYy9tYWluL2phdmEvY29tL2Zlcm4vamF2YS9jbGllbnQvQ2xpLmphdmEpIHwKfCBgZmVybmFwaS9mZXJuLXJ1YnktbW9kZWxgICAgICB8ICFbUnVieSBNb2RlbCBHZW5lcmF0b3IgVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9kb2NrZXIvdi9mZXJuYXBpL2Zlcm4tcnVieS1tb2RlbCkgfCAgICAgW2NsaS50c10oLi9nZW5lcmF0b3JzL3J1YnkvbW9kZWwvc3JjL2NsaS50cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGBmZXJuYXBpL2Zlcm4tZ28tbW9kZWxgICAgICB8ICFbR28gTW9kZWwgR2VuZXJhdG9yIFZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZG9ja2VyL3YvZmVybmFwaS9mZXJuLWdvLW1vZGVsKSB8ICAgICBbbWFpbi5nb10oLi9nZW5lcmF0b3JzL2dvL2NtZC9mZXJuLWdvLW1vZGVsL21haW4uZ28pICAgICAgICAgICAgICAgICAgICAgICAgICB8CgojIyMgU3BlYyBHZW5lcmF0b3JzCgpGZXJuJ3Mgc3BlYyBnZW5lcmF0b3JzIGNhbiBvdXRwdXQgYW4gT3BlbkFQSSBzcGVjIG9yIGEgUG9zdG1hbiBjb2xsZWN0aW9uLgoKPiAqKk5vdGUqKjogVGhlIE9wZW5BUEkgc3BlYyBnZW5lcmF0b3IgaXMgcHJpbWFyaWx5IGludGVuZGVkIGZvciBGZXJuIERlZmluaXRpb24gdXNlcnMuIFRoaXMgcHJldmVudHMgbG9jay1pbiBzbyB0aGF0IG9uZSBjYW4gYWx3YXlzIGV4cG9ydCB0byBPcGVuQVBJLgoKfCBHZW5lcmF0b3IgSUQgICAgICAgICAgIHwgTGF0ZXN0IFZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRW50cnlwb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CnwgYGZlcm5hcGkvZmVybi1vcGVuYXBpYCB8ICFbT3BlbkFQSSBHZW5lcmF0b3IgVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9kb2NrZXIvdi9mZXJuYXBpL2Zlcm4tb3BlbmFwaSkgfCAgW2NsaS50c10oLi9nZW5lcmF0b3JzL29wZW5hcGkvc3JjL2NsaS50cykgIHwKfCBgZmVybmFwaS9mZXJuLXBvc3RtYW5gIHwgIVtQb3N0bWFuIEdlbmVyYXRvciBWZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL2RvY2tlci92L2Zlcm5hcGkvZmVybi1wb3N0bWFuKSB8ICBbY2xpLnRzXSguL2dlbmVyYXRvcnMvcG9zdG1hbi9zcmMvY2xpLnRzKSB8CgoKIyMg8J+MvyBDTEkgQ29tbWFuZHMKCkhlcmUncyBhIHF1aWNrIGxvb2sgYXQgdGhlIG1vc3QgcG9wdWxhciBDTEkgY29tbWFuZHMuIFZpZXcgdGhlIGRvY3VtZW50YXRpb24gZm9yIFthbGwgQ0xJIGNvbW1hbmRzXShodHRwczovL2J1aWxkd2l0aGZlcm4uY29tL2xlYXJuL2NsaS1hcGkvY2xpLXJlZmVyZW5jZS9jb21tYW5kcykuCgpgZmVybiBpbml0YDogYWRkcyBhIG5ldyBzdGFydGVyIEFQSSB0byB5b3VyIHJlcG9zaXRvcnkuCgpgZmVybiBjaGVja2A6IHZhbGlkYXRlIHlvdXIgQVBJIGRlZmluaXRpb24gYW5kIEZlcm4gY29uZmlndXJhdGlvbi4KCmBmZXJuIGdlbmVyYXRlYDogcnVuIHRoZSBnZW5lcmF0b3JzIHNwZWNpZmllZCBpbiBgZ2VuZXJhdG9ycy55bWxgIGluIHRoZSBjbG91ZC4KCmBmZXJuIGdlbmVyYXRlIC0tbG9jYWxgOiBydW4gdGhlIGdlbmVyYXRvcnMgc3BlY2lmaWVkIGluIGBnZW5lcmF0b3JzLnltbGAgaW4gZG9ja2VyIGxvY2FsbHkuCgpgZmVybiBhZGQgPGdlbmVyYXRvcj5gOiBpbmNsdWRlIGEgbmV3IGdlbmVyYXRvciBpbiB5b3VyIGBnZW5lcmF0b3JzLnltbGAuIEZvciBleGFtcGxlLCBgZmVybiBhZGQgZmVybi1weXRob24tc2RrYC4KCiMjIEFkdmFuY2VkCgojIyMgQVBJIEZpcnN0CgpGZXJuIHN1cHBvcnRzIGRldmVsb3BlcnMgYW5kIHRlYW1zIHRoYXQgd2FudCB0byBiZSBBUEktZmlyc3Qgb3IgU3BlYy1maXJzdC4KCkRlZmluZSB5b3VyIEFQSSwgYW5kIHVzZSBGZXJuIHRvIGdlbmVyYXRlIG1vZGVscywgbmV0d29ya2luZyBjb2RlIGFuZCBib2lsZXJwbGF0ZSBhcHBsaWNhdGlvbiBjb2RlLiBUaGUgZ2VuZXJhdGVkIGNvZGUgYWRkcwp0eXBlIHNhZmV0eSB0byB5b3VyIEFQSSBpbXBsZW1lbnRhdGlvbiAtIGlmIHlvdXIgYmFja2VuZCBkb2Vzbid0IGltcGxlbWVudCB0aGUgQVBJIGNvcnJlY3RseSwgaXQgd29uJ3QgY29tcGlsZS4KCkZyYW1ld29ya3MgY3VycmVudGx5IHN1cHBvcnRlZDoKCi0gW0V4cHJlc3NdKC4vZ2VuZXJhdG9ycy90eXBlc2NyaXB0KQotIFtTcHJpbmcgQm9vdF0oLi9nZW5lcmF0b3JzL2phdmEpCi0gW0Zhc3RBUEldKC4vZ2VuZXJhdG9ycy9weXRob24pCgojIyMgRmVybiBEZWZpbml0aW9uCgpXaGlsZSB3ZSBhcmUgYmlnIGZhbnMgb2YgT3BlbkFQSSwgd2Uga25vdyBpdCBpc24ndCB0aGUgX2Vhc2llc3RfIGZvcm1hdCB0byByZWFkIGFuZCB3cml0ZS4gSWYgeW91J3JlIGxvb2tpbmcgZm9yIGFuIGFsdGVybmF0aXZlLApnaXZlIHRoZSBGZXJuIERlZmluaXRpb24gYSB0cnkuCgpJbnN0YWxsIHRoZSBGZXJuIENMSSBhbmQgaW5pdGlhbGl6ZSBhIEZlcm4gUHJvamVjdC4KCmBgYGJhc2gKbnBtIGluc3RhbGwgLWcgZmVybi1hcGkKZmVybiBpbml0CmBgYAoKVGhpcyB3aWxsIGNyZWF0ZSB0aGUgZm9sbG93aW5nIGZvbGRlciBzdHJ1Y3R1cmUgaW4geW91ciBwcm9qZWN0OgoKYGBgeWFtbApmZXJuLwrilJzilIAgZmVybi5jb25maWcuanNvbiAjIHJvb3QtbGV2ZWwgY29uZmlndXJhdGlvbgrilJzilIAgZ2VuZXJhdG9ycy55bWwgIyBnZW5lcmF0b3JzIHlvdSdyZSB1c2luZwrilJTilIAgZGVmaW5pdGlvbi8KICDilJzilIAgYXBpLnltbCAgIyBBUEktbGV2ZWwgY29uZmlndXJhdGlvbgogIOKUlOKUgCBpbWRiLnltbCAjIGVuZHBvaW50cywgdHlwZXMsIGFuZCBlcnJvcnMKYGBgCgpIZXJlJ3Mgd2hhdCB0aGUgYGltZGIueW1sYCBzdGFydGVyIGZpbGUgbG9va3MgbGlrZToKCmBgYHlhbWwKdHlwZXM6CiAgTW92aWVJZDogc3RyaW5nCgogIE1vdmllOgogICAgcHJvcGVydGllczoKICAgICAgaWQ6IE1vdmllSWQKICAgICAgdGl0bGU6IHN0cmluZwogICAgICByYXRpbmc6CiAgICAgICAgdHlwZTogZG91YmxlCiAgICAgICAgZG9jczogVGhlIHJhdGluZyBzY2FsZSBpcyBvbmUgdG8gZml2ZSBzdGFycwoKICBDcmVhdGVNb3ZpZVJlcXVlc3Q6CiAgICBwcm9wZXJ0aWVzOgogICAgICB0aXRsZTogc3RyaW5nCiAgICAgIHJhdGluZzogZG91YmxlCgpzZXJ2aWNlOgogIGF1dGg6IGZhbHNlCiAgYmFzZS1wYXRoOiAvbW92aWVzCiAgZW5kcG9pbnRzOgogICAgY3JlYXRlTW92aWU6CiAgICAgIGRvY3M6IEFkZCBhIG1vdmllIHRvIHRoZSBkYXRhYmFzZQogICAgICBtZXRob2Q6IFBPU1QKICAgICAgcGF0aDogL2NyZWF0ZS1tb3ZpZQogICAgICByZXF1ZXN0OiBDcmVhdGVNb3ZpZVJlcXVlc3QKICAgICAgcmVzcG9uc2U6IE1vdmllSWQKCiAgICBnZXRNb3ZpZToKICAgICAgbWV0aG9kOiBHRVQKICAgICAgcGF0aDogL3ttb3ZpZUlkfQogICAgICBwYXRoLXBhcmFtZXRlcnM6CiAgICAgICAgbW92aWVJZDogTW92aWVJZAogICAgICByZXNwb25zZTogTW92aWUKICAgICAgZXJyb3JzOgogICAgICAgIC0gTW92aWVEb2VzTm90RXhpc3RFcnJvcgoKZXJyb3JzOgogIE1vdmllRG9lc05vdEV4aXN0RXJyb3I6CiAgICBzdGF0dXMtY29kZTogNDA0CiAgICB0eXBlOiBNb3ZpZUlkCmBgYAoKQ2hlY2tvdXQgb3BlbiBzb3VyY2UgcHJvamVjdHMgdGhhdCBhcmUgdXNpbmcgRmVybiBEZWZpbml0aW9uczoKCi0gW01ldHJpcG9ydF0oaHR0cHM6Ly9naXRodWIuY29tL21ldHJpcG9ydC9tZXRyaXBvcnQvdHJlZS9kZXZlbG9wL2Zlcm4vZGVmaW5pdGlvbikKLSBbUml2ZXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9yaXZldC1nZy9yaXZldC90cmVlL21haW4vZmVybi9kZWZpbml0aW9uKQoKIyMgSW5zcGlyYXRpb24KCkZlcm4gaXMgaW5zcGlyZWQgYnkgaW50ZXJuYWwgdG9vbGluZyBidWlsdCB0byBlbmhhbmNlIHRoZSBkZXZlbG9wZXIgZXhwZXJpZW5jZS4gV2Ugc3RhbmQgb24gdGhlIHNob3VsZGVycyBvZiBnaWFudHMuIFdoaWxlIHRlYW1zIHdlcmUgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIHRoZSBmb2xsb3dpbmcgdG9vbHMsIHdlIHdhbnQgdG8gZ2l2ZSBhIHNob3V0IG91dCB0byBNYXJrIEVsbGlvdCAoY3JlYXRvciBvZiBDb25qdXJlIGF0IFBhbGFudGlyKSwgTWljaGFlbCBEb3dsaW5nIChjcmVhdG9yIG9mIFNtaXRoeSBhdCBBV1MpLCBhbmQgSWFuIE1jQ3J5c3RhbCAoY3JlYXRvciBvZiBTdHJpcGUgRG9jcykuCgojIyBDb21tdW5pdHkKCltKb2luIG91ciBEaXNjb3JkIV0oaHR0cHM6Ly9kaXNjb3JkLmNvbS9pbnZpdGUvSmtrWHVtUHpjRykgV2UgYXJlIGhlcmUgdG8gYW5zd2VyIHF1ZXN0aW9ucyBhbmQgaGVscCB5b3UgZ2V0IHRoZSBtb3N0IG91dCBvZiBGZXJuLgoKIyMgQ29udHJpYnV0aW5nCgpXZSB3ZWxjb21lIGNvbW11bml0eSBjb250cmlidXRpb25zLiBGb3IgZ3VpZGVsaW5lcywgcmVmZXIgdG8gb3VyIFtDT05UUklCVVRJTkcubWRdKC9DT05UUklCVVRJTkcubWQpLgoKIVtGZXJuIENvbnRyaWJ1dG9yc10oaHR0cHM6Ly9jb250cmliLnJvY2tzL2ltYWdlP3JlcG89ZmVybi1hcGkvZmVybikK
+ readmeEtag: '"f38328a730cdc5341a16acbc85e935405aece9d6"'
+ readmeLastModified: Sun, 06 Oct 2024 22:24:33 GMT
repositoryId: 476820102
description: Input OpenAPI. Output SDKs and Docs.
created: '2022-04-01T17:56:54Z'
- updated: '2024-10-05T23:25:29Z'
+ updated: '2024-10-07T02:40:03Z'
language: TypeScript
archived: false
- stars: 2605
+ stars: 2612
watchers: 16
- forks: 139
+ forks: 140
owner: fern-api
logo: https://avatars.githubusercontent.com/u/102944815?v=4
license: Apache-2.0
- repoEtag: '"b9ed10e0e202a258cf96402e59cd2e8d1dc6144efe64884ee15141cc7d7e6811"'
- repoLastModified: Sat, 05 Oct 2024 23:25:29 GMT
+ repoEtag: '"e0546c7469d6ea33dc3f9ef1fdd584d0e4a4dad8283d5dd40f72b8c724f637e3"'
+ repoLastModified: Mon, 07 Oct 2024 02:40:03 GMT
foundInMaster: true
sponsored: true
testimonial: >
@@ -6992,17 +6992,17 @@
repositoryId: 630566794
description: Generate Swift client and server code from an OpenAPI document.
created: '2023-04-20T16:50:53Z'
- updated: '2024-10-05T23:39:07Z'
+ updated: '2024-10-06T20:45:13Z'
language: Swift
archived: false
- stars: 1385
+ stars: 1388
watchers: 107
- forks: 114
+ forks: 115
owner: apple
logo: https://avatars.githubusercontent.com/u/10639145?v=4
license: Apache-2.0
- repoEtag: '"505fe5c3d19c513925ffe7863b0f0facdff1d0fc6934186786a6194732980f6b"'
- repoLastModified: Sat, 05 Oct 2024 23:39:07 GMT
+ repoEtag: '"8f8b46d982cb9cb54c61e38bd86d83e9c76eb5c50b1ac39be6e312b432b4b7d1"'
+ repoLastModified: Sun, 06 Oct 2024 20:45:13 GMT
foundInMaster: true
- source:
- https://openapi.tools/
@@ -7231,17 +7231,17 @@
repositoryId: 706256859
description: Golang Fuego - web framework generating OpenAPI 3 spec from source code
created: '2023-10-17T15:36:43Z'
- updated: '2024-10-05T09:13:24Z'
+ updated: '2024-10-06T11:40:38Z'
language: Go
archived: false
- stars: 822
+ stars: 824
watchers: 7
forks: 41
owner: go-fuego
logo: https://avatars.githubusercontent.com/u/148255240?v=4
license: MIT
- repoEtag: '"9057d58fde43e9c819dc692fa040ddc35b7321f0135232403def80baf963e90a"'
- repoLastModified: Sat, 05 Oct 2024 09:13:24 GMT
+ repoEtag: '"14ba2e6f9b8f7a748ae130828eb086d07a10699079259f6bc2dce4aed08471cd"'
+ repoLastModified: Sun, 06 Oct 2024 11:40:38 GMT
foundInMaster: true
- source:
- https://openapi.tools/
@@ -7257,17 +7257,17 @@
repositoryId: 245763170
description: Huma REST/HTTP API Framework for Golang with OpenAPI 3.1
created: '2020-03-08T06:19:51Z'
- updated: '2024-10-05T07:01:05Z'
+ updated: '2024-10-07T01:18:36Z'
language: Go
archived: false
- stars: 1946
+ stars: 1951
watchers: 27
- forks: 143
+ forks: 144
owner: danielgtaylor
logo: https://avatars.githubusercontent.com/u/106826?v=4
license: MIT
- repoEtag: '"c6a604fa39c07b8f68b76b5291b9b11f8d573366072308623dd29abdb9fe395a"'
- repoLastModified: Sat, 05 Oct 2024 07:01:05 GMT
+ repoEtag: '"4864dd9cf201245e8ffb9d6957c409e0b8ed4c32ac696eedf24d6cc8820d39b9"'
+ repoLastModified: Mon, 07 Oct 2024 01:18:36 GMT
foundInMaster: true
category:
- Auto Generators
@@ -7476,17 +7476,17 @@
repositoryId: 843437350
description: Framework for building high quality, interactive API documentation.
created: '2024-08-16T14:09:50Z'
- updated: '2024-10-04T19:08:41Z'
+ updated: '2024-10-07T03:32:42Z'
language: TypeScript
archived: false
- stars: 62
+ stars: 64
watchers: 3
forks: 3
owner: zuplo
logo: https://avatars.githubusercontent.com/u/85497839?v=4
license: MIT
- repoEtag: '"97a95e764cc3c8d14cf64c08ea5fe44bce35e5f07538e35e4e3e151f7d5cd1a0"'
- repoLastModified: Fri, 04 Oct 2024 19:08:41 GMT
+ repoEtag: '"553bd23a504702918ab7d5b7632babb9a4d41d68c5964955ce4ee2b4ae4f49cb"'
+ repoLastModified: Mon, 07 Oct 2024 03:32:42 GMT
foundInMaster: true
- source: openapi3 tags
name: FastAPI
@@ -7508,17 +7508,17 @@
FastAPI framework, high performance, easy to learn, fast to code, ready
for production
created: '2018-12-08T08:21:47Z'
- updated: '2024-10-06T02:29:46Z'
+ updated: '2024-10-07T03:24:57Z'
language: Python
archived: false
- stars: 76264
+ stars: 76290
watchers: 678
- forks: 6429
+ forks: 6433
owner: fastapi
logo: https://avatars.githubusercontent.com/u/156354296?v=4
license: MIT
- repoEtag: '"1f74de691bccbb97c90725e11ea65856ce26dc505511be896b463c25da03ca35"'
- repoLastModified: Sun, 06 Oct 2024 02:29:46 GMT
+ repoEtag: '"42731d1a7d7965749de1c141fdd245dd0851f3c49c26c1cffa3865bb302ec582"'
+ repoLastModified: Mon, 07 Oct 2024 03:24:57 GMT
foundInMaster: true
id: 01f8d446752c39de698f67e8d2352229
oldLocations:
@@ -7538,17 +7538,17 @@
Swagger UI is a collection of HTML, JavaScript, and CSS assets that
dynamically generate beautiful documentation from a Swagger-compliant API.
created: '2011-07-15T22:56:39Z'
- updated: '2024-10-06T02:09:19Z'
+ updated: '2024-10-07T03:07:20Z'
language: JavaScript
archived: false
- stars: 26410
+ stars: 26418
watchers: 650
- forks: 8926
+ forks: 8927
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"4d1dd1934be6a13b32651e8d0e8efd0bb40a9b717f2f4b1a6a4b1cab6b5c2986"'
- repoLastModified: Sun, 06 Oct 2024 02:09:19 GMT
+ repoEtag: '"457f46ec23b93a0c40f55682364b39cc155fccf9ea9b3ed5b4c07ea951b46dfd"'
+ repoLastModified: Mon, 07 Oct 2024 03:07:20 GMT
foundInMaster: true
name: swagger-ui
homepage: https://github.com/swagger-api/swagger-UI
@@ -7581,17 +7581,17 @@
repositoryId: 45250726
description: 📘 OpenAPI/Swagger-generated API Reference Documentation
created: '2015-10-30T12:53:02Z'
- updated: '2024-10-06T02:17:29Z'
+ updated: '2024-10-07T02:51:20Z'
language: TypeScript
archived: false
- stars: 23386
+ stars: 23390
watchers: 297
- forks: 2291
+ forks: 2292
owner: Redocly
logo: https://avatars.githubusercontent.com/u/32099856?v=4
license: MIT
- repoEtag: '"40a9e20d11ee3f561103875e390006d1a698b6a53e1fc6251b2f554d871dab13"'
- repoLastModified: Sun, 06 Oct 2024 02:17:29 GMT
+ repoEtag: '"3d8e3b33bf3135be1a261c40f3aae4c222bad24ee0ce10fe23b5fa5503e70864"'
+ repoLastModified: Mon, 07 Oct 2024 02:51:20 GMT
foundInMaster: true
v3_1: true
id: 2725d6db6977c1dd12ceaf9701787e07
@@ -7610,17 +7610,17 @@
Examples and server integrations for generating the Swagger API
Specification, which enables easy access to your REST API
created: '2011-07-05T23:44:11Z'
- updated: '2024-10-05T03:10:13Z'
+ updated: '2024-10-06T16:45:42Z'
language: Java
archived: false
- stars: 7374
+ stars: 7375
watchers: 311
- forks: 2174
+ forks: 2176
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"aaaedd191b031ffda3defe5d1ab692da6082fab63bf27ff22301544a2c3b29a1"'
- repoLastModified: Sat, 05 Oct 2024 03:10:13 GMT
+ repoEtag: '"7f0573778954ddecb1e3c31dfd8a0724b4e9cdf2c24ef804d8ab84b37d4967b3"'
+ repoLastModified: Sun, 06 Oct 2024 16:45:42 GMT
foundInMaster: true
category: Code Generators
id: 2093f5c5f56617123b73ae823791176d
@@ -7637,17 +7637,17 @@
Mockoon is the easiest and quickest way to run mock APIs locally. No
remote deployment, no account required, open source.
created: '2017-07-17T13:19:16Z'
- updated: '2024-10-06T01:42:19Z'
+ updated: '2024-10-07T01:39:27Z'
language: TypeScript
archived: false
- stars: 6308
+ stars: 6311
watchers: 60
forks: 378
owner: mockoon
logo: https://avatars.githubusercontent.com/u/49429147?v=4
license: NOASSERTION
- repoEtag: '"06eb1d538398d86b7228cc59a9c0332272bb0876d09e0fb20343e04886fad6fb"'
- repoLastModified: Sun, 06 Oct 2024 01:42:19 GMT
+ repoEtag: '"6e992d43ce7e29d4e583c954470275472fad3c73b202314ebb79583a3a671f4f"'
+ repoLastModified: Mon, 07 Oct 2024 01:39:27 GMT
foundInMaster: true
category: Testing
id: 8728dfca2c1908dbecdcddd31597fad4
@@ -7664,23 +7664,23 @@
v3: true
repositoryMetadata:
base64Readme: >-
- IyBgb2FwaS1jb2RlZ2VuYAoKWyFbT3BlblNTRiBCZXN0IFByYWN0aWNlc10oaHR0cHM6Ly93d3cuYmVzdHByYWN0aWNlcy5kZXYvcHJvamVjdHMvOTQ1MC9iYWRnZSldKGh0dHBzOi8vd3d3LmJlc3RwcmFjdGljZXMuZGV2L3Byb2plY3RzLzk0NTApCgpgb2FwaS1jb2RlZ2VuYCBpcyBhIGNvbW1hbmQtbGluZSB0b29sIGFuZCBsaWJyYXJ5IHRvIGNvbnZlcnQgT3BlbkFQSSBzcGVjaWZpY2F0aW9ucyB0byBHbyBjb2RlLCBiZSBpdCBbc2VydmVyLXNpZGUgaW1wbGVtZW50YXRpb25zXSgjZ2VuZXJhdGluZy1zZXJ2ZXItc2lkZS1ib2lsZXJwbGF0ZSksIFtBUEkgY2xpZW50c10oI2dlbmVyYXRpbmctYXBpLWNsaWVudHMpLCBvciBzaW1wbHkgW0hUVFAgbW9kZWxzXSgjZ2VuZXJhdGluZy1hcGktbW9kZWxzKS4KClVzaW5nIGBvYXBpLWNvZGVnZW5gIGFsbG93cyB5b3UgdG8gcmVkdWNlIHRoZSBib2lsZXJwbGF0ZSByZXF1aXJlZCB0byBjcmVhdGUgb3IgaW50ZWdyYXRlIHdpdGggc2VydmljZXMgYmFzZWQgb24gW09wZW5BUEkgMy4wXShodHRwczovL2dpdGh1Yi5jb20vT0FJL09wZW5BUEktU3BlY2lmaWNhdGlvbi9ibG9iL21haW4vdmVyc2lvbnMvMy4wLjAubWQpLCBhbmQgaW5zdGVhZCBmb2N1cyBvbiB3cml0aW5nIHlvdXIgYnVzaW5lc3MgbG9naWMsIGFuZCB3b3JraW5nIG9uIHRoZSByZWFsIHZhbHVlLWFkZCBmb3IgeW91ciBvcmdhbmlzYXRpb24uCgpXaXRoIGBvYXBpLWNvZGVnZW5gLCB0aGVyZSBhcmUgYSBmZXcgW0tleSBEZXNpZ24gRGVjaXNpb25zXSgja2V5LWRlc2lnbi1kZWNpc2lvbnMpIHdlJ3ZlIG1hZGUsIGluY2x1ZGluZzoKCi0gaWRpb21hdGljIEdvLCB3aGVyZSBwb3NzaWJsZQotIGZhaXJseSBzaW1wbGUgZ2VuZXJhdGVkIGNvZGUsIGVycmluZyBvbiB0aGUgc2lkZSBvZiBkdXBsaWNhdGUgY29kZSBvdmVyIG5pY2VseSByZWZhY3RvcmVkIGNvZGUKLSBzdXBwb3J0aW5nIGFzIG11Y2ggb2YgT3BlbkFQSSAzLnggYXMgaXMgcG9zc2libGUsIGFsb25nc2lkZSBHbydzIHR5cGUgc3lzdGVtCgpgb2FwaS1jb2RlZ2VuYCBpcyBvbmUgcGFydCBvZiBhIHdpZGVyIGVjb3N5c3RlbSwgd2hpY2ggY2FuIGJlIGZvdW5kIGRlc2NyaWJlZCBpbiBmdXJ0aGVyIGRldGFpbCBpbiB0aGUgW29hcGktY29kZWdlbiBvcmdhbmlzYXRpb24gb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuKS4KCuKaoO+4jyBUaGlzIFJFQURNRSBtYXkgYmUgZm9yIHRoZSBsYXRlc3QgZGV2ZWxvcG1lbnQgdmVyc2lvbiwgd2hpY2ggbWF5IGNvbnRhaW4gdW5yZWxlYXNlZCBjaGFuZ2VzLiBQbGVhc2UgZW5zdXJlIHlvdSdyZSBsb29raW5nIGF0IHRoZSBSRUFETUUgZm9yIHRoZSBsYXRlc3QgcmVsZWFzZSB2ZXJzaW9uLgoKIyMgQWN0aW9uIFJlcXVpcmVkOiBUaGUgcmVwb3NpdG9yeSBmb3IgdGhpcyBwcm9qZWN0IGhhcyBjaGFuZ2VkCgpBcyBhbm5vdW5jZWQgaW4gW01heSAyMDI0XShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9kaXNjdXNzaW9ucy8xNjA1KSwKd2UgaGF2ZSBtb3ZlZCB0aGUgcHJvamVjdCBmcm9tIHRoZSBkZWVwbWFwIG9yZ2FuaXphdGlvbiB0byBvdXIgb3duIG9yZ2FuaXphdGlvbiwgYW5kIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHlvdXIKaW1wb3J0IHBhdGhzIHRvIHB1bGwgdXBkYXRlcyBwYXN0IHRoaXMgcG9pbnQuIFlvdSBuZWVkIHRvIGRvIGEgcmVjdXJzaXZlIHNlYXJjaC9yZXBsYWNlIGZyb20KYGdpdGh1Yi5jb20vZGVlcG1hcC9vYXBpLWNvZGVnZW4vdjJgIHRvIGBnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjJgLgoKPiBbIUlNUE9SVEFOVF0KPiBgb2FwaS1jb2RlZ2VuYCBtb3ZlZCB0byBpdHMgbmV3IGhvbWUgd2l0aCB0aGUgdmVyc2lvbiB0YWcgYHYyLjMuMGAuCgpJZiB5b3UgYXJlIHVzaW5nIGB2Mi4yLjBgIG9yIGJlbG93LCBwbGVhc2UgaW5zdGFsbCBsaWtlIHNvOgoKYGBgc2gKIyBmb3IgdGhlIGJpbmFyeSBpbnN0YWxsCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9kZWVwbWFwL29hcGktY29kZWdlbi92Mi9jbWQvb2FwaS1jb2RlZ2VuQHYyLjIuMApgYGAKCklmIHlvdSBhcmUgdXNpbmcgYHYyLjMuMGAgb3IgYWJvdmUsIHBsZWFzZSBpbnN0YWxsIGxpa2Ugc28sIHVzaW5nIHRoZSBuZXcgbW9kdWxlIGltcG9ydCBwYXRoOgoKYGBgc2gKIyBmb3IgdGhlIGJpbmFyeSBpbnN0YWxsCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyL2NtZC9vYXBpLWNvZGVnZW5AbGF0ZXN0CmBgYAoKIyMgSW5zdGFsbAoKSXQgaXMgcmVjb21tZW5kZWQgdG8gZm9sbG93IFt0aGUgYHRvb2xzLmdvYCBwYXR0ZXJuXShodHRwczovL3d3dy5qdnQubWUvcG9zdHMvMjAyMi8wNi8xNS9nby10b29scy1kZXBlbmRlbmN5LW1hbmFnZW1lbnQvKSBmb3IgbWFuYWdpbmcgdGhlIGRlcGVuZGVuY3kgb2YgYG9hcGktY29kZWdlbmAgYWxvbmdzaWRlIHlvdXIgY29yZSBhcHBsaWNhdGlvbi4KClRoaXMgd291bGQgZ2l2ZSB5b3UgYSBgdG9vbHMvdG9vbHMuZ29gOgoKYGBgZ28KLy9nbzpidWlsZCB0b29scwovLyArYnVpbGQgdG9vbHMKCnBhY2thZ2UgbWFpbgoKaW1wb3J0ICgKCV8gImdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9jbWQvb2FwaS1jb2RlZ2VuIgopCmBgYAoKVGhlbiwgZWFjaCBpbnZvY2F0aW9uIG9mIGBvYXBpLWNvZGVnZW5gIHdvdWxkIGJlIHVzZWQgbGlrZSBzbzoKCmBgYGdvCi8vZ286Z2VuZXJhdGUgZ28gcnVuIGdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9jbWQvb2FwaS1jb2RlZ2VuIC0tY29uZmlnPWNvbmZpZy55YW1sIC4uLy4uL2FwaS55YW1sCmBgYAoKQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBpbnN0YWxsIGl0IGFzIGEgYmluYXJ5IHdpdGg6CgpgYGBzaAokIGdvIGluc3RhbGwgZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyL2NtZC9vYXBpLWNvZGVnZW5AbGF0ZXN0CiQgb2FwaS1jb2RlZ2VuIC12ZXJzaW9uCmBgYAoKV2hpY2ggdGhlbiBtZWFucyB5b3UgY2FuIGludm9rZSBpdCBsaWtlIHNvOgoKYGBgZ28KLy9nbzpnZW5lcmF0ZSBvYXBpLWNvZGVnZW4gLS1jb25maWc9Y29uZmlnLnlhbWwgLi4vLi4vYXBpLnlhbWwKYGBgCgpOb3RlIHRoYXQgeW91IGNhbiBhbHNvIFttb3ZlIHlvdXIgYHRvb2xzLmdvYCBpbnRvIGl0cyBvd24gc3ViLW1vZHVsZV0oaHR0cHM6Ly93d3cuanZ0Lm1lL3Bvc3RzLzIwMjQvMDkvMzAvZ28tdG9vbHMtbW9kdWxlLykgdG8gcmVkdWNlIHRoZSBpbXBhY3Qgb24geW91ciB0b3AtbGV2ZWwgYGdvLm1vZGAuCgojIyMgUGlubmluZyB0byBjb21taXRzCgpXaGlsZSB0aGUgcHJvamVjdCBkb2VzIG5vdCAoW3lldF0oaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vaXNzdWVzLzE1MTkpKSBoYXZlIGEgZGVmaW5lZCByZWxlYXNlIGNhZGVuY2UsIHRoZXJlIG1heSBiZSBjYXNlcyB3aGVyZSB5b3Ugd2FudCB0byBwdWxsIGluIHlldC11bnJlbGVhc2VkIGNoYW5nZXMgdG8geW91ciBjb2RlYmFzZS4KClRoZXJlZm9yZSwgeW91IG1heSB3YW50IHRvIHBpbiB5b3VyIGRlcGVuZGVuY3kgb24gYG9hcGktY29kZWdlbmAgdG8gYSBnaXZlbiBjb21taXQgaGFzaCwgcmF0aGVyIHRoYW4gYSB0YWcuCgpUaGlzIGlzICoqb2ZmaWNpYWxseSByZWNvbW1lbmRlZCoqIGZvciBjb25zdW1lcnMgb2YgYG9hcGktY29kZWdlbmAsIHdobyB3YW50IGZlYXR1cmVzL2J1ZyBmaXhlcyB0aGF0IGhhdmVuJ3QgeWV0IGJlZW4gcmVsZWFzZWQuCgpXZSBhaW0gdG8ga2VlcCB0aGUgZGVmYXVsdCBicmFuY2ggcmVhZHktdG8tcmVsZWFzZSBzbyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gc2FmZWx5IHBpbi4KClRvIGRvIHNvLCB5b3UgY2FuIHJ1bjoKCmBgYHNoCiMgcGluIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvbiB0aGUgZGVmYXVsdCBicmFuY2gKJCBnbyBnZXQgZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyQG1haW4KIyBhbHRlcm5hdGl2ZWx5LCB0byBhIGNvbW1pdCBoYXNoIGkuZS4gaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vY29tbWl0LzcxZTkxNmM1OTY4OGE2Mzc5YjU3NzRkZmU1OTA0ZWMyMjJiOWE1MzcKJCBnbyBnZXQgZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyQDcxZTkxNmM1OTY4OGE2Mzc5YjU3NzRkZmU1OTA0ZWMyMjJiOWE1MzcKYGBgCgpUaGlzIHdpbGwgdGhlbiBtYWtlIGEgY2hhbmdlIHN1Y2ggYXM6CgpgYGBkaWZmCmRpZmYgLS1naXQgZ28ubW9kIGdvLm1vZAppbmRleCA0NGYyOWE0Li40MzZhNzgwIDEwMDY0NAotLS0gZ28ubW9kCisrKyBnby5tb2QKQEAgLTIsMjEgKzIsMjAgQEAKLXJlcXVpcmUgZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyIHYyLjEuMAorcmVxdWlyZSBnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIgdjIuMS4xLTAuMjAyNDAzMzEyMTI1MTQtODBmMGI5NzhlZjE2CmBgYAoKIyMgVXNhZ2UKCmBvYXBpLWNvZGVnZW5gIGlzIGxhcmdlbHkgY29uZmlndXJlZCB1c2luZyBhIFlBTUwgY29uZmlndXJhdGlvbiBmaWxlLCB0byBzaW1wbGlmeSB0aGUgbnVtYmVyIG9mIGZsYWdzIHRoYXQgdXNlcnMgbmVlZCB0byByZW1lbWJlciwgYW5kIHRvIG1ha2UgcmVhZGluZyB0aGUgYGdvOmdlbmVyYXRlYCBjb21tYW5kIGxlc3MgZGF1bnRpbmcuCgpGb3IgZnVsbCBkZXRhaWxzIG9mIHdoYXQgaXMgc3VwcG9ydGVkLCBpdCdzIHdvcnRoIGNoZWNraW5nIG91dCBbdGhlIEdvRG9jIGZvciBgY29kZWdlbi5Db25maWd1cmF0aW9uYF0oaHR0cHM6Ly9wa2cuZ28uZGV2L2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9wa2cvY29kZWdlbiNDb25maWd1cmF0aW9uKS4KCldlIGFsc28gaGF2ZSBbYSBKU09OIFNjaGVtYV0oY29uZmlndXJhdGlvbi1zY2hlbWEuanNvbikgdGhhdCBjYW4gYmUgdXNlZCBieSBJREVzL2VkaXRvcnMgd2l0aCB0aGUgTGFuZ3VhZ2UgU2VydmVyIFByb3RvY29sIChMU1ApIHRvIHBlcmZvcm0gaW50ZWxsaWdlbnQgc3VnZ2VzdGlvbnMsIGkuZS46CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6ICRzY2hlbWE9aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vSEVBRC9jb25maWd1cmF0aW9uLXNjaGVtYS5qc29uCnBhY2thZ2U6IGFwaQojIC4uLgpgYGAKCiMjIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoKQWx0aG91Z2ggd2Ugc3RyaXZlIHRvIHJldGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAtIGFzIGEgcHJvamVjdCB0aGF0J3MgdXNpbmcgYSBzdGFibGUgQVBJIHBlciBTZW1WZXIgLSB0aGVyZSBhcmUgc29tZXRpbWVzIG9wcG9ydHVuaXRpZXMgd2UgbXVzdCB0YWtlIHRvIGZpeCBhIGJ1ZyB0aGF0IGNvdWxkIGNhdXNlIGEgYnJlYWtpbmcgY2hhbmdlIGZvciBbcGVvcGxlIHJlbHlpbmcgdXBvbiB0aGUgYmVoYXZpb3VyXShodHRwczovL3hrY2QuY29tLzExNzIvKS4KCkluIHRoaXMgY2FzZSwgd2Ugd2lsbCBleHBvc2UgYSBbY29tcGF0aWJpbGl0eSBvcHRpb25dKGh0dHBzOi8vcGtnLmdvLmRldi9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvcGtnL2NvZGVnZW4jQ29tcGF0aWJpbGl0eU9wdGlvbnMpIHRvIHJlc3RvcmUgb2xkIGJlaGF2aW91ci4KCiMjIEZlYXR1cmVzCgpBdCBhIGhpZ2ggbGV2ZWwsIGBvYXBpLWNvZGVnZW5gIHN1cHBvcnRzOgoKLSBHZW5lcmF0aW5nIHNlcnZlci1zaWRlIGJvaWxlcnBsYXRlIGZvciBbYSBudW1iZXIgb2Ygc2VydmVyc10oI3N1cHBvcnRlZC1zZXJ2ZXJzKSAoW2RvY3NdKCNnZW5lcmF0aW5nLXNlcnZlci1zaWRlLWJvaWxlcnBsYXRlKSkKLSBHZW5lcmF0aW5nIGNsaWVudCBBUEkgYm9pbGVycGxhdGUgKFtkb2NzXSgjZ2VuZXJhdGluZy1hcGktY2xpZW50cykpCi0gR2VuZXJhdGluZyB0aGUgdHlwZXMgKFtkb2NzXSgjZ2VuZXJhdGluZy1hcGktbW9kZWxzKSkKLSBTcGxpdHRpbmcgbGFyZ2UgT3BlbkFQSSBzcGVjcyBhY3Jvc3MgbXVsdGlwbGUgcGFja2FnZXMoW2RvY3NdKCNpbXBvcnQtbWFwcGluZykpCiAgLSBUaGlzIGlzIGFsc28ga25vd24gYXMgIkltcG9ydCBNYXBwaW5nIiBvciAiZXh0ZXJuYWwgcmVmZXJlbmNlcyIgYWNyb3NzIG91ciBkb2N1bWVudGF0aW9uIC8gZGlzY3Vzc2lvbiBpbiBHaXRIdWIgaXNzdWVzCgojIyBXaGF0IGRvZXMgaXQgbG9vayBsaWtlPwoKQmVsb3cgd2UgY2FuIHNlZSBhIHRyaW1tZWQgZG93biBleGFtcGxlIHRha2VuIGZyb20gdGhlIE9wZW5BUEkgUGV0c3RvcmUgW2V4YW1wbGVdKGV4YW1wbGVzL3BldHN0b3JlLWV4cGFuZGVkL3N0ZGh0dHAvYXBpL3BldHN0b3JlLmdlbi5nbyk6CgpgYGBnbwovLyBnZW5lcmF0ZWQgY29kZQoKdHlwZSBTZXJ2ZXJJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCS8vIC4uLgoJLy8gUmV0dXJucyBhbGwgcGV0cwoJLy8gKEdFVCAvcGV0cykKCUZpbmRQZXRzKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0LCBwYXJhbXMgRmluZFBldHNQYXJhbXMpCgkvLyAuLi4KfQoKLy8gRmluZFBldHMgb3BlcmF0aW9uIG1pZGRsZXdhcmUKZnVuYyAoc2l3ICpTZXJ2ZXJJbnRlcmZhY2VXcmFwcGVyKSBGaW5kUGV0cyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgewoKCXZhciBlcnIgZXJyb3IKCgkvLyBQYXJhbWV0ZXIgb2JqZWN0IHdoZXJlIHdlIHdpbGwgdW5tYXJzaGFsIGFsbCBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbnRleHQKCXZhciBwYXJhbXMgRmluZFBldHNQYXJhbXMKCgkvLyAtLS0tLS0tLS0tLS0tIE9wdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlciAidGFncyIgLS0tLS0tLS0tLS0tLQoKCWVyciA9IHJ1bnRpbWUuQmluZFF1ZXJ5UGFyYW1ldGVyKCJmb3JtIiwgdHJ1ZSwgZmFsc2UsICJ0YWdzIiwgci5VUkwuUXVlcnkoKSwgJnBhcmFtcy5UYWdzKQoJaWYgZXJyICE9IG5pbCB7CgkJc2l3LkVycm9ySGFuZGxlckZ1bmModywgciwgJkludmFsaWRQYXJhbUZvcm1hdEVycm9ye1BhcmFtTmFtZTogInRhZ3MiLCBFcnI6IGVycn0pCgkJcmV0dXJuCgl9CgoJLy8gLS0tLS0tLS0tLS0tLSBPcHRpb25hbCBxdWVyeSBwYXJhbWV0ZXIgImxpbWl0IiAtLS0tLS0tLS0tLS0tCgoJZXJyID0gcnVudGltZS5CaW5kUXVlcnlQYXJhbWV0ZXIoImZvcm0iLCB0cnVlLCBmYWxzZSwgImxpbWl0Iiwgci5VUkwuUXVlcnkoKSwgJnBhcmFtcy5MaW1pdCkKCWlmIGVyciAhPSBuaWwgewoJCXNpdy5FcnJvckhhbmRsZXJGdW5jKHcsIHIsICZJbnZhbGlkUGFyYW1Gb3JtYXRFcnJvcntQYXJhbU5hbWU6ICJsaW1pdCIsIEVycjogZXJyfSkKCQlyZXR1cm4KCX0KCgloYW5kbGVyIDo9IGh0dHAuSGFuZGxlcihodHRwLkhhbmRsZXJGdW5jKGZ1bmModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpIHsKCQlzaXcuSGFuZGxlci5GaW5kUGV0cyh3LCByLCBwYXJhbXMpCgl9KSkKCglmb3IgXywgbWlkZGxld2FyZSA6PSByYW5nZSBzaXcuSGFuZGxlck1pZGRsZXdhcmVzIHsKCQloYW5kbGVyID0gbWlkZGxld2FyZShoYW5kbGVyKQoJfQoKCWhhbmRsZXIuU2VydmVIVFRQKHcsIHIpCn0KCi8vIEhhbmRsZXJXaXRoT3B0aW9ucyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucwpmdW5jIEhhbmRsZXJXaXRoT3B0aW9ucyhzaSBTZXJ2ZXJJbnRlcmZhY2UsIG9wdGlvbnMgU3RkSFRUUFNlcnZlck9wdGlvbnMpIGh0dHAuSGFuZGxlciB7CgltIDo9IG9wdGlvbnMuQmFzZVJvdXRlcgoKCWlmIG0gPT0gbmlsIHsKCQltID0gaHR0cC5OZXdTZXJ2ZU11eCgpCgl9CglpZiBvcHRpb25zLkVycm9ySGFuZGxlckZ1bmMgPT0gbmlsIHsKCQlvcHRpb25zLkVycm9ySGFuZGxlckZ1bmMgPSBmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0LCBlcnIgZXJyb3IpIHsKCQkJaHR0cC5FcnJvcih3LCBlcnIuRXJyb3IoKSwgaHR0cC5TdGF0dXNCYWRSZXF1ZXN0KQoJCX0KCX0KCgl3cmFwcGVyIDo9IFNlcnZlckludGVyZmFjZVdyYXBwZXJ7CgkJSGFuZGxlcjogICAgICAgICAgICBzaSwKCQlIYW5kbGVyTWlkZGxld2FyZXM6IG9wdGlvbnMuTWlkZGxld2FyZXMsCgkJRXJyb3JIYW5kbGVyRnVuYzogICBvcHRpb25zLkVycm9ySGFuZGxlckZ1bmMsCgl9CgoJbS5IYW5kbGVGdW5jKCJHRVQgIitvcHRpb25zLkJhc2VVUkwrIi9wZXRzIiwgd3JhcHBlci5GaW5kUGV0cykKCglyZXR1cm4gbQp9CmBgYAoKVGhlbiwgaW4geW91ciBvd24gY29kZSwgeW91IGltcGxlbWVudCB0aGUgdW5kZXJseWluZyBsb2dpYyBmb3IgdGhlIGBGaW5kUGV0c2AgaW1wbGVtZW50YXRpb246CgpgYGBnbwp0eXBlIFBldFN0b3JlIHN0cnVjdCB7CglQZXRzICAgbWFwW2ludDY0XVBldAoJTmV4dElkIGludDY0CglMb2NrICAgc3luYy5NdXRleAp9CgovLyBNYWtlIHN1cmUgd2UgY29uZm9ybSB0byBTZXJ2ZXJJbnRlcmZhY2UKCnZhciBfIFNlcnZlckludGVyZmFjZSA9ICgqUGV0U3RvcmUpKG5pbCkKCmZ1bmMgTmV3UGV0U3RvcmUoKSAqUGV0U3RvcmUgewoJcmV0dXJuICZQZXRTdG9yZXsKCQlQZXRzOiAgIG1ha2UobWFwW2ludDY0XVBldCksCgkJTmV4dElkOiAxMDAwLAoJfQp9CgovLyBGaW5kUGV0cyBpbXBsZW1lbnRzIGFsbCB0aGUgaGFuZGxlcnMgaW4gdGhlIFNlcnZlckludGVyZmFjZQpmdW5jIChwICpQZXRTdG9yZSkgRmluZFBldHModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QsIHBhcmFtcyBGaW5kUGV0c1BhcmFtcykgewoJcC5Mb2NrLkxvY2soKQoJZGVmZXIgcC5Mb2NrLlVubG9jaygpCgoJdmFyIHJlc3VsdCBbXVBldAoKCWZvciBfLCBwZXQgOj0gcmFuZ2UgcC5QZXRzIHsKCQlpZiBwYXJhbXMuVGFncyAhPSBuaWwgewoJCQkvLyBJZiB3ZSBoYXZlIHRhZ3MsICBmaWx0ZXIgcGV0cyBieSB0YWcKCQkJZm9yIF8sIHQgOj0gcmFuZ2UgKnBhcmFtcy5UYWdzIHsKCQkJCWlmIHBldC5UYWcgIT0gbmlsICYmICgqcGV0LlRhZyA9PSB0KSB7CgkJCQkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgcGV0KQoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gQWRkIGFsbCBwZXRzIGlmIHdlJ3JlIG5vdCBmaWx0ZXJpbmcKCQkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgcGV0KQoJCX0KCgkJaWYgcGFyYW1zLkxpbWl0ICE9IG5pbCB7CgkJCWwgOj0gaW50KCpwYXJhbXMuTGltaXQpCgkJCWlmIGxlbihyZXN1bHQpID49IGwgewoJCQkJLy8gV2UncmUgYXQgdGhlIGxpbWl0CgkJCQlicmVhawoJCQl9CgkJfQoJfQoKCXcuV3JpdGVIZWFkZXIoaHR0cC5TdGF0dXNPSykKCV8gPSBqc29uLk5ld0VuY29kZXIodykuRW5jb2RlKHJlc3VsdCkKfQpgYGAKCkFzIHdlIGNhbiBzZWUsIGBvYXBpLWNvZGVnZW5gIHNpbXBsaWZpZXMgc29tZSBvZiB0aGUgYm9pbGVycGxhdGUgYnkgdGFraW5nIHBhcmFtZXRlcnMgb3V0IG9mIHRoZSByZXF1ZXN0IGFuZCBpbnN0ZWFkIGFsbG93cyB1cyB0byBmb2N1cyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCgpZb3UnbGwgbm90ZSB0aGF0IHRoZXJlJ3Mgc3RpbGwgYSBiaXQgbW9yZSBtYXJzaGFsaW5nIG9mIHJlcXVlc3QvcmVzcG9uc2UgZGF0YSwgd2hpY2ggaXMgZnVydGhlciByZWR1Y2VkIGJ5IHVzaW5nIHRoZSBbU3RyaWN0IHNlcnZlcl0oI3N0cmljdC1zZXJ2ZXIpIGZ1bmN0aW9uYWxpdHkuCgo8YSBuYW1lPSJ3aGF0LWRvZXMtaXQtbG9vay1saWtlLXN0cmljdCI+PC9hPgpXaGVuIHVzaW5nIHRoZSBzdHJpY3Qgc2VydmVyLCB5b3UnbGwgaGF2ZSB0aGUgZm9sbG93aW5nIGdlbmVyYXRlZCBjb2RlOgoKYGBgZ28KLy8gU3RyaWN0U2VydmVySW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIHNlcnZlciBoYW5kbGVycy4KdHlwZSBTdHJpY3RTZXJ2ZXJJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCS8vIC4uLgoJLy8gUmV0dXJucyBhbGwgcGV0cwoJLy8gKEdFVCAvcGV0cykKCUZpbmRQZXRzKGN0eCBjb250ZXh0LkNvbnRleHQsIHJlcXVlc3QgRmluZFBldHNSZXF1ZXN0T2JqZWN0KSAoRmluZFBldHNSZXNwb25zZU9iamVjdCwgZXJyb3IpCgkvLyAuLi4KfQoKZnVuYyBOZXdTdHJpY3RIYW5kbGVyV2l0aE9wdGlvbnMoc3NpIFN0cmljdFNlcnZlckludGVyZmFjZSwgbWlkZGxld2FyZXMgW11TdHJpY3RNaWRkbGV3YXJlRnVuYywgb3B0aW9ucyBTdHJpY3RIVFRQU2VydmVyT3B0aW9ucykgU2VydmVySW50ZXJmYWNlIHsKCXJldHVybiAmc3RyaWN0SGFuZGxlcntzc2k6IHNzaSwgbWlkZGxld2FyZXM6IG1pZGRsZXdhcmVzLCBvcHRpb25zOiBvcHRpb25zfQp9CgovLyBGaW5kUGV0cyBvcGVyYXRpb24gbWlkZGxld2FyZQpmdW5jIChzaCAqc3RyaWN0SGFuZGxlcikgRmluZFBldHModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QsIHBhcmFtcyBGaW5kUGV0c1BhcmFtcykgewoJdmFyIHJlcXVlc3QgRmluZFBldHNSZXF1ZXN0T2JqZWN0CgoJcmVxdWVzdC5QYXJhbXMgPSBwYXJhbXMKCgloYW5kbGVyIDo9IGZ1bmMoY3R4IGNvbnRleHQuQ29udGV4dCwgdyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QsIHJlcXVlc3QgaW50ZXJmYWNle30pIChpbnRlcmZhY2V7fSwgZXJyb3IpIHsKCQlyZXR1cm4gc2guc3NpLkZpbmRQZXRzKGN0eCwgcmVxdWVzdC4oRmluZFBldHNSZXF1ZXN0T2JqZWN0KSkKCX0KCWZvciBfLCBtaWRkbGV3YXJlIDo9IHJhbmdlIHNoLm1pZGRsZXdhcmVzIHsKCQloYW5kbGVyID0gbWlkZGxld2FyZShoYW5kbGVyLCAiRmluZFBldHMiKQoJfQoKCXJlc3BvbnNlLCBlcnIgOj0gaGFuZGxlcihyLkNvbnRleHQoKSwgdywgciwgcmVxdWVzdCkKCglpZiBlcnIgIT0gbmlsIHsKCQlzaC5vcHRpb25zLlJlc3BvbnNlRXJyb3JIYW5kbGVyRnVuYyh3LCByLCBlcnIpCgl9IGVsc2UgaWYgdmFsaWRSZXNwb25zZSwgb2sgOj0gcmVzcG9uc2UuKEZpbmRQZXRzUmVzcG9uc2VPYmplY3QpOyBvayB7CgkJaWYgZXJyIDo9IHZhbGlkUmVzcG9uc2UuVmlzaXRGaW5kUGV0c1Jlc3BvbnNlKHcpOyBlcnIgIT0gbmlsIHsKCQkJc2gub3B0aW9ucy5SZXNwb25zZUVycm9ySGFuZGxlckZ1bmModywgciwgZXJyKQoJCX0KCX0gZWxzZSBpZiByZXNwb25zZSAhPSBuaWwgewoJCXNoLm9wdGlvbnMuUmVzcG9uc2VFcnJvckhhbmRsZXJGdW5jKHcsIHIsIGZtdC5FcnJvcmYoInVuZXhwZWN0ZWQgcmVzcG9uc2UgdHlwZTogJVQiLCByZXNwb25zZSkpCgl9Cn0KYGBgCgpUaGVuLCBpbiB5b3VyIG93biBjb2RlLCB5b3UgaW1wbGVtZW50IHRoZSB1bmRlcmx5aW5nIGxvZ2ljIGZvciB0aGUgYEZpbmRQZXRzYCBpbXBsZW1lbnRhdGlvbjoKCmBgYGdvCi8vIE1ha2Ugc3VyZSB3ZSBjb25mb3JtIHRvIFN0cmljdFNlcnZlckludGVyZmFjZQoKdmFyIF8gU3RyaWN0U2VydmVySW50ZXJmYWNlID0gKCpQZXRTdG9yZSkobmlsKQoKZnVuYyBOZXdQZXRTdG9yZSgpICpQZXRTdG9yZSB7CglyZXR1cm4gJlBldFN0b3JlewoJCVBldHM6ICAgbWFrZShtYXBbaW50NjRdUGV0KSwKCQlOZXh0SWQ6IDEwMDAsCgl9Cn0KCi8vIEZpbmRQZXRzIGltcGxlbWVudHMgYWxsIHRoZSBoYW5kbGVycyBpbiB0aGUgU2VydmVySW50ZXJmYWNlCmZ1bmMgKHAgKlBldFN0b3JlKSBGaW5kUGV0cyhjdHggY29udGV4dC5Db250ZXh0LCByZXF1ZXN0IEZpbmRQZXRzUmVxdWVzdE9iamVjdCkgKEZpbmRQZXRzUmVzcG9uc2VPYmplY3QsIGVycm9yKSB7CglwLkxvY2suTG9jaygpCglkZWZlciBwLkxvY2suVW5sb2NrKCkKCgl2YXIgcmVzdWx0IFtdUGV0CgoJZm9yIF8sIHBldCA6PSByYW5nZSBwLlBldHMgewoJCWlmIHJlcXVlc3QuUGFyYW1zLlRhZ3MgIT0gbmlsIHsKCQkJLy8gSWYgd2UgaGF2ZSB0YWdzLCAgZmlsdGVyIHBldHMgYnkgdGFnCgkJCWZvciBfLCB0IDo9IHJhbmdlICpyZXF1ZXN0LlBhcmFtcy5UYWdzIHsKCQkJCWlmIHBldC5UYWcgIT0gbmlsICYmICgqcGV0LlRhZyA9PSB0KSB7CgkJCQkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgcGV0KQoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gQWRkIGFsbCBwZXRzIGlmIHdlJ3JlIG5vdCBmaWx0ZXJpbmcKCQkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgcGV0KQoJCX0KCgkJaWYgcmVxdWVzdC5QYXJhbXMuTGltaXQgIT0gbmlsIHsKCQkJbCA6PSBpbnQoKnJlcXVlc3QuUGFyYW1zLkxpbWl0KQoJCQlpZiBsZW4ocmVzdWx0KSA+PSBsIHsKCQkJCS8vIFdlJ3JlIGF0IHRoZSBsaW1pdAoJCQkJYnJlYWsKCQkJfQoJCX0KCX0KCglyZXR1cm4gRmluZFBldHMyMDBKU09OUmVzcG9uc2UocmVzdWx0KSwgbmlsCn0KYGBgCgpXZSBjYW4gc2VlIHRoYXQgdGhpcyBwcm92aWRlcyB0aGUgYmVzdCBtZWFucyB0byBmb2N1cyBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ1c2luZXNzIGxvZ2ljIHdpdGhpbiB0aGUgZW5kcG9pbnQsIHJhdGhlciB0aGFuICh1biltYXJzaGFsbGluZyB0eXBlcyB0byBhbmQgZnJvbSBKU09OLCBvciB3cmFuZ2xpbmcgY29va2llcyBvciBoZWFkZXJzLgoKIyMgS2V5IGRlc2lnbiBkZWNpc2lvbnMKCi0gUHJvZHVjZSBhbiBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgc2F0aXNmaWVkIGJ5IHlvdXIgaW1wbGVtZW50YXRpb24sIHdpdGggcmVkdWNlZCBib2lsZXJwbGF0ZQotIEJ1bGsgcHJvY2Vzc2luZyBhbmQgcGFyc2luZyBvZiBPcGVuQVBJIGRvY3VtZW50IGluIEdvCi0gUmVzdWx0aW5nIG91dHB1dCBpcyB1c2luZyBHbydzIGB0ZXh0L3RlbXBsYXRlYHMsIHdoaWNoIGFyZSB1c2VyLW92ZXJyaWRhYmxlCi0gQXR0ZW1wdHMgdG8gcHJvZHVjZSBJZGlvbWF0aWMgR28KLSBTaW5nbGUtZmlsZSBvdXRwdXQKLSBTdXBwb3J0IG11bHRpcGxlIE9wZW5BUEkgZmlsZXMgYnkgaGF2aW5nIGEgcGFja2FnZS1wZXItT3BlbkFQSSBmaWxlCi0gU3VwcG9ydCBvZiBPcGVuQVBJIDMuMAogIC0gT3BlbkFQSSAzLjEgc3VwcG9ydCBpcyBbYXdhaXRpbmcgdXBzdHJlYW0gc3VwcG9ydF0oaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vaXNzdWVzLzM3MykKICAtIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGluY2x1ZGUgT3BlbkFQSSAyLjAgKGFrYSBTd2FnZ2VyKQotIEV4dHJhY3QgcGFyYW1ldGVycyBmcm9tIHJlcXVlc3RzLCB0byByZWR1Y2Ugd29yayByZXF1aXJlZCBieSB5b3VyIGltcGxlbWVudGF0aW9uCi0gSW1wbGljaXQgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzYCBhcmUgaWdub3JlZCBieSBkZWZhdWx0IChbbW9yZSBkZXRhaWxzXSgjYWRkaXRpb25hbC1wcm9wZXJ0aWVzLWFkZGl0aW9uYWxwcm9wZXJ0aWVzKSkKLSBQcnVuZSB1bnVzZWQgdHlwZXMgYnkgZGVmYXVsdAoKIyMgR2VuZXJhdGluZyBzZXJ2ZXItc2lkZSBib2lsZXJwbGF0ZQoKYG9hcGktY29kZWdlbmAgc2hpbmVzIGJ5IG1ha2luZyBpdCBmYWlybHkgc3RyYWlnaHRmb3J3YXJkIChub3RlIHRoYXQgdGhpcyBpcyBhIHB1cnBvc2VmdWwgY2hvaWNlIG9mIHdvcmRpbmcgaGVyZSAtIHdlIHdhbnQgdG8gYXZvaWQgd29yZHMgbGlrZSAiZWFzeSIpIHRvIGdlbmVyYXRlIHRoZSBzZXJ2ZXItc2lkZSBib2lsZXJwbGF0ZSBmb3IgYSBiYWNrZW5kIEFQSS4KCkJlbG93IHlvdSBjYW4gZmluZCB0aGUgc3VwcG9ydGVkIHNlcnZlcnMsIGFuZCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBpbXBsZW1lbnQgYSBzZXJ2ZXIgdXNpbmcgdGhlbS4KClRvIHByb3ZpZGUgeW91IGEgZnVsbHkgVGVzdCBEcml2ZW4gRGV2ZWxvcG1lbnQgc3R5bGUgdGVzdCBoYXJuZXNzIHRvIGNvbmZpcm0geW91IGFyZSBmb2xsb3dpbmcgdGhlIHNwZWNpZmljYXRpb24sIHlvdSBjb3VsZCB1c2UgYSB0b29sIHN1Y2ggYXMgW29wZW5hcGkudGFubmEuZGV2L2dvL3ZhbGlkYXRvcl0oaHR0cHM6Ly9vcGVuYXBpLnRhbm5hLmRldi9nby92YWxpZGF0b3IvKSwgb3IgY3JhZnQgeW91ciBvd24uCgojIyMgU3VwcG9ydGVkIFNlcnZlcnMKClJpZ2h0IG5vdywgd2Ugc3VwcG9ydCB0aGUgZm9sbG93aW5nIHNlcnZlcnMsIGFuZCBhcmUgc3VwcG9ydGl2ZSBvZiBhZGRpbmcgbmV3IHNlcnZlcnMsIHRvbyEKCjx0YWJsZT4KCjx0cj4KPHRoPgpTZXJ2ZXIKPC90aD4KPHRoPgo8Y29kZT5nZW5lcmF0ZTwvY29kZT4gZmxhZyB0byBlbmFibGUgY29kZSBnZW5lcmF0aW9uCjwvdGg+Cjx0aD4KRXhhbXBsZSB1c2FnZQo8L3RoPgo8L3RyPgoKPHRyPgo8dGQ+CgpbQ2hpXShodHRwczovL2dpdGh1Yi5jb20vZ28tY2hpL2NoaSkKCjwvdGQ+Cjx0ZD4KPGNvZGU+Y2hpLXNlcnZlcjwvY29kZT4KPC90ZD4KPHRkPgoKCkZvciBhIENoaSBzZXJ2ZXIsIHlvdSB3aWxsIHdhbnQgYSBjb25maWd1cmF0aW9uIGZpbGUgc3VjaCBhczoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogLi4uCnBhY2thZ2U6IGFwaQpnZW5lcmF0ZToKICBjaGktc2VydmVyOiB0cnVlCiAgbW9kZWxzOiB0cnVlCm91dHB1dDogZ2VuLmdvCmBgYAoKVG8gaW1wbGVtZW50IHRoaXMsIGNoZWNrIG91dCBbdGhlIENoaSBkb2NzXSgjaW1wbC1jaGkpLgoKPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKW0VjaG9dKGh0dHBzOi8vZ2l0aHViLmNvbS9sYWJzdGFjay9lY2hvKQoKPC90ZD4KPHRkPgo8Y29kZT5lY2hvLXNlcnZlcjwvY29kZT4KPC90ZD4KPHRkPgoKRm9yIGFuIEVjaG8gc2VydmVyLCB5b3Ugd2lsbCB3YW50IGEgY29uZmlndXJhdGlvbiBmaWxlIHN1Y2ggYXM6CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6IC4uLgpwYWNrYWdlOiBhcGkKZ2VuZXJhdGU6CiAgZWNoby1zZXJ2ZXI6IHRydWUKICBtb2RlbHM6IHRydWUKb3V0cHV0OiBnZW4uZ28KYGBgCgpUbyBpbXBsZW1lbnQgdGhpcywgY2hlY2sgb3V0IFt0aGUgRWNobyBkb2NzXSgjaW1wbC1lY2hvKS4KCjwvdGQ+CjwvdHI+Cgo8dHI+Cjx0ZD4KCltGaWJlcl0oaHR0cHM6Ly9naXRodWIuY29tL2dvZmliZXIvZmliZXIpCgo8L3RkPgo8dGQ+Cjxjb2RlPmZpYmVyLXNlcnZlcjwvY29kZT4KPC90ZD4KCjx0ZD4KCkZvciBhIEZpYmVyIHNlcnZlciwgeW91IHdpbGwgd2FudCBhIGNvbmZpZ3VyYXRpb24gZmlsZSBzdWNoIGFzOgoKYGBgeWFtbAojIHlhbWwtbGFuZ3VhZ2Utc2VydmVyOiAuLi4KcGFja2FnZTogYXBpCmdlbmVyYXRlOgogIGZpYmVyLXNlcnZlcjogdHJ1ZQogIG1vZGVsczogdHJ1ZQpvdXRwdXQ6IGdlbi5nbwpgYGAKClRvIGltcGxlbWVudCB0aGlzLCBjaGVjayBvdXQgW3RoZSBGaWJlciBkb2NzXSgjaW1wbC1maWJlcikuCgo8L3RkPgo8L3RyPgoKCjx0cj4KPHRkPgoKW0dpbl0oaHR0cHM6Ly9naXRodWIuY29tL2dpbi1nb25pYy9naW4pCgo8L3RkPgo8dGQ+Cjxjb2RlPmdpbi1zZXJ2ZXI8L2NvZGU+CjwvdGQ+Cjx0ZD4KCkZvciBhIEdpbiBzZXJ2ZXIsIHlvdSB3aWxsIHdhbnQgYSBjb25maWd1cmF0aW9uIGZpbGUgc3VjaCBhczoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogLi4uCnBhY2thZ2U6IGFwaQpnZW5lcmF0ZToKICBnaW4tc2VydmVyOiB0cnVlCiAgbW9kZWxzOiB0cnVlCm91dHB1dDogZ2VuLmdvCmBgYAoKVG8gaW1wbGVtZW50IHRoaXMsIGNoZWNrIG91dCBbdGhlIEdpbiBkb2NzXSgjaW1wbC1naW4pLgoKPC90ZD4KCjwvdHI+Cgo8dHI+Cjx0ZD4KCltnb3JpbGxhL211eF0oaHR0cHM6Ly9naXRodWIuY29tL2dvcmlsbGEvbXV4KQoKPC90ZD4KPHRkPgo8Y29kZT5nb3JpbGxhLXNlcnZlcjwvY29kZT4KPC90ZD4KCjx0ZD4KCkZvciBhIGdvcmlsbGEvbXV4IHNlcnZlciwgeW91IHdpbGwgd2FudCBhIGNvbmZpZ3VyYXRpb24gZmlsZSBzdWNoIGFzOgoKYGBgeWFtbAojIHlhbWwtbGFuZ3VhZ2Utc2VydmVyOiAuLi4KcGFja2FnZTogYXBpCmdlbmVyYXRlOgogIGdvcmlsbGEtc2VydmVyOiB0cnVlCiAgbW9kZWxzOiB0cnVlCm91dHB1dDogZ2VuLmdvCmBgYAoKVG8gaW1wbGVtZW50IHRoaXMsIGNoZWNrIG91dCBbdGhlIGdvcmlsbGEvbXV4IGRvY3NdKCNpbXBsLWdvcmlsbGFtdXgpLgoKPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKW0lyaXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9rYXRhcmFzL2lyaXMpCgo8L3RkPgo8dGQ+Cjxjb2RlPmlyaXMtc2VydmVyPC9jb2RlPgo8L3RkPgoKPHRkPgoKRm9yIGEgSXJpcyBzZXJ2ZXIsIHlvdSB3aWxsIHdhbnQgYSBjb25maWd1cmF0aW9uIGZpbGUgc3VjaCBhczoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogLi4uCnBhY2thZ2U6IGFwaQpnZW5lcmF0ZToKICBpcmlzLXNlcnZlcjogdHJ1ZQogIG1vZGVsczogdHJ1ZQpvdXRwdXQ6IGdlbi5nbwpgYGAKClRvIGltcGxlbWVudCB0aGlzLCBjaGVjayBvdXQgW3RoZSBJcmlzIGRvY3NdKCNpbXBsLWlyaXMpLgoKPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKWzEuMjIrIGBuZXQvaHR0cGBdKGh0dHBzOi8vcGtnLmdvLmRldi9uZXQvaHR0cCkKCjwvdGQ+Cjx0ZD4KPGNvZGU+c3RkLWh0dHAtc2VydmVyPC9jb2RlPgo8L3RkPgoKPHRkPgoKVG8gdXNlIHB1cmVseSBgbmV0L2h0dHBgIChmb3IgR28gMS4yMispLCB5b3Ugd2lsbCB3YW50IGEgY29uZmlndXJhdGlvbiBmaWxlIHN1Y2ggYXM6CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6IC4uLgpwYWNrYWdlOiBhcGkKZ2VuZXJhdGU6CiAgc3RkLWh0dHAtc2VydmVyOiB0cnVlCiAgbW9kZWxzOiB0cnVlCm91dHB1dDogZ2VuLmdvCmBgYAoKVG8gaW1wbGVtZW50IHRoaXMsIGNoZWNrIG91dCBbdGhlIEdvIDEuMjIrIGBuZXQvaHR0cGAgZG9jc10oI2ltcGwtc3RkaHR0cCkuCgo8L3RkPgo8L3RyPgoKPC90YWJsZT4KCiMjIyBHbyAxLjIyKyBgbmV0L2h0dHBgCjxhIG5hbWU9ImltcGwtc3RkaHR0cCI+PC9hPgoKQXMgb2YgR28gMS4yMiwgZW5oYW5jZW1lbnRzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSByb3V0aW5nIG9mIHRoZSBgbmV0L2h0dHBgIHBhY2thZ2UgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnksIHdoaWNoIG1ha2VzIGl0IGEgZ3JlYXQgc3RhcnRpbmcgcG9pbnQgZm9yIGltcGxlbWVudGluZyBhIHNlcnZlciB3aXRoLCBiZWZvcmUgbmVlZGluZyB0byByZWFjaCBmb3IgYW5vdGhlciByb3V0ZXIgb3IgYSBmdWxsIGZyYW1ld29yay4KCkZvciBpbnN0YW5jZSwgbGV0J3MgdGFrZSB0aGlzIHN0cmFpZ2h0Zm9yd2FyZCBzcGVjaWZpY2F0aW9uOgoKYGBgeWFtbApvcGVuYXBpOiAiMy4wLjAiCmluZm86CiAgdmVyc2lvbjogMS4wLjAKICB0aXRsZTogTWluaW1hbCBwaW5nIEFQSSBzZXJ2ZXIKcGF0aHM6CiAgL3Bpbmc6CiAgICBnZXQ6CiAgICAgIHJlc3BvbnNlczoKICAgICAgICAnMjAwJzoKICAgICAgICAgIGRlc2NyaXB0aW9uOiBwZXQgcmVzcG9uc2UKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL1BvbmcnCmNvbXBvbmVudHM6CiAgc2NoZW1hczoKICAgICMgYmFzZSB0eXBlcwogICAgUG9uZzoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gcGluZwogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIHBpbmc6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgICAgIGV4YW1wbGU6IHBvbmcKYGBgCgpUaGlzIHRoZW4gZ2VuZXJhdGVzIGNvZGUgc3VjaCBhczoKCmBgYGdvCi8vIFBvbmcgZGVmaW5lcyBtb2RlbCBmb3IgUG9uZy4KdHlwZSBQb25nIHN0cnVjdCB7CglQaW5nIHN0cmluZyBganNvbjoicGluZyJgCn0KCi8vIFNlcnZlckludGVyZmFjZSByZXByZXNlbnRzIGFsbCBzZXJ2ZXIgaGFuZGxlcnMuCnR5cGUgU2VydmVySW50ZXJmYWNlIGludGVyZmFjZSB7CgoJLy8gKEdFVCAvcGluZykKCUdldFBpbmcodyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpCn0KCmZ1bmMgSGFuZGxlckZyb21NdXgoc2kgU2VydmVySW50ZXJmYWNlLCBtIFNlcnZlTXV4KSBodHRwLkhhbmRsZXIgewoJcmV0dXJuIEhhbmRsZXJXaXRoT3B0aW9ucyhzaSwgU3RkSFRUUFNlcnZlck9wdGlvbnN7CgkJQmFzZVJvdXRlcjogbSwKCX0pCn0KCi8vIEhhbmRsZXJXaXRoT3B0aW9ucyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucwpmdW5jIEhhbmRsZXJXaXRoT3B0aW9ucyhzaSBTZXJ2ZXJJbnRlcmZhY2UsIG9wdGlvbnMgU3RkSFRUUFNlcnZlck9wdGlvbnMpIGh0dHAuSGFuZGxlciB7CgltIDo9IG9wdGlvbnMuQmFzZVJvdXRlcgoKCS8vIC4uLiBvbWl0dGVkIGZvciBicmV2aXR5CgoJbS5IYW5kbGVGdW5jKCJHRVQgIitvcHRpb25zLkJhc2VVUkwrIi9waW5nIiwgd3JhcHBlci5HZXRQaW5nKQoKCXJldHVybiBtCn0KYGBgCgpUbyBpbXBsZW1lbnQgdGhpcyBIVFRQIHNlcnZlciwgd2UgbmVlZCB0byB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4gb3VyIFtgYXBpL2ltcGwuZ29gXShleGFtcGxlcy9taW5pbWFsLXNlcnZlci9zdGRodHRwL2FwaS9pbXBsLmdvKToKCmBgYGdvCmltcG9ydCAoCgkiZW5jb2RpbmcvanNvbiIKCSJuZXQvaHR0cCIKKQoKLy8gb3B0aW9uYWwgY29kZSBvbWl0dGVkCgp0eXBlIFNlcnZlciBzdHJ1Y3R7fQoKZnVuYyBOZXdTZXJ2ZXIoKSBTZXJ2ZXIgewoJcmV0dXJuIFNlcnZlcnt9Cn0KCi8vIChHRVQgL3BpbmcpCmZ1bmMgKFNlcnZlcikgR2V0UGluZyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgewoJcmVzcCA6PSBQb25newoJCVBpbmc6ICJwb25nIiwKCX0KCgl3LldyaXRlSGVhZGVyKGh0dHAuU3RhdHVzT0spCglfID0ganNvbi5OZXdFbmNvZGVyKHcpLkVuY29kZShyZXNwKQp9CmBgYAoKTm93IHdlJ3ZlIGdvdCBvdXIgaW1wbGVtZW50YXRpb24sIHdlIGNhbiB0aGVuIHdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZSB0byB3aXJlIGl0IHVwIGFuZCBnZXQgYSBydW5uaW5nIHNlcnZlcjoKCmBgYGdvCmltcG9ydCAoCgkibG9nIgoJIm5ldC9odHRwIgoKCSJnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvZXhhbXBsZXMvbWluaW1hbC1zZXJ2ZXIvc3RkaHR0cC9hcGkiCikKCmZ1bmMgbWFpbigpIHsKCS8vIGNyZWF0ZSBhIHR5cGUgdGhhdCBzYXRpc2ZpZXMgdGhlIGBhcGkuU2VydmVySW50ZXJmYWNlYCwgd2hpY2ggY29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gb2YgZXZlcnkgb3BlcmF0aW9uIGZyb20gdGhlIGdlbmVyYXRlZCBjb2RlCglzZXJ2ZXIgOj0gYXBpLk5ld1NlcnZlcigpCgoJciA6PSBodHRwLk5ld1NlcnZlTXV4KCkKCgkvLyBnZXQgYW4gYGh0dHAuSGFuZGxlcmAgdGhhdCB3ZSBjYW4gdXNlCgloIDo9IGFwaS5IYW5kbGVyRnJvbU11eChzZXJ2ZXIsIHIpCgoJcyA6PSAmaHR0cC5TZXJ2ZXJ7CgkJSGFuZGxlcjogaCwKCQlBZGRyOiAgICAiMC4wLjAuMDo4MDgwIiwKCX0KCgkvLyBBbmQgd2Ugc2VydmUgSFRUUCB1bnRpbCB0aGUgd29ybGQgZW5kcy4KCWxvZy5GYXRhbChzLkxpc3RlbkFuZFNlcnZlKCkpCn0KYGBgCgo+IFshTk9URV0KPiBUaGlzIGRvZXNuJ3QgaW5jbHVkZSBbdmFsaWRhdGlvbiBvZiBpbmNvbWluZyByZXF1ZXN0c10oI3JlcXVlc3RyZXNwb25zZS12YWxpZGF0aW9uLW1pZGRsZXdhcmUpLgoKPiBbIU5PVEVdCj4gSWYgeW91IGZlZWwgbGlrZSB5b3UndmUgZG9uZSBldmVyeXRoaW5nIHJpZ2h0LCBidXQgYXJlIHN0aWxsIHJlY2VpdmluZyBgNDA0IHBhZ2Ugbm90IGZvdW5kYCBlcnJvcnMsIG1ha2Ugc3VyZSB0aGF0IHlvdSd2ZSBnb3QgdGhlIGBnb2AgZGlyZWN0aXZlIGluIHlvdXIgYGdvLm1vZGAgdXBkYXRlZCB0bzoKCmBgYGdvLm1vZApnbyAxLjIyCmBgYAoKPC9kZXRhaWxzPgoKIyMjIENoaQo8YSBuYW1lPSJpbXBsLWNoaSI+PC9hPgoKRm9yIGluc3RhbmNlLCBsZXQncyB0YWtlIHRoaXMgc3RyYWlnaHRmb3J3YXJkIHNwZWNpZmljYXRpb246CgpgYGB5YW1sCm9wZW5hcGk6ICIzLjAuMCIKaW5mbzoKICB2ZXJzaW9uOiAxLjAuMAogIHRpdGxlOiBNaW5pbWFsIHBpbmcgQVBJIHNlcnZlcgpwYXRoczoKICAvcGluZzoKICAgIGdldDoKICAgICAgcmVzcG9uc2VzOgogICAgICAgICcyMDAnOgogICAgICAgICAgZGVzY3JpcHRpb246IHBldCByZXNwb25zZQogICAgICAgICAgY29udGVudDoKICAgICAgICAgICAgYXBwbGljYXRpb24vanNvbjoKICAgICAgICAgICAgICBzY2hlbWE6CiAgICAgICAgICAgICAgICAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvUG9uZycKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgIyBiYXNlIHR5cGVzCiAgICBQb25nOgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBwaW5nCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgcGluZzoKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgZXhhbXBsZTogcG9uZwpgYGAKClRoaXMgdGhlbiBnZW5lcmF0ZXMgY29kZSBzdWNoIGFzOgoKYGBgZ28KLy8gUG9uZyBkZWZpbmVzIG1vZGVsIGZvciBQb25nLgp0eXBlIFBvbmcgc3RydWN0IHsKCVBpbmcgc3RyaW5nIGBqc29uOiJwaW5nImAKfQoKLy8gU2VydmVySW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIHNlcnZlciBoYW5kbGVycy4KdHlwZSBTZXJ2ZXJJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCgkvLyAoR0VUIC9waW5nKQoJR2V0UGluZyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkKfQoKLy8gSGFuZGxlckZyb21NdXggY3JlYXRlcyBodHRwLkhhbmRsZXIgd2l0aCByb3V0aW5nIG1hdGNoaW5nIE9wZW5BUEkgc3BlYyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgbXV4LgpmdW5jIEhhbmRsZXJGcm9tTXV4KHNpIFNlcnZlckludGVyZmFjZSwgciAqbXV4LlJvdXRlcikgaHR0cC5IYW5kbGVyIHsKCXJldHVybiBIYW5kbGVyV2l0aE9wdGlvbnMoc2ksIENoaVNlcnZlck9wdGlvbnN7CgkJQmFzZVJvdXRlcjogciwKCX0pCn0KCi8vIEhhbmRsZXJXaXRoT3B0aW9ucyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucwpmdW5jIEhhbmRsZXJXaXRoT3B0aW9ucyhzaSBTZXJ2ZXJJbnRlcmZhY2UsIG9wdGlvbnMgQ2hpU2VydmVyT3B0aW9ucykgaHR0cC5IYW5kbGVyIHsKCXIgOj0gb3B0aW9ucy5CYXNlUm91dGVyCgoJLy8gLi4uCgoJci5Hcm91cChmdW5jKHIgY2hpLlJvdXRlcikgewoJCXIuR2V0KG9wdGlvbnMuQmFzZVVSTCsiL3BpbmciLCB3cmFwcGVyLkdldFBpbmcpCgl9KQoKCXJldHVybiByCn0KYGBgCgpUbyBpbXBsZW1lbnQgdGhpcyBIVFRQIHNlcnZlciwgd2UgbmVlZCB0byB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4gb3VyIFtgYXBpL2ltcGwuZ29gXShleGFtcGxlcy9taW5pbWFsLXNlcnZlci9jaGkvYXBpL2ltcGwuZ28pOgoKYGBgZ28KaW1wb3J0ICgKCSJlbmNvZGluZy9qc29uIgoJIm5ldC9odHRwIgopCgovLyBvcHRpb25hbCBjb2RlIG9taXR0ZWQKCnR5cGUgU2VydmVyIHN0cnVjdHt9CgpmdW5jIE5ld1NlcnZlcigpIFNlcnZlciB7CglyZXR1cm4gU2VydmVye30KfQoKLy8gKEdFVCAvcGluZykKZnVuYyAoU2VydmVyKSBHZXRQaW5nKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CglyZXNwIDo9IFBvbmd7CgkJUGluZzogInBvbmciLAoJfQoKCXcuV3JpdGVIZWFkZXIoaHR0cC5TdGF0dXNPSykKCV8gPSBqc29uLk5ld0VuY29kZXIodykuRW5jb2RlKHJlc3ApCn0KYGBgCgpOb3cgd2UndmUgZ290IG91ciBpbXBsZW1lbnRhdGlvbiwgd2UgY2FuIHRoZW4gd3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlIHRvIHdpcmUgaXQgdXAgYW5kIGdldCBhIHJ1bm5pbmcgc2VydmVyOgoKYGBgZ28KaW1wb3J0ICgKCSJsb2ciCgkibmV0L2h0dHAiCgoJImdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9leGFtcGxlcy9taW5pbWFsLXNlcnZlci9jaGkvYXBpIgoJImdpdGh1Yi5jb20vZ28tY2hpL2NoaS92NSIKKQoKZnVuYyBtYWluKCkgewoJLy8gY3JlYXRlIGEgdHlwZSB0aGF0IHNhdGlzZmllcyB0aGUgYGFwaS5TZXJ2ZXJJbnRlcmZhY2VgLCB3aGljaCBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBldmVyeSBvcGVyYXRpb24gZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUKCXNlcnZlciA6PSBhcGkuTmV3U2VydmVyKCkKCglyIDo9IGNoaS5OZXdNdXgoKQoKCS8vIGdldCBhbiBgaHR0cC5IYW5kbGVyYCB0aGF0IHdlIGNhbiB1c2UKCWggOj0gYXBpLkhhbmRsZXJGcm9tTXV4KHNlcnZlciwgcikKCglzIDo9ICZodHRwLlNlcnZlcnsKCQlIYW5kbGVyOiBoLAoJCUFkZHI6ICAgICIwLjAuMC4wOjgwODAiLAoJfQoKCS8vIEFuZCB3ZSBzZXJ2ZSBIVFRQIHVudGlsIHRoZSB3b3JsZCBlbmRzLgoJbG9nLkZhdGFsKHMuTGlzdGVuQW5kU2VydmUoKSkKfQpgYGAKCj4gWyFOT1RFXQo+IFRoaXMgZG9lc24ndCBpbmNsdWRlIFt2YWxpZGF0aW9uIG9mIGluY29taW5nIHJlcXVlc3RzXSgjcmVxdWVzdHJlc3BvbnNlLXZhbGlkYXRpb24tbWlkZGxld2FyZSkuCgojIyMgZ29yaWxsYS9tdXgKPGEgbmFtZT0iaW1wbC1nb3JpbGxhbXV4Ij48L2E+CgpGb3IgaW5zdGFuY2UsIGxldCdzIHRha2UgdGhpcyBzdHJhaWdodGZvcndhcmQgc3BlY2lmaWNhdGlvbjoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IE1pbmltYWwgcGluZyBBUEkgc2VydmVyCnBhdGhzOgogIC9waW5nOgogICAgZ2V0OgogICAgICByZXNwb25zZXM6CiAgICAgICAgJzIwMCc6CiAgICAgICAgICBkZXNjcmlwdGlvbjogcGV0IHJlc3BvbnNlCiAgICAgICAgICBjb250ZW50OgogICAgICAgICAgICBhcHBsaWNhdGlvbi9qc29uOgogICAgICAgICAgICAgIHNjaGVtYToKICAgICAgICAgICAgICAgICRyZWY6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9Qb25nJwpjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICAjIGJhc2UgdHlwZXMKICAgIFBvbmc6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIHBpbmcKICAgICAgcHJvcGVydGllczoKICAgICAgICBwaW5nOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBleGFtcGxlOiBwb25nCmBgYAoKVGhpcyB0aGVuIGdlbmVyYXRlcyBjb2RlIHN1Y2ggYXM6CgpgYGBnbwovLyBQb25nIGRlZmluZXMgbW9kZWwgZm9yIFBvbmcuCnR5cGUgUG9uZyBzdHJ1Y3QgewoJUGluZyBzdHJpbmcgYGpzb246InBpbmciYAp9CgovLyBTZXJ2ZXJJbnRlcmZhY2UgcmVwcmVzZW50cyBhbGwgc2VydmVyIGhhbmRsZXJzLgp0eXBlIFNlcnZlckludGVyZmFjZSBpbnRlcmZhY2UgewoKCS8vIChHRVQgL3BpbmcpCglHZXRQaW5nKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KQp9CgovLyBIYW5kbGVyRnJvbU11eCBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIHJvdXRpbmcgbWF0Y2hpbmcgT3BlbkFQSSBzcGVjIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBtdXguCmZ1bmMgSGFuZGxlckZyb21NdXgoc2kgU2VydmVySW50ZXJmYWNlLCByICptdXguUm91dGVyKSBodHRwLkhhbmRsZXIgewoJcmV0dXJuIEhhbmRsZXJXaXRoT3B0aW9ucyhzaSwgR29yaWxsYVNlcnZlck9wdGlvbnN7CgkJQmFzZVJvdXRlcjogciwKCX0pCn0KCi8vIEhhbmRsZXJXaXRoT3B0aW9ucyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucwpmdW5jIEhhbmRsZXJXaXRoT3B0aW9ucyhzaSBTZXJ2ZXJJbnRlcmZhY2UsIG9wdGlvbnMgR29yaWxsYVNlcnZlck9wdGlvbnMpIGh0dHAuSGFuZGxlciB7CglyIDo9IG9wdGlvbnMuQmFzZVJvdXRlcgoKCS8vIC4uLgoKCXIuSGFuZGxlRnVuYyhvcHRpb25zLkJhc2VVUkwrIi9waW5nIiwgd3JhcHBlci5HZXRQaW5nKS5NZXRob2RzKCJHRVQiKQoKCXJldHVybiByCn0KYGBgCgpUbyBpbXBsZW1lbnQgdGhpcyBIVFRQIHNlcnZlciwgd2UgbmVlZCB0byB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4gb3VyIFtgYXBpL2ltcGwuZ29gXShleGFtcGxlcy9taW5pbWFsLXNlcnZlci9nb3JpbGxhbXV4L2FwaS9pbXBsLmdvKToKCmBgYGdvCmltcG9ydCAoCgkiZW5jb2RpbmcvanNvbiIKCSJuZXQvaHR0cCIKKQoKLy8gb3B0aW9uYWwgY29kZSBvbWl0dGVkCgp0eXBlIFNlcnZlciBzdHJ1Y3R7fQoKZnVuYyBOZXdTZXJ2ZXIoKSBTZXJ2ZXIgewoJcmV0dXJuIFNlcnZlcnt9Cn0KCi8vIChHRVQgL3BpbmcpCmZ1bmMgKFNlcnZlcikgR2V0UGluZyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgewoJcmVzcCA6PSBQb25newoJCVBpbmc6ICJwb25nIiwKCX0KCgl3LldyaXRlSGVhZGVyKGh0dHAuU3RhdHVzT0spCglfID0ganNvbi5OZXdFbmNvZGVyKHcpLkVuY29kZShyZXNwKQp9CmBgYAoKTm93IHdlJ3ZlIGdvdCBvdXIgaW1wbGVtZW50YXRpb24sIHdlIGNhbiB0aGVuIHdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZSB0byB3aXJlIGl0IHVwIGFuZCBnZXQgYSBydW5uaW5nIHNlcnZlcjoKCmBgYGdvCmltcG9ydCAoCgkibG9nIgoJIm5ldC9odHRwIgoKCSJnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvZXhhbXBsZXMvbWluaW1hbC1zZXJ2ZXIvZ29yaWxsYW11eC9hcGkiCgkiZ2l0aHViLmNvbS9nb3JpbGxhL211eCIKKQoKZnVuYyBtYWluKCkgewoJLy8gY3JlYXRlIGEgdHlwZSB0aGF0IHNhdGlzZmllcyB0aGUgYGFwaS5TZXJ2ZXJJbnRlcmZhY2VgLCB3aGljaCBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBldmVyeSBvcGVyYXRpb24gZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUKCXNlcnZlciA6PSBhcGkuTmV3U2VydmVyKCkKCglyIDo9IG11eC5OZXdSb3V0ZXIoKQoKCS8vIGdldCBhbiBgaHR0cC5IYW5kbGVyYCB0aGF0IHdlIGNhbiB1c2UKCWggOj0gYXBpLkhhbmRsZXJGcm9tTXV4KHNlcnZlciwgcikKCglzIDo9ICZodHRwLlNlcnZlcnsKCQlIYW5kbGVyOiBoLAoJCUFkZHI6ICAgICIwLjAuMC4wOjgwODAiLAoJfQoKCS8vIEFuZCB3ZSBzZXJ2ZSBIVFRQIHVudGlsIHRoZSB3b3JsZCBlbmRzLgoJbG9nLkZhdGFsKHMuTGlzdGVuQW5kU2VydmUoKSkKfQpgYGAKCj4gWyFOT1RFXQo+IFRoaXMgZG9lc24ndCBpbmNsdWRlIFt2YWxpZGF0aW9uIG9mIGluY29taW5nIHJlcXVlc3RzXSgjcmVxdWVzdHJlc3BvbnNlLXZhbGlkYXRpb24tbWlkZGxld2FyZSkuCgojIyMgRWNobyBzZXJ2ZXIKPGEgbmFtZT0iaW1wbC1lY2hvIj48L2E+CgpGb3IgaW5zdGFuY2UsIGxldCdzIHRha2UgdGhpcyBzdHJhaWdodGZvcndhcmQgc3BlY2lmaWNhdGlvbjoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IE1pbmltYWwgcGluZyBBUEkgc2VydmVyCnBhdGhzOgogIC9waW5nOgogICAgZ2V0OgogICAgICByZXNwb25zZXM6CiAgICAgICAgJzIwMCc6CiAgICAgICAgICBkZXNjcmlwdGlvbjogcGV0IHJlc3BvbnNlCiAgICAgICAgICBjb250ZW50OgogICAgICAgICAgICBhcHBsaWNhdGlvbi9qc29uOgogICAgICAgICAgICAgIHNjaGVtYToKICAgICAgICAgICAgICAgICRyZWY6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9Qb25nJwpjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICAjIGJhc2UgdHlwZXMKICAgIFBvbmc6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIHBpbmcKICAgICAgcHJvcGVydGllczoKICAgICAgICBwaW5nOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBleGFtcGxlOiBwb25nCmBgYAoKVGhpcyB0aGVuIGdlbmVyYXRlcyBjb2RlIHN1Y2ggYXM6CgpgYGBnbwovLyBQb25nIGRlZmluZXMgbW9kZWwgZm9yIFBvbmcuCnR5cGUgUG9uZyBzdHJ1Y3QgewoJUGluZyBzdHJpbmcgYGpzb246InBpbmciYAp9CgovLyBTZXJ2ZXJJbnRlcmZhY2UgcmVwcmVzZW50cyBhbGwgc2VydmVyIGhhbmRsZXJzLgp0eXBlIFNlcnZlckludGVyZmFjZSBpbnRlcmZhY2UgewoKCS8vIChHRVQgL3BpbmcpCglHZXRQaW5nKGN0eCBlY2hvLkNvbnRleHQpIGVycm9yCn0KCi8vIFRoaXMgaXMgYSBzaW1wbGUgaW50ZXJmYWNlIHdoaWNoIHNwZWNpZmllcyBlY2hvLlJvdXRlIGFkZGl0aW9uIGZ1bmN0aW9ucyB3aGljaAovLyBhcmUgcHJlc2VudCBvbiBib3RoIGVjaG8uRWNobyBhbmQgZWNoby5Hcm91cCwgc2luY2Ugd2Ugd2FudCB0byBhbGxvdyB1c2luZwovLyBlaXRoZXIgb2YgdGhlbSBmb3IgcGF0aCByZWdpc3RyYXRpb24KdHlwZSBFY2hvUm91dGVyIGludGVyZmFjZSB7CgkvLyAuLi4KCUdFVChwYXRoIHN0cmluZywgaCBlY2hvLkhhbmRsZXJGdW5jLCBtIC4uLmVjaG8uTWlkZGxld2FyZUZ1bmMpICplY2hvLlJvdXRlCgkvLyAuLi4KfQoKLy8gUmVnaXN0ZXJIYW5kbGVycyBhZGRzIGVhY2ggc2VydmVyIHJvdXRlIHRvIHRoZSBFY2hvUm91dGVyLgpmdW5jIFJlZ2lzdGVySGFuZGxlcnMocm91dGVyIEVjaG9Sb3V0ZXIsIHNpIFNlcnZlckludGVyZmFjZSkgewoJUmVnaXN0ZXJIYW5kbGVyc1dpdGhCYXNlVVJMKHJvdXRlciwgc2ksICIiKQp9CgovLyBSZWdpc3RlcnMgaGFuZGxlcnMsIGFuZCBwcmVwZW5kcyBCYXNlVVJMIHRvIHRoZSBwYXRocywgc28gdGhhdCB0aGUgcGF0aHMKLy8gY2FuIGJlIHNlcnZlZCB1bmRlciBhIHByZWZpeC4KZnVuYyBSZWdpc3RlckhhbmRsZXJzV2l0aEJhc2VVUkwocm91dGVyIEVjaG9Sb3V0ZXIsIHNpIFNlcnZlckludGVyZmFjZSwgYmFzZVVSTCBzdHJpbmcpIHsKCS8vIC4uLgoKCXJvdXRlci5HRVQoYmFzZVVSTCsiL3BpbmciLCB3cmFwcGVyLkdldFBpbmcpCgp9CmBgYAoKVG8gaW1wbGVtZW50IHRoaXMgSFRUUCBzZXJ2ZXIsIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlIGluIG91ciBbYGFwaS9pbXBsLmdvYF0oZXhhbXBsZXMvbWluaW1hbC1zZXJ2ZXIvZWNoby9hcGkvaW1wbC5nbyk6CgpgYGBnbwppbXBvcnQgKAoJIm5ldC9odHRwIgoKCSJnaXRodWIuY29tL2xhYnN0YWNrL2VjaG8vdjQiCikKCi8vIG9wdGlvbmFsIGNvZGUgb21pdHRlZAoKdHlwZSBTZXJ2ZXIgc3RydWN0e30KCmZ1bmMgTmV3U2VydmVyKCkgU2VydmVyIHsKCXJldHVybiBTZXJ2ZXJ7fQp9CgovLyAoR0VUIC9waW5nKQpmdW5jIChTZXJ2ZXIpIEdldFBpbmcoY3R4IGVjaG8uQ29udGV4dCkgZXJyb3IgewoJcmVzcCA6PSBQb25newoJCVBpbmc6ICJwb25nIiwKCX0KCglyZXR1cm4gY3R4LkpTT04oaHR0cC5TdGF0dXNPSywgcmVzcCkKfQpgYGAKCk5vdyB3ZSd2ZSBnb3Qgb3VyIGltcGxlbWVudGF0aW9uLCB3ZSBjYW4gdGhlbiB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgdG8gd2lyZSBpdCB1cCBhbmQgZ2V0IGEgcnVubmluZyBzZXJ2ZXI6CgpgYGBnbwppbXBvcnQgKAoJImxvZyIKCgkiZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyL2V4YW1wbGVzL21pbmltYWwtc2VydmVyL2VjaG8vYXBpIgoJImdpdGh1Yi5jb20vbGFic3RhY2svZWNoby92NCIKKQoKZnVuYyBtYWluKCkgewoJLy8gY3JlYXRlIGEgdHlwZSB0aGF0IHNhdGlzZmllcyB0aGUgYGFwaS5TZXJ2ZXJJbnRlcmZhY2VgLCB3aGljaCBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBldmVyeSBvcGVyYXRpb24gZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUKCXNlcnZlciA6PSBhcGkuTmV3U2VydmVyKCkKCgllIDo9IGVjaG8uTmV3KCkKCglhcGkuUmVnaXN0ZXJIYW5kbGVycyhlLCBzZXJ2ZXIpCgoJLy8gQW5kIHdlIHNlcnZlIEhUVFAgdW50aWwgdGhlIHdvcmxkIGVuZHMuCglsb2cuRmF0YWwoZS5TdGFydCgiMC4wLjAuMDo4MDgwIikpCn0KYGBgCgo+IFshTk9URV0KPiBUaGlzIGRvZXNuJ3QgaW5jbHVkZSBbdmFsaWRhdGlvbiBvZiBpbmNvbWluZyByZXF1ZXN0c10oI3JlcXVlc3RyZXNwb25zZS12YWxpZGF0aW9uLW1pZGRsZXdhcmUpLgoKIyMjIEZpYmVyIHNlcnZlcgo8YSBuYW1lPSJpbXBsLWZpYmVyIj48L2E+CgpGb3IgaW5zdGFuY2UsIGxldCdzIHRha2UgdGhpcyBzdHJhaWdodGZvcndhcmQgc3BlY2lmaWNhdGlvbjoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IE1pbmltYWwgcGluZyBBUEkgc2VydmVyCnBhdGhzOgogIC9waW5nOgogICAgZ2V0OgogICAgICByZXNwb25zZXM6CiAgICAgICAgJzIwMCc6CiAgICAgICAgICBkZXNjcmlwdGlvbjogcGV0IHJlc3BvbnNlCiAgICAgICAgICBjb250ZW50OgogICAgICAgICAgICBhcHBsaWNhdGlvbi9qc29uOgogICAgICAgICAgICAgIHNjaGVtYToKICAgICAgICAgICAgICAgICRyZWY6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9Qb25nJwpjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICAjIGJhc2UgdHlwZXMKICAgIFBvbmc6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIHBpbmcKICAgICAgcHJvcGVydGllczoKICAgICAgICBwaW5nOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBleGFtcGxlOiBwb25nCmBgYAoKVGhpcyB0aGVuIGdlbmVyYXRlcyBjb2RlIHN1Y2ggYXM6CgpgYGBnbwovLyBQb25nIGRlZmluZXMgbW9kZWwgZm9yIFBvbmcuCnR5cGUgUG9uZyBzdHJ1Y3QgewoJUGluZyBzdHJpbmcgYGpzb246InBpbmciYAp9CgovLyBTZXJ2ZXJJbnRlcmZhY2UgcmVwcmVzZW50cyBhbGwgc2VydmVyIGhhbmRsZXJzLgp0eXBlIFNlcnZlckludGVyZmFjZSBpbnRlcmZhY2UgewoKCS8vIChHRVQgL3BpbmcpCglHZXRQaW5nKGMgKmZpYmVyLkN0eCkgZXJyb3IKfQoKLy8gUmVnaXN0ZXJIYW5kbGVycyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIHJvdXRpbmcgbWF0Y2hpbmcgT3BlbkFQSSBzcGVjLgpmdW5jIFJlZ2lzdGVySGFuZGxlcnMocm91dGVyIGZpYmVyLlJvdXRlciwgc2kgU2VydmVySW50ZXJmYWNlKSB7CglSZWdpc3RlckhhbmRsZXJzV2l0aE9wdGlvbnMocm91dGVyLCBzaSwgRmliZXJTZXJ2ZXJPcHRpb25ze30pCn0KCi8vIFJlZ2lzdGVySGFuZGxlcnNXaXRoT3B0aW9ucyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucwpmdW5jIFJlZ2lzdGVySGFuZGxlcnNXaXRoT3B0aW9ucyhyb3V0ZXIgZmliZXIuUm91dGVyLCBzaSBTZXJ2ZXJJbnRlcmZhY2UsIG9wdGlvbnMgRmliZXJTZXJ2ZXJPcHRpb25zKSB7CgkvLyAuLi4KCglyb3V0ZXIuR2V0KG9wdGlvbnMuQmFzZVVSTCsiL3BpbmciLCB3cmFwcGVyLkdldFBpbmcpCn0KYGBgCgpUbyBpbXBsZW1lbnQgdGhpcyBIVFRQIHNlcnZlciwgd2UgbmVlZCB0byB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4gb3VyIFtgYXBpL2ltcGwuZ29gXShleGFtcGxlcy9taW5pbWFsLXNlcnZlci9maWJlci9hcGkvaW1wbC5nbyk6CgpgYGBnbwppbXBvcnQgKAoJIm5ldC9odHRwIgoKCSJnaXRodWIuY29tL2dvZmliZXIvZmliZXIvdjIiCikKCi8vIGVuc3VyZSB0aGF0IHdlJ3ZlIGNvbmZvcm1lZCB0byB0aGUgYFNlcnZlckludGVyZmFjZWAgd2l0aCBhIGNvbXBpbGUtdGltZSBjaGVjawp2YXIgXyBTZXJ2ZXJJbnRlcmZhY2UgPSAoKlNlcnZlcikobmlsKQoKdHlwZSBTZXJ2ZXIgc3RydWN0e30KCmZ1bmMgTmV3U2VydmVyKCkgU2VydmVyIHsKCXJldHVybiBTZXJ2ZXJ7fQp9CgovLyAoR0VUIC9waW5nKQpmdW5jIChTZXJ2ZXIpIEdldFBpbmcoY3R4ICpmaWJlci5DdHgpIGVycm9yIHsKCXJlc3AgOj0gUG9uZ3sKCQlQaW5nOiAicG9uZyIsCgl9CgoJcmV0dXJuIGN0eC4KCQlTdGF0dXMoaHR0cC5TdGF0dXNPSykuCgkJSlNPTihyZXNwKQp9CmBgYAoKTm93IHdlJ3ZlIGdvdCBvdXIgaW1wbGVtZW50YXRpb24sIHdlIGNhbiB0aGVuIHdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZSB0byB3aXJlIGl0IHVwIGFuZCBnZXQgYSBydW5uaW5nIHNlcnZlcjoKCmBgYGdvCmltcG9ydCAoCgkibG9nIgoKCSJnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvZXhhbXBsZXMvbWluaW1hbC1zZXJ2ZXIvZmliZXIvYXBpIgoJImdpdGh1Yi5jb20vZ29maWJlci9maWJlci92MiIKKQoKZnVuYyBtYWluKCkgewoJLy8gY3JlYXRlIGEgdHlwZSB0aGF0IHNhdGlzZmllcyB0aGUgYGFwaS5TZXJ2ZXJJbnRlcmZhY2VgLCB3aGljaCBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBldmVyeSBvcGVyYXRpb24gZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUKCXNlcnZlciA6PSBhcGkuTmV3U2VydmVyKCkKCglhcHAgOj0gZmliZXIuTmV3KCkKCglhcGkuUmVnaXN0ZXJIYW5kbGVycyhhcHAsIHNlcnZlcikKCgkvLyBBbmQgd2Ugc2VydmUgSFRUUCB1bnRpbCB0aGUgd29ybGQgZW5kcy4KCWxvZy5GYXRhbChhcHAuTGlzdGVuKCIwLjAuMC4wOjgwODAiKSkKfQpgYGAKCj4gWyFOT1RFXQo+IFRoaXMgZG9lc24ndCBpbmNsdWRlIFt2YWxpZGF0aW9uIG9mIGluY29taW5nIHJlcXVlc3RzXSgjcmVxdWVzdHJlc3BvbnNlLXZhbGlkYXRpb24tbWlkZGxld2FyZSkuCgojIyMgR2luIHNlcnZlcgo8YSBuYW1lPSJpbXBsLWdpbiI+PC9hPgoKRm9yIGluc3RhbmNlLCBsZXQncyB0YWtlIHRoaXMgc3RyYWlnaHRmb3J3YXJkIHNwZWNpZmljYXRpb246CgpgYGB5YW1sCm9wZW5hcGk6ICIzLjAuMCIKaW5mbzoKICB2ZXJzaW9uOiAxLjAuMAogIHRpdGxlOiBNaW5pbWFsIHBpbmcgQVBJIHNlcnZlcgpwYXRoczoKICAvcGluZzoKICAgIGdldDoKICAgICAgcmVzcG9uc2VzOgogICAgICAgICcyMDAnOgogICAgICAgICAgZGVzY3JpcHRpb246IHBldCByZXNwb25zZQogICAgICAgICAgY29udGVudDoKICAgICAgICAgICAgYXBwbGljYXRpb24vanNvbjoKICAgICAgICAgICAgICBzY2hlbWE6CiAgICAgICAgICAgICAgICAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvUG9uZycKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgIyBiYXNlIHR5cGVzCiAgICBQb25nOgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBwaW5nCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgcGluZzoKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgZXhhbXBsZTogcG9uZwpgYGAKClRoaXMgdGhlbiBnZW5lcmF0ZXMgY29kZSBzdWNoIGFzOgoKYGBgZ28KLy8gUG9uZyBkZWZpbmVzIG1vZGVsIGZvciBQb25nLgp0eXBlIFBvbmcgc3RydWN0IHsKCVBpbmcgc3RyaW5nIGBqc29uOiJwaW5nImAKfQoKLy8gU2VydmVySW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIHNlcnZlciBoYW5kbGVycy4KdHlwZSBTZXJ2ZXJJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCgkvLyAoR0VUIC9waW5nKQoJR2V0UGluZyhjICpnaW4uQ29udGV4dCkKfQoKLy8gUmVnaXN0ZXJIYW5kbGVycyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIHJvdXRpbmcgbWF0Y2hpbmcgT3BlbkFQSSBzcGVjLgpmdW5jIFJlZ2lzdGVySGFuZGxlcnMocm91dGVyIGdpbi5JUm91dGVyLCBzaSBTZXJ2ZXJJbnRlcmZhY2UpIHsKCVJlZ2lzdGVySGFuZGxlcnNXaXRoT3B0aW9ucyhyb3V0ZXIsIHNpLCBHaW5TZXJ2ZXJPcHRpb25ze30pCn0KCi8vIFJlZ2lzdGVySGFuZGxlcnNXaXRoT3B0aW9ucyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucwpmdW5jIFJlZ2lzdGVySGFuZGxlcnNXaXRoT3B0aW9ucyhyb3V0ZXIgZ2luLklSb3V0ZXIsIHNpIFNlcnZlckludGVyZmFjZSwgb3B0aW9ucyBHaW5TZXJ2ZXJPcHRpb25zKSB7CgkvLyAuLi4KCglyb3V0ZXIuR0VUKG9wdGlvbnMuQmFzZVVSTCsiL3BpbmciLCB3cmFwcGVyLkdldFBpbmcpCn0KYGBgCgpUbyBpbXBsZW1lbnQgdGhpcyBIVFRQIHNlcnZlciwgd2UgbmVlZCB0byB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4gb3VyIFtgYXBpL2ltcGwuZ29gXShleGFtcGxlcy9taW5pbWFsLXNlcnZlci9nb3JpbGxhbXV4L2FwaS9pbXBsLmdvKToKCmBgYGdvCmltcG9ydCAoCgkibmV0L2h0dHAiCgoJImdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbiIKKQoKLy8gb3B0aW9uYWwgY29kZSBvbWl0dGVkCgp0eXBlIFNlcnZlciBzdHJ1Y3R7fQoKZnVuYyBOZXdTZXJ2ZXIoKSBTZXJ2ZXIgewoJcmV0dXJuIFNlcnZlcnt9Cn0KCi8vIChHRVQgL3BpbmcpCmZ1bmMgKFNlcnZlcikgR2V0UGluZyhjdHggKmdpbi5Db250ZXh0KSB7CglyZXNwIDo9IFBvbmd7CgkJUGluZzogInBvbmciLAoJfQoKCWN0eC5KU09OKGh0dHAuU3RhdHVzT0ssIHJlc3ApCn0KYGBgCgpOb3cgd2UndmUgZ290IG91ciBpbXBsZW1lbnRhdGlvbiwgd2UgY2FuIHRoZW4gd3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlIHRvIHdpcmUgaXQgdXAgYW5kIGdldCBhIHJ1bm5pbmcgc2VydmVyOgoKYGBgZ28KaW1wb3J0ICgKCSJsb2ciCgkibmV0L2h0dHAiCgoJImdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9leGFtcGxlcy9taW5pbWFsLXNlcnZlci9naW4vYXBpIgoJImdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbiIKKQoKZnVuYyBtYWluKCkgewoJLy8gY3JlYXRlIGEgdHlwZSB0aGF0IHNhdGlzZmllcyB0aGUgYGFwaS5TZXJ2ZXJJbnRlcmZhY2VgLCB3aGljaCBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBldmVyeSBvcGVyYXRpb24gZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUKCXNlcnZlciA6PSBhcGkuTmV3U2VydmVyKCkKCglyIDo9IGdpbi5EZWZhdWx0KCkKCglhcGkuUmVnaXN0ZXJIYW5kbGVycyhyLCBzZXJ2ZXIpCgoJLy8gQW5kIHdlIHNlcnZlIEhUVFAgdW50aWwgdGhlIHdvcmxkIGVuZHMuCgoJcyA6PSAmaHR0cC5TZXJ2ZXJ7CgkJSGFuZGxlcjogciwKCQlBZGRyOiAgICAiMC4wLjAuMDo4MDgwIiwKCX0KCgkvLyBBbmQgd2Ugc2VydmUgSFRUUCB1bnRpbCB0aGUgd29ybGQgZW5kcy4KCWxvZy5GYXRhbChzLkxpc3RlbkFuZFNlcnZlKCkpCn0KYGBgCgo+IFshTk9URV0KPiBUaGlzIGRvZXNuJ3QgaW5jbHVkZSBbdmFsaWRhdGlvbiBvZiBpbmNvbWluZyByZXF1ZXN0c10oI3JlcXVlc3RyZXNwb25zZS12YWxpZGF0aW9uLW1pZGRsZXdhcmUpLgoKIyMjIElyaXMgc2VydmVyCjxhIG5hbWU9ImltcGwtaXJpcyI+PC9hPgoKRm9yIGluc3RhbmNlLCBsZXQncyB0YWtlIHRoaXMgc3RyYWlnaHRmb3J3YXJkIHNwZWNpZmljYXRpb246CgpgYGB5YW1sCm9wZW5hcGk6ICIzLjAuMCIKaW5mbzoKICB2ZXJzaW9uOiAxLjAuMAogIHRpdGxlOiBNaW5pbWFsIHBpbmcgQVBJIHNlcnZlcgpwYXRoczoKICAvcGluZzoKICAgIGdldDoKICAgICAgcmVzcG9uc2VzOgogICAgICAgICcyMDAnOgogICAgICAgICAgZGVzY3JpcHRpb246IHBldCByZXNwb25zZQogICAgICAgICAgY29udGVudDoKICAgICAgICAgICAgYXBwbGljYXRpb24vanNvbjoKICAgICAgICAgICAgICBzY2hlbWE6CiAgICAgICAgICAgICAgICAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvUG9uZycKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgIyBiYXNlIHR5cGVzCiAgICBQb25nOgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBwaW5nCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgcGluZzoKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgZXhhbXBsZTogcG9uZwpgYGAKClRoaXMgdGhlbiBnZW5lcmF0ZXMgY29kZSBzdWNoIGFzOgoKYGBgZ28KLy8gUG9uZyBkZWZpbmVzIG1vZGVsIGZvciBQb25nLgp0eXBlIFBvbmcgc3RydWN0IHsKCVBpbmcgc3RyaW5nIGBqc29uOiJwaW5nImAKfQoKLy8gU2VydmVySW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIHNlcnZlciBoYW5kbGVycy4KdHlwZSBTZXJ2ZXJJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCgkvLyAoR0VUIC9waW5nKQoJR2V0UGluZyhjdHggaXJpcy5Db250ZXh0KQp9CgovLyBSZWdpc3RlckhhbmRsZXJzIGNyZWF0ZXMgaHR0cC5IYW5kbGVyIHdpdGggcm91dGluZyBtYXRjaGluZyBPcGVuQVBJIHNwZWMuCmZ1bmMgUmVnaXN0ZXJIYW5kbGVycyhyb3V0ZXIgKmlyaXMuQXBwbGljYXRpb24sIHNpIFNlcnZlckludGVyZmFjZSkgewoJUmVnaXN0ZXJIYW5kbGVyc1dpdGhPcHRpb25zKHJvdXRlciwgc2ksIElyaXNTZXJ2ZXJPcHRpb25ze30pCn0KCi8vIFJlZ2lzdGVySGFuZGxlcnNXaXRoT3B0aW9ucyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucwpmdW5jIFJlZ2lzdGVySGFuZGxlcnNXaXRoT3B0aW9ucyhyb3V0ZXIgKmlyaXMuQXBwbGljYXRpb24sIHNpIFNlcnZlckludGVyZmFjZSwgb3B0aW9ucyBJcmlzU2VydmVyT3B0aW9ucykgewoJLy8gLi4uCgoJcm91dGVyLkdldChvcHRpb25zLkJhc2VVUkwrIi9waW5nIiwgd3JhcHBlci5HZXRQaW5nKQoKCXJvdXRlci5CdWlsZCgpCn0KYGBgCgpUbyBpbXBsZW1lbnQgdGhpcyBIVFRQIHNlcnZlciwgd2UgbmVlZCB0byB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4gb3VyIFtgYXBpL2ltcGwuZ29gXShleGFtcGxlcy9taW5pbWFsLXNlcnZlci9nb3JpbGxhbXV4L2FwaS9pbXBsLmdvKToKCmBgYGdvCmltcG9ydCAoCgkibmV0L2h0dHAiCgoJImdpdGh1Yi5jb20va2F0YXJhcy9pcmlzL3YxMiIKKQoKLy8gb3B0aW9uYWwgY29kZSBvbWl0dGVkCgp0eXBlIFNlcnZlciBzdHJ1Y3R7fQoKZnVuYyBOZXdTZXJ2ZXIoKSBTZXJ2ZXIgewoJcmV0dXJuIFNlcnZlcnt9Cn0KCi8vIChHRVQgL3BpbmcpCmZ1bmMgKFNlcnZlcikgR2V0UGluZyhjdHggaXJpcy5Db250ZXh0KSB7CglyZXNwIDo9IFBvbmd7CgkJUGluZzogInBvbmciLAoJfQoKCWN0eC5TdGF0dXNDb2RlKGh0dHAuU3RhdHVzT0spCglfID0gY3R4LkpTT04ocmVzcCkKfQpgYGAKCk5vdyB3ZSd2ZSBnb3Qgb3VyIGltcGxlbWVudGF0aW9uLCB3ZSBjYW4gdGhlbiB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgdG8gd2lyZSBpdCB1cCBhbmQgZ2V0IGEgcnVubmluZyBzZXJ2ZXI6CgpgYGBnbwppbXBvcnQgKAoJImxvZyIKCgkiZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyL2V4YW1wbGVzL21pbmltYWwtc2VydmVyL2lyaXMvYXBpIgoJImdpdGh1Yi5jb20va2F0YXJhcy9pcmlzL3YxMiIKKQoKZnVuYyBtYWluKCkgewoJLy8gY3JlYXRlIGEgdHlwZSB0aGF0IHNhdGlzZmllcyB0aGUgYGFwaS5TZXJ2ZXJJbnRlcmZhY2VgLCB3aGljaCBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBldmVyeSBvcGVyYXRpb24gZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUKCXNlcnZlciA6PSBhcGkuTmV3U2VydmVyKCkKCglpIDo9IGlyaXMuRGVmYXVsdCgpCgoJYXBpLlJlZ2lzdGVySGFuZGxlcnMoaSwgc2VydmVyKQoKCS8vIEFuZCB3ZSBzZXJ2ZSBIVFRQIHVudGlsIHRoZSB3b3JsZCBlbmRzLgoJbG9nLkZhdGFsKGkuTGlzdGVuKCIwLjAuMC4wOjgwODAiKSkKfQpgYGAKCj4gWyFOT1RFXQo+IFRoaXMgZG9lc24ndCBpbmNsdWRlIFt2YWxpZGF0aW9uIG9mIGluY29taW5nIHJlcXVlc3RzXSgjcmVxdWVzdHJlc3BvbnNlLXZhbGlkYXRpb24tbWlkZGxld2FyZSkuCgojIyMgU3RyaWN0IHNlcnZlcgoKYG9hcGktY29kZWdlbmAgYWxzbyBzdXBwb3J0cyBnZW5lcmF0aW5nIGEgc2VydmVyIHRoYXQgaXMgbXVjaCBtb3JlIHN0cmljdCB3aXRoIHRoZSBjb250cmFjdCB0aGF0IHRoZSBpbXBsZW1lbnRlciByZXF1aXJlcywgYW5kIHRha2VzIGluc3BpcmF0aW9uIGZyb20gc2VydmVyLXNpZGUgY29kZSBnZW5lcmF0aW9uIGZvciBSUEMgc2VydmVycy4KClRoaXMgdGFrZXMgdGhlIGJvaWxlcnBsYXRlIHJlZHVjdGlvbiBmcm9tIHRoZSBub24tc3RyaWN0IHNlcnZlcnMgYW5kIGFkZHMgYWRkaXRpb25hbCBib2lsZXJwbGF0ZSByZWR1Y3Rpb24sIGFsbG93aW5nIHlvdSB0byBtYWtlIHRoZSBmb2xsb3dpbmcgY2hhbmdlcyB0byB5b3VyIGZ1bmN0aW9uIHNpZ25hdHVyZXM6CgpgYGBkaWZmCi1GaW5kUGV0cyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCwgcGFyYW1zIEZpbmRQZXRzUGFyYW1zKQorRmluZFBldHMoY3R4IGNvbnRleHQuQ29udGV4dCwgcmVxdWVzdCBGaW5kUGV0c1JlcXVlc3RPYmplY3QpIChGaW5kUGV0c1Jlc3BvbnNlT2JqZWN0LCBlcnJvcikKYGBgCgpUaGlzIGlzIHRoZSBoaWdoZXN0IGxldmVsIG9mIHN0cmljdG5lc3MgdGhhdCBgb2FwaS1jb2RlZ2VuYCBzdXBwb3J0cyByaWdodCBub3csIGFuZCBpdCdzIGEgZ29vZCBpZGVhIHRvIHN0YXJ0IHdpdGggdGhpcyBpZiB5b3Ugd2FudCB0aGUgbW9zdCBndWFyZHJhaWxzIHRvIHNpbXBsaWZ5IGRldmVsb3BpbmcgeW91ciBBUElzLgoKVGhlIHN0cmljdCBzZXJ2ZXIgaGFzIHN1cHBvcnQgZm9yOgoKLSBtdWx0aXBsZSByZXF1ZXN0L3Jlc3BvbnNlIG1lZGlhIHR5cGVzIGFuZCBzdGF0dXMgY29kZXMgb24gYSBnaXZlbiBvcGVyYXRpb24KLSBmaXJzdC1jbGFzcyBzdXBwb3J0IGZvciBgbXVsdGlwYXJ0L2Zvcm0tZGF0YWAgYW5kIGBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRgIHJlcXVlc3RzCi0gcmV0dXJuaW5nIGFuIFtIVFRQIDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JdKGh0dHBzOi8vaHR0cC5jYXQvNTAwKSwgd2hlbiBhbiBgZXJyb3JgIGlzIHJldHVybmVkIGZyb20gYSBmdW5jdGlvbgotIGF1dG9tYWdpYyAodW4pbWFyc2hhbGxpbmcgb2YgcmVxdWVzdC9yZXNwb25zZXMsIGFuZCBzZXR0aW5nIGBjb250ZW50LXR5cGVgIGFuZCBIVFRQIHN0YXR1cyBjb2RlcyBvbiByZXNwb25zZXMKLSBiaW5kaW5nIHJlcXVlc3QgdmFsdWVzIHRvIGEgc3RydWN0LCBhIGBtdWx0aXBhcnQuUmVhZGVyYCBvciBwcm92aWRpbmcgYSBgaW8uUmVhZGVyYAoKWW91IGNhbiBzZWUgYSBsaXR0bGUgbW9yZSBkZXRhaWwgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIGluIHRoZSBbIldoYXQgZG9lcyBpdCBsb29rIGxpa2UiXSgjd2hhdC1kb2VzLWl0LWxvb2stbGlrZS1zdHJpY3QpIHNlY3Rpb24uCgo+IFshTk9URV0KPiBUbyBjb25maWd1cmUgdGhlIHN0cmljdCBzZXJ2ZXIgZ2VuZXJhdGlvbiwgeW91IG11c3Qgc3BlY2lmeSBhbm90aGVyIHNlcnZlciB0byBiZSBnZW5lcmF0ZWQuIEZvciBpbnN0YW5jZToKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogJHNjaGVtYT1odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9IRUFEL2NvbmZpZ3VyYXRpb24tc2NoZW1hLmpzb24KcGFja2FnZTogYXBpCmdlbmVyYXRlOgogICMgTk9URSBhbm90aGVyIHNlcnZlciBtdXN0IGJlIGFkZGVkIQogIGNoaS1zZXJ2ZXI6IHRydWUKICBzdHJpY3Qtc2VydmVyOiB0cnVlCm91dHB1dDogc2VydmVyLmdlbi5nbwpgYGAKCj4gWyFOT1RFXQo+IFRoaXMgZG9lc24ndCBpbmNsdWRlIFt2YWxpZGF0aW9uIG9mIGluY29taW5nIHJlcXVlc3RzXSgjcmVxdWVzdHJlc3BvbnNlLXZhbGlkYXRpb24tbWlkZGxld2FyZSkuCgojIyBHZW5lcmF0aW5nIEFQSSBjbGllbnRzCgpBcyB3ZWxsIGFzIGdlbmVyYXRpbmcgdGhlIHNlcnZlci1zaWRlIGJvaWxlcnBsYXRlLCBgb2FwaS1jb2RlZ2VuYCBjYW4gYWxzbyBnZW5lcmF0ZSBBUEkgY2xpZW50cy4KClRoaXMgYWltcyB0byBiZSBhbiBBUEkgY2xpZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgbWV0aG9kcyBvZiB0aGUgQVBJLCBhbmQgaXMgcGVyZmVjdGx5IHN1aXRlZCBmb3IgcHJvZHVjdGlvbiB1c2FnZS4KCkhvd2V2ZXIsIGlmIHlvdSB3ZXJlIGxvb2tpbmcgZm9yIGEgc2xpZ2h0bHkgbW9yZSBTREstc3R5bGUgYXBwcm9hY2gsIG9yIGEgbWl4IG9mIGdlbmVyYXRlZCB0ZXN0cyBhbmQvb3IgZG9jdW1lbnRhdGlvbiwgdGhpcyBBUEkgY2xpZW50IG1heSBub3QgYmUgZm9yIHlvdSwgYW5kIHlvdSBtYXkgd2FudCB0byBsb29rIGF0IGFsdGVybmF0ZSB0b29saW5nLgoKRm9yIGluc3RhbmNlLCBnaXZlbiBhbiBgYXBpLnlhbWxgOgoKYGBgeWFtbApvcGVuYXBpOiAiMy4wLjAiCmluZm86CiAgdmVyc2lvbjogMS4wLjAKICB0aXRsZTogR2VuZXJhdGUgbW9kZWxzCnBhdGhzOgogIC9jbGllbnQ6CiAgICBnZXQ6CiAgICAgIG9wZXJhdGlvbklkOiBnZXRDbGllbnQKICAgICAgcmVzcG9uc2VzOgogICAgICAgIDIwMDoKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgJHJlZjogIiMvY29tcG9uZW50cy9zY2hlbWFzL0NsaWVudFR5cGUiCiAgICBwdXQ6CiAgICAgIG9wZXJhdGlvbklkOiB1cGRhdGVDbGllbnQKICAgICAgcmVzcG9uc2VzOgogICAgICAgIDQwMDoKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgdHlwZTogb2JqZWN0CiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICBjb2RlOgogICAgICAgICAgICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgICAgICAgcmVxdWlyZWQ6CiAgICAgICAgICAgICAgICAtIGNvZGUKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgQ2xpZW50VHlwZToKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gbmFtZQogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIG5hbWU6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICMgTk9URSB0aGF0IHRoaXMgaXMgbm90IGdlbmVyYXRlZCBieSBkZWZhdWx0IGJlY2F1c2UgaXQncyBub3QgcmVmZXJlbmNlZC4gSWYgeW91IHdhbnQgaXQsIHlvdSBuZWVkIHRvIHVzZSB0aGUgZm9sbG93aW5nIFlBTUwgY29uZmlndXJhdGlvbjoKICAgICMKICAgICMgb3V0cHV0LW9wdGlvbnM6CiAgICAjICAgc2tpcC1wcnVuZTogdHJ1ZQogICAgVW5yZWZlcmVuY2VkOgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBpZAogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogaW50ZWdlcgpgYGAKCkFuZCBhIGBjZmcueWFtbGA6CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6ICRzY2hlbWE9aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vSEVBRC9jb25maWd1cmF0aW9uLXNjaGVtYS5qc29uCnBhY2thZ2U6IGNsaWVudApvdXRwdXQ6IGNsaWVudC5nZW4uZ28KZ2VuZXJhdGU6CiAgbW9kZWxzOiB0cnVlCiAgY2xpZW50OiB0cnVlCmBgYAoKQW5kIGEgYGdlbmVyYXRlLmdvYDoKCmBgYGdvCnBhY2thZ2UgY2xpZW50CgovL2dvOmdlbmVyYXRlIGdvIHJ1biBnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvY21kL29hcGktY29kZWdlbiAtY29uZmlnIGNmZy55YW1sIGFwaS55YW1sCmBgYAoKVGhpcyB3b3VsZCB0aGVuIGdlbmVyYXRlOgoKYGBgZ28KcGFja2FnZSBjbGllbnQKCi8vIC4uLgoKLy8gQ2xpZW50VHlwZSBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnRUeXBlLgp0eXBlIENsaWVudFR5cGUgc3RydWN0IHsKCU5hbWUgc3RyaW5nIGBqc29uOiJuYW1lImAKfQoKLy8gLi4uCgovLyBDbGllbnQgd2hpY2ggY29uZm9ybXMgdG8gdGhlIE9wZW5BUEkzIHNwZWNpZmljYXRpb24gZm9yIHRoaXMgc2VydmljZS4KdHlwZSBDbGllbnQgc3RydWN0IHsKCS8vIFRoZSBlbmRwb2ludCBvZiB0aGUgc2VydmVyIGNvbmZvcm1pbmcgdG8gdGhpcyBpbnRlcmZhY2UsIHdpdGggc2NoZW1lLAoJLy8gaHR0cHM6Ly9hcGkuZGVlcG1hcC5jb20gZm9yIGV4YW1wbGUuIFRoaXMgY2FuIGNvbnRhaW4gYSBwYXRoIHJlbGF0aXZlCgkvLyB0byB0aGUgc2VydmVyLCBzdWNoIGFzIGh0dHBzOi8vYXBpLmRlZXBtYXAuY29tL2Rldi10ZXN0LCBhbmQgYWxsIHRoZQoJLy8gcGF0aHMgaW4gdGhlIHN3YWdnZXIgc3BlYyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBzZXJ2ZXIuCglTZXJ2ZXIgc3RyaW5nCgoJLy8gRG9lciBmb3IgcGVyZm9ybWluZyByZXF1ZXN0cywgdHlwaWNhbGx5IGEgKmh0dHAuQ2xpZW50IHdpdGggYW55CgkvLyBjdXN0b21pemVkIHNldHRpbmdzLCBzdWNoIGFzIGNlcnRpZmljYXRlIGNoYWlucy4KCUNsaWVudCBIdHRwUmVxdWVzdERvZXIKCgkvLyBBIGxpc3Qgb2YgY2FsbGJhY2tzIGZvciBtb2RpZnlpbmcgcmVxdWVzdHMgd2hpY2ggYXJlIGdlbmVyYXRlZCBiZWZvcmUgc2VuZGluZyBvdmVyCgkvLyB0aGUgbmV0d29yay4KCVJlcXVlc3RFZGl0b3JzIFtdUmVxdWVzdEVkaXRvckZuCn0KCi8vIC4uLgoKLy8gVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgY2xpZW50IGFib3ZlLgp0eXBlIENsaWVudEludGVyZmFjZSBpbnRlcmZhY2UgewoJLy8gR2V0Q2xpZW50IHJlcXVlc3QKCUdldENsaWVudChjdHggY29udGV4dC5Db250ZXh0LCByZXFFZGl0b3JzIC4uLlJlcXVlc3RFZGl0b3JGbikgKCpodHRwLlJlc3BvbnNlLCBlcnJvcikKCgkvLyBVcGRhdGVDbGllbnQgcmVxdWVzdAoJVXBkYXRlQ2xpZW50KGN0eCBjb250ZXh0LkNvbnRleHQsIHJlcUVkaXRvcnMgLi4uUmVxdWVzdEVkaXRvckZuKSAoKmh0dHAuUmVzcG9uc2UsIGVycm9yKQp9CgovLyAuLi4KCi8vIENsaWVudFdpdGhSZXNwb25zZXNJbnRlcmZhY2UgaXMgdGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgY2xpZW50IHdpdGggcmVzcG9uc2VzIGFib3ZlLgp0eXBlIENsaWVudFdpdGhSZXNwb25zZXNJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCS8vIEdldENsaWVudFdpdGhSZXNwb25zZSByZXF1ZXN0CglHZXRDbGllbnRXaXRoUmVzcG9uc2UoY3R4IGNvbnRleHQuQ29udGV4dCwgcmVxRWRpdG9ycyAuLi5SZXF1ZXN0RWRpdG9yRm4pICgqR2V0Q2xpZW50UmVzcG9uc2UsIGVycm9yKQoKCS8vIFVwZGF0ZUNsaWVudFdpdGhSZXNwb25zZSByZXF1ZXN0CglVcGRhdGVDbGllbnRXaXRoUmVzcG9uc2UoY3R4IGNvbnRleHQuQ29udGV4dCwgcmVxRWRpdG9ycyAuLi5SZXF1ZXN0RWRpdG9yRm4pICgqVXBkYXRlQ2xpZW50UmVzcG9uc2UsIGVycm9yKQp9Cgp0eXBlIEdldENsaWVudFJlc3BvbnNlIHN0cnVjdCB7CglCb2R5ICAgICAgICAgW11ieXRlCglIVFRQUmVzcG9uc2UgKmh0dHAuUmVzcG9uc2UKCUpTT04yMDAgICAgICAqQ2xpZW50VHlwZQp9CgovLyAuLi4KYGBgCgpXaXRoIHRoaXMgZ2VuZXJhdGVkIGNsaWVudCwgaXQgaXMgdGhlbiBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgYW5kIHV0aWxpc2UgdGhlIGNsaWVudCwgZm9yIGluc3RhbmNlOgoKYGBgZ28KcGFja2FnZSBjbGllbnRfdGVzdAoKaW1wb3J0ICgKCSJjb250ZXh0IgoJImZtdCIKCSJsb2ciCgkibmV0L2h0dHAiCgoJImdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9leGFtcGxlcy9jbGllbnQiCikKCmZ1bmMgVGVzdENsaWVudF9jYW5DYWxsKCkgewoJLy8gY3VzdG9tIEhUVFAgY2xpZW50CgloYyA6PSBodHRwLkNsaWVudHt9CgoJLy8gd2l0aCBhIHJhdyBodHRwLlJlc3BvbnNlCgl7CgkJYywgZXJyIDo9IGNsaWVudC5OZXdDbGllbnQoImh0dHA6Ly9sb2NhbGhvc3Q6MTIzNCIsIGNsaWVudC5XaXRoSFRUUENsaWVudCgmaGMpKQoJCWlmIGVyciAhPSBuaWwgewoJCQlsb2cuRmF0YWwoZXJyKQoJCX0KCgkJcmVzcCwgZXJyIDo9IGMuR2V0Q2xpZW50KGNvbnRleHQuVE9ETygpKQoJCWlmIGVyciAhPSBuaWwgewoJCQlsb2cuRmF0YWwoZXJyKQoJCX0KCQlpZiByZXNwLlN0YXR1c0NvZGUgIT0gaHR0cC5TdGF0dXNPSyB7CgkJCWxvZy5GYXRhbGYoIkV4cGVjdGVkIEhUVFAgMjAwIGJ1dCByZWNlaXZlZCAlZCIsIHJlc3AuU3RhdHVzQ29kZSkKCQl9Cgl9CgoJLy8gb3IgdG8gZ2V0IGEgc3RydWN0IHdpdGggdGhlIHBhcnNlZCByZXNwb25zZSBib2R5Cgl7CgkJYywgZXJyIDo9IGNsaWVudC5OZXdDbGllbnRXaXRoUmVzcG9uc2VzKCJodHRwOi8vbG9jYWxob3N0OjEyMzQiLCBjbGllbnQuV2l0aEhUVFBDbGllbnQoJmhjKSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJbG9nLkZhdGFsKGVycikKCQl9CgoJCXJlc3AsIGVyciA6PSBjLkdldENsaWVudFdpdGhSZXNwb25zZShjb250ZXh0LlRPRE8oKSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJbG9nLkZhdGFsKGVycikKCQl9CgkJaWYgcmVzcC5TdGF0dXNDb2RlKCkgIT0gaHR0cC5TdGF0dXNPSyB7CgkJCWxvZy5GYXRhbGYoIkV4cGVjdGVkIEhUVFAgMjAwIGJ1dCByZWNlaXZlZCAlZCIsIHJlc3AuU3RhdHVzQ29kZSgpKQoJCX0KCgkJZm10LlByaW50ZigicmVzcC5KU09OMjAwOiAldlxuIiwgcmVzcC5KU09OMjAwKQoJfQoKfQpgYGAKCiMjIEdlbmVyYXRpbmcgQVBJIG1vZGVscwoKSWYgeW91J3JlIGxvb2tpbmcgdG8gb25seSBnZW5lcmF0ZSB0aGUgbW9kZWxzIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgcmVtb3RlIHNlcnZpY2UsIGZvciBpbnN0YW5jZSBpZiB5b3UgbmVlZCB0byBoYW5kLXJvbGwgdGhlIEFQSSBjbGllbnQgZm9yIHdoYXRldmVyIHJlYXNvbiwgeW91IGNhbiBkbyB0aGlzIGFzLWlzLgoKPiBbIVRJUF0KPiBUcnkgdG8gZGVmaW5lIGFzIG11Y2ggYXMgcG9zc2libGUgd2l0aGluIHRoZSBgIy9jb21wb25lbnRzL3NjaGVtYXNgIG9iamVjdCwgYXMgYG9hcGktY29kZWdlbmAgd2lsbCBnZW5lcmF0ZSBhbGwgdGhlIHR5cGVzIGhlcmUuCj4KPiBBbHRob3VnaCB3ZSBjYW4gZ2VuZXJhdGUgc29tZSB0eXBlcyBiYXNlZCBvbiBpbmxpbmUgZGVmaW5pdGlvbnMgaW4gaS5lLiBhIHBhdGgncyByZXNwb25zZSB0eXBlLCBpdCBpc24ndCBhbHdheXMgcG9zc2libGUgdG8gZG8gdGhpcywgb3IgaWYgaXQgaXMgZ2VuZXJhdGVkLCBjYW4gYmUgYSBsaXR0bGUgYXdrd2FyZCB0byB3b3JrIHdpdGggYXMgaXQgbWF5IGJlIGRlZmluZWQgYXMgYW4gYW5vbnltb3VzIHN0cnVjdC4KCkZvciBpbnN0YW5jZSwgZ2l2ZW4gYW4gYGFwaS55YW1sYDoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IEdlbmVyYXRlIG1vZGVscwpwYXRoczoKICAvY2xpZW50OgogICAgZ2V0OgogICAgICBvcGVyYXRpb25JZDogZ2V0Q2xpZW50CiAgICAgIHJlc3BvbnNlczoKICAgICAgICAyMDA6CiAgICAgICAgICBjb250ZW50OgogICAgICAgICAgICBhcHBsaWNhdGlvbi9qc29uOgogICAgICAgICAgICAgIHNjaGVtYToKICAgICAgICAgICAgICAgICMgTk9URSB0aGF0IENsaWVudCBpcyBnZW5lcmF0ZWQgaGVyZSwgYmVjYXVzZSBpdCdzIHdpdGhpbiAjL2NvbXBvbmVudHMvc2NoZW1hcwogICAgICAgICAgICAgICAgJHJlZjogIiMvY29tcG9uZW50cy9zY2hlbWFzL0NsaWVudCIKICAgIHB1dDoKICAgICAgb3BlcmF0aW9uSWQ6IHVwZGF0ZUNsaWVudAogICAgICByZXNwb25zZXM6CiAgICAgICAgNDAwOgogICAgICAgICAgY29udGVudDoKICAgICAgICAgICAgYXBwbGljYXRpb24vanNvbjoKICAgICAgICAgICAgICAjIE5PVEUgdGhhdCB0aGlzIGFub255bW91cyBvYmplY3QgaXMgL25vdC8gZ2VuZXJhdGVkIGJlY2F1c2UgaXQncyBhbiBhbm9ueW1vdXMsIGJ1dCB3b3VsZCBiZSBnZW5lcmF0ZWQgaWYgdXNpbmcgYGdlbmVyYXRlOiBjbGllbnRgCiAgICAgICAgICAgICAgIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vaXNzdWVzLzE1MTIKICAgICAgICAgICAgICBzY2hlbWE6CiAgICAgICAgICAgICAgICB0eXBlOiBvYmplY3QKICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgICAgICAgICAgIGNvZGU6CiAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgICAgIC0gY29kZQpjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICBDbGllbnQ6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAjIE5PVEUgdGhhdCB0aGlzIGlzIG5vdCBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBiZWNhdXNlIGl0J3Mgbm90IHJlZmVyZW5jZWQuIElmIHlvdSB3YW50IGl0LCB5b3UgbmVlZCB0byB1c2UgdGhlIGZvbGxvd2luZyBZQU1MIGNvbmZpZ3VyYXRpb246CiAgICAjCiAgICAjIG91dHB1dC1vcHRpb25zOgogICAgIyAgIHNraXAtcHJ1bmU6IHRydWUKICAgIFVucmVmZXJlbmNlZDoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gaWQKICAgICAgcHJvcGVydGllczoKICAgICAgICBpZDoKICAgICAgICAgIHR5cGU6IGludGVnZXIKYGBgCgpBbmQgYSBgY2ZnLnlhbWxgOgoKYGBgeWFtbAojIHlhbWwtbGFuZ3VhZ2Utc2VydmVyOiAkc2NoZW1hPWh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL0hFQUQvY29uZmlndXJhdGlvbi1zY2hlbWEuanNvbgpwYWNrYWdlOiBvbmx5bW9kZWxzCm91dHB1dDogb25seS1tb2RlbHMuZ2VuLmdvCmdlbmVyYXRlOgogIG1vZGVsczogdHJ1ZQpgYGAKCkFuZCBhIGBnZW5lcmF0ZS5nb2A6CgpgYGBnbwpwYWNrYWdlIG9ubHltb2RlbHMKCi8vZ286Z2VuZXJhdGUgZ28gcnVuIGdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9jbWQvb2FwaS1jb2RlZ2VuIC1jb25maWcgY2ZnLnlhbWwgYXBpLnlhbWwKYGBgCgpUaGlzIHdvdWxkIHRoZW4gZ2VuZXJhdGU6CgpgYGBnbwpwYWNrYWdlIG9ubHltb2RlbHMKCi8vIENsaWVudCBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnQuCnR5cGUgQ2xpZW50IHN0cnVjdCB7CglOYW1lIHN0cmluZyBganNvbjoibmFtZSJgCn0KYGBgCgpJZiB5b3Ugd2lzaCB0byBhbHNvIGdlbmVyYXRlIHRoZSBgVW5yZWZlcmVuY2VkYCB0eXBlLCB5b3Ugd291bGQgbmVlZCB0aGUgZm9sbG93aW5nIGBjZmcueWFtbGA6CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6ICRzY2hlbWE9aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vSEVBRC9jb25maWd1cmF0aW9uLXNjaGVtYS5qc29uCnBhY2thZ2U6IG9ubHltb2RlbHMKb3V0cHV0OiBvbmx5LW1vZGVscy5nZW4uZ28KZ2VuZXJhdGU6CiAgbW9kZWxzOiB0cnVlCm91dHB1dC1vcHRpb25zOgogICMgTk9URSB0aGF0IHRoaXMgaXMgb25seSByZXF1aXJlZCBmb3IgdGhlIGBVbnJlZmVyZW5jZWRgIHR5cGUKICBza2lwLXBydW5lOiB0cnVlCmBgYAoKRm9yIGEgY29tcGxldGUgZXhhbXBsZSBzZWUgW2BleGFtcGxlcy9vbmx5LW1vZGVsc2BdKGV4YW1wbGVzL29ubHktbW9kZWxzKS4KCiMjIFNwbGl0dGluZyBsYXJnZSBPcGVuQVBJIHNwZWNzIGFjcm9zcyBtdWx0aXBsZSBwYWNrYWdlcyAoYWthICJJbXBvcnQgTWFwcGluZyIgb3IgImV4dGVybmFsIHJlZmVyZW5jZXMiKQo8YSBuYW1lPWltcG9ydC1tYXBwaW5nPjwvYT4KCldoZW4geW91J3ZlIGdvdCBhIGxhcmdlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiwgeW91IG1heSBmaW5kIGl0IHVzZWZ1bCB0byBzcGxpdCB0aGUgY29udGVudHMgb2YgdGhlIHNwZWMgYWNyb3NzIG11bHRpcGxlIGZpbGVzLCB1c2luZyBleHRlcm5hbCByZWZlcmVuY2VzLCBzdWNoIGFzOgoKYGBgeWFtbAogICAgICByZXNwb25zZXM6CiAgICAgICAgMjAwOgogICAgICAgICAgZGVzY3JpcHRpb246IFN1Y2Nlc3MKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL1VzZXInCmBgYAoKVGhpcyBpcyBzdXBwb3J0ZWQgYnkgYG9hcGktY29kZWdlbmAsIHRocm91Z2ggdGhlIGFiaWxpdHkgdG8gcGVyZm9ybSAiSW1wb3J0IE1hcHBpbmciLgoKRm9yIGluc3RhbmNlLCBsZXQncyBzYXkgdGhhdCB3ZSBoYXZlIGEgbGFyZ2UgQVBJLCB3aGljaCBoYXMgYSB1c2VyLWZhY2luZyBBUEkgYW5kIGFuIGFkbWluIEFQSSwgYm90aCBvZiB3aGljaCB1c2UgYSBjb21tb24gc2V0IG9mIEFQSSBtb2RlbHMuCgpJbiB0aGlzIGNhc2UsIHdlIG1heSBoYXZlIGFuIEFkbWluIEFQSSB0aGF0IGxvb2tzIGxpa2U6CgpgYGB5YW1sCiMgYWRtaW4vYXBpLnlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IEFkbWluIEFQSQogIGRlc2NyaXB0aW9uOiBUaGUgYWRtaW4tb25seSBwb3J0aW9uIG9mIHRoZSBBUEksIHdoaWNoIGhhcyBpdHMgb3duIHNlcGFyYXRlIE9wZW5BUEkgc3BlYwp0YWdzOgogIC0gbmFtZTogYWRtaW4KICAgIGRlc2NyaXB0aW9uOiBBZG1pbiBBUEkgZW5kcG9pbnRzCiAgLSBuYW1lOiB1c2VyCiAgICBkZXNjcmlwdGlvbjogQVBJIGVuZHBvaW50IHRoYXQgcGVydGFpbnMgdG8gdXNlciBkYXRhCnBhdGhzOgogIC9hZG1pbi91c2VyL3tpZH06CiAgICBnZXQ6CiAgICAgIHRhZ3M6CiAgICAgICAgLSBhZG1pbgogICAgICAgIC0gdXNlcgogICAgICBzdW1tYXJ5OiBHZXQgYSB1c2VyJ3MgZGV0YWlscwogICAgICBvcGVyYXRpb25JZDogZ2V0VXNlckJ5SWQKICAgICAgcGFyYW1ldGVyczoKICAgICAgICAtIG5hbWU6IGlkCiAgICAgICAgICBpbjogcGF0aAogICAgICAgICAgcmVxdWlyZWQ6IHRydWUKICAgICAgICAgIHNjaGVtYToKICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAgIGZvcm1hdDogdXVpZAogICAgICByZXNwb25zZXM6CiAgICAgICAgMjAwOgogICAgICAgICAgZGVzY3JpcHRpb246IFN1Y2Nlc3MKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgJHJlZjogJy4uL2NvbW1vbi9hcGkueWFtbCMvY29tcG9uZW50cy9zY2hlbWFzL1VzZXInCmBgYAoKVGhpcyByZWZlcmVuY2VzIHRoZSBjb21tb24gc3BlYzoKCmBgYHlhbWwKIyBjb21tb24vYXBpLnlhbWwKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgVXNlcjoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZQogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIG5hbWU6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCmBgYAoKU28gaG93IGRvIHdlIGdldCBgb2FwaS1jb2RlZ2VuYCB0byBnZW5lcmF0ZSBvdXIgY29kZT8KCiMjIyBVc2luZyBhIHNpbmdsZSBwYWNrYWdlIHdpdGggbXVsdGlwbGUgT3BlbkFQSSBzcGVjcwoKPGEgbmFtZT1pbXBvcnQtbWFwcGluZy1zZWxmPjwvYT4KCj4gWyFUSVBdCj4gU2luY2UgYG9hcGktY29kZWdlbmAgdjIuNC4wLCBpdCBpcyBub3cgcG9zc2libGUgdG8gc3BsaXQgbGFyZ2UgT3BlbkFQSSBzcGVjaWZpY2F0aW9ucyBpbnRvIHRoZSBzYW1lIEdvIHBhY2thZ2UsIHVzaW5nIHRoZSAic2VsZiIgbWFwcGluZyAoZGVub3RlZCBieSBhIGAtYCkgd2hlbiB1c2luZyBJbXBvcnQgTWFwcGluZy4KPgo+IFRoaXMgaXMgYW4gaW1wcm92ZW1lbnQgb24gdGhlIHByZXZpb3VzIG1vZGVsLCB3aGljaCB3b3VsZCByZXF1aXJlIHNwbGl0dGluZyBmaWxlcyBhY3Jvc3MgbXVsdGlwbGUgcGFja2FnZXMuCgo+IFshTk9URV0KPiBZb3Ugc3RpbGwgbmVlZCB0byBoYXZlIG11bHRpcGxlIGBnbyBnZW5lcmF0ZWBzLCBhbmQgYW55IG90aGVyIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgpUbyBnZXQgYG9hcGktY29kZWdlbmAncyBzaW5nbGUtcGFja2FnZSBzdXBwb3J0IHdvcmtpbmcsIHdlIG5lZWQgbXVsdGlwbGUgY2FsbHMgdG8gYG9hcGktY29kZWdlbmAsIG9uZSBjYWxsIHBlciBPcGVuQVBJIHNwZWMgZmlsZToKCmBgYHNoCiQgZ28gcnVuIGdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9jbWQvb2FwaS1jb2RlZ2VuIC1jb25maWcgY2ZnLWFwaS55YW1sIC4uL2FkbWluL2FwaS55YW1sCiQgZ28gcnVuIGdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9jbWQvb2FwaS1jb2RlZ2VuIC1jb25maWcgY2ZnLXVzZXIueWFtbCAuLi9jb21tb24vYXBpLnlhbWwKYGBgCgpUaGlzIHRoZXJlZm9yZSBtZWFucyB0aGF0IHdlIG5lZWQgbXVsdGlwbGUgY29uZmlndXJhdGlvbiBmaWxlcywgc3VjaCBhcyBgY2ZnLWFwaS55YW1sYDoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogJHNjaGVtYT1odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9IRUFEL2NvbmZpZ3VyYXRpb24tc2NoZW1hLmpzb24KcGFja2FnZTogc2FtZXBhY2thZ2UKb3V0cHV0OiBzZXJ2ZXIuZ2VuLmdvCmdlbmVyYXRlOgogIG1vZGVsczogdHJ1ZQogIGNoaS1zZXJ2ZXI6IHRydWUKICBzdHJpY3Qtc2VydmVyOiB0cnVlCm91dHB1dC1vcHRpb25zOgogICMgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHR5cGVzIGFyZSBnZW5lcmF0ZWQKICBza2lwLXBydW5lOiB0cnVlCmltcG9ydC1tYXBwaW5nOgogIHVzZXIueWFtbDogIi0iCmBgYAoKQW5kIHRoZW4gb3VyIGBjZmctdXNlci55YW1sYDoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogJHNjaGVtYT1odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9IRUFEL2NvbmZpZ3VyYXRpb24tc2NoZW1hLmpzb24KcGFja2FnZTogc2FtZXBhY2thZ2UKb3V0cHV0OiB1c2VyLmdlbi5nbwpnZW5lcmF0ZToKICBtb2RlbHM6IHRydWUKb3V0cHV0LW9wdGlvbnM6CiAgIyB0byBtYWtlIHN1cmUgdGhhdCBhbGwgdHlwZXMgYXJlIGdlbmVyYXRlZAogIHNraXAtcHJ1bmU6IHRydWUKYGBgCgpGcm9tIGhlcmUsIGBvYXBpLWNvZGVnZW5gIHdpbGwgZ2VuZXJhdGUgbXVsdGlwbGUgR28gZmlsZXMsIGFsbCB3aXRoaW4gdGhlIHNhbWUgcGFja2FnZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYnJlYWsgZG93biB5b3VyIGxhcmdlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbnMsIGFuZCBnZW5lcmF0ZSBvbmx5IHRoZSBzdWJzZXRzIG9mIGNvZGUgbmVlZGVkIGZvciBlYWNoIHBhcnQgb2YgdGhlIHNwZWMuCgpDaGVjayBvdXQgW3RoZSBpbXBvcnQtbWFwcGluZy9zYW1lcGFja2FnZSBleGFtcGxlXShleGFtcGxlcy9pbXBvcnQtbWFwcGluZy9zYW1lcGFja2FnZSkgZm9yIHRoZSBmdWxsIGNvZGUuCgojIyMgVXNpbmcgbXVsdGlwbGUgcGFja2FnZXMsIHdpdGggb25lIE9wZW5BUEkgc3BlYyBwZXIgcGFja2FnZQoKVG8gZ2V0IGBvYXBpLWNvZGVnZW5gJ3MgbXVsdGktcGFja2FnZSBzdXBwb3J0IHdvcmtpbmcsIHdlIG5lZWQgdG8gc2V0IHVwIG91ciBkaXJlY3Rvcnkgc3RydWN0dXJlOgoKYGBgCuKUnOKUgOKUgCBhZG1pbgrilILCoMKgIOKUnOKUgOKUgCBjZmcueWFtbArilILCoMKgIOKUlOKUgOKUgCBnZW5lcmF0ZS5nbwrilJTilIDilIAgY29tbW9uCiAgICDilJzilIDilIAgY2ZnLnlhbWwKIMKgwqAg4pSU4pSA4pSAIGdlbmVyYXRlLmdvCmBgYAoKV2UgY291bGQgc3RhcnQgd2l0aCBvdXIgY29uZmlndXJhdGlvbiBmaWxlIGZvciBvdXIgYWRtaW4gQVBJIHNwZWM6CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6ICRzY2hlbWE9aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vSEVBRC9jb25maWd1cmF0aW9uLXNjaGVtYS5qc29uCiMgYWRtaW4vY2ZnLnlhbWwKcGFja2FnZTogYWRtaW4Kb3V0cHV0OiBzZXJ2ZXIuZ2VuLmdvCmdlbmVyYXRlOgogIG1vZGVsczogdHJ1ZQogIGNoaS1zZXJ2ZXI6IHRydWUKb3V0cHV0LW9wdGlvbnM6CiAgIyB0byBtYWtlIHN1cmUgdGhhdCBhbGwgdHlwZXMgYXJlIGdlbmVyYXRlZAogIHNraXAtcHJ1bmU6IHRydWUKIyBOT1RFIHRoYXQgdGhpcyB3b24ndCB3b3JrLCBhcyBpdCdzIG1pc3NpbmcgYGltcG9ydC1tYXBwaW5nYApgYGAKCklmIHdlIHdlcmUgdG8gcnVuIGBvYXBpLWNvZGVnZW5gLCB0aGlzIHdpbGwgZmFpbCB3aXRoIHRoZSBmb2xsb3dpbmcgZXJyb3IKCmBgYAplcnJvciBnZW5lcmF0aW5nIGNvZGU6IGVycm9yIGNyZWF0aW5nIG9wZXJhdGlvbiBkZWZpbml0aW9uczogZXJyb3IgZ2VuZXJhdGluZyByZXNwb25zZSBkZWZpbml0aW9uczogZXJyb3IgZ2VuZXJhdGluZyByZXF1ZXN0IGJvZHkgZGVmaW5pdGlvbjogZXJyb3IgdHVybmluZyByZWZlcmVuY2UgKC4uL2NvbW1vbi9hcGkueWFtbCMvY29tcG9uZW50cy9zY2hlbWFzL1VzZXIpIGludG8gYSBHbyB0eXBlOiB1bnJlY29nbml6ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlICcuLi9jb21tb24vYXBpLnlhbWwnOyBwbGVhc2UgcHJvdmlkZSB0aGUga25vd24gaW1wb3J0IGZvciB0aGlzIHJlZmVyZW5jZSB1c2luZyBvcHRpb24gLS1pbXBvcnQtbWFwcGluZwpgYGAKClRoaXMgaXMgYmVjYXVzZSBgb2FwaS1jb2RlZ2VuYCByZXF1aXJlcyB0aGUgYGltcG9ydC1tYXBwaW5nYDoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogJHNjaGVtYT1odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9IRUFEL2NvbmZpZ3VyYXRpb24tc2NoZW1hLmpzb24KcGFja2FnZTogYWRtaW4Kb3V0cHV0OiBzZXJ2ZXIuZ2VuLmdvCmdlbmVyYXRlOgogIG1vZGVsczogdHJ1ZQogIGNoaS1zZXJ2ZXI6IHRydWUKb3V0cHV0LW9wdGlvbnM6CiAgIyB0byBtYWtlIHN1cmUgdGhhdCBhbGwgdHlwZXMgYXJlIGdlbmVyYXRlZAogIHNraXAtcHJ1bmU6IHRydWUKaW1wb3J0LW1hcHBpbmc6CiAgIyBmb3IgYSBnaXZlbiBmaWxlL1VSTCB0aGF0IGlzICRyZWYnZCwgcG9pbnQgYG9hcGktY29kZWdlbmAgdG8gdGhlIEdvIHBhY2thZ2UgdGhhdCB0aGlzIHNwZWMgaXMgZ2VuZXJhdGVkIGludG8sIHRvIHBlcmZvcm0gR28gcGFja2FnZSBpbXBvcnRzCiAgLi4vY29tbW9uL2FwaS55YW1sOiBnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvZXhhbXBsZXMvaW1wb3J0LW1hcHBpbmcvY29tbW9uCmBgYAoKVGhpcyB3aWxsIHRoZW4gZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBjb2RlOgoKYGBgZ28KcGFja2FnZSBhZG1pbgoKaW1wb3J0ICgKCS8vIC4uLgoJZXh0ZXJuYWxSZWYwICJnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvZXhhbXBsZXMvaW1wb3J0LW1hcHBpbmcvY29tbW9uIgopCgovLyBVc2VyIGRlZmluZXMgbW9kZWwgZm9yIFVzZXIuCnR5cGUgVXNlciA9IGV4dGVybmFsUmVmMC5Vc2VyCmBgYAoKSWYgeW91IGRvbid0IHdhbnQgdG8gZG8gdGhpcywgYW4gYWx0ZXJuYXRlIG9wdGlvbiBpcyB0byBbdXNlIGEgc2luZ2xlIHBhY2thZ2UsIHdpdGggbXVsdGlwbGUgT3BlbkFQSSBzcGVjIGZpbGVzIGZvciB0aGF0IGdpdmVuIHBhY2thZ2VdKCNpbXBvcnQtbWFwcGluZy1zZWxmKSBvciB0byBbYnVuZGxlIHlvdXIgbXVsdGlwbGUgT3BlbkFQSSBmaWxlc10oaHR0cHM6Ly93d3cuanZ0Lm1lL3Bvc3RzLzIwMjIvMDIvMTAvYnVuZGxlLW9wZW5hcGkvKSBpbnRvIGEgc2luZ2xlIHNwZWMuCgpDaGVjayBvdXQgW3RoZSBpbXBvcnQtbWFwcGluZy9tdWx0aXBsZXBhY2thZ2VzIGV4YW1wbGVdKGV4YW1wbGVzL2ltcG9ydC1tYXBwaW5nL211bHRpcGxlcGFja2FnZXMvKSBmb3IgdGhlIGZ1bGwgY29kZS4KCiMjIE1vZGlmeWluZyB0aGUgaW5wdXQgT3BlbkFQSSBTcGVjaWZpY2F0aW9uCgpQcmlvciB0byBgb2FwaS1jb2RlZ2VuYCB2Mi40LjAsIHVzZXJzIHdpc2hpbmcgdG8gb3ZlcnJpZGUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiwgZm9yIGluc3RhbmNlIHRha2luZyBhZHZhbnRhZ2Ugb2YgZXh0ZW5zaW9ucyBzdWNoIGFzIGB4LWdvLXR5cGVgICB3b3VsZCBuZWVkIHRvIG1vZGlmeSB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIHRoZXkgYXJlIHVzaW5nLgoKSW4gYSBsb3Qgb2YgY2FzZXMsIHRoaXMgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIHdvdWxkIGJlIHByb2R1Y2VkIGJ5IGEgZGlmZmVyZW50IHRlYW0gdG8gdGhlIGNvbnN1bWVycyAob3IgZXZlbiBhIGRpZmZlcmVudCBjb21wYW55KSBhbmQgc28gYXNraW5nIHRoZW0gdG8gbWFrZSBjaGFuZ2VzIGxpa2UgdGhpcyB3ZXJlIHVucmVhc29uYWJsZS4KClRoaXMgd291bGQgbGVhZCB0byB0aGUgQVBJIGNvbnN1bWVycyBuZWVkaW5nIHRvIHZlbmRvciB0aGUgc3BlY2lmaWNhdGlvbiBmcm9tIHRoZSBwcm9kdWNlciAod2hpY2ggaXMgW291ciByZWNvbW1lbmRhdGlvbiBhbnl3YXldKCNodHRwcy1wYXRocykpIGFuZCB0aGVuIG1ha2UgYW55IG51bWJlciBvZiBsb2NhbCBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpY2F0aW9uIHRvIG1ha2UgaXQgZ2VuZXJhdGUgY29kZSB0aGF0IGxvb2tzIHJlYXNvbmFibGUuCgpIb3dldmVyLCBpbiB0aGUgY2FzZSB0aGF0IGEgY29uc3VtZXIgd291bGQgdXBkYXRlIHRoZWlyIHNwZWNpZmljYXRpb24sIHRoZXkgd291bGQgbGlrZWx5IGVuZCB1cCB3aXRoIGEgbnVtYmVyIG9mIG1lcmdlIGNvbmZsaWN0cy4KCk5vdywgYXMgb2YgYG9hcGktY29kZWdlbmAgdjIuNC4wLCBpdCBpcyBub3cgcG9zc2libGUgdG8gbWFrZSBjaGFuZ2VzIHRvIHRoZSBpbnB1dCBPcGVuQVBJIHNwZWNpZmljYXRpb24gX3dpdGhvdXQgbmVlZGluZyB0byBtb2RpZnkgaXQgZGlyZWN0bHlfLgoKVGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIFtPcGVuQVBJIE92ZXJsYXkgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL09BSS9PdmVybGF5LVNwZWNpZmljYXRpb24pLCB3aGljaCBpcyBhIHN0YWJsZSBzcGVjaWZpY2F0aW9uLgoKPiBbIUNBVVRJT05dCj4gQmV3YXJlISBIZXJlIChtYXkpIGJlIGRyYWdvbnMuCj4KPiBUaGUgT3ZlcmxheSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHRoZSB1c2Ugb2YgSlNPTiBQYXRoLCB3aGljaCBzb21lIHVzZXJzIG1heSBmaW5kIGRpZmZpY3VsdCB0byB3cml0ZSBhbmQvb3IgbWFpbnRhaW4uCj4KPiBXZSBzdGlsbCBoZWF2aWx5IHJlY29tbWVuZCB1c2luZyBPdmVybGF5IGZ1bmN0aW9uYWxpdHksIGJ1dCB3b3VsZCBsaWtlIHVzZXJzIHRvIGJlIGF3YXJlIG9mIHRoaXMuCj4KPiBUaGVyZSBpcyBhIFtwcm9wb3NlZCBtb2RpZmljYXRpb24gdG8gdGhlIHNwZWNpZmljYXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9PQUkvT3ZlcmxheS1TcGVjaWZpY2F0aW9uL3B1bGwvMzIpIHdoaWNoIHdvdWxkIHJlbGF4IHRoZSBuZWVkIGZvciBKU09OIFBhdGggYXMgdGhlIHRhcmdldGluZyBtZWNoYW5pc20uCgpGb3IgaW5zdGFuY2UsIGxldCdzIHNheSB0aGF0IHdlIGhhdmUgdGhlIGZvbGxvd2luZyBPcGVuQVBJIHNwZWNpZmljYXRpb24sIHdoaWNoIHByb3ZpZGVzIGluc2lnaHQgaW50byBhbiBpbnRlcm5hbCBlbmRwb2ludCB0aGF0IHdlIHNob3VsZCBub3QgYmUgZ2VuZXJhdGluZyBhbnkgY29kZSBmb3IgKGRlbm90ZWQgYnkgYHgtaW50ZXJuYWxgKToKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6ICJFeGFtcGxlIHRvIGluZGljYXRlIGhvdyB0byB1c2UgdGhlIE9wZW5BUEkgT3ZlcmxheSBzcGVjaWZpY2F0aW9uIChodHRwczovL2dpdGh1Yi5jb20vT0FJL092ZXJsYXktU3BlY2lmaWNhdGlvbikiCnBhdGhzOgogIC9waW5nOgogICAgZ2V0OgogICAgICByZXNwb25zZXM6CiAgICAgICAgJzIwMCc6CiAgICAgICAgICBkZXNjcmlwdGlvbjogcGV0IHJlc3BvbnNlCiAgICAgICAgICBjb250ZW50OgogICAgICAgICAgICBhcHBsaWNhdGlvbi9qc29uOgogICAgICAgICAgICAgIHNjaGVtYToKICAgICAgICAgICAgICAgICRyZWY6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9Qb25nJwogICAgZGVsZXRlOgogICAgICB4LWludGVybmFsOiB0cnVlCiAgICAgIHJlc3BvbnNlczoKICAgICAgICAnMjAyJzoKICAgICAgICAgIGNvbnRlbnQ6IHt9CmBgYAoKSWYgd2Ugd2VyZSB0byBydW4gYG9hcGktY29kZWdlbmAgd2l0aCBvdXQtb2YtdGhlLWJveCBmdW5jdGlvbmFsaXR5LCB0aGlzIHdvdWxkIHRoZW4gbGVhZCB0byB0aGUgREVMRVRFIGVuZHBvaW50IGJlaW5nIGdlbmVyYXRlZCwgd2hpY2ggd2UgZG9uJ3Qgd2FudC4KCkluc3RlYWQsIHdlIGNhbiBkZWZpbmUgdGhlIGZvbGxvd2luZyBgb3ZlcmxheS55YW1sYDoKCgpgYGB5YW1sCm92ZXJsYXk6IDEuMC4wCmluZm86CiAgdGl0bGU6IE92ZXJsYXkKICB2ZXJzaW9uOiAwLjAuMAphY3Rpb25zOgotIHRhcmdldDogIiQiCiAgZGVzY3JpcHRpb246IFBlcmZvcm0gYSBzdHJ1Y3R1cmFsIG92ZXJsYXksIHdoaWNoIGNhbiBiZSBtb3JlIHJlYWRhYmxlLCBhcyBpdCdzIGNsZWFyIHdoYXQgdGhlIHNoYXBlIG9mIHRoZSBkb2N1bWVudCBpcwogIHVwZGF0ZToKICAgIGluZm86CiAgICAgIHgtb3ZlcmxheS1hcHBsaWVkOiBzdHJ1Y3R1cmVkLW92ZXJsYXkKICAgIHBhdGhzOgogICAgICAvcGluZzoKICAgICAgICBnZXQ6CiAgICAgICAgICByZXNwb25zZXM6CiAgICAgICAgICAgICcyMDAnOgogICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBQZXJmb3JtIGEgcGluZyByZXF1ZXN0Ci0gdGFyZ2V0OiAkLnBhdGhzLipbPyhALngtaW50ZXJuYWwpXQogIGRlc2NyaXB0aW9uOiBSZW1vdmUgaW50ZXJuYWwgZW5kcG9pbnRzIChub3RlZCBieSB4LWludGVybmFsKQogIHJlbW92ZTogdHJ1ZQotIHRhcmdldDogJC5wYXRocy4qLipbPyhALngtaW50ZXJuYWwpXQogIGRlc2NyaXB0aW9uOiBSZW1vdmUgaW50ZXJuYWwgZW5kcG9pbnRzIChub3RlZCBieSB4LWludGVybmFsKQogIHJlbW92ZTogdHJ1ZQpgYGAKCkFuZCBvdXIgY29uZmlndXJhdGlvbiBmaWxlIGZvciBgb2FwaS1jb2RlZ2VuYDoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogJHNjaGVtYT1odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9IRUFEL2NvbmZpZ3VyYXRpb24tc2NoZW1hLmpzb24KcGFja2FnZTogYXBpCm91dHB1dDogcGluZy5nZW4uZ28KZ2VuZXJhdGU6CiAgbW9kZWxzOiB0cnVlCiAgZ29yaWxsYS1zZXJ2ZXI6IHRydWUKICBlbWJlZGRlZC1zcGVjOiB0cnVlCm91dHB1dC1vcHRpb25zOgogIG92ZXJsYXk6CiAgICBwYXRoOiBvdmVybGF5LnlhbWwKYGBgCgpUaGlzIHRoZW4gY29tcGxldGVseSByZW1vdmVzIHRoZSBERUxFVEUgZW5kcG9pbnQgX2JlZm9yZV8gd2UgZXZlbiBzdGFydCB0byBwYXJzZSB0aGUgc3BlY2lmaWNhdGlvbiBpbiBgb2FwaS1jb2RlZ2VuYCwgc28gaXQncyBhcyBpZiB5b3VyIHNwZWNpZmljYXRpb24gd2FzIHByb3ZpZGVkIHdpdGhvdXQgdGhhdCBlbmRwb2ludC4KCkFkZGl0aW9uYWxseSwgd2UgY2FuIG92ZXJyaWRlIG90aGVyIHBpZWNlcyBvZiBtZXRhZGF0YSwgc3VjaCBhcyB0aGUgZGVzY3JpcHRpb24gZm9yIG9wZXJhdGlvbnMuCgpDaGVjayBvdXQgW3RoZSBvdmVybGF5IGV4YW1wbGVdKGV4YW1wbGVzL292ZXJsYXkvKSBmb3IgdGhlIGZ1bGwgY29kZSwgYW5kIHNvbWUgbW9yZSBjb21wbGV4IGV4YW1wbGVzLgoKIyMgR2VuZXJhdGluZyBOdWxsYWJsZSB0eXBlcwoKSXQncyBwb3NzaWJsZSB0aGF0IHlvdSB3YW50IHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBmaWVsZCBpc24ndCBzZW50LCBpcyBzZW50IGFzIGBudWxsYCBvciBoYXMgYSB2YWx1ZS4KCkZvciBpbnN0YW5jZSwgaWYgeW91IGhhZCB0aGUgZm9sbG93aW5nIE9wZW5BUEkgcHJvcGVydHk6CgpgYGB5YW1sClM6CiAgdHlwZTogb2JqZWN0CiAgcHJvcGVydGllczoKICAgIEZpZWxkOgogICAgICB0eXBlOiBzdHJpbmcKICAgICAgbnVsbGFibGU6IHRydWUKICAgIHJlcXVpcmVkOiBbXQpgYGAKClRoZSBkZWZhdWx0IGJlaGF2aW91ciBpbiBgb2FwaS1jb2RlZ2VuYCBpcyB0byBnZW5lcmF0ZToKCmBgYGdvCnR5cGUgUyBzdHJ1Y3QgewoJRmllbGQgKnN0cmluZyBganNvbjoiZmllbGQsb21pdGVtcHR5ImAKfQpgYGAKCkhvd2V2ZXIsIHlvdSBsb3NlIHRoZSBhYmlsaXR5IHRvIHVuZGVyc3RhbmQgdGhlIHRocmVlIGNhc2VzLCBhcyB0aGVyZSdzIG5vIHdheSB0byBkaXN0aW5ndWlzaCB0d28gb2YgdGhlIHR5cGVzIGZyb20gZWFjaCBvdGhlcjoKCi0gaXMgdGhpcyBmaWVsZCBub3Qgc2VudD8gKENhbiBiZSBjaGVja2VkIHdpdGggYFMuRmllbGQgPT0gbmlsYCkKLSBpcyB0aGlzIGZpZWxkIGBudWxsYD8gKENhbiBiZSBjaGVja2VkIHdpdGggYFMuRmllbGQgPT0gbmlsYCkKLSBkb2VzIHRoaXMgZmllbGQgaGF2ZSBhIHZhbHVlPyAoYFMuRmllbGQgIT0gbmlsICYmICpTLkZpZWxkID09ICIxMjMiYCkKCkFzIG9mIGBvYXBpLWNvZGVnZW5gIFt2Mi4xLjBdKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3JlbGVhc2VzL3RhZy92Mi4xLjApIGl0IGlzIG5vdyBwb3NzaWJsZSB0byByZXByZXNlbnQgdGhpcyB3aXRoIHRoZSBgbnVsbGFibGUuTnVsbGFibGVgIHR5cGUgZnJvbSBbb3VyIG5ldyBsaWJyYXJ5LCBvYXBpLWNvZGVnZW4vbnVsbGFibGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vbnVsbGFibGUpLgoKSWYgeW91IGNvbmZpZ3VyZSB5b3VyIGdlbmVyYXRvcidzIE91dHB1dCBPcHRpb25zIHRvIG9wdC1pbiB0byB0aGlzIGJlaGF2aW91ciwgYXMgc286CgpgYGB5YW1sCm91dHB1dC1vcHRpb25zOgogIG51bGxhYmxlLXR5cGU6IHRydWUKYGBgCgpZb3Ugd2lsbCBub3cgcmVjZWl2ZSB0aGUgZm9sbG93aW5nIG91dHB1dDoKCmBgYGdvCnR5cGUgUyBzdHJ1Y3QgewogICAgLy8gbm90ZSB0aGF0IHRoZXJlJ3Mgbm8gcG9pbnRlciBoZXJlLCBqdXN0IGBvbWl0ZW1wdHlgCiAgICBGaWVsZCBudWxsYWJsZS5OdWxsYWJsZVtzdHJpbmddIGBqc29uOiJmaWVsZCxvbWl0ZW1wdHkiYAp9CmBgYAoKIyMgT3BlbkFQSSBleHRlbnNpb25zCgpBcyB3ZWxsIGFzIHRoZSBjb3JlIE9wZW5BUEkgc3VwcG9ydCwgd2UgYWxzbyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgT3BlbkFQSSBleHRlbnNpb25zLCBhcyBkZW5vdGVkIGJ5IHRoZSBbT3BlbkFQSSBTcGVjaWZpY2F0aW9uIEV4dGVuc2lvbnNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuMyNzcGVjaWZpY2F0aW9uLWV4dGVuc2lvbnMpLgoKPHRhYmxlPgoKPHRyPgo8dGg+CkV4dGVuc2lvbgo8L3RoPgo8dGg+CkRlc2NyaXB0aW9uCjwvdGg+Cjx0aD4KRXhhbXBsZSB1c2FnZQo8L3RoPgo8L3RyPgoKPHRyPgo8dGQ+CgpgeC1nby10eXBlYCA8YnI+CmB4LWdvLXR5cGUtaW1wb3J0YAoKPC90ZD4KPHRkPgpPdmVycmlkZSB0aGUgZ2VuZXJhdGVkIHR5cGUgZGVmaW5pdGlvbiAoYW5kIG9wdGlvbmFsbHksIGFkZCBhbiBpbXBvcnQgZnJvbSBhbm90aGVyIHBhY2thZ2UpCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+CgpVc2luZyB0aGUgYHgtZ28tdHlwZWAgKGFuZCBvcHRpb25hbGx5LCBgeC1nby10eXBlLWltcG9ydGAgd2hlbiB5b3UgbmVlZCB0byBpbXBvcnQgYW5vdGhlciBwYWNrYWdlKSBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgdHlwZSB0aGF0IGBvYXBpLWNvZGVnZW5gIGRldGVybWluZWQgdGhlIGdlbmVyYXRlZCB0eXBlIHNob3VsZCBiZS4KCldlIGNhbiBzZWUgdGhpcyBhdCBwbGF5IHdpdGggdGhlIGZvbGxvd2luZyBzY2hlbWFzOgoKYGBgeWFtbApjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICBDbGllbnQ6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBudW1iZXIKICAgIENsaWVudFdpdGhFeHRlbnNpb246CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAjIHRoaXMgaXMgYSBiaXQgb2YgYSBjb250cml2ZWQgZXhhbXBsZSwgYXMgeW91IGNvdWxkIGluc3RlYWQgdXNlCiAgICAgICAgICAjIGBmb3JtYXQ6IHV1aWRgIGJ1dCBpdCBleHBsYWlucyBob3cgeW91J2QgZG8gdGhpcyB3aGVuIHRoZXJlIG1heSBiZQogICAgICAgICAgIyBhIGNsYXNoLCBmb3IgaW5zdGFuY2UgaWYgeW91IGFscmVhZHkgaGFkIGEgYHV1aWRgIHBhY2thZ2UgdGhhdCB3YXMKICAgICAgICAgICMgYmVpbmcgaW1wb3J0ZWQsIG9yIC4uLgogICAgICAgICAgeC1nby10eXBlOiBnb29nbGV1dWlkLlVVSUQKICAgICAgICAgIHgtZ28tdHlwZS1pbXBvcnQ6CiAgICAgICAgICAgIHBhdGg6IGdpdGh1Yi5jb20vZ29vZ2xlL3V1aWQKICAgICAgICAgICAgbmFtZTogZ29vZ2xldXVpZAogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogbnVtYmVyCiAgICAgICAgICAjIC4uLiB0aGlzIGlzIGFsc28gYSBiaXQgb2YgYSBjb250cml2ZWQgZXhhbXBsZSwgYXMgeW91IGNvdWxkIHVzZQogICAgICAgICAgIyBgdHlwZTogaW50ZWdlcmAgYnV0IGluIHRoZSBjYXNlIHRoYXQgeW91IGtub3cgYmV0dGVyIHRoYW4gd2hhdAogICAgICAgICAgIyBvYXBpLWNvZGVnZW4gaXMgZ2VuZXJhdGluZywgbGlrZSBzbzoKICAgICAgICAgIHgtZ28tdHlwZTogaW50NjQKYGBgCgpGcm9tIGhlcmUsIHdlIG5vdyBnZXQgdHdvIGRpZmZlcmVudCBtb2RlbHM6CgpgYGBnbwovLyBDbGllbnQgZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50Lgp0eXBlIENsaWVudCBzdHJ1Y3QgewoJSWQgICAqZmxvYXQzMiBganNvbjoiaWQsb21pdGVtcHR5ImAKCU5hbWUgc3RyaW5nICAgYGpzb246Im5hbWUiYAp9CgovLyBDbGllbnRXaXRoRXh0ZW5zaW9uIGRlZmluZXMgbW9kZWwgZm9yIENsaWVudFdpdGhFeHRlbnNpb24uCnR5cGUgQ2xpZW50V2l0aEV4dGVuc2lvbiBzdHJ1Y3QgewoJSWQgICAqaW50NjQgICAgICAgICAgYGpzb246ImlkLG9taXRlbXB0eSJgCglOYW1lIGdvb2dsZXV1aWQuVVVJRCBganNvbjoibmFtZSJgCn0KYGBgCgpZb3UgY2FuIHNlZSB0aGlzIGluIG1vcmUgZGV0YWlsIGluIFt0aGUgZXhhbXBsZSBjb2RlXShleGFtcGxlcy9leHRlbnNpb25zL3hnb3R5cGUvKS4KCjwvZGV0YWlscz4KPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKYHgtZ28tdHlwZS1za2lwLW9wdGlvbmFsLXBvaW50ZXJgCgo8L3RkPgo8dGQ+CkRvIG5vdCBhZGQgYSBwb2ludGVyIHR5cGUgZm9yIG9wdGlvbmFsIGZpZWxkcyBpbiBzdHJ1Y3RzCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+CgpCeSBkZWZhdWx0LCBgb2FwaS1jb2RlZ2VuYCB3aWxsIGdlbmVyYXRlIGEgcG9pbnRlciBmb3Igb3B0aW9uYWwgZmllbGRzLgoKVXNpbmcgdGhlIGB4LWdvLXR5cGUtc2tpcC1vcHRpb25hbC1wb2ludGVyYCBleHRlbnNpb24gYWxsb3dzIG9taXR0aW5nIHRoYXQgcG9pbnRlci4KCldlIGNhbiBzZWUgdGhpcyBhdCBwbGF5IHdpdGggdGhlIGZvbGxvd2luZyBzY2hlbWFzOgoKYGBgeWFtbApjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICBDbGllbnQ6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBudW1iZXIKICAgIENsaWVudFdpdGhFeHRlbnNpb246CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBudW1iZXIKICAgICAgICAgIHgtZ28tdHlwZS1za2lwLW9wdGlvbmFsLXBvaW50ZXI6IHRydWUKYGBgCgpGcm9tIGhlcmUsIHdlIG5vdyBnZXQgdHdvIGRpZmZlcmVudCBtb2RlbHM6CgpgYGBnbwovLyBDbGllbnQgZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50Lgp0eXBlIENsaWVudCBzdHJ1Y3QgewoJSWQgICAqZmxvYXQzMiBganNvbjoiaWQsb21pdGVtcHR5ImAKCU5hbWUgc3RyaW5nICAgYGpzb246Im5hbWUiYAp9CgovLyBDbGllbnRXaXRoRXh0ZW5zaW9uIGRlZmluZXMgbW9kZWwgZm9yIENsaWVudFdpdGhFeHRlbnNpb24uCnR5cGUgQ2xpZW50V2l0aEV4dGVuc2lvbiBzdHJ1Y3QgewoJSWQgICBmbG9hdDMyIGBqc29uOiJpZCxvbWl0ZW1wdHkiYAoJTmFtZSBzdHJpbmcgIGBqc29uOiJuYW1lImAKfQpgYGAKCllvdSBjYW4gc2VlIHRoaXMgaW4gbW9yZSBkZXRhaWwgaW4gW3RoZSBleGFtcGxlIGNvZGVdKGV4YW1wbGVzL2V4dGVuc2lvbnMveGdvdHlwZXNraXBvcHRpb25hbHBvaW50ZXIvKS4KCjwvZGV0YWlscz4KPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKYHgtZ28tbmFtZWAKCjwvdGQ+Cjx0ZD4KT3ZlcnJpZGUgdGhlIGdlbmVyYXRlZCBuYW1lIG9mIGEgZmllbGQgb3IgYSB0eXBlCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+CgpCeSBkZWZhdWx0LCBgb2FwaS1jb2RlZ2VuYCB3aWxsIGF0dGVtcHQgdG8gZ2VuZXJhdGUgdGhlIG5hbWUgb2YgZmllbGRzIGFuZCB0eXBlcyBpbiBhcyBiZXN0IGEgd2F5IGl0IGNhbi4KCkhvd2V2ZXIsIHNvbWV0aW1lcywgdGhlIG5hbWUgZG9lc24ndCBxdWl0ZSBmaXQgd2hhdCB5b3VyIGNvZGViYXNlIHN0YW5kYXJkcyBhcmUsIG9yIHRoZSBpbnRlbnQgb2YgdGhlIGZpZWxkLCBzbyB5b3UgY2FuIG92ZXJyaWRlIGl0IHdpdGggYHgtZ28tbmFtZWAuCgpXZSBjYW4gc2VlIHRoaXMgYXQgcGxheSB3aXRoIHRoZSBmb2xsb3dpbmcgc2NoZW1hczoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IHgtZ28tbmFtZQpjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICBDbGllbnQ6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBudW1iZXIKICAgIENsaWVudFdpdGhFeHRlbnNpb246CiAgICAgIHR5cGU6IG9iamVjdAogICAgICAjIGNhbiBiZSB1c2VkIG9uIGEgdHlwZQogICAgICB4LWdvLW5hbWU6IENsaWVudFJlbmFtZWRCeUV4dGVuc2lvbgogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBudW1iZXIKICAgICAgICAgICMgb3Igb24gYSBmaWVsZAogICAgICAgICAgeC1nby1uYW1lOiBBY2NvdW50SWRlbnRpZmllcgpgYGAKCkZyb20gaGVyZSwgd2Ugbm93IGdldCB0d28gZGlmZmVyZW50IG1vZGVsczoKCmBgYGdvCi8vIENsaWVudCBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnQuCnR5cGUgQ2xpZW50IHN0cnVjdCB7CglJZCAgICpmbG9hdDMyIGBqc29uOiJpZCxvbWl0ZW1wdHkiYAoJTmFtZSBzdHJpbmcgICBganNvbjoibmFtZSJgCn0KCi8vIENsaWVudFJlbmFtZWRCeUV4dGVuc2lvbiBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnRXaXRoRXh0ZW5zaW9uLgp0eXBlIENsaWVudFJlbmFtZWRCeUV4dGVuc2lvbiBzdHJ1Y3QgewoJQWNjb3VudElkZW50aWZpZXIgKmZsb2F0MzIgYGpzb246ImlkLG9taXRlbXB0eSJgCglOYW1lICAgICAgICAgICAgICBzdHJpbmcgICBganNvbjoibmFtZSJgCn0KYGBgCgpZb3UgY2FuIHNlZSB0aGlzIGluIG1vcmUgZGV0YWlsIGluIFt0aGUgZXhhbXBsZSBjb2RlXShleGFtcGxlcy9leHRlbnNpb25zL3hnb25hbWUvKS4KCjwvZGV0YWlscz4KPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKYHgtZ28tdHlwZS1uYW1lYAoKPC90ZD4KPHRkPgpPdmVycmlkZSB0aGUgZ2VuZXJhdGVkIG5hbWUgb2YgYSB0eXBlCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+Cgo+IFshTk9URV0KPiBOb3RpY2UgdGhhdCB0aGlzIGlzIHN1YnRseSBkaWZmZXJlbnQgdG8gdGhlIGB4LWdvLW5hbWVgLCB3aGljaCBhbHNvIGFwcGxpZXMgdG8gX2ZpZWxkc18gd2l0aGluIGBzdHJ1Y3Rgcy4KCkJ5IGRlZmF1bHQsIGBvYXBpLWNvZGVnZW5gIHdpbGwgYXR0ZW1wdCB0byBnZW5lcmF0ZSB0aGUgbmFtZSBvZiB0eXBlcyBpbiBhcyBiZXN0IGEgd2F5IGl0IGNhbi4KCkhvd2V2ZXIsIHNvbWV0aW1lcywgdGhlIG5hbWUgZG9lc24ndCBxdWl0ZSBmaXQgd2hhdCB5b3VyIGNvZGViYXNlIHN0YW5kYXJkcyBhcmUsIG9yIHRoZSBpbnRlbnQgb2YgdGhlIGZpZWxkLCBzbyB5b3UgY2FuIG92ZXJyaWRlIGl0IHdpdGggYHgtZ28tbmFtZWAuCgpXZSBjYW4gc2VlIHRoaXMgYXQgcGxheSB3aXRoIHRoZSBmb2xsb3dpbmcgc2NoZW1hczoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IHgtZ28tdHlwZS1uYW1lCmNvbXBvbmVudHM6CiAgc2NoZW1hczoKICAgIENsaWVudDoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gbmFtZQogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIG5hbWU6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgICBpZDoKICAgICAgICAgIHR5cGU6IG51bWJlcgogICAgQ2xpZW50V2l0aEV4dGVuc2lvbjoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHgtZ28tdHlwZS1uYW1lOiBDbGllbnRSZW5hbWVkQnlFeHRlbnNpb24KICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgbmFtZToKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogbnVtYmVyCiAgICAgICAgICAjIE5PVEUgYXR0ZW1wdGluZyBhIGB4LWdvLXR5cGUtbmFtZWAgaGVyZSBpcyBhIG5vLW9wLCBhcyB3ZSdyZSBub3QgcHJvZHVjaW5nIGEgX3R5cGVfIG9ubHkgYSBfZmllbGRfCiAgICAgICAgICB4LWdvLXR5cGUtbmFtZTogVGhpc1dpbGxOb3RCZVVzZWQKYGBgCgpGcm9tIGhlcmUsIHdlIG5vdyBnZXQgdHdvIGRpZmZlcmVudCBtb2RlbHMgYW5kIGEgdHlwZSBhbGlhczoKCmBgYGdvCi8vIENsaWVudCBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnQuCnR5cGUgQ2xpZW50IHN0cnVjdCB7CglJZCAgICpmbG9hdDMyIGBqc29uOiJpZCxvbWl0ZW1wdHkiYAoJTmFtZSBzdHJpbmcgICBganNvbjoibmFtZSJgCn0KCi8vIENsaWVudFdpdGhFeHRlbnNpb24gZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50V2l0aEV4dGVuc2lvbi4KdHlwZSBDbGllbnRXaXRoRXh0ZW5zaW9uID0gQ2xpZW50UmVuYW1lZEJ5RXh0ZW5zaW9uCgovLyBDbGllbnRSZW5hbWVkQnlFeHRlbnNpb24gZGVmaW5lcyBtb2RlbCBmb3IgLgp0eXBlIENsaWVudFJlbmFtZWRCeUV4dGVuc2lvbiBzdHJ1Y3QgewoJSWQgICAqZmxvYXQzMiBganNvbjoiaWQsb21pdGVtcHR5ImAKCU5hbWUgc3RyaW5nICAgYGpzb246Im5hbWUiYAp9CmBgYAoKWW91IGNhbiBzZWUgdGhpcyBpbiBtb3JlIGRldGFpbCBpbiBbdGhlIGV4YW1wbGUgY29kZV0oZXhhbXBsZXMvZXh0ZW5zaW9ucy94Z290eXBlbmFtZS8pLgoKPC9kZXRhaWxzPgo8L3RkPgo8L3RyPgoKPHRyPgo8dGQ+CgpgeC1vbWl0ZW1wdHlgCgo8L3RkPgo8dGQ+CkZvcmNlIHRoZSBwcmVzZW5jZSBvZiB0aGUgSlNPTiB0YWcgYG9taXRlbXB0eWAgb24gYSBmaWVsZAo8L3RkPgo8dGQ+CjxkZXRhaWxzPgoKSW4gYSBjYXNlIHRoYXQgeW91IG1heSB3YW50IHRvIGFkZCB0aGUgSlNPTiBzdHJ1Y3QgdGFnIGBvbWl0ZW1wdHlgIHRvIHR5cGVzIHRoYXQgZG9uJ3QgaGF2ZSBvbmUgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgLSBmb3IgaW5zdGFuY2UgYSByZXF1aXJlZCBmaWVsZCAtIHlvdSBjYW4gdXNlIHRoZSBgeC1vbWl0ZW1wdHlgIGV4dGVuc2lvbi4KCldlIGNhbiBzZWUgdGhpcyBhdCBwbGF5IHdpdGggdGhlIGZvbGxvd2luZyBzY2hlbWFzOgoKYGBgeWFtbApvcGVuYXBpOiAiMy4wLjAiCmluZm86CiAgdmVyc2lvbjogMS4wLjAKICB0aXRsZTogeC1vbWl0ZW1wdHkKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgQ2xpZW50OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgbmFtZToKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogbnVtYmVyCiAgICBDbGllbnRXaXRoRXh0ZW5zaW9uOgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgbmFtZToKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgIyBmb3Igc29tZSByZWFzb24sIHlvdSBtYXkgd2FudCB0aGlzIGJlaGF2aW91ciwgZXZlbiB0aG91Z2ggaXQncyBhIHJlcXVpcmVkIGZpZWxkCiAgICAgICAgICB4LW9taXRlbXB0eTogdHJ1ZQogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogbnVtYmVyCmBgYAoKRnJvbSBoZXJlLCB3ZSBub3cgZ2V0IHR3byBkaWZmZXJlbnQgbW9kZWxzOgoKYGBgZ28KLy8gQ2xpZW50IGRlZmluZXMgbW9kZWwgZm9yIENsaWVudC4KdHlwZSBDbGllbnQgc3RydWN0IHsKCUlkICAgKmZsb2F0MzIgYGpzb246ImlkLG9taXRlbXB0eSJgCglOYW1lIHN0cmluZyAgIGBqc29uOiJuYW1lImAKfQoKLy8gQ2xpZW50V2l0aEV4dGVuc2lvbiBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnRXaXRoRXh0ZW5zaW9uLgp0eXBlIENsaWVudFdpdGhFeHRlbnNpb24gc3RydWN0IHsKCUlkICAgKmZsb2F0MzIgYGpzb246ImlkLG9taXRlbXB0eSJgCglOYW1lIHN0cmluZyAgIGBqc29uOiJuYW1lLG9taXRlbXB0eSJgCn0KYGBgCgpOb3RpY2UgdGhhdCB0aGUgYENvbXBsZXhGaWVsZGAgaXMgc3RpbGwgZ2VuZXJhdGVkIGluIGZ1bGwsIGJ1dCB0aGUgdHlwZSB3aWxsIHRoZW4gYmUgaWdub3JlZCB3aXRoIEpTT04gbWFyc2hhbGxpbmcuCgpZb3UgY2FuIHNlZSB0aGlzIGluIG1vcmUgZGV0YWlsIGluIFt0aGUgZXhhbXBsZSBjb2RlXShleGFtcGxlcy9leHRlbnNpb25zL3hnb2pzb25pZ25vcmUvKS4KCjwvZGV0YWlscz4KPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKYHgtZ28tanNvbi1pZ25vcmVgCgo8L3RkPgo8dGQ+CldoZW4gKHVuKW1hcnNoYWxpbmcgSlNPTiwgaWdub3JlIGZpZWxkKHMpCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+CgpCeSBkZWZhdWx0LCBgb2FwaS1jb2RlZ2VuYCB3aWxsIGdlbmVyYXRlIGBqc29uOiIuLi4iYCBzdHJ1Y3QgdGFncyBmb3IgYWxsIGZpZWxkcyBpbiBhIHN0cnVjdCwgc28gSlNPTiAodW4pbWFyc2hhbGluZyB3b3Jrcy4KCkhvd2V2ZXIsIHNvbWV0aW1lcywgeW91IHdhbnQgdG8gb21pdCBmaWVsZHMsIHdoaWNoIGNhbiBiZSBkb25lIHdpdGggdGhlIGB4LWdvLWpzb24taWdub3JlYCBleHRlbnNpb24uCgpXZSBjYW4gc2VlIHRoaXMgYXQgcGxheSB3aXRoIHRoZSBmb2xsb3dpbmcgc2NoZW1hczoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IHgtZ28tanNvbi1pZ25vcmUKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgQ2xpZW50OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgbmFtZToKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgIGNvbXBsZXhGaWVsZDoKICAgICAgICAgIHR5cGU6IG9iamVjdAogICAgICAgICAgcHJvcGVydGllczoKICAgICAgICAgICAgbmFtZToKICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgICAgICAgYWNjb3VudE5hbWU6CiAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAjIC4uLgogICAgQ2xpZW50V2l0aEV4dGVuc2lvbjoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gbmFtZQogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIG5hbWU6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgICBjb21wbGV4RmllbGQ6CiAgICAgICAgICB0eXBlOiBvYmplY3QKICAgICAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgICAgIG5hbWU6CiAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAgIGFjY291bnROYW1lOgogICAgICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgIyAuLi4KICAgICAgICAgIHgtZ28tanNvbi1pZ25vcmU6IHRydWUKYGBgCgpGcm9tIGhlcmUsIHdlIG5vdyBnZXQgdHdvIGRpZmZlcmVudCBtb2RlbHM6CgpgYGBnbwovLyBDbGllbnQgZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50Lgp0eXBlIENsaWVudCBzdHJ1Y3QgewoJQ29tcGxleEZpZWxkICpzdHJ1Y3QgewoJCUFjY291bnROYW1lICpzdHJpbmcgYGpzb246ImFjY291bnROYW1lLG9taXRlbXB0eSJgCgkJTmFtZSAgICAgICAgKnN0cmluZyBganNvbjoibmFtZSxvbWl0ZW1wdHkiYAoJfSBganNvbjoiY29tcGxleEZpZWxkLG9taXRlbXB0eSJgCglOYW1lIHN0cmluZyBganNvbjoibmFtZSJgCn0KCi8vIENsaWVudFdpdGhFeHRlbnNpb24gZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50V2l0aEV4dGVuc2lvbi4KdHlwZSBDbGllbnRXaXRoRXh0ZW5zaW9uIHN0cnVjdCB7CglDb21wbGV4RmllbGQgKnN0cnVjdCB7CgkJQWNjb3VudE5hbWUgKnN0cmluZyBganNvbjoiYWNjb3VudE5hbWUsb21pdGVtcHR5ImAKCQlOYW1lICAgICAgICAqc3RyaW5nIGBqc29uOiJuYW1lLG9taXRlbXB0eSJgCgl9IGBqc29uOiItImAKCU5hbWUgc3RyaW5nIGBqc29uOiJuYW1lImAKfQpgYGAKCk5vdGljZSB0aGF0IHRoZSBgQ29tcGxleEZpZWxkYCBpcyBzdGlsbCBnZW5lcmF0ZWQgaW4gZnVsbCwgYnV0IHRoZSB0eXBlIHdpbGwgdGhlbiBiZSBpZ25vcmVkIHdpdGggSlNPTiBtYXJzaGFsbGluZy4KCllvdSBjYW4gc2VlIHRoaXMgaW4gbW9yZSBkZXRhaWwgaW4gW3RoZSBleGFtcGxlIGNvZGVdKGV4YW1wbGVzL2V4dGVuc2lvbnMveGdvanNvbmlnbm9yZS8pLgoKPC9kZXRhaWxzPgo8L3RkPgo8L3RyPgoKPHRyPgo8dGQ+CgpgeC1vYXBpLWNvZGVnZW4tZXh0cmEtdGFnc2AKCjwvdGQ+Cjx0ZD4KR2VuZXJhdGUgYXJiaXRyYXJ5IHN0cnVjdCB0YWdzIHRvIGZpZWxkcwo8L3RkPgo8dGQ+CjxkZXRhaWxzPgoKSWYgeW91J3JlIG1ha2luZyB1c2Ugb2YgYSBmaWVsZCdzIHN0cnVjdCB0YWdzIHRvIGkuZS4gYXBwbHkgdmFsaWRhdGlvbiwgZGVjaWRlIHdoZXRoZXIgc29tZXRoaW5nIHNob3VsZCBiZSBsb2dnZWQsIGV0YywgeW91IGNhbiB1c2UgYHgtb2FwaS1jb2RlZ2VuLWV4dHJhLXRhZ3NgIHRvIHNldCBhZGRpdGlvbmFsIHRhZ3MgZm9yIHlvdXIgZ2VuZXJhdGVkIHR5cGVzLgoKV2UgY2FuIHNlZSB0aGlzIGF0IHBsYXkgd2l0aCB0aGUgZm9sbG93aW5nIHNjaGVtYXM6CgpgYGB5YW1sCm9wZW5hcGk6ICIzLjAuMCIKaW5mbzoKICB2ZXJzaW9uOiAxLjAuMAogIHRpdGxlOiB4LW9hcGktY29kZWdlbi1leHRyYS10YWdzCmNvbXBvbmVudHM6CiAgc2NoZW1hczoKICAgIENsaWVudDoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gbmFtZQogICAgICAgIC0gaWQKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBudW1iZXIKICAgIENsaWVudFdpdGhFeHRlbnNpb246CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgICAtIGlkCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgbmFtZToKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogbnVtYmVyCiAgICAgICAgICB4LW9hcGktY29kZWdlbi1leHRyYS10YWdzOgogICAgICAgICAgICB2YWxpZGF0ZTogInJlcXVpcmVkLG1pbj0xLG1heD0yNTYiCiAgICAgICAgICAgIHNhZmUtdG8tbG9nOiAidHJ1ZSIKICAgICAgICAgICAgZ29ybTogcHJpbWFyeWtleQpgYGAKCkZyb20gaGVyZSwgd2Ugbm93IGdldCB0d28gZGlmZmVyZW50IG1vZGVsczoKCmBgYGdvCi8vIENsaWVudCBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnQuCnR5cGUgQ2xpZW50IHN0cnVjdCB7CglJZCAgIGZsb2F0MzIgYGpzb246ImlkImAKCU5hbWUgc3RyaW5nICBganNvbjoibmFtZSJgCn0KCi8vIENsaWVudFdpdGhFeHRlbnNpb24gZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50V2l0aEV4dGVuc2lvbi4KdHlwZSBDbGllbnRXaXRoRXh0ZW5zaW9uIHN0cnVjdCB7CglJZCAgIGZsb2F0MzIgYGdvcm06InByaW1hcnlrZXkiIGpzb246ImlkIiBzYWZlLXRvLWxvZzoidHJ1ZSIgdmFsaWRhdGU6InJlcXVpcmVkLG1pbj0xLG1heD0yNTYiYAoJTmFtZSBzdHJpbmcgIGBqc29uOiJuYW1lImAKfQpgYGAKCllvdSBjYW4gc2VlIHRoaXMgaW4gbW9yZSBkZXRhaWwgaW4gW3RoZSBleGFtcGxlIGNvZGVdKGV4YW1wbGVzL2V4dGVuc2lvbnMveG9hcGljb2RlZ2VuZXh0cmF0YWdzLykuCgo8L2RldGFpbHM+CjwvdGQ+CjwvdHI+Cgo8dHI+Cjx0ZD4KCmB4LWVudW0tdmFybmFtZXNgIC8gYHgtZW51bU5hbWVzYAoKPC90ZD4KPHRkPgpPdmVycmlkZSBnZW5lcmF0ZWQgdmFyaWFibGUgbmFtZXMgZm9yIGVudW0gY29uc3RhbnRzCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+CgpXaGVuIGNvbnN1bWluZyBhbiBlbnVtIHZhbHVlIGZyb20gYW4gZXh0ZXJuYWwgc3lzdGVtLCB0aGUgbmFtZSBtYXkgbm90IHByb2R1Y2UgYSBuaWNlIHZhcmlhYmxlIG5hbWUuIFVzaW5nIHRoZSBgeC1lbnVtLXZhcm5hbWVzYCBleHRlbnNpb24gYWxsb3dzIG92ZXJyaWRpbmcgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCB2YXJpYWJsZSBuYW1lcy4KCldlIGNhbiBzZWUgdGhpcyBhdCBwbGF5IHdpdGggdGhlIGZvbGxvd2luZyBzY2hlbWFzOgoKYGBgeWFtbApvcGVuYXBpOiAiMy4wLjAiCmluZm86CiAgdmVyc2lvbjogMS4wLjAKICB0aXRsZTogeC1lbnVtTmFtZXMgYW5kIHgtZW51bS12YXJuYW1lcwpjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICBDbGllbnRUeXBlOgogICAgICB0eXBlOiBzdHJpbmcKICAgICAgZW51bToKICAgICAgICAtIEFDVAogICAgICAgIC0gRVhQCiAgICBDbGllbnRUeXBlV2l0aE5hbWVzRXh0ZW5zaW9uOgogICAgICB0eXBlOiBzdHJpbmcKICAgICAgZW51bToKICAgICAgICAtIEFDVAogICAgICAgIC0gRVhQCiAgICAgIHgtZW51bU5hbWVzOgogICAgICAgIC0gQWN0aXZlCiAgICAgICAgLSBFeHBpcmVkCiAgICBDbGllbnRUeXBlV2l0aFZhck5hbWVzRXh0ZW5zaW9uOgogICAgICB0eXBlOiBzdHJpbmcKICAgICAgZW51bToKICAgICAgICAtIEFDVAogICAgICAgIC0gRVhQCiAgICAgIHgtZW51bS12YXJuYW1lczoKICAgICAgICAtIEFjdGl2ZQogICAgICAgIC0gRXhwaXJlZApgYGAKCkZyb20gaGVyZSwgd2Ugbm93IGdldCB0d28gZGlmZmVyZW50IGZvcm1zIG9mIHRoZSBzYW1lIGVudW0gZGVmaW5pdGlvbi4KCmBgYGdvCi8vIERlZmluZXMgdmFsdWVzIGZvciBDbGllbnRUeXBlLgpjb25zdCAoCglBQ1QgQ2xpZW50VHlwZSA9ICJBQ1QiCglFWFAgQ2xpZW50VHlwZSA9ICJFWFAiCikKCi8vIENsaWVudFR5cGUgZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50VHlwZS4KdHlwZSBDbGllbnRUeXBlIHN0cmluZwoKLy8gRGVmaW5lcyB2YWx1ZXMgZm9yIENsaWVudFR5cGVXaXRoRXh0ZW5zaW9uLgpjb25zdCAoCglBY3RpdmUgIENsaWVudFR5cGVXaXRoRXh0ZW5zaW9uID0gIkFDVCIKCUV4cGlyZWQgQ2xpZW50VHlwZVdpdGhFeHRlbnNpb24gPSAiRVhQIgopCgovLyBDbGllbnRUeXBlV2l0aEV4dGVuc2lvbiBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnRUeXBlV2l0aEV4dGVuc2lvbi4KdHlwZSBDbGllbnRUeXBlV2l0aEV4dGVuc2lvbiBzdHJpbmcKYGBgCgpZb3UgY2FuIHNlZSB0aGlzIGluIG1vcmUgZGV0YWlsIGluIFt0aGUgZXhhbXBsZSBjb2RlXShleGFtcGxlcy9leHRlbnNpb25zL3hlbnVtdmFybmFtZXMvKS4KCjwvZGV0YWlscz4KPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKYHgtZGVwcmVjYXRlZC1yZWFzb25gCgo8L3RkPgo8dGQ+CkFkZCBhIEdvRG9jIGRlcHJlY2F0aW9uIHdhcm5pbmcgdG8gYSB0eXBlCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+CgpXaGVuIGFuIE9wZW5BUEkgdHlwZSBpcyBkZXByZWNhdGVkLCBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgY2FuIGJlIGFkZGVkIGluIHRoZSBHb0RvYyB1c2luZyBgeC1kZXByZWNhdGVkLXJlYXNvbmAuCgpXZSBjYW4gc2VlIHRoaXMgYXQgcGxheSB3aXRoIHRoZSBmb2xsb3dpbmcgc2NoZW1hczoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IHgtZGVwcmVjYXRlZC1yZWFzb24KY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgQ2xpZW50OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgbmFtZToKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogbnVtYmVyCiAgICBDbGllbnRXaXRoRXh0ZW5zaW9uOgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgbmFtZToKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgZGVwcmVjYXRlZDogdHJ1ZQogICAgICAgICAgeC1kZXByZWNhdGVkLXJlYXNvbjogRG9uJ3QgdXNlIGJlY2F1c2UgcmVhc29ucwogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogbnVtYmVyCiAgICAgICAgICAjIE5PVEUgdGhhdCB0aGlzIGRvZXNuJ3QgZ2VuZXJhdGUsIGFzIG5vIGBkZXByZWNhdGVkOiB0cnVlYCBpcyBzZXQKICAgICAgICAgIHgtZGVwcmVjYXRlZC1yZWFzb246IE5PVEUgeW91IHNob3VsZG4ndCBzZWUgdGhpcywgYXMgeW91J3ZlIG5vdCBkZXByZWNhdGVkIHRoaXMgZmllbGQKYGBgCgpGcm9tIGhlcmUsIHdlIG5vdyBnZXQgdHdvIGRpZmZlcmVudCBmb3JtcyBvZiB0aGUgc2FtZSBlbnVtIGRlZmluaXRpb24uCgpgYGBnbwovLyBDbGllbnQgZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50Lgp0eXBlIENsaWVudCBzdHJ1Y3QgewoJSWQgICAqZmxvYXQzMiBganNvbjoiaWQsb21pdGVtcHR5ImAKCU5hbWUgc3RyaW5nICAgYGpzb246Im5hbWUiYAp9CgovLyBDbGllbnRXaXRoRXh0ZW5zaW9uIGRlZmluZXMgbW9kZWwgZm9yIENsaWVudFdpdGhFeHRlbnNpb24uCnR5cGUgQ2xpZW50V2l0aEV4dGVuc2lvbiBzdHJ1Y3QgewoJSWQgKmZsb2F0MzIgYGpzb246ImlkLG9taXRlbXB0eSJgCgkvLyBEZXByZWNhdGVkOiBEb24ndCB1c2UgYmVjYXVzZSByZWFzb25zCglOYW1lIHN0cmluZyBganNvbjoibmFtZSJgCn0KYGBgCgpOb3RpY2UgdGhhdCBiZWNhdXNlIHdlJ3ZlIG5vdCBzZXQgYGRlcHJlY2F0ZWQ6IHRydWVgIHRvIHRoZSBgbmFtZWAgZmllbGQsIGl0IGRvZXNuJ3QgZ2VuZXJhdGUgYSBkZXByZWNhdGlvbiB3YXJuaW5nLgoKWW91IGNhbiBzZWUgdGhpcyBpbiBtb3JlIGRldGFpbCBpbiBbdGhlIGV4YW1wbGUgY29kZV0oZXhhbXBsZXMvZXh0ZW5zaW9ucy94ZGVwcmVjYXRlZHJlYXNvbi8pLgoKPC9kZXRhaWxzPgo8L3RkPgo8L3RyPgoKPHRyPgo8dGQ+CgpgeC1vcmRlcmAKCjwvdGQ+Cjx0ZD4KRXhwbGljaXRseSBvcmRlciBzdHJ1Y3QgZmllbGRzCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+CgpXaGV0aGVyIHlvdSBsaWtlIGNlcnRhaW4gZmllbGRzIGJlaW5nIG9yZGVyZWQgYmVmb3JlIG90aGVycywgb3IgeW91IHdhbnQgdG8gcGVyZm9ybSBtb3JlIGVmZmljaWVudCBwYWNraW5nIG9mIHlvdXIgc3RydWN0cywgdGhlIGB4LW9yZGVyYCBleHRlbnNpb24gaXMgaGVyZSBmb3IgeW91LgoKTm90ZSB0aGF0IGB4LW9yZGVyYCBpcyAxLWluZGV4ZWQgLSBgeC1vcmRlcjogMGAgaXMgbm90IGEgdmFsaWQgdmFsdWUuCgpXaGVuIGFuIE9wZW5BUEkgdHlwZSBpcyBkZXByZWNhdGVkLCBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgY2FuIGJlIGFkZGVkIGluIHRoZSBHb0RvYyB1c2luZyBgeC1kZXByZWNhdGVkLXJlYXNvbmAuCgpXZSBjYW4gc2VlIHRoaXMgYXQgcGxheSB3aXRoIHRoZSBmb2xsb3dpbmcgc2NoZW1hczoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IHgtb3JkZXIKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgQ2xpZW50OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgYV9uYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBudW1iZXIKICAgIENsaWVudFdpdGhFeHRlbnNpb246CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBhX25hbWU6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgICAgIHgtb3JkZXI6IDIKICAgICAgICBpZDoKICAgICAgICAgIHR5cGU6IG51bWJlcgogICAgICAgICAgeC1vcmRlcjogMQpgYGAKCkZyb20gaGVyZSwgd2Ugbm93IGdldCB0d28gZGlmZmVyZW50IGZvcm1zIG9mIHRoZSBzYW1lIHR5cGUgZGVmaW5pdGlvbi4KCmBgYGdvCi8vIENsaWVudCBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnQuCnR5cGUgQ2xpZW50IHN0cnVjdCB7CglBTmFtZSAqc3RyaW5nICBganNvbjoiYV9uYW1lLG9taXRlbXB0eSJgCglJZCAgICAqZmxvYXQzMiBganNvbjoiaWQsb21pdGVtcHR5ImAKfQoKLy8gQ2xpZW50V2l0aEV4dGVuc2lvbiBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnRXaXRoRXh0ZW5zaW9uLgp0eXBlIENsaWVudFdpdGhFeHRlbnNpb24gc3RydWN0IHsKCUlkICAgICpmbG9hdDMyIGBqc29uOiJpZCxvbWl0ZW1wdHkiYAoJQU5hbWUgKnN0cmluZyAgYGpzb246ImFfbmFtZSxvbWl0ZW1wdHkiYAp9CmBgYAoKWW91IGNhbiBzZWUgdGhpcyBpbiBtb3JlIGRldGFpbCBpbiBbdGhlIGV4YW1wbGUgY29kZV0oZXhhbXBsZXMvZXh0ZW5zaW9ucy94b3JkZXIvKS4KCjwvZGV0YWlscz4KPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKYHgtb2FwaS1jb2RlZ2VuLW9ubHktaG9ub3VyLWdvLW5hbWVgCgo8L3RkPgo8dGQ+Ck9ubHkgaG9ub3VyIHRoZSBgeC1nby1uYW1lYCB3aGVuIGdlbmVyYXRpbmcgZmllbGQgbmFtZXMKPC90ZD4KPHRkPgo8ZGV0YWlscz4KCj4gWyFXQVJOSU5HXQo+IFVzaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvIGNhc2VzIHdoZXJlIGBvYXBpLWNvZGVnZW5gJ3MgcmV3cml0aW5nIG9mIGZpZWxkIG5hbWVzIHRvIHByZXZlbnQgY2xhc2hlcyB3aXRoIG90aGVyIHR5cGVzLCBvciB0byBwcmV2ZW50IGluY2x1ZGluZyBjaGFyYWN0ZXJzIHRoYXQgbWF5IG5vdCBiZSB2YWxpZCBHbyBmaWVsZCBuYW1lcy4KCkluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdXNlIHRoZSBpbmJ1aWx0IG9wdGlvbnMgZm9yIGNvbnZlcnRpbmcgYW4gT3BlbkFQSSBmaWVsZCBuYW1lIHRvIGEgR28gZmllbGQgbmFtZSwgc3VjaCBhcyB0aGUgYG5hbWUtbm9ybWFsaXplcjogIlRvQ2FtZWxDYXNlV2l0aEluaXRpYWxpc21zImAsIGFuZCBpbnN0ZWFkIHRydXN0IHRoZSBuYW1lIHRoYXQgeW91J3ZlIGRlZmluZWQgZm9yIHRoZSB0eXBlIGJldHRlci4KCkluIHRoaXMgY2FzZSwgeW91IGNhbiB1c2UgYHgtb2FwaS1jb2RlZ2VuLW9ubHktaG9ub3VyLWdvLW5hbWVgIHRvIGVuZm9yY2UgdGhpcywgYWxvbmdzaWRlIHNwZWNpZnlpbmcgdGhlIGBhbGxvdy11bmV4cG9ydGVkLXN0cnVjdC1maWVsZC1uYW1lc2AgY29tcGF0aWJpbGl0eSBvcHRpb24uCgpUaGlzIGFsbG93cyB5b3UgdG8gdGFrZSBhIHNwZWMgc3VjaCBhczoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IHgtb2FwaS1jb2RlZ2VuLW9ubHktaG9ub3VyLWdvLW5hbWUKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgVHlwZVdpdGhVbmV4cG9ydGVkRmllbGQ6CiAgICAgIGRlc2NyaXB0aW9uOiBBIHN0cnVjdCB3aWxsIGJlIG91dHB1dCB3aGVyZSBvbmUgb2YgdGhlIGZpZWxkcyBpcyBub3QgZXhwb3J0ZWQKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgICAgICMgTk9URSB0aGF0IHRoZXJlIGlzIGFuIGV4cGxpY2l0IHVzYWdlIG9mIGEgbG93ZXJjYXNlIGNoYXJhY3RlcgogICAgICAgICAgeC1nby1uYW1lOiBhY2NvdW50SWRlbnRpZmllcgogICAgICAgICAgeC1vYXBpLWNvZGVnZW4tZXh0cmEtdGFnczoKICAgICAgICAgICAganNvbjogIi0iCiAgICAgICAgICB4LW9hcGktY29kZWdlbi1vbmx5LWhvbm91ci1nby1uYW1lOiB0cnVlCmBgYAoKQW5kIHdlJ2xsIGdlbmVyYXRlOgoKYGBgZ28KLy8gVHlwZVdpdGhVbmV4cG9ydGVkRmllbGQgQSBzdHJ1Y3Qgd2lsbCBiZSBvdXRwdXQgd2hlcmUgb25lIG9mIHRoZSBmaWVsZHMgaXMgbm90IGV4cG9ydGVkCnR5cGUgVHlwZVdpdGhVbmV4cG9ydGVkRmllbGQgc3RydWN0IHsKCWFjY291bnRJZGVudGlmaWVyICpzdHJpbmcgYGpzb246Ii0iYAoJTmFtZSAgICAgICAgICAgICAgKnN0cmluZyBganNvbjoibmFtZSxvbWl0ZW1wdHkiYAp9CmBgYAoKWW91IGNhbiBzZWUgdGhpcyBpbiBtb3JlIGRldGFpbCBpbiBbdGhlIGV4YW1wbGUgY29kZV0oZXhhbXBsZXMvZXh0ZW5zaW9ucy94b2FwaWNvZGVnZW5vbmx5aG9ub3VyZ29uYW1lKS4KCjwvZGV0YWlscz4KPC90ZD4KPC90cj4KCjwvdGFibGU+CgojIyBSZXF1ZXN0L3Jlc3BvbnNlIHZhbGlkYXRpb24gbWlkZGxld2FyZQoKVGhlIGdlbmVyYXRlZCBjb2RlIHRoYXQgYG9hcGktY29kZWdlbmAgcHJvZHVjZXMgaGFzIHNvbWUgdmFsaWRhdGlvbiBmb3Igc29tZSBpbmNvbWluZyBkYXRhLCBzdWNoIGFzIGNoZWNraW5nIGZvciByZXF1aXJlZCBoZWFkZXJzLCBhbmQgd2hlbiB1c2luZyB0aGUgW3N0cmljdCBzZXJ2ZXJdKCNzdHJpY3Qtc2VydmVyKSB5b3UgZ2V0IHNvbWUgbW9yZSB2YWxpZGF0aW9uIGFyb3VuZCB0aGUgY29ycmVjdCB1c2FnZSBvZiB0aGUgcmVzcG9uc2UgdHlwZXMuCgpIb3dldmVyLCB0aGlzIGxlYXZlcyBhIGxvdCBvZiB2YWxpZGF0aW9uIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSwgd2hpY2ggY2FuIGJlIHRlZGlvdXMgdG8gaGFuZC13cml0ZSB0aGlzIGxvZ2ljLCBlc3BlY2lhbGx5IGZvciBsYXJnZSBvciBjb21wbGV4IE9wZW5BUEkgc3BlY2lmaWNhdGlvbnMuCgpUbyBzaW1wbGlmeSB0aGlzLCB3ZSB1c2UgYSBtaWRkbGV3YXJlLCB3aGljaCBwcm92aWRlcyB0aGUgcmVxdWVzdCB2YWxpZGF0aW9uLiBUaGUgbWlkZGxld2FyZSB5b3Ugd2FudCB0byB1c2UgZGVwZW5kcyBvbiB0aGUgc2VydmVyIHlvdSdyZSB1c2luZzoKCjx0YWJsZT4KCjx0cj4KPHRoPgpTZXJ2ZXIKPC90aD4KPHRoPgpNaWRkbGV3YXJlIGxpYnJhcnkKPC90aD4KPC90cj4KCjx0cj4KPHRkPgoKW0NoaV0oaHR0cHM6Ly9naXRodWIuY29tL2dvLWNoaS9jaGkpCgo8L3RkPgo8dGQ+CgpbbmV0aHR0cC1taWRkbGV3YXJlXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL25ldGh0dHAtbWlkZGxld2FyZSkKCjwvdGQ+CjwvdHI+Cgo8dHI+Cjx0ZD4KCltFY2hvXShodHRwczovL2dpdGh1Yi5jb20vbGFic3RhY2svZWNobykKCjwvdGQ+Cjx0ZD4KCltlY2hvLW1pZGRsZXdhcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vZWNoby1taWRkbGV3YXJlKQoKPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKW0ZpYmVyXShodHRwczovL2dpdGh1Yi5jb20vZ29maWJlci9maWJlcikKCjwvdGQ+Cjx0ZD4KCltmaWJlci1taWRkbGV3YXJlXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL2ZpYmVyLW1pZGRsZXdhcmUpCgo8L3RkPgoKPC90cj4KCgo8dHI+Cjx0ZD4KCltHaW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9naW4tZ29uaWMvZ2luKQoKPC90ZD4KPHRkPgoKW2dpbi1taWRkbGV3YXJlXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL2dpbi1taWRkbGV3YXJlKQoKPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKW2dvcmlsbGEvbXV4XShodHRwczovL2dpdGh1Yi5jb20vZ29yaWxsYS9tdXgpCgo8L3RkPgo8dGQ+CgpbbmV0aHR0cC1taWRkbGV3YXJlXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL25ldGh0dHAtbWlkZGxld2FyZSkKCjwvdGQ+Cgo8L3RyPgoKPHRyPgo8dGQ+CgpbSXJpc10oaHR0cHM6Ly9naXRodWIuY29tL2thdGFyYXMvaXJpcykKCjwvdGQ+Cjx0ZD4KCltpcmlzLW1pZGRsZXdhcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vaXJpcy1taWRkbGV3YXJlKQoKPC90ZD4KCjwvdHI+Cgo8dHI+Cjx0ZD4KClsxLjIyKyBgbmV0L2h0dHBgXShodHRwczovL3BrZy5nby5kZXYvbmV0L2h0dHApCgo8L3RkPgo8dGQ+CgpbbmV0aHR0cC1taWRkbGV3YXJlXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL25ldGh0dHAtbWlkZGxld2FyZSkKCjwvdGQ+Cgo8L3RyPgoKPC90YWJsZT4KCj4gWyFOT1RFXQo+IEl0IGlzIFtub3QgY3VycmVudGx5IHBvc3NpYmxlXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9pc3N1ZXMvMTAzOCkgdG8gdmFsaWRhdGUgdGhlIEhUVFAgcmVzcG9uc2Ugd2l0aCBhIG1pZGRsZXdhcmUuCgo+IFshTk9URV0KPiBXZSdyZSBhbHNvIFtleHBsb3JpbmddKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vZXhwL2lzc3Vlcy8xKSB0aGUgdXNlIG9mIFtsaWJvcGVuYXBpLXZhbGlkYXRvcl0oaHR0cHM6Ly9naXRodWIuY29tL3BiMzNmL2xpYm9wZW5hcGktdmFsaWRhdG9yLykgZm9yIHJlcXVlc3QvcmVzcG9uc2UgdmFsaWRhdGlvbiBtaWRkbGV3YXJlCgojIyBJbXBsZW1lbnRpbmcgc2VjdXJpdHkKCklmIHlvdSdyZSB1c2luZyBhIHNwZWNpZmljYXRpb24gd2l0aCBbU2VjdXJpdHkgU2NoZW1lc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC4zI3NlY3VyaXR5LXNjaGVtZS1vYmplY3QpIGFuZCBbU2VjdXJpdHkgUmVxdWlyZW1lbnRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjMjc2VjdXJpdHktcmVxdWlyZW1lbnQtb2JqZWN0KSwgeW91J2xsIHdhbnQgdG8gYXV0aGVudGljYXRlIGFuZCBhdXRob3JpemUgcmVxdWVzdHMuCgojIyMgT24gdGhlIHNlcnZlcgoKPiBbIU5PVEVdCj4gT3V0LW9mLXRoZS1ib3gsIHRoZSBzZXJ2ZXItc2lkZSBjb2RlIGdlbmVyYXRlZCBieSBgb2FwaS1jb2RlZ2VuYCBkb2VzIG5vdCBwcm92aWRlIHNlY3VyaXR5IHZhbGlkYXRpb24uCj4KPiBUbyBwZXJmb3JtIGF1dGhlbnRpY2F0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIHVzZSB0aGUgW3ZhbGlkYXRpb24gbWlkZGxld2FyZV0oI3JlcXVlc3QtcmVzcG9uc2UtdmFsaWRhdGlvbi1taWRkbGV3YXJlKS4KPgo+IEluIHRoZSBmdXR1cmUsIHdlIHBsYW4gdG8gW2ltcGxlbWVudCBzZXJ2ZXItc2lkZSB2YWxpZGF0aW9uIGluIHRoZSBnZW5lcmF0ZWQgY29kZV0oaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vaXNzdWVzLzE1MjQpCgpUbyBzZWUgaG93IHRoaXMgY2FuIHdvcmssIGNoZWNrIG91dCB0aGUgW2F1dGhlbnRpY2F0ZWQgQVBJIGV4YW1wbGVdKGV4YW1wbGVzL2F1dGhlbnRpY2F0ZWQtYXBpL2VjaG8pLgoKIyMjIE9uIHRoZSBjbGllbnQKCldpdGggYSBnZW5lcmF0ZWQgY2xpZW50LCB5b3UnbGwgd2FudCB0byB1c2UgdGhlIGNsaWVudCdzIGdlbmVyYXRlZCBgV2l0aFJlcXVlc3RFZGl0b3JGbmAgZnVuY3Rpb24gdG8gcGFzcyBpbiBhIGdpdmVuIHJlcXVlc3QgZWRpdG9yIGBSZXF1ZXN0RWRpdG9yRm5gLgoKRm9yIGluc3RhbmNlOgoKYGBgZ28KaW1wb3J0ICgKCSJjb250ZXh0IgoJImZtdCIKCSJsb2ciCgoJImdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9wa2cvc2VjdXJpdHlwcm92aWRlciIKKQoKZnVuYyBtYWluKCkgewoJYmFzaWNBdXRoLCBlcnIgOj0gc2VjdXJpdHlwcm92aWRlci5OZXdTZWN1cml0eVByb3ZpZGVyQmFzaWNBdXRoKCJteV91c2VyIiwgIm15X3Bhc3MiKQoJaWYgZXJyICE9IG5pbCB7CgkJbG9nLkZhdGFsKGVycikKCX0KCgljbGllbnQsIGVyciA6PSBOZXdDbGllbnQoImh0dHBzOi8vLi4uLiIsIFdpdGhSZXF1ZXN0RWRpdG9yRm4oYmFzaWNBdXRoLkludGVyY2VwdCkpCglpZiBlcnIgIT0gbmlsIHsKCQlsb2cuRmF0YWwoZXJyKQoJfQoKCXJlc3AsIGVyciA6PSBjbGllbnQuR2V0Q2xpZW50KGNvbnRleHQuVE9ETygpKQoJaWYgZXJyICE9IG5pbCB7CgkJbG9nLkZhdGFsKGVycikKCX0KCWZtdC5QcmludGYoInJlc3AuU3RhdHVzQ29kZTogJXZcbiIsIHJlc3AuU3RhdHVzQ29kZSkKfQpgYGAKCk5vdGljZSB0aGF0IHdlJ3JlIHVzaW5nIGEgcHJlLWJ1aWx0IHByb3ZpZGVyIGZyb20gdGhlIFtgcGtnL3NlY3VyaXR5cHJvdmlkZXJgIHBhY2thZ2VdKGh0dHBzOi8vcGtnLmdvLmRldi9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvcGtnL3NlY3VyaXR5cHJvdmlkZXIpLCB3aGljaCBoYXMgc29tZSBpbmJ1aWx0IHN1cHBvcnQgZm9yIG90aGVyIHR5cGVzIG9mIGF1dGhlbnRpY2F0aW9uLCB0b28uCgojIyBDdXN0b20gY29kZSBnZW5lcmF0aW9uCgpJdCBpcyBwb3NzaWJsZSB0byBleHRlbmQgdGhlIGluYnVpbHQgY29kZSBnZW5lcmF0aW9uIGZyb20gYG9hcGktY29kZWdlbmAgdXNpbmcgR28ncyBgdGV4dC90ZW1wbGF0ZWBzLgoKWW91IGNhbiBzcGVjaWZ5LCB0aHJvdWdoIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlLCB0aGUgYG91dHB1dC1vcHRpb25zLnVzZXItdGVtcGxhdGVzYCBzZXR0aW5nIHRvIG92ZXJyaWRlIHRoZSBpbmJ1aWx0IHRlbXBsYXRlcyBhbmQgdXNlIGEgdXNlci1kZWZpbmVkIHRlbXBsYXRlLgoKPiBbIU5PVEVdCj4gRmlsZW5hbWVzIGdpdmVuIHRvIHRoZSBgdXNlci10ZW1wbGF0ZXNgIGNvbmZpZ3VyYXRpb24gbXVzdCAqKmV4YWN0bHkqKiBtYXRjaCB0aGUgZmlsZW5hbWUgdGhhdCBgb2FwaS1jb2RlZ2VuYCBpcyBsb29raW5nIGZvcgoKIyMjIExvY2FsIHBhdGhzCgpXaXRoaW4geW91ciBjb25maWd1cmF0aW9uIGZpbGUsIHlvdSBjYW4gc3BlY2lmeSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRocyB0byBhIGZpbGUgdG8gcmVmZXJlbmNlIGZvciB0aGUgdGVtcGxhdGUsIHN1Y2ggYXM6CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6ICRzY2hlbWE9aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vSEVBRC9jb25maWd1cmF0aW9uLXNjaGVtYS5qc29uCiMgLi4uCm91dHB1dC1vcHRpb25zOgogIHVzZXItdGVtcGxhdGVzOgogICAgY2xpZW50LXdpdGgtcmVzcG9uc2VzLnRtcGw6IC4vY3VzdG9tLXRlbXBsYXRlLnRtcGwKICAgIGFkZGl0aW9uYWwtcHJvcGVydGllcy50bXBsOiAvdG1wL2Zvby5iYXIKICAgIHR5cGVkZWYudG1wbDogbm8tcHJlZml4LnRtcGwKYGBgCgo+IFshV0FSTl0KPiBXZSBkbyBub3QgaW50ZXJwb2xhdGUgYH5gIG9yIGAkSE9NRWAgKG9yIG90aGVyIGVudmlyb25tZW50IHZhcmlhYmxlcykgaW4gcGF0aHMgZ2l2ZW4KCiMjIyBIVFRQUyBwYXRocwoKSXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UgSFRUUFMgVVJMcy4KCj4gWyFXQVJOSU5HXQo+IEFsdGhvdWdoIHBvc3NpYmxlLCB0aGlzIGRvZXMgbGVhZCB0byBgb2FwaS1jb2RlZ2VuYCBleGVjdXRpb25zIG5vdCBuZWNlc3NhcmlseSBiZWluZyByZXByb2R1Y2libGUuIEl0J3MgcmVjb21tZW5kZWQgdG8gdmVuZG9yIChjb3B5KSB0aGUgT3BlbkFQSSBzcGVjIGludG8geW91ciBjb2RlYmFzZSBhbmQgcmVmZXJlbmNlIGl0IGxvY2FsbHkKPgo+IFNlZSBbdGhpcyBibG9nIHBvc3RdKGh0dHBzOi8vd3d3Lmp2dC5tZS9wb3N0cy8yMDI0LzA0LzI3L2dpdGh1Yi1hY3Rpb25zLXVwZGF0ZS1maWxlLykgZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBHaXRIdWIgQWN0aW9ucyB0byBtYW5hZ2UgdGhlIHVwZGF0ZXMgb2YgZmlsZXMgYWNyb3NzIHJlcG9zCj4KPiBUaGlzIHdpbGwgYmUgZGlzYWJsZWQgYnkgZGVmYXVsdCAoYnV0IHBvc3NpYmxlIHRvIHR1cm4gYmFjayBvbiB2aWEgY29uZmlndXJhdGlvbikgW2luIHRoZSBmdXR1cmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL2lzc3Vlcy8xNTY0KQoKVG8gdXNlIGl0LCB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb246CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6ICRzY2hlbWE9aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vSEVBRC9jb25maWd1cmF0aW9uLXNjaGVtYS5qc29uCiMgLi4uCm91dHB1dC1vcHRpb25zOgogIHVzZXItdGVtcGxhdGVzOgogICAgIyBUaGUgZm9sbG93aW5nIGFyZSByZWZlcmVuY2luZyBhIHZlcnNpb24gb2YgdGhlIGRlZmF1bHQgY2xpZW50LXdpdGgtcmVzcG9uc2VzLnRtcGwgZmlsZSwgYnV0IGxvYWRlZCBpbiB0aHJvdWdoIEdpdEh1YidzIHJhdy5naXRodWJ1c2VyY29udGVudC5jb20uIFRoZSBnZW5lcmFsIGZvcm0gdG8gdXNlIHJhdy5naXRodWJ1c2VyY29udGVudC5jb20gaXMgYXMgZm9sbG93cyBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vPHVzZXJuYW1lPi88cHJvamVjdD4vPGNvbW1pdGlzaD4vcGF0aC90by90ZW1wbGF0ZS90ZW1wbGF0ZS50bXBsCgogICAgIyBBbHRlcm5hdGl2ZWx5IHVzaW5nIHJhdy5naXRodWJ1c2VyY29udGVudC5jb20gd2l0aCBhIGhhc2gKICAgIGNsaWVudC13aXRoLXJlc3BvbnNlcy50bXBsOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9hZDVlYWRhNGYzY2NjMjhhODg0NzdjZWY2MmVhMjFjMTdmYzhhYTAxL3BrZy9jb2RlZ2VuL3RlbXBsYXRlcy9jbGllbnQtd2l0aC1yZXNwb25zZXMudG1wbAogICAgIyBBbHRlcm5hdGl2ZWx5IHVzaW5nIHJhdy5naXRodWJ1c2VyY29udGVudC5jb20gd2l0aCBhIHRhZwogICAgY2xpZW50LXdpdGgtcmVzcG9uc2VzLnRtcGw6IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyLjEuMC9wa2cvY29kZWdlbi90ZW1wbGF0ZXMvY2xpZW50LXdpdGgtcmVzcG9uc2VzLnRtcGwKICAgICMgQWx0ZXJuYXRpdmVseSB1c2luZyByYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tIHdpdGggYSBicmFuY2gKICAgIGNsaWVudC13aXRoLXJlc3BvbnNlcy50bXBsOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9tYXN0ZXIvcGtnL2NvZGVnZW4vdGVtcGxhdGVzL2NsaWVudC13aXRoLXJlc3BvbnNlcy50bXBsCmBgYAoKPiBbIVdBUk5JTkddCj4gSWYgdXNpbmcgVVJMcyB0aGF0IHB1bGwgbG9jYXRpb25zIGZyb20gYSBHaXQgcmVwbywgc3VjaCBhcyBgcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbWAsIGl0IGlzIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gdXNlIGEgdGFnIG9yIGEgcmF3IGNvbW1pdCBoYXNoIGluc3RlYWQgb2YgYSBicmFuY2ggbGlrZSBgbWFpbmAuIFRyYWNraW5nIGEgYnJhbmNoIGNhbiBsZWFkIHRvIHVuZXhwZWN0ZWQgQVBJIGRyaWZ0LCBhbmQgbG9zcyBvZiB0aGUgYWJpbGl0eSB0byByZXByb2R1Y2UgYSBidWlsZC4KCiMjIyBJbmxpbmUgdGVtcGxhdGUKCkl0J3MgYWxzbyBwb3NzaWJsZSB0byBzZXQgdGhlIHRlbXBsYXRlcyBpbmxpbmUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZToKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogJHNjaGVtYT1odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9IRUFEL2NvbmZpZ3VyYXRpb24tc2NoZW1hLmpzb24KIyAuLi4Kb3V0cHV0LW9wdGlvbnM6CiAgdXNlci10ZW1wbGF0ZXM6CiAgICAjIE5PVEUgdGhlIHVzZSBvZiB0aGUgYHxgIChwaXBlIHN5bWJvbCkgaGVyZSB0byBkZW5vdGUgdGhhdCB0aGlzIGlzIGEKICAgICMgbXVsdGktbGluZSBzdGF0ZW1lbnQgdGhhdCBzaG91bGQgcHJlc2VydmUgbmV3bGluZXMuIE1vcmUgcmVhZGluZzoKICAgICMgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE4NzA4MTU2LzIyNTcwMzggYW5kCiAgICAjIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNTM2NTI5Ni8yMjU3MDM4CiAgICBjbGllbnQtd2l0aC1yZXNwb25zZXMudG1wbDogfAogICAgICAgIC8vIENsaWVudFdpdGhSZXNwb25zZXMgYnVpbGRzIG9uIENsaWVudEludGVyZmFjZSB0byBvZmZlciByZXNwb25zZSBwYXlsb2FkcwogICAgICAgIHR5cGUgQ2xpZW50V2l0aFJlc3BvbnNlcyBzdHJ1Y3QgewogICAgICAgICAgICBDbGllbnRJbnRlcmZhY2UKICAgICAgICB9CiAgICAgICAgLi4uCmBgYAoKIyMjIFVzaW5nIHRoZSBHbyBwYWNrYWdlCgpBbHRlcm5hdGl2ZWx5LCB5b3UgYXJlIGFibGUgdG8gdXNlIHRoZSB1bmRlcmx5aW5nIGNvZGUgZ2VuZXJhdGlvbiBhcyBhIHBhY2thZ2UsIHdoaWNoIFt3aWxsIGJlIGRvY3VtZW50ZWQgaW4gdGhlIGZ1dHVyZV0oaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vaXNzdWVzLzE0ODcpLgoKIyMgQWRkaXRpb25hbCBQcm9wZXJ0aWVzIChgYWRkaXRpb25hbFByb3BlcnRpZXNgKQoKW09wZW5BUEkgU2NoZW1hc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC4zLmh0bWwjc2NoZW1hLW9iamVjdCkgaW1wbGljaXRseSBhY2NlcHQgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzYCwgbWVhbmluZyB0aGF0IGFueSBmaWVsZHMgcHJvdmlkZWQsIGJ1dCBub3QgZXhwbGljaXRseSBkZWZpbmVkIHZpYSBwcm9wZXJ0aWVzIG9uIHRoZSBzY2hlbWEgYXJlIGFjY2VwdGVkIGFzIGlucHV0LCBhbmQgcHJvcGFnYXRlZC4gV2hlbiB1bnNwZWNpZmllZCwgT3BlbkFQSSBkZWZpbmVzIHRoYXQgdGhlIGBhZGRpdGlvbmFsUHJvcGVydGllc2AgZmllbGQgaXMgYXNzdW1lZCB0byBiZSBgdHJ1ZWAuCgpGb3Igc2ltcGxpY2l0eSwgYW5kIHRvIHJlbW92ZSBhIGZhaXIgYml0IG9mIGR1cGxpY2F0aW9uIGFuZCBib2lsZXJwbGF0ZSwgYG9hcGktY29kZWdlbmAgZGVjaWRlcyB0byBpZ25vcmUgdGhlIGltcGxpY2l0IGBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZWAsIGFuZCBpbnN0ZWFkIHJlcXVpcmVzIHlvdSB0byBzcGVjaWZ5IHRoZSBgYWRkaXRpb25hbFByb3BlcnRpZXNgIGtleSB0byBnZW5lcmF0ZSB0aGUgYm9pbGVycGxhdGUuCgo+IFshTk9URV0KPiBJbiB0aGUgZnV0dXJlIFt0aGlzIHdpbGwgYmUgcG9zc2libGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL2lzc3Vlcy8xNTE0KSB0byBkaXNhYmxlIHRoaXMgZnVuY3Rpb25hbGl0eSwgYW5kIGhvbm91ciB0aGUgaW1wbGljaXQgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlYAoKQmVsb3cgeW91IGNhbiBzZWUgc29tZSBleGFtcGxlcyBvZiBob3cgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzYCBhZmZlY3RzIHRoZSBnZW5lcmF0ZWQgY29kZS4KCiMjIyBJbXBsaWNpdCBgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWVgIC8gbm8gYGFkZGl0aW9uYWxQcm9wZXJ0aWVzYCBzZXQKCmBgYHlhbWwKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgVGhpbmc6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIGlkCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBpbnRlZ2VyCiAgICAgICMgaW1wbGljaXQgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUKYGBgCgpXaWxsIGdlbmVyYXRlOgoKYGBgZ28KLy8gVGhpbmcgZGVmaW5lcyBtb2RlbCBmb3IgVGhpbmcuCnR5cGUgVGhpbmcgc3RydWN0IHsKCUlkIGludCBganNvbjoiaWQiYAp9CgovLyB3aXRoIG5vIGdlbmVyYXRlZCBib2lsZXJwbGF0ZSBub3IgdGhlIGBBZGRpdGlvbmFsUHJvcGVydGllc2AgZmllbGQKYGBgCgojIyMgRXhwbGljaXQgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlYAoKYGBgeWFtbApjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICBUaGluZzoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gaWQKICAgICAgcHJvcGVydGllczoKICAgICAgICBpZDoKICAgICAgICAgIHR5cGU6IGludGVnZXIKICAgICAgIyBleHBsaWNpdCB0cnVlCiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlCmBgYAoKV2lsbCBnZW5lcmF0ZToKCmBgYGdvCi8vIFRoaW5nIGRlZmluZXMgbW9kZWwgZm9yIFRoaW5nLgp0eXBlIFRoaW5nIHN0cnVjdCB7CglJZCAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGBqc29uOiJpZCJgCglBZGRpdGlvbmFsUHJvcGVydGllcyBtYXBbc3RyaW5nXWludGVyZmFjZXt9IGBqc29uOiItImAKfQoKLy8gd2l0aCBnZW5lcmF0ZWQgYm9pbGVycGxhdGUgYmVsb3cKYGBgCgo8ZGV0YWlscz4KCjxzdW1tYXJ5PkJvaWxlcnBsYXRlPC9zdW1tYXJ5PgoKYGBgZ28KCi8vIEdldHRlciBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciBUaGluZy4gUmV0dXJucyB0aGUgc3BlY2lmaWVkCi8vIGVsZW1lbnQgYW5kIHdoZXRoZXIgaXQgd2FzIGZvdW5kCmZ1bmMgKGEgVGhpbmcpIEdldChmaWVsZE5hbWUgc3RyaW5nKSAodmFsdWUgaW50ZXJmYWNle30sIGZvdW5kIGJvb2wpIHsKCWlmIGEuQWRkaXRpb25hbFByb3BlcnRpZXMgIT0gbmlsIHsKCQl2YWx1ZSwgZm91bmQgPSBhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzW2ZpZWxkTmFtZV0KCX0KCXJldHVybgp9CgovLyBTZXR0ZXIgZm9yIGFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgVGhpbmcKZnVuYyAoYSAqVGhpbmcpIFNldChmaWVsZE5hbWUgc3RyaW5nLCB2YWx1ZSBpbnRlcmZhY2V7fSkgewoJaWYgYS5BZGRpdGlvbmFsUHJvcGVydGllcyA9PSBuaWwgewoJCWEuQWRkaXRpb25hbFByb3BlcnRpZXMgPSBtYWtlKG1hcFtzdHJpbmddaW50ZXJmYWNle30pCgl9CglhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzW2ZpZWxkTmFtZV0gPSB2YWx1ZQp9CgovLyBPdmVycmlkZSBkZWZhdWx0IEpTT04gaGFuZGxpbmcgZm9yIFRoaW5nIHRvIGhhbmRsZSBBZGRpdGlvbmFsUHJvcGVydGllcwpmdW5jIChhICpUaGluZykgVW5tYXJzaGFsSlNPTihiIFtdYnl0ZSkgZXJyb3IgewoJb2JqZWN0IDo9IG1ha2UobWFwW3N0cmluZ11qc29uLlJhd01lc3NhZ2UpCgllcnIgOj0ganNvbi5Vbm1hcnNoYWwoYiwgJm9iamVjdCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCglpZiByYXcsIGZvdW5kIDo9IG9iamVjdFsiaWQiXTsgZm91bmQgewoJCWVyciA9IGpzb24uVW5tYXJzaGFsKHJhdywgJmEuSWQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBmbXQuRXJyb3JmKCJlcnJvciByZWFkaW5nICdpZCc6ICV3IiwgZXJyKQoJCX0KCQlkZWxldGUob2JqZWN0LCAiaWQiKQoJfQoKCWlmIGxlbihvYmplY3QpICE9IDAgewoJCWEuQWRkaXRpb25hbFByb3BlcnRpZXMgPSBtYWtlKG1hcFtzdHJpbmddaW50ZXJmYWNle30pCgkJZm9yIGZpZWxkTmFtZSwgZmllbGRCdWYgOj0gcmFuZ2Ugb2JqZWN0IHsKCQkJdmFyIGZpZWxkVmFsIGludGVyZmFjZXt9CgkJCWVyciA6PSBqc29uLlVubWFyc2hhbChmaWVsZEJ1ZiwgJmZpZWxkVmFsKQoJCQlpZiBlcnIgIT0gbmlsIHsKCQkJCXJldHVybiBmbXQuRXJyb3JmKCJlcnJvciB1bm1hcnNoYWxpbmcgZmllbGQgJXM6ICV3IiwgZmllbGROYW1lLCBlcnIpCgkJCX0KCQkJYS5BZGRpdGlvbmFsUHJvcGVydGllc1tmaWVsZE5hbWVdID0gZmllbGRWYWwKCQl9Cgl9CglyZXR1cm4gbmlsCn0KCi8vIE92ZXJyaWRlIGRlZmF1bHQgSlNPTiBoYW5kbGluZyBmb3IgVGhpbmcgdG8gaGFuZGxlIEFkZGl0aW9uYWxQcm9wZXJ0aWVzCmZ1bmMgKGEgVGhpbmcpIE1hcnNoYWxKU09OKCkgKFtdYnl0ZSwgZXJyb3IpIHsKCXZhciBlcnIgZXJyb3IKCW9iamVjdCA6PSBtYWtlKG1hcFtzdHJpbmddanNvbi5SYXdNZXNzYWdlKQoKCW9iamVjdFsiaWQiXSwgZXJyID0ganNvbi5NYXJzaGFsKGEuSWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBmbXQuRXJyb3JmKCJlcnJvciBtYXJzaGFsaW5nICdpZCc6ICV3IiwgZXJyKQoJfQoKCWZvciBmaWVsZE5hbWUsIGZpZWxkIDo9IHJhbmdlIGEuQWRkaXRpb25hbFByb3BlcnRpZXMgewoJCW9iamVjdFtmaWVsZE5hbWVdLCBlcnIgPSBqc29uLk1hcnNoYWwoZmllbGQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoImVycm9yIG1hcnNoYWxpbmcgJyVzJzogJXciLCBmaWVsZE5hbWUsIGVycikKCQl9Cgl9CglyZXR1cm4ganNvbi5NYXJzaGFsKG9iamVjdCkKfQpgYGAKCjwvZGV0YWlscz4KCgojIyMgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzYCBhcyBgaW50ZWdlcmBzCgpgYGB5YW1sCmNvbXBvbmVudHM6CiAgc2NoZW1hczoKICAgIFRoaW5nOgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBpZAogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAjIHNpbXBsZSB0eXBlCiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOgogICAgICAgIHR5cGU6IGludGVnZXIKYGBgCgpXaWxsIGdlbmVyYXRlOgoKYGBgZ28KLy8gVGhpbmcgZGVmaW5lcyBtb2RlbCBmb3IgVGhpbmcuCnR5cGUgVGhpbmcgc3RydWN0IHsKCUlkICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGBqc29uOiJpZCJgCglBZGRpdGlvbmFsUHJvcGVydGllcyBtYXBbc3RyaW5nXWludCBganNvbjoiLSJgCn0KCi8vIHdpdGggZ2VuZXJhdGVkIGJvaWxlcnBsYXRlIGJlbG93CmBgYAoKPGRldGFpbHM+Cgo8c3VtbWFyeT5Cb2lsZXJwbGF0ZTwvc3VtbWFyeT4KCmBgYGdvCi8vIEdldHRlciBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciBUaGluZy4gUmV0dXJucyB0aGUgc3BlY2lmaWVkCi8vIGVsZW1lbnQgYW5kIHdoZXRoZXIgaXQgd2FzIGZvdW5kCmZ1bmMgKGEgVGhpbmcpIEdldChmaWVsZE5hbWUgc3RyaW5nKSAodmFsdWUgaW50LCBmb3VuZCBib29sKSB7CglpZiBhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzICE9IG5pbCB7CgkJdmFsdWUsIGZvdW5kID0gYS5BZGRpdGlvbmFsUHJvcGVydGllc1tmaWVsZE5hbWVdCgl9CglyZXR1cm4KfQoKLy8gU2V0dGVyIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIFRoaW5nCmZ1bmMgKGEgKlRoaW5nKSBTZXQoZmllbGROYW1lIHN0cmluZywgdmFsdWUgaW50KSB7CglpZiBhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzID09IG5pbCB7CgkJYS5BZGRpdGlvbmFsUHJvcGVydGllcyA9IG1ha2UobWFwW3N0cmluZ11pbnQpCgl9CglhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzW2ZpZWxkTmFtZV0gPSB2YWx1ZQp9CgovLyBPdmVycmlkZSBkZWZhdWx0IEpTT04gaGFuZGxpbmcgZm9yIFRoaW5nIHRvIGhhbmRsZSBBZGRpdGlvbmFsUHJvcGVydGllcwpmdW5jIChhICpUaGluZykgVW5tYXJzaGFsSlNPTihiIFtdYnl0ZSkgZXJyb3IgewoJb2JqZWN0IDo9IG1ha2UobWFwW3N0cmluZ11qc29uLlJhd01lc3NhZ2UpCgllcnIgOj0ganNvbi5Vbm1hcnNoYWwoYiwgJm9iamVjdCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCglpZiByYXcsIGZvdW5kIDo9IG9iamVjdFsiaWQiXTsgZm91bmQgewoJCWVyciA9IGpzb24uVW5tYXJzaGFsKHJhdywgJmEuSWQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBmbXQuRXJyb3JmKCJlcnJvciByZWFkaW5nICdpZCc6ICV3IiwgZXJyKQoJCX0KCQlkZWxldGUob2JqZWN0LCAiaWQiKQoJfQoKCWlmIGxlbihvYmplY3QpICE9IDAgewoJCWEuQWRkaXRpb25hbFByb3BlcnRpZXMgPSBtYWtlKG1hcFtzdHJpbmddaW50KQoJCWZvciBmaWVsZE5hbWUsIGZpZWxkQnVmIDo9IHJhbmdlIG9iamVjdCB7CgkJCXZhciBmaWVsZFZhbCBpbnQKCQkJZXJyIDo9IGpzb24uVW5tYXJzaGFsKGZpZWxkQnVmLCAmZmllbGRWYWwpCgkJCWlmIGVyciAhPSBuaWwgewoJCQkJcmV0dXJuIGZtdC5FcnJvcmYoImVycm9yIHVubWFyc2hhbGluZyBmaWVsZCAlczogJXciLCBmaWVsZE5hbWUsIGVycikKCQkJfQoJCQlhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzW2ZpZWxkTmFtZV0gPSBmaWVsZFZhbAoJCX0KCX0KCXJldHVybiBuaWwKfQoKLy8gT3ZlcnJpZGUgZGVmYXVsdCBKU09OIGhhbmRsaW5nIGZvciBUaGluZyB0byBoYW5kbGUgQWRkaXRpb25hbFByb3BlcnRpZXMKZnVuYyAoYSBUaGluZykgTWFyc2hhbEpTT04oKSAoW11ieXRlLCBlcnJvcikgewoJdmFyIGVyciBlcnJvcgoJb2JqZWN0IDo9IG1ha2UobWFwW3N0cmluZ11qc29uLlJhd01lc3NhZ2UpCgoJb2JqZWN0WyJpZCJdLCBlcnIgPSBqc29uLk1hcnNoYWwoYS5JZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoImVycm9yIG1hcnNoYWxpbmcgJ2lkJzogJXciLCBlcnIpCgl9CgoJZm9yIGZpZWxkTmFtZSwgZmllbGQgOj0gcmFuZ2UgYS5BZGRpdGlvbmFsUHJvcGVydGllcyB7CgkJb2JqZWN0W2ZpZWxkTmFtZV0sIGVyciA9IGpzb24uTWFyc2hhbChmaWVsZCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigiZXJyb3IgbWFyc2hhbGluZyAnJXMnOiAldyIsIGZpZWxkTmFtZSwgZXJyKQoJCX0KCX0KCXJldHVybiBqc29uLk1hcnNoYWwob2JqZWN0KQp9CmBgYAoKPC9kZXRhaWxzPgoKIyMjIGBhZGRpdGlvbmFsUHJvcGVydGllc2Agd2l0aCBhbiBvYmplY3QKCmBgYHlhbWwKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgVGhpbmc6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIGlkCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBpbnRlZ2VyCiAgICAgICMgb2JqZWN0CiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOgogICAgICAgIHR5cGU6IG9iamVjdAogICAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgICBmb286CiAgICAgICAgICAgIHR5cGU6IHN0cmluZwpgYGAKCldpbGwgZ2VuZXJhdGU6CgpgYGBnbwovLyBUaGluZyBkZWZpbmVzIG1vZGVsIGZvciBUaGluZy4KdHlwZSBUaGluZyBzdHJ1Y3QgewoJSWQgICAgICAgICAgICAgICAgICAgaW50IGBqc29uOiJpZCJgCglBZGRpdGlvbmFsUHJvcGVydGllcyBtYXBbc3RyaW5nXXN0cnVjdCB7CgkJRm9vICpzdHJpbmcgYGpzb246ImZvbyxvbWl0ZW1wdHkiYAoJfSBganNvbjoiLSJgCn0KCi8vIHdpdGggZ2VuZXJhdGVkIGJvaWxlcnBsYXRlIGJlbG93CmBgYAoKPGRldGFpbHM+Cgo8c3VtbWFyeT5Cb2lsZXJwbGF0ZTwvc3VtbWFyeT4KCmBgYGdvCi8vIEdldHRlciBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciBUaGluZy4gUmV0dXJucyB0aGUgc3BlY2lmaWVkCi8vIGVsZW1lbnQgYW5kIHdoZXRoZXIgaXQgd2FzIGZvdW5kCmZ1bmMgKGEgVGhpbmcpIEdldChmaWVsZE5hbWUgc3RyaW5nKSAodmFsdWUgc3RydWN0IHsKCUZvbyAqc3RyaW5nIGBqc29uOiJmb28sb21pdGVtcHR5ImAKfSwgZm91bmQgYm9vbCkgewoJaWYgYS5BZGRpdGlvbmFsUHJvcGVydGllcyAhPSBuaWwgewoJCXZhbHVlLCBmb3VuZCA9IGEuQWRkaXRpb25hbFByb3BlcnRpZXNbZmllbGROYW1lXQoJfQoJcmV0dXJuCn0KCi8vIFNldHRlciBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciBUaGluZwpmdW5jIChhICpUaGluZykgU2V0KGZpZWxkTmFtZSBzdHJpbmcsIHZhbHVlIHN0cnVjdCB7CglGb28gKnN0cmluZyBganNvbjoiZm9vLG9taXRlbXB0eSJgCn0pIHsKCWlmIGEuQWRkaXRpb25hbFByb3BlcnRpZXMgPT0gbmlsIHsKCQlhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gbWFrZShtYXBbc3RyaW5nXXN0cnVjdCB7CgkJCUZvbyAqc3RyaW5nIGBqc29uOiJmb28sb21pdGVtcHR5ImAKCQl9KQoJfQoJYS5BZGRpdGlvbmFsUHJvcGVydGllc1tmaWVsZE5hbWVdID0gdmFsdWUKfQoKLy8gT3ZlcnJpZGUgZGVmYXVsdCBKU09OIGhhbmRsaW5nIGZvciBUaGluZyB0byBoYW5kbGUgQWRkaXRpb25hbFByb3BlcnRpZXMKZnVuYyAoYSAqVGhpbmcpIFVubWFyc2hhbEpTT04oYiBbXWJ5dGUpIGVycm9yIHsKCW9iamVjdCA6PSBtYWtlKG1hcFtzdHJpbmddanNvbi5SYXdNZXNzYWdlKQoJZXJyIDo9IGpzb24uVW5tYXJzaGFsKGIsICZvYmplY3QpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJaWYgcmF3LCBmb3VuZCA6PSBvYmplY3RbImlkIl07IGZvdW5kIHsKCQllcnIgPSBqc29uLlVubWFyc2hhbChyYXcsICZhLklkKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gZm10LkVycm9yZigiZXJyb3IgcmVhZGluZyAnaWQnOiAldyIsIGVycikKCQl9CgkJZGVsZXRlKG9iamVjdCwgImlkIikKCX0KCglpZiBsZW4ob2JqZWN0KSAhPSAwIHsKCQlhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gbWFrZShtYXBbc3RyaW5nXXN0cnVjdCB7CgkJCUZvbyAqc3RyaW5nIGBqc29uOiJmb28sb21pdGVtcHR5ImAKCQl9KQoJCWZvciBmaWVsZE5hbWUsIGZpZWxkQnVmIDo9IHJhbmdlIG9iamVjdCB7CgkJCXZhciBmaWVsZFZhbCBzdHJ1Y3QgewoJCQkJRm9vICpzdHJpbmcgYGpzb246ImZvbyxvbWl0ZW1wdHkiYAoJCQl9CgkJCWVyciA6PSBqc29uLlVubWFyc2hhbChmaWVsZEJ1ZiwgJmZpZWxkVmFsKQoJCQlpZiBlcnIgIT0gbmlsIHsKCQkJCXJldHVybiBmbXQuRXJyb3JmKCJlcnJvciB1bm1hcnNoYWxpbmcgZmllbGQgJXM6ICV3IiwgZmllbGROYW1lLCBlcnIpCgkJCX0KCQkJYS5BZGRpdGlvbmFsUHJvcGVydGllc1tmaWVsZE5hbWVdID0gZmllbGRWYWwKCQl9Cgl9CglyZXR1cm4gbmlsCn0KCi8vIE92ZXJyaWRlIGRlZmF1bHQgSlNPTiBoYW5kbGluZyBmb3IgVGhpbmcgdG8gaGFuZGxlIEFkZGl0aW9uYWxQcm9wZXJ0aWVzCmZ1bmMgKGEgVGhpbmcpIE1hcnNoYWxKU09OKCkgKFtdYnl0ZSwgZXJyb3IpIHsKCXZhciBlcnIgZXJyb3IKCW9iamVjdCA6PSBtYWtlKG1hcFtzdHJpbmddanNvbi5SYXdNZXNzYWdlKQoKCW9iamVjdFsiaWQiXSwgZXJyID0ganNvbi5NYXJzaGFsKGEuSWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBmbXQuRXJyb3JmKCJlcnJvciBtYXJzaGFsaW5nICdpZCc6ICV3IiwgZXJyKQoJfQoKCWZvciBmaWVsZE5hbWUsIGZpZWxkIDo9IHJhbmdlIGEuQWRkaXRpb25hbFByb3BlcnRpZXMgewoJCW9iamVjdFtmaWVsZE5hbWVdLCBlcnIgPSBqc29uLk1hcnNoYWwoZmllbGQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoImVycm9yIG1hcnNoYWxpbmcgJyVzJzogJXciLCBmaWVsZE5hbWUsIGVycikKCQl9Cgl9CglyZXR1cm4ganNvbi5NYXJzaGFsKG9iamVjdCkKfQpgYGAKCjwvZGV0YWlscz4KCiMjIENoYW5naW5nIHRoZSBuYW1lcyBvZiBnZW5lcmF0ZWQgdHlwZXMKCkFzIG9mIGBvYXBpLWNvZGVnZW5gIHYyLjIuMCwgaXQgaXMgbm93IHBvc3NpYmxlIHRvIHVzZSB0aGUgYG91dHB1dC1vcHRpb25zYCBjb25maWd1cmF0aW9uJ3MgYG5hbWUtbm9ybWFsaXplcmAgdG8gZGVmaW5lIHRoZSBsb2dpYyBmb3IgaG93IHRvIGNvbnZlcnQgYW4gT3BlbkFQSSBuYW1lIChpLmUuIGFuIE9wZXJhdGlvbiBJRCBvciBhIFNjaGVtYSBuYW1lKSBhbmQgY29uc3RydWN0IGEgR28gdHlwZSBuYW1lLgoKPGRldGFpbHM+Cgo8c3VtbWFyeT5FeGFtcGxlLCB1c2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb248L3N1bW1hcnk+CgpCeSBkZWZhdWx0LCBgb2FwaS1jb2RlZ2VuYCB3aWxsIHBlcmZvcm0gY2FtZWwtY2FzZSBjb252ZXJzaW9uLCBzbyBmb3IgYSBzcGVjIHN1Y2ggYXM6CgpgYGB5YW1sCm9wZW5hcGk6ICIzLjAuMCIKaW5mbzoKICB2ZXJzaW9uOiAxLjAuMAogIHRpdGxlOiBFeGFtcGxlIGNvZGUgZm9yIHRoZSBgbmFtZS1ub3JtYWxpemVyYCBvdXRwdXQgb3B0aW9uCnBhdGhzOgogIC9hcGkvcGV0cy97cGV0SWR9OgogICAgZ2V0OgogICAgICBzdW1tYXJ5OiBHZXQgcGV0IGdpdmVuIGlkZW50aWZpZXIuCiAgICAgIG9wZXJhdGlvbklkOiBnZXRIdHRwUGV0CiAgICAgIHBhcmFtZXRlcnM6CiAgICAgIC0gbmFtZTogcGV0SWQKICAgICAgICBpbjogcGF0aAogICAgICAgIHJlcXVpcmVkOiB0cnVlCiAgICAgICAgc2NoZW1hOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgIHJlc3BvbnNlczoKICAgICAgICAnMjAwJzoKICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWxpZCBwZXQKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL1BldCcKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgUGV0OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSB1dWlkCiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgdXVpZDoKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwZXQgdXVpZC4KICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBkZXNjcmlwdGlvbjogVGhlIG5hbWUgb2YgdGhlIHBldC4KICAgIEVycm9yOgogICAgICByZXF1aXJlZDoKICAgICAgICAtIGNvZGUKICAgICAgICAtIG1lc3NhZ2UKICAgICAgcHJvcGVydGllczoKICAgICAgICBjb2RlOgogICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgICAgZm9ybWF0OiBpbnQzMgogICAgICAgICAgZGVzY3JpcHRpb246IEVycm9yIGNvZGUKICAgICAgICBtZXNzYWdlOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBkZXNjcmlwdGlvbjogRXJyb3IgbWVzc2FnZQogICAgT25lT2YydGhpbmdzOgogICAgICBkZXNjcmlwdGlvbjogIk5vdGljZSB0aGF0IHRoZSBgdGhpbmdzYCBpcyBub3QgY2FwaXRhbGlzZWQiCiAgICAgIG9uZU9mOgogICAgICAgIC0gdHlwZTogb2JqZWN0CiAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgLSBpZAogICAgICAgICAgcHJvcGVydGllczoKICAgICAgICAgICAgaWQ6CiAgICAgICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgIC0gdHlwZTogb2JqZWN0CiAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgLSBpZAogICAgICAgICAgcHJvcGVydGllczoKICAgICAgICAgICAgaWQ6CiAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAgICAgZm9ybWF0OiB1dWlkCmBgYAoKVGhpcyB3aWxsIHByb2R1Y2U6CgpgYGBnbwovLyBPbmVPZjJ0aGluZ3MgTm90aWNlIHRoYXQgdGhlIGB0aGluZ3NgIGlzIG5vdCBjYXBpdGFsaXNlZAp0eXBlIE9uZU9mMnRoaW5ncyBzdHJ1Y3QgewoJdW5pb24ganNvbi5SYXdNZXNzYWdlCn0KCi8vIFBldCBkZWZpbmVzIG1vZGVsIGZvciBQZXQuCnR5cGUgUGV0IHN0cnVjdCB7CgkvLyBOYW1lIFRoZSBuYW1lIG9mIHRoZSBwZXQuCglOYW1lIHN0cmluZyBganNvbjoibmFtZSJgCgoJLy8gVXVpZCBUaGUgcGV0IHV1aWQuCglVdWlkIHN0cmluZyBganNvbjoidXVpZCJgCn0KCi8vIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGNsaWVudCBhYm92ZS4KdHlwZSBDbGllbnRJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCS8vIEdldEh0dHBQZXQgcmVxdWVzdAoJR2V0SHR0cFBldChjdHggY29udGV4dC5Db250ZXh0LCBwZXRJZCBzdHJpbmcsIHJlcUVkaXRvcnMgLi4uUmVxdWVzdEVkaXRvckZuKSAoKmh0dHAuUmVzcG9uc2UsIGVycm9yKQp9CmBgYAoKPC9kZXRhaWxzPgoKPGRldGFpbHM+Cgo8c3VtbWFyeT5FeGFtcGxlLCB1c2luZyA8Y29kZT5Ub0NhbWVsQ2FzZVdpdGhJbml0aWFsaXNtczwvY29kZT48L3N1bW1hcnk+CgpCeSBkZWZhdWx0LCBgb2FwaS1jb2RlZ2VuYCB3aWxsIHBlcmZvcm0gY2FtZWwtY2FzZSBjb252ZXJzaW9uLCBzbyBmb3IgYSBzcGVjIHN1Y2ggYXM6CgpgYGB5YW1sCm9wZW5hcGk6ICIzLjAuMCIKaW5mbzoKICB2ZXJzaW9uOiAxLjAuMAogIHRpdGxlOiBFeGFtcGxlIGNvZGUgZm9yIHRoZSBgbmFtZS1ub3JtYWxpemVyYCBvdXRwdXQgb3B0aW9uCnBhdGhzOgogIC9hcGkvcGV0cy97cGV0SWR9OgogICAgZ2V0OgogICAgICBzdW1tYXJ5OiBHZXQgcGV0IGdpdmVuIGlkZW50aWZpZXIuCiAgICAgIG9wZXJhdGlvbklkOiBnZXRIdHRwUGV0CiAgICAgIHBhcmFtZXRlcnM6CiAgICAgIC0gbmFtZTogcGV0SWQKICAgICAgICBpbjogcGF0aAogICAgICAgIHJlcXVpcmVkOiB0cnVlCiAgICAgICAgc2NoZW1hOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgIHJlc3BvbnNlczoKICAgICAgICAnMjAwJzoKICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWxpZCBwZXQKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL1BldCcKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgUGV0OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSB1dWlkCiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgdXVpZDoKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwZXQgdXVpZC4KICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBkZXNjcmlwdGlvbjogVGhlIG5hbWUgb2YgdGhlIHBldC4KICAgIEVycm9yOgogICAgICByZXF1aXJlZDoKICAgICAgICAtIGNvZGUKICAgICAgICAtIG1lc3NhZ2UKICAgICAgcHJvcGVydGllczoKICAgICAgICBjb2RlOgogICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgICAgZm9ybWF0OiBpbnQzMgogICAgICAgICAgZGVzY3JpcHRpb246IEVycm9yIGNvZGUKICAgICAgICBtZXNzYWdlOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBkZXNjcmlwdGlvbjogRXJyb3IgbWVzc2FnZQogICAgT25lT2YydGhpbmdzOgogICAgICBkZXNjcmlwdGlvbjogIk5vdGljZSB0aGF0IHRoZSBgdGhpbmdzYCBpcyBub3QgY2FwaXRhbGlzZWQiCiAgICAgIG9uZU9mOgogICAgICAgIC0gdHlwZTogb2JqZWN0CiAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgLSBpZAogICAgICAgICAgcHJvcGVydGllczoKICAgICAgICAgICAgaWQ6CiAgICAgICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgIC0gdHlwZTogb2JqZWN0CiAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgLSBpZAogICAgICAgICAgcHJvcGVydGllczoKICAgICAgICAgICAgaWQ6CiAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAgICAgZm9ybWF0OiB1dWlkCmBgYAoKVGhpcyB3aWxsIHByb2R1Y2U6CgpgYGBnbwovLyBPbmVPZjJ0aGluZ3MgTm90aWNlIHRoYXQgdGhlIGB0aGluZ3NgIGlzIG5vdCBjYXBpdGFsaXNlZAp0eXBlIE9uZU9mMnRoaW5ncyBzdHJ1Y3QgewoJdW5pb24ganNvbi5SYXdNZXNzYWdlCn0KCi8vIFBldCBkZWZpbmVzIG1vZGVsIGZvciBQZXQuCnR5cGUgUGV0IHN0cnVjdCB7CgkvLyBOYW1lIFRoZSBuYW1lIG9mIHRoZSBwZXQuCglOYW1lIHN0cmluZyBganNvbjoibmFtZSJgCgoJLy8gVVVJRCBUaGUgcGV0IHV1aWQuCglVVUlEIHN0cmluZyBganNvbjoidXVpZCJgCn0KCi8vIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGNsaWVudCBhYm92ZS4KdHlwZSBDbGllbnRJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCS8vIEdldEhUVFBQZXQgcmVxdWVzdAoJR2V0SFRUUFBldChjdHggY29udGV4dC5Db250ZXh0LCBwZXRJRCBzdHJpbmcsIHJlcUVkaXRvcnMgLi4uUmVxdWVzdEVkaXRvckZuKSAoKmh0dHAuUmVzcG9uc2UsIGVycm9yKQp9CmBgYAoKPC9kZXRhaWxzPgoKCkZvciBtb3JlIGRldGFpbHMgb2Ygd2hhdCB0aGUgcmVzdWx0aW5nIGNvZGUgbG9va3MgbGlrZSwgY2hlY2sgb3V0IFt0aGUgdGVzdCBjYXNlc10oaW50ZXJuYWwvdGVzdC9vdXRwdXRvcHRpb25zL25hbWUtbm9ybWFsaXplci8pLgoKIyMgRXhhbXBsZXMKClRoZSBbZXhhbXBsZXMgZGlyZWN0b3J5XShleGFtcGxlcykgY29udGFpbnMgc29tZSBhZGRpdGlvbmFsIGNhc2VzIHdoaWNoIGFyZSB1c2VmdWwgZXhhbXBsZXMgZm9yIGhvdyB0byB1c2UgYG9hcGktY29kZWdlbmAsIGluY2x1ZGluZyBob3cgeW91J2QgdGFrZSB0aGUgUGV0c3RvcmUgQVBJIGFuZCBpbXBsZW1lbnQgaXQgd2l0aCBgb2FwaS1jb2RlZ2VuYC4KCllvdSBjb3VsZCBhbHNvIGZpbmQgc29tZSBjYXNlcyBvZiBob3cgdGhlIHByb2plY3QgY2FuIGJlIHVzZWQgYnkgY2hlY2tpbmcgb3V0IG91ciBbaW50ZXJuYWwgdGVzdCBjYXNlc10oaW50ZXJuYWwvdGVzdCkgd2hpY2ggYXJlIHJlYWwtd29ybGQgdXNhZ2VzIHRoYXQgbWFrZSB1cCBvdXIgcmVncmVzc2lvbiB0ZXN0cy4KCiMjIyBCbG9nIHBvc3RzCgpXZSBsb3ZlIHJlYWRpbmcgcG9zdHMgYnkgdGhlIGNvbW11bml0eSBhYm91dCBob3cgdG8gdXNlIHRoZSBwcm9qZWN0LgoKSGVyZSBhcmUgYSBmZXcgd2UndmUgZm91bmQgYXJvdW5kIHRoZSBXZWI6CgotIFtCdWlsZGluZyBhIEdvIFJFU1RmdWwgQVBJIHdpdGggZGVzaWduLWZpcnN0IE9wZW5BUEkgY29udHJhY3RzXShodHRwczovL3d3dy5qdnQubWUvcG9zdHMvMjAyMi8wNy8xMi9nby1vcGVuYXBpLXNlcnZlci8pCi0gW0EgUHJhY3RpY2FsIEd1aWRlIHRvIFVzaW5nIG9hcGktY29kZWdlbiBpbiBHb2xhbmcgQVBJIERldmVsb3BtZW50IHdpdGggdGhlIEZpYmVyIEZyYW1ld29ya10oaHR0cHM6Ly9tZWRpdW0uY29tL0BmaWtpaGFsYW4vYS1wcmFjdGljYWwtZ3VpZGUtdG8tdXNpbmctb2FwaS1jb2RlZ2VuLWluLWdvbGFuZy1hcGktZGV2ZWxvcG1lbnQtd2l0aC10aGUtZmliZXItZnJhbWV3b3JrLWJjZTJhNTkzODBhZSkKLSBbR2VuZXJhdGluZyBHbyBzZXJ2ZXIgY29kZSBmcm9tIE9wZW5BUEkgMyBkZWZpbml0aW9uc10oaHR0cHM6Ly9sZGVqLm5sL3Bvc3QvZ2VuZXJhdGluZy1nby1mcm9tLW9wZW5hcGktMy8pCi0gW0dvIENsaWVudCBDb2RlIEdlbmVyYXRpb24gZnJvbSBTd2FnZ2VyIGFuZCBPcGVuQVBJXShodHRwczovL21lZGl1bS5jb20vQGt5b2RvLXRlY2gvZ28tY2xpZW50LWNvZGUtZ2VuZXJhdGlvbi1mcm9tLXN3YWdnZXItYW5kLW9wZW5hcGktYTA1NzY4MzE4MzZjKQotIFtHbyBvYXBpLWNvZGVnZW4gKyByZXF1ZXN0IHZhbGlkYXRpb25dKGh0dHBzOi8vYmxvZy5jb21taXRzbWFydC5jb20vZ28tb2FwaS1jb2RlZ2VuLXJlcXVlc3QtdmFsaWRhdGlvbi0yODUzOThiMzdkYzgpCi0gW1N0cmVhbWxpbmluZyBHbyArIENoaSBEZXZlbG9wbWVudDogR2VuZXJhdGluZyBDb2RlIGZyb20gYW4gT3BlbkFQSSBTcGVjXShodHRwczovL2k0by5kZXYvYmxvZy9vYXBpLWNvZGVnZW4td2l0aC1jaGktcm91dGVyKQoKR290IG9uZSB0byBhZGQ/IFBsZWFzZSByYWlzZSBhIFBSIQoKIyMgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMgKEZBUXMpCgojIyMgSG93IGRvZXMgYG9hcGktY29kZWdlbmAgaGFuZGxlIGBhbnlPZmAsIGBhbGxPZmAgYW5kIGBvbmVPZmA/Cgpgb2FwaS1jb2RlZ2VuYCBzdXBwb3J0cyBgYW55T2ZgLCBgYWxsT2ZgIGFuZCBgb25lT2ZgIGZvciBnZW5lcmF0ZWQgY29kZS4KCkZvciBpbnN0YW5jZSwgdGhyb3VnaCB0aGUgZm9sbG93aW5nIE9wZW5BUEkgc3BlYzoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IFVzaW5nIGNvbXBsZXggc2NoZW1hcwogIGRlc2NyaXB0aW9uOiBBbiBleGFtcGxlIG9mIGBhbnlPZmAsIGBhbGxPZmAgYW5kIGBvbmVPZmAKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgIyBiYXNlIHR5cGVzCiAgICBDbGllbnQ6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICBJZGVudGl0eToKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gaXNzdWVyCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgaXNzdWVyOgogICAgICAgICAgdHlwZTogc3RyaW5nCgogICAgIyBhbGxPZiBwZXJmb3JtcyBhIHVuaW9uIG9mIGFsbCB0eXBlcyBkZWZpbmVkCiAgICBDbGllbnRXaXRoSWQ6CiAgICAgIGFsbE9mOgogICAgICAgIC0gJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL0NsaWVudCcKICAgICAgICAtIHByb3BlcnRpZXM6CiAgICAgICAgICAgIGlkOgogICAgICAgICAgICAgIHR5cGU6IGludGVnZXIKICAgICAgICAgIHJlcXVpcmVkOgogICAgICAgICAgICAtIGlkCgogICAgIyBhbGxPZiBwZXJmb3JtcyBhIHVuaW9uIG9mIGFsbCB0eXBlcyBkZWZpbmVkLCBidXQgaWYgdGhlcmUncyBhIGR1cGxpY2F0ZSBmaWVsZCBkZWZpbmVkLCBpdCdsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgbGFzdCBzY2hlbWEKICAgICMgaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vaXNzdWVzLzE1NjkKICAgIElkZW50aXR5V2l0aER1cGxpY2F0ZUZpZWxkOgogICAgICBhbGxPZjoKICAgICAgICAjIGBpc3N1ZXJgIHdpbGwgYmUgaWdub3JlZAogICAgICAgIC0gJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL0lkZW50aXR5JwogICAgICAgICMgYGlzc3VlcmAgd2lsbCBiZSBpZ25vcmVkCiAgICAgICAgLSBwcm9wZXJ0aWVzOgogICAgICAgICAgICBpc3N1ZXI6CiAgICAgICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgICMgYGlzc3VlcmAgd2lsbCB0YWtlIHByZWNlZGVuY2UKICAgICAgICAtIHByb3BlcnRpZXM6CiAgICAgICAgICAgIGlzc3VlcjoKICAgICAgICAgICAgICB0eXBlOiBvYmplY3QKICAgICAgICAgICAgICBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgbmFtZToKICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAgICAgcmVxdWlyZWQ6CiAgICAgICAgICAgICAgICAtIG5hbWUKCiAgICAjIGFueU9mIHJlc3VsdHMgaW4gYSB0eXBlIHRoYXQgaGFzIGFuIGBBc0NsaWVudGAvYE1lcmdlQ2xpZW50YC9gRnJvbUNsaWVudGAgYW5kIGFuIGBBc0lkZW50aXR5YC9gTWVyZ2VJZGVudGl0eWAvYEZyb21JZGVudGl0eWAgbWV0aG9kIHNvIHlvdSBjYW4gY2hvb3NlIHdoaWNoIG9mIHRoZW0geW91IHdhbnQgdG8gcmV0cmlldmUKICAgIENsaWVudEFuZE1heWJlSWRlbnRpdHk6CiAgICAgIGFueU9mOgogICAgICAgIC0gJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL0NsaWVudCcKICAgICAgICAtICRyZWY6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9JZGVudGl0eScKCiAgICAjIG9uZU9mIHJlc3VsdHMgaW4gYSB0eXBlIHRoYXQgaGFzIGFuIGBBc0NsaWVudGAvYE1lcmdlQ2xpZW50YC9gRnJvbUNsaWVudGAgYW5kIGFuIGBBc0lkZW50aXR5YC9gTWVyZ2VJZGVudGl0eWAvYEZyb21JZGVudGl0eWAgbWV0aG9kIHNvIHlvdSBjYW4gY2hvb3NlIHdoaWNoIG9mIHRoZW0geW91IHdhbnQgdG8gcmV0cmlldmUKICAgIENsaWVudE9ySWRlbnRpdHk6CiAgICAgIG9uZU9mOgogICAgICAgIC0gJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL0NsaWVudCcKICAgICAgICAtICRyZWY6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9JZGVudGl0eScKYGBgCgpUaGlzIHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyB0eXBlczoKCjxkZXRhaWxzPgoKPHN1bW1hcnk+QmFzZSB0eXBlczwvc3VtbWFyeT4KCmBgYGdvCi8vIENsaWVudCBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnQuCnR5cGUgQ2xpZW50IHN0cnVjdCB7CglOYW1lIHN0cmluZyBganNvbjoibmFtZSJgCn0KCi8vIElkZW50aXR5IGRlZmluZXMgbW9kZWwgZm9yIElkZW50aXR5Lgp0eXBlIElkZW50aXR5IHN0cnVjdCB7CglJc3N1ZXIgc3RyaW5nIGBqc29uOiJpc3N1ZXIiYAp9CmBgYAoKPC9kZXRhaWxzPgoKPGRldGFpbHM+Cgo8c3VtbWFyeT48Y29kZT5hbGxPZjwvY29kZT48L3N1bW1hcnk+CgpgYGBnbwovLyBDbGllbnRXaXRoSWQgZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50V2l0aElkLgp0eXBlIENsaWVudFdpdGhJZCBzdHJ1Y3QgewoJSWQgICBpbnQgICAgYGpzb246ImlkImAKCU5hbWUgc3RyaW5nIGBqc29uOiJuYW1lImAKfQoKLy8gSWRlbnRpdHlXaXRoRHVwbGljYXRlRmllbGQgZGVmaW5lcyBtb2RlbCBmb3IgSWRlbnRpdHlXaXRoRHVwbGljYXRlRmllbGQuCnR5cGUgSWRlbnRpdHlXaXRoRHVwbGljYXRlRmllbGQgc3RydWN0IHsKCUlzc3VlciBzdHJ1Y3QgewoJCU5hbWUgc3RyaW5nIGBqc29uOiJuYW1lImAKCX0gYGpzb246Imlzc3VlciJgCn0KYGBgCgo8L2RldGFpbHM+Cgo8ZGV0YWlscz4KCjxzdW1tYXJ5Pjxjb2RlPmFueU9mPC9jb2RlPjwvc3VtbWFyeT4KCmBgYGdvCmltcG9ydCAoCgkiZW5jb2RpbmcvanNvbiIKCgkiZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vcnVudGltZSIKKQoKLy8gQ2xpZW50QW5kTWF5YmVJZGVudGl0eSBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnRBbmRNYXliZUlkZW50aXR5Lgp0eXBlIENsaWVudEFuZE1heWJlSWRlbnRpdHkgc3RydWN0IHsKCXVuaW9uIGpzb24uUmF3TWVzc2FnZQp9CgovLyBBc0NsaWVudCByZXR1cm5zIHRoZSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSBhcyBhIENsaWVudApmdW5jICh0IENsaWVudEFuZE1heWJlSWRlbnRpdHkpIEFzQ2xpZW50KCkgKENsaWVudCwgZXJyb3IpIHsKCXZhciBib2R5IENsaWVudAoJZXJyIDo9IGpzb24uVW5tYXJzaGFsKHQudW5pb24sICZib2R5KQoJcmV0dXJuIGJvZHksIGVycgp9CgovLyBGcm9tQ2xpZW50IG92ZXJ3cml0ZXMgYW55IHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRBbmRNYXliZUlkZW50aXR5IGFzIHRoZSBwcm92aWRlZCBDbGllbnQKZnVuYyAodCAqQ2xpZW50QW5kTWF5YmVJZGVudGl0eSkgRnJvbUNsaWVudCh2IENsaWVudCkgZXJyb3IgewoJYiwgZXJyIDo9IGpzb24uTWFyc2hhbCh2KQoJdC51bmlvbiA9IGIKCXJldHVybiBlcnIKfQoKLy8gTWVyZ2VDbGllbnQgcGVyZm9ybXMgYSBtZXJnZSB3aXRoIGFueSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSwgdXNpbmcgdGhlIHByb3ZpZGVkIENsaWVudApmdW5jICh0ICpDbGllbnRBbmRNYXliZUlkZW50aXR5KSBNZXJnZUNsaWVudCh2IENsaWVudCkgZXJyb3IgewoJYiwgZXJyIDo9IGpzb24uTWFyc2hhbCh2KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCW1lcmdlZCwgZXJyIDo9IHJ1bnRpbWUuSlNPTk1lcmdlKHQudW5pb24sIGIpCgl0LnVuaW9uID0gbWVyZ2VkCglyZXR1cm4gZXJyCn0KCi8vIEFzSWRlbnRpdHkgcmV0dXJucyB0aGUgdW5pb24gZGF0YSBpbnNpZGUgdGhlIENsaWVudEFuZE1heWJlSWRlbnRpdHkgYXMgYSBJZGVudGl0eQpmdW5jICh0IENsaWVudEFuZE1heWJlSWRlbnRpdHkpIEFzSWRlbnRpdHkoKSAoSWRlbnRpdHksIGVycm9yKSB7Cgl2YXIgYm9keSBJZGVudGl0eQoJZXJyIDo9IGpzb24uVW5tYXJzaGFsKHQudW5pb24sICZib2R5KQoJcmV0dXJuIGJvZHksIGVycgp9CgovLyBGcm9tSWRlbnRpdHkgb3ZlcndyaXRlcyBhbnkgdW5pb24gZGF0YSBpbnNpZGUgdGhlIENsaWVudEFuZE1heWJlSWRlbnRpdHkgYXMgdGhlIHByb3ZpZGVkIElkZW50aXR5CmZ1bmMgKHQgKkNsaWVudEFuZE1heWJlSWRlbnRpdHkpIEZyb21JZGVudGl0eSh2IElkZW50aXR5KSBlcnJvciB7CgliLCBlcnIgOj0ganNvbi5NYXJzaGFsKHYpCgl0LnVuaW9uID0gYgoJcmV0dXJuIGVycgp9CgovLyBNZXJnZUlkZW50aXR5IHBlcmZvcm1zIGEgbWVyZ2Ugd2l0aCBhbnkgdW5pb24gZGF0YSBpbnNpZGUgdGhlIENsaWVudEFuZE1heWJlSWRlbnRpdHksIHVzaW5nIHRoZSBwcm92aWRlZCBJZGVudGl0eQpmdW5jICh0ICpDbGllbnRBbmRNYXliZUlkZW50aXR5KSBNZXJnZUlkZW50aXR5KHYgSWRlbnRpdHkpIGVycm9yIHsKCWIsIGVyciA6PSBqc29uLk1hcnNoYWwodikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCgltZXJnZWQsIGVyciA6PSBydW50aW1lLkpTT05NZXJnZSh0LnVuaW9uLCBiKQoJdC51bmlvbiA9IG1lcmdlZAoJcmV0dXJuIGVycgp9CgpmdW5jICh0IENsaWVudEFuZE1heWJlSWRlbnRpdHkpIE1hcnNoYWxKU09OKCkgKFtdYnl0ZSwgZXJyb3IpIHsKCWIsIGVyciA6PSB0LnVuaW9uLk1hcnNoYWxKU09OKCkKCXJldHVybiBiLCBlcnIKfQoKZnVuYyAodCAqQ2xpZW50QW5kTWF5YmVJZGVudGl0eSkgVW5tYXJzaGFsSlNPTihiIFtdYnl0ZSkgZXJyb3IgewoJZXJyIDo9IHQudW5pb24uVW5tYXJzaGFsSlNPTihiKQoJcmV0dXJuIGVycgp9CgoKYGBgCgo8L2RldGFpbHM+Cgo8ZGV0YWlscz4KCjxzdW1tYXJ5Pjxjb2RlPm9uZU9mPC9jb2RlPjwvc3VtbWFyeT4KCmBgYGdvCi8vIEFzQ2xpZW50IHJldHVybnMgdGhlIHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRPcklkZW50aXR5IGFzIGEgQ2xpZW50CmZ1bmMgKHQgQ2xpZW50T3JJZGVudGl0eSkgQXNDbGllbnQoKSAoQ2xpZW50LCBlcnJvcikgewoJdmFyIGJvZHkgQ2xpZW50CgllcnIgOj0ganNvbi5Vbm1hcnNoYWwodC51bmlvbiwgJmJvZHkpCglyZXR1cm4gYm9keSwgZXJyCn0KCi8vIEZyb21DbGllbnQgb3ZlcndyaXRlcyBhbnkgdW5pb24gZGF0YSBpbnNpZGUgdGhlIENsaWVudE9ySWRlbnRpdHkgYXMgdGhlIHByb3ZpZGVkIENsaWVudApmdW5jICh0ICpDbGllbnRPcklkZW50aXR5KSBGcm9tQ2xpZW50KHYgQ2xpZW50KSBlcnJvciB7CgliLCBlcnIgOj0ganNvbi5NYXJzaGFsKHYpCgl0LnVuaW9uID0gYgoJcmV0dXJuIGVycgp9CgovLyBNZXJnZUNsaWVudCBwZXJmb3JtcyBhIG1lcmdlIHdpdGggYW55IHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRPcklkZW50aXR5LCB1c2luZyB0aGUgcHJvdmlkZWQgQ2xpZW50CmZ1bmMgKHQgKkNsaWVudE9ySWRlbnRpdHkpIE1lcmdlQ2xpZW50KHYgQ2xpZW50KSBlcnJvciB7CgliLCBlcnIgOj0ganNvbi5NYXJzaGFsKHYpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJbWVyZ2VkLCBlcnIgOj0gcnVudGltZS5KU09OTWVyZ2UodC51bmlvbiwgYikKCXQudW5pb24gPSBtZXJnZWQKCXJldHVybiBlcnIKfQoKLy8gQXNJZGVudGl0eSByZXR1cm5zIHRoZSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50T3JJZGVudGl0eSBhcyBhIElkZW50aXR5CmZ1bmMgKHQgQ2xpZW50T3JJZGVudGl0eSkgQXNJZGVudGl0eSgpIChJZGVudGl0eSwgZXJyb3IpIHsKCXZhciBib2R5IElkZW50aXR5CgllcnIgOj0ganNvbi5Vbm1hcnNoYWwodC51bmlvbiwgJmJvZHkpCglyZXR1cm4gYm9keSwgZXJyCn0KCi8vIEZyb21JZGVudGl0eSBvdmVyd3JpdGVzIGFueSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50T3JJZGVudGl0eSBhcyB0aGUgcHJvdmlkZWQgSWRlbnRpdHkKZnVuYyAodCAqQ2xpZW50T3JJZGVudGl0eSkgRnJvbUlkZW50aXR5KHYgSWRlbnRpdHkpIGVycm9yIHsKCWIsIGVyciA6PSBqc29uLk1hcnNoYWwodikKCXQudW5pb24gPSBiCglyZXR1cm4gZXJyCn0KCi8vIE1lcmdlSWRlbnRpdHkgcGVyZm9ybXMgYSBtZXJnZSB3aXRoIGFueSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50T3JJZGVudGl0eSwgdXNpbmcgdGhlIHByb3ZpZGVkIElkZW50aXR5CmZ1bmMgKHQgKkNsaWVudE9ySWRlbnRpdHkpIE1lcmdlSWRlbnRpdHkodiBJZGVudGl0eSkgZXJyb3IgewoJYiwgZXJyIDo9IGpzb24uTWFyc2hhbCh2KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCW1lcmdlZCwgZXJyIDo9IHJ1bnRpbWUuSlNPTk1lcmdlKHQudW5pb24sIGIpCgl0LnVuaW9uID0gbWVyZ2VkCglyZXR1cm4gZXJyCn0KCmZ1bmMgKHQgQ2xpZW50T3JJZGVudGl0eSkgTWFyc2hhbEpTT04oKSAoW11ieXRlLCBlcnJvcikgewoJYiwgZXJyIDo9IHQudW5pb24uTWFyc2hhbEpTT04oKQoJcmV0dXJuIGIsIGVycgp9CgpmdW5jICh0ICpDbGllbnRPcklkZW50aXR5KSBVbm1hcnNoYWxKU09OKGIgW11ieXRlKSBlcnJvciB7CgllcnIgOj0gdC51bmlvbi5Vbm1hcnNoYWxKU09OKGIpCglyZXR1cm4gZXJyCn0KYGBgCgo8L2RldGFpbHM+CgpGb3IgbW9yZSBpbmZvLCBjaGVjayBvdXQgW3RoZSBleGFtcGxlIGNvZGVdKGV4YW1wbGVzL2FueW9mLWFsbG9mLW9uZW9mLykuCgojIyMgSG93IGNhbiBJIGlnbm9yZSBwYXJ0cyBvZiB0aGUgc3BlYyBJIGRvbid0IGNhcmUgYWJvdXQ/CgpCeSBkZWZhdWx0LCBgb2FwaS1jb2RlZ2VuYCB3aWxsIGdlbmVyYXRlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KCklmIHlvdSdkIGxpa2UgdG8gcmVkdWNlIHdoYXQncyBnZW5lcmF0ZWQsIHlvdSBjYW4gdXNlIG9uZSBvZiBhIGZldyBvcHRpb25zIGluIFt0aGUgY29uZmlndXJhdGlvbiBmaWxlXSgjdXNhZ2UpIHRvIHR1bmUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIHJlc3VsdGluZyBvdXRwdXQ6CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6ICRzY2hlbWE9aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vSEVBRC9jb25maWd1cmF0aW9uLXNjaGVtYS5qc29uCm91dHB1dC1vcHRpb25zOgogIGluY2x1ZGUtdGFnczogW10KICBleGNsdWRlLXRhZ3M6IFtdCiAgaW5jbHVkZS1vcGVyYXRpb24taWRzOiBbXQogIGV4Y2x1ZGUtb3BlcmF0aW9uLWlkczogW10KICBleGNsdWRlLXNjaGVtYXM6IFtdCmBgYAoKQ2hlY2sgW3RoZSBkb2NzXShodHRwczovL3BrZy5nby5kZXYvZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyL3BrZy9jb2RlZ2VuI091dHB1dE9wdGlvbnMpIGZvciBtb3JlIGRldGFpbHMgb2YgdXNhZ2UuCgojIyMgU2hvdWxkIEkgY29tbWl0IHRoZSBnZW5lcmF0ZWQgY29kZT8KCldlIHJlY29tbWVuZCBkb2luZyBzbywgeWVzLCBmb3IgdGhlIGZvbGxvd2luZyByZWFzb25zOgoKLSBJdCBtZWFucyBpdCdzIGVhc2llciB0byB2aWV3IHRoZSBpbXBhY3Qgb2YgYSBjaGFuZ2UgLSBiZSBpdCBkdWUgdG8gYW4gdXBncmFkZSBvZiBgb2FwaS1jb2RlZ2VuYCwgb3IgYSBjaGFuZ2UgdG8geW91ciBzcGVjIC0gYW5kIGhhcyBoZWxwZWQgY2F0Y2ggKHBvc3NpYmx5KSBicmVha2luZyBjaGFuZ2VzIGluIHRoZSBwYXN0IG1vcmUgZWFzaWx5Ci0gSXQgdGhlbiBhbGxvd3MgeW91ciBjb2RlYmFzZSB0byBiZSBjb25zdW1lZCBhcyBhIGxpYnJhcnksIGFzIGFsbCB0aGUgZmlsZXMgYXJlIGNvbW1pdHRlZAoKVGhpcyBtZWFucyB5b3UnbGwgbmVlZCB0byBoYXZlIHlvdXIgQ0kvQ0QgcGlwZWxpbmUgdmFsaWRhdGUgdGhhdCBnZW5lcmF0ZWQgZmlsZXMgYXJlIGFsbCB1cC10by1kYXRlLCBidXQgdGhhdCdzIGEgZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZCBwaWVjZSBvZiB3b3JrLgoKIyMjIFNob3VsZCBJIGxpbnQgdGhlIGdlbmVyYXRlZCBjb2RlPwoKV2UgcmVhbGx5IGFzayB0aGF0IHlvdSBkb24ndC4gQWx0aG91Z2ggaXQgaW50ZW5kcyB0byBiZSBpZGlvbWF0aWMgR28gY29kZSwgaXQncyBub3QgZXhwZWN0ZWQgdG8gcGFzcyBhbGwgdGhlIHZhcmlvdXMgbGludGluZyBydWxlcyB0aGF0IHlvdXIgcHJvamVjdCBtYXkgYXBwbHkuCgo+IFshTk9URV0KPiBXZSB3aWxsLCBvbiBvY2Nhc2lvbiwgaW1wcm92ZSB0aGUgZ2VuZXJhdGVkIGNvZGUgdG8gZml4IHNvbWUgbGludGluZyB3YXJuaW5ncywgc3VjaCBhcyB0aG9zZSBmcm9tIGBnbyB2ZXRgLCBidXQgdGhpcyBzaG91bGQgbm90IGJlIGFuIGV4cGVjdGVkIGNoYW5nZS4KCiMjIyBJJ3ZlIGp1c3QgdXBkYXRlZCBteSB2ZXJzaW9uIG9mIGBraW4tb3BlbmFwaWAsIGFuZCBub3cgSSBjYW4ndCBidWlsZCBteSBjb2RlIPCfmKAKClRoZSBba2luLW9wZW5hcGldKGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRraW4va2luLW9wZW5hcGkpIHByb2plY3QgLSB3aGljaCB3ZSDwn5KcIGZvciBwcm92aWRpbmcgYSBncmVhdCBsaWJyYXJ5IGFuZCBzZXQgb2YgdG9vbGluZyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBPcGVuQVBJIC0gaXMgYSBwcmUtdjEgcmVsZWFzZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGV5J3JlIHdpdGhpbiB0aGVpciByaWdodHMgdG8gcHVzaCBicmVha2luZyBjaGFuZ2VzLgoKVGhpcyBtYXkgbGVhZCB0byBicmVha2FnZSBpbiB5b3VyIGNvbnN1bWluZyBjb2RlLCBhbmQgaWYgc28sIHNvcnJ5IHRoYXQncyBoYXBwZW5lZCEKCldlJ2xsIGJlIGF3YXJlIG9mIHRoZSBpc3N1ZSwgYW5kIHdpbGwgd29yayB0byB1cGRhdGUgYm90aCB0aGUgY29yZSBgb2FwaS1jb2RlZ2VuYCBhbmQgdGhlIG1pZGRsZXdhcmVzIGFjY29yZGluZ2x5LgoKIyMgU3BvbnNvcnMKCkZvciB0aGUgbW9zdCBwYXJ0LCBgb2FwaS1jb2RlZ2VuYCBpcyBtYWludGFpbmVkIGluIHR3byBidXN5IHBlb3BsZXMnIGZyZWUgdGltZS4gQXMgbm90ZWQgaW4gW0NyZWF0aW5nIGEgbW9yZSBzdXN0YWluYWJsZSBtb2RlbCBmb3IgYG9hcGktY29kZWdlbmAgaW4gdGhlIGZ1dHVyZV0oaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vZGlzY3Vzc2lvbnMvMTYwNiksIHdlJ3JlIGxvb2tpbmcgdG8gbWFrZSB0aGlzIGEgbW9yZSBzdXN0YWluYWJsZSBwcm9qZWN0IGluIHRoZSBmdXR1cmUuCgpXZSdyZSB2ZXJ5IGFwcHJlY2lhdGl2ZSBvZiBbdGhlIG1hbnkgY29udHJpYnV0b3JzIG92ZXIgdGhlIHllYXJzXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9ncmFwaHMvY29udHJpYnV0b3JzKSBhbmQgdGhlIG9uZ29pbmcgdXNlIG9mIHRoZSBwcm9qZWN0IPCfkpwKClBsZWFzZSBjb25zaWRlciBzcG9uc29yaW5nIHVzIHRocm91Z2ggR2l0SHViIFNwb25zb3JzIGVpdGhlciBbb24gdGhlIG9yZ2FuaXNhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL29hcGktY29kZWdlbi8pIG9yIFtkaXJlY3RseSBmb3IgSmFtaWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycy9qYW1pZXRhbm5hLyksIHdoaWNoIGhlbHBzIHdvcmsgdG93YXJkcyB1cyBiZWluZyBhYmxlIHRvIG1haW50YWluIHRoZSBwcm9qZWN0IGxvbmcgdGVybS4KClNlZSBbdGhpcyBibG9nIHBvc3QgZnJvbSBUaWRlbGlmdF0oaHR0cHM6Ly9ibG9nLnRpZGVsaWZ0LmNvbS9wYXlpbmctbWFpbnRhaW5lcnMtdGhlLWhvd3RvKSBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byB0YWxrIHRvIHlvdXIgY29tcGFueSBhYm91dCBzcG9uc29yaW5nIG1haW50YWluZXJzIG9mIChPcGVuIFNvdXJjZSkgcHJvamVjdHMgeW91IGRlcGVuZCBvbi4KCldlIGFyZSBjdXJyZW50bHkgc3BvbnNvcmVkIGZvciA0IGhvdXJzIG9mIHdvcmsgYSBtb250aCBieSBFbGFzdGljOgoKPHAgYWxpZ249ImNlbnRlciI+Cgk8YSBocmVmPSJodHRwczovL2VsYXN0aWMuY28/dXRtX3NvdXJjZT1vYXBpLWNvZGVnZW4rcmVwbyZ1dG1fbWVkaXVtPWdpdGh1YitzcG9uc29yc2hpcCI+CgkJPHBpY3R1cmU+CgkJICA8c291cmNlIG1lZGlhPSIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSIgc3Jjc2V0PSIuZ2l0aHViL3Nwb25zb3JzL2VsYXN0aWMtbGlnaHQuc3ZnIj4KCQkgIDxzb3VyY2UgbWVkaWE9IihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiIHNyY3NldD0iLmdpdGh1Yi9zcG9uc29ycy9lbGFzdGljLWRhcmsuc3ZnIj4KCQkgIDxpbWcgYWx0PSJFbGFzdGljIGxvZ28iIHNyYz0iLmdpdGh1Yi9zcG9uc29ycy9lbGFzdGljLWRhcmsuc3ZnIiBoZWlnaHQ9IjEwMHB4Ij4KCQk8L3BpY3R1cmU+Cgk8L2E+CjwvcD4KCkluIGFkZGl0aW9uLCB3ZSBhcmUgYWxzbyBnZW5lcm91c2x5IHNwb25zb3JlZCBieSB0aGUgZm9sbG93aW5nIGZvbGtzLCBlYWNoIG9mIHdob20gcHJvdmlkZSBzcG9uc29yc2hpcCBmb3IgMSBob3VyIG9mIHdvcmsgYSBtb250aDoKCjxwIGFsaWduPSJjZW50ZXIiPgoJPGEgaHJlZj0iaHR0cHM6Ly93d3cuZGV2emVyby5pby9scC9kZXYtZW52aXJvbm1lbnQ/dXRtX2NhbXBhaWduPWdpdGh1YiZ1dG1fc291cmNlPW9hcGktY29kZWdlbiUyMHJlcG8mdXRtX21lZGl1bT1naXRodWIlMjBzcG9uc29yc2hpcCI+CgkJPHBpY3R1cmU+CgkJICA8c291cmNlIG1lZGlhPSIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSIgc3Jjc2V0PSIuZ2l0aHViL3Nwb25zb3JzL2Rldnplcm8tbGlnaHQuc3ZnIj4KCQkgIDxzb3VyY2UgbWVkaWE9IihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiIHNyY3NldD0iLmdpdGh1Yi9zcG9uc29ycy9kZXZ6ZXJvLWRhcmsuc3ZnIj4KCQkgIDxpbWcgYWx0PSJEZXZaZXJvIGxvZ28iIHNyYz0iLmdpdGh1Yi9zcG9uc29ycy9kZXZ6ZXJvLWRhcmsuc3ZnIiBoZWlnaHQ9IjEwMHB4Ij4KCQk8L3BpY3R1cmU+Cgk8L2E+CjwvcD4KCjxwIGFsaWduPSJjZW50ZXIiPgoJPGEgaHJlZj0iaHR0cHM6Ly9zcGVha2Vhc3kuY29tP3V0bV9zb3VyY2U9b2FwaS1jb2RlZ2VuK3JlcG8mdXRtX21lZGl1bT1naXRodWIrc3BvbnNvcnNoaXAiPgoJCTxwaWN0dXJlPgoJCSAgPHNvdXJjZSBtZWRpYT0iKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCkiIHNyY3NldD0iLmdpdGh1Yi9zcG9uc29ycy9zcGVha2Vhc3ktbGlnaHQuc3ZnIj4KCQkgIDxzb3VyY2UgbWVkaWE9IihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiIHNyY3NldD0iLmdpdGh1Yi9zcG9uc29ycy9zcGVha2Vhc3ktZGFyay5zdmciPgoJCSAgPGltZyBhbHQ9IlNwZWFrZWFzeSBsb2dvIiBzcmM9Ii5naXRodWIvc3BvbnNvcnMvc3BlYWtlYXN5LWRhcmsuc3ZnIiBoZWlnaHQ9IjEwMHB4Ij4KCQk8L3BpY3R1cmU+Cgk8L2E+CjwvcD4KCjxwIGFsaWduPSJjZW50ZXIiPgoJPGEgaHJlZj0iaHR0cHM6Ly9jeWJvenUuY28uanAvP3V0bV9zb3VyY2U9b2FwaS1jb2RlZ2VuK3JlcG8mdXRtX21lZGl1bT1naXRodWIrc3BvbnNvcnNoaXAiPgoJCTxpbWcgYWx0PSJDeWJvenUgbG9nbyIgc3JjPSIuZ2l0aHViL3Nwb25zb3JzL2N5Ym96dS5zdmciIGhlaWdodD0iMTAwcHgiPgoJPC9hPgo8L3A+CgooTm90ZSB0aGF0IHRoZSBvcmRlciBvZiBhcHBlYXJhbmNlIHRoZSBvcmRlciBpbiB3aGljaCBzcG9uc29yc2hpcCB3YXMgcmVjZWl2ZWQpCg==
- readmeEtag: '"05929664635a9c70705a7e1ce71b7597e1c8056c"'
- readmeLastModified: Fri, 04 Oct 2024 16:38:26 GMT
+ IyBgb2FwaS1jb2RlZ2VuYAoKWyFbT3BlblNTRiBCZXN0IFByYWN0aWNlc10oaHR0cHM6Ly93d3cuYmVzdHByYWN0aWNlcy5kZXYvcHJvamVjdHMvOTQ1MC9iYWRnZSldKGh0dHBzOi8vd3d3LmJlc3RwcmFjdGljZXMuZGV2L3Byb2plY3RzLzk0NTApCgpgb2FwaS1jb2RlZ2VuYCBpcyBhIGNvbW1hbmQtbGluZSB0b29sIGFuZCBsaWJyYXJ5IHRvIGNvbnZlcnQgT3BlbkFQSSBzcGVjaWZpY2F0aW9ucyB0byBHbyBjb2RlLCBiZSBpdCBbc2VydmVyLXNpZGUgaW1wbGVtZW50YXRpb25zXSgjZ2VuZXJhdGluZy1zZXJ2ZXItc2lkZS1ib2lsZXJwbGF0ZSksIFtBUEkgY2xpZW50c10oI2dlbmVyYXRpbmctYXBpLWNsaWVudHMpLCBvciBzaW1wbHkgW0hUVFAgbW9kZWxzXSgjZ2VuZXJhdGluZy1hcGktbW9kZWxzKS4KClVzaW5nIGBvYXBpLWNvZGVnZW5gIGFsbG93cyB5b3UgdG8gcmVkdWNlIHRoZSBib2lsZXJwbGF0ZSByZXF1aXJlZCB0byBjcmVhdGUgb3IgaW50ZWdyYXRlIHdpdGggc2VydmljZXMgYmFzZWQgb24gW09wZW5BUEkgMy4wXShodHRwczovL2dpdGh1Yi5jb20vT0FJL09wZW5BUEktU3BlY2lmaWNhdGlvbi9ibG9iL21haW4vdmVyc2lvbnMvMy4wLjAubWQpLCBhbmQgaW5zdGVhZCBmb2N1cyBvbiB3cml0aW5nIHlvdXIgYnVzaW5lc3MgbG9naWMsIGFuZCB3b3JraW5nIG9uIHRoZSByZWFsIHZhbHVlLWFkZCBmb3IgeW91ciBvcmdhbmlzYXRpb24uCgpXaXRoIGBvYXBpLWNvZGVnZW5gLCB0aGVyZSBhcmUgYSBmZXcgW0tleSBEZXNpZ24gRGVjaXNpb25zXSgja2V5LWRlc2lnbi1kZWNpc2lvbnMpIHdlJ3ZlIG1hZGUsIGluY2x1ZGluZzoKCi0gaWRpb21hdGljIEdvLCB3aGVyZSBwb3NzaWJsZQotIGZhaXJseSBzaW1wbGUgZ2VuZXJhdGVkIGNvZGUsIGVycmluZyBvbiB0aGUgc2lkZSBvZiBkdXBsaWNhdGUgY29kZSBvdmVyIG5pY2VseSByZWZhY3RvcmVkIGNvZGUKLSBzdXBwb3J0aW5nIGFzIG11Y2ggb2YgT3BlbkFQSSAzLnggYXMgaXMgcG9zc2libGUsIGFsb25nc2lkZSBHbydzIHR5cGUgc3lzdGVtCgpgb2FwaS1jb2RlZ2VuYCBpcyBvbmUgcGFydCBvZiBhIHdpZGVyIGVjb3N5c3RlbSwgd2hpY2ggY2FuIGJlIGZvdW5kIGRlc2NyaWJlZCBpbiBmdXJ0aGVyIGRldGFpbCBpbiB0aGUgW29hcGktY29kZWdlbiBvcmdhbmlzYXRpb24gb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuKS4KCuKaoO+4jyBUaGlzIFJFQURNRSBtYXkgYmUgZm9yIHRoZSBsYXRlc3QgZGV2ZWxvcG1lbnQgdmVyc2lvbiwgd2hpY2ggbWF5IGNvbnRhaW4gdW5yZWxlYXNlZCBjaGFuZ2VzLiBQbGVhc2UgZW5zdXJlIHlvdSdyZSBsb29raW5nIGF0IHRoZSBSRUFETUUgZm9yIHRoZSBsYXRlc3QgcmVsZWFzZSB2ZXJzaW9uLgoKIyMgQWN0aW9uIFJlcXVpcmVkOiBUaGUgcmVwb3NpdG9yeSBmb3IgdGhpcyBwcm9qZWN0IGhhcyBjaGFuZ2VkCgpBcyBhbm5vdW5jZWQgaW4gW01heSAyMDI0XShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9kaXNjdXNzaW9ucy8xNjA1KSwKd2UgaGF2ZSBtb3ZlZCB0aGUgcHJvamVjdCBmcm9tIHRoZSBkZWVwbWFwIG9yZ2FuaXphdGlvbiB0byBvdXIgb3duIG9yZ2FuaXphdGlvbiwgYW5kIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHlvdXIKaW1wb3J0IHBhdGhzIHRvIHB1bGwgdXBkYXRlcyBwYXN0IHRoaXMgcG9pbnQuIFlvdSBuZWVkIHRvIGRvIGEgcmVjdXJzaXZlIHNlYXJjaC9yZXBsYWNlIGZyb20KYGdpdGh1Yi5jb20vZGVlcG1hcC9vYXBpLWNvZGVnZW4vdjJgIHRvIGBnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjJgLgoKPiBbIUlNUE9SVEFOVF0KPiBgb2FwaS1jb2RlZ2VuYCBtb3ZlZCB0byBpdHMgbmV3IGhvbWUgd2l0aCB0aGUgdmVyc2lvbiB0YWcgYHYyLjMuMGAuCgpJZiB5b3UgYXJlIHVzaW5nIGB2Mi4yLjBgIG9yIGJlbG93LCBwbGVhc2UgaW5zdGFsbCBsaWtlIHNvOgoKYGBgc2gKIyBmb3IgdGhlIGJpbmFyeSBpbnN0YWxsCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9kZWVwbWFwL29hcGktY29kZWdlbi92Mi9jbWQvb2FwaS1jb2RlZ2VuQHYyLjIuMApgYGAKCklmIHlvdSBhcmUgdXNpbmcgYHYyLjMuMGAgb3IgYWJvdmUsIHBsZWFzZSBpbnN0YWxsIGxpa2Ugc28sIHVzaW5nIHRoZSBuZXcgbW9kdWxlIGltcG9ydCBwYXRoOgoKYGBgc2gKIyBmb3IgdGhlIGJpbmFyeSBpbnN0YWxsCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyL2NtZC9vYXBpLWNvZGVnZW5AbGF0ZXN0CmBgYAoKIyMgSW5zdGFsbAoKSXQgaXMgcmVjb21tZW5kZWQgdG8gZm9sbG93IFt0aGUgYHRvb2xzLmdvYCBwYXR0ZXJuXShodHRwczovL3d3dy5qdnQubWUvcG9zdHMvMjAyMi8wNi8xNS9nby10b29scy1kZXBlbmRlbmN5LW1hbmFnZW1lbnQvKSBmb3IgbWFuYWdpbmcgdGhlIGRlcGVuZGVuY3kgb2YgYG9hcGktY29kZWdlbmAgYWxvbmdzaWRlIHlvdXIgY29yZSBhcHBsaWNhdGlvbi4KClRoaXMgd291bGQgZ2l2ZSB5b3UgYSBgdG9vbHMvdG9vbHMuZ29gOgoKYGBgZ28KLy9nbzpidWlsZCB0b29scwovLyArYnVpbGQgdG9vbHMKCnBhY2thZ2UgbWFpbgoKaW1wb3J0ICgKCV8gImdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9jbWQvb2FwaS1jb2RlZ2VuIgopCmBgYAoKVGhlbiwgZWFjaCBpbnZvY2F0aW9uIG9mIGBvYXBpLWNvZGVnZW5gIHdvdWxkIGJlIHVzZWQgbGlrZSBzbzoKCmBgYGdvCi8vZ286Z2VuZXJhdGUgZ28gcnVuIGdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9jbWQvb2FwaS1jb2RlZ2VuIC0tY29uZmlnPWNvbmZpZy55YW1sIC4uLy4uL2FwaS55YW1sCmBgYAoKQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBpbnN0YWxsIGl0IGFzIGEgYmluYXJ5IHdpdGg6CgpgYGBzaAokIGdvIGluc3RhbGwgZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyL2NtZC9vYXBpLWNvZGVnZW5AbGF0ZXN0CiQgb2FwaS1jb2RlZ2VuIC12ZXJzaW9uCmBgYAoKV2hpY2ggdGhlbiBtZWFucyB5b3UgY2FuIGludm9rZSBpdCBsaWtlIHNvOgoKYGBgZ28KLy9nbzpnZW5lcmF0ZSBvYXBpLWNvZGVnZW4gLS1jb25maWc9Y29uZmlnLnlhbWwgLi4vLi4vYXBpLnlhbWwKYGBgCgpOb3RlIHRoYXQgeW91IGNhbiBhbHNvIFttb3ZlIHlvdXIgYHRvb2xzLmdvYCBpbnRvIGl0cyBvd24gc3ViLW1vZHVsZV0oaHR0cHM6Ly93d3cuanZ0Lm1lL3Bvc3RzLzIwMjQvMDkvMzAvZ28tdG9vbHMtbW9kdWxlLykgdG8gcmVkdWNlIHRoZSBpbXBhY3Qgb24geW91ciB0b3AtbGV2ZWwgYGdvLm1vZGAuCgojIyMgUGlubmluZyB0byBjb21taXRzCgpXaGlsZSB0aGUgcHJvamVjdCBkb2VzIG5vdCAoW3lldF0oaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vaXNzdWVzLzE1MTkpKSBoYXZlIGEgZGVmaW5lZCByZWxlYXNlIGNhZGVuY2UsIHRoZXJlIG1heSBiZSBjYXNlcyB3aGVyZSB5b3Ugd2FudCB0byBwdWxsIGluIHlldC11bnJlbGVhc2VkIGNoYW5nZXMgdG8geW91ciBjb2RlYmFzZS4KClRoZXJlZm9yZSwgeW91IG1heSB3YW50IHRvIHBpbiB5b3VyIGRlcGVuZGVuY3kgb24gYG9hcGktY29kZWdlbmAgdG8gYSBnaXZlbiBjb21taXQgaGFzaCwgcmF0aGVyIHRoYW4gYSB0YWcuCgpUaGlzIGlzICoqb2ZmaWNpYWxseSByZWNvbW1lbmRlZCoqIGZvciBjb25zdW1lcnMgb2YgYG9hcGktY29kZWdlbmAsIHdobyB3YW50IGZlYXR1cmVzL2J1ZyBmaXhlcyB0aGF0IGhhdmVuJ3QgeWV0IGJlZW4gcmVsZWFzZWQuCgpXZSBhaW0gdG8ga2VlcCB0aGUgZGVmYXVsdCBicmFuY2ggcmVhZHktdG8tcmVsZWFzZSBzbyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gc2FmZWx5IHBpbi4KClRvIGRvIHNvLCB5b3UgY2FuIHJ1bjoKCmBgYHNoCiMgcGluIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvbiB0aGUgZGVmYXVsdCBicmFuY2gKJCBnbyBnZXQgZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyQG1haW4KIyBhbHRlcm5hdGl2ZWx5LCB0byBhIGNvbW1pdCBoYXNoIGkuZS4gaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vY29tbWl0LzcxZTkxNmM1OTY4OGE2Mzc5YjU3NzRkZmU1OTA0ZWMyMjJiOWE1MzcKJCBnbyBnZXQgZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyQDcxZTkxNmM1OTY4OGE2Mzc5YjU3NzRkZmU1OTA0ZWMyMjJiOWE1MzcKYGBgCgpUaGlzIHdpbGwgdGhlbiBtYWtlIGEgY2hhbmdlIHN1Y2ggYXM6CgpgYGBkaWZmCmRpZmYgLS1naXQgZ28ubW9kIGdvLm1vZAppbmRleCA0NGYyOWE0Li40MzZhNzgwIDEwMDY0NAotLS0gZ28ubW9kCisrKyBnby5tb2QKQEAgLTIsMjEgKzIsMjAgQEAKLXJlcXVpcmUgZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyIHYyLjEuMAorcmVxdWlyZSBnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIgdjIuMS4xLTAuMjAyNDAzMzEyMTI1MTQtODBmMGI5NzhlZjE2CmBgYAoKIyMgVXNhZ2UKCmBvYXBpLWNvZGVnZW5gIGlzIGxhcmdlbHkgY29uZmlndXJlZCB1c2luZyBhIFlBTUwgY29uZmlndXJhdGlvbiBmaWxlLCB0byBzaW1wbGlmeSB0aGUgbnVtYmVyIG9mIGZsYWdzIHRoYXQgdXNlcnMgbmVlZCB0byByZW1lbWJlciwgYW5kIHRvIG1ha2UgcmVhZGluZyB0aGUgYGdvOmdlbmVyYXRlYCBjb21tYW5kIGxlc3MgZGF1bnRpbmcuCgpGb3IgZnVsbCBkZXRhaWxzIG9mIHdoYXQgaXMgc3VwcG9ydGVkLCBpdCdzIHdvcnRoIGNoZWNraW5nIG91dCBbdGhlIEdvRG9jIGZvciBgY29kZWdlbi5Db25maWd1cmF0aW9uYF0oaHR0cHM6Ly9wa2cuZ28uZGV2L2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9wa2cvY29kZWdlbiNDb25maWd1cmF0aW9uKS4KCldlIGFsc28gaGF2ZSBbYSBKU09OIFNjaGVtYV0oY29uZmlndXJhdGlvbi1zY2hlbWEuanNvbikgdGhhdCBjYW4gYmUgdXNlZCBieSBJREVzL2VkaXRvcnMgd2l0aCB0aGUgTGFuZ3VhZ2UgU2VydmVyIFByb3RvY29sIChMU1ApIHRvIHBlcmZvcm0gaW50ZWxsaWdlbnQgc3VnZ2VzdGlvbnMsIGkuZS46CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6ICRzY2hlbWE9aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vSEVBRC9jb25maWd1cmF0aW9uLXNjaGVtYS5qc29uCnBhY2thZ2U6IGFwaQojIC4uLgpgYGAKCiMjIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoKQWx0aG91Z2ggd2Ugc3RyaXZlIHRvIHJldGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAtIGFzIGEgcHJvamVjdCB0aGF0J3MgdXNpbmcgYSBzdGFibGUgQVBJIHBlciBTZW1WZXIgLSB0aGVyZSBhcmUgc29tZXRpbWVzIG9wcG9ydHVuaXRpZXMgd2UgbXVzdCB0YWtlIHRvIGZpeCBhIGJ1ZyB0aGF0IGNvdWxkIGNhdXNlIGEgYnJlYWtpbmcgY2hhbmdlIGZvciBbcGVvcGxlIHJlbHlpbmcgdXBvbiB0aGUgYmVoYXZpb3VyXShodHRwczovL3hrY2QuY29tLzExNzIvKS4KCkluIHRoaXMgY2FzZSwgd2Ugd2lsbCBleHBvc2UgYSBbY29tcGF0aWJpbGl0eSBvcHRpb25dKGh0dHBzOi8vcGtnLmdvLmRldi9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvcGtnL2NvZGVnZW4jQ29tcGF0aWJpbGl0eU9wdGlvbnMpIHRvIHJlc3RvcmUgb2xkIGJlaGF2aW91ci4KCiMjIEZlYXR1cmVzCgpBdCBhIGhpZ2ggbGV2ZWwsIGBvYXBpLWNvZGVnZW5gIHN1cHBvcnRzOgoKLSBHZW5lcmF0aW5nIHNlcnZlci1zaWRlIGJvaWxlcnBsYXRlIGZvciBbYSBudW1iZXIgb2Ygc2VydmVyc10oI3N1cHBvcnRlZC1zZXJ2ZXJzKSAoW2RvY3NdKCNnZW5lcmF0aW5nLXNlcnZlci1zaWRlLWJvaWxlcnBsYXRlKSkKLSBHZW5lcmF0aW5nIGNsaWVudCBBUEkgYm9pbGVycGxhdGUgKFtkb2NzXSgjZ2VuZXJhdGluZy1hcGktY2xpZW50cykpCi0gR2VuZXJhdGluZyB0aGUgdHlwZXMgKFtkb2NzXSgjZ2VuZXJhdGluZy1hcGktbW9kZWxzKSkKLSBTcGxpdHRpbmcgbGFyZ2UgT3BlbkFQSSBzcGVjcyBhY3Jvc3MgbXVsdGlwbGUgcGFja2FnZXMoW2RvY3NdKCNpbXBvcnQtbWFwcGluZykpCiAgLSBUaGlzIGlzIGFsc28ga25vd24gYXMgIkltcG9ydCBNYXBwaW5nIiBvciAiZXh0ZXJuYWwgcmVmZXJlbmNlcyIgYWNyb3NzIG91ciBkb2N1bWVudGF0aW9uIC8gZGlzY3Vzc2lvbiBpbiBHaXRIdWIgaXNzdWVzCgojIyBXaGF0IGRvZXMgaXQgbG9vayBsaWtlPwoKQmVsb3cgd2UgY2FuIHNlZSBhIHRyaW1tZWQgZG93biBleGFtcGxlIHRha2VuIGZyb20gdGhlIE9wZW5BUEkgUGV0c3RvcmUgW2V4YW1wbGVdKGV4YW1wbGVzL3BldHN0b3JlLWV4cGFuZGVkL3N0ZGh0dHAvYXBpL3BldHN0b3JlLmdlbi5nbyk6CgpgYGBnbwovLyBnZW5lcmF0ZWQgY29kZQoKdHlwZSBTZXJ2ZXJJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCS8vIC4uLgoJLy8gUmV0dXJucyBhbGwgcGV0cwoJLy8gKEdFVCAvcGV0cykKCUZpbmRQZXRzKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0LCBwYXJhbXMgRmluZFBldHNQYXJhbXMpCgkvLyAuLi4KfQoKLy8gRmluZFBldHMgb3BlcmF0aW9uIG1pZGRsZXdhcmUKZnVuYyAoc2l3ICpTZXJ2ZXJJbnRlcmZhY2VXcmFwcGVyKSBGaW5kUGV0cyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgewoKCXZhciBlcnIgZXJyb3IKCgkvLyBQYXJhbWV0ZXIgb2JqZWN0IHdoZXJlIHdlIHdpbGwgdW5tYXJzaGFsIGFsbCBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbnRleHQKCXZhciBwYXJhbXMgRmluZFBldHNQYXJhbXMKCgkvLyAtLS0tLS0tLS0tLS0tIE9wdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlciAidGFncyIgLS0tLS0tLS0tLS0tLQoKCWVyciA9IHJ1bnRpbWUuQmluZFF1ZXJ5UGFyYW1ldGVyKCJmb3JtIiwgdHJ1ZSwgZmFsc2UsICJ0YWdzIiwgci5VUkwuUXVlcnkoKSwgJnBhcmFtcy5UYWdzKQoJaWYgZXJyICE9IG5pbCB7CgkJc2l3LkVycm9ySGFuZGxlckZ1bmModywgciwgJkludmFsaWRQYXJhbUZvcm1hdEVycm9ye1BhcmFtTmFtZTogInRhZ3MiLCBFcnI6IGVycn0pCgkJcmV0dXJuCgl9CgoJLy8gLS0tLS0tLS0tLS0tLSBPcHRpb25hbCBxdWVyeSBwYXJhbWV0ZXIgImxpbWl0IiAtLS0tLS0tLS0tLS0tCgoJZXJyID0gcnVudGltZS5CaW5kUXVlcnlQYXJhbWV0ZXIoImZvcm0iLCB0cnVlLCBmYWxzZSwgImxpbWl0Iiwgci5VUkwuUXVlcnkoKSwgJnBhcmFtcy5MaW1pdCkKCWlmIGVyciAhPSBuaWwgewoJCXNpdy5FcnJvckhhbmRsZXJGdW5jKHcsIHIsICZJbnZhbGlkUGFyYW1Gb3JtYXRFcnJvcntQYXJhbU5hbWU6ICJsaW1pdCIsIEVycjogZXJyfSkKCQlyZXR1cm4KCX0KCgloYW5kbGVyIDo9IGh0dHAuSGFuZGxlcihodHRwLkhhbmRsZXJGdW5jKGZ1bmModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpIHsKCQlzaXcuSGFuZGxlci5GaW5kUGV0cyh3LCByLCBwYXJhbXMpCgl9KSkKCglmb3IgXywgbWlkZGxld2FyZSA6PSByYW5nZSBzaXcuSGFuZGxlck1pZGRsZXdhcmVzIHsKCQloYW5kbGVyID0gbWlkZGxld2FyZShoYW5kbGVyKQoJfQoKCWhhbmRsZXIuU2VydmVIVFRQKHcsIHIpCn0KCi8vIEhhbmRsZXJXaXRoT3B0aW9ucyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucwpmdW5jIEhhbmRsZXJXaXRoT3B0aW9ucyhzaSBTZXJ2ZXJJbnRlcmZhY2UsIG9wdGlvbnMgU3RkSFRUUFNlcnZlck9wdGlvbnMpIGh0dHAuSGFuZGxlciB7CgltIDo9IG9wdGlvbnMuQmFzZVJvdXRlcgoKCWlmIG0gPT0gbmlsIHsKCQltID0gaHR0cC5OZXdTZXJ2ZU11eCgpCgl9CglpZiBvcHRpb25zLkVycm9ySGFuZGxlckZ1bmMgPT0gbmlsIHsKCQlvcHRpb25zLkVycm9ySGFuZGxlckZ1bmMgPSBmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0LCBlcnIgZXJyb3IpIHsKCQkJaHR0cC5FcnJvcih3LCBlcnIuRXJyb3IoKSwgaHR0cC5TdGF0dXNCYWRSZXF1ZXN0KQoJCX0KCX0KCgl3cmFwcGVyIDo9IFNlcnZlckludGVyZmFjZVdyYXBwZXJ7CgkJSGFuZGxlcjogICAgICAgICAgICBzaSwKCQlIYW5kbGVyTWlkZGxld2FyZXM6IG9wdGlvbnMuTWlkZGxld2FyZXMsCgkJRXJyb3JIYW5kbGVyRnVuYzogICBvcHRpb25zLkVycm9ySGFuZGxlckZ1bmMsCgl9CgoJbS5IYW5kbGVGdW5jKCJHRVQgIitvcHRpb25zLkJhc2VVUkwrIi9wZXRzIiwgd3JhcHBlci5GaW5kUGV0cykKCglyZXR1cm4gbQp9CmBgYAoKVGhlbiwgaW4geW91ciBvd24gY29kZSwgeW91IGltcGxlbWVudCB0aGUgdW5kZXJseWluZyBsb2dpYyBmb3IgdGhlIGBGaW5kUGV0c2AgaW1wbGVtZW50YXRpb246CgpgYGBnbwp0eXBlIFBldFN0b3JlIHN0cnVjdCB7CglQZXRzICAgbWFwW2ludDY0XVBldAoJTmV4dElkIGludDY0CglMb2NrICAgc3luYy5NdXRleAp9CgovLyBNYWtlIHN1cmUgd2UgY29uZm9ybSB0byBTZXJ2ZXJJbnRlcmZhY2UKCnZhciBfIFNlcnZlckludGVyZmFjZSA9ICgqUGV0U3RvcmUpKG5pbCkKCmZ1bmMgTmV3UGV0U3RvcmUoKSAqUGV0U3RvcmUgewoJcmV0dXJuICZQZXRTdG9yZXsKCQlQZXRzOiAgIG1ha2UobWFwW2ludDY0XVBldCksCgkJTmV4dElkOiAxMDAwLAoJfQp9CgovLyBGaW5kUGV0cyBpbXBsZW1lbnRzIGFsbCB0aGUgaGFuZGxlcnMgaW4gdGhlIFNlcnZlckludGVyZmFjZQpmdW5jIChwICpQZXRTdG9yZSkgRmluZFBldHModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QsIHBhcmFtcyBGaW5kUGV0c1BhcmFtcykgewoJcC5Mb2NrLkxvY2soKQoJZGVmZXIgcC5Mb2NrLlVubG9jaygpCgoJdmFyIHJlc3VsdCBbXVBldAoKCWZvciBfLCBwZXQgOj0gcmFuZ2UgcC5QZXRzIHsKCQlpZiBwYXJhbXMuVGFncyAhPSBuaWwgewoJCQkvLyBJZiB3ZSBoYXZlIHRhZ3MsICBmaWx0ZXIgcGV0cyBieSB0YWcKCQkJZm9yIF8sIHQgOj0gcmFuZ2UgKnBhcmFtcy5UYWdzIHsKCQkJCWlmIHBldC5UYWcgIT0gbmlsICYmICgqcGV0LlRhZyA9PSB0KSB7CgkJCQkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgcGV0KQoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gQWRkIGFsbCBwZXRzIGlmIHdlJ3JlIG5vdCBmaWx0ZXJpbmcKCQkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgcGV0KQoJCX0KCgkJaWYgcGFyYW1zLkxpbWl0ICE9IG5pbCB7CgkJCWwgOj0gaW50KCpwYXJhbXMuTGltaXQpCgkJCWlmIGxlbihyZXN1bHQpID49IGwgewoJCQkJLy8gV2UncmUgYXQgdGhlIGxpbWl0CgkJCQlicmVhawoJCQl9CgkJfQoJfQoKCXcuV3JpdGVIZWFkZXIoaHR0cC5TdGF0dXNPSykKCV8gPSBqc29uLk5ld0VuY29kZXIodykuRW5jb2RlKHJlc3VsdCkKfQpgYGAKCkFzIHdlIGNhbiBzZWUsIGBvYXBpLWNvZGVnZW5gIHNpbXBsaWZpZXMgc29tZSBvZiB0aGUgYm9pbGVycGxhdGUgYnkgdGFraW5nIHBhcmFtZXRlcnMgb3V0IG9mIHRoZSByZXF1ZXN0IGFuZCBpbnN0ZWFkIGFsbG93cyB1cyB0byBmb2N1cyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCgpZb3UnbGwgbm90ZSB0aGF0IHRoZXJlJ3Mgc3RpbGwgYSBiaXQgbW9yZSBtYXJzaGFsaW5nIG9mIHJlcXVlc3QvcmVzcG9uc2UgZGF0YSwgd2hpY2ggaXMgZnVydGhlciByZWR1Y2VkIGJ5IHVzaW5nIHRoZSBbU3RyaWN0IHNlcnZlcl0oI3N0cmljdC1zZXJ2ZXIpIGZ1bmN0aW9uYWxpdHkuCgo8YSBuYW1lPSJ3aGF0LWRvZXMtaXQtbG9vay1saWtlLXN0cmljdCI+PC9hPgpXaGVuIHVzaW5nIHRoZSBzdHJpY3Qgc2VydmVyLCB5b3UnbGwgaGF2ZSB0aGUgZm9sbG93aW5nIGdlbmVyYXRlZCBjb2RlOgoKYGBgZ28KLy8gU3RyaWN0U2VydmVySW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIHNlcnZlciBoYW5kbGVycy4KdHlwZSBTdHJpY3RTZXJ2ZXJJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCS8vIC4uLgoJLy8gUmV0dXJucyBhbGwgcGV0cwoJLy8gKEdFVCAvcGV0cykKCUZpbmRQZXRzKGN0eCBjb250ZXh0LkNvbnRleHQsIHJlcXVlc3QgRmluZFBldHNSZXF1ZXN0T2JqZWN0KSAoRmluZFBldHNSZXNwb25zZU9iamVjdCwgZXJyb3IpCgkvLyAuLi4KfQoKZnVuYyBOZXdTdHJpY3RIYW5kbGVyV2l0aE9wdGlvbnMoc3NpIFN0cmljdFNlcnZlckludGVyZmFjZSwgbWlkZGxld2FyZXMgW11TdHJpY3RNaWRkbGV3YXJlRnVuYywgb3B0aW9ucyBTdHJpY3RIVFRQU2VydmVyT3B0aW9ucykgU2VydmVySW50ZXJmYWNlIHsKCXJldHVybiAmc3RyaWN0SGFuZGxlcntzc2k6IHNzaSwgbWlkZGxld2FyZXM6IG1pZGRsZXdhcmVzLCBvcHRpb25zOiBvcHRpb25zfQp9CgovLyBGaW5kUGV0cyBvcGVyYXRpb24gbWlkZGxld2FyZQpmdW5jIChzaCAqc3RyaWN0SGFuZGxlcikgRmluZFBldHModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QsIHBhcmFtcyBGaW5kUGV0c1BhcmFtcykgewoJdmFyIHJlcXVlc3QgRmluZFBldHNSZXF1ZXN0T2JqZWN0CgoJcmVxdWVzdC5QYXJhbXMgPSBwYXJhbXMKCgloYW5kbGVyIDo9IGZ1bmMoY3R4IGNvbnRleHQuQ29udGV4dCwgdyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QsIHJlcXVlc3QgaW50ZXJmYWNle30pIChpbnRlcmZhY2V7fSwgZXJyb3IpIHsKCQlyZXR1cm4gc2guc3NpLkZpbmRQZXRzKGN0eCwgcmVxdWVzdC4oRmluZFBldHNSZXF1ZXN0T2JqZWN0KSkKCX0KCWZvciBfLCBtaWRkbGV3YXJlIDo9IHJhbmdlIHNoLm1pZGRsZXdhcmVzIHsKCQloYW5kbGVyID0gbWlkZGxld2FyZShoYW5kbGVyLCAiRmluZFBldHMiKQoJfQoKCXJlc3BvbnNlLCBlcnIgOj0gaGFuZGxlcihyLkNvbnRleHQoKSwgdywgciwgcmVxdWVzdCkKCglpZiBlcnIgIT0gbmlsIHsKCQlzaC5vcHRpb25zLlJlc3BvbnNlRXJyb3JIYW5kbGVyRnVuYyh3LCByLCBlcnIpCgl9IGVsc2UgaWYgdmFsaWRSZXNwb25zZSwgb2sgOj0gcmVzcG9uc2UuKEZpbmRQZXRzUmVzcG9uc2VPYmplY3QpOyBvayB7CgkJaWYgZXJyIDo9IHZhbGlkUmVzcG9uc2UuVmlzaXRGaW5kUGV0c1Jlc3BvbnNlKHcpOyBlcnIgIT0gbmlsIHsKCQkJc2gub3B0aW9ucy5SZXNwb25zZUVycm9ySGFuZGxlckZ1bmModywgciwgZXJyKQoJCX0KCX0gZWxzZSBpZiByZXNwb25zZSAhPSBuaWwgewoJCXNoLm9wdGlvbnMuUmVzcG9uc2VFcnJvckhhbmRsZXJGdW5jKHcsIHIsIGZtdC5FcnJvcmYoInVuZXhwZWN0ZWQgcmVzcG9uc2UgdHlwZTogJVQiLCByZXNwb25zZSkpCgl9Cn0KYGBgCgpUaGVuLCBpbiB5b3VyIG93biBjb2RlLCB5b3UgaW1wbGVtZW50IHRoZSB1bmRlcmx5aW5nIGxvZ2ljIGZvciB0aGUgYEZpbmRQZXRzYCBpbXBsZW1lbnRhdGlvbjoKCmBgYGdvCi8vIE1ha2Ugc3VyZSB3ZSBjb25mb3JtIHRvIFN0cmljdFNlcnZlckludGVyZmFjZQoKdmFyIF8gU3RyaWN0U2VydmVySW50ZXJmYWNlID0gKCpQZXRTdG9yZSkobmlsKQoKZnVuYyBOZXdQZXRTdG9yZSgpICpQZXRTdG9yZSB7CglyZXR1cm4gJlBldFN0b3JlewoJCVBldHM6ICAgbWFrZShtYXBbaW50NjRdUGV0KSwKCQlOZXh0SWQ6IDEwMDAsCgl9Cn0KCi8vIEZpbmRQZXRzIGltcGxlbWVudHMgYWxsIHRoZSBoYW5kbGVycyBpbiB0aGUgU2VydmVySW50ZXJmYWNlCmZ1bmMgKHAgKlBldFN0b3JlKSBGaW5kUGV0cyhjdHggY29udGV4dC5Db250ZXh0LCByZXF1ZXN0IEZpbmRQZXRzUmVxdWVzdE9iamVjdCkgKEZpbmRQZXRzUmVzcG9uc2VPYmplY3QsIGVycm9yKSB7CglwLkxvY2suTG9jaygpCglkZWZlciBwLkxvY2suVW5sb2NrKCkKCgl2YXIgcmVzdWx0IFtdUGV0CgoJZm9yIF8sIHBldCA6PSByYW5nZSBwLlBldHMgewoJCWlmIHJlcXVlc3QuUGFyYW1zLlRhZ3MgIT0gbmlsIHsKCQkJLy8gSWYgd2UgaGF2ZSB0YWdzLCAgZmlsdGVyIHBldHMgYnkgdGFnCgkJCWZvciBfLCB0IDo9IHJhbmdlICpyZXF1ZXN0LlBhcmFtcy5UYWdzIHsKCQkJCWlmIHBldC5UYWcgIT0gbmlsICYmICgqcGV0LlRhZyA9PSB0KSB7CgkJCQkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgcGV0KQoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gQWRkIGFsbCBwZXRzIGlmIHdlJ3JlIG5vdCBmaWx0ZXJpbmcKCQkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgcGV0KQoJCX0KCgkJaWYgcmVxdWVzdC5QYXJhbXMuTGltaXQgIT0gbmlsIHsKCQkJbCA6PSBpbnQoKnJlcXVlc3QuUGFyYW1zLkxpbWl0KQoJCQlpZiBsZW4ocmVzdWx0KSA+PSBsIHsKCQkJCS8vIFdlJ3JlIGF0IHRoZSBsaW1pdAoJCQkJYnJlYWsKCQkJfQoJCX0KCX0KCglyZXR1cm4gRmluZFBldHMyMDBKU09OUmVzcG9uc2UocmVzdWx0KSwgbmlsCn0KYGBgCgpXZSBjYW4gc2VlIHRoYXQgdGhpcyBwcm92aWRlcyB0aGUgYmVzdCBtZWFucyB0byBmb2N1cyBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ1c2luZXNzIGxvZ2ljIHdpdGhpbiB0aGUgZW5kcG9pbnQsIHJhdGhlciB0aGFuICh1biltYXJzaGFsbGluZyB0eXBlcyB0byBhbmQgZnJvbSBKU09OLCBvciB3cmFuZ2xpbmcgY29va2llcyBvciBoZWFkZXJzLgoKIyMgS2V5IGRlc2lnbiBkZWNpc2lvbnMKCi0gUHJvZHVjZSBhbiBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgc2F0aXNmaWVkIGJ5IHlvdXIgaW1wbGVtZW50YXRpb24sIHdpdGggcmVkdWNlZCBib2lsZXJwbGF0ZQotIEJ1bGsgcHJvY2Vzc2luZyBhbmQgcGFyc2luZyBvZiBPcGVuQVBJIGRvY3VtZW50IGluIEdvCi0gUmVzdWx0aW5nIG91dHB1dCBpcyB1c2luZyBHbydzIGB0ZXh0L3RlbXBsYXRlYHMsIHdoaWNoIGFyZSB1c2VyLW92ZXJyaWRhYmxlCi0gQXR0ZW1wdHMgdG8gcHJvZHVjZSBJZGlvbWF0aWMgR28KLSBTaW5nbGUtZmlsZSBvdXRwdXQKLSBTdXBwb3J0IG11bHRpcGxlIE9wZW5BUEkgZmlsZXMgYnkgaGF2aW5nIGEgcGFja2FnZS1wZXItT3BlbkFQSSBmaWxlCi0gU3VwcG9ydCBvZiBPcGVuQVBJIDMuMAogIC0gT3BlbkFQSSAzLjEgc3VwcG9ydCBpcyBbYXdhaXRpbmcgdXBzdHJlYW0gc3VwcG9ydF0oaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vaXNzdWVzLzM3MykKICAtIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGluY2x1ZGUgT3BlbkFQSSAyLjAgKGFrYSBTd2FnZ2VyKQotIEV4dHJhY3QgcGFyYW1ldGVycyBmcm9tIHJlcXVlc3RzLCB0byByZWR1Y2Ugd29yayByZXF1aXJlZCBieSB5b3VyIGltcGxlbWVudGF0aW9uCi0gSW1wbGljaXQgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzYCBhcmUgaWdub3JlZCBieSBkZWZhdWx0IChbbW9yZSBkZXRhaWxzXSgjYWRkaXRpb25hbC1wcm9wZXJ0aWVzLWFkZGl0aW9uYWxwcm9wZXJ0aWVzKSkKLSBQcnVuZSB1bnVzZWQgdHlwZXMgYnkgZGVmYXVsdAoKIyMgR2VuZXJhdGluZyBzZXJ2ZXItc2lkZSBib2lsZXJwbGF0ZQoKYG9hcGktY29kZWdlbmAgc2hpbmVzIGJ5IG1ha2luZyBpdCBmYWlybHkgc3RyYWlnaHRmb3J3YXJkIChub3RlIHRoYXQgdGhpcyBpcyBhIHB1cnBvc2VmdWwgY2hvaWNlIG9mIHdvcmRpbmcgaGVyZSAtIHdlIHdhbnQgdG8gYXZvaWQgd29yZHMgbGlrZSAiZWFzeSIpIHRvIGdlbmVyYXRlIHRoZSBzZXJ2ZXItc2lkZSBib2lsZXJwbGF0ZSBmb3IgYSBiYWNrZW5kIEFQSS4KCkJlbG93IHlvdSBjYW4gZmluZCB0aGUgc3VwcG9ydGVkIHNlcnZlcnMsIGFuZCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBpbXBsZW1lbnQgYSBzZXJ2ZXIgdXNpbmcgdGhlbS4KClRvIHByb3ZpZGUgeW91IGEgZnVsbHkgVGVzdCBEcml2ZW4gRGV2ZWxvcG1lbnQgc3R5bGUgdGVzdCBoYXJuZXNzIHRvIGNvbmZpcm0geW91IGFyZSBmb2xsb3dpbmcgdGhlIHNwZWNpZmljYXRpb24sIHlvdSBjb3VsZCB1c2UgYSB0b29sIHN1Y2ggYXMgW29wZW5hcGkudGFubmEuZGV2L2dvL3ZhbGlkYXRvcl0oaHR0cHM6Ly9vcGVuYXBpLnRhbm5hLmRldi9nby92YWxpZGF0b3IvKSwgb3IgY3JhZnQgeW91ciBvd24uCgojIyMgU3VwcG9ydGVkIFNlcnZlcnMKClJpZ2h0IG5vdywgd2Ugc3VwcG9ydCB0aGUgZm9sbG93aW5nIHNlcnZlcnMsIGFuZCBhcmUgc3VwcG9ydGl2ZSBvZiBhZGRpbmcgbmV3IHNlcnZlcnMsIHRvbyEKCjx0YWJsZT4KCjx0cj4KPHRoPgpTZXJ2ZXIKPC90aD4KPHRoPgo8Y29kZT5nZW5lcmF0ZTwvY29kZT4gZmxhZyB0byBlbmFibGUgY29kZSBnZW5lcmF0aW9uCjwvdGg+Cjx0aD4KRXhhbXBsZSB1c2FnZQo8L3RoPgo8L3RyPgoKPHRyPgo8dGQ+CgpbQ2hpXShodHRwczovL2dpdGh1Yi5jb20vZ28tY2hpL2NoaSkKCjwvdGQ+Cjx0ZD4KPGNvZGU+Y2hpLXNlcnZlcjwvY29kZT4KPC90ZD4KPHRkPgoKCkZvciBhIENoaSBzZXJ2ZXIsIHlvdSB3aWxsIHdhbnQgYSBjb25maWd1cmF0aW9uIGZpbGUgc3VjaCBhczoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogLi4uCnBhY2thZ2U6IGFwaQpnZW5lcmF0ZToKICBjaGktc2VydmVyOiB0cnVlCiAgbW9kZWxzOiB0cnVlCm91dHB1dDogZ2VuLmdvCmBgYAoKVG8gaW1wbGVtZW50IHRoaXMsIGNoZWNrIG91dCBbdGhlIENoaSBkb2NzXSgjaW1wbC1jaGkpLgoKPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKW0VjaG9dKGh0dHBzOi8vZ2l0aHViLmNvbS9sYWJzdGFjay9lY2hvKQoKPC90ZD4KPHRkPgo8Y29kZT5lY2hvLXNlcnZlcjwvY29kZT4KPC90ZD4KPHRkPgoKRm9yIGFuIEVjaG8gc2VydmVyLCB5b3Ugd2lsbCB3YW50IGEgY29uZmlndXJhdGlvbiBmaWxlIHN1Y2ggYXM6CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6IC4uLgpwYWNrYWdlOiBhcGkKZ2VuZXJhdGU6CiAgZWNoby1zZXJ2ZXI6IHRydWUKICBtb2RlbHM6IHRydWUKb3V0cHV0OiBnZW4uZ28KYGBgCgpUbyBpbXBsZW1lbnQgdGhpcywgY2hlY2sgb3V0IFt0aGUgRWNobyBkb2NzXSgjaW1wbC1lY2hvKS4KCjwvdGQ+CjwvdHI+Cgo8dHI+Cjx0ZD4KCltGaWJlcl0oaHR0cHM6Ly9naXRodWIuY29tL2dvZmliZXIvZmliZXIpCgo8L3RkPgo8dGQ+Cjxjb2RlPmZpYmVyLXNlcnZlcjwvY29kZT4KPC90ZD4KCjx0ZD4KCkZvciBhIEZpYmVyIHNlcnZlciwgeW91IHdpbGwgd2FudCBhIGNvbmZpZ3VyYXRpb24gZmlsZSBzdWNoIGFzOgoKYGBgeWFtbAojIHlhbWwtbGFuZ3VhZ2Utc2VydmVyOiAuLi4KcGFja2FnZTogYXBpCmdlbmVyYXRlOgogIGZpYmVyLXNlcnZlcjogdHJ1ZQogIG1vZGVsczogdHJ1ZQpvdXRwdXQ6IGdlbi5nbwpgYGAKClRvIGltcGxlbWVudCB0aGlzLCBjaGVjayBvdXQgW3RoZSBGaWJlciBkb2NzXSgjaW1wbC1maWJlcikuCgo8L3RkPgo8L3RyPgoKCjx0cj4KPHRkPgoKW0dpbl0oaHR0cHM6Ly9naXRodWIuY29tL2dpbi1nb25pYy9naW4pCgo8L3RkPgo8dGQ+Cjxjb2RlPmdpbi1zZXJ2ZXI8L2NvZGU+CjwvdGQ+Cjx0ZD4KCkZvciBhIEdpbiBzZXJ2ZXIsIHlvdSB3aWxsIHdhbnQgYSBjb25maWd1cmF0aW9uIGZpbGUgc3VjaCBhczoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogLi4uCnBhY2thZ2U6IGFwaQpnZW5lcmF0ZToKICBnaW4tc2VydmVyOiB0cnVlCiAgbW9kZWxzOiB0cnVlCm91dHB1dDogZ2VuLmdvCmBgYAoKVG8gaW1wbGVtZW50IHRoaXMsIGNoZWNrIG91dCBbdGhlIEdpbiBkb2NzXSgjaW1wbC1naW4pLgoKPC90ZD4KCjwvdHI+Cgo8dHI+Cjx0ZD4KCltnb3JpbGxhL211eF0oaHR0cHM6Ly9naXRodWIuY29tL2dvcmlsbGEvbXV4KQoKPC90ZD4KPHRkPgo8Y29kZT5nb3JpbGxhLXNlcnZlcjwvY29kZT4KPC90ZD4KCjx0ZD4KCkZvciBhIGdvcmlsbGEvbXV4IHNlcnZlciwgeW91IHdpbGwgd2FudCBhIGNvbmZpZ3VyYXRpb24gZmlsZSBzdWNoIGFzOgoKYGBgeWFtbAojIHlhbWwtbGFuZ3VhZ2Utc2VydmVyOiAuLi4KcGFja2FnZTogYXBpCmdlbmVyYXRlOgogIGdvcmlsbGEtc2VydmVyOiB0cnVlCiAgbW9kZWxzOiB0cnVlCm91dHB1dDogZ2VuLmdvCmBgYAoKVG8gaW1wbGVtZW50IHRoaXMsIGNoZWNrIG91dCBbdGhlIGdvcmlsbGEvbXV4IGRvY3NdKCNpbXBsLWdvcmlsbGFtdXgpLgoKPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKW0lyaXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9rYXRhcmFzL2lyaXMpCgo8L3RkPgo8dGQ+Cjxjb2RlPmlyaXMtc2VydmVyPC9jb2RlPgo8L3RkPgoKPHRkPgoKRm9yIGEgSXJpcyBzZXJ2ZXIsIHlvdSB3aWxsIHdhbnQgYSBjb25maWd1cmF0aW9uIGZpbGUgc3VjaCBhczoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogLi4uCnBhY2thZ2U6IGFwaQpnZW5lcmF0ZToKICBpcmlzLXNlcnZlcjogdHJ1ZQogIG1vZGVsczogdHJ1ZQpvdXRwdXQ6IGdlbi5nbwpgYGAKClRvIGltcGxlbWVudCB0aGlzLCBjaGVjayBvdXQgW3RoZSBJcmlzIGRvY3NdKCNpbXBsLWlyaXMpLgoKPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKWzEuMjIrIGBuZXQvaHR0cGBdKGh0dHBzOi8vcGtnLmdvLmRldi9uZXQvaHR0cCkKCjwvdGQ+Cjx0ZD4KPGNvZGU+c3RkLWh0dHAtc2VydmVyPC9jb2RlPgo8L3RkPgoKPHRkPgoKVG8gdXNlIHB1cmVseSBgbmV0L2h0dHBgIChmb3IgR28gMS4yMispLCB5b3Ugd2lsbCB3YW50IGEgY29uZmlndXJhdGlvbiBmaWxlIHN1Y2ggYXM6CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6IC4uLgpwYWNrYWdlOiBhcGkKZ2VuZXJhdGU6CiAgc3RkLWh0dHAtc2VydmVyOiB0cnVlCiAgbW9kZWxzOiB0cnVlCm91dHB1dDogZ2VuLmdvCmBgYAoKVG8gaW1wbGVtZW50IHRoaXMsIGNoZWNrIG91dCBbdGhlIEdvIDEuMjIrIGBuZXQvaHR0cGAgZG9jc10oI2ltcGwtc3RkaHR0cCkuCgo8L3RkPgo8L3RyPgoKPC90YWJsZT4KCiMjIyBHbyAxLjIyKyBgbmV0L2h0dHBgCjxhIG5hbWU9ImltcGwtc3RkaHR0cCI+PC9hPgoKQXMgb2YgR28gMS4yMiwgZW5oYW5jZW1lbnRzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSByb3V0aW5nIG9mIHRoZSBgbmV0L2h0dHBgIHBhY2thZ2UgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnksIHdoaWNoIG1ha2VzIGl0IGEgZ3JlYXQgc3RhcnRpbmcgcG9pbnQgZm9yIGltcGxlbWVudGluZyBhIHNlcnZlciB3aXRoLCBiZWZvcmUgbmVlZGluZyB0byByZWFjaCBmb3IgYW5vdGhlciByb3V0ZXIgb3IgYSBmdWxsIGZyYW1ld29yay4KCkZvciBpbnN0YW5jZSwgbGV0J3MgdGFrZSB0aGlzIHN0cmFpZ2h0Zm9yd2FyZCBzcGVjaWZpY2F0aW9uOgoKYGBgeWFtbApvcGVuYXBpOiAiMy4wLjAiCmluZm86CiAgdmVyc2lvbjogMS4wLjAKICB0aXRsZTogTWluaW1hbCBwaW5nIEFQSSBzZXJ2ZXIKcGF0aHM6CiAgL3Bpbmc6CiAgICBnZXQ6CiAgICAgIHJlc3BvbnNlczoKICAgICAgICAnMjAwJzoKICAgICAgICAgIGRlc2NyaXB0aW9uOiBwZXQgcmVzcG9uc2UKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL1BvbmcnCmNvbXBvbmVudHM6CiAgc2NoZW1hczoKICAgICMgYmFzZSB0eXBlcwogICAgUG9uZzoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gcGluZwogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIHBpbmc6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgICAgIGV4YW1wbGU6IHBvbmcKYGBgCgpUaGlzIHRoZW4gZ2VuZXJhdGVzIGNvZGUgc3VjaCBhczoKCmBgYGdvCi8vIFBvbmcgZGVmaW5lcyBtb2RlbCBmb3IgUG9uZy4KdHlwZSBQb25nIHN0cnVjdCB7CglQaW5nIHN0cmluZyBganNvbjoicGluZyJgCn0KCi8vIFNlcnZlckludGVyZmFjZSByZXByZXNlbnRzIGFsbCBzZXJ2ZXIgaGFuZGxlcnMuCnR5cGUgU2VydmVySW50ZXJmYWNlIGludGVyZmFjZSB7CgoJLy8gKEdFVCAvcGluZykKCUdldFBpbmcodyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpCn0KCmZ1bmMgSGFuZGxlckZyb21NdXgoc2kgU2VydmVySW50ZXJmYWNlLCBtIFNlcnZlTXV4KSBodHRwLkhhbmRsZXIgewoJcmV0dXJuIEhhbmRsZXJXaXRoT3B0aW9ucyhzaSwgU3RkSFRUUFNlcnZlck9wdGlvbnN7CgkJQmFzZVJvdXRlcjogbSwKCX0pCn0KCi8vIEhhbmRsZXJXaXRoT3B0aW9ucyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucwpmdW5jIEhhbmRsZXJXaXRoT3B0aW9ucyhzaSBTZXJ2ZXJJbnRlcmZhY2UsIG9wdGlvbnMgU3RkSFRUUFNlcnZlck9wdGlvbnMpIGh0dHAuSGFuZGxlciB7CgltIDo9IG9wdGlvbnMuQmFzZVJvdXRlcgoKCS8vIC4uLiBvbWl0dGVkIGZvciBicmV2aXR5CgoJbS5IYW5kbGVGdW5jKCJHRVQgIitvcHRpb25zLkJhc2VVUkwrIi9waW5nIiwgd3JhcHBlci5HZXRQaW5nKQoKCXJldHVybiBtCn0KYGBgCgpUbyBpbXBsZW1lbnQgdGhpcyBIVFRQIHNlcnZlciwgd2UgbmVlZCB0byB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4gb3VyIFtgYXBpL2ltcGwuZ29gXShleGFtcGxlcy9taW5pbWFsLXNlcnZlci9zdGRodHRwL2FwaS9pbXBsLmdvKToKCmBgYGdvCmltcG9ydCAoCgkiZW5jb2RpbmcvanNvbiIKCSJuZXQvaHR0cCIKKQoKLy8gb3B0aW9uYWwgY29kZSBvbWl0dGVkCgp0eXBlIFNlcnZlciBzdHJ1Y3R7fQoKZnVuYyBOZXdTZXJ2ZXIoKSBTZXJ2ZXIgewoJcmV0dXJuIFNlcnZlcnt9Cn0KCi8vIChHRVQgL3BpbmcpCmZ1bmMgKFNlcnZlcikgR2V0UGluZyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgewoJcmVzcCA6PSBQb25newoJCVBpbmc6ICJwb25nIiwKCX0KCgl3LldyaXRlSGVhZGVyKGh0dHAuU3RhdHVzT0spCglfID0ganNvbi5OZXdFbmNvZGVyKHcpLkVuY29kZShyZXNwKQp9CmBgYAoKTm93IHdlJ3ZlIGdvdCBvdXIgaW1wbGVtZW50YXRpb24sIHdlIGNhbiB0aGVuIHdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZSB0byB3aXJlIGl0IHVwIGFuZCBnZXQgYSBydW5uaW5nIHNlcnZlcjoKCmBgYGdvCmltcG9ydCAoCgkibG9nIgoJIm5ldC9odHRwIgoKCSJnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvZXhhbXBsZXMvbWluaW1hbC1zZXJ2ZXIvc3RkaHR0cC9hcGkiCikKCmZ1bmMgbWFpbigpIHsKCS8vIGNyZWF0ZSBhIHR5cGUgdGhhdCBzYXRpc2ZpZXMgdGhlIGBhcGkuU2VydmVySW50ZXJmYWNlYCwgd2hpY2ggY29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gb2YgZXZlcnkgb3BlcmF0aW9uIGZyb20gdGhlIGdlbmVyYXRlZCBjb2RlCglzZXJ2ZXIgOj0gYXBpLk5ld1NlcnZlcigpCgoJciA6PSBodHRwLk5ld1NlcnZlTXV4KCkKCgkvLyBnZXQgYW4gYGh0dHAuSGFuZGxlcmAgdGhhdCB3ZSBjYW4gdXNlCgloIDo9IGFwaS5IYW5kbGVyRnJvbU11eChzZXJ2ZXIsIHIpCgoJcyA6PSAmaHR0cC5TZXJ2ZXJ7CgkJSGFuZGxlcjogaCwKCQlBZGRyOiAgICAiMC4wLjAuMDo4MDgwIiwKCX0KCgkvLyBBbmQgd2Ugc2VydmUgSFRUUCB1bnRpbCB0aGUgd29ybGQgZW5kcy4KCWxvZy5GYXRhbChzLkxpc3RlbkFuZFNlcnZlKCkpCn0KYGBgCgo+IFshTk9URV0KPiBUaGlzIGRvZXNuJ3QgaW5jbHVkZSBbdmFsaWRhdGlvbiBvZiBpbmNvbWluZyByZXF1ZXN0c10oI3JlcXVlc3RyZXNwb25zZS12YWxpZGF0aW9uLW1pZGRsZXdhcmUpLgoKPiBbIU5PVEVdCj4gSWYgeW91IGZlZWwgbGlrZSB5b3UndmUgZG9uZSBldmVyeXRoaW5nIHJpZ2h0LCBidXQgYXJlIHN0aWxsIHJlY2VpdmluZyBgNDA0IHBhZ2Ugbm90IGZvdW5kYCBlcnJvcnMsIG1ha2Ugc3VyZSB0aGF0IHlvdSd2ZSBnb3QgdGhlIGBnb2AgZGlyZWN0aXZlIGluIHlvdXIgYGdvLm1vZGAgdXBkYXRlZCB0bzoKCmBgYGdvLm1vZApnbyAxLjIyCmBgYAoKPC9kZXRhaWxzPgoKIyMjIENoaQo8YSBuYW1lPSJpbXBsLWNoaSI+PC9hPgoKRm9yIGluc3RhbmNlLCBsZXQncyB0YWtlIHRoaXMgc3RyYWlnaHRmb3J3YXJkIHNwZWNpZmljYXRpb246CgpgYGB5YW1sCm9wZW5hcGk6ICIzLjAuMCIKaW5mbzoKICB2ZXJzaW9uOiAxLjAuMAogIHRpdGxlOiBNaW5pbWFsIHBpbmcgQVBJIHNlcnZlcgpwYXRoczoKICAvcGluZzoKICAgIGdldDoKICAgICAgcmVzcG9uc2VzOgogICAgICAgICcyMDAnOgogICAgICAgICAgZGVzY3JpcHRpb246IHBldCByZXNwb25zZQogICAgICAgICAgY29udGVudDoKICAgICAgICAgICAgYXBwbGljYXRpb24vanNvbjoKICAgICAgICAgICAgICBzY2hlbWE6CiAgICAgICAgICAgICAgICAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvUG9uZycKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgIyBiYXNlIHR5cGVzCiAgICBQb25nOgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBwaW5nCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgcGluZzoKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgZXhhbXBsZTogcG9uZwpgYGAKClRoaXMgdGhlbiBnZW5lcmF0ZXMgY29kZSBzdWNoIGFzOgoKYGBgZ28KLy8gUG9uZyBkZWZpbmVzIG1vZGVsIGZvciBQb25nLgp0eXBlIFBvbmcgc3RydWN0IHsKCVBpbmcgc3RyaW5nIGBqc29uOiJwaW5nImAKfQoKLy8gU2VydmVySW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIHNlcnZlciBoYW5kbGVycy4KdHlwZSBTZXJ2ZXJJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCgkvLyAoR0VUIC9waW5nKQoJR2V0UGluZyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkKfQoKLy8gSGFuZGxlckZyb21NdXggY3JlYXRlcyBodHRwLkhhbmRsZXIgd2l0aCByb3V0aW5nIG1hdGNoaW5nIE9wZW5BUEkgc3BlYyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgbXV4LgpmdW5jIEhhbmRsZXJGcm9tTXV4KHNpIFNlcnZlckludGVyZmFjZSwgciAqbXV4LlJvdXRlcikgaHR0cC5IYW5kbGVyIHsKCXJldHVybiBIYW5kbGVyV2l0aE9wdGlvbnMoc2ksIENoaVNlcnZlck9wdGlvbnN7CgkJQmFzZVJvdXRlcjogciwKCX0pCn0KCi8vIEhhbmRsZXJXaXRoT3B0aW9ucyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucwpmdW5jIEhhbmRsZXJXaXRoT3B0aW9ucyhzaSBTZXJ2ZXJJbnRlcmZhY2UsIG9wdGlvbnMgQ2hpU2VydmVyT3B0aW9ucykgaHR0cC5IYW5kbGVyIHsKCXIgOj0gb3B0aW9ucy5CYXNlUm91dGVyCgoJLy8gLi4uCgoJci5Hcm91cChmdW5jKHIgY2hpLlJvdXRlcikgewoJCXIuR2V0KG9wdGlvbnMuQmFzZVVSTCsiL3BpbmciLCB3cmFwcGVyLkdldFBpbmcpCgl9KQoKCXJldHVybiByCn0KYGBgCgpUbyBpbXBsZW1lbnQgdGhpcyBIVFRQIHNlcnZlciwgd2UgbmVlZCB0byB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4gb3VyIFtgYXBpL2ltcGwuZ29gXShleGFtcGxlcy9taW5pbWFsLXNlcnZlci9jaGkvYXBpL2ltcGwuZ28pOgoKYGBgZ28KaW1wb3J0ICgKCSJlbmNvZGluZy9qc29uIgoJIm5ldC9odHRwIgopCgovLyBvcHRpb25hbCBjb2RlIG9taXR0ZWQKCnR5cGUgU2VydmVyIHN0cnVjdHt9CgpmdW5jIE5ld1NlcnZlcigpIFNlcnZlciB7CglyZXR1cm4gU2VydmVye30KfQoKLy8gKEdFVCAvcGluZykKZnVuYyAoU2VydmVyKSBHZXRQaW5nKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CglyZXNwIDo9IFBvbmd7CgkJUGluZzogInBvbmciLAoJfQoKCXcuV3JpdGVIZWFkZXIoaHR0cC5TdGF0dXNPSykKCV8gPSBqc29uLk5ld0VuY29kZXIodykuRW5jb2RlKHJlc3ApCn0KYGBgCgpOb3cgd2UndmUgZ290IG91ciBpbXBsZW1lbnRhdGlvbiwgd2UgY2FuIHRoZW4gd3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlIHRvIHdpcmUgaXQgdXAgYW5kIGdldCBhIHJ1bm5pbmcgc2VydmVyOgoKYGBgZ28KaW1wb3J0ICgKCSJsb2ciCgkibmV0L2h0dHAiCgoJImdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9leGFtcGxlcy9taW5pbWFsLXNlcnZlci9jaGkvYXBpIgoJImdpdGh1Yi5jb20vZ28tY2hpL2NoaS92NSIKKQoKZnVuYyBtYWluKCkgewoJLy8gY3JlYXRlIGEgdHlwZSB0aGF0IHNhdGlzZmllcyB0aGUgYGFwaS5TZXJ2ZXJJbnRlcmZhY2VgLCB3aGljaCBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBldmVyeSBvcGVyYXRpb24gZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUKCXNlcnZlciA6PSBhcGkuTmV3U2VydmVyKCkKCglyIDo9IGNoaS5OZXdNdXgoKQoKCS8vIGdldCBhbiBgaHR0cC5IYW5kbGVyYCB0aGF0IHdlIGNhbiB1c2UKCWggOj0gYXBpLkhhbmRsZXJGcm9tTXV4KHNlcnZlciwgcikKCglzIDo9ICZodHRwLlNlcnZlcnsKCQlIYW5kbGVyOiBoLAoJCUFkZHI6ICAgICIwLjAuMC4wOjgwODAiLAoJfQoKCS8vIEFuZCB3ZSBzZXJ2ZSBIVFRQIHVudGlsIHRoZSB3b3JsZCBlbmRzLgoJbG9nLkZhdGFsKHMuTGlzdGVuQW5kU2VydmUoKSkKfQpgYGAKCj4gWyFOT1RFXQo+IFRoaXMgZG9lc24ndCBpbmNsdWRlIFt2YWxpZGF0aW9uIG9mIGluY29taW5nIHJlcXVlc3RzXSgjcmVxdWVzdHJlc3BvbnNlLXZhbGlkYXRpb24tbWlkZGxld2FyZSkuCgojIyMgZ29yaWxsYS9tdXgKPGEgbmFtZT0iaW1wbC1nb3JpbGxhbXV4Ij48L2E+CgpGb3IgaW5zdGFuY2UsIGxldCdzIHRha2UgdGhpcyBzdHJhaWdodGZvcndhcmQgc3BlY2lmaWNhdGlvbjoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IE1pbmltYWwgcGluZyBBUEkgc2VydmVyCnBhdGhzOgogIC9waW5nOgogICAgZ2V0OgogICAgICByZXNwb25zZXM6CiAgICAgICAgJzIwMCc6CiAgICAgICAgICBkZXNjcmlwdGlvbjogcGV0IHJlc3BvbnNlCiAgICAgICAgICBjb250ZW50OgogICAgICAgICAgICBhcHBsaWNhdGlvbi9qc29uOgogICAgICAgICAgICAgIHNjaGVtYToKICAgICAgICAgICAgICAgICRyZWY6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9Qb25nJwpjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICAjIGJhc2UgdHlwZXMKICAgIFBvbmc6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIHBpbmcKICAgICAgcHJvcGVydGllczoKICAgICAgICBwaW5nOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBleGFtcGxlOiBwb25nCmBgYAoKVGhpcyB0aGVuIGdlbmVyYXRlcyBjb2RlIHN1Y2ggYXM6CgpgYGBnbwovLyBQb25nIGRlZmluZXMgbW9kZWwgZm9yIFBvbmcuCnR5cGUgUG9uZyBzdHJ1Y3QgewoJUGluZyBzdHJpbmcgYGpzb246InBpbmciYAp9CgovLyBTZXJ2ZXJJbnRlcmZhY2UgcmVwcmVzZW50cyBhbGwgc2VydmVyIGhhbmRsZXJzLgp0eXBlIFNlcnZlckludGVyZmFjZSBpbnRlcmZhY2UgewoKCS8vIChHRVQgL3BpbmcpCglHZXRQaW5nKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KQp9CgovLyBIYW5kbGVyRnJvbU11eCBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIHJvdXRpbmcgbWF0Y2hpbmcgT3BlbkFQSSBzcGVjIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBtdXguCmZ1bmMgSGFuZGxlckZyb21NdXgoc2kgU2VydmVySW50ZXJmYWNlLCByICptdXguUm91dGVyKSBodHRwLkhhbmRsZXIgewoJcmV0dXJuIEhhbmRsZXJXaXRoT3B0aW9ucyhzaSwgR29yaWxsYVNlcnZlck9wdGlvbnN7CgkJQmFzZVJvdXRlcjogciwKCX0pCn0KCi8vIEhhbmRsZXJXaXRoT3B0aW9ucyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucwpmdW5jIEhhbmRsZXJXaXRoT3B0aW9ucyhzaSBTZXJ2ZXJJbnRlcmZhY2UsIG9wdGlvbnMgR29yaWxsYVNlcnZlck9wdGlvbnMpIGh0dHAuSGFuZGxlciB7CglyIDo9IG9wdGlvbnMuQmFzZVJvdXRlcgoKCS8vIC4uLgoKCXIuSGFuZGxlRnVuYyhvcHRpb25zLkJhc2VVUkwrIi9waW5nIiwgd3JhcHBlci5HZXRQaW5nKS5NZXRob2RzKCJHRVQiKQoKCXJldHVybiByCn0KYGBgCgpUbyBpbXBsZW1lbnQgdGhpcyBIVFRQIHNlcnZlciwgd2UgbmVlZCB0byB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4gb3VyIFtgYXBpL2ltcGwuZ29gXShleGFtcGxlcy9taW5pbWFsLXNlcnZlci9nb3JpbGxhbXV4L2FwaS9pbXBsLmdvKToKCmBgYGdvCmltcG9ydCAoCgkiZW5jb2RpbmcvanNvbiIKCSJuZXQvaHR0cCIKKQoKLy8gb3B0aW9uYWwgY29kZSBvbWl0dGVkCgp0eXBlIFNlcnZlciBzdHJ1Y3R7fQoKZnVuYyBOZXdTZXJ2ZXIoKSBTZXJ2ZXIgewoJcmV0dXJuIFNlcnZlcnt9Cn0KCi8vIChHRVQgL3BpbmcpCmZ1bmMgKFNlcnZlcikgR2V0UGluZyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgewoJcmVzcCA6PSBQb25newoJCVBpbmc6ICJwb25nIiwKCX0KCgl3LldyaXRlSGVhZGVyKGh0dHAuU3RhdHVzT0spCglfID0ganNvbi5OZXdFbmNvZGVyKHcpLkVuY29kZShyZXNwKQp9CmBgYAoKTm93IHdlJ3ZlIGdvdCBvdXIgaW1wbGVtZW50YXRpb24sIHdlIGNhbiB0aGVuIHdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZSB0byB3aXJlIGl0IHVwIGFuZCBnZXQgYSBydW5uaW5nIHNlcnZlcjoKCmBgYGdvCmltcG9ydCAoCgkibG9nIgoJIm5ldC9odHRwIgoKCSJnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvZXhhbXBsZXMvbWluaW1hbC1zZXJ2ZXIvZ29yaWxsYW11eC9hcGkiCgkiZ2l0aHViLmNvbS9nb3JpbGxhL211eCIKKQoKZnVuYyBtYWluKCkgewoJLy8gY3JlYXRlIGEgdHlwZSB0aGF0IHNhdGlzZmllcyB0aGUgYGFwaS5TZXJ2ZXJJbnRlcmZhY2VgLCB3aGljaCBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBldmVyeSBvcGVyYXRpb24gZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUKCXNlcnZlciA6PSBhcGkuTmV3U2VydmVyKCkKCglyIDo9IG11eC5OZXdSb3V0ZXIoKQoKCS8vIGdldCBhbiBgaHR0cC5IYW5kbGVyYCB0aGF0IHdlIGNhbiB1c2UKCWggOj0gYXBpLkhhbmRsZXJGcm9tTXV4KHNlcnZlciwgcikKCglzIDo9ICZodHRwLlNlcnZlcnsKCQlIYW5kbGVyOiBoLAoJCUFkZHI6ICAgICIwLjAuMC4wOjgwODAiLAoJfQoKCS8vIEFuZCB3ZSBzZXJ2ZSBIVFRQIHVudGlsIHRoZSB3b3JsZCBlbmRzLgoJbG9nLkZhdGFsKHMuTGlzdGVuQW5kU2VydmUoKSkKfQpgYGAKCj4gWyFOT1RFXQo+IFRoaXMgZG9lc24ndCBpbmNsdWRlIFt2YWxpZGF0aW9uIG9mIGluY29taW5nIHJlcXVlc3RzXSgjcmVxdWVzdHJlc3BvbnNlLXZhbGlkYXRpb24tbWlkZGxld2FyZSkuCgojIyMgRWNobyBzZXJ2ZXIKPGEgbmFtZT0iaW1wbC1lY2hvIj48L2E+CgpGb3IgaW5zdGFuY2UsIGxldCdzIHRha2UgdGhpcyBzdHJhaWdodGZvcndhcmQgc3BlY2lmaWNhdGlvbjoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IE1pbmltYWwgcGluZyBBUEkgc2VydmVyCnBhdGhzOgogIC9waW5nOgogICAgZ2V0OgogICAgICByZXNwb25zZXM6CiAgICAgICAgJzIwMCc6CiAgICAgICAgICBkZXNjcmlwdGlvbjogcGV0IHJlc3BvbnNlCiAgICAgICAgICBjb250ZW50OgogICAgICAgICAgICBhcHBsaWNhdGlvbi9qc29uOgogICAgICAgICAgICAgIHNjaGVtYToKICAgICAgICAgICAgICAgICRyZWY6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9Qb25nJwpjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICAjIGJhc2UgdHlwZXMKICAgIFBvbmc6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIHBpbmcKICAgICAgcHJvcGVydGllczoKICAgICAgICBwaW5nOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBleGFtcGxlOiBwb25nCmBgYAoKVGhpcyB0aGVuIGdlbmVyYXRlcyBjb2RlIHN1Y2ggYXM6CgpgYGBnbwovLyBQb25nIGRlZmluZXMgbW9kZWwgZm9yIFBvbmcuCnR5cGUgUG9uZyBzdHJ1Y3QgewoJUGluZyBzdHJpbmcgYGpzb246InBpbmciYAp9CgovLyBTZXJ2ZXJJbnRlcmZhY2UgcmVwcmVzZW50cyBhbGwgc2VydmVyIGhhbmRsZXJzLgp0eXBlIFNlcnZlckludGVyZmFjZSBpbnRlcmZhY2UgewoKCS8vIChHRVQgL3BpbmcpCglHZXRQaW5nKGN0eCBlY2hvLkNvbnRleHQpIGVycm9yCn0KCi8vIFRoaXMgaXMgYSBzaW1wbGUgaW50ZXJmYWNlIHdoaWNoIHNwZWNpZmllcyBlY2hvLlJvdXRlIGFkZGl0aW9uIGZ1bmN0aW9ucyB3aGljaAovLyBhcmUgcHJlc2VudCBvbiBib3RoIGVjaG8uRWNobyBhbmQgZWNoby5Hcm91cCwgc2luY2Ugd2Ugd2FudCB0byBhbGxvdyB1c2luZwovLyBlaXRoZXIgb2YgdGhlbSBmb3IgcGF0aCByZWdpc3RyYXRpb24KdHlwZSBFY2hvUm91dGVyIGludGVyZmFjZSB7CgkvLyAuLi4KCUdFVChwYXRoIHN0cmluZywgaCBlY2hvLkhhbmRsZXJGdW5jLCBtIC4uLmVjaG8uTWlkZGxld2FyZUZ1bmMpICplY2hvLlJvdXRlCgkvLyAuLi4KfQoKLy8gUmVnaXN0ZXJIYW5kbGVycyBhZGRzIGVhY2ggc2VydmVyIHJvdXRlIHRvIHRoZSBFY2hvUm91dGVyLgpmdW5jIFJlZ2lzdGVySGFuZGxlcnMocm91dGVyIEVjaG9Sb3V0ZXIsIHNpIFNlcnZlckludGVyZmFjZSkgewoJUmVnaXN0ZXJIYW5kbGVyc1dpdGhCYXNlVVJMKHJvdXRlciwgc2ksICIiKQp9CgovLyBSZWdpc3RlcnMgaGFuZGxlcnMsIGFuZCBwcmVwZW5kcyBCYXNlVVJMIHRvIHRoZSBwYXRocywgc28gdGhhdCB0aGUgcGF0aHMKLy8gY2FuIGJlIHNlcnZlZCB1bmRlciBhIHByZWZpeC4KZnVuYyBSZWdpc3RlckhhbmRsZXJzV2l0aEJhc2VVUkwocm91dGVyIEVjaG9Sb3V0ZXIsIHNpIFNlcnZlckludGVyZmFjZSwgYmFzZVVSTCBzdHJpbmcpIHsKCS8vIC4uLgoKCXJvdXRlci5HRVQoYmFzZVVSTCsiL3BpbmciLCB3cmFwcGVyLkdldFBpbmcpCgp9CmBgYAoKVG8gaW1wbGVtZW50IHRoaXMgSFRUUCBzZXJ2ZXIsIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlIGluIG91ciBbYGFwaS9pbXBsLmdvYF0oZXhhbXBsZXMvbWluaW1hbC1zZXJ2ZXIvZWNoby9hcGkvaW1wbC5nbyk6CgpgYGBnbwppbXBvcnQgKAoJIm5ldC9odHRwIgoKCSJnaXRodWIuY29tL2xhYnN0YWNrL2VjaG8vdjQiCikKCi8vIG9wdGlvbmFsIGNvZGUgb21pdHRlZAoKdHlwZSBTZXJ2ZXIgc3RydWN0e30KCmZ1bmMgTmV3U2VydmVyKCkgU2VydmVyIHsKCXJldHVybiBTZXJ2ZXJ7fQp9CgovLyAoR0VUIC9waW5nKQpmdW5jIChTZXJ2ZXIpIEdldFBpbmcoY3R4IGVjaG8uQ29udGV4dCkgZXJyb3IgewoJcmVzcCA6PSBQb25newoJCVBpbmc6ICJwb25nIiwKCX0KCglyZXR1cm4gY3R4LkpTT04oaHR0cC5TdGF0dXNPSywgcmVzcCkKfQpgYGAKCk5vdyB3ZSd2ZSBnb3Qgb3VyIGltcGxlbWVudGF0aW9uLCB3ZSBjYW4gdGhlbiB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgdG8gd2lyZSBpdCB1cCBhbmQgZ2V0IGEgcnVubmluZyBzZXJ2ZXI6CgpgYGBnbwppbXBvcnQgKAoJImxvZyIKCgkiZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyL2V4YW1wbGVzL21pbmltYWwtc2VydmVyL2VjaG8vYXBpIgoJImdpdGh1Yi5jb20vbGFic3RhY2svZWNoby92NCIKKQoKZnVuYyBtYWluKCkgewoJLy8gY3JlYXRlIGEgdHlwZSB0aGF0IHNhdGlzZmllcyB0aGUgYGFwaS5TZXJ2ZXJJbnRlcmZhY2VgLCB3aGljaCBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBldmVyeSBvcGVyYXRpb24gZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUKCXNlcnZlciA6PSBhcGkuTmV3U2VydmVyKCkKCgllIDo9IGVjaG8uTmV3KCkKCglhcGkuUmVnaXN0ZXJIYW5kbGVycyhlLCBzZXJ2ZXIpCgoJLy8gQW5kIHdlIHNlcnZlIEhUVFAgdW50aWwgdGhlIHdvcmxkIGVuZHMuCglsb2cuRmF0YWwoZS5TdGFydCgiMC4wLjAuMDo4MDgwIikpCn0KYGBgCgo+IFshTk9URV0KPiBUaGlzIGRvZXNuJ3QgaW5jbHVkZSBbdmFsaWRhdGlvbiBvZiBpbmNvbWluZyByZXF1ZXN0c10oI3JlcXVlc3RyZXNwb25zZS12YWxpZGF0aW9uLW1pZGRsZXdhcmUpLgoKIyMjIEZpYmVyIHNlcnZlcgo8YSBuYW1lPSJpbXBsLWZpYmVyIj48L2E+CgpGb3IgaW5zdGFuY2UsIGxldCdzIHRha2UgdGhpcyBzdHJhaWdodGZvcndhcmQgc3BlY2lmaWNhdGlvbjoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IE1pbmltYWwgcGluZyBBUEkgc2VydmVyCnBhdGhzOgogIC9waW5nOgogICAgZ2V0OgogICAgICByZXNwb25zZXM6CiAgICAgICAgJzIwMCc6CiAgICAgICAgICBkZXNjcmlwdGlvbjogcGV0IHJlc3BvbnNlCiAgICAgICAgICBjb250ZW50OgogICAgICAgICAgICBhcHBsaWNhdGlvbi9qc29uOgogICAgICAgICAgICAgIHNjaGVtYToKICAgICAgICAgICAgICAgICRyZWY6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9Qb25nJwpjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICAjIGJhc2UgdHlwZXMKICAgIFBvbmc6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIHBpbmcKICAgICAgcHJvcGVydGllczoKICAgICAgICBwaW5nOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBleGFtcGxlOiBwb25nCmBgYAoKVGhpcyB0aGVuIGdlbmVyYXRlcyBjb2RlIHN1Y2ggYXM6CgpgYGBnbwovLyBQb25nIGRlZmluZXMgbW9kZWwgZm9yIFBvbmcuCnR5cGUgUG9uZyBzdHJ1Y3QgewoJUGluZyBzdHJpbmcgYGpzb246InBpbmciYAp9CgovLyBTZXJ2ZXJJbnRlcmZhY2UgcmVwcmVzZW50cyBhbGwgc2VydmVyIGhhbmRsZXJzLgp0eXBlIFNlcnZlckludGVyZmFjZSBpbnRlcmZhY2UgewoKCS8vIChHRVQgL3BpbmcpCglHZXRQaW5nKGMgKmZpYmVyLkN0eCkgZXJyb3IKfQoKLy8gUmVnaXN0ZXJIYW5kbGVycyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIHJvdXRpbmcgbWF0Y2hpbmcgT3BlbkFQSSBzcGVjLgpmdW5jIFJlZ2lzdGVySGFuZGxlcnMocm91dGVyIGZpYmVyLlJvdXRlciwgc2kgU2VydmVySW50ZXJmYWNlKSB7CglSZWdpc3RlckhhbmRsZXJzV2l0aE9wdGlvbnMocm91dGVyLCBzaSwgRmliZXJTZXJ2ZXJPcHRpb25ze30pCn0KCi8vIFJlZ2lzdGVySGFuZGxlcnNXaXRoT3B0aW9ucyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucwpmdW5jIFJlZ2lzdGVySGFuZGxlcnNXaXRoT3B0aW9ucyhyb3V0ZXIgZmliZXIuUm91dGVyLCBzaSBTZXJ2ZXJJbnRlcmZhY2UsIG9wdGlvbnMgRmliZXJTZXJ2ZXJPcHRpb25zKSB7CgkvLyAuLi4KCglyb3V0ZXIuR2V0KG9wdGlvbnMuQmFzZVVSTCsiL3BpbmciLCB3cmFwcGVyLkdldFBpbmcpCn0KYGBgCgpUbyBpbXBsZW1lbnQgdGhpcyBIVFRQIHNlcnZlciwgd2UgbmVlZCB0byB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4gb3VyIFtgYXBpL2ltcGwuZ29gXShleGFtcGxlcy9taW5pbWFsLXNlcnZlci9maWJlci9hcGkvaW1wbC5nbyk6CgpgYGBnbwppbXBvcnQgKAoJIm5ldC9odHRwIgoKCSJnaXRodWIuY29tL2dvZmliZXIvZmliZXIvdjIiCikKCi8vIGVuc3VyZSB0aGF0IHdlJ3ZlIGNvbmZvcm1lZCB0byB0aGUgYFNlcnZlckludGVyZmFjZWAgd2l0aCBhIGNvbXBpbGUtdGltZSBjaGVjawp2YXIgXyBTZXJ2ZXJJbnRlcmZhY2UgPSAoKlNlcnZlcikobmlsKQoKdHlwZSBTZXJ2ZXIgc3RydWN0e30KCmZ1bmMgTmV3U2VydmVyKCkgU2VydmVyIHsKCXJldHVybiBTZXJ2ZXJ7fQp9CgovLyAoR0VUIC9waW5nKQpmdW5jIChTZXJ2ZXIpIEdldFBpbmcoY3R4ICpmaWJlci5DdHgpIGVycm9yIHsKCXJlc3AgOj0gUG9uZ3sKCQlQaW5nOiAicG9uZyIsCgl9CgoJcmV0dXJuIGN0eC4KCQlTdGF0dXMoaHR0cC5TdGF0dXNPSykuCgkJSlNPTihyZXNwKQp9CmBgYAoKTm93IHdlJ3ZlIGdvdCBvdXIgaW1wbGVtZW50YXRpb24sIHdlIGNhbiB0aGVuIHdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZSB0byB3aXJlIGl0IHVwIGFuZCBnZXQgYSBydW5uaW5nIHNlcnZlcjoKCmBgYGdvCmltcG9ydCAoCgkibG9nIgoKCSJnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvZXhhbXBsZXMvbWluaW1hbC1zZXJ2ZXIvZmliZXIvYXBpIgoJImdpdGh1Yi5jb20vZ29maWJlci9maWJlci92MiIKKQoKZnVuYyBtYWluKCkgewoJLy8gY3JlYXRlIGEgdHlwZSB0aGF0IHNhdGlzZmllcyB0aGUgYGFwaS5TZXJ2ZXJJbnRlcmZhY2VgLCB3aGljaCBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBldmVyeSBvcGVyYXRpb24gZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUKCXNlcnZlciA6PSBhcGkuTmV3U2VydmVyKCkKCglhcHAgOj0gZmliZXIuTmV3KCkKCglhcGkuUmVnaXN0ZXJIYW5kbGVycyhhcHAsIHNlcnZlcikKCgkvLyBBbmQgd2Ugc2VydmUgSFRUUCB1bnRpbCB0aGUgd29ybGQgZW5kcy4KCWxvZy5GYXRhbChhcHAuTGlzdGVuKCIwLjAuMC4wOjgwODAiKSkKfQpgYGAKCj4gWyFOT1RFXQo+IFRoaXMgZG9lc24ndCBpbmNsdWRlIFt2YWxpZGF0aW9uIG9mIGluY29taW5nIHJlcXVlc3RzXSgjcmVxdWVzdHJlc3BvbnNlLXZhbGlkYXRpb24tbWlkZGxld2FyZSkuCgojIyMgR2luIHNlcnZlcgo8YSBuYW1lPSJpbXBsLWdpbiI+PC9hPgoKRm9yIGluc3RhbmNlLCBsZXQncyB0YWtlIHRoaXMgc3RyYWlnaHRmb3J3YXJkIHNwZWNpZmljYXRpb246CgpgYGB5YW1sCm9wZW5hcGk6ICIzLjAuMCIKaW5mbzoKICB2ZXJzaW9uOiAxLjAuMAogIHRpdGxlOiBNaW5pbWFsIHBpbmcgQVBJIHNlcnZlcgpwYXRoczoKICAvcGluZzoKICAgIGdldDoKICAgICAgcmVzcG9uc2VzOgogICAgICAgICcyMDAnOgogICAgICAgICAgZGVzY3JpcHRpb246IHBldCByZXNwb25zZQogICAgICAgICAgY29udGVudDoKICAgICAgICAgICAgYXBwbGljYXRpb24vanNvbjoKICAgICAgICAgICAgICBzY2hlbWE6CiAgICAgICAgICAgICAgICAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvUG9uZycKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgIyBiYXNlIHR5cGVzCiAgICBQb25nOgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBwaW5nCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgcGluZzoKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgZXhhbXBsZTogcG9uZwpgYGAKClRoaXMgdGhlbiBnZW5lcmF0ZXMgY29kZSBzdWNoIGFzOgoKYGBgZ28KLy8gUG9uZyBkZWZpbmVzIG1vZGVsIGZvciBQb25nLgp0eXBlIFBvbmcgc3RydWN0IHsKCVBpbmcgc3RyaW5nIGBqc29uOiJwaW5nImAKfQoKLy8gU2VydmVySW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIHNlcnZlciBoYW5kbGVycy4KdHlwZSBTZXJ2ZXJJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCgkvLyAoR0VUIC9waW5nKQoJR2V0UGluZyhjICpnaW4uQ29udGV4dCkKfQoKLy8gUmVnaXN0ZXJIYW5kbGVycyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIHJvdXRpbmcgbWF0Y2hpbmcgT3BlbkFQSSBzcGVjLgpmdW5jIFJlZ2lzdGVySGFuZGxlcnMocm91dGVyIGdpbi5JUm91dGVyLCBzaSBTZXJ2ZXJJbnRlcmZhY2UpIHsKCVJlZ2lzdGVySGFuZGxlcnNXaXRoT3B0aW9ucyhyb3V0ZXIsIHNpLCBHaW5TZXJ2ZXJPcHRpb25ze30pCn0KCi8vIFJlZ2lzdGVySGFuZGxlcnNXaXRoT3B0aW9ucyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucwpmdW5jIFJlZ2lzdGVySGFuZGxlcnNXaXRoT3B0aW9ucyhyb3V0ZXIgZ2luLklSb3V0ZXIsIHNpIFNlcnZlckludGVyZmFjZSwgb3B0aW9ucyBHaW5TZXJ2ZXJPcHRpb25zKSB7CgkvLyAuLi4KCglyb3V0ZXIuR0VUKG9wdGlvbnMuQmFzZVVSTCsiL3BpbmciLCB3cmFwcGVyLkdldFBpbmcpCn0KYGBgCgpUbyBpbXBsZW1lbnQgdGhpcyBIVFRQIHNlcnZlciwgd2UgbmVlZCB0byB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4gb3VyIFtgYXBpL2ltcGwuZ29gXShleGFtcGxlcy9taW5pbWFsLXNlcnZlci9nb3JpbGxhbXV4L2FwaS9pbXBsLmdvKToKCmBgYGdvCmltcG9ydCAoCgkibmV0L2h0dHAiCgoJImdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbiIKKQoKLy8gb3B0aW9uYWwgY29kZSBvbWl0dGVkCgp0eXBlIFNlcnZlciBzdHJ1Y3R7fQoKZnVuYyBOZXdTZXJ2ZXIoKSBTZXJ2ZXIgewoJcmV0dXJuIFNlcnZlcnt9Cn0KCi8vIChHRVQgL3BpbmcpCmZ1bmMgKFNlcnZlcikgR2V0UGluZyhjdHggKmdpbi5Db250ZXh0KSB7CglyZXNwIDo9IFBvbmd7CgkJUGluZzogInBvbmciLAoJfQoKCWN0eC5KU09OKGh0dHAuU3RhdHVzT0ssIHJlc3ApCn0KYGBgCgpOb3cgd2UndmUgZ290IG91ciBpbXBsZW1lbnRhdGlvbiwgd2UgY2FuIHRoZW4gd3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlIHRvIHdpcmUgaXQgdXAgYW5kIGdldCBhIHJ1bm5pbmcgc2VydmVyOgoKYGBgZ28KaW1wb3J0ICgKCSJsb2ciCgkibmV0L2h0dHAiCgoJImdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9leGFtcGxlcy9taW5pbWFsLXNlcnZlci9naW4vYXBpIgoJImdpdGh1Yi5jb20vZ2luLWdvbmljL2dpbiIKKQoKZnVuYyBtYWluKCkgewoJLy8gY3JlYXRlIGEgdHlwZSB0aGF0IHNhdGlzZmllcyB0aGUgYGFwaS5TZXJ2ZXJJbnRlcmZhY2VgLCB3aGljaCBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBldmVyeSBvcGVyYXRpb24gZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUKCXNlcnZlciA6PSBhcGkuTmV3U2VydmVyKCkKCglyIDo9IGdpbi5EZWZhdWx0KCkKCglhcGkuUmVnaXN0ZXJIYW5kbGVycyhyLCBzZXJ2ZXIpCgoJLy8gQW5kIHdlIHNlcnZlIEhUVFAgdW50aWwgdGhlIHdvcmxkIGVuZHMuCgoJcyA6PSAmaHR0cC5TZXJ2ZXJ7CgkJSGFuZGxlcjogciwKCQlBZGRyOiAgICAiMC4wLjAuMDo4MDgwIiwKCX0KCgkvLyBBbmQgd2Ugc2VydmUgSFRUUCB1bnRpbCB0aGUgd29ybGQgZW5kcy4KCWxvZy5GYXRhbChzLkxpc3RlbkFuZFNlcnZlKCkpCn0KYGBgCgo+IFshTk9URV0KPiBUaGlzIGRvZXNuJ3QgaW5jbHVkZSBbdmFsaWRhdGlvbiBvZiBpbmNvbWluZyByZXF1ZXN0c10oI3JlcXVlc3RyZXNwb25zZS12YWxpZGF0aW9uLW1pZGRsZXdhcmUpLgoKIyMjIElyaXMgc2VydmVyCjxhIG5hbWU9ImltcGwtaXJpcyI+PC9hPgoKRm9yIGluc3RhbmNlLCBsZXQncyB0YWtlIHRoaXMgc3RyYWlnaHRmb3J3YXJkIHNwZWNpZmljYXRpb246CgpgYGB5YW1sCm9wZW5hcGk6ICIzLjAuMCIKaW5mbzoKICB2ZXJzaW9uOiAxLjAuMAogIHRpdGxlOiBNaW5pbWFsIHBpbmcgQVBJIHNlcnZlcgpwYXRoczoKICAvcGluZzoKICAgIGdldDoKICAgICAgcmVzcG9uc2VzOgogICAgICAgICcyMDAnOgogICAgICAgICAgZGVzY3JpcHRpb246IHBldCByZXNwb25zZQogICAgICAgICAgY29udGVudDoKICAgICAgICAgICAgYXBwbGljYXRpb24vanNvbjoKICAgICAgICAgICAgICBzY2hlbWE6CiAgICAgICAgICAgICAgICAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvUG9uZycKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgIyBiYXNlIHR5cGVzCiAgICBQb25nOgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBwaW5nCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgcGluZzoKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgZXhhbXBsZTogcG9uZwpgYGAKClRoaXMgdGhlbiBnZW5lcmF0ZXMgY29kZSBzdWNoIGFzOgoKYGBgZ28KLy8gUG9uZyBkZWZpbmVzIG1vZGVsIGZvciBQb25nLgp0eXBlIFBvbmcgc3RydWN0IHsKCVBpbmcgc3RyaW5nIGBqc29uOiJwaW5nImAKfQoKLy8gU2VydmVySW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIHNlcnZlciBoYW5kbGVycy4KdHlwZSBTZXJ2ZXJJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCgkvLyAoR0VUIC9waW5nKQoJR2V0UGluZyhjdHggaXJpcy5Db250ZXh0KQp9CgovLyBSZWdpc3RlckhhbmRsZXJzIGNyZWF0ZXMgaHR0cC5IYW5kbGVyIHdpdGggcm91dGluZyBtYXRjaGluZyBPcGVuQVBJIHNwZWMuCmZ1bmMgUmVnaXN0ZXJIYW5kbGVycyhyb3V0ZXIgKmlyaXMuQXBwbGljYXRpb24sIHNpIFNlcnZlckludGVyZmFjZSkgewoJUmVnaXN0ZXJIYW5kbGVyc1dpdGhPcHRpb25zKHJvdXRlciwgc2ksIElyaXNTZXJ2ZXJPcHRpb25ze30pCn0KCi8vIFJlZ2lzdGVySGFuZGxlcnNXaXRoT3B0aW9ucyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucwpmdW5jIFJlZ2lzdGVySGFuZGxlcnNXaXRoT3B0aW9ucyhyb3V0ZXIgKmlyaXMuQXBwbGljYXRpb24sIHNpIFNlcnZlckludGVyZmFjZSwgb3B0aW9ucyBJcmlzU2VydmVyT3B0aW9ucykgewoJLy8gLi4uCgoJcm91dGVyLkdldChvcHRpb25zLkJhc2VVUkwrIi9waW5nIiwgd3JhcHBlci5HZXRQaW5nKQoKCXJvdXRlci5CdWlsZCgpCn0KYGBgCgpUbyBpbXBsZW1lbnQgdGhpcyBIVFRQIHNlcnZlciwgd2UgbmVlZCB0byB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4gb3VyIFtgYXBpL2ltcGwuZ29gXShleGFtcGxlcy9taW5pbWFsLXNlcnZlci9nb3JpbGxhbXV4L2FwaS9pbXBsLmdvKToKCmBgYGdvCmltcG9ydCAoCgkibmV0L2h0dHAiCgoJImdpdGh1Yi5jb20va2F0YXJhcy9pcmlzL3YxMiIKKQoKLy8gb3B0aW9uYWwgY29kZSBvbWl0dGVkCgp0eXBlIFNlcnZlciBzdHJ1Y3R7fQoKZnVuYyBOZXdTZXJ2ZXIoKSBTZXJ2ZXIgewoJcmV0dXJuIFNlcnZlcnt9Cn0KCi8vIChHRVQgL3BpbmcpCmZ1bmMgKFNlcnZlcikgR2V0UGluZyhjdHggaXJpcy5Db250ZXh0KSB7CglyZXNwIDo9IFBvbmd7CgkJUGluZzogInBvbmciLAoJfQoKCWN0eC5TdGF0dXNDb2RlKGh0dHAuU3RhdHVzT0spCglfID0gY3R4LkpTT04ocmVzcCkKfQpgYGAKCk5vdyB3ZSd2ZSBnb3Qgb3VyIGltcGxlbWVudGF0aW9uLCB3ZSBjYW4gdGhlbiB3cml0ZSB0aGUgZm9sbG93aW5nIGNvZGUgdG8gd2lyZSBpdCB1cCBhbmQgZ2V0IGEgcnVubmluZyBzZXJ2ZXI6CgpgYGBnbwppbXBvcnQgKAoJImxvZyIKCgkiZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyL2V4YW1wbGVzL21pbmltYWwtc2VydmVyL2lyaXMvYXBpIgoJImdpdGh1Yi5jb20va2F0YXJhcy9pcmlzL3YxMiIKKQoKZnVuYyBtYWluKCkgewoJLy8gY3JlYXRlIGEgdHlwZSB0aGF0IHNhdGlzZmllcyB0aGUgYGFwaS5TZXJ2ZXJJbnRlcmZhY2VgLCB3aGljaCBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBldmVyeSBvcGVyYXRpb24gZnJvbSB0aGUgZ2VuZXJhdGVkIGNvZGUKCXNlcnZlciA6PSBhcGkuTmV3U2VydmVyKCkKCglpIDo9IGlyaXMuRGVmYXVsdCgpCgoJYXBpLlJlZ2lzdGVySGFuZGxlcnMoaSwgc2VydmVyKQoKCS8vIEFuZCB3ZSBzZXJ2ZSBIVFRQIHVudGlsIHRoZSB3b3JsZCBlbmRzLgoJbG9nLkZhdGFsKGkuTGlzdGVuKCIwLjAuMC4wOjgwODAiKSkKfQpgYGAKCj4gWyFOT1RFXQo+IFRoaXMgZG9lc24ndCBpbmNsdWRlIFt2YWxpZGF0aW9uIG9mIGluY29taW5nIHJlcXVlc3RzXSgjcmVxdWVzdHJlc3BvbnNlLXZhbGlkYXRpb24tbWlkZGxld2FyZSkuCgojIyMgU3RyaWN0IHNlcnZlcgoKYG9hcGktY29kZWdlbmAgYWxzbyBzdXBwb3J0cyBnZW5lcmF0aW5nIGEgc2VydmVyIHRoYXQgaXMgbXVjaCBtb3JlIHN0cmljdCB3aXRoIHRoZSBjb250cmFjdCB0aGF0IHRoZSBpbXBsZW1lbnRlciByZXF1aXJlcywgYW5kIHRha2VzIGluc3BpcmF0aW9uIGZyb20gc2VydmVyLXNpZGUgY29kZSBnZW5lcmF0aW9uIGZvciBSUEMgc2VydmVycy4KClRoaXMgdGFrZXMgdGhlIGJvaWxlcnBsYXRlIHJlZHVjdGlvbiBmcm9tIHRoZSBub24tc3RyaWN0IHNlcnZlcnMgYW5kIGFkZHMgYWRkaXRpb25hbCBib2lsZXJwbGF0ZSByZWR1Y3Rpb24sIGFsbG93aW5nIHlvdSB0byBtYWtlIHRoZSBmb2xsb3dpbmcgY2hhbmdlcyB0byB5b3VyIGZ1bmN0aW9uIHNpZ25hdHVyZXM6CgpgYGBkaWZmCi1GaW5kUGV0cyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCwgcGFyYW1zIEZpbmRQZXRzUGFyYW1zKQorRmluZFBldHMoY3R4IGNvbnRleHQuQ29udGV4dCwgcmVxdWVzdCBGaW5kUGV0c1JlcXVlc3RPYmplY3QpIChGaW5kUGV0c1Jlc3BvbnNlT2JqZWN0LCBlcnJvcikKYGBgCgpUaGlzIGlzIHRoZSBoaWdoZXN0IGxldmVsIG9mIHN0cmljdG5lc3MgdGhhdCBgb2FwaS1jb2RlZ2VuYCBzdXBwb3J0cyByaWdodCBub3csIGFuZCBpdCdzIGEgZ29vZCBpZGVhIHRvIHN0YXJ0IHdpdGggdGhpcyBpZiB5b3Ugd2FudCB0aGUgbW9zdCBndWFyZHJhaWxzIHRvIHNpbXBsaWZ5IGRldmVsb3BpbmcgeW91ciBBUElzLgoKVGhlIHN0cmljdCBzZXJ2ZXIgaGFzIHN1cHBvcnQgZm9yOgoKLSBtdWx0aXBsZSByZXF1ZXN0L3Jlc3BvbnNlIG1lZGlhIHR5cGVzIGFuZCBzdGF0dXMgY29kZXMgb24gYSBnaXZlbiBvcGVyYXRpb24KLSBmaXJzdC1jbGFzcyBzdXBwb3J0IGZvciBgbXVsdGlwYXJ0L2Zvcm0tZGF0YWAgYW5kIGBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRgIHJlcXVlc3RzCi0gcmV0dXJuaW5nIGFuIFtIVFRQIDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JdKGh0dHBzOi8vaHR0cC5jYXQvNTAwKSwgd2hlbiBhbiBgZXJyb3JgIGlzIHJldHVybmVkIGZyb20gYSBmdW5jdGlvbgotIGF1dG9tYWdpYyAodW4pbWFyc2hhbGxpbmcgb2YgcmVxdWVzdC9yZXNwb25zZXMsIGFuZCBzZXR0aW5nIGBjb250ZW50LXR5cGVgIGFuZCBIVFRQIHN0YXR1cyBjb2RlcyBvbiByZXNwb25zZXMKLSBiaW5kaW5nIHJlcXVlc3QgdmFsdWVzIHRvIGEgc3RydWN0LCBhIGBtdWx0aXBhcnQuUmVhZGVyYCBvciBwcm92aWRpbmcgYSBgaW8uUmVhZGVyYAoKWW91IGNhbiBzZWUgYSBsaXR0bGUgbW9yZSBkZXRhaWwgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIGluIHRoZSBbIldoYXQgZG9lcyBpdCBsb29rIGxpa2UiXSgjd2hhdC1kb2VzLWl0LWxvb2stbGlrZS1zdHJpY3QpIHNlY3Rpb24uCgo+IFshTk9URV0KPiBUbyBjb25maWd1cmUgdGhlIHN0cmljdCBzZXJ2ZXIgZ2VuZXJhdGlvbiwgeW91IG11c3Qgc3BlY2lmeSBhbm90aGVyIHNlcnZlciB0byBiZSBnZW5lcmF0ZWQuIEZvciBpbnN0YW5jZToKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogJHNjaGVtYT1odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9IRUFEL2NvbmZpZ3VyYXRpb24tc2NoZW1hLmpzb24KcGFja2FnZTogYXBpCmdlbmVyYXRlOgogICMgTk9URSBhbm90aGVyIHNlcnZlciBtdXN0IGJlIGFkZGVkIQogIGNoaS1zZXJ2ZXI6IHRydWUKICBzdHJpY3Qtc2VydmVyOiB0cnVlCm91dHB1dDogc2VydmVyLmdlbi5nbwpgYGAKCj4gWyFOT1RFXQo+IFRoaXMgZG9lc24ndCBpbmNsdWRlIFt2YWxpZGF0aW9uIG9mIGluY29taW5nIHJlcXVlc3RzXSgjcmVxdWVzdHJlc3BvbnNlLXZhbGlkYXRpb24tbWlkZGxld2FyZSkuCgojIyBHZW5lcmF0aW5nIEFQSSBjbGllbnRzCgpBcyB3ZWxsIGFzIGdlbmVyYXRpbmcgdGhlIHNlcnZlci1zaWRlIGJvaWxlcnBsYXRlLCBgb2FwaS1jb2RlZ2VuYCBjYW4gYWxzbyBnZW5lcmF0ZSBBUEkgY2xpZW50cy4KClRoaXMgYWltcyB0byBiZSBhbiBBUEkgY2xpZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgbWV0aG9kcyBvZiB0aGUgQVBJLCBhbmQgaXMgcGVyZmVjdGx5IHN1aXRlZCBmb3IgcHJvZHVjdGlvbiB1c2FnZS4KCkhvd2V2ZXIsIGlmIHlvdSB3ZXJlIGxvb2tpbmcgZm9yIGEgc2xpZ2h0bHkgbW9yZSBTREstc3R5bGUgYXBwcm9hY2gsIG9yIGEgbWl4IG9mIGdlbmVyYXRlZCB0ZXN0cyBhbmQvb3IgZG9jdW1lbnRhdGlvbiwgdGhpcyBBUEkgY2xpZW50IG1heSBub3QgYmUgZm9yIHlvdSwgYW5kIHlvdSBtYXkgd2FudCB0byBsb29rIGF0IGFsdGVybmF0ZSB0b29saW5nLgoKRm9yIGluc3RhbmNlLCBnaXZlbiBhbiBgYXBpLnlhbWxgOgoKYGBgeWFtbApvcGVuYXBpOiAiMy4wLjAiCmluZm86CiAgdmVyc2lvbjogMS4wLjAKICB0aXRsZTogR2VuZXJhdGUgbW9kZWxzCnBhdGhzOgogIC9jbGllbnQ6CiAgICBnZXQ6CiAgICAgIG9wZXJhdGlvbklkOiBnZXRDbGllbnQKICAgICAgcmVzcG9uc2VzOgogICAgICAgIDIwMDoKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgJHJlZjogIiMvY29tcG9uZW50cy9zY2hlbWFzL0NsaWVudFR5cGUiCiAgICBwdXQ6CiAgICAgIG9wZXJhdGlvbklkOiB1cGRhdGVDbGllbnQKICAgICAgcmVzcG9uc2VzOgogICAgICAgIDQwMDoKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgdHlwZTogb2JqZWN0CiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgICBjb2RlOgogICAgICAgICAgICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgICAgICAgcmVxdWlyZWQ6CiAgICAgICAgICAgICAgICAtIGNvZGUKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgQ2xpZW50VHlwZToKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gbmFtZQogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIG5hbWU6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICMgTk9URSB0aGF0IHRoaXMgaXMgbm90IGdlbmVyYXRlZCBieSBkZWZhdWx0IGJlY2F1c2UgaXQncyBub3QgcmVmZXJlbmNlZC4gSWYgeW91IHdhbnQgaXQsIHlvdSBuZWVkIHRvIHVzZSB0aGUgZm9sbG93aW5nIFlBTUwgY29uZmlndXJhdGlvbjoKICAgICMKICAgICMgb3V0cHV0LW9wdGlvbnM6CiAgICAjICAgc2tpcC1wcnVuZTogdHJ1ZQogICAgVW5yZWZlcmVuY2VkOgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBpZAogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogaW50ZWdlcgpgYGAKCkFuZCBhIGBjZmcueWFtbGA6CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6ICRzY2hlbWE9aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vSEVBRC9jb25maWd1cmF0aW9uLXNjaGVtYS5qc29uCnBhY2thZ2U6IGNsaWVudApvdXRwdXQ6IGNsaWVudC5nZW4uZ28KZ2VuZXJhdGU6CiAgbW9kZWxzOiB0cnVlCiAgY2xpZW50OiB0cnVlCmBgYAoKQW5kIGEgYGdlbmVyYXRlLmdvYDoKCmBgYGdvCnBhY2thZ2UgY2xpZW50CgovL2dvOmdlbmVyYXRlIGdvIHJ1biBnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvY21kL29hcGktY29kZWdlbiAtY29uZmlnIGNmZy55YW1sIGFwaS55YW1sCmBgYAoKVGhpcyB3b3VsZCB0aGVuIGdlbmVyYXRlOgoKYGBgZ28KcGFja2FnZSBjbGllbnQKCi8vIC4uLgoKLy8gQ2xpZW50VHlwZSBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnRUeXBlLgp0eXBlIENsaWVudFR5cGUgc3RydWN0IHsKCU5hbWUgc3RyaW5nIGBqc29uOiJuYW1lImAKfQoKLy8gLi4uCgovLyBDbGllbnQgd2hpY2ggY29uZm9ybXMgdG8gdGhlIE9wZW5BUEkzIHNwZWNpZmljYXRpb24gZm9yIHRoaXMgc2VydmljZS4KdHlwZSBDbGllbnQgc3RydWN0IHsKCS8vIFRoZSBlbmRwb2ludCBvZiB0aGUgc2VydmVyIGNvbmZvcm1pbmcgdG8gdGhpcyBpbnRlcmZhY2UsIHdpdGggc2NoZW1lLAoJLy8gaHR0cHM6Ly9hcGkuZGVlcG1hcC5jb20gZm9yIGV4YW1wbGUuIFRoaXMgY2FuIGNvbnRhaW4gYSBwYXRoIHJlbGF0aXZlCgkvLyB0byB0aGUgc2VydmVyLCBzdWNoIGFzIGh0dHBzOi8vYXBpLmRlZXBtYXAuY29tL2Rldi10ZXN0LCBhbmQgYWxsIHRoZQoJLy8gcGF0aHMgaW4gdGhlIHN3YWdnZXIgc3BlYyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBzZXJ2ZXIuCglTZXJ2ZXIgc3RyaW5nCgoJLy8gRG9lciBmb3IgcGVyZm9ybWluZyByZXF1ZXN0cywgdHlwaWNhbGx5IGEgKmh0dHAuQ2xpZW50IHdpdGggYW55CgkvLyBjdXN0b21pemVkIHNldHRpbmdzLCBzdWNoIGFzIGNlcnRpZmljYXRlIGNoYWlucy4KCUNsaWVudCBIdHRwUmVxdWVzdERvZXIKCgkvLyBBIGxpc3Qgb2YgY2FsbGJhY2tzIGZvciBtb2RpZnlpbmcgcmVxdWVzdHMgd2hpY2ggYXJlIGdlbmVyYXRlZCBiZWZvcmUgc2VuZGluZyBvdmVyCgkvLyB0aGUgbmV0d29yay4KCVJlcXVlc3RFZGl0b3JzIFtdUmVxdWVzdEVkaXRvckZuCn0KCi8vIC4uLgoKLy8gVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgY2xpZW50IGFib3ZlLgp0eXBlIENsaWVudEludGVyZmFjZSBpbnRlcmZhY2UgewoJLy8gR2V0Q2xpZW50IHJlcXVlc3QKCUdldENsaWVudChjdHggY29udGV4dC5Db250ZXh0LCByZXFFZGl0b3JzIC4uLlJlcXVlc3RFZGl0b3JGbikgKCpodHRwLlJlc3BvbnNlLCBlcnJvcikKCgkvLyBVcGRhdGVDbGllbnQgcmVxdWVzdAoJVXBkYXRlQ2xpZW50KGN0eCBjb250ZXh0LkNvbnRleHQsIHJlcUVkaXRvcnMgLi4uUmVxdWVzdEVkaXRvckZuKSAoKmh0dHAuUmVzcG9uc2UsIGVycm9yKQp9CgovLyAuLi4KCi8vIENsaWVudFdpdGhSZXNwb25zZXNJbnRlcmZhY2UgaXMgdGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgY2xpZW50IHdpdGggcmVzcG9uc2VzIGFib3ZlLgp0eXBlIENsaWVudFdpdGhSZXNwb25zZXNJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCS8vIEdldENsaWVudFdpdGhSZXNwb25zZSByZXF1ZXN0CglHZXRDbGllbnRXaXRoUmVzcG9uc2UoY3R4IGNvbnRleHQuQ29udGV4dCwgcmVxRWRpdG9ycyAuLi5SZXF1ZXN0RWRpdG9yRm4pICgqR2V0Q2xpZW50UmVzcG9uc2UsIGVycm9yKQoKCS8vIFVwZGF0ZUNsaWVudFdpdGhSZXNwb25zZSByZXF1ZXN0CglVcGRhdGVDbGllbnRXaXRoUmVzcG9uc2UoY3R4IGNvbnRleHQuQ29udGV4dCwgcmVxRWRpdG9ycyAuLi5SZXF1ZXN0RWRpdG9yRm4pICgqVXBkYXRlQ2xpZW50UmVzcG9uc2UsIGVycm9yKQp9Cgp0eXBlIEdldENsaWVudFJlc3BvbnNlIHN0cnVjdCB7CglCb2R5ICAgICAgICAgW11ieXRlCglIVFRQUmVzcG9uc2UgKmh0dHAuUmVzcG9uc2UKCUpTT04yMDAgICAgICAqQ2xpZW50VHlwZQp9CgovLyAuLi4KYGBgCgpXaXRoIHRoaXMgZ2VuZXJhdGVkIGNsaWVudCwgaXQgaXMgdGhlbiBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgYW5kIHV0aWxpc2UgdGhlIGNsaWVudCwgZm9yIGluc3RhbmNlOgoKYGBgZ28KcGFja2FnZSBjbGllbnRfdGVzdAoKaW1wb3J0ICgKCSJjb250ZXh0IgoJImZtdCIKCSJsb2ciCgkibmV0L2h0dHAiCgoJImdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9leGFtcGxlcy9jbGllbnQiCikKCmZ1bmMgVGVzdENsaWVudF9jYW5DYWxsKCkgewoJLy8gY3VzdG9tIEhUVFAgY2xpZW50CgloYyA6PSBodHRwLkNsaWVudHt9CgoJLy8gd2l0aCBhIHJhdyBodHRwLlJlc3BvbnNlCgl7CgkJYywgZXJyIDo9IGNsaWVudC5OZXdDbGllbnQoImh0dHA6Ly9sb2NhbGhvc3Q6MTIzNCIsIGNsaWVudC5XaXRoSFRUUENsaWVudCgmaGMpKQoJCWlmIGVyciAhPSBuaWwgewoJCQlsb2cuRmF0YWwoZXJyKQoJCX0KCgkJcmVzcCwgZXJyIDo9IGMuR2V0Q2xpZW50KGNvbnRleHQuVE9ETygpKQoJCWlmIGVyciAhPSBuaWwgewoJCQlsb2cuRmF0YWwoZXJyKQoJCX0KCQlpZiByZXNwLlN0YXR1c0NvZGUgIT0gaHR0cC5TdGF0dXNPSyB7CgkJCWxvZy5GYXRhbGYoIkV4cGVjdGVkIEhUVFAgMjAwIGJ1dCByZWNlaXZlZCAlZCIsIHJlc3AuU3RhdHVzQ29kZSkKCQl9Cgl9CgoJLy8gb3IgdG8gZ2V0IGEgc3RydWN0IHdpdGggdGhlIHBhcnNlZCByZXNwb25zZSBib2R5Cgl7CgkJYywgZXJyIDo9IGNsaWVudC5OZXdDbGllbnRXaXRoUmVzcG9uc2VzKCJodHRwOi8vbG9jYWxob3N0OjEyMzQiLCBjbGllbnQuV2l0aEhUVFBDbGllbnQoJmhjKSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJbG9nLkZhdGFsKGVycikKCQl9CgoJCXJlc3AsIGVyciA6PSBjLkdldENsaWVudFdpdGhSZXNwb25zZShjb250ZXh0LlRPRE8oKSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJbG9nLkZhdGFsKGVycikKCQl9CgkJaWYgcmVzcC5TdGF0dXNDb2RlKCkgIT0gaHR0cC5TdGF0dXNPSyB7CgkJCWxvZy5GYXRhbGYoIkV4cGVjdGVkIEhUVFAgMjAwIGJ1dCByZWNlaXZlZCAlZCIsIHJlc3AuU3RhdHVzQ29kZSgpKQoJCX0KCgkJZm10LlByaW50ZigicmVzcC5KU09OMjAwOiAldlxuIiwgcmVzcC5KU09OMjAwKQoJfQoKfQpgYGAKCiMjIEdlbmVyYXRpbmcgQVBJIG1vZGVscwoKSWYgeW91J3JlIGxvb2tpbmcgdG8gb25seSBnZW5lcmF0ZSB0aGUgbW9kZWxzIGZvciBpbnRlcmFjdGluZyB3aXRoIGEgcmVtb3RlIHNlcnZpY2UsIGZvciBpbnN0YW5jZSBpZiB5b3UgbmVlZCB0byBoYW5kLXJvbGwgdGhlIEFQSSBjbGllbnQgZm9yIHdoYXRldmVyIHJlYXNvbiwgeW91IGNhbiBkbyB0aGlzIGFzLWlzLgoKPiBbIVRJUF0KPiBUcnkgdG8gZGVmaW5lIGFzIG11Y2ggYXMgcG9zc2libGUgd2l0aGluIHRoZSBgIy9jb21wb25lbnRzL3NjaGVtYXNgIG9iamVjdCwgYXMgYG9hcGktY29kZWdlbmAgd2lsbCBnZW5lcmF0ZSBhbGwgdGhlIHR5cGVzIGhlcmUuCj4KPiBBbHRob3VnaCB3ZSBjYW4gZ2VuZXJhdGUgc29tZSB0eXBlcyBiYXNlZCBvbiBpbmxpbmUgZGVmaW5pdGlvbnMgaW4gaS5lLiBhIHBhdGgncyByZXNwb25zZSB0eXBlLCBpdCBpc24ndCBhbHdheXMgcG9zc2libGUgdG8gZG8gdGhpcywgb3IgaWYgaXQgaXMgZ2VuZXJhdGVkLCBjYW4gYmUgYSBsaXR0bGUgYXdrd2FyZCB0byB3b3JrIHdpdGggYXMgaXQgbWF5IGJlIGRlZmluZWQgYXMgYW4gYW5vbnltb3VzIHN0cnVjdC4KCkZvciBpbnN0YW5jZSwgZ2l2ZW4gYW4gYGFwaS55YW1sYDoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IEdlbmVyYXRlIG1vZGVscwpwYXRoczoKICAvY2xpZW50OgogICAgZ2V0OgogICAgICBvcGVyYXRpb25JZDogZ2V0Q2xpZW50CiAgICAgIHJlc3BvbnNlczoKICAgICAgICAyMDA6CiAgICAgICAgICBjb250ZW50OgogICAgICAgICAgICBhcHBsaWNhdGlvbi9qc29uOgogICAgICAgICAgICAgIHNjaGVtYToKICAgICAgICAgICAgICAgICMgTk9URSB0aGF0IENsaWVudCBpcyBnZW5lcmF0ZWQgaGVyZSwgYmVjYXVzZSBpdCdzIHdpdGhpbiAjL2NvbXBvbmVudHMvc2NoZW1hcwogICAgICAgICAgICAgICAgJHJlZjogIiMvY29tcG9uZW50cy9zY2hlbWFzL0NsaWVudCIKICAgIHB1dDoKICAgICAgb3BlcmF0aW9uSWQ6IHVwZGF0ZUNsaWVudAogICAgICByZXNwb25zZXM6CiAgICAgICAgNDAwOgogICAgICAgICAgY29udGVudDoKICAgICAgICAgICAgYXBwbGljYXRpb24vanNvbjoKICAgICAgICAgICAgICAjIE5PVEUgdGhhdCB0aGlzIGFub255bW91cyBvYmplY3QgaXMgL25vdC8gZ2VuZXJhdGVkIGJlY2F1c2UgaXQncyBhbiBhbm9ueW1vdXMsIGJ1dCB3b3VsZCBiZSBnZW5lcmF0ZWQgaWYgdXNpbmcgYGdlbmVyYXRlOiBjbGllbnRgCiAgICAgICAgICAgICAgIyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vaXNzdWVzLzE1MTIKICAgICAgICAgICAgICBzY2hlbWE6CiAgICAgICAgICAgICAgICB0eXBlOiBvYmplY3QKICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgICAgICAgICAgIGNvZGU6CiAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgICAgIC0gY29kZQpjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICBDbGllbnQ6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAjIE5PVEUgdGhhdCB0aGlzIGlzIG5vdCBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBiZWNhdXNlIGl0J3Mgbm90IHJlZmVyZW5jZWQuIElmIHlvdSB3YW50IGl0LCB5b3UgbmVlZCB0byB1c2UgdGhlIGZvbGxvd2luZyBZQU1MIGNvbmZpZ3VyYXRpb246CiAgICAjCiAgICAjIG91dHB1dC1vcHRpb25zOgogICAgIyAgIHNraXAtcHJ1bmU6IHRydWUKICAgIFVucmVmZXJlbmNlZDoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gaWQKICAgICAgcHJvcGVydGllczoKICAgICAgICBpZDoKICAgICAgICAgIHR5cGU6IGludGVnZXIKYGBgCgpBbmQgYSBgY2ZnLnlhbWxgOgoKYGBgeWFtbAojIHlhbWwtbGFuZ3VhZ2Utc2VydmVyOiAkc2NoZW1hPWh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL0hFQUQvY29uZmlndXJhdGlvbi1zY2hlbWEuanNvbgpwYWNrYWdlOiBvbmx5bW9kZWxzCm91dHB1dDogb25seS1tb2RlbHMuZ2VuLmdvCmdlbmVyYXRlOgogIG1vZGVsczogdHJ1ZQpgYGAKCkFuZCBhIGBnZW5lcmF0ZS5nb2A6CgpgYGBnbwpwYWNrYWdlIG9ubHltb2RlbHMKCi8vZ286Z2VuZXJhdGUgZ28gcnVuIGdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9jbWQvb2FwaS1jb2RlZ2VuIC1jb25maWcgY2ZnLnlhbWwgYXBpLnlhbWwKYGBgCgpUaGlzIHdvdWxkIHRoZW4gZ2VuZXJhdGU6CgpgYGBnbwpwYWNrYWdlIG9ubHltb2RlbHMKCi8vIENsaWVudCBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnQuCnR5cGUgQ2xpZW50IHN0cnVjdCB7CglOYW1lIHN0cmluZyBganNvbjoibmFtZSJgCn0KYGBgCgpJZiB5b3Ugd2lzaCB0byBhbHNvIGdlbmVyYXRlIHRoZSBgVW5yZWZlcmVuY2VkYCB0eXBlLCB5b3Ugd291bGQgbmVlZCB0aGUgZm9sbG93aW5nIGBjZmcueWFtbGA6CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6ICRzY2hlbWE9aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vSEVBRC9jb25maWd1cmF0aW9uLXNjaGVtYS5qc29uCnBhY2thZ2U6IG9ubHltb2RlbHMKb3V0cHV0OiBvbmx5LW1vZGVscy5nZW4uZ28KZ2VuZXJhdGU6CiAgbW9kZWxzOiB0cnVlCm91dHB1dC1vcHRpb25zOgogICMgTk9URSB0aGF0IHRoaXMgaXMgb25seSByZXF1aXJlZCBmb3IgdGhlIGBVbnJlZmVyZW5jZWRgIHR5cGUKICBza2lwLXBydW5lOiB0cnVlCmBgYAoKRm9yIGEgY29tcGxldGUgZXhhbXBsZSBzZWUgW2BleGFtcGxlcy9vbmx5LW1vZGVsc2BdKGV4YW1wbGVzL29ubHktbW9kZWxzKS4KCiMjIFNwbGl0dGluZyBsYXJnZSBPcGVuQVBJIHNwZWNzIGFjcm9zcyBtdWx0aXBsZSBwYWNrYWdlcyAoYWthICJJbXBvcnQgTWFwcGluZyIgb3IgImV4dGVybmFsIHJlZmVyZW5jZXMiKQo8YSBuYW1lPWltcG9ydC1tYXBwaW5nPjwvYT4KCldoZW4geW91J3ZlIGdvdCBhIGxhcmdlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiwgeW91IG1heSBmaW5kIGl0IHVzZWZ1bCB0byBzcGxpdCB0aGUgY29udGVudHMgb2YgdGhlIHNwZWMgYWNyb3NzIG11bHRpcGxlIGZpbGVzLCB1c2luZyBleHRlcm5hbCByZWZlcmVuY2VzLCBzdWNoIGFzOgoKYGBgeWFtbAogICAgICByZXNwb25zZXM6CiAgICAgICAgMjAwOgogICAgICAgICAgZGVzY3JpcHRpb246IFN1Y2Nlc3MKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL1VzZXInCmBgYAoKVGhpcyBpcyBzdXBwb3J0ZWQgYnkgYG9hcGktY29kZWdlbmAsIHRocm91Z2ggdGhlIGFiaWxpdHkgdG8gcGVyZm9ybSAiSW1wb3J0IE1hcHBpbmciLgoKRm9yIGluc3RhbmNlLCBsZXQncyBzYXkgdGhhdCB3ZSBoYXZlIGEgbGFyZ2UgQVBJLCB3aGljaCBoYXMgYSB1c2VyLWZhY2luZyBBUEkgYW5kIGFuIGFkbWluIEFQSSwgYm90aCBvZiB3aGljaCB1c2UgYSBjb21tb24gc2V0IG9mIEFQSSBtb2RlbHMuCgpJbiB0aGlzIGNhc2UsIHdlIG1heSBoYXZlIGFuIEFkbWluIEFQSSB0aGF0IGxvb2tzIGxpa2U6CgpgYGB5YW1sCiMgYWRtaW4vYXBpLnlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IEFkbWluIEFQSQogIGRlc2NyaXB0aW9uOiBUaGUgYWRtaW4tb25seSBwb3J0aW9uIG9mIHRoZSBBUEksIHdoaWNoIGhhcyBpdHMgb3duIHNlcGFyYXRlIE9wZW5BUEkgc3BlYwp0YWdzOgogIC0gbmFtZTogYWRtaW4KICAgIGRlc2NyaXB0aW9uOiBBZG1pbiBBUEkgZW5kcG9pbnRzCiAgLSBuYW1lOiB1c2VyCiAgICBkZXNjcmlwdGlvbjogQVBJIGVuZHBvaW50IHRoYXQgcGVydGFpbnMgdG8gdXNlciBkYXRhCnBhdGhzOgogIC9hZG1pbi91c2VyL3tpZH06CiAgICBnZXQ6CiAgICAgIHRhZ3M6CiAgICAgICAgLSBhZG1pbgogICAgICAgIC0gdXNlcgogICAgICBzdW1tYXJ5OiBHZXQgYSB1c2VyJ3MgZGV0YWlscwogICAgICBvcGVyYXRpb25JZDogZ2V0VXNlckJ5SWQKICAgICAgcGFyYW1ldGVyczoKICAgICAgICAtIG5hbWU6IGlkCiAgICAgICAgICBpbjogcGF0aAogICAgICAgICAgcmVxdWlyZWQ6IHRydWUKICAgICAgICAgIHNjaGVtYToKICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAgIGZvcm1hdDogdXVpZAogICAgICByZXNwb25zZXM6CiAgICAgICAgMjAwOgogICAgICAgICAgZGVzY3JpcHRpb246IFN1Y2Nlc3MKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgJHJlZjogJy4uL2NvbW1vbi9hcGkueWFtbCMvY29tcG9uZW50cy9zY2hlbWFzL1VzZXInCmBgYAoKVGhpcyByZWZlcmVuY2VzIHRoZSBjb21tb24gc3BlYzoKCmBgYHlhbWwKIyBjb21tb24vYXBpLnlhbWwKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgVXNlcjoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZQogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIG5hbWU6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCmBgYAoKU28gaG93IGRvIHdlIGdldCBgb2FwaS1jb2RlZ2VuYCB0byBnZW5lcmF0ZSBvdXIgY29kZT8KCiMjIyBVc2luZyBhIHNpbmdsZSBwYWNrYWdlIHdpdGggbXVsdGlwbGUgT3BlbkFQSSBzcGVjcwoKPGEgbmFtZT1pbXBvcnQtbWFwcGluZy1zZWxmPjwvYT4KCj4gWyFUSVBdCj4gU2luY2UgYG9hcGktY29kZWdlbmAgdjIuNC4wLCBpdCBpcyBub3cgcG9zc2libGUgdG8gc3BsaXQgbGFyZ2UgT3BlbkFQSSBzcGVjaWZpY2F0aW9ucyBpbnRvIHRoZSBzYW1lIEdvIHBhY2thZ2UsIHVzaW5nIHRoZSAic2VsZiIgbWFwcGluZyAoZGVub3RlZCBieSBhIGAtYCkgd2hlbiB1c2luZyBJbXBvcnQgTWFwcGluZy4KPgo+IFRoaXMgaXMgYW4gaW1wcm92ZW1lbnQgb24gdGhlIHByZXZpb3VzIG1vZGVsLCB3aGljaCB3b3VsZCByZXF1aXJlIHNwbGl0dGluZyBmaWxlcyBhY3Jvc3MgbXVsdGlwbGUgcGFja2FnZXMuCgo+IFshTk9URV0KPiBZb3Ugc3RpbGwgbmVlZCB0byBoYXZlIG11bHRpcGxlIGBnbyBnZW5lcmF0ZWBzLCBhbmQgYW55IG90aGVyIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgpUbyBnZXQgYG9hcGktY29kZWdlbmAncyBzaW5nbGUtcGFja2FnZSBzdXBwb3J0IHdvcmtpbmcsIHdlIG5lZWQgbXVsdGlwbGUgY2FsbHMgdG8gYG9hcGktY29kZWdlbmAsIG9uZSBjYWxsIHBlciBPcGVuQVBJIHNwZWMgZmlsZToKCmBgYHNoCiQgZ28gcnVuIGdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9jbWQvb2FwaS1jb2RlZ2VuIC1jb25maWcgY2ZnLWFwaS55YW1sIC4uL2FkbWluL2FwaS55YW1sCiQgZ28gcnVuIGdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9jbWQvb2FwaS1jb2RlZ2VuIC1jb25maWcgY2ZnLXVzZXIueWFtbCAuLi9jb21tb24vYXBpLnlhbWwKYGBgCgpUaGlzIHRoZXJlZm9yZSBtZWFucyB0aGF0IHdlIG5lZWQgbXVsdGlwbGUgY29uZmlndXJhdGlvbiBmaWxlcywgc3VjaCBhcyBgY2ZnLWFwaS55YW1sYDoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogJHNjaGVtYT1odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9IRUFEL2NvbmZpZ3VyYXRpb24tc2NoZW1hLmpzb24KcGFja2FnZTogc2FtZXBhY2thZ2UKb3V0cHV0OiBzZXJ2ZXIuZ2VuLmdvCmdlbmVyYXRlOgogIG1vZGVsczogdHJ1ZQogIGNoaS1zZXJ2ZXI6IHRydWUKICBzdHJpY3Qtc2VydmVyOiB0cnVlCm91dHB1dC1vcHRpb25zOgogICMgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHR5cGVzIGFyZSBnZW5lcmF0ZWQKICBza2lwLXBydW5lOiB0cnVlCmltcG9ydC1tYXBwaW5nOgogIHVzZXIueWFtbDogIi0iCmBgYAoKQW5kIHRoZW4gb3VyIGBjZmctdXNlci55YW1sYDoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogJHNjaGVtYT1odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9IRUFEL2NvbmZpZ3VyYXRpb24tc2NoZW1hLmpzb24KcGFja2FnZTogc2FtZXBhY2thZ2UKb3V0cHV0OiB1c2VyLmdlbi5nbwpnZW5lcmF0ZToKICBtb2RlbHM6IHRydWUKb3V0cHV0LW9wdGlvbnM6CiAgIyB0byBtYWtlIHN1cmUgdGhhdCBhbGwgdHlwZXMgYXJlIGdlbmVyYXRlZAogIHNraXAtcHJ1bmU6IHRydWUKYGBgCgpGcm9tIGhlcmUsIGBvYXBpLWNvZGVnZW5gIHdpbGwgZ2VuZXJhdGUgbXVsdGlwbGUgR28gZmlsZXMsIGFsbCB3aXRoaW4gdGhlIHNhbWUgcGFja2FnZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYnJlYWsgZG93biB5b3VyIGxhcmdlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbnMsIGFuZCBnZW5lcmF0ZSBvbmx5IHRoZSBzdWJzZXRzIG9mIGNvZGUgbmVlZGVkIGZvciBlYWNoIHBhcnQgb2YgdGhlIHNwZWMuCgpDaGVjayBvdXQgW3RoZSBpbXBvcnQtbWFwcGluZy9zYW1lcGFja2FnZSBleGFtcGxlXShleGFtcGxlcy9pbXBvcnQtbWFwcGluZy9zYW1lcGFja2FnZSkgZm9yIHRoZSBmdWxsIGNvZGUuCgojIyMgVXNpbmcgbXVsdGlwbGUgcGFja2FnZXMsIHdpdGggb25lIE9wZW5BUEkgc3BlYyBwZXIgcGFja2FnZQoKVG8gZ2V0IGBvYXBpLWNvZGVnZW5gJ3MgbXVsdGktcGFja2FnZSBzdXBwb3J0IHdvcmtpbmcsIHdlIG5lZWQgdG8gc2V0IHVwIG91ciBkaXJlY3Rvcnkgc3RydWN0dXJlOgoKYGBgCuKUnOKUgOKUgCBhZG1pbgrilILCoMKgIOKUnOKUgOKUgCBjZmcueWFtbArilILCoMKgIOKUlOKUgOKUgCBnZW5lcmF0ZS5nbwrilJTilIDilIAgY29tbW9uCiAgICDilJzilIDilIAgY2ZnLnlhbWwKIMKgwqAg4pSU4pSA4pSAIGdlbmVyYXRlLmdvCmBgYAoKV2UgY291bGQgc3RhcnQgd2l0aCBvdXIgY29uZmlndXJhdGlvbiBmaWxlIGZvciBvdXIgYWRtaW4gQVBJIHNwZWM6CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6ICRzY2hlbWE9aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vSEVBRC9jb25maWd1cmF0aW9uLXNjaGVtYS5qc29uCiMgYWRtaW4vY2ZnLnlhbWwKcGFja2FnZTogYWRtaW4Kb3V0cHV0OiBzZXJ2ZXIuZ2VuLmdvCmdlbmVyYXRlOgogIG1vZGVsczogdHJ1ZQogIGNoaS1zZXJ2ZXI6IHRydWUKb3V0cHV0LW9wdGlvbnM6CiAgIyB0byBtYWtlIHN1cmUgdGhhdCBhbGwgdHlwZXMgYXJlIGdlbmVyYXRlZAogIHNraXAtcHJ1bmU6IHRydWUKIyBOT1RFIHRoYXQgdGhpcyB3b24ndCB3b3JrLCBhcyBpdCdzIG1pc3NpbmcgYGltcG9ydC1tYXBwaW5nYApgYGAKCklmIHdlIHdlcmUgdG8gcnVuIGBvYXBpLWNvZGVnZW5gLCB0aGlzIHdpbGwgZmFpbCB3aXRoIHRoZSBmb2xsb3dpbmcgZXJyb3IKCmBgYAplcnJvciBnZW5lcmF0aW5nIGNvZGU6IGVycm9yIGNyZWF0aW5nIG9wZXJhdGlvbiBkZWZpbml0aW9uczogZXJyb3IgZ2VuZXJhdGluZyByZXNwb25zZSBkZWZpbml0aW9uczogZXJyb3IgZ2VuZXJhdGluZyByZXF1ZXN0IGJvZHkgZGVmaW5pdGlvbjogZXJyb3IgdHVybmluZyByZWZlcmVuY2UgKC4uL2NvbW1vbi9hcGkueWFtbCMvY29tcG9uZW50cy9zY2hlbWFzL1VzZXIpIGludG8gYSBHbyB0eXBlOiB1bnJlY29nbml6ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlICcuLi9jb21tb24vYXBpLnlhbWwnOyBwbGVhc2UgcHJvdmlkZSB0aGUga25vd24gaW1wb3J0IGZvciB0aGlzIHJlZmVyZW5jZSB1c2luZyBvcHRpb24gLS1pbXBvcnQtbWFwcGluZwpgYGAKClRoaXMgaXMgYmVjYXVzZSBgb2FwaS1jb2RlZ2VuYCByZXF1aXJlcyB0aGUgYGltcG9ydC1tYXBwaW5nYDoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogJHNjaGVtYT1odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9IRUFEL2NvbmZpZ3VyYXRpb24tc2NoZW1hLmpzb24KcGFja2FnZTogYWRtaW4Kb3V0cHV0OiBzZXJ2ZXIuZ2VuLmdvCmdlbmVyYXRlOgogIG1vZGVsczogdHJ1ZQogIGNoaS1zZXJ2ZXI6IHRydWUKb3V0cHV0LW9wdGlvbnM6CiAgIyB0byBtYWtlIHN1cmUgdGhhdCBhbGwgdHlwZXMgYXJlIGdlbmVyYXRlZAogIHNraXAtcHJ1bmU6IHRydWUKaW1wb3J0LW1hcHBpbmc6CiAgIyBmb3IgYSBnaXZlbiBmaWxlL1VSTCB0aGF0IGlzICRyZWYnZCwgcG9pbnQgYG9hcGktY29kZWdlbmAgdG8gdGhlIEdvIHBhY2thZ2UgdGhhdCB0aGlzIHNwZWMgaXMgZ2VuZXJhdGVkIGludG8sIHRvIHBlcmZvcm0gR28gcGFja2FnZSBpbXBvcnRzCiAgLi4vY29tbW9uL2FwaS55YW1sOiBnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvZXhhbXBsZXMvaW1wb3J0LW1hcHBpbmcvY29tbW9uCmBgYAoKVGhpcyB3aWxsIHRoZW4gZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBjb2RlOgoKYGBgZ28KcGFja2FnZSBhZG1pbgoKaW1wb3J0ICgKCS8vIC4uLgoJZXh0ZXJuYWxSZWYwICJnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvZXhhbXBsZXMvaW1wb3J0LW1hcHBpbmcvY29tbW9uIgopCgovLyBVc2VyIGRlZmluZXMgbW9kZWwgZm9yIFVzZXIuCnR5cGUgVXNlciA9IGV4dGVybmFsUmVmMC5Vc2VyCmBgYAoKSWYgeW91IGRvbid0IHdhbnQgdG8gZG8gdGhpcywgYW4gYWx0ZXJuYXRlIG9wdGlvbiBpcyB0byBbdXNlIGEgc2luZ2xlIHBhY2thZ2UsIHdpdGggbXVsdGlwbGUgT3BlbkFQSSBzcGVjIGZpbGVzIGZvciB0aGF0IGdpdmVuIHBhY2thZ2VdKCNpbXBvcnQtbWFwcGluZy1zZWxmKSBvciB0byBbYnVuZGxlIHlvdXIgbXVsdGlwbGUgT3BlbkFQSSBmaWxlc10oaHR0cHM6Ly93d3cuanZ0Lm1lL3Bvc3RzLzIwMjIvMDIvMTAvYnVuZGxlLW9wZW5hcGkvKSBpbnRvIGEgc2luZ2xlIHNwZWMuCgpDaGVjayBvdXQgW3RoZSBpbXBvcnQtbWFwcGluZy9tdWx0aXBsZXBhY2thZ2VzIGV4YW1wbGVdKGV4YW1wbGVzL2ltcG9ydC1tYXBwaW5nL211bHRpcGxlcGFja2FnZXMvKSBmb3IgdGhlIGZ1bGwgY29kZS4KCiMjIE1vZGlmeWluZyB0aGUgaW5wdXQgT3BlbkFQSSBTcGVjaWZpY2F0aW9uCgpQcmlvciB0byBgb2FwaS1jb2RlZ2VuYCB2Mi40LjAsIHVzZXJzIHdpc2hpbmcgdG8gb3ZlcnJpZGUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiwgZm9yIGluc3RhbmNlIHRha2luZyBhZHZhbnRhZ2Ugb2YgZXh0ZW5zaW9ucyBzdWNoIGFzIGB4LWdvLXR5cGVgICB3b3VsZCBuZWVkIHRvIG1vZGlmeSB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIHRoZXkgYXJlIHVzaW5nLgoKSW4gYSBsb3Qgb2YgY2FzZXMsIHRoaXMgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIHdvdWxkIGJlIHByb2R1Y2VkIGJ5IGEgZGlmZmVyZW50IHRlYW0gdG8gdGhlIGNvbnN1bWVycyAob3IgZXZlbiBhIGRpZmZlcmVudCBjb21wYW55KSBhbmQgc28gYXNraW5nIHRoZW0gdG8gbWFrZSBjaGFuZ2VzIGxpa2UgdGhpcyB3ZXJlIHVucmVhc29uYWJsZS4KClRoaXMgd291bGQgbGVhZCB0byB0aGUgQVBJIGNvbnN1bWVycyBuZWVkaW5nIHRvIHZlbmRvciB0aGUgc3BlY2lmaWNhdGlvbiBmcm9tIHRoZSBwcm9kdWNlciAod2hpY2ggaXMgW291ciByZWNvbW1lbmRhdGlvbiBhbnl3YXldKCNodHRwcy1wYXRocykpIGFuZCB0aGVuIG1ha2UgYW55IG51bWJlciBvZiBsb2NhbCBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpY2F0aW9uIHRvIG1ha2UgaXQgZ2VuZXJhdGUgY29kZSB0aGF0IGxvb2tzIHJlYXNvbmFibGUuCgpIb3dldmVyLCBpbiB0aGUgY2FzZSB0aGF0IGEgY29uc3VtZXIgd291bGQgdXBkYXRlIHRoZWlyIHNwZWNpZmljYXRpb24sIHRoZXkgd291bGQgbGlrZWx5IGVuZCB1cCB3aXRoIGEgbnVtYmVyIG9mIG1lcmdlIGNvbmZsaWN0cy4KCk5vdywgYXMgb2YgYG9hcGktY29kZWdlbmAgdjIuNC4wLCBpdCBpcyBub3cgcG9zc2libGUgdG8gbWFrZSBjaGFuZ2VzIHRvIHRoZSBpbnB1dCBPcGVuQVBJIHNwZWNpZmljYXRpb24gX3dpdGhvdXQgbmVlZGluZyB0byBtb2RpZnkgaXQgZGlyZWN0bHlfLgoKVGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIFtPcGVuQVBJIE92ZXJsYXkgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL09BSS9PdmVybGF5LVNwZWNpZmljYXRpb24pLCB3aGljaCBpcyBhIHN0YWJsZSBzcGVjaWZpY2F0aW9uLgoKPiBbIUNBVVRJT05dCj4gQmV3YXJlISBIZXJlIChtYXkpIGJlIGRyYWdvbnMuCj4KPiBUaGUgT3ZlcmxheSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHRoZSB1c2Ugb2YgSlNPTiBQYXRoLCB3aGljaCBzb21lIHVzZXJzIG1heSBmaW5kIGRpZmZpY3VsdCB0byB3cml0ZSBhbmQvb3IgbWFpbnRhaW4uCj4KPiBXZSBzdGlsbCBoZWF2aWx5IHJlY29tbWVuZCB1c2luZyBPdmVybGF5IGZ1bmN0aW9uYWxpdHksIGJ1dCB3b3VsZCBsaWtlIHVzZXJzIHRvIGJlIGF3YXJlIG9mIHRoaXMuCj4KPiBUaGVyZSBpcyBhIFtwcm9wb3NlZCBtb2RpZmljYXRpb24gdG8gdGhlIHNwZWNpZmljYXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9PQUkvT3ZlcmxheS1TcGVjaWZpY2F0aW9uL3B1bGwvMzIpIHdoaWNoIHdvdWxkIHJlbGF4IHRoZSBuZWVkIGZvciBKU09OIFBhdGggYXMgdGhlIHRhcmdldGluZyBtZWNoYW5pc20uCgpGb3IgaW5zdGFuY2UsIGxldCdzIHNheSB0aGF0IHdlIGhhdmUgdGhlIGZvbGxvd2luZyBPcGVuQVBJIHNwZWNpZmljYXRpb24sIHdoaWNoIHByb3ZpZGVzIGluc2lnaHQgaW50byBhbiBpbnRlcm5hbCBlbmRwb2ludCB0aGF0IHdlIHNob3VsZCBub3QgYmUgZ2VuZXJhdGluZyBhbnkgY29kZSBmb3IgKGRlbm90ZWQgYnkgYHgtaW50ZXJuYWxgKToKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6ICJFeGFtcGxlIHRvIGluZGljYXRlIGhvdyB0byB1c2UgdGhlIE9wZW5BUEkgT3ZlcmxheSBzcGVjaWZpY2F0aW9uIChodHRwczovL2dpdGh1Yi5jb20vT0FJL092ZXJsYXktU3BlY2lmaWNhdGlvbikiCnBhdGhzOgogIC9waW5nOgogICAgZ2V0OgogICAgICByZXNwb25zZXM6CiAgICAgICAgJzIwMCc6CiAgICAgICAgICBkZXNjcmlwdGlvbjogcGV0IHJlc3BvbnNlCiAgICAgICAgICBjb250ZW50OgogICAgICAgICAgICBhcHBsaWNhdGlvbi9qc29uOgogICAgICAgICAgICAgIHNjaGVtYToKICAgICAgICAgICAgICAgICRyZWY6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9Qb25nJwogICAgZGVsZXRlOgogICAgICB4LWludGVybmFsOiB0cnVlCiAgICAgIHJlc3BvbnNlczoKICAgICAgICAnMjAyJzoKICAgICAgICAgIGNvbnRlbnQ6IHt9CmBgYAoKSWYgd2Ugd2VyZSB0byBydW4gYG9hcGktY29kZWdlbmAgd2l0aCBvdXQtb2YtdGhlLWJveCBmdW5jdGlvbmFsaXR5LCB0aGlzIHdvdWxkIHRoZW4gbGVhZCB0byB0aGUgREVMRVRFIGVuZHBvaW50IGJlaW5nIGdlbmVyYXRlZCwgd2hpY2ggd2UgZG9uJ3Qgd2FudC4KCkluc3RlYWQsIHdlIGNhbiBkZWZpbmUgdGhlIGZvbGxvd2luZyBgb3ZlcmxheS55YW1sYDoKCgpgYGB5YW1sCm92ZXJsYXk6IDEuMC4wCmluZm86CiAgdGl0bGU6IE92ZXJsYXkKICB2ZXJzaW9uOiAwLjAuMAphY3Rpb25zOgotIHRhcmdldDogIiQiCiAgZGVzY3JpcHRpb246IFBlcmZvcm0gYSBzdHJ1Y3R1cmFsIG92ZXJsYXksIHdoaWNoIGNhbiBiZSBtb3JlIHJlYWRhYmxlLCBhcyBpdCdzIGNsZWFyIHdoYXQgdGhlIHNoYXBlIG9mIHRoZSBkb2N1bWVudCBpcwogIHVwZGF0ZToKICAgIGluZm86CiAgICAgIHgtb3ZlcmxheS1hcHBsaWVkOiBzdHJ1Y3R1cmVkLW92ZXJsYXkKICAgIHBhdGhzOgogICAgICAvcGluZzoKICAgICAgICBnZXQ6CiAgICAgICAgICByZXNwb25zZXM6CiAgICAgICAgICAgICcyMDAnOgogICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBQZXJmb3JtIGEgcGluZyByZXF1ZXN0Ci0gdGFyZ2V0OiAkLnBhdGhzLipbPyhALngtaW50ZXJuYWwpXQogIGRlc2NyaXB0aW9uOiBSZW1vdmUgaW50ZXJuYWwgZW5kcG9pbnRzIChub3RlZCBieSB4LWludGVybmFsKQogIHJlbW92ZTogdHJ1ZQotIHRhcmdldDogJC5wYXRocy4qLipbPyhALngtaW50ZXJuYWwpXQogIGRlc2NyaXB0aW9uOiBSZW1vdmUgaW50ZXJuYWwgZW5kcG9pbnRzIChub3RlZCBieSB4LWludGVybmFsKQogIHJlbW92ZTogdHJ1ZQpgYGAKCkFuZCBvdXIgY29uZmlndXJhdGlvbiBmaWxlIGZvciBgb2FwaS1jb2RlZ2VuYDoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogJHNjaGVtYT1odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9IRUFEL2NvbmZpZ3VyYXRpb24tc2NoZW1hLmpzb24KcGFja2FnZTogYXBpCm91dHB1dDogcGluZy5nZW4uZ28KZ2VuZXJhdGU6CiAgbW9kZWxzOiB0cnVlCiAgZ29yaWxsYS1zZXJ2ZXI6IHRydWUKICBlbWJlZGRlZC1zcGVjOiB0cnVlCm91dHB1dC1vcHRpb25zOgogIG92ZXJsYXk6CiAgICBwYXRoOiBvdmVybGF5LnlhbWwKYGBgCgpUaGlzIHRoZW4gY29tcGxldGVseSByZW1vdmVzIHRoZSBERUxFVEUgZW5kcG9pbnQgX2JlZm9yZV8gd2UgZXZlbiBzdGFydCB0byBwYXJzZSB0aGUgc3BlY2lmaWNhdGlvbiBpbiBgb2FwaS1jb2RlZ2VuYCwgc28gaXQncyBhcyBpZiB5b3VyIHNwZWNpZmljYXRpb24gd2FzIHByb3ZpZGVkIHdpdGhvdXQgdGhhdCBlbmRwb2ludC4KCkFkZGl0aW9uYWxseSwgd2UgY2FuIG92ZXJyaWRlIG90aGVyIHBpZWNlcyBvZiBtZXRhZGF0YSwgc3VjaCBhcyB0aGUgZGVzY3JpcHRpb24gZm9yIG9wZXJhdGlvbnMuCgpDaGVjayBvdXQgW3RoZSBvdmVybGF5IGV4YW1wbGVdKGV4YW1wbGVzL292ZXJsYXkvKSBmb3IgdGhlIGZ1bGwgY29kZSwgYW5kIHNvbWUgbW9yZSBjb21wbGV4IGV4YW1wbGVzLgoKIyMgR2VuZXJhdGluZyBOdWxsYWJsZSB0eXBlcwoKSXQncyBwb3NzaWJsZSB0aGF0IHlvdSB3YW50IHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBmaWVsZCBpc24ndCBzZW50LCBpcyBzZW50IGFzIGBudWxsYCBvciBoYXMgYSB2YWx1ZS4KCkZvciBpbnN0YW5jZSwgaWYgeW91IGhhZCB0aGUgZm9sbG93aW5nIE9wZW5BUEkgcHJvcGVydHk6CgpgYGB5YW1sClM6CiAgdHlwZTogb2JqZWN0CiAgcHJvcGVydGllczoKICAgIEZpZWxkOgogICAgICB0eXBlOiBzdHJpbmcKICAgICAgbnVsbGFibGU6IHRydWUKICAgIHJlcXVpcmVkOiBbXQpgYGAKClRoZSBkZWZhdWx0IGJlaGF2aW91ciBpbiBgb2FwaS1jb2RlZ2VuYCBpcyB0byBnZW5lcmF0ZToKCmBgYGdvCnR5cGUgUyBzdHJ1Y3QgewoJRmllbGQgKnN0cmluZyBganNvbjoiZmllbGQsb21pdGVtcHR5ImAKfQpgYGAKCkhvd2V2ZXIsIHlvdSBsb3NlIHRoZSBhYmlsaXR5IHRvIHVuZGVyc3RhbmQgdGhlIHRocmVlIGNhc2VzLCBhcyB0aGVyZSdzIG5vIHdheSB0byBkaXN0aW5ndWlzaCB0d28gb2YgdGhlIHR5cGVzIGZyb20gZWFjaCBvdGhlcjoKCi0gaXMgdGhpcyBmaWVsZCBub3Qgc2VudD8gKENhbiBiZSBjaGVja2VkIHdpdGggYFMuRmllbGQgPT0gbmlsYCkKLSBpcyB0aGlzIGZpZWxkIGBudWxsYD8gKENhbiBiZSBjaGVja2VkIHdpdGggYFMuRmllbGQgPT0gbmlsYCkKLSBkb2VzIHRoaXMgZmllbGQgaGF2ZSBhIHZhbHVlPyAoYFMuRmllbGQgIT0gbmlsICYmICpTLkZpZWxkID09ICIxMjMiYCkKCkFzIG9mIGBvYXBpLWNvZGVnZW5gIFt2Mi4xLjBdKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3JlbGVhc2VzL3RhZy92Mi4xLjApIGl0IGlzIG5vdyBwb3NzaWJsZSB0byByZXByZXNlbnQgdGhpcyB3aXRoIHRoZSBgbnVsbGFibGUuTnVsbGFibGVgIHR5cGUgZnJvbSBbb3VyIG5ldyBsaWJyYXJ5LCBvYXBpLWNvZGVnZW4vbnVsbGFibGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vbnVsbGFibGUpLgoKSWYgeW91IGNvbmZpZ3VyZSB5b3VyIGdlbmVyYXRvcidzIE91dHB1dCBPcHRpb25zIHRvIG9wdC1pbiB0byB0aGlzIGJlaGF2aW91ciwgYXMgc286CgpgYGB5YW1sCm91dHB1dC1vcHRpb25zOgogIG51bGxhYmxlLXR5cGU6IHRydWUKYGBgCgpZb3Ugd2lsbCBub3cgcmVjZWl2ZSB0aGUgZm9sbG93aW5nIG91dHB1dDoKCmBgYGdvCnR5cGUgUyBzdHJ1Y3QgewogICAgLy8gbm90ZSB0aGF0IHRoZXJlJ3Mgbm8gcG9pbnRlciBoZXJlLCBqdXN0IGBvbWl0ZW1wdHlgCiAgICBGaWVsZCBudWxsYWJsZS5OdWxsYWJsZVtzdHJpbmddIGBqc29uOiJmaWVsZCxvbWl0ZW1wdHkiYAp9CmBgYAoKIyMgT3BlbkFQSSBleHRlbnNpb25zCgpBcyB3ZWxsIGFzIHRoZSBjb3JlIE9wZW5BUEkgc3VwcG9ydCwgd2UgYWxzbyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgT3BlbkFQSSBleHRlbnNpb25zLCBhcyBkZW5vdGVkIGJ5IHRoZSBbT3BlbkFQSSBTcGVjaWZpY2F0aW9uIEV4dGVuc2lvbnNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuMyNzcGVjaWZpY2F0aW9uLWV4dGVuc2lvbnMpLgoKPHRhYmxlPgoKPHRyPgo8dGg+CkV4dGVuc2lvbgo8L3RoPgo8dGg+CkRlc2NyaXB0aW9uCjwvdGg+Cjx0aD4KRXhhbXBsZSB1c2FnZQo8L3RoPgo8L3RyPgoKPHRyPgo8dGQ+CgpgeC1nby10eXBlYCA8YnI+CmB4LWdvLXR5cGUtaW1wb3J0YAoKPC90ZD4KPHRkPgpPdmVycmlkZSB0aGUgZ2VuZXJhdGVkIHR5cGUgZGVmaW5pdGlvbiAoYW5kIG9wdGlvbmFsbHksIGFkZCBhbiBpbXBvcnQgZnJvbSBhbm90aGVyIHBhY2thZ2UpCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+CgpVc2luZyB0aGUgYHgtZ28tdHlwZWAgKGFuZCBvcHRpb25hbGx5LCBgeC1nby10eXBlLWltcG9ydGAgd2hlbiB5b3UgbmVlZCB0byBpbXBvcnQgYW5vdGhlciBwYWNrYWdlKSBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgdHlwZSB0aGF0IGBvYXBpLWNvZGVnZW5gIGRldGVybWluZWQgdGhlIGdlbmVyYXRlZCB0eXBlIHNob3VsZCBiZS4KCldlIGNhbiBzZWUgdGhpcyBhdCBwbGF5IHdpdGggdGhlIGZvbGxvd2luZyBzY2hlbWFzOgoKYGBgeWFtbApjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICBDbGllbnQ6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBudW1iZXIKICAgIENsaWVudFdpdGhFeHRlbnNpb246CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAjIHRoaXMgaXMgYSBiaXQgb2YgYSBjb250cml2ZWQgZXhhbXBsZSwgYXMgeW91IGNvdWxkIGluc3RlYWQgdXNlCiAgICAgICAgICAjIGBmb3JtYXQ6IHV1aWRgIGJ1dCBpdCBleHBsYWlucyBob3cgeW91J2QgZG8gdGhpcyB3aGVuIHRoZXJlIG1heSBiZQogICAgICAgICAgIyBhIGNsYXNoLCBmb3IgaW5zdGFuY2UgaWYgeW91IGFscmVhZHkgaGFkIGEgYHV1aWRgIHBhY2thZ2UgdGhhdCB3YXMKICAgICAgICAgICMgYmVpbmcgaW1wb3J0ZWQsIG9yIC4uLgogICAgICAgICAgeC1nby10eXBlOiBnb29nbGV1dWlkLlVVSUQKICAgICAgICAgIHgtZ28tdHlwZS1pbXBvcnQ6CiAgICAgICAgICAgIHBhdGg6IGdpdGh1Yi5jb20vZ29vZ2xlL3V1aWQKICAgICAgICAgICAgbmFtZTogZ29vZ2xldXVpZAogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogbnVtYmVyCiAgICAgICAgICAjIC4uLiB0aGlzIGlzIGFsc28gYSBiaXQgb2YgYSBjb250cml2ZWQgZXhhbXBsZSwgYXMgeW91IGNvdWxkIHVzZQogICAgICAgICAgIyBgdHlwZTogaW50ZWdlcmAgYnV0IGluIHRoZSBjYXNlIHRoYXQgeW91IGtub3cgYmV0dGVyIHRoYW4gd2hhdAogICAgICAgICAgIyBvYXBpLWNvZGVnZW4gaXMgZ2VuZXJhdGluZywgbGlrZSBzbzoKICAgICAgICAgIHgtZ28tdHlwZTogaW50NjQKYGBgCgpGcm9tIGhlcmUsIHdlIG5vdyBnZXQgdHdvIGRpZmZlcmVudCBtb2RlbHM6CgpgYGBnbwovLyBDbGllbnQgZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50Lgp0eXBlIENsaWVudCBzdHJ1Y3QgewoJSWQgICAqZmxvYXQzMiBganNvbjoiaWQsb21pdGVtcHR5ImAKCU5hbWUgc3RyaW5nICAgYGpzb246Im5hbWUiYAp9CgovLyBDbGllbnRXaXRoRXh0ZW5zaW9uIGRlZmluZXMgbW9kZWwgZm9yIENsaWVudFdpdGhFeHRlbnNpb24uCnR5cGUgQ2xpZW50V2l0aEV4dGVuc2lvbiBzdHJ1Y3QgewoJSWQgICAqaW50NjQgICAgICAgICAgYGpzb246ImlkLG9taXRlbXB0eSJgCglOYW1lIGdvb2dsZXV1aWQuVVVJRCBganNvbjoibmFtZSJgCn0KYGBgCgpZb3UgY2FuIHNlZSB0aGlzIGluIG1vcmUgZGV0YWlsIGluIFt0aGUgZXhhbXBsZSBjb2RlXShleGFtcGxlcy9leHRlbnNpb25zL3hnb3R5cGUvKS4KCjwvZGV0YWlscz4KPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKYHgtZ28tdHlwZS1za2lwLW9wdGlvbmFsLXBvaW50ZXJgCgo8L3RkPgo8dGQ+CkRvIG5vdCBhZGQgYSBwb2ludGVyIHR5cGUgZm9yIG9wdGlvbmFsIGZpZWxkcyBpbiBzdHJ1Y3RzCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+CgpCeSBkZWZhdWx0LCBgb2FwaS1jb2RlZ2VuYCB3aWxsIGdlbmVyYXRlIGEgcG9pbnRlciBmb3Igb3B0aW9uYWwgZmllbGRzLgoKVXNpbmcgdGhlIGB4LWdvLXR5cGUtc2tpcC1vcHRpb25hbC1wb2ludGVyYCBleHRlbnNpb24gYWxsb3dzIG9taXR0aW5nIHRoYXQgcG9pbnRlci4KCldlIGNhbiBzZWUgdGhpcyBhdCBwbGF5IHdpdGggdGhlIGZvbGxvd2luZyBzY2hlbWFzOgoKYGBgeWFtbApjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICBDbGllbnQ6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBudW1iZXIKICAgIENsaWVudFdpdGhFeHRlbnNpb246CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBudW1iZXIKICAgICAgICAgIHgtZ28tdHlwZS1za2lwLW9wdGlvbmFsLXBvaW50ZXI6IHRydWUKYGBgCgpGcm9tIGhlcmUsIHdlIG5vdyBnZXQgdHdvIGRpZmZlcmVudCBtb2RlbHM6CgpgYGBnbwovLyBDbGllbnQgZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50Lgp0eXBlIENsaWVudCBzdHJ1Y3QgewoJSWQgICAqZmxvYXQzMiBganNvbjoiaWQsb21pdGVtcHR5ImAKCU5hbWUgc3RyaW5nICAgYGpzb246Im5hbWUiYAp9CgovLyBDbGllbnRXaXRoRXh0ZW5zaW9uIGRlZmluZXMgbW9kZWwgZm9yIENsaWVudFdpdGhFeHRlbnNpb24uCnR5cGUgQ2xpZW50V2l0aEV4dGVuc2lvbiBzdHJ1Y3QgewoJSWQgICBmbG9hdDMyIGBqc29uOiJpZCxvbWl0ZW1wdHkiYAoJTmFtZSBzdHJpbmcgIGBqc29uOiJuYW1lImAKfQpgYGAKCllvdSBjYW4gc2VlIHRoaXMgaW4gbW9yZSBkZXRhaWwgaW4gW3RoZSBleGFtcGxlIGNvZGVdKGV4YW1wbGVzL2V4dGVuc2lvbnMveGdvdHlwZXNraXBvcHRpb25hbHBvaW50ZXIvKS4KCjwvZGV0YWlscz4KPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKYHgtZ28tbmFtZWAKCjwvdGQ+Cjx0ZD4KT3ZlcnJpZGUgdGhlIGdlbmVyYXRlZCBuYW1lIG9mIGEgZmllbGQgb3IgYSB0eXBlCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+CgpCeSBkZWZhdWx0LCBgb2FwaS1jb2RlZ2VuYCB3aWxsIGF0dGVtcHQgdG8gZ2VuZXJhdGUgdGhlIG5hbWUgb2YgZmllbGRzIGFuZCB0eXBlcyBpbiBhcyBiZXN0IGEgd2F5IGl0IGNhbi4KCkhvd2V2ZXIsIHNvbWV0aW1lcywgdGhlIG5hbWUgZG9lc24ndCBxdWl0ZSBmaXQgd2hhdCB5b3VyIGNvZGViYXNlIHN0YW5kYXJkcyBhcmUsIG9yIHRoZSBpbnRlbnQgb2YgdGhlIGZpZWxkLCBzbyB5b3UgY2FuIG92ZXJyaWRlIGl0IHdpdGggYHgtZ28tbmFtZWAuCgpXZSBjYW4gc2VlIHRoaXMgYXQgcGxheSB3aXRoIHRoZSBmb2xsb3dpbmcgc2NoZW1hczoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IHgtZ28tbmFtZQpjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICBDbGllbnQ6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBudW1iZXIKICAgIENsaWVudFdpdGhFeHRlbnNpb246CiAgICAgIHR5cGU6IG9iamVjdAogICAgICAjIGNhbiBiZSB1c2VkIG9uIGEgdHlwZQogICAgICB4LWdvLW5hbWU6IENsaWVudFJlbmFtZWRCeUV4dGVuc2lvbgogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBudW1iZXIKICAgICAgICAgICMgb3Igb24gYSBmaWVsZAogICAgICAgICAgeC1nby1uYW1lOiBBY2NvdW50SWRlbnRpZmllcgpgYGAKCkZyb20gaGVyZSwgd2Ugbm93IGdldCB0d28gZGlmZmVyZW50IG1vZGVsczoKCmBgYGdvCi8vIENsaWVudCBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnQuCnR5cGUgQ2xpZW50IHN0cnVjdCB7CglJZCAgICpmbG9hdDMyIGBqc29uOiJpZCxvbWl0ZW1wdHkiYAoJTmFtZSBzdHJpbmcgICBganNvbjoibmFtZSJgCn0KCi8vIENsaWVudFJlbmFtZWRCeUV4dGVuc2lvbiBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnRXaXRoRXh0ZW5zaW9uLgp0eXBlIENsaWVudFJlbmFtZWRCeUV4dGVuc2lvbiBzdHJ1Y3QgewoJQWNjb3VudElkZW50aWZpZXIgKmZsb2F0MzIgYGpzb246ImlkLG9taXRlbXB0eSJgCglOYW1lICAgICAgICAgICAgICBzdHJpbmcgICBganNvbjoibmFtZSJgCn0KYGBgCgpZb3UgY2FuIHNlZSB0aGlzIGluIG1vcmUgZGV0YWlsIGluIFt0aGUgZXhhbXBsZSBjb2RlXShleGFtcGxlcy9leHRlbnNpb25zL3hnb25hbWUvKS4KCjwvZGV0YWlscz4KPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKYHgtZ28tdHlwZS1uYW1lYAoKPC90ZD4KPHRkPgpPdmVycmlkZSB0aGUgZ2VuZXJhdGVkIG5hbWUgb2YgYSB0eXBlCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+Cgo+IFshTk9URV0KPiBOb3RpY2UgdGhhdCB0aGlzIGlzIHN1YnRseSBkaWZmZXJlbnQgdG8gdGhlIGB4LWdvLW5hbWVgLCB3aGljaCBhbHNvIGFwcGxpZXMgdG8gX2ZpZWxkc18gd2l0aGluIGBzdHJ1Y3Rgcy4KCkJ5IGRlZmF1bHQsIGBvYXBpLWNvZGVnZW5gIHdpbGwgYXR0ZW1wdCB0byBnZW5lcmF0ZSB0aGUgbmFtZSBvZiB0eXBlcyBpbiBhcyBiZXN0IGEgd2F5IGl0IGNhbi4KCkhvd2V2ZXIsIHNvbWV0aW1lcywgdGhlIG5hbWUgZG9lc24ndCBxdWl0ZSBmaXQgd2hhdCB5b3VyIGNvZGViYXNlIHN0YW5kYXJkcyBhcmUsIG9yIHRoZSBpbnRlbnQgb2YgdGhlIGZpZWxkLCBzbyB5b3UgY2FuIG92ZXJyaWRlIGl0IHdpdGggYHgtZ28tbmFtZWAuCgpXZSBjYW4gc2VlIHRoaXMgYXQgcGxheSB3aXRoIHRoZSBmb2xsb3dpbmcgc2NoZW1hczoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IHgtZ28tdHlwZS1uYW1lCmNvbXBvbmVudHM6CiAgc2NoZW1hczoKICAgIENsaWVudDoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gbmFtZQogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIG5hbWU6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgICBpZDoKICAgICAgICAgIHR5cGU6IG51bWJlcgogICAgQ2xpZW50V2l0aEV4dGVuc2lvbjoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHgtZ28tdHlwZS1uYW1lOiBDbGllbnRSZW5hbWVkQnlFeHRlbnNpb24KICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgbmFtZToKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogbnVtYmVyCiAgICAgICAgICAjIE5PVEUgYXR0ZW1wdGluZyBhIGB4LWdvLXR5cGUtbmFtZWAgaGVyZSBpcyBhIG5vLW9wLCBhcyB3ZSdyZSBub3QgcHJvZHVjaW5nIGEgX3R5cGVfIG9ubHkgYSBfZmllbGRfCiAgICAgICAgICB4LWdvLXR5cGUtbmFtZTogVGhpc1dpbGxOb3RCZVVzZWQKYGBgCgpGcm9tIGhlcmUsIHdlIG5vdyBnZXQgdHdvIGRpZmZlcmVudCBtb2RlbHMgYW5kIGEgdHlwZSBhbGlhczoKCmBgYGdvCi8vIENsaWVudCBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnQuCnR5cGUgQ2xpZW50IHN0cnVjdCB7CglJZCAgICpmbG9hdDMyIGBqc29uOiJpZCxvbWl0ZW1wdHkiYAoJTmFtZSBzdHJpbmcgICBganNvbjoibmFtZSJgCn0KCi8vIENsaWVudFdpdGhFeHRlbnNpb24gZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50V2l0aEV4dGVuc2lvbi4KdHlwZSBDbGllbnRXaXRoRXh0ZW5zaW9uID0gQ2xpZW50UmVuYW1lZEJ5RXh0ZW5zaW9uCgovLyBDbGllbnRSZW5hbWVkQnlFeHRlbnNpb24gZGVmaW5lcyBtb2RlbCBmb3IgLgp0eXBlIENsaWVudFJlbmFtZWRCeUV4dGVuc2lvbiBzdHJ1Y3QgewoJSWQgICAqZmxvYXQzMiBganNvbjoiaWQsb21pdGVtcHR5ImAKCU5hbWUgc3RyaW5nICAgYGpzb246Im5hbWUiYAp9CmBgYAoKWW91IGNhbiBzZWUgdGhpcyBpbiBtb3JlIGRldGFpbCBpbiBbdGhlIGV4YW1wbGUgY29kZV0oZXhhbXBsZXMvZXh0ZW5zaW9ucy94Z290eXBlbmFtZS8pLgoKPC9kZXRhaWxzPgo8L3RkPgo8L3RyPgoKPHRyPgo8dGQ+CgpgeC1vbWl0ZW1wdHlgCgo8L3RkPgo8dGQ+CkZvcmNlIHRoZSBwcmVzZW5jZSBvZiB0aGUgSlNPTiB0YWcgYG9taXRlbXB0eWAgb24gYSBmaWVsZAo8L3RkPgo8dGQ+CjxkZXRhaWxzPgoKSW4gYSBjYXNlIHRoYXQgeW91IG1heSB3YW50IHRvIGFkZCB0aGUgSlNPTiBzdHJ1Y3QgdGFnIGBvbWl0ZW1wdHlgIHRvIHR5cGVzIHRoYXQgZG9uJ3QgaGF2ZSBvbmUgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgLSBmb3IgaW5zdGFuY2UgYSByZXF1aXJlZCBmaWVsZCAtIHlvdSBjYW4gdXNlIHRoZSBgeC1vbWl0ZW1wdHlgIGV4dGVuc2lvbi4KCldlIGNhbiBzZWUgdGhpcyBhdCBwbGF5IHdpdGggdGhlIGZvbGxvd2luZyBzY2hlbWFzOgoKYGBgeWFtbApvcGVuYXBpOiAiMy4wLjAiCmluZm86CiAgdmVyc2lvbjogMS4wLjAKICB0aXRsZTogeC1vbWl0ZW1wdHkKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgQ2xpZW50OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgbmFtZToKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogbnVtYmVyCiAgICBDbGllbnRXaXRoRXh0ZW5zaW9uOgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgbmFtZToKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgIyBmb3Igc29tZSByZWFzb24sIHlvdSBtYXkgd2FudCB0aGlzIGJlaGF2aW91ciwgZXZlbiB0aG91Z2ggaXQncyBhIHJlcXVpcmVkIGZpZWxkCiAgICAgICAgICB4LW9taXRlbXB0eTogdHJ1ZQogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogbnVtYmVyCmBgYAoKRnJvbSBoZXJlLCB3ZSBub3cgZ2V0IHR3byBkaWZmZXJlbnQgbW9kZWxzOgoKYGBgZ28KLy8gQ2xpZW50IGRlZmluZXMgbW9kZWwgZm9yIENsaWVudC4KdHlwZSBDbGllbnQgc3RydWN0IHsKCUlkICAgKmZsb2F0MzIgYGpzb246ImlkLG9taXRlbXB0eSJgCglOYW1lIHN0cmluZyAgIGBqc29uOiJuYW1lImAKfQoKLy8gQ2xpZW50V2l0aEV4dGVuc2lvbiBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnRXaXRoRXh0ZW5zaW9uLgp0eXBlIENsaWVudFdpdGhFeHRlbnNpb24gc3RydWN0IHsKCUlkICAgKmZsb2F0MzIgYGpzb246ImlkLG9taXRlbXB0eSJgCglOYW1lIHN0cmluZyAgIGBqc29uOiJuYW1lLG9taXRlbXB0eSJgCn0KYGBgCgpOb3RpY2UgdGhhdCB0aGUgYENvbXBsZXhGaWVsZGAgaXMgc3RpbGwgZ2VuZXJhdGVkIGluIGZ1bGwsIGJ1dCB0aGUgdHlwZSB3aWxsIHRoZW4gYmUgaWdub3JlZCB3aXRoIEpTT04gbWFyc2hhbGxpbmcuCgpZb3UgY2FuIHNlZSB0aGlzIGluIG1vcmUgZGV0YWlsIGluIFt0aGUgZXhhbXBsZSBjb2RlXShleGFtcGxlcy9leHRlbnNpb25zL3hnb2pzb25pZ25vcmUvKS4KCjwvZGV0YWlscz4KPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKYHgtZ28tanNvbi1pZ25vcmVgCgo8L3RkPgo8dGQ+CldoZW4gKHVuKW1hcnNoYWxpbmcgSlNPTiwgaWdub3JlIGZpZWxkKHMpCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+CgpCeSBkZWZhdWx0LCBgb2FwaS1jb2RlZ2VuYCB3aWxsIGdlbmVyYXRlIGBqc29uOiIuLi4iYCBzdHJ1Y3QgdGFncyBmb3IgYWxsIGZpZWxkcyBpbiBhIHN0cnVjdCwgc28gSlNPTiAodW4pbWFyc2hhbGluZyB3b3Jrcy4KCkhvd2V2ZXIsIHNvbWV0aW1lcywgeW91IHdhbnQgdG8gb21pdCBmaWVsZHMsIHdoaWNoIGNhbiBiZSBkb25lIHdpdGggdGhlIGB4LWdvLWpzb24taWdub3JlYCBleHRlbnNpb24uCgpXZSBjYW4gc2VlIHRoaXMgYXQgcGxheSB3aXRoIHRoZSBmb2xsb3dpbmcgc2NoZW1hczoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IHgtZ28tanNvbi1pZ25vcmUKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgQ2xpZW50OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgbmFtZToKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgIGNvbXBsZXhGaWVsZDoKICAgICAgICAgIHR5cGU6IG9iamVjdAogICAgICAgICAgcHJvcGVydGllczoKICAgICAgICAgICAgbmFtZToKICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgICAgICAgYWNjb3VudE5hbWU6CiAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAjIC4uLgogICAgQ2xpZW50V2l0aEV4dGVuc2lvbjoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gbmFtZQogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIG5hbWU6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgICBjb21wbGV4RmllbGQ6CiAgICAgICAgICB0eXBlOiBvYmplY3QKICAgICAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgICAgIG5hbWU6CiAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAgIGFjY291bnROYW1lOgogICAgICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgIyAuLi4KICAgICAgICAgIHgtZ28tanNvbi1pZ25vcmU6IHRydWUKYGBgCgpGcm9tIGhlcmUsIHdlIG5vdyBnZXQgdHdvIGRpZmZlcmVudCBtb2RlbHM6CgpgYGBnbwovLyBDbGllbnQgZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50Lgp0eXBlIENsaWVudCBzdHJ1Y3QgewoJQ29tcGxleEZpZWxkICpzdHJ1Y3QgewoJCUFjY291bnROYW1lICpzdHJpbmcgYGpzb246ImFjY291bnROYW1lLG9taXRlbXB0eSJgCgkJTmFtZSAgICAgICAgKnN0cmluZyBganNvbjoibmFtZSxvbWl0ZW1wdHkiYAoJfSBganNvbjoiY29tcGxleEZpZWxkLG9taXRlbXB0eSJgCglOYW1lIHN0cmluZyBganNvbjoibmFtZSJgCn0KCi8vIENsaWVudFdpdGhFeHRlbnNpb24gZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50V2l0aEV4dGVuc2lvbi4KdHlwZSBDbGllbnRXaXRoRXh0ZW5zaW9uIHN0cnVjdCB7CglDb21wbGV4RmllbGQgKnN0cnVjdCB7CgkJQWNjb3VudE5hbWUgKnN0cmluZyBganNvbjoiYWNjb3VudE5hbWUsb21pdGVtcHR5ImAKCQlOYW1lICAgICAgICAqc3RyaW5nIGBqc29uOiJuYW1lLG9taXRlbXB0eSJgCgl9IGBqc29uOiItImAKCU5hbWUgc3RyaW5nIGBqc29uOiJuYW1lImAKfQpgYGAKCk5vdGljZSB0aGF0IHRoZSBgQ29tcGxleEZpZWxkYCBpcyBzdGlsbCBnZW5lcmF0ZWQgaW4gZnVsbCwgYnV0IHRoZSB0eXBlIHdpbGwgdGhlbiBiZSBpZ25vcmVkIHdpdGggSlNPTiBtYXJzaGFsbGluZy4KCllvdSBjYW4gc2VlIHRoaXMgaW4gbW9yZSBkZXRhaWwgaW4gW3RoZSBleGFtcGxlIGNvZGVdKGV4YW1wbGVzL2V4dGVuc2lvbnMveGdvanNvbmlnbm9yZS8pLgoKPC9kZXRhaWxzPgo8L3RkPgo8L3RyPgoKPHRyPgo8dGQ+CgpgeC1vYXBpLWNvZGVnZW4tZXh0cmEtdGFnc2AKCjwvdGQ+Cjx0ZD4KR2VuZXJhdGUgYXJiaXRyYXJ5IHN0cnVjdCB0YWdzIHRvIGZpZWxkcwo8L3RkPgo8dGQ+CjxkZXRhaWxzPgoKSWYgeW91J3JlIG1ha2luZyB1c2Ugb2YgYSBmaWVsZCdzIHN0cnVjdCB0YWdzIHRvIGkuZS4gYXBwbHkgdmFsaWRhdGlvbiwgZGVjaWRlIHdoZXRoZXIgc29tZXRoaW5nIHNob3VsZCBiZSBsb2dnZWQsIGV0YywgeW91IGNhbiB1c2UgYHgtb2FwaS1jb2RlZ2VuLWV4dHJhLXRhZ3NgIHRvIHNldCBhZGRpdGlvbmFsIHRhZ3MgZm9yIHlvdXIgZ2VuZXJhdGVkIHR5cGVzLgoKV2UgY2FuIHNlZSB0aGlzIGF0IHBsYXkgd2l0aCB0aGUgZm9sbG93aW5nIHNjaGVtYXM6CgpgYGB5YW1sCm9wZW5hcGk6ICIzLjAuMCIKaW5mbzoKICB2ZXJzaW9uOiAxLjAuMAogIHRpdGxlOiB4LW9hcGktY29kZWdlbi1leHRyYS10YWdzCmNvbXBvbmVudHM6CiAgc2NoZW1hczoKICAgIENsaWVudDoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gbmFtZQogICAgICAgIC0gaWQKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBudW1iZXIKICAgIENsaWVudFdpdGhFeHRlbnNpb246CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgICAtIGlkCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgbmFtZToKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogbnVtYmVyCiAgICAgICAgICB4LW9hcGktY29kZWdlbi1leHRyYS10YWdzOgogICAgICAgICAgICB2YWxpZGF0ZTogInJlcXVpcmVkLG1pbj0xLG1heD0yNTYiCiAgICAgICAgICAgIHNhZmUtdG8tbG9nOiAidHJ1ZSIKICAgICAgICAgICAgZ29ybTogcHJpbWFyeWtleQpgYGAKCkZyb20gaGVyZSwgd2Ugbm93IGdldCB0d28gZGlmZmVyZW50IG1vZGVsczoKCmBgYGdvCi8vIENsaWVudCBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnQuCnR5cGUgQ2xpZW50IHN0cnVjdCB7CglJZCAgIGZsb2F0MzIgYGpzb246ImlkImAKCU5hbWUgc3RyaW5nICBganNvbjoibmFtZSJgCn0KCi8vIENsaWVudFdpdGhFeHRlbnNpb24gZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50V2l0aEV4dGVuc2lvbi4KdHlwZSBDbGllbnRXaXRoRXh0ZW5zaW9uIHN0cnVjdCB7CglJZCAgIGZsb2F0MzIgYGdvcm06InByaW1hcnlrZXkiIGpzb246ImlkIiBzYWZlLXRvLWxvZzoidHJ1ZSIgdmFsaWRhdGU6InJlcXVpcmVkLG1pbj0xLG1heD0yNTYiYAoJTmFtZSBzdHJpbmcgIGBqc29uOiJuYW1lImAKfQpgYGAKCllvdSBjYW4gc2VlIHRoaXMgaW4gbW9yZSBkZXRhaWwgaW4gW3RoZSBleGFtcGxlIGNvZGVdKGV4YW1wbGVzL2V4dGVuc2lvbnMveG9hcGljb2RlZ2VuZXh0cmF0YWdzLykuCgo8L2RldGFpbHM+CjwvdGQ+CjwvdHI+Cgo8dHI+Cjx0ZD4KCmB4LWVudW0tdmFybmFtZXNgIC8gYHgtZW51bU5hbWVzYAoKPC90ZD4KPHRkPgpPdmVycmlkZSBnZW5lcmF0ZWQgdmFyaWFibGUgbmFtZXMgZm9yIGVudW0gY29uc3RhbnRzCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+CgpXaGVuIGNvbnN1bWluZyBhbiBlbnVtIHZhbHVlIGZyb20gYW4gZXh0ZXJuYWwgc3lzdGVtLCB0aGUgbmFtZSBtYXkgbm90IHByb2R1Y2UgYSBuaWNlIHZhcmlhYmxlIG5hbWUuIFVzaW5nIHRoZSBgeC1lbnVtLXZhcm5hbWVzYCBleHRlbnNpb24gYWxsb3dzIG92ZXJyaWRpbmcgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCB2YXJpYWJsZSBuYW1lcy4KCldlIGNhbiBzZWUgdGhpcyBhdCBwbGF5IHdpdGggdGhlIGZvbGxvd2luZyBzY2hlbWFzOgoKYGBgeWFtbApvcGVuYXBpOiAiMy4wLjAiCmluZm86CiAgdmVyc2lvbjogMS4wLjAKICB0aXRsZTogeC1lbnVtTmFtZXMgYW5kIHgtZW51bS12YXJuYW1lcwpjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICBDbGllbnRUeXBlOgogICAgICB0eXBlOiBzdHJpbmcKICAgICAgZW51bToKICAgICAgICAtIEFDVAogICAgICAgIC0gRVhQCiAgICBDbGllbnRUeXBlV2l0aE5hbWVzRXh0ZW5zaW9uOgogICAgICB0eXBlOiBzdHJpbmcKICAgICAgZW51bToKICAgICAgICAtIEFDVAogICAgICAgIC0gRVhQCiAgICAgIHgtZW51bU5hbWVzOgogICAgICAgIC0gQWN0aXZlCiAgICAgICAgLSBFeHBpcmVkCiAgICBDbGllbnRUeXBlV2l0aFZhck5hbWVzRXh0ZW5zaW9uOgogICAgICB0eXBlOiBzdHJpbmcKICAgICAgZW51bToKICAgICAgICAtIEFDVAogICAgICAgIC0gRVhQCiAgICAgIHgtZW51bS12YXJuYW1lczoKICAgICAgICAtIEFjdGl2ZQogICAgICAgIC0gRXhwaXJlZApgYGAKCkZyb20gaGVyZSwgd2Ugbm93IGdldCB0d28gZGlmZmVyZW50IGZvcm1zIG9mIHRoZSBzYW1lIGVudW0gZGVmaW5pdGlvbi4KCmBgYGdvCi8vIERlZmluZXMgdmFsdWVzIGZvciBDbGllbnRUeXBlLgpjb25zdCAoCglBQ1QgQ2xpZW50VHlwZSA9ICJBQ1QiCglFWFAgQ2xpZW50VHlwZSA9ICJFWFAiCikKCi8vIENsaWVudFR5cGUgZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50VHlwZS4KdHlwZSBDbGllbnRUeXBlIHN0cmluZwoKLy8gRGVmaW5lcyB2YWx1ZXMgZm9yIENsaWVudFR5cGVXaXRoRXh0ZW5zaW9uLgpjb25zdCAoCglBY3RpdmUgIENsaWVudFR5cGVXaXRoRXh0ZW5zaW9uID0gIkFDVCIKCUV4cGlyZWQgQ2xpZW50VHlwZVdpdGhFeHRlbnNpb24gPSAiRVhQIgopCgovLyBDbGllbnRUeXBlV2l0aEV4dGVuc2lvbiBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnRUeXBlV2l0aEV4dGVuc2lvbi4KdHlwZSBDbGllbnRUeXBlV2l0aEV4dGVuc2lvbiBzdHJpbmcKYGBgCgpZb3UgY2FuIHNlZSB0aGlzIGluIG1vcmUgZGV0YWlsIGluIFt0aGUgZXhhbXBsZSBjb2RlXShleGFtcGxlcy9leHRlbnNpb25zL3hlbnVtdmFybmFtZXMvKS4KCjwvZGV0YWlscz4KPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKYHgtZGVwcmVjYXRlZC1yZWFzb25gCgo8L3RkPgo8dGQ+CkFkZCBhIEdvRG9jIGRlcHJlY2F0aW9uIHdhcm5pbmcgdG8gYSB0eXBlCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+CgpXaGVuIGFuIE9wZW5BUEkgdHlwZSBpcyBkZXByZWNhdGVkLCBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgY2FuIGJlIGFkZGVkIGluIHRoZSBHb0RvYyB1c2luZyBgeC1kZXByZWNhdGVkLXJlYXNvbmAuCgpXZSBjYW4gc2VlIHRoaXMgYXQgcGxheSB3aXRoIHRoZSBmb2xsb3dpbmcgc2NoZW1hczoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IHgtZGVwcmVjYXRlZC1yZWFzb24KY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgQ2xpZW50OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgbmFtZToKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogbnVtYmVyCiAgICBDbGllbnRXaXRoRXh0ZW5zaW9uOgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgbmFtZToKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgZGVwcmVjYXRlZDogdHJ1ZQogICAgICAgICAgeC1kZXByZWNhdGVkLXJlYXNvbjogRG9uJ3QgdXNlIGJlY2F1c2UgcmVhc29ucwogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogbnVtYmVyCiAgICAgICAgICAjIE5PVEUgdGhhdCB0aGlzIGRvZXNuJ3QgZ2VuZXJhdGUsIGFzIG5vIGBkZXByZWNhdGVkOiB0cnVlYCBpcyBzZXQKICAgICAgICAgIHgtZGVwcmVjYXRlZC1yZWFzb246IE5PVEUgeW91IHNob3VsZG4ndCBzZWUgdGhpcywgYXMgeW91J3ZlIG5vdCBkZXByZWNhdGVkIHRoaXMgZmllbGQKYGBgCgpGcm9tIGhlcmUsIHdlIG5vdyBnZXQgdHdvIGRpZmZlcmVudCBmb3JtcyBvZiB0aGUgc2FtZSBlbnVtIGRlZmluaXRpb24uCgpgYGBnbwovLyBDbGllbnQgZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50Lgp0eXBlIENsaWVudCBzdHJ1Y3QgewoJSWQgICAqZmxvYXQzMiBganNvbjoiaWQsb21pdGVtcHR5ImAKCU5hbWUgc3RyaW5nICAgYGpzb246Im5hbWUiYAp9CgovLyBDbGllbnRXaXRoRXh0ZW5zaW9uIGRlZmluZXMgbW9kZWwgZm9yIENsaWVudFdpdGhFeHRlbnNpb24uCnR5cGUgQ2xpZW50V2l0aEV4dGVuc2lvbiBzdHJ1Y3QgewoJSWQgKmZsb2F0MzIgYGpzb246ImlkLG9taXRlbXB0eSJgCgkvLyBEZXByZWNhdGVkOiBEb24ndCB1c2UgYmVjYXVzZSByZWFzb25zCglOYW1lIHN0cmluZyBganNvbjoibmFtZSJgCn0KYGBgCgpOb3RpY2UgdGhhdCBiZWNhdXNlIHdlJ3ZlIG5vdCBzZXQgYGRlcHJlY2F0ZWQ6IHRydWVgIHRvIHRoZSBgbmFtZWAgZmllbGQsIGl0IGRvZXNuJ3QgZ2VuZXJhdGUgYSBkZXByZWNhdGlvbiB3YXJuaW5nLgoKWW91IGNhbiBzZWUgdGhpcyBpbiBtb3JlIGRldGFpbCBpbiBbdGhlIGV4YW1wbGUgY29kZV0oZXhhbXBsZXMvZXh0ZW5zaW9ucy94ZGVwcmVjYXRlZHJlYXNvbi8pLgoKPC9kZXRhaWxzPgo8L3RkPgo8L3RyPgoKPHRyPgo8dGQ+CgpgeC1vcmRlcmAKCjwvdGQ+Cjx0ZD4KRXhwbGljaXRseSBvcmRlciBzdHJ1Y3QgZmllbGRzCjwvdGQ+Cjx0ZD4KPGRldGFpbHM+CgpXaGV0aGVyIHlvdSBsaWtlIGNlcnRhaW4gZmllbGRzIGJlaW5nIG9yZGVyZWQgYmVmb3JlIG90aGVycywgb3IgeW91IHdhbnQgdG8gcGVyZm9ybSBtb3JlIGVmZmljaWVudCBwYWNraW5nIG9mIHlvdXIgc3RydWN0cywgdGhlIGB4LW9yZGVyYCBleHRlbnNpb24gaXMgaGVyZSBmb3IgeW91LgoKTm90ZSB0aGF0IGB4LW9yZGVyYCBpcyAxLWluZGV4ZWQgLSBgeC1vcmRlcjogMGAgaXMgbm90IGEgdmFsaWQgdmFsdWUuCgpXaGVuIGFuIE9wZW5BUEkgdHlwZSBpcyBkZXByZWNhdGVkLCBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgY2FuIGJlIGFkZGVkIGluIHRoZSBHb0RvYyB1c2luZyBgeC1kZXByZWNhdGVkLXJlYXNvbmAuCgpXZSBjYW4gc2VlIHRoaXMgYXQgcGxheSB3aXRoIHRoZSBmb2xsb3dpbmcgc2NoZW1hczoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IHgtb3JkZXIKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgQ2xpZW50OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgYV9uYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBudW1iZXIKICAgIENsaWVudFdpdGhFeHRlbnNpb246CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBhX25hbWU6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgICAgIHgtb3JkZXI6IDIKICAgICAgICBpZDoKICAgICAgICAgIHR5cGU6IG51bWJlcgogICAgICAgICAgeC1vcmRlcjogMQpgYGAKCkZyb20gaGVyZSwgd2Ugbm93IGdldCB0d28gZGlmZmVyZW50IGZvcm1zIG9mIHRoZSBzYW1lIHR5cGUgZGVmaW5pdGlvbi4KCmBgYGdvCi8vIENsaWVudCBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnQuCnR5cGUgQ2xpZW50IHN0cnVjdCB7CglBTmFtZSAqc3RyaW5nICBganNvbjoiYV9uYW1lLG9taXRlbXB0eSJgCglJZCAgICAqZmxvYXQzMiBganNvbjoiaWQsb21pdGVtcHR5ImAKfQoKLy8gQ2xpZW50V2l0aEV4dGVuc2lvbiBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnRXaXRoRXh0ZW5zaW9uLgp0eXBlIENsaWVudFdpdGhFeHRlbnNpb24gc3RydWN0IHsKCUlkICAgICpmbG9hdDMyIGBqc29uOiJpZCxvbWl0ZW1wdHkiYAoJQU5hbWUgKnN0cmluZyAgYGpzb246ImFfbmFtZSxvbWl0ZW1wdHkiYAp9CmBgYAoKWW91IGNhbiBzZWUgdGhpcyBpbiBtb3JlIGRldGFpbCBpbiBbdGhlIGV4YW1wbGUgY29kZV0oZXhhbXBsZXMvZXh0ZW5zaW9ucy94b3JkZXIvKS4KCjwvZGV0YWlscz4KPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKYHgtb2FwaS1jb2RlZ2VuLW9ubHktaG9ub3VyLWdvLW5hbWVgCgo8L3RkPgo8dGQ+Ck9ubHkgaG9ub3VyIHRoZSBgeC1nby1uYW1lYCB3aGVuIGdlbmVyYXRpbmcgZmllbGQgbmFtZXMKPC90ZD4KPHRkPgo8ZGV0YWlscz4KCj4gWyFXQVJOSU5HXQo+IFVzaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvIGNhc2VzIHdoZXJlIGBvYXBpLWNvZGVnZW5gJ3MgcmV3cml0aW5nIG9mIGZpZWxkIG5hbWVzIHRvIHByZXZlbnQgY2xhc2hlcyB3aXRoIG90aGVyIHR5cGVzLCBvciB0byBwcmV2ZW50IGluY2x1ZGluZyBjaGFyYWN0ZXJzIHRoYXQgbWF5IG5vdCBiZSB2YWxpZCBHbyBmaWVsZCBuYW1lcy4KCkluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdXNlIHRoZSBpbmJ1aWx0IG9wdGlvbnMgZm9yIGNvbnZlcnRpbmcgYW4gT3BlbkFQSSBmaWVsZCBuYW1lIHRvIGEgR28gZmllbGQgbmFtZSwgc3VjaCBhcyB0aGUgYG5hbWUtbm9ybWFsaXplcjogIlRvQ2FtZWxDYXNlV2l0aEluaXRpYWxpc21zImAsIGFuZCBpbnN0ZWFkIHRydXN0IHRoZSBuYW1lIHRoYXQgeW91J3ZlIGRlZmluZWQgZm9yIHRoZSB0eXBlIGJldHRlci4KCkluIHRoaXMgY2FzZSwgeW91IGNhbiB1c2UgYHgtb2FwaS1jb2RlZ2VuLW9ubHktaG9ub3VyLWdvLW5hbWVgIHRvIGVuZm9yY2UgdGhpcywgYWxvbmdzaWRlIHNwZWNpZnlpbmcgdGhlIGBhbGxvdy11bmV4cG9ydGVkLXN0cnVjdC1maWVsZC1uYW1lc2AgY29tcGF0aWJpbGl0eSBvcHRpb24uCgpUaGlzIGFsbG93cyB5b3UgdG8gdGFrZSBhIHNwZWMgc3VjaCBhczoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IHgtb2FwaS1jb2RlZ2VuLW9ubHktaG9ub3VyLWdvLW5hbWUKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgVHlwZVdpdGhVbmV4cG9ydGVkRmllbGQ6CiAgICAgIGRlc2NyaXB0aW9uOiBBIHN0cnVjdCB3aWxsIGJlIG91dHB1dCB3aGVyZSBvbmUgb2YgdGhlIGZpZWxkcyBpcyBub3QgZXhwb3J0ZWQKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgICAgICMgTk9URSB0aGF0IHRoZXJlIGlzIGFuIGV4cGxpY2l0IHVzYWdlIG9mIGEgbG93ZXJjYXNlIGNoYXJhY3RlcgogICAgICAgICAgeC1nby1uYW1lOiBhY2NvdW50SWRlbnRpZmllcgogICAgICAgICAgeC1vYXBpLWNvZGVnZW4tZXh0cmEtdGFnczoKICAgICAgICAgICAganNvbjogIi0iCiAgICAgICAgICB4LW9hcGktY29kZWdlbi1vbmx5LWhvbm91ci1nby1uYW1lOiB0cnVlCmBgYAoKQW5kIHdlJ2xsIGdlbmVyYXRlOgoKYGBgZ28KLy8gVHlwZVdpdGhVbmV4cG9ydGVkRmllbGQgQSBzdHJ1Y3Qgd2lsbCBiZSBvdXRwdXQgd2hlcmUgb25lIG9mIHRoZSBmaWVsZHMgaXMgbm90IGV4cG9ydGVkCnR5cGUgVHlwZVdpdGhVbmV4cG9ydGVkRmllbGQgc3RydWN0IHsKCWFjY291bnRJZGVudGlmaWVyICpzdHJpbmcgYGpzb246Ii0iYAoJTmFtZSAgICAgICAgICAgICAgKnN0cmluZyBganNvbjoibmFtZSxvbWl0ZW1wdHkiYAp9CmBgYAoKWW91IGNhbiBzZWUgdGhpcyBpbiBtb3JlIGRldGFpbCBpbiBbdGhlIGV4YW1wbGUgY29kZV0oZXhhbXBsZXMvZXh0ZW5zaW9ucy94b2FwaWNvZGVnZW5vbmx5aG9ub3VyZ29uYW1lKS4KCjwvZGV0YWlscz4KPC90ZD4KPC90cj4KCjwvdGFibGU+CgojIyBSZXF1ZXN0L3Jlc3BvbnNlIHZhbGlkYXRpb24gbWlkZGxld2FyZQoKVGhlIGdlbmVyYXRlZCBjb2RlIHRoYXQgYG9hcGktY29kZWdlbmAgcHJvZHVjZXMgaGFzIHNvbWUgdmFsaWRhdGlvbiBmb3Igc29tZSBpbmNvbWluZyBkYXRhLCBzdWNoIGFzIGNoZWNraW5nIGZvciByZXF1aXJlZCBoZWFkZXJzLCBhbmQgd2hlbiB1c2luZyB0aGUgW3N0cmljdCBzZXJ2ZXJdKCNzdHJpY3Qtc2VydmVyKSB5b3UgZ2V0IHNvbWUgbW9yZSB2YWxpZGF0aW9uIGFyb3VuZCB0aGUgY29ycmVjdCB1c2FnZSBvZiB0aGUgcmVzcG9uc2UgdHlwZXMuCgpIb3dldmVyLCB0aGlzIGxlYXZlcyBhIGxvdCBvZiB2YWxpZGF0aW9uIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSwgd2hpY2ggY2FuIGJlIHRlZGlvdXMgdG8gaGFuZC13cml0ZSB0aGlzIGxvZ2ljLCBlc3BlY2lhbGx5IGZvciBsYXJnZSBvciBjb21wbGV4IE9wZW5BUEkgc3BlY2lmaWNhdGlvbnMuCgpUbyBzaW1wbGlmeSB0aGlzLCB3ZSB1c2UgYSBtaWRkbGV3YXJlLCB3aGljaCBwcm92aWRlcyB0aGUgcmVxdWVzdCB2YWxpZGF0aW9uLiBUaGUgbWlkZGxld2FyZSB5b3Ugd2FudCB0byB1c2UgZGVwZW5kcyBvbiB0aGUgc2VydmVyIHlvdSdyZSB1c2luZzoKCjx0YWJsZT4KCjx0cj4KPHRoPgpTZXJ2ZXIKPC90aD4KPHRoPgpNaWRkbGV3YXJlIGxpYnJhcnkKPC90aD4KPC90cj4KCjx0cj4KPHRkPgoKW0NoaV0oaHR0cHM6Ly9naXRodWIuY29tL2dvLWNoaS9jaGkpCgo8L3RkPgo8dGQ+CgpbbmV0aHR0cC1taWRkbGV3YXJlXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL25ldGh0dHAtbWlkZGxld2FyZSkKCjwvdGQ+CjwvdHI+Cgo8dHI+Cjx0ZD4KCltFY2hvXShodHRwczovL2dpdGh1Yi5jb20vbGFic3RhY2svZWNobykKCjwvdGQ+Cjx0ZD4KCltlY2hvLW1pZGRsZXdhcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vZWNoby1taWRkbGV3YXJlKQoKPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKW0ZpYmVyXShodHRwczovL2dpdGh1Yi5jb20vZ29maWJlci9maWJlcikKCjwvdGQ+Cjx0ZD4KCltmaWJlci1taWRkbGV3YXJlXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL2ZpYmVyLW1pZGRsZXdhcmUpCgo8L3RkPgoKPC90cj4KCgo8dHI+Cjx0ZD4KCltHaW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9naW4tZ29uaWMvZ2luKQoKPC90ZD4KPHRkPgoKW2dpbi1taWRkbGV3YXJlXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL2dpbi1taWRkbGV3YXJlKQoKPC90ZD4KPC90cj4KCjx0cj4KPHRkPgoKW2dvcmlsbGEvbXV4XShodHRwczovL2dpdGh1Yi5jb20vZ29yaWxsYS9tdXgpCgo8L3RkPgo8dGQ+CgpbbmV0aHR0cC1taWRkbGV3YXJlXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL25ldGh0dHAtbWlkZGxld2FyZSkKCjwvdGQ+Cgo8L3RyPgoKPHRyPgo8dGQ+CgpbSXJpc10oaHR0cHM6Ly9naXRodWIuY29tL2thdGFyYXMvaXJpcykKCjwvdGQ+Cjx0ZD4KCltpcmlzLW1pZGRsZXdhcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vaXJpcy1taWRkbGV3YXJlKQoKPC90ZD4KCjwvdHI+Cgo8dHI+Cjx0ZD4KClsxLjIyKyBgbmV0L2h0dHBgXShodHRwczovL3BrZy5nby5kZXYvbmV0L2h0dHApCgo8L3RkPgo8dGQ+CgpbbmV0aHR0cC1taWRkbGV3YXJlXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL25ldGh0dHAtbWlkZGxld2FyZSkKCjwvdGQ+Cgo8L3RyPgoKPC90YWJsZT4KCj4gWyFOT1RFXQo+IEl0IGlzIFtub3QgY3VycmVudGx5IHBvc3NpYmxlXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9pc3N1ZXMvMTAzOCkgdG8gdmFsaWRhdGUgdGhlIEhUVFAgcmVzcG9uc2Ugd2l0aCBhIG1pZGRsZXdhcmUuCgo+IFshTk9URV0KPiBXZSdyZSBhbHNvIFtleHBsb3JpbmddKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vZXhwL2lzc3Vlcy8xKSB0aGUgdXNlIG9mIFtsaWJvcGVuYXBpLXZhbGlkYXRvcl0oaHR0cHM6Ly9naXRodWIuY29tL3BiMzNmL2xpYm9wZW5hcGktdmFsaWRhdG9yLykgZm9yIHJlcXVlc3QvcmVzcG9uc2UgdmFsaWRhdGlvbiBtaWRkbGV3YXJlCgojIyBJbXBsZW1lbnRpbmcgc2VjdXJpdHkKCklmIHlvdSdyZSB1c2luZyBhIHNwZWNpZmljYXRpb24gd2l0aCBbU2VjdXJpdHkgU2NoZW1lc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC4zI3NlY3VyaXR5LXNjaGVtZS1vYmplY3QpIGFuZCBbU2VjdXJpdHkgUmVxdWlyZW1lbnRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjMjc2VjdXJpdHktcmVxdWlyZW1lbnQtb2JqZWN0KSwgeW91J2xsIHdhbnQgdG8gYXV0aGVudGljYXRlIGFuZCBhdXRob3JpemUgcmVxdWVzdHMuCgojIyMgT24gdGhlIHNlcnZlcgoKPiBbIU5PVEVdCj4gT3V0LW9mLXRoZS1ib3gsIHRoZSBzZXJ2ZXItc2lkZSBjb2RlIGdlbmVyYXRlZCBieSBgb2FwaS1jb2RlZ2VuYCBkb2VzIG5vdCBwcm92aWRlIHNlY3VyaXR5IHZhbGlkYXRpb24uCj4KPiBUbyBwZXJmb3JtIGF1dGhlbnRpY2F0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIHVzZSB0aGUgW3ZhbGlkYXRpb24gbWlkZGxld2FyZV0oI3JlcXVlc3QtcmVzcG9uc2UtdmFsaWRhdGlvbi1taWRkbGV3YXJlKS4KPgo+IEluIHRoZSBmdXR1cmUsIHdlIHBsYW4gdG8gW2ltcGxlbWVudCBzZXJ2ZXItc2lkZSB2YWxpZGF0aW9uIGluIHRoZSBnZW5lcmF0ZWQgY29kZV0oaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vaXNzdWVzLzE1MjQpCgpUbyBzZWUgaG93IHRoaXMgY2FuIHdvcmssIGNoZWNrIG91dCB0aGUgW2F1dGhlbnRpY2F0ZWQgQVBJIGV4YW1wbGVdKGV4YW1wbGVzL2F1dGhlbnRpY2F0ZWQtYXBpL2VjaG8pLgoKIyMjIE9uIHRoZSBjbGllbnQKCldpdGggYSBnZW5lcmF0ZWQgY2xpZW50LCB5b3UnbGwgd2FudCB0byB1c2UgdGhlIGNsaWVudCdzIGdlbmVyYXRlZCBgV2l0aFJlcXVlc3RFZGl0b3JGbmAgZnVuY3Rpb24gdG8gcGFzcyBpbiBhIGdpdmVuIHJlcXVlc3QgZWRpdG9yIGBSZXF1ZXN0RWRpdG9yRm5gLgoKRm9yIGluc3RhbmNlOgoKYGBgZ28KaW1wb3J0ICgKCSJjb250ZXh0IgoJImZtdCIKCSJsb2ciCgoJImdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9wa2cvc2VjdXJpdHlwcm92aWRlciIKKQoKZnVuYyBtYWluKCkgewoJYmFzaWNBdXRoLCBlcnIgOj0gc2VjdXJpdHlwcm92aWRlci5OZXdTZWN1cml0eVByb3ZpZGVyQmFzaWNBdXRoKCJteV91c2VyIiwgIm15X3Bhc3MiKQoJaWYgZXJyICE9IG5pbCB7CgkJbG9nLkZhdGFsKGVycikKCX0KCgljbGllbnQsIGVyciA6PSBOZXdDbGllbnQoImh0dHBzOi8vLi4uLiIsIFdpdGhSZXF1ZXN0RWRpdG9yRm4oYmFzaWNBdXRoLkludGVyY2VwdCkpCglpZiBlcnIgIT0gbmlsIHsKCQlsb2cuRmF0YWwoZXJyKQoJfQoKCXJlc3AsIGVyciA6PSBjbGllbnQuR2V0Q2xpZW50KGNvbnRleHQuVE9ETygpKQoJaWYgZXJyICE9IG5pbCB7CgkJbG9nLkZhdGFsKGVycikKCX0KCWZtdC5QcmludGYoInJlc3AuU3RhdHVzQ29kZTogJXZcbiIsIHJlc3AuU3RhdHVzQ29kZSkKfQpgYGAKCk5vdGljZSB0aGF0IHdlJ3JlIHVzaW5nIGEgcHJlLWJ1aWx0IHByb3ZpZGVyIGZyb20gdGhlIFtgcGtnL3NlY3VyaXR5cHJvdmlkZXJgIHBhY2thZ2VdKGh0dHBzOi8vcGtnLmdvLmRldi9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvcGtnL3NlY3VyaXR5cHJvdmlkZXIpLCB3aGljaCBoYXMgc29tZSBpbmJ1aWx0IHN1cHBvcnQgZm9yIG90aGVyIHR5cGVzIG9mIGF1dGhlbnRpY2F0aW9uLCB0b28uCgojIyBDdXN0b20gY29kZSBnZW5lcmF0aW9uCgpJdCBpcyBwb3NzaWJsZSB0byBleHRlbmQgdGhlIGluYnVpbHQgY29kZSBnZW5lcmF0aW9uIGZyb20gYG9hcGktY29kZWdlbmAgdXNpbmcgR28ncyBgdGV4dC90ZW1wbGF0ZWBzLgoKWW91IGNhbiBzcGVjaWZ5LCB0aHJvdWdoIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlLCB0aGUgYG91dHB1dC1vcHRpb25zLnVzZXItdGVtcGxhdGVzYCBzZXR0aW5nIHRvIG92ZXJyaWRlIHRoZSBpbmJ1aWx0IHRlbXBsYXRlcyBhbmQgdXNlIGEgdXNlci1kZWZpbmVkIHRlbXBsYXRlLgoKPiBbIU5PVEVdCj4gRmlsZW5hbWVzIGdpdmVuIHRvIHRoZSBgdXNlci10ZW1wbGF0ZXNgIGNvbmZpZ3VyYXRpb24gbXVzdCAqKmV4YWN0bHkqKiBtYXRjaCB0aGUgZmlsZW5hbWUgdGhhdCBgb2FwaS1jb2RlZ2VuYCBpcyBsb29raW5nIGZvcgoKIyMjIExvY2FsIHBhdGhzCgpXaXRoaW4geW91ciBjb25maWd1cmF0aW9uIGZpbGUsIHlvdSBjYW4gc3BlY2lmeSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRocyB0byBhIGZpbGUgdG8gcmVmZXJlbmNlIGZvciB0aGUgdGVtcGxhdGUsIHN1Y2ggYXM6CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6ICRzY2hlbWE9aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vSEVBRC9jb25maWd1cmF0aW9uLXNjaGVtYS5qc29uCiMgLi4uCm91dHB1dC1vcHRpb25zOgogIHVzZXItdGVtcGxhdGVzOgogICAgY2xpZW50LXdpdGgtcmVzcG9uc2VzLnRtcGw6IC4vY3VzdG9tLXRlbXBsYXRlLnRtcGwKICAgIGFkZGl0aW9uYWwtcHJvcGVydGllcy50bXBsOiAvdG1wL2Zvby5iYXIKICAgIHR5cGVkZWYudG1wbDogbm8tcHJlZml4LnRtcGwKYGBgCgo+IFshV0FSTl0KPiBXZSBkbyBub3QgaW50ZXJwb2xhdGUgYH5gIG9yIGAkSE9NRWAgKG9yIG90aGVyIGVudmlyb25tZW50IHZhcmlhYmxlcykgaW4gcGF0aHMgZ2l2ZW4KCiMjIyBIVFRQUyBwYXRocwoKSXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UgSFRUUFMgVVJMcy4KCj4gWyFXQVJOSU5HXQo+IEFsdGhvdWdoIHBvc3NpYmxlLCB0aGlzIGRvZXMgbGVhZCB0byBgb2FwaS1jb2RlZ2VuYCBleGVjdXRpb25zIG5vdCBuZWNlc3NhcmlseSBiZWluZyByZXByb2R1Y2libGUuIEl0J3MgcmVjb21tZW5kZWQgdG8gdmVuZG9yIChjb3B5KSB0aGUgT3BlbkFQSSBzcGVjIGludG8geW91ciBjb2RlYmFzZSBhbmQgcmVmZXJlbmNlIGl0IGxvY2FsbHkKPgo+IFNlZSBbdGhpcyBibG9nIHBvc3RdKGh0dHBzOi8vd3d3Lmp2dC5tZS9wb3N0cy8yMDI0LzA0LzI3L2dpdGh1Yi1hY3Rpb25zLXVwZGF0ZS1maWxlLykgZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBHaXRIdWIgQWN0aW9ucyB0byBtYW5hZ2UgdGhlIHVwZGF0ZXMgb2YgZmlsZXMgYWNyb3NzIHJlcG9zCj4KPiBUaGlzIHdpbGwgYmUgZGlzYWJsZWQgYnkgZGVmYXVsdCAoYnV0IHBvc3NpYmxlIHRvIHR1cm4gYmFjayBvbiB2aWEgY29uZmlndXJhdGlvbikgW2luIHRoZSBmdXR1cmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL2lzc3Vlcy8xNTY0KQoKVG8gdXNlIGl0LCB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb246CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6ICRzY2hlbWE9aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vSEVBRC9jb25maWd1cmF0aW9uLXNjaGVtYS5qc29uCiMgLi4uCm91dHB1dC1vcHRpb25zOgogIHVzZXItdGVtcGxhdGVzOgogICAgIyBUaGUgZm9sbG93aW5nIGFyZSByZWZlcmVuY2luZyBhIHZlcnNpb24gb2YgdGhlIGRlZmF1bHQgY2xpZW50LXdpdGgtcmVzcG9uc2VzLnRtcGwgZmlsZSwgYnV0IGxvYWRlZCBpbiB0aHJvdWdoIEdpdEh1YidzIHJhdy5naXRodWJ1c2VyY29udGVudC5jb20uIFRoZSBnZW5lcmFsIGZvcm0gdG8gdXNlIHJhdy5naXRodWJ1c2VyY29udGVudC5jb20gaXMgYXMgZm9sbG93cyBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vPHVzZXJuYW1lPi88cHJvamVjdD4vPGNvbW1pdGlzaD4vcGF0aC90by90ZW1wbGF0ZS90ZW1wbGF0ZS50bXBsCgogICAgIyBBbHRlcm5hdGl2ZWx5IHVzaW5nIHJhdy5naXRodWJ1c2VyY29udGVudC5jb20gd2l0aCBhIGhhc2gKICAgIGNsaWVudC13aXRoLXJlc3BvbnNlcy50bXBsOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9hZDVlYWRhNGYzY2NjMjhhODg0NzdjZWY2MmVhMjFjMTdmYzhhYTAxL3BrZy9jb2RlZ2VuL3RlbXBsYXRlcy9jbGllbnQtd2l0aC1yZXNwb25zZXMudG1wbAogICAgIyBBbHRlcm5hdGl2ZWx5IHVzaW5nIHJhdy5naXRodWJ1c2VyY29udGVudC5jb20gd2l0aCBhIHRhZwogICAgY2xpZW50LXdpdGgtcmVzcG9uc2VzLnRtcGw6IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyLjEuMC9wa2cvY29kZWdlbi90ZW1wbGF0ZXMvY2xpZW50LXdpdGgtcmVzcG9uc2VzLnRtcGwKICAgICMgQWx0ZXJuYXRpdmVseSB1c2luZyByYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tIHdpdGggYSBicmFuY2gKICAgIGNsaWVudC13aXRoLXJlc3BvbnNlcy50bXBsOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9tYXN0ZXIvcGtnL2NvZGVnZW4vdGVtcGxhdGVzL2NsaWVudC13aXRoLXJlc3BvbnNlcy50bXBsCmBgYAoKPiBbIVdBUk5JTkddCj4gSWYgdXNpbmcgVVJMcyB0aGF0IHB1bGwgbG9jYXRpb25zIGZyb20gYSBHaXQgcmVwbywgc3VjaCBhcyBgcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbWAsIGl0IGlzIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gdXNlIGEgdGFnIG9yIGEgcmF3IGNvbW1pdCBoYXNoIGluc3RlYWQgb2YgYSBicmFuY2ggbGlrZSBgbWFpbmAuIFRyYWNraW5nIGEgYnJhbmNoIGNhbiBsZWFkIHRvIHVuZXhwZWN0ZWQgQVBJIGRyaWZ0LCBhbmQgbG9zcyBvZiB0aGUgYWJpbGl0eSB0byByZXByb2R1Y2UgYSBidWlsZC4KCiMjIyBJbmxpbmUgdGVtcGxhdGUKCkl0J3MgYWxzbyBwb3NzaWJsZSB0byBzZXQgdGhlIHRlbXBsYXRlcyBpbmxpbmUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZToKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogJHNjaGVtYT1odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9IRUFEL2NvbmZpZ3VyYXRpb24tc2NoZW1hLmpzb24KIyAuLi4Kb3V0cHV0LW9wdGlvbnM6CiAgdXNlci10ZW1wbGF0ZXM6CiAgICAjIE5PVEUgdGhlIHVzZSBvZiB0aGUgYHxgIChwaXBlIHN5bWJvbCkgaGVyZSB0byBkZW5vdGUgdGhhdCB0aGlzIGlzIGEKICAgICMgbXVsdGktbGluZSBzdGF0ZW1lbnQgdGhhdCBzaG91bGQgcHJlc2VydmUgbmV3bGluZXMuIE1vcmUgcmVhZGluZzoKICAgICMgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE4NzA4MTU2LzIyNTcwMzggYW5kCiAgICAjIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNTM2NTI5Ni8yMjU3MDM4CiAgICBjbGllbnQtd2l0aC1yZXNwb25zZXMudG1wbDogfAogICAgICAgIC8vIENsaWVudFdpdGhSZXNwb25zZXMgYnVpbGRzIG9uIENsaWVudEludGVyZmFjZSB0byBvZmZlciByZXNwb25zZSBwYXlsb2FkcwogICAgICAgIHR5cGUgQ2xpZW50V2l0aFJlc3BvbnNlcyBzdHJ1Y3QgewogICAgICAgICAgICBDbGllbnRJbnRlcmZhY2UKICAgICAgICB9CiAgICAgICAgLi4uCmBgYAoKIyMjIFVzaW5nIHRoZSBHbyBwYWNrYWdlCgpBbHRlcm5hdGl2ZWx5LCB5b3UgYXJlIGFibGUgdG8gdXNlIHRoZSB1bmRlcmx5aW5nIGNvZGUgZ2VuZXJhdGlvbiBhcyBhIHBhY2thZ2UsIHdoaWNoIFt3aWxsIGJlIGRvY3VtZW50ZWQgaW4gdGhlIGZ1dHVyZV0oaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vaXNzdWVzLzE0ODcpLgoKIyMgQWRkaXRpb25hbCBQcm9wZXJ0aWVzIChgYWRkaXRpb25hbFByb3BlcnRpZXNgKQoKW09wZW5BUEkgU2NoZW1hc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC4zLmh0bWwjc2NoZW1hLW9iamVjdCkgaW1wbGljaXRseSBhY2NlcHQgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzYCwgbWVhbmluZyB0aGF0IGFueSBmaWVsZHMgcHJvdmlkZWQsIGJ1dCBub3QgZXhwbGljaXRseSBkZWZpbmVkIHZpYSBwcm9wZXJ0aWVzIG9uIHRoZSBzY2hlbWEgYXJlIGFjY2VwdGVkIGFzIGlucHV0LCBhbmQgcHJvcGFnYXRlZC4gV2hlbiB1bnNwZWNpZmllZCwgT3BlbkFQSSBkZWZpbmVzIHRoYXQgdGhlIGBhZGRpdGlvbmFsUHJvcGVydGllc2AgZmllbGQgaXMgYXNzdW1lZCB0byBiZSBgdHJ1ZWAuCgpGb3Igc2ltcGxpY2l0eSwgYW5kIHRvIHJlbW92ZSBhIGZhaXIgYml0IG9mIGR1cGxpY2F0aW9uIGFuZCBib2lsZXJwbGF0ZSwgYG9hcGktY29kZWdlbmAgZGVjaWRlcyB0byBpZ25vcmUgdGhlIGltcGxpY2l0IGBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZWAsIGFuZCBpbnN0ZWFkIHJlcXVpcmVzIHlvdSB0byBzcGVjaWZ5IHRoZSBgYWRkaXRpb25hbFByb3BlcnRpZXNgIGtleSB0byBnZW5lcmF0ZSB0aGUgYm9pbGVycGxhdGUuCgo+IFshTk9URV0KPiBJbiB0aGUgZnV0dXJlIFt0aGlzIHdpbGwgYmUgcG9zc2libGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL2lzc3Vlcy8xNTE0KSB0byBkaXNhYmxlIHRoaXMgZnVuY3Rpb25hbGl0eSwgYW5kIGhvbm91ciB0aGUgaW1wbGljaXQgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlYAoKQmVsb3cgeW91IGNhbiBzZWUgc29tZSBleGFtcGxlcyBvZiBob3cgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzYCBhZmZlY3RzIHRoZSBnZW5lcmF0ZWQgY29kZS4KCiMjIyBJbXBsaWNpdCBgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWVgIC8gbm8gYGFkZGl0aW9uYWxQcm9wZXJ0aWVzYCBzZXQKCmBgYHlhbWwKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgVGhpbmc6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIGlkCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBpbnRlZ2VyCiAgICAgICMgaW1wbGljaXQgYWRkaXRpb25hbFByb3BlcnRpZXM6IHRydWUKYGBgCgpXaWxsIGdlbmVyYXRlOgoKYGBgZ28KLy8gVGhpbmcgZGVmaW5lcyBtb2RlbCBmb3IgVGhpbmcuCnR5cGUgVGhpbmcgc3RydWN0IHsKCUlkIGludCBganNvbjoiaWQiYAp9CgovLyB3aXRoIG5vIGdlbmVyYXRlZCBib2lsZXJwbGF0ZSBub3IgdGhlIGBBZGRpdGlvbmFsUHJvcGVydGllc2AgZmllbGQKYGBgCgojIyMgRXhwbGljaXQgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlYAoKYGBgeWFtbApjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICBUaGluZzoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gaWQKICAgICAgcHJvcGVydGllczoKICAgICAgICBpZDoKICAgICAgICAgIHR5cGU6IGludGVnZXIKICAgICAgIyBleHBsaWNpdCB0cnVlCiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlCmBgYAoKV2lsbCBnZW5lcmF0ZToKCmBgYGdvCi8vIFRoaW5nIGRlZmluZXMgbW9kZWwgZm9yIFRoaW5nLgp0eXBlIFRoaW5nIHN0cnVjdCB7CglJZCAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGBqc29uOiJpZCJgCglBZGRpdGlvbmFsUHJvcGVydGllcyBtYXBbc3RyaW5nXWludGVyZmFjZXt9IGBqc29uOiItImAKfQoKLy8gd2l0aCBnZW5lcmF0ZWQgYm9pbGVycGxhdGUgYmVsb3cKYGBgCgo8ZGV0YWlscz4KCjxzdW1tYXJ5PkJvaWxlcnBsYXRlPC9zdW1tYXJ5PgoKYGBgZ28KCi8vIEdldHRlciBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciBUaGluZy4gUmV0dXJucyB0aGUgc3BlY2lmaWVkCi8vIGVsZW1lbnQgYW5kIHdoZXRoZXIgaXQgd2FzIGZvdW5kCmZ1bmMgKGEgVGhpbmcpIEdldChmaWVsZE5hbWUgc3RyaW5nKSAodmFsdWUgaW50ZXJmYWNle30sIGZvdW5kIGJvb2wpIHsKCWlmIGEuQWRkaXRpb25hbFByb3BlcnRpZXMgIT0gbmlsIHsKCQl2YWx1ZSwgZm91bmQgPSBhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzW2ZpZWxkTmFtZV0KCX0KCXJldHVybgp9CgovLyBTZXR0ZXIgZm9yIGFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgVGhpbmcKZnVuYyAoYSAqVGhpbmcpIFNldChmaWVsZE5hbWUgc3RyaW5nLCB2YWx1ZSBpbnRlcmZhY2V7fSkgewoJaWYgYS5BZGRpdGlvbmFsUHJvcGVydGllcyA9PSBuaWwgewoJCWEuQWRkaXRpb25hbFByb3BlcnRpZXMgPSBtYWtlKG1hcFtzdHJpbmddaW50ZXJmYWNle30pCgl9CglhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzW2ZpZWxkTmFtZV0gPSB2YWx1ZQp9CgovLyBPdmVycmlkZSBkZWZhdWx0IEpTT04gaGFuZGxpbmcgZm9yIFRoaW5nIHRvIGhhbmRsZSBBZGRpdGlvbmFsUHJvcGVydGllcwpmdW5jIChhICpUaGluZykgVW5tYXJzaGFsSlNPTihiIFtdYnl0ZSkgZXJyb3IgewoJb2JqZWN0IDo9IG1ha2UobWFwW3N0cmluZ11qc29uLlJhd01lc3NhZ2UpCgllcnIgOj0ganNvbi5Vbm1hcnNoYWwoYiwgJm9iamVjdCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCglpZiByYXcsIGZvdW5kIDo9IG9iamVjdFsiaWQiXTsgZm91bmQgewoJCWVyciA9IGpzb24uVW5tYXJzaGFsKHJhdywgJmEuSWQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBmbXQuRXJyb3JmKCJlcnJvciByZWFkaW5nICdpZCc6ICV3IiwgZXJyKQoJCX0KCQlkZWxldGUob2JqZWN0LCAiaWQiKQoJfQoKCWlmIGxlbihvYmplY3QpICE9IDAgewoJCWEuQWRkaXRpb25hbFByb3BlcnRpZXMgPSBtYWtlKG1hcFtzdHJpbmddaW50ZXJmYWNle30pCgkJZm9yIGZpZWxkTmFtZSwgZmllbGRCdWYgOj0gcmFuZ2Ugb2JqZWN0IHsKCQkJdmFyIGZpZWxkVmFsIGludGVyZmFjZXt9CgkJCWVyciA6PSBqc29uLlVubWFyc2hhbChmaWVsZEJ1ZiwgJmZpZWxkVmFsKQoJCQlpZiBlcnIgIT0gbmlsIHsKCQkJCXJldHVybiBmbXQuRXJyb3JmKCJlcnJvciB1bm1hcnNoYWxpbmcgZmllbGQgJXM6ICV3IiwgZmllbGROYW1lLCBlcnIpCgkJCX0KCQkJYS5BZGRpdGlvbmFsUHJvcGVydGllc1tmaWVsZE5hbWVdID0gZmllbGRWYWwKCQl9Cgl9CglyZXR1cm4gbmlsCn0KCi8vIE92ZXJyaWRlIGRlZmF1bHQgSlNPTiBoYW5kbGluZyBmb3IgVGhpbmcgdG8gaGFuZGxlIEFkZGl0aW9uYWxQcm9wZXJ0aWVzCmZ1bmMgKGEgVGhpbmcpIE1hcnNoYWxKU09OKCkgKFtdYnl0ZSwgZXJyb3IpIHsKCXZhciBlcnIgZXJyb3IKCW9iamVjdCA6PSBtYWtlKG1hcFtzdHJpbmddanNvbi5SYXdNZXNzYWdlKQoKCW9iamVjdFsiaWQiXSwgZXJyID0ganNvbi5NYXJzaGFsKGEuSWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBmbXQuRXJyb3JmKCJlcnJvciBtYXJzaGFsaW5nICdpZCc6ICV3IiwgZXJyKQoJfQoKCWZvciBmaWVsZE5hbWUsIGZpZWxkIDo9IHJhbmdlIGEuQWRkaXRpb25hbFByb3BlcnRpZXMgewoJCW9iamVjdFtmaWVsZE5hbWVdLCBlcnIgPSBqc29uLk1hcnNoYWwoZmllbGQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoImVycm9yIG1hcnNoYWxpbmcgJyVzJzogJXciLCBmaWVsZE5hbWUsIGVycikKCQl9Cgl9CglyZXR1cm4ganNvbi5NYXJzaGFsKG9iamVjdCkKfQpgYGAKCjwvZGV0YWlscz4KCgojIyMgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzYCBhcyBgaW50ZWdlcmBzCgpgYGB5YW1sCmNvbXBvbmVudHM6CiAgc2NoZW1hczoKICAgIFRoaW5nOgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBpZAogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIGlkOgogICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAjIHNpbXBsZSB0eXBlCiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOgogICAgICAgIHR5cGU6IGludGVnZXIKYGBgCgpXaWxsIGdlbmVyYXRlOgoKYGBgZ28KLy8gVGhpbmcgZGVmaW5lcyBtb2RlbCBmb3IgVGhpbmcuCnR5cGUgVGhpbmcgc3RydWN0IHsKCUlkICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGBqc29uOiJpZCJgCglBZGRpdGlvbmFsUHJvcGVydGllcyBtYXBbc3RyaW5nXWludCBganNvbjoiLSJgCn0KCi8vIHdpdGggZ2VuZXJhdGVkIGJvaWxlcnBsYXRlIGJlbG93CmBgYAoKPGRldGFpbHM+Cgo8c3VtbWFyeT5Cb2lsZXJwbGF0ZTwvc3VtbWFyeT4KCmBgYGdvCi8vIEdldHRlciBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciBUaGluZy4gUmV0dXJucyB0aGUgc3BlY2lmaWVkCi8vIGVsZW1lbnQgYW5kIHdoZXRoZXIgaXQgd2FzIGZvdW5kCmZ1bmMgKGEgVGhpbmcpIEdldChmaWVsZE5hbWUgc3RyaW5nKSAodmFsdWUgaW50LCBmb3VuZCBib29sKSB7CglpZiBhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzICE9IG5pbCB7CgkJdmFsdWUsIGZvdW5kID0gYS5BZGRpdGlvbmFsUHJvcGVydGllc1tmaWVsZE5hbWVdCgl9CglyZXR1cm4KfQoKLy8gU2V0dGVyIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIFRoaW5nCmZ1bmMgKGEgKlRoaW5nKSBTZXQoZmllbGROYW1lIHN0cmluZywgdmFsdWUgaW50KSB7CglpZiBhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzID09IG5pbCB7CgkJYS5BZGRpdGlvbmFsUHJvcGVydGllcyA9IG1ha2UobWFwW3N0cmluZ11pbnQpCgl9CglhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzW2ZpZWxkTmFtZV0gPSB2YWx1ZQp9CgovLyBPdmVycmlkZSBkZWZhdWx0IEpTT04gaGFuZGxpbmcgZm9yIFRoaW5nIHRvIGhhbmRsZSBBZGRpdGlvbmFsUHJvcGVydGllcwpmdW5jIChhICpUaGluZykgVW5tYXJzaGFsSlNPTihiIFtdYnl0ZSkgZXJyb3IgewoJb2JqZWN0IDo9IG1ha2UobWFwW3N0cmluZ11qc29uLlJhd01lc3NhZ2UpCgllcnIgOj0ganNvbi5Vbm1hcnNoYWwoYiwgJm9iamVjdCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCglpZiByYXcsIGZvdW5kIDo9IG9iamVjdFsiaWQiXTsgZm91bmQgewoJCWVyciA9IGpzb24uVW5tYXJzaGFsKHJhdywgJmEuSWQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBmbXQuRXJyb3JmKCJlcnJvciByZWFkaW5nICdpZCc6ICV3IiwgZXJyKQoJCX0KCQlkZWxldGUob2JqZWN0LCAiaWQiKQoJfQoKCWlmIGxlbihvYmplY3QpICE9IDAgewoJCWEuQWRkaXRpb25hbFByb3BlcnRpZXMgPSBtYWtlKG1hcFtzdHJpbmddaW50KQoJCWZvciBmaWVsZE5hbWUsIGZpZWxkQnVmIDo9IHJhbmdlIG9iamVjdCB7CgkJCXZhciBmaWVsZFZhbCBpbnQKCQkJZXJyIDo9IGpzb24uVW5tYXJzaGFsKGZpZWxkQnVmLCAmZmllbGRWYWwpCgkJCWlmIGVyciAhPSBuaWwgewoJCQkJcmV0dXJuIGZtdC5FcnJvcmYoImVycm9yIHVubWFyc2hhbGluZyBmaWVsZCAlczogJXciLCBmaWVsZE5hbWUsIGVycikKCQkJfQoJCQlhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzW2ZpZWxkTmFtZV0gPSBmaWVsZFZhbAoJCX0KCX0KCXJldHVybiBuaWwKfQoKLy8gT3ZlcnJpZGUgZGVmYXVsdCBKU09OIGhhbmRsaW5nIGZvciBUaGluZyB0byBoYW5kbGUgQWRkaXRpb25hbFByb3BlcnRpZXMKZnVuYyAoYSBUaGluZykgTWFyc2hhbEpTT04oKSAoW11ieXRlLCBlcnJvcikgewoJdmFyIGVyciBlcnJvcgoJb2JqZWN0IDo9IG1ha2UobWFwW3N0cmluZ11qc29uLlJhd01lc3NhZ2UpCgoJb2JqZWN0WyJpZCJdLCBlcnIgPSBqc29uLk1hcnNoYWwoYS5JZCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoImVycm9yIG1hcnNoYWxpbmcgJ2lkJzogJXciLCBlcnIpCgl9CgoJZm9yIGZpZWxkTmFtZSwgZmllbGQgOj0gcmFuZ2UgYS5BZGRpdGlvbmFsUHJvcGVydGllcyB7CgkJb2JqZWN0W2ZpZWxkTmFtZV0sIGVyciA9IGpzb24uTWFyc2hhbChmaWVsZCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigiZXJyb3IgbWFyc2hhbGluZyAnJXMnOiAldyIsIGZpZWxkTmFtZSwgZXJyKQoJCX0KCX0KCXJldHVybiBqc29uLk1hcnNoYWwob2JqZWN0KQp9CmBgYAoKPC9kZXRhaWxzPgoKIyMjIGBhZGRpdGlvbmFsUHJvcGVydGllc2Agd2l0aCBhbiBvYmplY3QKCmBgYHlhbWwKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgVGhpbmc6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIGlkCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgaWQ6CiAgICAgICAgICB0eXBlOiBpbnRlZ2VyCiAgICAgICMgb2JqZWN0CiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOgogICAgICAgIHR5cGU6IG9iamVjdAogICAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgICBmb286CiAgICAgICAgICAgIHR5cGU6IHN0cmluZwpgYGAKCldpbGwgZ2VuZXJhdGU6CgpgYGBnbwovLyBUaGluZyBkZWZpbmVzIG1vZGVsIGZvciBUaGluZy4KdHlwZSBUaGluZyBzdHJ1Y3QgewoJSWQgICAgICAgICAgICAgICAgICAgaW50IGBqc29uOiJpZCJgCglBZGRpdGlvbmFsUHJvcGVydGllcyBtYXBbc3RyaW5nXXN0cnVjdCB7CgkJRm9vICpzdHJpbmcgYGpzb246ImZvbyxvbWl0ZW1wdHkiYAoJfSBganNvbjoiLSJgCn0KCi8vIHdpdGggZ2VuZXJhdGVkIGJvaWxlcnBsYXRlIGJlbG93CmBgYAoKPGRldGFpbHM+Cgo8c3VtbWFyeT5Cb2lsZXJwbGF0ZTwvc3VtbWFyeT4KCmBgYGdvCi8vIEdldHRlciBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciBUaGluZy4gUmV0dXJucyB0aGUgc3BlY2lmaWVkCi8vIGVsZW1lbnQgYW5kIHdoZXRoZXIgaXQgd2FzIGZvdW5kCmZ1bmMgKGEgVGhpbmcpIEdldChmaWVsZE5hbWUgc3RyaW5nKSAodmFsdWUgc3RydWN0IHsKCUZvbyAqc3RyaW5nIGBqc29uOiJmb28sb21pdGVtcHR5ImAKfSwgZm91bmQgYm9vbCkgewoJaWYgYS5BZGRpdGlvbmFsUHJvcGVydGllcyAhPSBuaWwgewoJCXZhbHVlLCBmb3VuZCA9IGEuQWRkaXRpb25hbFByb3BlcnRpZXNbZmllbGROYW1lXQoJfQoJcmV0dXJuCn0KCi8vIFNldHRlciBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciBUaGluZwpmdW5jIChhICpUaGluZykgU2V0KGZpZWxkTmFtZSBzdHJpbmcsIHZhbHVlIHN0cnVjdCB7CglGb28gKnN0cmluZyBganNvbjoiZm9vLG9taXRlbXB0eSJgCn0pIHsKCWlmIGEuQWRkaXRpb25hbFByb3BlcnRpZXMgPT0gbmlsIHsKCQlhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gbWFrZShtYXBbc3RyaW5nXXN0cnVjdCB7CgkJCUZvbyAqc3RyaW5nIGBqc29uOiJmb28sb21pdGVtcHR5ImAKCQl9KQoJfQoJYS5BZGRpdGlvbmFsUHJvcGVydGllc1tmaWVsZE5hbWVdID0gdmFsdWUKfQoKLy8gT3ZlcnJpZGUgZGVmYXVsdCBKU09OIGhhbmRsaW5nIGZvciBUaGluZyB0byBoYW5kbGUgQWRkaXRpb25hbFByb3BlcnRpZXMKZnVuYyAoYSAqVGhpbmcpIFVubWFyc2hhbEpTT04oYiBbXWJ5dGUpIGVycm9yIHsKCW9iamVjdCA6PSBtYWtlKG1hcFtzdHJpbmddanNvbi5SYXdNZXNzYWdlKQoJZXJyIDo9IGpzb24uVW5tYXJzaGFsKGIsICZvYmplY3QpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJaWYgcmF3LCBmb3VuZCA6PSBvYmplY3RbImlkIl07IGZvdW5kIHsKCQllcnIgPSBqc29uLlVubWFyc2hhbChyYXcsICZhLklkKQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gZm10LkVycm9yZigiZXJyb3IgcmVhZGluZyAnaWQnOiAldyIsIGVycikKCQl9CgkJZGVsZXRlKG9iamVjdCwgImlkIikKCX0KCglpZiBsZW4ob2JqZWN0KSAhPSAwIHsKCQlhLkFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gbWFrZShtYXBbc3RyaW5nXXN0cnVjdCB7CgkJCUZvbyAqc3RyaW5nIGBqc29uOiJmb28sb21pdGVtcHR5ImAKCQl9KQoJCWZvciBmaWVsZE5hbWUsIGZpZWxkQnVmIDo9IHJhbmdlIG9iamVjdCB7CgkJCXZhciBmaWVsZFZhbCBzdHJ1Y3QgewoJCQkJRm9vICpzdHJpbmcgYGpzb246ImZvbyxvbWl0ZW1wdHkiYAoJCQl9CgkJCWVyciA6PSBqc29uLlVubWFyc2hhbChmaWVsZEJ1ZiwgJmZpZWxkVmFsKQoJCQlpZiBlcnIgIT0gbmlsIHsKCQkJCXJldHVybiBmbXQuRXJyb3JmKCJlcnJvciB1bm1hcnNoYWxpbmcgZmllbGQgJXM6ICV3IiwgZmllbGROYW1lLCBlcnIpCgkJCX0KCQkJYS5BZGRpdGlvbmFsUHJvcGVydGllc1tmaWVsZE5hbWVdID0gZmllbGRWYWwKCQl9Cgl9CglyZXR1cm4gbmlsCn0KCi8vIE92ZXJyaWRlIGRlZmF1bHQgSlNPTiBoYW5kbGluZyBmb3IgVGhpbmcgdG8gaGFuZGxlIEFkZGl0aW9uYWxQcm9wZXJ0aWVzCmZ1bmMgKGEgVGhpbmcpIE1hcnNoYWxKU09OKCkgKFtdYnl0ZSwgZXJyb3IpIHsKCXZhciBlcnIgZXJyb3IKCW9iamVjdCA6PSBtYWtlKG1hcFtzdHJpbmddanNvbi5SYXdNZXNzYWdlKQoKCW9iamVjdFsiaWQiXSwgZXJyID0ganNvbi5NYXJzaGFsKGEuSWQpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBmbXQuRXJyb3JmKCJlcnJvciBtYXJzaGFsaW5nICdpZCc6ICV3IiwgZXJyKQoJfQoKCWZvciBmaWVsZE5hbWUsIGZpZWxkIDo9IHJhbmdlIGEuQWRkaXRpb25hbFByb3BlcnRpZXMgewoJCW9iamVjdFtmaWVsZE5hbWVdLCBlcnIgPSBqc29uLk1hcnNoYWwoZmllbGQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoImVycm9yIG1hcnNoYWxpbmcgJyVzJzogJXciLCBmaWVsZE5hbWUsIGVycikKCQl9Cgl9CglyZXR1cm4ganNvbi5NYXJzaGFsKG9iamVjdCkKfQpgYGAKCjwvZGV0YWlscz4KCiMjIENoYW5naW5nIHRoZSBuYW1lcyBvZiBnZW5lcmF0ZWQgdHlwZXMKCkFzIG9mIGBvYXBpLWNvZGVnZW5gIHYyLjIuMCwgaXQgaXMgbm93IHBvc3NpYmxlIHRvIHVzZSB0aGUgYG91dHB1dC1vcHRpb25zYCBjb25maWd1cmF0aW9uJ3MgYG5hbWUtbm9ybWFsaXplcmAgdG8gZGVmaW5lIHRoZSBsb2dpYyBmb3IgaG93IHRvIGNvbnZlcnQgYW4gT3BlbkFQSSBuYW1lIChpLmUuIGFuIE9wZXJhdGlvbiBJRCBvciBhIFNjaGVtYSBuYW1lKSBhbmQgY29uc3RydWN0IGEgR28gdHlwZSBuYW1lLgoKPGRldGFpbHM+Cgo8c3VtbWFyeT5FeGFtcGxlLCB1c2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb248L3N1bW1hcnk+CgpCeSBkZWZhdWx0LCBgb2FwaS1jb2RlZ2VuYCB3aWxsIHBlcmZvcm0gY2FtZWwtY2FzZSBjb252ZXJzaW9uLCBzbyBmb3IgYSBzcGVjIHN1Y2ggYXM6CgpgYGB5YW1sCm9wZW5hcGk6ICIzLjAuMCIKaW5mbzoKICB2ZXJzaW9uOiAxLjAuMAogIHRpdGxlOiBFeGFtcGxlIGNvZGUgZm9yIHRoZSBgbmFtZS1ub3JtYWxpemVyYCBvdXRwdXQgb3B0aW9uCnBhdGhzOgogIC9hcGkvcGV0cy97cGV0SWR9OgogICAgZ2V0OgogICAgICBzdW1tYXJ5OiBHZXQgcGV0IGdpdmVuIGlkZW50aWZpZXIuCiAgICAgIG9wZXJhdGlvbklkOiBnZXRIdHRwUGV0CiAgICAgIHBhcmFtZXRlcnM6CiAgICAgIC0gbmFtZTogcGV0SWQKICAgICAgICBpbjogcGF0aAogICAgICAgIHJlcXVpcmVkOiB0cnVlCiAgICAgICAgc2NoZW1hOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgIHJlc3BvbnNlczoKICAgICAgICAnMjAwJzoKICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWxpZCBwZXQKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL1BldCcKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgUGV0OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSB1dWlkCiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgdXVpZDoKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwZXQgdXVpZC4KICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBkZXNjcmlwdGlvbjogVGhlIG5hbWUgb2YgdGhlIHBldC4KICAgIEVycm9yOgogICAgICByZXF1aXJlZDoKICAgICAgICAtIGNvZGUKICAgICAgICAtIG1lc3NhZ2UKICAgICAgcHJvcGVydGllczoKICAgICAgICBjb2RlOgogICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgICAgZm9ybWF0OiBpbnQzMgogICAgICAgICAgZGVzY3JpcHRpb246IEVycm9yIGNvZGUKICAgICAgICBtZXNzYWdlOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBkZXNjcmlwdGlvbjogRXJyb3IgbWVzc2FnZQogICAgT25lT2YydGhpbmdzOgogICAgICBkZXNjcmlwdGlvbjogIk5vdGljZSB0aGF0IHRoZSBgdGhpbmdzYCBpcyBub3QgY2FwaXRhbGlzZWQiCiAgICAgIG9uZU9mOgogICAgICAgIC0gdHlwZTogb2JqZWN0CiAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgLSBpZAogICAgICAgICAgcHJvcGVydGllczoKICAgICAgICAgICAgaWQ6CiAgICAgICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgIC0gdHlwZTogb2JqZWN0CiAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgLSBpZAogICAgICAgICAgcHJvcGVydGllczoKICAgICAgICAgICAgaWQ6CiAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAgICAgZm9ybWF0OiB1dWlkCmBgYAoKVGhpcyB3aWxsIHByb2R1Y2U6CgpgYGBnbwovLyBPbmVPZjJ0aGluZ3MgTm90aWNlIHRoYXQgdGhlIGB0aGluZ3NgIGlzIG5vdCBjYXBpdGFsaXNlZAp0eXBlIE9uZU9mMnRoaW5ncyBzdHJ1Y3QgewoJdW5pb24ganNvbi5SYXdNZXNzYWdlCn0KCi8vIFBldCBkZWZpbmVzIG1vZGVsIGZvciBQZXQuCnR5cGUgUGV0IHN0cnVjdCB7CgkvLyBOYW1lIFRoZSBuYW1lIG9mIHRoZSBwZXQuCglOYW1lIHN0cmluZyBganNvbjoibmFtZSJgCgoJLy8gVXVpZCBUaGUgcGV0IHV1aWQuCglVdWlkIHN0cmluZyBganNvbjoidXVpZCJgCn0KCi8vIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGNsaWVudCBhYm92ZS4KdHlwZSBDbGllbnRJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCS8vIEdldEh0dHBQZXQgcmVxdWVzdAoJR2V0SHR0cFBldChjdHggY29udGV4dC5Db250ZXh0LCBwZXRJZCBzdHJpbmcsIHJlcUVkaXRvcnMgLi4uUmVxdWVzdEVkaXRvckZuKSAoKmh0dHAuUmVzcG9uc2UsIGVycm9yKQp9CmBgYAoKPC9kZXRhaWxzPgoKPGRldGFpbHM+Cgo8c3VtbWFyeT5FeGFtcGxlLCB1c2luZyA8Y29kZT5Ub0NhbWVsQ2FzZVdpdGhJbml0aWFsaXNtczwvY29kZT48L3N1bW1hcnk+CgpCeSBkZWZhdWx0LCBgb2FwaS1jb2RlZ2VuYCB3aWxsIHBlcmZvcm0gY2FtZWwtY2FzZSBjb252ZXJzaW9uLCBzbyBmb3IgYSBzcGVjIHN1Y2ggYXM6CgpgYGB5YW1sCm9wZW5hcGk6ICIzLjAuMCIKaW5mbzoKICB2ZXJzaW9uOiAxLjAuMAogIHRpdGxlOiBFeGFtcGxlIGNvZGUgZm9yIHRoZSBgbmFtZS1ub3JtYWxpemVyYCBvdXRwdXQgb3B0aW9uCnBhdGhzOgogIC9hcGkvcGV0cy97cGV0SWR9OgogICAgZ2V0OgogICAgICBzdW1tYXJ5OiBHZXQgcGV0IGdpdmVuIGlkZW50aWZpZXIuCiAgICAgIG9wZXJhdGlvbklkOiBnZXRIdHRwUGV0CiAgICAgIHBhcmFtZXRlcnM6CiAgICAgIC0gbmFtZTogcGV0SWQKICAgICAgICBpbjogcGF0aAogICAgICAgIHJlcXVpcmVkOiB0cnVlCiAgICAgICAgc2NoZW1hOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgIHJlc3BvbnNlczoKICAgICAgICAnMjAwJzoKICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWxpZCBwZXQKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL1BldCcKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgUGV0OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSB1dWlkCiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgdXVpZDoKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwZXQgdXVpZC4KICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBkZXNjcmlwdGlvbjogVGhlIG5hbWUgb2YgdGhlIHBldC4KICAgIEVycm9yOgogICAgICByZXF1aXJlZDoKICAgICAgICAtIGNvZGUKICAgICAgICAtIG1lc3NhZ2UKICAgICAgcHJvcGVydGllczoKICAgICAgICBjb2RlOgogICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgICAgZm9ybWF0OiBpbnQzMgogICAgICAgICAgZGVzY3JpcHRpb246IEVycm9yIGNvZGUKICAgICAgICBtZXNzYWdlOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBkZXNjcmlwdGlvbjogRXJyb3IgbWVzc2FnZQogICAgT25lT2YydGhpbmdzOgogICAgICBkZXNjcmlwdGlvbjogIk5vdGljZSB0aGF0IHRoZSBgdGhpbmdzYCBpcyBub3QgY2FwaXRhbGlzZWQiCiAgICAgIG9uZU9mOgogICAgICAgIC0gdHlwZTogb2JqZWN0CiAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgLSBpZAogICAgICAgICAgcHJvcGVydGllczoKICAgICAgICAgICAgaWQ6CiAgICAgICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgIC0gdHlwZTogb2JqZWN0CiAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgLSBpZAogICAgICAgICAgcHJvcGVydGllczoKICAgICAgICAgICAgaWQ6CiAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAgICAgZm9ybWF0OiB1dWlkCmBgYAoKVGhpcyB3aWxsIHByb2R1Y2U6CgpgYGBnbwovLyBPbmVPZjJ0aGluZ3MgTm90aWNlIHRoYXQgdGhlIGB0aGluZ3NgIGlzIG5vdCBjYXBpdGFsaXNlZAp0eXBlIE9uZU9mMnRoaW5ncyBzdHJ1Y3QgewoJdW5pb24ganNvbi5SYXdNZXNzYWdlCn0KCi8vIFBldCBkZWZpbmVzIG1vZGVsIGZvciBQZXQuCnR5cGUgUGV0IHN0cnVjdCB7CgkvLyBOYW1lIFRoZSBuYW1lIG9mIHRoZSBwZXQuCglOYW1lIHN0cmluZyBganNvbjoibmFtZSJgCgoJLy8gVVVJRCBUaGUgcGV0IHV1aWQuCglVVUlEIHN0cmluZyBganNvbjoidXVpZCJgCn0KCi8vIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGNsaWVudCBhYm92ZS4KdHlwZSBDbGllbnRJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCS8vIEdldEhUVFBQZXQgcmVxdWVzdAoJR2V0SFRUUFBldChjdHggY29udGV4dC5Db250ZXh0LCBwZXRJRCBzdHJpbmcsIHJlcUVkaXRvcnMgLi4uUmVxdWVzdEVkaXRvckZuKSAoKmh0dHAuUmVzcG9uc2UsIGVycm9yKQp9CmBgYAoKPC9kZXRhaWxzPgoKCkZvciBtb3JlIGRldGFpbHMgb2Ygd2hhdCB0aGUgcmVzdWx0aW5nIGNvZGUgbG9va3MgbGlrZSwgY2hlY2sgb3V0IFt0aGUgdGVzdCBjYXNlc10oaW50ZXJuYWwvdGVzdC9vdXRwdXRvcHRpb25zL25hbWUtbm9ybWFsaXplci8pLgoKIyMgRXhhbXBsZXMKClRoZSBbZXhhbXBsZXMgZGlyZWN0b3J5XShleGFtcGxlcykgY29udGFpbnMgc29tZSBhZGRpdGlvbmFsIGNhc2VzIHdoaWNoIGFyZSB1c2VmdWwgZXhhbXBsZXMgZm9yIGhvdyB0byB1c2UgYG9hcGktY29kZWdlbmAsIGluY2x1ZGluZyBob3cgeW91J2QgdGFrZSB0aGUgUGV0c3RvcmUgQVBJIGFuZCBpbXBsZW1lbnQgaXQgd2l0aCBgb2FwaS1jb2RlZ2VuYC4KCllvdSBjb3VsZCBhbHNvIGZpbmQgc29tZSBjYXNlcyBvZiBob3cgdGhlIHByb2plY3QgY2FuIGJlIHVzZWQgYnkgY2hlY2tpbmcgb3V0IG91ciBbaW50ZXJuYWwgdGVzdCBjYXNlc10oaW50ZXJuYWwvdGVzdCkgd2hpY2ggYXJlIHJlYWwtd29ybGQgdXNhZ2VzIHRoYXQgbWFrZSB1cCBvdXIgcmVncmVzc2lvbiB0ZXN0cy4KCiMjIyBCbG9nIHBvc3RzCgpXZSBsb3ZlIHJlYWRpbmcgcG9zdHMgYnkgdGhlIGNvbW11bml0eSBhYm91dCBob3cgdG8gdXNlIHRoZSBwcm9qZWN0LgoKSGVyZSBhcmUgYSBmZXcgd2UndmUgZm91bmQgYXJvdW5kIHRoZSBXZWI6CgotIFtCdWlsZGluZyBhIEdvIFJFU1RmdWwgQVBJIHdpdGggZGVzaWduLWZpcnN0IE9wZW5BUEkgY29udHJhY3RzXShodHRwczovL3d3dy5qdnQubWUvcG9zdHMvMjAyMi8wNy8xMi9nby1vcGVuYXBpLXNlcnZlci8pCi0gW0EgUHJhY3RpY2FsIEd1aWRlIHRvIFVzaW5nIG9hcGktY29kZWdlbiBpbiBHb2xhbmcgQVBJIERldmVsb3BtZW50IHdpdGggdGhlIEZpYmVyIEZyYW1ld29ya10oaHR0cHM6Ly9tZWRpdW0uY29tL0BmaWtpaGFsYW4vYS1wcmFjdGljYWwtZ3VpZGUtdG8tdXNpbmctb2FwaS1jb2RlZ2VuLWluLWdvbGFuZy1hcGktZGV2ZWxvcG1lbnQtd2l0aC10aGUtZmliZXItZnJhbWV3b3JrLWJjZTJhNTkzODBhZSkKLSBbR2VuZXJhdGluZyBHbyBzZXJ2ZXIgY29kZSBmcm9tIE9wZW5BUEkgMyBkZWZpbml0aW9uc10oaHR0cHM6Ly9sZGVqLm5sL3Bvc3QvZ2VuZXJhdGluZy1nby1mcm9tLW9wZW5hcGktMy8pCi0gW0dvIENsaWVudCBDb2RlIEdlbmVyYXRpb24gZnJvbSBTd2FnZ2VyIGFuZCBPcGVuQVBJXShodHRwczovL21lZGl1bS5jb20vQGt5b2RvLXRlY2gvZ28tY2xpZW50LWNvZGUtZ2VuZXJhdGlvbi1mcm9tLXN3YWdnZXItYW5kLW9wZW5hcGktYTA1NzY4MzE4MzZjKQotIFtHbyBvYXBpLWNvZGVnZW4gKyByZXF1ZXN0IHZhbGlkYXRpb25dKGh0dHBzOi8vYmxvZy5jb21taXRzbWFydC5jb20vZ28tb2FwaS1jb2RlZ2VuLXJlcXVlc3QtdmFsaWRhdGlvbi0yODUzOThiMzdkYzgpCi0gW1N0cmVhbWxpbmluZyBHbyArIENoaSBEZXZlbG9wbWVudDogR2VuZXJhdGluZyBDb2RlIGZyb20gYW4gT3BlbkFQSSBTcGVjXShodHRwczovL2k0by5kZXYvYmxvZy9vYXBpLWNvZGVnZW4td2l0aC1jaGktcm91dGVyKQoKR290IG9uZSB0byBhZGQ/IFBsZWFzZSByYWlzZSBhIFBSIQoKIyMgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMgKEZBUXMpCgojIyMgSG93IGRvZXMgYG9hcGktY29kZWdlbmAgaGFuZGxlIGBhbnlPZmAsIGBhbGxPZmAgYW5kIGBvbmVPZmA/Cgpgb2FwaS1jb2RlZ2VuYCBzdXBwb3J0cyBgYW55T2ZgLCBgYWxsT2ZgIGFuZCBgb25lT2ZgIGZvciBnZW5lcmF0ZWQgY29kZS4KCkZvciBpbnN0YW5jZSwgdGhyb3VnaCB0aGUgZm9sbG93aW5nIE9wZW5BUEkgc3BlYzoKCmBgYHlhbWwKb3BlbmFwaTogIjMuMC4wIgppbmZvOgogIHZlcnNpb246IDEuMC4wCiAgdGl0bGU6IFVzaW5nIGNvbXBsZXggc2NoZW1hcwogIGRlc2NyaXB0aW9uOiBBbiBleGFtcGxlIG9mIGBhbnlPZmAsIGBhbGxPZmAgYW5kIGBvbmVPZmAKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgIyBiYXNlIHR5cGVzCiAgICBDbGllbnQ6CiAgICAgIHR5cGU6IG9iamVjdAogICAgICByZXF1aXJlZDoKICAgICAgICAtIG5hbWUKICAgICAgcHJvcGVydGllczoKICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICBJZGVudGl0eToKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gaXNzdWVyCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgaXNzdWVyOgogICAgICAgICAgdHlwZTogc3RyaW5nCgogICAgIyBhbGxPZiBwZXJmb3JtcyBhIHVuaW9uIG9mIGFsbCB0eXBlcyBkZWZpbmVkCiAgICBDbGllbnRXaXRoSWQ6CiAgICAgIGFsbE9mOgogICAgICAgIC0gJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL0NsaWVudCcKICAgICAgICAtIHByb3BlcnRpZXM6CiAgICAgICAgICAgIGlkOgogICAgICAgICAgICAgIHR5cGU6IGludGVnZXIKICAgICAgICAgIHJlcXVpcmVkOgogICAgICAgICAgICAtIGlkCgogICAgIyBhbGxPZiBwZXJmb3JtcyBhIHVuaW9uIG9mIGFsbCB0eXBlcyBkZWZpbmVkLCBidXQgaWYgdGhlcmUncyBhIGR1cGxpY2F0ZSBmaWVsZCBkZWZpbmVkLCBpdCdsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgbGFzdCBzY2hlbWEKICAgICMgaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vaXNzdWVzLzE1NjkKICAgIElkZW50aXR5V2l0aER1cGxpY2F0ZUZpZWxkOgogICAgICBhbGxPZjoKICAgICAgICAjIGBpc3N1ZXJgIHdpbGwgYmUgaWdub3JlZAogICAgICAgIC0gJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL0lkZW50aXR5JwogICAgICAgICMgYGlzc3VlcmAgd2lsbCBiZSBpZ25vcmVkCiAgICAgICAgLSBwcm9wZXJ0aWVzOgogICAgICAgICAgICBpc3N1ZXI6CiAgICAgICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgICMgYGlzc3VlcmAgd2lsbCB0YWtlIHByZWNlZGVuY2UKICAgICAgICAtIHByb3BlcnRpZXM6CiAgICAgICAgICAgIGlzc3VlcjoKICAgICAgICAgICAgICB0eXBlOiBvYmplY3QKICAgICAgICAgICAgICBwcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgbmFtZToKICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAgICAgcmVxdWlyZWQ6CiAgICAgICAgICAgICAgICAtIG5hbWUKCiAgICAjIGFueU9mIHJlc3VsdHMgaW4gYSB0eXBlIHRoYXQgaGFzIGFuIGBBc0NsaWVudGAvYE1lcmdlQ2xpZW50YC9gRnJvbUNsaWVudGAgYW5kIGFuIGBBc0lkZW50aXR5YC9gTWVyZ2VJZGVudGl0eWAvYEZyb21JZGVudGl0eWAgbWV0aG9kIHNvIHlvdSBjYW4gY2hvb3NlIHdoaWNoIG9mIHRoZW0geW91IHdhbnQgdG8gcmV0cmlldmUKICAgIENsaWVudEFuZE1heWJlSWRlbnRpdHk6CiAgICAgIGFueU9mOgogICAgICAgIC0gJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL0NsaWVudCcKICAgICAgICAtICRyZWY6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9JZGVudGl0eScKCiAgICAjIG9uZU9mIHJlc3VsdHMgaW4gYSB0eXBlIHRoYXQgaGFzIGFuIGBBc0NsaWVudGAvYE1lcmdlQ2xpZW50YC9gRnJvbUNsaWVudGAgYW5kIGFuIGBBc0lkZW50aXR5YC9gTWVyZ2VJZGVudGl0eWAvYEZyb21JZGVudGl0eWAgbWV0aG9kIHNvIHlvdSBjYW4gY2hvb3NlIHdoaWNoIG9mIHRoZW0geW91IHdhbnQgdG8gcmV0cmlldmUKICAgIENsaWVudE9ySWRlbnRpdHk6CiAgICAgIG9uZU9mOgogICAgICAgIC0gJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL0NsaWVudCcKICAgICAgICAtICRyZWY6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9JZGVudGl0eScKYGBgCgpUaGlzIHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyB0eXBlczoKCjxkZXRhaWxzPgoKPHN1bW1hcnk+QmFzZSB0eXBlczwvc3VtbWFyeT4KCmBgYGdvCi8vIENsaWVudCBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnQuCnR5cGUgQ2xpZW50IHN0cnVjdCB7CglOYW1lIHN0cmluZyBganNvbjoibmFtZSJgCn0KCi8vIElkZW50aXR5IGRlZmluZXMgbW9kZWwgZm9yIElkZW50aXR5Lgp0eXBlIElkZW50aXR5IHN0cnVjdCB7CglJc3N1ZXIgc3RyaW5nIGBqc29uOiJpc3N1ZXIiYAp9CmBgYAoKPC9kZXRhaWxzPgoKPGRldGFpbHM+Cgo8c3VtbWFyeT48Y29kZT5hbGxPZjwvY29kZT48L3N1bW1hcnk+CgpgYGBnbwovLyBDbGllbnRXaXRoSWQgZGVmaW5lcyBtb2RlbCBmb3IgQ2xpZW50V2l0aElkLgp0eXBlIENsaWVudFdpdGhJZCBzdHJ1Y3QgewoJSWQgICBpbnQgICAgYGpzb246ImlkImAKCU5hbWUgc3RyaW5nIGBqc29uOiJuYW1lImAKfQoKLy8gSWRlbnRpdHlXaXRoRHVwbGljYXRlRmllbGQgZGVmaW5lcyBtb2RlbCBmb3IgSWRlbnRpdHlXaXRoRHVwbGljYXRlRmllbGQuCnR5cGUgSWRlbnRpdHlXaXRoRHVwbGljYXRlRmllbGQgc3RydWN0IHsKCUlzc3VlciBzdHJ1Y3QgewoJCU5hbWUgc3RyaW5nIGBqc29uOiJuYW1lImAKCX0gYGpzb246Imlzc3VlciJgCn0KYGBgCgo8L2RldGFpbHM+Cgo8ZGV0YWlscz4KCjxzdW1tYXJ5Pjxjb2RlPmFueU9mPC9jb2RlPjwvc3VtbWFyeT4KCmBgYGdvCmltcG9ydCAoCgkiZW5jb2RpbmcvanNvbiIKCgkiZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vcnVudGltZSIKKQoKLy8gQ2xpZW50QW5kTWF5YmVJZGVudGl0eSBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnRBbmRNYXliZUlkZW50aXR5Lgp0eXBlIENsaWVudEFuZE1heWJlSWRlbnRpdHkgc3RydWN0IHsKCXVuaW9uIGpzb24uUmF3TWVzc2FnZQp9CgovLyBBc0NsaWVudCByZXR1cm5zIHRoZSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSBhcyBhIENsaWVudApmdW5jICh0IENsaWVudEFuZE1heWJlSWRlbnRpdHkpIEFzQ2xpZW50KCkgKENsaWVudCwgZXJyb3IpIHsKCXZhciBib2R5IENsaWVudAoJZXJyIDo9IGpzb24uVW5tYXJzaGFsKHQudW5pb24sICZib2R5KQoJcmV0dXJuIGJvZHksIGVycgp9CgovLyBGcm9tQ2xpZW50IG92ZXJ3cml0ZXMgYW55IHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRBbmRNYXliZUlkZW50aXR5IGFzIHRoZSBwcm92aWRlZCBDbGllbnQKZnVuYyAodCAqQ2xpZW50QW5kTWF5YmVJZGVudGl0eSkgRnJvbUNsaWVudCh2IENsaWVudCkgZXJyb3IgewoJYiwgZXJyIDo9IGpzb24uTWFyc2hhbCh2KQoJdC51bmlvbiA9IGIKCXJldHVybiBlcnIKfQoKLy8gTWVyZ2VDbGllbnQgcGVyZm9ybXMgYSBtZXJnZSB3aXRoIGFueSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSwgdXNpbmcgdGhlIHByb3ZpZGVkIENsaWVudApmdW5jICh0ICpDbGllbnRBbmRNYXliZUlkZW50aXR5KSBNZXJnZUNsaWVudCh2IENsaWVudCkgZXJyb3IgewoJYiwgZXJyIDo9IGpzb24uTWFyc2hhbCh2KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCW1lcmdlZCwgZXJyIDo9IHJ1bnRpbWUuSlNPTk1lcmdlKHQudW5pb24sIGIpCgl0LnVuaW9uID0gbWVyZ2VkCglyZXR1cm4gZXJyCn0KCi8vIEFzSWRlbnRpdHkgcmV0dXJucyB0aGUgdW5pb24gZGF0YSBpbnNpZGUgdGhlIENsaWVudEFuZE1heWJlSWRlbnRpdHkgYXMgYSBJZGVudGl0eQpmdW5jICh0IENsaWVudEFuZE1heWJlSWRlbnRpdHkpIEFzSWRlbnRpdHkoKSAoSWRlbnRpdHksIGVycm9yKSB7Cgl2YXIgYm9keSBJZGVudGl0eQoJZXJyIDo9IGpzb24uVW5tYXJzaGFsKHQudW5pb24sICZib2R5KQoJcmV0dXJuIGJvZHksIGVycgp9CgovLyBGcm9tSWRlbnRpdHkgb3ZlcndyaXRlcyBhbnkgdW5pb24gZGF0YSBpbnNpZGUgdGhlIENsaWVudEFuZE1heWJlSWRlbnRpdHkgYXMgdGhlIHByb3ZpZGVkIElkZW50aXR5CmZ1bmMgKHQgKkNsaWVudEFuZE1heWJlSWRlbnRpdHkpIEZyb21JZGVudGl0eSh2IElkZW50aXR5KSBlcnJvciB7CgliLCBlcnIgOj0ganNvbi5NYXJzaGFsKHYpCgl0LnVuaW9uID0gYgoJcmV0dXJuIGVycgp9CgovLyBNZXJnZUlkZW50aXR5IHBlcmZvcm1zIGEgbWVyZ2Ugd2l0aCBhbnkgdW5pb24gZGF0YSBpbnNpZGUgdGhlIENsaWVudEFuZE1heWJlSWRlbnRpdHksIHVzaW5nIHRoZSBwcm92aWRlZCBJZGVudGl0eQpmdW5jICh0ICpDbGllbnRBbmRNYXliZUlkZW50aXR5KSBNZXJnZUlkZW50aXR5KHYgSWRlbnRpdHkpIGVycm9yIHsKCWIsIGVyciA6PSBqc29uLk1hcnNoYWwodikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCgltZXJnZWQsIGVyciA6PSBydW50aW1lLkpTT05NZXJnZSh0LnVuaW9uLCBiKQoJdC51bmlvbiA9IG1lcmdlZAoJcmV0dXJuIGVycgp9CgpmdW5jICh0IENsaWVudEFuZE1heWJlSWRlbnRpdHkpIE1hcnNoYWxKU09OKCkgKFtdYnl0ZSwgZXJyb3IpIHsKCWIsIGVyciA6PSB0LnVuaW9uLk1hcnNoYWxKU09OKCkKCXJldHVybiBiLCBlcnIKfQoKZnVuYyAodCAqQ2xpZW50QW5kTWF5YmVJZGVudGl0eSkgVW5tYXJzaGFsSlNPTihiIFtdYnl0ZSkgZXJyb3IgewoJZXJyIDo9IHQudW5pb24uVW5tYXJzaGFsSlNPTihiKQoJcmV0dXJuIGVycgp9CgoKYGBgCgo8L2RldGFpbHM+Cgo8ZGV0YWlscz4KCjxzdW1tYXJ5Pjxjb2RlPm9uZU9mPC9jb2RlPjwvc3VtbWFyeT4KCmBgYGdvCi8vIEFzQ2xpZW50IHJldHVybnMgdGhlIHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRPcklkZW50aXR5IGFzIGEgQ2xpZW50CmZ1bmMgKHQgQ2xpZW50T3JJZGVudGl0eSkgQXNDbGllbnQoKSAoQ2xpZW50LCBlcnJvcikgewoJdmFyIGJvZHkgQ2xpZW50CgllcnIgOj0ganNvbi5Vbm1hcnNoYWwodC51bmlvbiwgJmJvZHkpCglyZXR1cm4gYm9keSwgZXJyCn0KCi8vIEZyb21DbGllbnQgb3ZlcndyaXRlcyBhbnkgdW5pb24gZGF0YSBpbnNpZGUgdGhlIENsaWVudE9ySWRlbnRpdHkgYXMgdGhlIHByb3ZpZGVkIENsaWVudApmdW5jICh0ICpDbGllbnRPcklkZW50aXR5KSBGcm9tQ2xpZW50KHYgQ2xpZW50KSBlcnJvciB7CgliLCBlcnIgOj0ganNvbi5NYXJzaGFsKHYpCgl0LnVuaW9uID0gYgoJcmV0dXJuIGVycgp9CgovLyBNZXJnZUNsaWVudCBwZXJmb3JtcyBhIG1lcmdlIHdpdGggYW55IHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRPcklkZW50aXR5LCB1c2luZyB0aGUgcHJvdmlkZWQgQ2xpZW50CmZ1bmMgKHQgKkNsaWVudE9ySWRlbnRpdHkpIE1lcmdlQ2xpZW50KHYgQ2xpZW50KSBlcnJvciB7CgliLCBlcnIgOj0ganNvbi5NYXJzaGFsKHYpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJbWVyZ2VkLCBlcnIgOj0gcnVudGltZS5KU09OTWVyZ2UodC51bmlvbiwgYikKCXQudW5pb24gPSBtZXJnZWQKCXJldHVybiBlcnIKfQoKLy8gQXNJZGVudGl0eSByZXR1cm5zIHRoZSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50T3JJZGVudGl0eSBhcyBhIElkZW50aXR5CmZ1bmMgKHQgQ2xpZW50T3JJZGVudGl0eSkgQXNJZGVudGl0eSgpIChJZGVudGl0eSwgZXJyb3IpIHsKCXZhciBib2R5IElkZW50aXR5CgllcnIgOj0ganNvbi5Vbm1hcnNoYWwodC51bmlvbiwgJmJvZHkpCglyZXR1cm4gYm9keSwgZXJyCn0KCi8vIEZyb21JZGVudGl0eSBvdmVyd3JpdGVzIGFueSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50T3JJZGVudGl0eSBhcyB0aGUgcHJvdmlkZWQgSWRlbnRpdHkKZnVuYyAodCAqQ2xpZW50T3JJZGVudGl0eSkgRnJvbUlkZW50aXR5KHYgSWRlbnRpdHkpIGVycm9yIHsKCWIsIGVyciA6PSBqc29uLk1hcnNoYWwodikKCXQudW5pb24gPSBiCglyZXR1cm4gZXJyCn0KCi8vIE1lcmdlSWRlbnRpdHkgcGVyZm9ybXMgYSBtZXJnZSB3aXRoIGFueSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50T3JJZGVudGl0eSwgdXNpbmcgdGhlIHByb3ZpZGVkIElkZW50aXR5CmZ1bmMgKHQgKkNsaWVudE9ySWRlbnRpdHkpIE1lcmdlSWRlbnRpdHkodiBJZGVudGl0eSkgZXJyb3IgewoJYiwgZXJyIDo9IGpzb24uTWFyc2hhbCh2KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCW1lcmdlZCwgZXJyIDo9IHJ1bnRpbWUuSlNPTk1lcmdlKHQudW5pb24sIGIpCgl0LnVuaW9uID0gbWVyZ2VkCglyZXR1cm4gZXJyCn0KCmZ1bmMgKHQgQ2xpZW50T3JJZGVudGl0eSkgTWFyc2hhbEpTT04oKSAoW11ieXRlLCBlcnJvcikgewoJYiwgZXJyIDo9IHQudW5pb24uTWFyc2hhbEpTT04oKQoJcmV0dXJuIGIsIGVycgp9CgpmdW5jICh0ICpDbGllbnRPcklkZW50aXR5KSBVbm1hcnNoYWxKU09OKGIgW11ieXRlKSBlcnJvciB7CgllcnIgOj0gdC51bmlvbi5Vbm1hcnNoYWxKU09OKGIpCglyZXR1cm4gZXJyCn0KYGBgCgo8L2RldGFpbHM+CgpGb3IgbW9yZSBpbmZvLCBjaGVjayBvdXQgW3RoZSBleGFtcGxlIGNvZGVdKGV4YW1wbGVzL2FueW9mLWFsbG9mLW9uZW9mLykuCgojIyMgSG93IGNhbiBJIGlnbm9yZSBwYXJ0cyBvZiB0aGUgc3BlYyBJIGRvbid0IGNhcmUgYWJvdXQ/CgpCeSBkZWZhdWx0LCBgb2FwaS1jb2RlZ2VuYCB3aWxsIGdlbmVyYXRlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbi4KCklmIHlvdSdkIGxpa2UgdG8gcmVkdWNlIHdoYXQncyBnZW5lcmF0ZWQsIHlvdSBjYW4gdXNlIG9uZSBvZiBhIGZldyBvcHRpb25zIGluIFt0aGUgY29uZmlndXJhdGlvbiBmaWxlXSgjdXNhZ2UpIHRvIHR1bmUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIHJlc3VsdGluZyBvdXRwdXQ6CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6ICRzY2hlbWE9aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vSEVBRC9jb25maWd1cmF0aW9uLXNjaGVtYS5qc29uCm91dHB1dC1vcHRpb25zOgogIGluY2x1ZGUtdGFnczogW10KICBleGNsdWRlLXRhZ3M6IFtdCiAgaW5jbHVkZS1vcGVyYXRpb24taWRzOiBbXQogIGV4Y2x1ZGUtb3BlcmF0aW9uLWlkczogW10KICBleGNsdWRlLXNjaGVtYXM6IFtdCmBgYAoKQ2hlY2sgW3RoZSBkb2NzXShodHRwczovL3BrZy5nby5kZXYvZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyL3BrZy9jb2RlZ2VuI091dHB1dE9wdGlvbnMpIGZvciBtb3JlIGRldGFpbHMgb2YgdXNhZ2UuCgojIyMgU2hvdWxkIEkgY29tbWl0IHRoZSBnZW5lcmF0ZWQgY29kZT8KCldlIHJlY29tbWVuZCBkb2luZyBzbywgeWVzLCBmb3IgdGhlIGZvbGxvd2luZyByZWFzb25zOgoKLSBJdCBtZWFucyBpdCdzIGVhc2llciB0byB2aWV3IHRoZSBpbXBhY3Qgb2YgYSBjaGFuZ2UgLSBiZSBpdCBkdWUgdG8gYW4gdXBncmFkZSBvZiBgb2FwaS1jb2RlZ2VuYCwgb3IgYSBjaGFuZ2UgdG8geW91ciBzcGVjIC0gYW5kIGhhcyBoZWxwZWQgY2F0Y2ggKHBvc3NpYmx5KSBicmVha2luZyBjaGFuZ2VzIGluIHRoZSBwYXN0IG1vcmUgZWFzaWx5Ci0gSXQgdGhlbiBhbGxvd3MgeW91ciBjb2RlYmFzZSB0byBiZSBjb25zdW1lZCBhcyBhIGxpYnJhcnksIGFzIGFsbCB0aGUgZmlsZXMgYXJlIGNvbW1pdHRlZAoKVGhpcyBtZWFucyB5b3UnbGwgbmVlZCB0byBoYXZlIHlvdXIgQ0kvQ0QgcGlwZWxpbmUgdmFsaWRhdGUgdGhhdCBnZW5lcmF0ZWQgZmlsZXMgYXJlIGFsbCB1cC10by1kYXRlLCBidXQgdGhhdCdzIGEgZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZCBwaWVjZSBvZiB3b3JrLgoKIyMjIFNob3VsZCBJIGxpbnQgdGhlIGdlbmVyYXRlZCBjb2RlPwoKV2UgcmVhbGx5IGFzayB0aGF0IHlvdSBkb24ndC4gQWx0aG91Z2ggaXQgaW50ZW5kcyB0byBiZSBpZGlvbWF0aWMgR28gY29kZSwgaXQncyBub3QgZXhwZWN0ZWQgdG8gcGFzcyBhbGwgdGhlIHZhcmlvdXMgbGludGluZyBydWxlcyB0aGF0IHlvdXIgcHJvamVjdCBtYXkgYXBwbHkuCgo+IFshTk9URV0KPiBXZSB3aWxsLCBvbiBvY2Nhc2lvbiwgaW1wcm92ZSB0aGUgZ2VuZXJhdGVkIGNvZGUgdG8gZml4IHNvbWUgbGludGluZyB3YXJuaW5ncywgc3VjaCBhcyB0aG9zZSBmcm9tIGBnbyB2ZXRgLCBidXQgdGhpcyBzaG91bGQgbm90IGJlIGFuIGV4cGVjdGVkIGNoYW5nZS4KCiMjIyBJJ3ZlIGp1c3QgdXBkYXRlZCBteSB2ZXJzaW9uIG9mIGBraW4tb3BlbmFwaWAsIGFuZCBub3cgSSBjYW4ndCBidWlsZCBteSBjb2RlIPCfmKAKClRoZSBba2luLW9wZW5hcGldKGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRraW4va2luLW9wZW5hcGkpIHByb2plY3QgLSB3aGljaCB3ZSDwn5KcIGZvciBwcm92aWRpbmcgYSBncmVhdCBsaWJyYXJ5IGFuZCBzZXQgb2YgdG9vbGluZyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBPcGVuQVBJIC0gaXMgYSBwcmUtdjEgcmVsZWFzZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGV5J3JlIHdpdGhpbiB0aGVpciByaWdodHMgdG8gcHVzaCBicmVha2luZyBjaGFuZ2VzLgoKVGhpcyBtYXkgbGVhZCB0byBicmVha2FnZSBpbiB5b3VyIGNvbnN1bWluZyBjb2RlLCBhbmQgaWYgc28sIHNvcnJ5IHRoYXQncyBoYXBwZW5lZCEKCldlJ2xsIGJlIGF3YXJlIG9mIHRoZSBpc3N1ZSwgYW5kIHdpbGwgd29yayB0byB1cGRhdGUgYm90aCB0aGUgY29yZSBgb2FwaS1jb2RlZ2VuYCBhbmQgdGhlIG1pZGRsZXdhcmVzIGFjY29yZGluZ2x5LgoKIyMgQ29udHJpYnV0b3JzCgpXZSdyZSB2ZXJ5IGFwcHJlY2lhdGl2ZSBvZiBbdGhlIG1hbnkgY29udHJpYnV0b3JzIG92ZXIgdGhlIHllYXJzXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9ncmFwaHMvY29udHJpYnV0b3JzKSBhbmQgdGhlIG9uZ29pbmcgdXNlIG9mIHRoZSBwcm9qZWN0IPCfkpwKCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL2dyYXBocy9jb250cmlidXRvcnMiPgogIDxpbWcgc3JjPSJodHRwczovL2NvbnRyaWIucm9ja3MvaW1hZ2U/cmVwbz1vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuIiAvPgo8L2E+CgojIyBTcG9uc29ycwoKRm9yIHRoZSBtb3N0IHBhcnQsIGBvYXBpLWNvZGVnZW5gIGlzIG1haW50YWluZWQgaW4gdHdvIGJ1c3kgcGVvcGxlcycgZnJlZSB0aW1lLiBBcyBub3RlZCBpbiBbQ3JlYXRpbmcgYSBtb3JlIHN1c3RhaW5hYmxlIG1vZGVsIGZvciBgb2FwaS1jb2RlZ2VuYCBpbiB0aGUgZnV0dXJlXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9kaXNjdXNzaW9ucy8xNjA2KSwgd2UncmUgbG9va2luZyB0byBtYWtlIHRoaXMgYSBtb3JlIHN1c3RhaW5hYmxlIHByb2plY3QgaW4gdGhlIGZ1dHVyZS4KClBsZWFzZSBjb25zaWRlciBzcG9uc29yaW5nIHVzIHRocm91Z2ggR2l0SHViIFNwb25zb3JzIGVpdGhlciBbb24gdGhlIG9yZ2FuaXNhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL29hcGktY29kZWdlbi8pIG9yIFtkaXJlY3RseSBmb3IgSmFtaWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycy9qYW1pZXRhbm5hLyksIHdoaWNoIGhlbHBzIHdvcmsgdG93YXJkcyB1cyBiZWluZyBhYmxlIHRvIG1haW50YWluIHRoZSBwcm9qZWN0IGxvbmcgdGVybS4KClNlZSBbdGhpcyBibG9nIHBvc3QgZnJvbSBUaWRlbGlmdF0oaHR0cHM6Ly9ibG9nLnRpZGVsaWZ0LmNvbS9wYXlpbmctbWFpbnRhaW5lcnMtdGhlLWhvd3RvKSBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byB0YWxrIHRvIHlvdXIgY29tcGFueSBhYm91dCBzcG9uc29yaW5nIG1haW50YWluZXJzIG9mIChPcGVuIFNvdXJjZSkgcHJvamVjdHMgeW91IGRlcGVuZCBvbi4KCldlIGFyZSBjdXJyZW50bHkgc3BvbnNvcmVkIGZvciA0IGhvdXJzIG9mIHdvcmsgYSBtb250aCBieSBFbGFzdGljOgoKPHAgYWxpZ249ImNlbnRlciI+Cgk8YSBocmVmPSJodHRwczovL2VsYXN0aWMuY28/dXRtX3NvdXJjZT1vYXBpLWNvZGVnZW4rcmVwbyZ1dG1fbWVkaXVtPWdpdGh1YitzcG9uc29yc2hpcCI+CgkJPHBpY3R1cmU+CgkJICA8c291cmNlIG1lZGlhPSIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSIgc3Jjc2V0PSIuZ2l0aHViL3Nwb25zb3JzL2VsYXN0aWMtbGlnaHQuc3ZnIj4KCQkgIDxzb3VyY2UgbWVkaWE9IihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiIHNyY3NldD0iLmdpdGh1Yi9zcG9uc29ycy9lbGFzdGljLWRhcmsuc3ZnIj4KCQkgIDxpbWcgYWx0PSJFbGFzdGljIGxvZ28iIHNyYz0iLmdpdGh1Yi9zcG9uc29ycy9lbGFzdGljLWRhcmsuc3ZnIiBoZWlnaHQ9IjEwMHB4Ij4KCQk8L3BpY3R1cmU+Cgk8L2E+CjwvcD4KCkluIGFkZGl0aW9uLCB3ZSBhcmUgYWxzbyBnZW5lcm91c2x5IHNwb25zb3JlZCBieSB0aGUgZm9sbG93aW5nIGZvbGtzLCBlYWNoIG9mIHdob20gcHJvdmlkZSBzcG9uc29yc2hpcCBmb3IgMSBob3VyIG9mIHdvcmsgYSBtb250aDoKCjxwIGFsaWduPSJjZW50ZXIiPgoJPGEgaHJlZj0iaHR0cHM6Ly93d3cuZGV2emVyby5pby9scC9kZXYtZW52aXJvbm1lbnQ/dXRtX2NhbXBhaWduPWdpdGh1YiZ1dG1fc291cmNlPW9hcGktY29kZWdlbiUyMHJlcG8mdXRtX21lZGl1bT1naXRodWIlMjBzcG9uc29yc2hpcCI+CgkJPHBpY3R1cmU+CgkJICA8c291cmNlIG1lZGlhPSIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSIgc3Jjc2V0PSIuZ2l0aHViL3Nwb25zb3JzL2Rldnplcm8tbGlnaHQuc3ZnIj4KCQkgIDxzb3VyY2UgbWVkaWE9IihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiIHNyY3NldD0iLmdpdGh1Yi9zcG9uc29ycy9kZXZ6ZXJvLWRhcmsuc3ZnIj4KCQkgIDxpbWcgYWx0PSJEZXZaZXJvIGxvZ28iIHNyYz0iLmdpdGh1Yi9zcG9uc29ycy9kZXZ6ZXJvLWRhcmsuc3ZnIiBoZWlnaHQ9IjEwMHB4Ij4KCQk8L3BpY3R1cmU+Cgk8L2E+CjwvcD4KCjxwIGFsaWduPSJjZW50ZXIiPgoJPGEgaHJlZj0iaHR0cHM6Ly9zcGVha2Vhc3kuY29tP3V0bV9zb3VyY2U9b2FwaS1jb2RlZ2VuK3JlcG8mdXRtX21lZGl1bT1naXRodWIrc3BvbnNvcnNoaXAiPgoJCTxwaWN0dXJlPgoJCSAgPHNvdXJjZSBtZWRpYT0iKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCkiIHNyY3NldD0iLmdpdGh1Yi9zcG9uc29ycy9zcGVha2Vhc3ktbGlnaHQuc3ZnIj4KCQkgIDxzb3VyY2UgbWVkaWE9IihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiIHNyY3NldD0iLmdpdGh1Yi9zcG9uc29ycy9zcGVha2Vhc3ktZGFyay5zdmciPgoJCSAgPGltZyBhbHQ9IlNwZWFrZWFzeSBsb2dvIiBzcmM9Ii5naXRodWIvc3BvbnNvcnMvc3BlYWtlYXN5LWRhcmsuc3ZnIiBoZWlnaHQ9IjEwMHB4Ij4KCQk8L3BpY3R1cmU+Cgk8L2E+CjwvcD4KCjxwIGFsaWduPSJjZW50ZXIiPgoJPGEgaHJlZj0iaHR0cHM6Ly9jeWJvenUuY28uanAvP3V0bV9zb3VyY2U9b2FwaS1jb2RlZ2VuK3JlcG8mdXRtX21lZGl1bT1naXRodWIrc3BvbnNvcnNoaXAiPgoJCTxpbWcgYWx0PSJDeWJvenUgbG9nbyIgc3JjPSIuZ2l0aHViL3Nwb25zb3JzL2N5Ym96dS5zdmciIGhlaWdodD0iMTAwcHgiPgoJPC9hPgo8L3A+CgooTm90ZSB0aGF0IHRoZSBvcmRlciBvZiBhcHBlYXJhbmNlIHRoZSBvcmRlciBpbiB3aGljaCBzcG9uc29yc2hpcCB3YXMgcmVjZWl2ZWQpCg==
+ readmeEtag: '"6cee104e2b45c5917ebb6874d11eead6f6cb97f4"'
+ readmeLastModified: Sun, 06 Oct 2024 19:56:30 GMT
repositoryId: 173009358
description: Generate Go client and server boilerplate from OpenAPI 3 specifications
created: '2019-02-27T23:59:59Z'
- updated: '2024-10-06T01:47:50Z'
+ updated: '2024-10-07T03:12:59Z'
language: Go
archived: false
- stars: 6116
+ stars: 6120
watchers: 36
forks: 845
owner: oapi-codegen
logo: https://avatars.githubusercontent.com/u/142752710?v=4
license: Apache-2.0
- repoEtag: '"2b41fc426df14545fb0dc2451873fd320568348b49c4d57b25068329659460c0"'
- repoLastModified: Sun, 06 Oct 2024 01:47:50 GMT
+ repoEtag: '"ca07d9046b924939db5ac44de52815d9d3b6df6994b540cd9a460b3693d42181"'
+ repoLastModified: Mon, 07 Oct 2024 03:12:59 GMT
foundInMaster: true
id: 770a221110cc4ef0e399089f5caf8694
oldLocations:
@@ -7709,17 +7709,17 @@
repositoryId: 161691324
description: Generate TypeScript types from OpenAPI 3 specs
created: '2018-12-13T20:28:01Z'
- updated: '2024-10-06T02:40:07Z'
+ updated: '2024-10-07T01:12:43Z'
language: TypeScript
archived: false
- stars: 5651
+ stars: 5652
watchers: 25
forks: 455
owner: openapi-ts
logo: https://avatars.githubusercontent.com/u/172838200?v=4
license: MIT
- repoEtag: '"31c0b12d8698d961df07b560b104967d49c14293a0fb314299dba0f394c83aaa"'
- repoLastModified: Sun, 06 Oct 2024 02:40:07 GMT
+ repoEtag: '"8d17aff031a5ea94575719f1da1d5b5ac4554183905dfe4d4f4ade80ac09e5ef"'
+ repoLastModified: Mon, 07 Oct 2024 01:12:43 GMT
foundInMaster: true
oldLocations:
- https://github.com/drwpow/openapi-typescript
@@ -7761,17 +7761,17 @@
🌐 Wikipedia for Web APIs. Directory of REST API definitions in OpenAPI
2.0/3.x format
created: '2015-02-22T19:58:12Z'
- updated: '2024-10-05T15:30:52Z'
+ updated: '2024-10-07T02:37:36Z'
language: null
archived: false
- stars: 3849
+ stars: 3851
watchers: 113
forks: 576
owner: APIs-guru
logo: https://avatars.githubusercontent.com/u/10975548?v=4
license: CC0-1.0
- repoEtag: '"379ace7804a21b2bc1662188564aa66a7ad17fba4c26ff61a2c7a52f14a60ea5"'
- repoLastModified: Sat, 05 Oct 2024 15:30:52 GMT
+ repoEtag: '"a64ba130085d8a53a1cac6c66d1627fb7b23bdaf45cbd793123d2809e7c8cb76"'
+ repoLastModified: Mon, 07 Oct 2024 02:37:36 GMT
foundInMaster: true
category: SDK
id: 667f2aef78d9d19418fbd6c0a7835abb
@@ -7795,17 +7795,17 @@
repositoryId: 196475719
description: Library for OpenAPI 3 with spring-boot
created: '2019-07-11T23:08:20Z'
- updated: '2024-10-05T23:54:09Z'
+ updated: '2024-10-06T20:24:20Z'
language: Java
archived: false
- stars: 3261
+ stars: 3263
watchers: 44
forks: 493
owner: springdoc
logo: https://avatars.githubusercontent.com/u/52804136?v=4
license: Apache-2.0
- repoEtag: '"d690fb35a547f718677c34feef550762af122a12f9ccfdf1fe4954f52a2a73ad"'
- repoLastModified: Sat, 05 Oct 2024 23:54:09 GMT
+ repoEtag: '"d27b3196694a5b994e3176989a716fb148a5836c4009228b66612f8d83bfa196"'
+ repoLastModified: Sun, 06 Oct 2024 20:24:20 GMT
foundInMaster: true
id: 901410cec129651fcf7374c79f824f27
- source: openapi3 tags
@@ -7821,17 +7821,17 @@
Docker image with Uvicorn managed by Gunicorn for high-performance FastAPI
web applications in Python with performance auto-tuning.
created: '2019-01-04T17:33:29Z'
- updated: '2024-10-01T23:36:39Z'
+ updated: '2024-10-06T19:15:39Z'
language: Python
archived: false
- stars: 2695
+ stars: 2697
watchers: 23
forks: 333
owner: tiangolo
logo: https://avatars.githubusercontent.com/u/1326112?v=4
license: MIT
- repoEtag: '"1e6fb0b1ff28d6327c379ace1e19dc202f94868729a72612e077bb95a017db35"'
- repoLastModified: Tue, 01 Oct 2024 23:36:39 GMT
+ repoEtag: '"362b1c40ea085c834b6b7035969eb6be2647aa2058933a466021b9ead5147f26"'
+ repoLastModified: Sun, 06 Oct 2024 19:15:39 GMT
foundInMaster: true
category: Server Implementations
id: d0f3fc0bd35fcadacc8ed2c531780739
@@ -7850,17 +7850,17 @@
Javascript library to connect to swagger-enabled APIs via browser or
nodejs
created: '2012-02-16T00:08:43Z'
- updated: '2024-10-03T23:57:45Z'
+ updated: '2024-10-06T16:45:56Z'
language: JavaScript
archived: false
- stars: 2621
+ stars: 2622
watchers: 98
- forks: 759
+ forks: 760
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"f2240c0e3f74bcad5bf1296160c3ea1b7a0a8f214c54040cdcd6d3f0d621ff10"'
- repoLastModified: Thu, 03 Oct 2024 23:57:45 GMT
+ repoEtag: '"ff0930e842b76913d72cba0c7c0c162ad9c55cb3ba0e72da8ee5604b6286b5b3"'
+ repoLastModified: Sun, 06 Oct 2024 16:45:56 GMT
foundInMaster: true
category: Code Generators
id: 5f98b79464c0723b688cff46ee3500c6
@@ -7876,17 +7876,17 @@
repositoryId: 244234763
description: Sane and flexible OpenAPI 3 schema generation for Django REST framework.
created: '2020-03-01T22:36:54Z'
- updated: '2024-10-03T15:10:09Z'
+ updated: '2024-10-06T17:35:11Z'
language: Python
archived: false
- stars: 2342
+ stars: 2343
watchers: 12
forks: 260
owner: tfranzel
logo: https://avatars.githubusercontent.com/u/13507857?v=4
license: BSD-3-Clause
- repoEtag: '"d472356d7b8ebb233043f7c83ca655bb1c1704312018be18c6222a42990d06c6"'
- repoLastModified: Thu, 03 Oct 2024 15:10:09 GMT
+ repoEtag: '"c0ece01f680f8490f925e5be48827a5935024480c696e6064b6fe25dba14d125"'
+ repoLastModified: Sun, 06 Oct 2024 17:35:11 GMT
foundInMaster: true
category: Server Implementations
id: 520f5c66c3e42a7b3fbface4f156c1dc
@@ -7904,17 +7904,17 @@
A fast serialization and validation library, with builtin support for
JSON, MessagePack, YAML, and TOML
created: '2021-01-26T02:53:57Z'
- updated: '2024-10-05T16:23:14Z'
+ updated: '2024-10-07T01:37:35Z'
language: Python
archived: false
- stars: 2294
+ stars: 2297
watchers: 19
forks: 67
owner: jcrist
logo: https://avatars.githubusercontent.com/u/2783717?v=4
license: BSD-3-Clause
- repoEtag: '"8cf2ace70361b6f6278f5e9359d69195b2b9c8aacf84dcaf948a583636721f5d"'
- repoLastModified: Sat, 05 Oct 2024 16:23:14 GMT
+ repoEtag: '"436892af034276837c6920aab0ec081da1fafec11ba3b6140b7981b717d7d5bb"'
+ repoLastModified: Mon, 07 Oct 2024 01:37:35 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -7937,7 +7937,7 @@
repositoryId: 203157084
description: Supercharge your API testing, catch bugs, and ensure compliance
created: '2019-08-19T11:13:01Z'
- updated: '2024-10-05T20:11:39Z'
+ updated: '2024-10-06T07:02:06Z'
language: Python
archived: false
stars: 2252
@@ -7946,8 +7946,8 @@
owner: schemathesis
logo: https://avatars.githubusercontent.com/u/70383271?v=4
license: MIT
- repoEtag: '"ef77cb52681fa2315337d7d4a979a572e7dfc8c9fc28d8867603deb710a1af55"'
- repoLastModified: Sat, 05 Oct 2024 20:11:39 GMT
+ repoEtag: '"c99297877e235e2a969865cf27cc027237a3571597c688eefe1564370342b049"'
+ repoLastModified: Sun, 06 Oct 2024 07:02:06 GMT
foundInMaster: true
id: f4032fb371a703acffa691c0f1239d45
oldLocations:
@@ -7992,7 +7992,7 @@
repositoryId: 165951750
description: RapiDoc -WebComponent for OpenAPI Spec
created: '2019-01-16T01:29:58Z'
- updated: '2024-10-05T01:54:33Z'
+ updated: '2024-10-06T19:54:04Z'
language: JavaScript
archived: false
stars: 1655
@@ -8001,8 +8001,8 @@
owner: rapi-doc
logo: https://avatars.githubusercontent.com/u/104180085?v=4
license: MIT
- repoEtag: '"7ef0dd6a2893e30536a0fc4a905168e59b5ec17b61dbbd770677c803d8277a33"'
- repoLastModified: Sat, 05 Oct 2024 01:54:33 GMT
+ repoEtag: '"c9f120ae5ffb84b566e41d8da260d6f9afa8a408af623dae1e40cc59c6e23791"'
+ repoLastModified: Sun, 06 Oct 2024 19:54:04 GMT
foundInMaster: true
category:
- Documentation
@@ -8028,11 +8028,11 @@
archived: false
stars: 1427
watchers: 18
- forks: 146
+ forks: 147
owner: OpenAPITools
logo: https://avatars.githubusercontent.com/u/37325267?v=4
license: Apache-2.0
- repoEtag: '"79116844e7b4684081966552c9918bb071218cbcbee2567d9a3dc0892e33ab3f"'
+ repoEtag: '"ea9878dbb7990e52f2d4af1ff07ec7fbdb8d749f7bdb17f2b4831595c5c7effd"'
repoLastModified: Sat, 05 Oct 2024 14:49:45 GMT
foundInMaster: true
category:
@@ -8082,17 +8082,17 @@
repositoryId: 372032505
description: OpenAPI v3 code generator for go
created: '2021-05-29T17:25:48Z'
- updated: '2024-10-04T16:25:59Z'
+ updated: '2024-10-06T20:45:46Z'
language: Go
archived: false
- stars: 1339
+ stars: 1338
watchers: 16
forks: 76
owner: ogen-go
logo: https://avatars.githubusercontent.com/u/85122432?v=4
license: Apache-2.0
- repoEtag: '"a5a1a99f43dd66a433a3ef016729aef694e48000b01c3564aa385addb7f57010"'
- repoLastModified: Fri, 04 Oct 2024 16:25:59 GMT
+ repoEtag: '"79b351de2b055bbe06fa30972841c3f74108ff562964cbefa591cd3893dbbc4f"'
+ repoLastModified: Sun, 06 Oct 2024 20:45:46 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -8161,17 +8161,17 @@
repositoryId: 481579846
description: A library that generates OpenAPI (Swagger) docs from Zod schemas
created: '2022-04-14T11:32:57Z'
- updated: '2024-10-05T13:51:00Z'
+ updated: '2024-10-06T18:43:57Z'
language: TypeScript
archived: false
- stars: 919
+ stars: 920
watchers: 10
forks: 57
owner: asteasolutions
logo: https://avatars.githubusercontent.com/u/5244095?v=4
license: MIT
- repoEtag: '"911b15f02a15719e6d0c370f3af76e9ddec63aeac8e9e6a85ed2b5a1145abd95"'
- repoLastModified: Sat, 05 Oct 2024 13:51:00 GMT
+ repoEtag: '"4a059b87d4f4ac0842045eff905217bd78914938d3099e95f83da5f3f6c9987f"'
+ repoLastModified: Sun, 06 Oct 2024 18:43:57 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -8401,17 +8401,17 @@
repositoryId: 766082951
description: Terminal UI to list, browse and run APIs defined with openapi spec.
created: '2024-03-02T09:42:10Z'
- updated: '2024-10-05T06:45:02Z'
+ updated: '2024-10-06T22:26:12Z'
language: Rust
archived: false
- stars: 639
+ stars: 638
watchers: 5
forks: 15
owner: zaghaghi
logo: https://avatars.githubusercontent.com/u/111259?v=4
license: MIT
- repoEtag: '"278c942b8485d797595e97c668ad472cf79eace67e303e954caf006a811b9291"'
- repoLastModified: Sat, 05 Oct 2024 06:45:02 GMT
+ repoEtag: '"b492c62199ed0360cca79b5ac217cb366aede7d4a441072be305243415f7c65b"'
+ repoLastModified: Sun, 06 Oct 2024 22:26:12 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -8774,11 +8774,11 @@
archived: false
stars: 405
watchers: 14
- forks: 72
+ forks: 73
owner: thomaxxl
logo: https://avatars.githubusercontent.com/u/4190750?v=4
license: GPL-3.0
- repoEtag: '"41d529bee3c933dc8623b042147bfed2c1100b441e9dfc4eb0c88439ceccdbad"'
+ repoEtag: '"114f64a2d9fe02c6c733a43ec058b52f88ae140412ea11090fbd67c97050f6b7"'
repoLastModified: Sat, 14 Sep 2024 11:06:08 GMT
foundInMaster: true
category: Server Implementations
@@ -8806,7 +8806,7 @@
owner: endpoints4s
logo: https://avatars.githubusercontent.com/u/67427463?v=4
license: MIT
- repoEtag: '"c4bfc10f92e33203e96e798cc41676e75cbb256701f84a7d9cf78c478ed0ac25"'
+ repoEtag: '"5b38abc64b1418883da8e426fc720fae10a55a1153d1eb56778e0a5a10f50532"'
repoLastModified: Mon, 23 Sep 2024 05:35:58 GMT
category: Parsers
foundInMaster: true
@@ -8908,7 +8908,7 @@
repositoryId: 306110879
description: Web services with OpenAPI and JSON Schema done quick in Go
created: '2020-10-21T18:16:16Z'
- updated: '2024-10-05T18:35:56Z'
+ updated: '2024-10-06T10:49:49Z'
language: Go
archived: false
stars: 362
@@ -8917,8 +8917,8 @@
owner: swaggest
logo: https://avatars.githubusercontent.com/u/19609628?v=4
license: MIT
- repoEtag: '"1c98e97a125d27ac80f3ff99fa1c67f58a4e2ce15e8430bd7b6f656daf160f59"'
- repoLastModified: Sat, 05 Oct 2024 18:35:56 GMT
+ repoEtag: '"8b628216f18b7dd1c9129b72cbae1d5a7f6186f75fd99ad493b96b61782c1364"'
+ repoLastModified: Sun, 06 Oct 2024 10:49:49 GMT
foundInMaster: true
id: ecd2fef7bb4079bda209503f9fb9820b
- source: openapi3 tags
@@ -9108,7 +9108,7 @@
A library for generating typed models based on inputs such as AsyncAPI,
OpenAPI, and JSON Schema documents with high customization
created: '2021-01-21T12:27:51Z'
- updated: '2024-10-06T00:30:09Z'
+ updated: '2024-10-07T00:29:25Z'
language: TypeScript
archived: false
stars: 302
@@ -9117,8 +9117,8 @@
owner: asyncapi
logo: https://avatars.githubusercontent.com/u/16401334?v=4
license: Apache-2.0
- repoEtag: '"41660889ec7c5e04a8b7cd150c659c629796873e49b85130c8eb75fa02a90294"'
- repoLastModified: Sun, 06 Oct 2024 00:30:09 GMT
+ repoEtag: '"69fc972ccf39004ba61d78e5e5b10785536a8e5d1ac37bec34461603b62e43c0"'
+ repoLastModified: Mon, 07 Oct 2024 00:29:25 GMT
foundInMaster: true
- source: openapi3 tags
repository: https://github.com/dymmond/esmerald
@@ -9241,23 +9241,23 @@
id: c86edd8c7126bca7973ca68a5b5bd9e1
repositoryMetadata:
base64Readme: >-
- PHAgYWxpZ249ImNlbnRlciI+CiAgPGltZyBzcmM9InpvZC1vcGVuYXBpLnN2ZyIgd2lkdGg9IjIwMHB4IiBhbGlnbj0iY2VudGVyIiBhbHQ9InpvZC1vcGVuYXBpIGxvZ28iIC8+CiAgPGgxIGFsaWduPSJjZW50ZXIiPnpvZC1vcGVuYXBpPC9oMT4KPC9wPgo8cCBhbGlnbj0iY2VudGVyIj4KQSBUeXBlc2NyaXB0IGxpYnJhcnkgdG8gdXNlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2xpbmhhY2tzL3pvZCI+Wm9kPC9hPiBTY2hlbWFzIHRvIGNyZWF0ZSBPcGVuQVBJIHYzLnggZG9jdW1lbnRhdGlvbgo8L3A+CjxkaXYgYWxpZ249ImNlbnRlciI+CjxhIGhyZWY9Imh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3pvZC1vcGVuYXBpIj48aW1nIHNyYz0iaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9ucG0vdi96b2Qtb3BlbmFwaSIvPjxhPgo8YSBocmVmPSJodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS96b2Qtb3BlbmFwaSI+PGltZyBzcmM9Imh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL2RtL3pvZC1vcGVuYXBpIi8+PGE+CjxhIGhyZWY9Imh0dHBzOi8vbm9kZWpzLm9yZy9lbi8iPjxpbWcgc3JjPSJodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL25vZGUtJTNFJTNEJTIwMTgtYnJpZ2h0Z3JlZW4iLz48YT4KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NhbWNodW5neS96b2Qtb3BlbmFwaS9hY3Rpb25zL3dvcmtmbG93cy90ZXN0LnltbCI+PGltZyBzcmM9Imh0dHBzOi8vZ2l0aHViLmNvbS9zYW1jaHVuZ3kvem9kLW9wZW5hcGkvYWN0aW9ucy93b3JrZmxvd3MvdGVzdC55bWwvYmFkZ2Uuc3ZnIi8+PGE+CjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zYW1jaHVuZ3kvem9kLW9wZW5hcGkvYWN0aW9ucy93b3JrZmxvd3MvcmVsZWFzZS55bWwiPjxpbWcgc3JjPSJodHRwczovL2dpdGh1Yi5jb20vc2FtY2h1bmd5L3pvZC1vcGVuYXBpL2FjdGlvbnMvd29ya2Zsb3dzL3JlbGVhc2UueW1sL2JhZGdlLnN2ZyIvPjxhPgo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2Vlay1vc3Mvc2t1YmEiPjxpbWcgc3JjPSJodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL/CfpL8lMjBza3ViYS1wb3dlcmVkLTAwOURDNCIvPjxhPgo8L2Rpdj4KPGJyPgoKIyMgSW5zdGFsbAoKSW5zdGFsbCB2aWEgYG5wbWAsIGB5YXJuYCBvciBgcG5wbWA6CgpgYGBiYXNoCm5wbSBpbnN0YWxsIHpvZCB6b2Qtb3BlbmFwaQojIyBvcgp5YXJuIGFkZCB6b2Qgem9kLW9wZW5hcGkKIyMgb3IKcG5wbSBpbnN0YWxsIHpvZCB6b2Qtb3BlbmFwaQpgYGAKCiMjIFVzYWdlCgojIyMgRXh0ZW5kIFpvZAoKVGhpcyBtdXRhdGVzIFpvZCB0byBhZGQgYW4gZXh0cmEgYC5vcGVuYXBpKClgIG1ldGhvZC4gQ2FsbCB0aGlzIGF0IHRoZSB0b3Agb2YgeW91ciBlbnRyeSBwb2ludChzKS4gWW91IGNhbiBhY2hpZXZlIHRoaXMgaW4gdHdvIGRpZmZlcmVudCB3YXlzLCBkZXBlbmRpbmcgb24geW91ciBwcmVmZXJlbmNlLgoKIyMjIyBTdWJwYXRoIEltcG9ydAoKYGBgdHMKaW1wb3J0ICd6b2Qtb3BlbmFwaS9leHRlbmQnOwppbXBvcnQgeyB6IH0gZnJvbSAnem9kJzsKCnouc3RyaW5nKCkub3BlbmFwaSh7IGRlc2NyaXB0aW9uOiAnaGVsbG8gd29ybGQhJywgZXhhbXBsZTogJ2hlbGxvIHdvcmxkJyB9KTsKYGBgCgojIyMjIE1hbnVhbCBFeHRlbnNpb24KClRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGEgc3BlY2lmaWMgaW5zdGFuY2Ugb2YgWm9kIG9yIGEgWm9kIGluc3RhbmNlIGZyb20gYW5vdGhlciBsaWJyYXJ5IHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdGFyZ2V0LgoKYGBgdHlwZXNjcmlwdAppbXBvcnQgeyB6IH0gZnJvbSAnem9kJzsKaW1wb3J0IHsgZXh0ZW5kWm9kV2l0aE9wZW5BcGkgfSBmcm9tICd6b2Qtb3BlbmFwaSc7CgpleHRlbmRab2RXaXRoT3BlbkFwaSh6KTsKCnouc3RyaW5nKCkub3BlbmFwaSh7IGRlc2NyaXB0aW9uOiAnaGVsbG8gd29ybGQhJywgZXhhbXBsZTogJ2hlbGxvIHdvcmxkJyB9KTsKYGBgCgojIyMjIGAub3BlbmFwaSgpYAoKVXNlIHRoZSBgLm9wZW5hcGkoKWAgbWV0aG9kIHRvIGFkZCBtZXRhZGF0YSB0byBhIHNwZWNpZmljIFpvZCB0eXBlLiBUaGUgYC5vcGVuYXBpKClgIG1ldGhvZCB0YWtlcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6Cgp8ICAgICBPcHRpb24gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgOi0tLS0tLS0tLS0tLS06IHwgOi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS06IHwKfCBPcGVuQVBJIE9wdGlvbnMgfCBUaGlzIHdpbGwgdGFrZSBhbnkgb3B0aW9uIHlvdSB3b3VsZCBwdXQgb24gYSBbU2NoZW1hT2JqZWN0XShodHRwczovL3N3YWdnZXIuaW8vZG9jcy9zcGVjaWZpY2F0aW9uL2RhdGEtbW9kZWxzL2RhdGEtdHlwZXMvKS4gfAp8ICBgZWZmZWN0VHlwZWAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgdG8gb3ZlcnJpZGUgdGhlIGNyZWF0aW9uIHR5cGUgZm9yIGEgW1pvZCBFZmZlY3RdKCN6b2QtZWZmZWN0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgYGhlYWRlcmAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgdG8gcHJvdmlkZSBtZXRhZGF0YSBmb3IgW3Jlc3BvbnNlIGhlYWRlcnNdKCNyZXNwb25zZS1oZWFkZXJzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgYHBhcmFtYCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRvIHByb3ZpZGUgbWV0YWRhdGEgZm9yIFtyZXF1ZXN0IHBhcmFtZXRlcnNdKCNwYXJhbWV0ZXJzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgYHJlZmAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgVXNlIHRoaXMgdG8gW2F1dG8gcmVnaXN0ZXIgYSBzY2hlbWEgYXMgYSByZS11c2FibGUgY29tcG9uZW50XSgjY3JlYXRpbmctY29tcG9uZW50cykgICAgICAgICAgICAgICAgICAgICB8CnwgICAgYHJlZlR5cGVgICAgIHwgICAgICAgICAgICAgICAgIFVzZSB0aGlzIHRvIHNldCB0aGUgY3JlYXRpb24gdHlwZSBmb3IgYSBjb21wb25lbnQgd2hpY2ggaXMgbm90IHJlZmVyZW5jZWQgaW4gdGhlIGRvY3VtZW50LiAgICAgICAgICAgICAgICAgIHwKfCAgICAgYHR5cGVgICAgICAgfCAgICAgICAgICAgICAgICAgVXNlIHRoaXMgdG8gb3ZlcnJpZGUgdGhlIGdlbmVyYXRlZCB0eXBlLiBJZiB0aGlzIGlzIHByb3ZpZGVkIG5vIG1ldGFkYXRhIHdpbGwgYmUgZ2VuZXJhdGVkLiAgICAgICAgICAgICAgICAgfAp8ICBgdW5pb25PbmVPZmAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIGB0cnVlYCB0byBmb3JjZSBhIFpvZFVuaW9uIHRvIG91dHB1dCBgb25lT2ZgIGluc3RlYWQgb2YgYGFsbE9mYCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgojIyMgYGNyZWF0ZURvY3VtZW50YAoKQ3JlYXRlcyBhbiBPcGVuQVBJIGRvY3VtZW50YXRpb24gb2JqZWN0CgpgYGB0eXBlc2NyaXB0CmltcG9ydCAnem9kLW9wZW5hcGkvZXh0ZW5kJzsKaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7CmltcG9ydCB7IGNyZWF0ZURvY3VtZW50IH0gZnJvbSAnem9kLW9wZW5hcGknOwoKY29uc3Qgam9iSWQgPSB6LnN0cmluZygpLm9wZW5hcGkoewogIGRlc2NyaXB0aW9uOiAnQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBqb2InLAogIGV4YW1wbGU6ICcxMjM0NScsCiAgcmVmOiAnam9iSWQnLAp9KTsKCmNvbnN0IHRpdGxlID0gei5zdHJpbmcoKS5vcGVuYXBpKHsKICBkZXNjcmlwdGlvbjogJ0pvYiB0aXRsZScsCiAgZXhhbXBsZTogJ015IGpvYicsCn0pOwoKY29uc3QgZG9jdW1lbnQgPSBjcmVhdGVEb2N1bWVudCh7CiAgb3BlbmFwaTogJzMuMS4wJywKICBpbmZvOiB7CiAgICB0aXRsZTogJ015IEFQSScsCiAgICB2ZXJzaW9uOiAnMS4wLjAnLAogIH0sCiAgcGF0aHM6IHsKICAgICcvam9icy97am9iSWR9JzogewogICAgICBwdXQ6IHsKICAgICAgICByZXF1ZXN0UGFyYW1zOiB7IHBhdGg6IHoub2JqZWN0KHsgam9iSWQgfSkgfSwKICAgICAgICByZXF1ZXN0Qm9keTogewogICAgICAgICAgY29udGVudDogewogICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6IHsgc2NoZW1hOiB6Lm9iamVjdCh7IHRpdGxlIH0pIH0sCiAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgcmVzcG9uc2VzOiB7CiAgICAgICAgICAnMjAwJzogewogICAgICAgICAgICBkZXNjcmlwdGlvbjogJzIwMCBPSycsCiAgICAgICAgICAgIGNvbnRlbnQ6IHsKICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6IHsgc2NoZW1hOiB6Lm9iamVjdCh7IGpvYklkLCB0aXRsZSB9KSB9LAogICAgICAgICAgICB9LAogICAgICAgICAgfSwKICAgICAgICB9LAogICAgICB9LAogICAgfSwKICB9LAp9KTsKYGBgCgo8ZGV0YWlscz4KICA8c3VtbWFyeT5DcmVhdGVzIHRoZSBmb2xsb3dpbmcgb2JqZWN0Ojwvc3VtbWFyeT4KICAKICBgYGBqc29uCiAgewogICAgIm9wZW5hcGkiOiAiMy4xLjAiLAogICAgImluZm8iOiB7CiAgICAgICJ0aXRsZSI6ICJNeSBBUEkiLAogICAgICAidmVyc2lvbiI6ICIxLjAuMCIKICAgIH0sCiAgICAicGF0aHMiOiB7CiAgICAgICIvam9icy97am9iSWR9IjogewogICAgICAgICJwdXQiOiB7CiAgICAgICAgICAicGFyYW1ldGVycyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJpbiI6ICJwYXRoIiwKICAgICAgICAgICAgICAibmFtZSI6ICJqb2JJZCIsCiAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgam9iIiwKICAgICAgICAgICAgICAic2NoZW1hIjogewogICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvam9iSWQiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgInJlcXVlc3RCb2R5IjogewogICAgICAgICAgICAiY29udGVudCI6IHsKICAgICAgICAgICAgICAiYXBwbGljYXRpb24vanNvbiI6IHsKICAgICAgICAgICAgICAgICJzY2hlbWEiOiB7CiAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSm9iIHRpdGxlIiwKICAgICAgICAgICAgICAgICAgICAgICJleGFtcGxlIjogIk15IGpvYiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidGl0bGUiXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJyZXNwb25zZXMiOiB7CiAgICAgICAgICAgICIyMDAiOiB7CiAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIjIwMCBPSyIsCiAgICAgICAgICAgICAgImNvbnRlbnQiOiB7CiAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vanNvbiI6IHsKICAgICAgICAgICAgICAgICAgInNjaGVtYSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgImpvYklkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9qb2JJZCIKICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJKb2IgdGl0bGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZXhhbXBsZSI6ICJNeSBqb2IiCiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbImpvYklkIiwgInRpdGxlIl0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJjb21wb25lbnRzIjogewogICAgICAic2NoZW1hcyI6IHsKICAgICAgICAiam9iSWQiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgam9iIiwKICAgICAgICAgICJleGFtcGxlIjogIjEyMzQ1IgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBgYGAKPC9kZXRhaWxzPgoKIyMjIFJlcXVlc3QgUGFyYW1ldGVycwoKUXVlcnksIFBhdGgsIEhlYWRlciAmIENvb2tpZSBwYXJhbWV0ZXJzIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSBgcmVxdWVzdFBhcmFtc2Aga2V5IHVuZGVyIHRoZSBgbWV0aG9kYCBrZXkgYXMgZm9sbG93czoKCmBgYHR5cGVzY3JpcHQKY3JlYXRlRG9jdW1lbnQoewogIHBhdGhzOiB7CiAgICAnL2pvYnMve2F9JzogewogICAgICBwdXQ6IHsKICAgICAgICByZXF1ZXN0UGFyYW1zOiB7CiAgICAgICAgICBwYXRoOiB6Lm9iamVjdCh7IGE6IHouc3RyaW5nKCkgfSksCiAgICAgICAgICBxdWVyeTogei5vYmplY3QoeyBiOiB6LnN0cmluZygpIH0pLAogICAgICAgICAgY29va2llOiB6Lm9iamVjdCh7IGNvb2tpZTogei5zdHJpbmcoKSB9KSwKICAgICAgICAgIGhlYWRlcjogei5vYmplY3QoeyAnY3VzdG9tLWhlYWRlcic6IHouc3RyaW5nKCkgfSksCiAgICAgICAgfSwKICAgICAgfSwKICAgIH0sCiAgfSwKfSk7CmBgYAoKSWYgeW91IHdvdWxkIGxpa2UgdG8gZGVjbGFyZSBwYXJhbWV0ZXJzIGluIGEgbW9yZSB0cmFkaXRpb25hbCB3YXkgeW91IG1heSBhbHNvIGRlY2xhcmUgdGhlbSB1c2luZyB0aGUgW3BhcmFtZXRlcnNdKGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vZGVzY3JpYmluZy1wYXJhbWV0ZXJzLykga2V5LiBUaGUgZGVmaW5pdGlvbnMgd2lsbCB0aGVuIGFsbCBiZSBjb21iaW5lZC4KCmBgYHRzCmNyZWF0ZURvY3VtZW50KHsKICBwYXRoczogewogICAgJy9qb2JzL3thfSc6IHsKICAgICAgcHV0OiB7CiAgICAgICAgcGFyYW1ldGVyczogWwogICAgICAgICAgei5zdHJpbmcoKS5vcGVuYXBpKHsKICAgICAgICAgICAgcGFyYW06IHsKICAgICAgICAgICAgICBuYW1lOiAnam9iLWhlYWRlcicsCiAgICAgICAgICAgICAgaW46ICdoZWFkZXInLAogICAgICAgICAgICB9LAogICAgICAgICAgfSksCiAgICAgICAgXSwKICAgICAgfSwKICAgIH0sCiAgfSwKfSk7CmBgYAoKIyMjIFJlcXVlc3QgQm9keQoKV2hlcmUgeW91IHdvdWxkIG5vcm1hbGx5IGRlY2xhcmUgdGhlIFttZWRpYSB0eXBlXShodHRwczovL3N3YWdnZXIuaW8vZG9jcy9zcGVjaWZpY2F0aW9uL21lZGlhLXR5cGVzLyksIHNldCB0aGUgYHNjaGVtYWAgYXMgeW91ciBab2QgU2NoZW1hIGFzIGZvbGxvd3MuCgpgYGB0eXBlc2NyaXB0CmNyZWF0ZURvY3VtZW50KHsKICBwYXRoczogewogICAgJy9qb2JzJzogewogICAgICBnZXQ6IHsKICAgICAgICByZXF1ZXN0Qm9keTogewogICAgICAgICAgY29udGVudDogewogICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6IHsgc2NoZW1hOiB6Lm9iamVjdCh7IGE6IHouc3RyaW5nKCkgfSkgfSwKICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgfSwKICAgIH0sCiAgfSwKfSk7CmBgYAoKSWYgeW91IHdpc2ggdG8gdXNlIE9wZW5BUEkgc3ludGF4IGZvciB5b3VyIHNjaGVtYXMsIHNpbXBseSBhZGQgYW4gT3BlbkFQSSBzY2hlbWEgdG8gdGhlIGBzY2hlbWFgIGZpZWxkIGluc3RlYWQuCgojIyMgUmVzcG9uc2VzCgpTaW1pbGFybHkgdG8gdGhlIFtSZXF1ZXN0IEJvZHldKCNyZXF1ZXN0LWJvZHkpLCBzaW1wbHkgc2V0IHRoZSBgc2NoZW1hYCBhcyB5b3VyIFpvZCBTY2hlbWEgYXMgZm9sbG93cy4gWW91IGNhbiBzZXQgdGhlIHJlc3BvbnNlIGhlYWRlcnMgdXNpbmcgdGhlIGBoZWFkZXJzYCBrZXkuCgpgYGB0eXBlc2NyaXB0CmNyZWF0ZURvY3VtZW50KHsKICBwYXRoczogewogICAgJy9qb2JzJzogewogICAgICBnZXQ6IHsKICAgICAgICByZXNwb25zZXM6IHsKICAgICAgICAgIDIwMDogewogICAgICAgICAgICBkZXNjcmlwdGlvbjogJzIwMCBPSycsCiAgICAgICAgICAgIGNvbnRlbnQ6IHsKICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6IHsgc2NoZW1hOiB6Lm9iamVjdCh7IGE6IHouc3RyaW5nKCkgfSkgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaGVhZGVyczogei5vYmplY3QoewogICAgICAgICAgICAgICdoZWFkZXIta2V5Jzogei5zdHJpbmcoKSwKICAgICAgICAgICAgfSksCiAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgIH0sCiAgICB9LAogIH0sCn0pOwpgYGAKCiMjIyBDYWxsYmFja3MKCmBgYHR5cGVzY3JpcHQKY3JlYXRlRG9jdW1lbnQoewogIHBhdGhzOiB7CiAgICAnL2pvYnMnOiB7CiAgICAgIGdldDogewogICAgICAgIGNhbGxiYWNrczogewogICAgICAgICAgb25EYXRhOiB7CiAgICAgICAgICAgICd7JHJlcXVlc3QucXVlcnkuY2FsbGJhY2tVcmx9L2RhdGEnOiB7CiAgICAgICAgICAgICAgcG9zdDogewogICAgICAgICAgICAgICAgcmVxdWVzdEJvZHk6IHsKICAgICAgICAgICAgICAgICAgY29udGVudDogewogICAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJzogeyBzY2hlbWE6IHoub2JqZWN0KHsgYTogei5zdHJpbmcoKSB9KSB9LAogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJlc3BvbnNlczogewogICAgICAgICAgICAgICAgICAyMDA6IHsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJzIwMCBPSycsCiAgICAgICAgICAgICAgICAgICAgY29udGVudDogewogICAgICAgICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYTogei5vYmplY3QoeyBhOiB6LnN0cmluZygpIH0pLAogICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgfSwKICAgICAgICB9LAogICAgICB9LAogICAgfSwKICB9LAp9KTsKYGBgCgojIyMgQ3JlYXRpbmcgQ29tcG9uZW50cwoKT3BlbkFQSSBhbGxvd3MgeW91IHRvIGRlZmluZSByZXVzYWJsZSBbY29tcG9uZW50c10oaHR0cHM6Ly9zd2FnZ2VyLmlvL2RvY3Mvc3BlY2lmaWNhdGlvbi9jb21wb25lbnRzLykgYW5kIHRoaXMgbGlicmFyeSBhbGxvd3MgeW91IHRvIHJlcGxpY2F0ZSB0aGF0IGluIHR3byBzZXBhcmF0ZSB3YXlzLgoKMS4gQXV0byByZWdpc3RlcmluZyBzY2hlbWEKMi4gTWFudWFsbHkgcmVnaXN0ZXJpbmcgc2NoZW1hCgojIyMjIFNjaGVtYQoKSWYgd2UgdGFrZSB0aGUgZXhhbXBsZSBpbiBgY3JlYXRlRG9jdW1lbnRgIGFuZCBpbnN0ZWFkIGNyZWF0ZSBgdGl0bGVgIGFzIGZvbGxvd3MKCiMjIyMjIEF1dG8gUmVnaXN0ZXJpbmcgU2NoZW1hCgpgYGB0eXBlc2NyaXB0CmNvbnN0IHRpdGxlID0gei5zdHJpbmcoKS5vcGVuYXBpKHsKICBkZXNjcmlwdGlvbjogJ0pvYiB0aXRsZScsCiAgZXhhbXBsZTogJ015IGpvYicsCiAgcmVmOiAnam9iVGl0bGUnLCAvLyA8LSBuZXcgZmllbGQKfSk7CmBgYAoKV2hlcmV2ZXIgYHRpdGxlYCBpcyB1c2VkIGluIHNjaGVtYXMgYWNyb3NzIHRoZSBkb2N1bWVudCwgaXQgd2lsbCBpbnN0ZWFkIGJlIGNyZWF0ZWQgYXMgYSByZWZlcmVuY2UuCgpgYGBqc29uCnsgIiRyZWYiOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvam9iVGl0bGUiIH0KYGBgCgpgdGl0bGVgIHdpbGwgdGhlbiBiZSBvdXRwdXR0ZWQgYXMgYSBzY2hlbWEgd2l0aGluIHRoZSBjb21wb25lbnRzIHNlY3Rpb24gb2YgdGhlIGRvY3VtZW50YXRpb24uCgpgYGBqc29uCnsKICAiY29tcG9uZW50cyI6IHsKICAgICJzY2hlbWFzIjogewogICAgICAiam9iVGl0bGUiOiB7CiAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAiZGVzY3JpcHRpb24iOiAiSm9iIHRpdGxlIiwKICAgICAgICAiZXhhbXBsZSI6ICJNeSBqb2IiCiAgICAgIH0KICAgIH0KICB9Cn0KYGBgCgpUaGlzIGNhbiBiZSBhbiBleHRyZW1lbHkgcG93ZXJmdWwgd2F5IHRvIGNyZWF0ZSBsZXNzIHJlcGV0aXRpdmUgT3BlbiBBUEkgZG9jdW1lbnRhdGlvbi4gVGhlcmUgYXJlIHNvbWUgT3BlbiBBUEkgZmVhdHVyZXMgbGlrZSBbZGlzY3JpbWluYXRvciBtYXBwaW5nXShodHRwczovL3N3YWdnZXIuaW8vZG9jcy9zcGVjaWZpY2F0aW9uL2RhdGEtbW9kZWxzL2luaGVyaXRhbmNlLWFuZC1wb2x5bW9ycGhpc20vKSB3aGljaCByZXF1aXJlIGFsbCBzY2hlbWFzIGluIHRoZSB1bmlvbiB0byBjb250YWluIGEgcmVmLgoKIyMjIyMgTWFudWFsbHkgUmVnaXN0ZXJpbmcgU2NoZW1hCgpBbm90aGVyIHdheSB0byByZWdpc3RlciBzY2hlbWEgaW5zdGVhZCBvZiBhZGRpbmcgYSBgcmVmYCBpcyB0byBhZGQgaXQgdG8gdGhlIGNvbXBvbmVudHMgZGlyZWN0bHkuIFRoaXMgd2lsbCBzdGlsbCB3b3JrIGluIHRoZSBzYW1lIHdheSBhcyBgcmVmYC4gU28gd2hlbmV2ZXIgd2UgcnVuIGludG8gdGhhdCBab2QgdHlwZSB3ZSB3aWxsIHJlcGxhY2UgaXQgd2l0aCBhIHJlZmVyZW5jZS4KCmVnLgoKYGBgdHlwZXNjcmlwdApjcmVhdGVEb2N1bWVudCh7CiAgY29tcG9uZW50czogewogICAgc2NoZW1hczogewogICAgICBqb2JUaXRsZTogdGl0bGUsIC8vIHRoaXMgd2lsbCByZWdpc3RlciB0aGlzIFpvZCBTY2hlbWEgYXMgam9iVGl0bGUgdW5sZXNzIGByZWZgIGluIGAub3BlbmFwaSgpYCBpcyBzcGVjaWZpZWQgb24gdGhlIHR5cGUKICAgIH0sCiAgfSwKfSk7CmBgYAoKIyMjIyMgWm9kIEVmZmVjdHMKCmAudHJhbnNmb3JtKClgLCBgLmRlZmF1bHQoKWAgYW5kIGAucGlwZSgpYCBhcmUgY29tcGxpY2F0ZWQgYmVjYXVzZSB0aGV5IHRlY2huaWNhbGx5IGNvbXByaXNlIG9mIHR3byB0eXBlcyAoaW5wdXQgJiBvdXRwdXQpLiBUaGlzIG1lYW5zIHRoYXQgd2UgbmVlZCB0byB1bmRlcnN0YW5kIHdoaWNoIHR5cGUgeW91IGFyZSBjcmVhdGluZy4gSW4gcGFydGljdWxhciB3aXRoIHRyYW5zZm9ybSBpdCBpcyB2ZXJ5IGRpZmZpY3VsdCB0byBpbmZlciB0aGUgb3V0cHV0IHR5cGUuIFRoaXMgbGlicmFyeSB3aWxsIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHdoaWNoIF90eXBlXyB0byB1c2UgYnkgY2hlY2tpbmcgaG93IHRoZSBzY2hlbWEgaXMgdXNlZCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHJ1bGVzOgoKX0lucHV0XzogUmVxdWVzdCBCb2RpZXMsIFJlcXVlc3QgUGFyYW1ldGVycywgSGVhZGVycwoKX091dHB1dF86IFJlc3BvbnNlcywgUmVzcG9uc2UgSGVhZGVycwoKSWYgYSByZWdpc3RlcmVkIHNjaGVtYSB3aXRoIGEgdHJhbnNmb3JtIG9yIHBpcGVsaW5lIGlzIHVzZWQgaW4gYm90aCBhIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHNjaGVtYSB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGJlY2F1c2UgdGhlIGNyZWF0ZWQgc2NoZW1hIGZvciBlYWNoIHdpbGwgYmUgZGlmZmVyZW50LiBUbyBvdmVycmlkZSB0aGUgY3JlYXRpb24gdHlwZSBmb3IgYSBzcGVjaWZpYyBab2RFZmZlY3QsIGFkZCBhbiBgLm9wZW5hcGkoKWAgZmllbGQgb24gaXQgYW5kIHNldCB0aGUgYGVmZmVjdFR5cGVgIGZpZWxkIHRvIGBpbnB1dGAsIGBvdXRwdXRgIG9yIGBzYW1lYC4gVGhpcyB3aWxsIGZvcmNlIHRoaXMgbGlicmFyeSB0byBhbHdheXMgZ2VuZXJhdGUgdGhlIGlucHV0L291dHB1dCB0eXBlIGV2ZW4gaWYgd2UgYXJlIGNyZWF0aW5nIGEgcmVzcG9uc2UgKG91dHB1dCkgb3IgcmVxdWVzdCAoaW5wdXQpIHR5cGUuIFlvdSB0eXBpY2FsbHkgd2FudCB0byBzZXQgdGhpcyB3aGVuIHlvdSBrbm93IHRoZSB0eXBlIGhhcyBub3QgY2hhbmdlZCBpbiB0aGUgdHJhbnNmb3JtLiBgc2FtZWAgaXMgdGhlIHJlY29tbWVuZGVkIGNob2ljZSBhcyBpdCB3aWxsIGdlbmVyYXRlIGEgVHlwZVNjcmlwdCBjb21waWxlciBlcnJvciBpZiB0aGUgaW5wdXQgYW5kIG91dHB1dCB0eXBlcyBpbiB0aGUgdHJhbnNmb3JtIGRyaWZ0LgoKYC5wcmVwcm9jZXNzKClgIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgYG91dHB1dGAgdHlwZSBldmVuIGlmIHdlIGFyZSBjcmVhdGluZyBhbiBpbnB1dCBzY2hlbWEuIElmIGEgZGlmZmVyZW50IGlucHV0IHR5cGUgaXMgcmVxdWlyZWQgeW91IGNhbiBhY2hpZXZlIHRoaXMgd2l0aCBhIGAudHJhbnNmb3JtKClgIGNvbWJpbmVkIHdpdGggYSBgLnBpcGUoKWAgb3Igc2ltcGx5IGRlY2xhcmUgYSBtYW51YWwgYHR5cGVgIGluIGAub3BlbmFwaSgpYC4KCklmIHlvdSBhcmUgYWRkaW5nIGEgWm9kU2NoZW1hIGRpcmVjdGx5IHRvIHRoZSBgY29tcG9uZW50c2Agc2VjdGlvbiB3aGljaCBpcyBub3QgcmVmZXJlbmNlZCBhbnl3aGVyZSBpbiB0aGUgZG9jdW1lbnQsIGFkZGl0aW9uYWwgY29udGV4dCBtYXkgYmUgcmVxdWlyZWQgdG8gY3JlYXRlIGVpdGhlciBhbiBpbnB1dCBvciBvdXRwdXQgc2NoZW1hLiBZb3UgY2FuIGRvIHRoaXMgYnkgc2V0dGluZyB0aGUgYHJlZlR5cGVgIGZpZWxkIHRvIGBpbnB1dGAgb3IgYG91dHB1dGAgaW4gYC5vcGVuYXBpKClgLiBUaGlzIGRlZmF1bHRzIHRvIGBvdXRwdXRgIGJ5IGRlZmF1bHQuCgojIyMjIFBhcmFtZXRlcnMKClF1ZXJ5LCBQYXRoLCBIZWFkZXIgJiBDb29raWUgcGFyYW1ldGVycyBjYW4gYmUgc2ltaWxhcmx5IHJlZ2lzdGVyZWQ6CgpgYGB0eXBlc2NyaXB0Ci8vIEVhc3kgYXV0byByZWdpc3RyYXRpb24KY29uc3Qgam9iSWQgPSB6LnN0cmluZygpLm9wZW5hcGkoewogIGRlc2NyaXB0aW9uOiAnSm9iIElEJywKICBleGFtcGxlOiAnMTIzNCcsCiAgcGFyYW06IHsgcmVmOiAnam9iUmVmJyB9LAp9KTsKCmNyZWF0ZURvY3VtZW50KHsKICBwYXRoczogewogICAgJy9qb2JzL3tqb2JJZH0nOiB7CiAgICAgIHB1dDogewogICAgICAgIHJlcXVlc3RQYXJhbXM6IHsKICAgICAgICAgIGhlYWRlcjogei5vYmplY3QoewogICAgICAgICAgICBqb2JJZCwKICAgICAgICAgIH0pLAogICAgICAgIH0sCiAgICAgIH0sCiAgICB9LAogIH0sCn0pOwoKLy8gb3IgbW9yZSB2ZXJib3NlIGF1dG8gcmVnaXN0cmF0aW9uCmNvbnN0IGpvYklkID0gei5zdHJpbmcoKS5vcGVuYXBpKHsKICBkZXNjcmlwdGlvbjogJ0pvYiBJRCcsCiAgZXhhbXBsZTogJzEyMzQnLAogIHBhcmFtOiB7IGluOiAnaGVhZGVyJywgbmFtZTogJ2pvYklkJywgcmVmOiAnam9iUmVmJyB9LAp9KTsKCmNyZWF0ZURvY3VtZW50KHsKICBwYXRoczogewogICAgJy9qb2JzL3tqb2JJZH0nOiB7CiAgICAgIHB1dDogewogICAgICAgIHBhcmFtZXRlcnM6IFtqb2JJZF0sCiAgICAgIH0sCiAgICB9LAogIH0sCn0pOwoKLy8gb3IgbWFudWFsIHJlZ2lzdGVyYXRpb24KY29uc3Qgb3RoZXJKb2JJZCA9IHouc3RyaW5nKCkub3BlbmFwaSh7CiAgZGVzY3JpcHRpb246ICdKb2IgSUQnLAogIGV4YW1wbGU6ICcxMjM0JywKICBwYXJhbTogeyBpbjogJ2hlYWRlcicsIG5hbWU6ICdqb2JJZCcgfSwKfSk7CgpjcmVhdGVEb2N1bWVudCh7CiAgY29tcG9uZW50czogewogICAgcGFyYW1ldGVyczogewogICAgICBqb2JSZWY6IGpvYklkLAogICAgfSwKICB9LAp9KTsKYGBgCgojIyMjIFJlc3BvbnNlIEhlYWRlcnMKClJlc3BvbnNlIGhlYWRlcnMgY2FuIGJlIHNpbWlsYXJseSByZWdpc3RlcmVkOgoKYGBgdHlwZXNjcmlwdApjb25zdCBoZWFkZXIgPSB6LnN0cmluZygpLm9wZW5hcGkoewogIGRlc2NyaXB0aW9uOiAnSm9iIElEJywKICBleGFtcGxlOiAnMTIzNCcsCiAgaGVhZGVyOiB7IHJlZjogJ3NvbWUtaGVhZGVyJyB9LAp9KTsKCi8vIG9yCgpjb25zdCBqb2JJZEhlYWRlciA9IHouc3RyaW5nKCkub3BlbmFwaSh7CiAgZGVzY3JpcHRpb246ICdKb2IgSUQnLAogIGV4YW1wbGU6ICcxMjM0JywKfSk7CgpjcmVhdGVEb2N1bWVudCh7CiAgY29tcG9uZW50czogewogICAgaGVhZGVyczogewogICAgICBzb21lSGVhZGVyUmVmOiBqb2JJZEhlYWRlciwKICAgIH0sCiAgfSwKfSk7CmBgYAoKIyMjIyBSZXNwb25zZXMKCkVudGlyZSBSZXNwb25zZXMgY2FuIGFsc28gYmUgcmVnaXN0ZXJlZAoKYGBgdHlwZXNjcmlwdApjb25zdCByZXNwb25zZTogWm9kT3BlbkFwaVJlc3BvbnNlT2JqZWN0ID0gewogIGRlc2NyaXB0aW9uOiAnMjAwIE9LJywKICBjb250ZW50OiB7CiAgICAnYXBwbGljYXRpb24vanNvbic6IHsKICAgICAgc2NoZW1hOiB6Lm9iamVjdCh7IGE6IHouc3RyaW5nKCkgfSksCiAgICB9LAogIH0sCiAgcmVmOiAnc29tZS1yZXNwb25zZScsCn07CgovL29yCgpjb25zdCByZXNwb25zZTogWm9kT3BlbkFwaVJlc3BvbnNlT2JqZWN0ID0gewogIGRlc2NyaXB0aW9uOiAnMjAwIE9LJywKICBjb250ZW50OiB7CiAgICAnYXBwbGljYXRpb24vanNvbic6IHsKICAgICAgc2NoZW1hOiB6Lm9iamVjdCh7IGE6IHouc3RyaW5nKCkgfSksCiAgICB9LAogIH0sCn07CgpjcmVhdGVEb2N1bWVudCh7CiAgY29tcG9uZW50czogewogICAgcmVzcG9uc2VzOiB7CiAgICAgICdzb21lLXJlc3BvbnNlJzogcmVzcG9uc2UsCiAgICB9LAogIH0sCn0pOwpgYGAKCiMjIyMgQ2FsbGJhY2tzCgpDYWxsYmFja3MgY2FuIGFsc28gYmUgcmVnaXN0ZXJlZAoKYGBgdHlwZXNjcmlwdApjb25zdCBjYWxsYmFjazogWm9kT3BlbkFwaUNhbGxiYWNrT2JqZWN0ID0gewogIHJlZjogJ3NvbWUtY2FsbGJhY2snCiAgcG9zdDogewogICAgcmVzcG9uc2VzOiB7CiAgICAgIDIwMDogewogICAgICAgIGRlc2NyaXB0aW9uOiAnMjAwIE9LJywKICAgICAgICBjb250ZW50OiB7CiAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6IHsKICAgICAgICAgICAgc2NoZW1hOiB6Lm9iamVjdCh7IGE6IHouc3RyaW5nKCkgfSksCiAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgIH0sCiAgICB9LAogIH0sCn07CgovL29yCgpjb25zdCBjYWxsYmFjazogWm9kT3BlbkFwaUNhbGxiYWNrT2JqZWN0ID0gewogIHBvc3Q6IHsKICAgIHJlc3BvbnNlczogewogICAgICAyMDA6IHsKICAgICAgICBkZXNjcmlwdGlvbjogJzIwMCBPSycsCiAgICAgICAgY29udGVudDogewogICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nOiB7CiAgICAgICAgICAgIHNjaGVtYTogei5vYmplY3QoeyBhOiB6LnN0cmluZygpIH0pLAogICAgICAgICAgfSwKICAgICAgICB9LAogICAgICB9LAogICAgfSwKICB9LAp9OwoKY3JlYXRlRG9jdW1lbnQoewogIGNvbXBvbmVudHM6IHsKICAgIGNhbGxiYWNrczogewogICAgICAnc29tZS1jYWxsYmFjayc6IGNhbGxiYWNrLAogICAgfSwKICB9LAp9KTsKYGBgCgojIyBTdXBwb3J0ZWQgT3BlbkFQSSBWZXJzaW9ucwoKQ3VycmVudGx5IHRoZSBmb2xsb3dpbmcgdmVyc2lvbnMgb2YgT3BlbkFQSSBhcmUgc3VwcG9ydGVkCgotIGAzLjAuMGAKLSBgMy4wLjFgCi0gYDMuMC4yYAotIGAzLjAuM2AKLSBgMy4xLjBgCgpTZXR0aW5nIHRoZSBgb3BlbmFwaWAgZmllbGQgd2lsbCBjaGFuZ2UgaG93IHRoZSBzb21lIG9mIHRoZSBjb21wb25lbnRzIGFyZSByZW5kZXJlZC4KCmBgYHRzCmNyZWF0ZURvY3VtZW50KHsKICBvcGVuYXBpOiAnMy4xLjAnLAp9KTsKYGBgCgpGb3IgZXhhbXBsZSBpbiBgei5zdHJpbmcoKS5udWxsYWJsZSgpYCB3aWxsIGJlIHJlbmRlcmVkIGRpZmZlcmVudGx5CgpgMy4wLjBgCgpgYGBqc29uCnsKICAidHlwZSI6ICJzdHJpbmciLAogICJudWxsYWJsZSI6IHRydWUKfQpgYGAKCmAzLjEuMGAKCmBgYGpzb24KewogICJ0eXBlIjogWyJzdHJpbmciLCAibnVsbCJdCn0KYGBgCgojIyBTdXBwb3J0ZWQgWm9kIFNjaGVtYQoKLSBab2RBbnkKLSBab2RBcnJheQogIC0gYG1pbkl0ZW1zYC9gbWF4SXRlbXNgIG1hcHBpbmcgZm9yIGAubGVuZ3RoKClgLCBgLm1pbigpYCwgYC5tYXgoKWAKLSBab2RCb29sZWFuCi0gWm9kQnJhbmRlZAotIFpvZENhdGNoCi0gWm9kRGF0ZQogIC0gYHR5cGVgIGlzIG1hcHBlZCBhcyBgc3RyaW5nYCBieSBkZWZhdWx0Ci0gWm9kRGVmYXVsdAotIFpvZERpc2NyaW1pbmF0ZWRVbmlvbgogIC0gYGRpc2NyaW1pbmF0b3JgIG1hcHBpbmcgd2hlbiBhbGwgc2NoZW1hcyBpbiB0aGUgdW5pb24gYXJlIFtyZWdpc3RlcmVkXSgjY3JlYXRpbmctY29tcG9uZW50cykuIFRoZSBkaXNjcmltaW5hdG9yIG11c3QgYmUgYSBgWm9kTGl0ZXJhbGAsIGBab2RFbnVtYCBvciBgWm9kTmF0aXZlRW51bWAgd2l0aCBzdHJpbmcgdmFsdWVzLiBPbmx5IHZhbHVlcyB3cmFwcGVkIGluIGBab2RCcmFuZGVkYCwgYFpvZFJlYWRPbmx5YCBhbmQgYFpvZENhdGNoYCBhcmUgc3VwcG9ydGVkLgotIFpvZEVmZmVjdHMKICAtIGB0cmFuc2Zvcm1gIHN1cHBvcnQgZm9yIHJlcXVlc3Qgc2NoZW1hcy4gU2VlIFtab2QgRWZmZWN0c10oI3pvZC1lZmZlY3RzKSBmb3IgaG93IHRvIGVuYWJsZSByZXNwb25zZSBzY2hlbWEgc3VwcG9ydAogIC0gYHByZS1wcm9jZXNzYCBzdXBwb3J0LiBXZSBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgdHlwZSBpcyB0aGUgc2FtZSBhcyB0aGUgb3V0cHV0IHR5cGUuIE90aGVyd2lzZSBwaXBlIGFuZCB0cmFuc2Zvcm0gY2FuIGJlIHVzZWQgaW5zdGVhZC4KICAtIGByZWZpbmVgIGZ1bGwgc3VwcG9ydAotIFpvZEVudW0KLSBab2RJbnRlcnNlY3Rpb24KLSBab2RMYXp5CiAgLSBUaGUgcmVjdXJzaXZlIHNjaGVtYSB3aXRoaW4gdGhlIFpvZExhenkgb3IgdGhlIFpvZExhenkgXyoqbXVzdCoqXyBiZSByZWdpc3RlcmVkIGFzIGEgY29tcG9uZW50LiBTZWUgW0NyZWF0aW5nIENvbXBvbmVudHNdKCNjcmVhdGluZy1jb21wb25lbnRzKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSBab2RMaXRlcmFsCi0gWm9kTmF0aXZlRW51bQogIC0gc3VwcG9ydGluZyBgc3RyaW5nYCwgYG51bWJlcmAgYW5kIGNvbWJpbmVkIGVudW1zLgotIFpvZE5ldmVyCi0gWm9kTnVsbAotIFpvZE51bGxhYmxlCi0gWm9kTnVtYmVyCiAgLSBgaW50ZWdlcmAgYHR5cGVgIG1hcHBpbmcgZm9yIGAuaW50KClgCiAgLSBgZXhjbHVzaXZlTWluYC9gbWluYC9gZXhjbHVzaXZlTWF4YC9gbWF4YCBtYXBwaW5nIGZvciBgLm1pbigpYCwgYC5tYXgoKWAsIGBsdCgpYCwgYGd0KClgCi0gWm9kT2JqZWN0CiAgLSBgYWRkaXRpb25hbFByb3BlcnRpZXNgIG1hcHBpbmcgZm9yIGAuY2F0Y2hhbGwoKWAsIGAuc3RyaWN0KClgCiAgLSBgYWxsT2ZgIG1hcHBpbmcgZm9yIGAuZXh0ZW5kKClgIHdoZW4gdGhlIGJhc2Ugb2JqZWN0IGlzIHJlZ2lzdGVyZWQgYW5kIGRvZXMgbm90IGhhdmUgYGNhdGNoYWxsKClgLCBgc3RyaWN0KClgIGFuZCBleHRlbnNpb24gZG9lcyBub3Qgb3ZlcnJpZGUgYSBmaWVsZC4KLSBab2RPcHRpb25hbAotIFpvZFBpcGVsaW5lCiAgLSBTZWUgW1pvZCBFZmZlY3RzXSgjem9kLWVmZmVjdHMpIGZvciBtb3JlIGluZm9ybWF0aW9uLgotIFpvZFJlYWRvbmx5Ci0gWm9kUmVjb3JkCi0gWm9kU2V0CiAgLSBUcmVhdGVkIGFzIGFuIGFycmF5IHdpdGggYHVuaXF1ZUl0ZW1zYCAoeW91IG1heSBuZWVkIHRvIGFkZCBhIHByZS1wcm9jZXNzIHRvIGNvbnZlcnQgaXQgdG8gYSBzZXQpCi0gWm9kU3RyaW5nCiAgLSBgZm9ybWF0YCBtYXBwaW5nIGZvciBgLnVybCgpYCwgYC51dWlkKClgLCBgLmVtYWlsKClgLCBgLmRhdGV0aW1lKClgLCBgLmRhdGUoKWAsIGAudGltZSgpYCwgYC5kdXJhdGlvbigpYAogIC0gYG1pbkxlbmd0aGAvYG1heExlbmd0aGAgbWFwcGluZyBmb3IgYC5sZW5ndGgoKWAsIGAubWluKClgLCBgLm1heCgpYAogIC0gYHBhdHRlcm5gIG1hcHBpbmcgZm9yIGAucmVnZXgoKWAsIGAuc3RhcnRzV2l0aCgpYCwgYC5lbmRzV2l0aCgpYCwgYC5pbmNsdWRlcygpYAogIC0gYGNvbnRlbnRFbmNvZGluZ2AgbWFwcGluZyBmb3IgYC5iYXNlNjQoKWAgZm9yIE9wZW5BUEkgMy4xLjArCi0gWm9kVHVwbGUKICAtIGBpdGVtc2AgbWFwcGluZyBmb3IgYC5yZXN0KClgCiAgLSBgcHJlZml4SXRlbXNgIG1hcHBpbmcgZm9yIE9wZW5BUEkgMy4xLjArCi0gWm9kVW5kZWZpbmVkCi0gWm9kVW5pb24KICAtIEJ5IGRlZmF1bHQgaXQgb3V0cHV0cyBhbiBgYWxsT2ZgIHNjaGVtYS4gVXNlIGB1bmlvbk9uZU9mYCB0byBjaGFuZ2UgdGhpcyB0byBvdXRwdXQgYG9uZU9mYCBpbnN0ZWFkLgotIFpvZFVua25vd24KCklmIHRoaXMgbGlicmFyeSBjYW5ub3QgZGV0ZXJtaW5lIGEgdHlwZSBmb3IgYSBab2QgU2NoZW1hLCBpdCB3aWxsIHRocm93IGFuIGVycm9yLiBUbyBhdm9pZCB0aGlzLCBkZWNsYXJlIGEgbWFudWFsIGB0eXBlYCBpbiB0aGUgYC5vcGVuYXBpKClgIHNlY3Rpb24gb2YgdGhhdCBzY2hlbWEuCgplZy4KCmBgYHR5cGVzY3JpcHQKei5jdXN0b20oKS5vcGVuYXBpKHsgdHlwZTogJ3N0cmluZycgfSk7CmBgYAoKIyMgRXhhbXBsZXMKClNlZSB0aGUgbGlicmFyeSBpbiB1c2UgaW4gdGhlIFtleGFtcGxlc10oLi9leGFtcGxlcy8pIGZvbGRlci4KCi0gU2ltcGxlIC0gW3NldHVwXSguL2V4YW1wbGVzL3NpbXBsZS9jcmVhdGVTY2hlbWEudHMpIHwgW29wZW5hcGkueW1sXSguL2V4YW1wbGVzL3NpbXBsZS9vcGVuYXBpLnltbCkgfCBbcmVkb2MgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9zYW1jaHVuZ3kuZ2l0aHViLmlvL3pvZC1vcGVuYXBpL2V4YW1wbGVzL3NpbXBsZS9yZWRvYy1zdGF0aWMuaHRtbCkKCiMjIEVjb3N5c3RlbQoKLSBbZmFzdGlmeS16b2Qtb3BlbmFwaV0oaHR0cHM6Ly9naXRodWIuY29tL3NhbWNodW5neS9mYXN0aWZ5LXpvZC1vcGVuYXBpKSAtIEZhc3RpZnkgcGx1Z2luIGZvciB6b2Qtb3BlbmFwaS4gVGhpcyBpbmNsdWRlcyB0eXBlIHByb3ZpZGVyLCBab2Qgc2NoZW1hIHZhbGlkYXRpb24sIFpvZCBzY2hlbWEgc2VyaWFsaXphdGlvbiBhbmQgU3dhZ2dlciBVSSBzdXBwb3J0LgoKLSBbZXNsaW50LXBsdWdpbi16b2Qtb3BlbmFwaV0oaHR0cHM6Ly9naXRodWIuY29tL3NhbWNodW5neS9lc2xpbnQtcGx1Z2luLXpvZC1vcGVuYXBpKSAtIEVzbGludCBydWxlcyBmb3Igem9kLW9wZW5hcGkuIFRoaXMgaW5jbHVkZXMgZmVhdHVyZXMgd2hpY2ggY2FuIGF1dG9nZW5lcmF0ZSBUeXBlc2NyaXB0IGNvbW1lbnRzIGZvciB5b3VyIFpvZCB0eXBlcyBiYXNlZCBvbiB5b3VyIGBkZXNjcmlwdGlvbmAsIGBleGFtcGxlYCBhbmQgYGRlcHJlY2F0ZWRgIGZpZWxkcy4KCiMjIENvbXBhcmlzb25zCgojIyMgW0Bhc3RlYXNvbHV0aW9ucy96b2QtdG8tb3BlbmFwaV0oLi9kb2NzL2NvbXBhcmlzb25zLm1kKQoKIyMgRGV2ZWxvcG1lbnQKCiMjIyBQcmVyZXF1aXNpdGVzCgotIE5vZGUuanMgTFRTCi0gcG5wbQoKYGBgc2hlbGwKcG5wbQpwbnBtIGJ1aWxkCmBgYAoKIyMjIFRlc3QKCmBgYHNoZWxsCnBucG0gdGVzdApgYGAKCiMjIyBMaW50CgpgYGBzaGVsbAojIEZpeCBpc3N1ZXMKcG5wbSBmb3JtYXQKCiMgQ2hlY2sgZm9yIGlzc3VlcwpwbnBtIGxpbnQKYGBgCgojIyMgUmVsZWFzZQoKVG8gcmVsZWFzZSBhIG5ldyB2ZXJzaW9uCgoxLiBDcmVhdGUgYSBbbmV3IEdpdEh1YiBSZWxlYXNlXShodHRwczovL2dpdGh1Yi5jb20vc2FtY2h1bmd5L3pvZC1vcGVuYXBpL3JlbGVhc2VzL25ldykKMi4gU2VsZWN0IGDwn4+377iPIENob29zZSBhIHRhZ2AsIGVudGVyIGEgdmVyc2lvbiBudW1iZXIuIGVnLiBgdjEuMi4wYCBhbmQgY2xpY2sgYCsgQ3JlYXRlIG5ldyB0YWc6IHZYLlguWCBvbiBwdWJsaXNoYC4KMy4gQ2xpY2sgdGhlIGBHZW5lcmF0ZSByZWxlYXNlIG5vdGVzYCBidXR0b24gYW5kIGFkanVzdCB0aGUgZGVzY3JpcHRpb24uCjQuIFRpY2sgdGhlIGBTZXQgYXMgdGhlIGxhdGVzdCByZWxlYXNlYCBib3ggYW5kIGNsaWNrIGBQdWJsaXNoIHJlbGVhc2VgLiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgYFJlbGVhc2VgIHdvcmtmbG93Lgo1LiBDaGVjayB0aGUgYFB1bGwgUmVxdWVzdHNgIHRhYiBmb3IgYSBQUiBsYWJlbGxlZCBgUmVsZWFzZSB2WC5YLlhgLgo2LiBDbGljayBgTWVyZ2UgUHVsbCBSZXF1ZXN0YCBvbiB0aGF0IFB1bGwgUmVxdWVzdCB0byB1cGRhdGUgbWFzdGVyIHdpdGggdGhlIG5ldyBwYWNrYWdlIHZlcnNpb24uCgpUbyByZWxlYXNlIGEgbmV3IGJldGEgdmVyc2lvbgoKMS4gQ3JlYXRlIGEgW25ldyBHaXRIdWIgUmVsZWFzZV0oaHR0cHM6Ly9naXRodWIuY29tL3NhbWNodW5neS96b2Qtb3BlbmFwaS9yZWxlYXNlcy9uZXcpCjIuIFNlbGVjdCBg8J+Pt++4jyBDaG9vc2UgYSB0YWdgLCBlbnRlciBhIHZlcnNpb24gbnVtYmVyIHdpdGggYSBgLWJldGEuWGAgc3VmZml4IGVnLiBgdjEuMi4wLWJldGEuMWAgYW5kIGNsaWNrIGArIENyZWF0ZSBuZXcgdGFnOiB2WC5YLlgtYmV0YS5YIG9uIHB1Ymxpc2hgLgozLiBDbGljayB0aGUgYEdlbmVyYXRlIHJlbGVhc2Ugbm90ZXNgIGJ1dHRvbiBhbmQgYWRqdXN0IHRoZSBkZXNjcmlwdGlvbi4KNC4gVGljayB0aGUgYFNldCBhcyBhIHByZS1yZWxlYXNlYCBib3ggYW5kIGNsaWNrIGBQdWJsaXNoIHJlbGVhc2VgLiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgYFByZXJlbGVhc2VgIHdvcmtmbG93Lgo=
- readmeEtag: '"3f009d1bd356f5676ed0c24a9a537e525f4ce1f3"'
- readmeLastModified: Fri, 20 Sep 2024 06:06:05 GMT
+ PHAgYWxpZ249ImNlbnRlciI+CiAgPGltZyBzcmM9InpvZC1vcGVuYXBpLnN2ZyIgd2lkdGg9IjIwMHB4IiBhbGlnbj0iY2VudGVyIiBhbHQ9InpvZC1vcGVuYXBpIGxvZ28iIC8+CiAgPGgxIGFsaWduPSJjZW50ZXIiPnpvZC1vcGVuYXBpPC9oMT4KPC9wPgo8cCBhbGlnbj0iY2VudGVyIj4KQSBUeXBlc2NyaXB0IGxpYnJhcnkgdG8gdXNlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2xpbmhhY2tzL3pvZCI+Wm9kPC9hPiBTY2hlbWFzIHRvIGNyZWF0ZSBPcGVuQVBJIHYzLnggZG9jdW1lbnRhdGlvbgo8L3A+CjxkaXYgYWxpZ249ImNlbnRlciI+CjxhIGhyZWY9Imh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3pvZC1vcGVuYXBpIj48aW1nIHNyYz0iaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9ucG0vdi96b2Qtb3BlbmFwaSIvPjxhPgo8YSBocmVmPSJodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS96b2Qtb3BlbmFwaSI+PGltZyBzcmM9Imh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL2RtL3pvZC1vcGVuYXBpIi8+PGE+CjxhIGhyZWY9Imh0dHBzOi8vbm9kZWpzLm9yZy9lbi8iPjxpbWcgc3JjPSJodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL25vZGUtJTNFJTNEJTIwMTgtYnJpZ2h0Z3JlZW4iLz48YT4KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NhbWNodW5neS96b2Qtb3BlbmFwaS9hY3Rpb25zL3dvcmtmbG93cy90ZXN0LnltbCI+PGltZyBzcmM9Imh0dHBzOi8vZ2l0aHViLmNvbS9zYW1jaHVuZ3kvem9kLW9wZW5hcGkvYWN0aW9ucy93b3JrZmxvd3MvdGVzdC55bWwvYmFkZ2Uuc3ZnIi8+PGE+CjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zYW1jaHVuZ3kvem9kLW9wZW5hcGkvYWN0aW9ucy93b3JrZmxvd3MvcmVsZWFzZS55bWwiPjxpbWcgc3JjPSJodHRwczovL2dpdGh1Yi5jb20vc2FtY2h1bmd5L3pvZC1vcGVuYXBpL2FjdGlvbnMvd29ya2Zsb3dzL3JlbGVhc2UueW1sL2JhZGdlLnN2ZyIvPjxhPgo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2Vlay1vc3Mvc2t1YmEiPjxpbWcgc3JjPSJodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL/CfpL8lMjBza3ViYS1wb3dlcmVkLTAwOURDNCIvPjxhPgo8L2Rpdj4KPGJyPgoKIyMgSW5zdGFsbAoKSW5zdGFsbCB2aWEgYG5wbWAsIGB5YXJuYCBvciBgcG5wbWA6CgpgYGBiYXNoCm5wbSBpbnN0YWxsIHpvZCB6b2Qtb3BlbmFwaQojIyBvcgp5YXJuIGFkZCB6b2Qgem9kLW9wZW5hcGkKIyMgb3IKcG5wbSBpbnN0YWxsIHpvZCB6b2Qtb3BlbmFwaQpgYGAKCiMjIFVzYWdlCgojIyMgRXh0ZW5kIFpvZAoKVGhpcyBtdXRhdGVzIFpvZCB0byBhZGQgYW4gZXh0cmEgYC5vcGVuYXBpKClgIG1ldGhvZC4gQ2FsbCB0aGlzIGF0IHRoZSB0b3Agb2YgeW91ciBlbnRyeSBwb2ludChzKS4gWW91IGNhbiBhY2hpZXZlIHRoaXMgaW4gdHdvIGRpZmZlcmVudCB3YXlzLCBkZXBlbmRpbmcgb24geW91ciBwcmVmZXJlbmNlLgoKIyMjIyBTdWJwYXRoIEltcG9ydAoKYGBgdHMKaW1wb3J0ICd6b2Qtb3BlbmFwaS9leHRlbmQnOwppbXBvcnQgeyB6IH0gZnJvbSAnem9kJzsKCnouc3RyaW5nKCkub3BlbmFwaSh7IGRlc2NyaXB0aW9uOiAnaGVsbG8gd29ybGQhJywgZXhhbXBsZTogJ2hlbGxvIHdvcmxkJyB9KTsKYGBgCgojIyMjIE1hbnVhbCBFeHRlbnNpb24KClRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGEgc3BlY2lmaWMgaW5zdGFuY2Ugb2YgWm9kIG9yIGEgWm9kIGluc3RhbmNlIGZyb20gYW5vdGhlciBsaWJyYXJ5IHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdGFyZ2V0LgoKYGBgdHlwZXNjcmlwdAppbXBvcnQgeyB6IH0gZnJvbSAnem9kJzsKaW1wb3J0IHsgZXh0ZW5kWm9kV2l0aE9wZW5BcGkgfSBmcm9tICd6b2Qtb3BlbmFwaSc7CgpleHRlbmRab2RXaXRoT3BlbkFwaSh6KTsKCnouc3RyaW5nKCkub3BlbmFwaSh7IGRlc2NyaXB0aW9uOiAnaGVsbG8gd29ybGQhJywgZXhhbXBsZTogJ2hlbGxvIHdvcmxkJyB9KTsKYGBgCgojIyMjIGAub3BlbmFwaSgpYAoKVXNlIHRoZSBgLm9wZW5hcGkoKWAgbWV0aG9kIHRvIGFkZCBtZXRhZGF0YSB0byBhIHNwZWNpZmljIFpvZCB0eXBlLiBUaGUgYC5vcGVuYXBpKClgIG1ldGhvZCB0YWtlcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6Cgp8ICAgICBPcHRpb24gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgOi0tLS0tLS0tLS0tLS06IHwgOi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS06IHwKfCBPcGVuQVBJIE9wdGlvbnMgfCAgICAgICAgICAgICAgVGhpcyB3aWxsIHRha2UgYW55IG9wdGlvbiB5b3Ugd291bGQgcHV0IG9uIGEgW1NjaGVtYU9iamVjdF0oaHR0cHM6Ly9zd2FnZ2VyLmlvL2RvY3Mvc3BlY2lmaWNhdGlvbi9kYXRhLW1vZGVscy9kYXRhLXR5cGVzLykuICAgICAgICAgICAgICAgfAp8ICBgZWZmZWN0VHlwZWAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0byBvdmVycmlkZSB0aGUgY3JlYXRpb24gdHlwZSBmb3IgYSBbWm9kIEVmZmVjdF0oI3pvZC1lZmZlY3RzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgYGhlYWRlcmAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRvIHByb3ZpZGUgbWV0YWRhdGEgZm9yIFtyZXNwb25zZSBoZWFkZXJzXSgjcmVzcG9uc2UtaGVhZGVycykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgYHBhcmFtYCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0byBwcm92aWRlIG1ldGFkYXRhIGZvciBbcmVxdWVzdCBwYXJhbWV0ZXJzXSgjcGFyYW1ldGVycykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgYHJlZmAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGlzIHRvIFthdXRvIHJlZ2lzdGVyIGEgc2NoZW1hIGFzIGEgcmUtdXNhYmxlIGNvbXBvbmVudF0oI2NyZWF0aW5nLWNvbXBvbmVudHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgYHJlZlR5cGVgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoaXMgdG8gc2V0IHRoZSBjcmVhdGlvbiB0eXBlIGZvciBhIGNvbXBvbmVudCB3aGljaCBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGUgZG9jdW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgYHR5cGVgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSB0aGlzIHRvIG92ZXJyaWRlIHRoZSBnZW5lcmF0ZWQgdHlwZS4gSWYgdGhpcyBpcyBwcm92aWRlZCBubyBtZXRhZGF0YSB3aWxsIGJlIGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8ICBgdW5pb25PbmVPZmAgICB8IFNldCB0byBgdHJ1ZWAgdG8gZm9yY2UgYSBzaW5nbGUgWm9kVW5pb24gdG8gb3V0cHV0IGBvbmVPZmAgaW5zdGVhZCBvZiBgYWxsT2ZgLiBTZWUgW0NyZWF0ZURvY3VtZW50T3B0aW9uc10oI0NyZWF0ZURvY3VtZW50T3B0aW9ucykgZm9yIGEgZ2xvYmFsIG9wdGlvbiB8CgojIyMgYGNyZWF0ZURvY3VtZW50YAoKQ3JlYXRlcyBhbiBPcGVuQVBJIGRvY3VtZW50YXRpb24gb2JqZWN0CgpgYGB0eXBlc2NyaXB0CmltcG9ydCAnem9kLW9wZW5hcGkvZXh0ZW5kJzsKaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7CmltcG9ydCB7IGNyZWF0ZURvY3VtZW50IH0gZnJvbSAnem9kLW9wZW5hcGknOwoKY29uc3Qgam9iSWQgPSB6LnN0cmluZygpLm9wZW5hcGkoewogIGRlc2NyaXB0aW9uOiAnQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBqb2InLAogIGV4YW1wbGU6ICcxMjM0NScsCiAgcmVmOiAnam9iSWQnLAp9KTsKCmNvbnN0IHRpdGxlID0gei5zdHJpbmcoKS5vcGVuYXBpKHsKICBkZXNjcmlwdGlvbjogJ0pvYiB0aXRsZScsCiAgZXhhbXBsZTogJ015IGpvYicsCn0pOwoKY29uc3QgZG9jdW1lbnQgPSBjcmVhdGVEb2N1bWVudCh7CiAgb3BlbmFwaTogJzMuMS4wJywKICBpbmZvOiB7CiAgICB0aXRsZTogJ015IEFQSScsCiAgICB2ZXJzaW9uOiAnMS4wLjAnLAogIH0sCiAgcGF0aHM6IHsKICAgICcvam9icy97am9iSWR9JzogewogICAgICBwdXQ6IHsKICAgICAgICByZXF1ZXN0UGFyYW1zOiB7IHBhdGg6IHoub2JqZWN0KHsgam9iSWQgfSkgfSwKICAgICAgICByZXF1ZXN0Qm9keTogewogICAgICAgICAgY29udGVudDogewogICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6IHsgc2NoZW1hOiB6Lm9iamVjdCh7IHRpdGxlIH0pIH0sCiAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgcmVzcG9uc2VzOiB7CiAgICAgICAgICAnMjAwJzogewogICAgICAgICAgICBkZXNjcmlwdGlvbjogJzIwMCBPSycsCiAgICAgICAgICAgIGNvbnRlbnQ6IHsKICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6IHsgc2NoZW1hOiB6Lm9iamVjdCh7IGpvYklkLCB0aXRsZSB9KSB9LAogICAgICAgICAgICB9LAogICAgICAgICAgfSwKICAgICAgICB9LAogICAgICB9LAogICAgfSwKICB9LAp9KTsKYGBgCgo8ZGV0YWlscz4KICA8c3VtbWFyeT5DcmVhdGVzIHRoZSBmb2xsb3dpbmcgb2JqZWN0Ojwvc3VtbWFyeT4KICAKICBgYGBqc29uCiAgewogICAgIm9wZW5hcGkiOiAiMy4xLjAiLAogICAgImluZm8iOiB7CiAgICAgICJ0aXRsZSI6ICJNeSBBUEkiLAogICAgICAidmVyc2lvbiI6ICIxLjAuMCIKICAgIH0sCiAgICAicGF0aHMiOiB7CiAgICAgICIvam9icy97am9iSWR9IjogewogICAgICAgICJwdXQiOiB7CiAgICAgICAgICAicGFyYW1ldGVycyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJpbiI6ICJwYXRoIiwKICAgICAgICAgICAgICAibmFtZSI6ICJqb2JJZCIsCiAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgam9iIiwKICAgICAgICAgICAgICAic2NoZW1hIjogewogICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvam9iSWQiCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgInJlcXVlc3RCb2R5IjogewogICAgICAgICAgICAiY29udGVudCI6IHsKICAgICAgICAgICAgICAiYXBwbGljYXRpb24vanNvbiI6IHsKICAgICAgICAgICAgICAgICJzY2hlbWEiOiB7CiAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0aXRsZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSm9iIHRpdGxlIiwKICAgICAgICAgICAgICAgICAgICAgICJleGFtcGxlIjogIk15IGpvYiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidGl0bGUiXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJyZXNwb25zZXMiOiB7CiAgICAgICAgICAgICIyMDAiOiB7CiAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIjIwMCBPSyIsCiAgICAgICAgICAgICAgImNvbnRlbnQiOiB7CiAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vanNvbiI6IHsKICAgICAgICAgICAgICAgICAgInNjaGVtYSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgImpvYklkIjogewogICAgICAgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9qb2JJZCIKICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJKb2IgdGl0bGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZXhhbXBsZSI6ICJNeSBqb2IiCiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbImpvYklkIiwgInRpdGxlIl0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJjb21wb25lbnRzIjogewogICAgICAic2NoZW1hcyI6IHsKICAgICAgICAiam9iSWQiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgam9iIiwKICAgICAgICAgICJleGFtcGxlIjogIjEyMzQ1IgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBgYGAKPC9kZXRhaWxzPgoKIyMjIyBDcmVhdGVEb2N1bWVudE9wdGlvbnMKCmBjcmVhdGVEb2N1bWVudGAgdGFrZXMgYW4gb3B0aW9uYWwgYENyZWF0ZURvY3VtZW50T3B0aW9uc2AgYXJndW1lbnQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IGhvdyB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZC4KCmBgYHR5cGVzY3JpcHQKY29uc3QgZG9jdW1lbnQgPSBjcmVhdGVEb2N1bWVudChkZXRhaWxzLCB7CiAgZGVmYXVsdERhdGVTY2hlbWE6IHsgdHlwZTogJ3N0cmluZycsIGZvcm1hdDogJ2RhdGUtdGltZScgfSwgLy8gZGVmYXVsdHMgdG8geyB0eXBlOiAnc3RyaW5nJyB9CiAgdW5pb25PbmVPZjogdHJ1ZSwgLy8gZGVmYXVsdHMgdG8gZmFsc2UuIEZvcmNlcyBhbGwgWm9kVW5pb25zIHRvIG91dHB1dCBgdHJ1ZWAKfSk7CmBgYAoKIyMjIGBjcmVhdGVTY2hlbWFgCgpDcmVhdGVzIGFuIE9wZW5BUEkgU2NoZW1hIE9iamVjdCBhbG9uZyB3aXRoIGFueSByZWdpc3RlcmVkIGNvbXBvbmVudHMuIE9wZW5BUEkgMy4xLjAgU2NoZW1hIE9iamVjdHMgYXJlIGZ1bGx5IGNvbXBhdGlibGUgd2l0aCBKU09OIFNjaGVtYS4KCmBgYHR5cGVzY3JpcHQKaW1wb3J0ICd6b2Qtb3BlbmFwaS9leHRlbmQnOwppbXBvcnQgeyB6IH0gZnJvbSAnem9kJzsKaW1wb3J0IHsgY3JlYXRlU2NoZW1hIH0gZnJvbSAnem9kLW9wZW5hcGknOwoKY29uc3Qgam9iSWQgPSB6LnN0cmluZygpLm9wZW5hcGkoewogIGRlc2NyaXB0aW9uOiAnQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBqb2InLAogIGV4YW1wbGU6ICcxMjM0NScsCiAgcmVmOiAnam9iSWQnLAp9KTsKCmNvbnN0IHRpdGxlID0gei5zdHJpbmcoKS5vcGVuYXBpKHsKICBkZXNjcmlwdGlvbjogJ0pvYiB0aXRsZScsCiAgZXhhbXBsZTogJ015IGpvYicsCn0pOwoKY29uc3Qgam9iID0gei5vYmplY3QoewogIGpvYklkLAogIHRpdGxlLAp9KTsKCmNvbnN0IHsgc2NoZW1hLCBjb21wb25lbnRzIH0gPSBjcmVhdGVTY2hlbWEoam9iKTsKYGBgCgo8ZGV0YWlscz4KICA8c3VtbWFyeT5DcmVhdGVzIHRoZSBmb2xsb3dpbmcgb2JqZWN0Ojwvc3VtbWFyeT4KICAKICBgYGBqc29uCiAgewogICAgInNjaGVtYSI6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgImpvYklkIjogewogICAgICAgICAgIiRyZWYiOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvam9iSWQiCiAgICAgICAgfSwKICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgImRlc2NyaXB0aW9uIjogIkpvYiB0aXRsZSIsCiAgICAgICAgICAiZXhhbXBsZSI6ICJNeSBqb2IiCiAgICAgICAgfQogICAgICB9LAogICAgICAicmVxdWlyZWQiOiBbImpvYklkIiwgInRpdGxlIl0KICAgIH0sCiAgICAiY29tcG9uZW50cyI6IHsKICAgICAgImpvYklkIjogewogICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgam9iIiwKICAgICAgICAiZXhhbXBsZSI6ICIxMjM0NSIKICAgICAgfQogICAgfQogIH0KICBgYGAKPC9kZXRhaWxzPgoKIyMjIyBDcmVhdGVTY2hlbWFPcHRpb25zCgpgY3JlYXRlU2NoZW1hYCB0YWtlcyBhbiBvcHRpb25hbCBgQ3JlYXRlU2NoZW1hT3B0aW9uc2AgcGFyYW1ldGVyIHdoaWNoIGNhbiBhbHNvIHRha2UgdGhlIHNhbWUgb3B0aW9ucyBhcyBbQ3JlYXRlRG9jdW1lbnRPcHRpb25zXSgjY3JlYXRlZG9jdW1lbnRvcHRpb25zKSBhbG9uZyB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKCmBgYHR5cGVzY3JpcHQKY29uc3QgeyBzY2hlbWEsIGNvbXBvbmVudHMgfSA9IGNyZWF0ZVNjaGVtYShqb2IsIHsKICBzY2hlbWFUeXBlOiAnaW5wdXQnOyAvLyBUaGlzIGNvbnRyb2xzIHdoZXRoZXIgdGhpcyBzaG91bGQgYmUgcmVuZGVyZWQgYXMgYSByZXF1ZXN0IChgaW5wdXRgKSBvciByZXNwb25zZSAoYG91dHB1dGApLiBEZWZhdWx0cyB0byBgb3V0cHV0YAogIG9wZW5hcGk6ICczLjAuMCc7IC8vIE9wZW5BUEkgdmVyc2lvbiB0byB1c2UsIGRlZmF1bHRzIHRvIGAnMy4xLjAnYAogIGNvbXBvbmVudHM6IHsgam9iSWQ6IHouc3RyaW5nKCkgfSAvLyBBZGRpdGlvbmFsIGNvbXBvbmVudHMgdG8gdXNlIGFuZCBjcmVhdGUgd2hpbGUgcmVuZGVyaW5nIHRoZSBzY2hlbWEKfSkKYGBgCgojIyMgUmVxdWVzdCBQYXJhbWV0ZXJzCgpRdWVyeSwgUGF0aCwgSGVhZGVyICYgQ29va2llIHBhcmFtZXRlcnMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIGByZXF1ZXN0UGFyYW1zYCBrZXkgdW5kZXIgdGhlIGBtZXRob2RgIGtleSBhcyBmb2xsb3dzOgoKYGBgdHlwZXNjcmlwdApjcmVhdGVEb2N1bWVudCh7CiAgcGF0aHM6IHsKICAgICcvam9icy97YX0nOiB7CiAgICAgIHB1dDogewogICAgICAgIHJlcXVlc3RQYXJhbXM6IHsKICAgICAgICAgIHBhdGg6IHoub2JqZWN0KHsgYTogei5zdHJpbmcoKSB9KSwKICAgICAgICAgIHF1ZXJ5OiB6Lm9iamVjdCh7IGI6IHouc3RyaW5nKCkgfSksCiAgICAgICAgICBjb29raWU6IHoub2JqZWN0KHsgY29va2llOiB6LnN0cmluZygpIH0pLAogICAgICAgICAgaGVhZGVyOiB6Lm9iamVjdCh7ICdjdXN0b20taGVhZGVyJzogei5zdHJpbmcoKSB9KSwKICAgICAgICB9LAogICAgICB9LAogICAgfSwKICB9LAp9KTsKYGBgCgpJZiB5b3Ugd291bGQgbGlrZSB0byBkZWNsYXJlIHBhcmFtZXRlcnMgaW4gYSBtb3JlIHRyYWRpdGlvbmFsIHdheSB5b3UgbWF5IGFsc28gZGVjbGFyZSB0aGVtIHVzaW5nIHRoZSBbcGFyYW1ldGVyc10oaHR0cHM6Ly9zd2FnZ2VyLmlvL2RvY3Mvc3BlY2lmaWNhdGlvbi9kZXNjcmliaW5nLXBhcmFtZXRlcnMvKSBrZXkuIFRoZSBkZWZpbml0aW9ucyB3aWxsIHRoZW4gYWxsIGJlIGNvbWJpbmVkLgoKYGBgdHMKY3JlYXRlRG9jdW1lbnQoewogIHBhdGhzOiB7CiAgICAnL2pvYnMve2F9JzogewogICAgICBwdXQ6IHsKICAgICAgICBwYXJhbWV0ZXJzOiBbCiAgICAgICAgICB6LnN0cmluZygpLm9wZW5hcGkoewogICAgICAgICAgICBwYXJhbTogewogICAgICAgICAgICAgIG5hbWU6ICdqb2ItaGVhZGVyJywKICAgICAgICAgICAgICBpbjogJ2hlYWRlcicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICB9KSwKICAgICAgICBdLAogICAgICB9LAogICAgfSwKICB9LAp9KTsKYGBgCgojIyMgUmVxdWVzdCBCb2R5CgpXaGVyZSB5b3Ugd291bGQgbm9ybWFsbHkgZGVjbGFyZSB0aGUgW21lZGlhIHR5cGVdKGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vbWVkaWEtdHlwZXMvKSwgc2V0IHRoZSBgc2NoZW1hYCBhcyB5b3VyIFpvZCBTY2hlbWEgYXMgZm9sbG93cy4KCmBgYHR5cGVzY3JpcHQKY3JlYXRlRG9jdW1lbnQoewogIHBhdGhzOiB7CiAgICAnL2pvYnMnOiB7CiAgICAgIGdldDogewogICAgICAgIHJlcXVlc3RCb2R5OiB7CiAgICAgICAgICBjb250ZW50OiB7CiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJzogeyBzY2hlbWE6IHoub2JqZWN0KHsgYTogei5zdHJpbmcoKSB9KSB9LAogICAgICAgICAgfSwKICAgICAgICB9LAogICAgICB9LAogICAgfSwKICB9LAp9KTsKYGBgCgpJZiB5b3Ugd2lzaCB0byB1c2UgT3BlbkFQSSBzeW50YXggZm9yIHlvdXIgc2NoZW1hcywgc2ltcGx5IGFkZCBhbiBPcGVuQVBJIHNjaGVtYSB0byB0aGUgYHNjaGVtYWAgZmllbGQgaW5zdGVhZC4KCiMjIyBSZXNwb25zZXMKClNpbWlsYXJseSB0byB0aGUgW1JlcXVlc3QgQm9keV0oI3JlcXVlc3QtYm9keSksIHNpbXBseSBzZXQgdGhlIGBzY2hlbWFgIGFzIHlvdXIgWm9kIFNjaGVtYSBhcyBmb2xsb3dzLiBZb3UgY2FuIHNldCB0aGUgcmVzcG9uc2UgaGVhZGVycyB1c2luZyB0aGUgYGhlYWRlcnNgIGtleS4KCmBgYHR5cGVzY3JpcHQKY3JlYXRlRG9jdW1lbnQoewogIHBhdGhzOiB7CiAgICAnL2pvYnMnOiB7CiAgICAgIGdldDogewogICAgICAgIHJlc3BvbnNlczogewogICAgICAgICAgMjAwOiB7CiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnMjAwIE9LJywKICAgICAgICAgICAgY29udGVudDogewogICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJzogeyBzY2hlbWE6IHoub2JqZWN0KHsgYTogei5zdHJpbmcoKSB9KSB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBoZWFkZXJzOiB6Lm9iamVjdCh7CiAgICAgICAgICAgICAgJ2hlYWRlci1rZXknOiB6LnN0cmluZygpLAogICAgICAgICAgICB9KSwKICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgfSwKICAgIH0sCiAgfSwKfSk7CmBgYAoKIyMjIENhbGxiYWNrcwoKYGBgdHlwZXNjcmlwdApjcmVhdGVEb2N1bWVudCh7CiAgcGF0aHM6IHsKICAgICcvam9icyc6IHsKICAgICAgZ2V0OiB7CiAgICAgICAgY2FsbGJhY2tzOiB7CiAgICAgICAgICBvbkRhdGE6IHsKICAgICAgICAgICAgJ3skcmVxdWVzdC5xdWVyeS5jYWxsYmFja1VybH0vZGF0YSc6IHsKICAgICAgICAgICAgICBwb3N0OiB7CiAgICAgICAgICAgICAgICByZXF1ZXN0Qm9keTogewogICAgICAgICAgICAgICAgICBjb250ZW50OiB7CiAgICAgICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nOiB7IHNjaGVtYTogei5vYmplY3QoeyBhOiB6LnN0cmluZygpIH0pIH0sCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVzcG9uc2VzOiB7CiAgICAgICAgICAgICAgICAgIDIwMDogewogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnMjAwIE9LJywKICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB7CiAgICAgICAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiB6Lm9iamVjdCh7IGE6IHouc3RyaW5nKCkgfSksCiAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgIH0sCiAgICB9LAogIH0sCn0pOwpgYGAKCiMjIyBDcmVhdGluZyBDb21wb25lbnRzCgpPcGVuQVBJIGFsbG93cyB5b3UgdG8gZGVmaW5lIHJldXNhYmxlIFtjb21wb25lbnRzXShodHRwczovL3N3YWdnZXIuaW8vZG9jcy9zcGVjaWZpY2F0aW9uL2NvbXBvbmVudHMvKSBhbmQgdGhpcyBsaWJyYXJ5IGFsbG93cyB5b3UgdG8gcmVwbGljYXRlIHRoYXQgaW4gdHdvIHNlcGFyYXRlIHdheXMuCgoxLiBBdXRvIHJlZ2lzdGVyaW5nIHNjaGVtYQoyLiBNYW51YWxseSByZWdpc3RlcmluZyBzY2hlbWEKCiMjIyMgU2NoZW1hCgpJZiB3ZSB0YWtlIHRoZSBleGFtcGxlIGluIGBjcmVhdGVEb2N1bWVudGAgYW5kIGluc3RlYWQgY3JlYXRlIGB0aXRsZWAgYXMgZm9sbG93cwoKIyMjIyMgQXV0byBSZWdpc3RlcmluZyBTY2hlbWEKCmBgYHR5cGVzY3JpcHQKY29uc3QgdGl0bGUgPSB6LnN0cmluZygpLm9wZW5hcGkoewogIGRlc2NyaXB0aW9uOiAnSm9iIHRpdGxlJywKICBleGFtcGxlOiAnTXkgam9iJywKICByZWY6ICdqb2JUaXRsZScsIC8vIDwtIG5ldyBmaWVsZAp9KTsKYGBgCgpXaGVyZXZlciBgdGl0bGVgIGlzIHVzZWQgaW4gc2NoZW1hcyBhY3Jvc3MgdGhlIGRvY3VtZW50LCBpdCB3aWxsIGluc3RlYWQgYmUgY3JlYXRlZCBhcyBhIHJlZmVyZW5jZS4KCmBgYGpzb24KeyAiJHJlZiI6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9qb2JUaXRsZSIgfQpgYGAKCmB0aXRsZWAgd2lsbCB0aGVuIGJlIG91dHB1dHRlZCBhcyBhIHNjaGVtYSB3aXRoaW4gdGhlIGNvbXBvbmVudHMgc2VjdGlvbiBvZiB0aGUgZG9jdW1lbnRhdGlvbi4KCmBgYGpzb24KewogICJjb21wb25lbnRzIjogewogICAgInNjaGVtYXMiOiB7CiAgICAgICJqb2JUaXRsZSI6IHsKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICJkZXNjcmlwdGlvbiI6ICJKb2IgdGl0bGUiLAogICAgICAgICJleGFtcGxlIjogIk15IGpvYiIKICAgICAgfQogICAgfQogIH0KfQpgYGAKClRoaXMgY2FuIGJlIGFuIGV4dHJlbWVseSBwb3dlcmZ1bCB3YXkgdG8gY3JlYXRlIGxlc3MgcmVwZXRpdGl2ZSBPcGVuIEFQSSBkb2N1bWVudGF0aW9uLiBUaGVyZSBhcmUgc29tZSBPcGVuIEFQSSBmZWF0dXJlcyBsaWtlIFtkaXNjcmltaW5hdG9yIG1hcHBpbmddKGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vZGF0YS1tb2RlbHMvaW5oZXJpdGFuY2UtYW5kLXBvbHltb3JwaGlzbS8pIHdoaWNoIHJlcXVpcmUgYWxsIHNjaGVtYXMgaW4gdGhlIHVuaW9uIHRvIGNvbnRhaW4gYSByZWYuCgojIyMjIyBNYW51YWxseSBSZWdpc3RlcmluZyBTY2hlbWEKCkFub3RoZXIgd2F5IHRvIHJlZ2lzdGVyIHNjaGVtYSBpbnN0ZWFkIG9mIGFkZGluZyBhIGByZWZgIGlzIHRvIGFkZCBpdCB0byB0aGUgY29tcG9uZW50cyBkaXJlY3RseS4gVGhpcyB3aWxsIHN0aWxsIHdvcmsgaW4gdGhlIHNhbWUgd2F5IGFzIGByZWZgLiBTbyB3aGVuZXZlciB3ZSBydW4gaW50byB0aGF0IFpvZCB0eXBlIHdlIHdpbGwgcmVwbGFjZSBpdCB3aXRoIGEgcmVmZXJlbmNlLgoKZWcuCgpgYGB0eXBlc2NyaXB0CmNyZWF0ZURvY3VtZW50KHsKICBjb21wb25lbnRzOiB7CiAgICBzY2hlbWFzOiB7CiAgICAgIGpvYlRpdGxlOiB0aXRsZSwgLy8gdGhpcyB3aWxsIHJlZ2lzdGVyIHRoaXMgWm9kIFNjaGVtYSBhcyBqb2JUaXRsZSB1bmxlc3MgYHJlZmAgaW4gYC5vcGVuYXBpKClgIGlzIHNwZWNpZmllZCBvbiB0aGUgdHlwZQogICAgfSwKICB9LAp9KTsKYGBgCgojIyMjIyBab2QgRWZmZWN0cwoKYC50cmFuc2Zvcm0oKWAsIGAuZGVmYXVsdCgpYCBhbmQgYC5waXBlKClgIGFyZSBjb21wbGljYXRlZCBiZWNhdXNlIHRoZXkgdGVjaG5pY2FsbHkgY29tcHJpc2Ugb2YgdHdvIHR5cGVzIChpbnB1dCAmIG91dHB1dCkuIFRoaXMgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hpY2ggdHlwZSB5b3UgYXJlIGNyZWF0aW5nLiBJbiBwYXJ0aWN1bGFyIHdpdGggdHJhbnNmb3JtIGl0IGlzIHZlcnkgZGlmZmljdWx0IHRvIGluZmVyIHRoZSBvdXRwdXQgdHlwZS4gVGhpcyBsaWJyYXJ5IHdpbGwgYXV0b21hdGljYWxseSBzZWxlY3Qgd2hpY2ggX3R5cGVfIHRvIHVzZSBieSBjaGVja2luZyBob3cgdGhlIHNjaGVtYSBpcyB1c2VkIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgcnVsZXM6CgpfSW5wdXRfOiBSZXF1ZXN0IEJvZGllcywgUmVxdWVzdCBQYXJhbWV0ZXJzLCBIZWFkZXJzCgpfT3V0cHV0XzogUmVzcG9uc2VzLCBSZXNwb25zZSBIZWFkZXJzCgpJZiBhIHJlZ2lzdGVyZWQgc2NoZW1hIHdpdGggYSB0cmFuc2Zvcm0gb3IgcGlwZWxpbmUgaXMgdXNlZCBpbiBib3RoIGEgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugc2NoZW1hIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgYmVjYXVzZSB0aGUgY3JlYXRlZCBzY2hlbWEgZm9yIGVhY2ggd2lsbCBiZSBkaWZmZXJlbnQuIFRvIG92ZXJyaWRlIHRoZSBjcmVhdGlvbiB0eXBlIGZvciBhIHNwZWNpZmljIFpvZEVmZmVjdCwgYWRkIGFuIGAub3BlbmFwaSgpYCBmaWVsZCBvbiBpdCBhbmQgc2V0IHRoZSBgZWZmZWN0VHlwZWAgZmllbGQgdG8gYGlucHV0YCwgYG91dHB1dGAgb3IgYHNhbWVgLiBUaGlzIHdpbGwgZm9yY2UgdGhpcyBsaWJyYXJ5IHRvIGFsd2F5cyBnZW5lcmF0ZSB0aGUgaW5wdXQvb3V0cHV0IHR5cGUgZXZlbiBpZiB3ZSBhcmUgY3JlYXRpbmcgYSByZXNwb25zZSAob3V0cHV0KSBvciByZXF1ZXN0IChpbnB1dCkgdHlwZS4gWW91IHR5cGljYWxseSB3YW50IHRvIHNldCB0aGlzIHdoZW4geW91IGtub3cgdGhlIHR5cGUgaGFzIG5vdCBjaGFuZ2VkIGluIHRoZSB0cmFuc2Zvcm0uIGBzYW1lYCBpcyB0aGUgcmVjb21tZW5kZWQgY2hvaWNlIGFzIGl0IHdpbGwgZ2VuZXJhdGUgYSBUeXBlU2NyaXB0IGNvbXBpbGVyIGVycm9yIGlmIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHR5cGVzIGluIHRoZSB0cmFuc2Zvcm0gZHJpZnQuCgpgLnByZXByb2Nlc3MoKWAgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBgb3V0cHV0YCB0eXBlIGV2ZW4gaWYgd2UgYXJlIGNyZWF0aW5nIGFuIGlucHV0IHNjaGVtYS4gSWYgYSBkaWZmZXJlbnQgaW5wdXQgdHlwZSBpcyByZXF1aXJlZCB5b3UgY2FuIGFjaGlldmUgdGhpcyB3aXRoIGEgYC50cmFuc2Zvcm0oKWAgY29tYmluZWQgd2l0aCBhIGAucGlwZSgpYCBvciBzaW1wbHkgZGVjbGFyZSBhIG1hbnVhbCBgdHlwZWAgaW4gYC5vcGVuYXBpKClgLgoKSWYgeW91IGFyZSBhZGRpbmcgYSBab2RTY2hlbWEgZGlyZWN0bHkgdG8gdGhlIGBjb21wb25lbnRzYCBzZWN0aW9uIHdoaWNoIGlzIG5vdCByZWZlcmVuY2VkIGFueXdoZXJlIGluIHRoZSBkb2N1bWVudCwgYWRkaXRpb25hbCBjb250ZXh0IG1heSBiZSByZXF1aXJlZCB0byBjcmVhdGUgZWl0aGVyIGFuIGlucHV0IG9yIG91dHB1dCBzY2hlbWEuIFlvdSBjYW4gZG8gdGhpcyBieSBzZXR0aW5nIHRoZSBgcmVmVHlwZWAgZmllbGQgdG8gYGlucHV0YCBvciBgb3V0cHV0YCBpbiBgLm9wZW5hcGkoKWAuIFRoaXMgZGVmYXVsdHMgdG8gYG91dHB1dGAgYnkgZGVmYXVsdC4KCiMjIyMgUGFyYW1ldGVycwoKUXVlcnksIFBhdGgsIEhlYWRlciAmIENvb2tpZSBwYXJhbWV0ZXJzIGNhbiBiZSBzaW1pbGFybHkgcmVnaXN0ZXJlZDoKCmBgYHR5cGVzY3JpcHQKLy8gRWFzeSBhdXRvIHJlZ2lzdHJhdGlvbgpjb25zdCBqb2JJZCA9IHouc3RyaW5nKCkub3BlbmFwaSh7CiAgZGVzY3JpcHRpb246ICdKb2IgSUQnLAogIGV4YW1wbGU6ICcxMjM0JywKICBwYXJhbTogeyByZWY6ICdqb2JSZWYnIH0sCn0pOwoKY3JlYXRlRG9jdW1lbnQoewogIHBhdGhzOiB7CiAgICAnL2pvYnMve2pvYklkfSc6IHsKICAgICAgcHV0OiB7CiAgICAgICAgcmVxdWVzdFBhcmFtczogewogICAgICAgICAgaGVhZGVyOiB6Lm9iamVjdCh7CiAgICAgICAgICAgIGpvYklkLAogICAgICAgICAgfSksCiAgICAgICAgfSwKICAgICAgfSwKICAgIH0sCiAgfSwKfSk7CgovLyBvciBtb3JlIHZlcmJvc2UgYXV0byByZWdpc3RyYXRpb24KY29uc3Qgam9iSWQgPSB6LnN0cmluZygpLm9wZW5hcGkoewogIGRlc2NyaXB0aW9uOiAnSm9iIElEJywKICBleGFtcGxlOiAnMTIzNCcsCiAgcGFyYW06IHsgaW46ICdoZWFkZXInLCBuYW1lOiAnam9iSWQnLCByZWY6ICdqb2JSZWYnIH0sCn0pOwoKY3JlYXRlRG9jdW1lbnQoewogIHBhdGhzOiB7CiAgICAnL2pvYnMve2pvYklkfSc6IHsKICAgICAgcHV0OiB7CiAgICAgICAgcGFyYW1ldGVyczogW2pvYklkXSwKICAgICAgfSwKICAgIH0sCiAgfSwKfSk7CgovLyBvciBtYW51YWwgcmVnaXN0ZXJhdGlvbgpjb25zdCBvdGhlckpvYklkID0gei5zdHJpbmcoKS5vcGVuYXBpKHsKICBkZXNjcmlwdGlvbjogJ0pvYiBJRCcsCiAgZXhhbXBsZTogJzEyMzQnLAogIHBhcmFtOiB7IGluOiAnaGVhZGVyJywgbmFtZTogJ2pvYklkJyB9LAp9KTsKCmNyZWF0ZURvY3VtZW50KHsKICBjb21wb25lbnRzOiB7CiAgICBwYXJhbWV0ZXJzOiB7CiAgICAgIGpvYlJlZjogam9iSWQsCiAgICB9LAogIH0sCn0pOwpgYGAKCiMjIyMgUmVzcG9uc2UgSGVhZGVycwoKUmVzcG9uc2UgaGVhZGVycyBjYW4gYmUgc2ltaWxhcmx5IHJlZ2lzdGVyZWQ6CgpgYGB0eXBlc2NyaXB0CmNvbnN0IGhlYWRlciA9IHouc3RyaW5nKCkub3BlbmFwaSh7CiAgZGVzY3JpcHRpb246ICdKb2IgSUQnLAogIGV4YW1wbGU6ICcxMjM0JywKICBoZWFkZXI6IHsgcmVmOiAnc29tZS1oZWFkZXInIH0sCn0pOwoKLy8gb3IKCmNvbnN0IGpvYklkSGVhZGVyID0gei5zdHJpbmcoKS5vcGVuYXBpKHsKICBkZXNjcmlwdGlvbjogJ0pvYiBJRCcsCiAgZXhhbXBsZTogJzEyMzQnLAp9KTsKCmNyZWF0ZURvY3VtZW50KHsKICBjb21wb25lbnRzOiB7CiAgICBoZWFkZXJzOiB7CiAgICAgIHNvbWVIZWFkZXJSZWY6IGpvYklkSGVhZGVyLAogICAgfSwKICB9LAp9KTsKYGBgCgojIyMjIFJlc3BvbnNlcwoKRW50aXJlIFJlc3BvbnNlcyBjYW4gYWxzbyBiZSByZWdpc3RlcmVkCgpgYGB0eXBlc2NyaXB0CmNvbnN0IHJlc3BvbnNlOiBab2RPcGVuQXBpUmVzcG9uc2VPYmplY3QgPSB7CiAgZGVzY3JpcHRpb246ICcyMDAgT0snLAogIGNvbnRlbnQ6IHsKICAgICdhcHBsaWNhdGlvbi9qc29uJzogewogICAgICBzY2hlbWE6IHoub2JqZWN0KHsgYTogei5zdHJpbmcoKSB9KSwKICAgIH0sCiAgfSwKICByZWY6ICdzb21lLXJlc3BvbnNlJywKfTsKCi8vb3IKCmNvbnN0IHJlc3BvbnNlOiBab2RPcGVuQXBpUmVzcG9uc2VPYmplY3QgPSB7CiAgZGVzY3JpcHRpb246ICcyMDAgT0snLAogIGNvbnRlbnQ6IHsKICAgICdhcHBsaWNhdGlvbi9qc29uJzogewogICAgICBzY2hlbWE6IHoub2JqZWN0KHsgYTogei5zdHJpbmcoKSB9KSwKICAgIH0sCiAgfSwKfTsKCmNyZWF0ZURvY3VtZW50KHsKICBjb21wb25lbnRzOiB7CiAgICByZXNwb25zZXM6IHsKICAgICAgJ3NvbWUtcmVzcG9uc2UnOiByZXNwb25zZSwKICAgIH0sCiAgfSwKfSk7CmBgYAoKIyMjIyBDYWxsYmFja3MKCkNhbGxiYWNrcyBjYW4gYWxzbyBiZSByZWdpc3RlcmVkCgpgYGB0eXBlc2NyaXB0CmNvbnN0IGNhbGxiYWNrOiBab2RPcGVuQXBpQ2FsbGJhY2tPYmplY3QgPSB7CiAgcmVmOiAnc29tZS1jYWxsYmFjaycKICBwb3N0OiB7CiAgICByZXNwb25zZXM6IHsKICAgICAgMjAwOiB7CiAgICAgICAgZGVzY3JpcHRpb246ICcyMDAgT0snLAogICAgICAgIGNvbnRlbnQ6IHsKICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJzogewogICAgICAgICAgICBzY2hlbWE6IHoub2JqZWN0KHsgYTogei5zdHJpbmcoKSB9KSwKICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgfSwKICAgIH0sCiAgfSwKfTsKCi8vb3IKCmNvbnN0IGNhbGxiYWNrOiBab2RPcGVuQXBpQ2FsbGJhY2tPYmplY3QgPSB7CiAgcG9zdDogewogICAgcmVzcG9uc2VzOiB7CiAgICAgIDIwMDogewogICAgICAgIGRlc2NyaXB0aW9uOiAnMjAwIE9LJywKICAgICAgICBjb250ZW50OiB7CiAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6IHsKICAgICAgICAgICAgc2NoZW1hOiB6Lm9iamVjdCh7IGE6IHouc3RyaW5nKCkgfSksCiAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgIH0sCiAgICB9LAogIH0sCn07CgpjcmVhdGVEb2N1bWVudCh7CiAgY29tcG9uZW50czogewogICAgY2FsbGJhY2tzOiB7CiAgICAgICdzb21lLWNhbGxiYWNrJzogY2FsbGJhY2ssCiAgICB9LAogIH0sCn0pOwpgYGAKCiMjIFN1cHBvcnRlZCBPcGVuQVBJIFZlcnNpb25zCgpDdXJyZW50bHkgdGhlIGZvbGxvd2luZyB2ZXJzaW9ucyBvZiBPcGVuQVBJIGFyZSBzdXBwb3J0ZWQKCi0gYDMuMC4wYAotIGAzLjAuMWAKLSBgMy4wLjJgCi0gYDMuMC4zYAotIGAzLjEuMGAKClNldHRpbmcgdGhlIGBvcGVuYXBpYCBmaWVsZCB3aWxsIGNoYW5nZSBob3cgdGhlIHNvbWUgb2YgdGhlIGNvbXBvbmVudHMgYXJlIHJlbmRlcmVkLgoKYGBgdHMKY3JlYXRlRG9jdW1lbnQoewogIG9wZW5hcGk6ICczLjEuMCcsCn0pOwpgYGAKCkZvciBleGFtcGxlIGluIGB6LnN0cmluZygpLm51bGxhYmxlKClgIHdpbGwgYmUgcmVuZGVyZWQgZGlmZmVyZW50bHkKCmAzLjAuMGAKCmBgYGpzb24KewogICJ0eXBlIjogInN0cmluZyIsCiAgIm51bGxhYmxlIjogdHJ1ZQp9CmBgYAoKYDMuMS4wYAoKYGBganNvbgp7CiAgInR5cGUiOiBbInN0cmluZyIsICJudWxsIl0KfQpgYGAKCiMjIFN1cHBvcnRlZCBab2QgU2NoZW1hCgotIFpvZEFueQotIFpvZEFycmF5CiAgLSBgbWluSXRlbXNgL2BtYXhJdGVtc2AgbWFwcGluZyBmb3IgYC5sZW5ndGgoKWAsIGAubWluKClgLCBgLm1heCgpYAotIFpvZEJvb2xlYW4KLSBab2RCcmFuZGVkCi0gWm9kQ2F0Y2gKLSBab2REYXRlCiAgLSBgdHlwZWAgaXMgbWFwcGVkIGFzIGBzdHJpbmdgIGJ5IGRlZmF1bHQKLSBab2REZWZhdWx0Ci0gWm9kRGlzY3JpbWluYXRlZFVuaW9uCiAgLSBgZGlzY3JpbWluYXRvcmAgbWFwcGluZyB3aGVuIGFsbCBzY2hlbWFzIGluIHRoZSB1bmlvbiBhcmUgW3JlZ2lzdGVyZWRdKCNjcmVhdGluZy1jb21wb25lbnRzKS4gVGhlIGRpc2NyaW1pbmF0b3IgbXVzdCBiZSBhIGBab2RMaXRlcmFsYCwgYFpvZEVudW1gIG9yIGBab2ROYXRpdmVFbnVtYCB3aXRoIHN0cmluZyB2YWx1ZXMuIE9ubHkgdmFsdWVzIHdyYXBwZWQgaW4gYFpvZEJyYW5kZWRgLCBgWm9kUmVhZE9ubHlgIGFuZCBgWm9kQ2F0Y2hgIGFyZSBzdXBwb3J0ZWQuCi0gWm9kRWZmZWN0cwogIC0gYHRyYW5zZm9ybWAgc3VwcG9ydCBmb3IgcmVxdWVzdCBzY2hlbWFzLiBTZWUgW1pvZCBFZmZlY3RzXSgjem9kLWVmZmVjdHMpIGZvciBob3cgdG8gZW5hYmxlIHJlc3BvbnNlIHNjaGVtYSBzdXBwb3J0CiAgLSBgcHJlLXByb2Nlc3NgIHN1cHBvcnQuIFdlIGFzc3VtZSB0aGF0IHRoZSBpbnB1dCB0eXBlIGlzIHRoZSBzYW1lIGFzIHRoZSBvdXRwdXQgdHlwZS4gT3RoZXJ3aXNlIHBpcGUgYW5kIHRyYW5zZm9ybSBjYW4gYmUgdXNlZCBpbnN0ZWFkLgogIC0gYHJlZmluZWAgZnVsbCBzdXBwb3J0Ci0gWm9kRW51bQotIFpvZEludGVyc2VjdGlvbgotIFpvZExhenkKICAtIFRoZSByZWN1cnNpdmUgc2NoZW1hIHdpdGhpbiB0aGUgWm9kTGF6eSBvciB0aGUgWm9kTGF6eSBfKiptdXN0KipfIGJlIHJlZ2lzdGVyZWQgYXMgYSBjb21wb25lbnQuIFNlZSBbQ3JlYXRpbmcgQ29tcG9uZW50c10oI2NyZWF0aW5nLWNvbXBvbmVudHMpIGZvciBtb3JlIGluZm9ybWF0aW9uLgotIFpvZExpdGVyYWwKLSBab2ROYXRpdmVFbnVtCiAgLSBzdXBwb3J0aW5nIGBzdHJpbmdgLCBgbnVtYmVyYCBhbmQgY29tYmluZWQgZW51bXMuCi0gWm9kTmV2ZXIKLSBab2ROdWxsCi0gWm9kTnVsbGFibGUKLSBab2ROdW1iZXIKICAtIGBpbnRlZ2VyYCBgdHlwZWAgbWFwcGluZyBmb3IgYC5pbnQoKWAKICAtIGBleGNsdXNpdmVNaW5gL2BtaW5gL2BleGNsdXNpdmVNYXhgL2BtYXhgIG1hcHBpbmcgZm9yIGAubWluKClgLCBgLm1heCgpYCwgYGx0KClgLCBgZ3QoKWAKLSBab2RPYmplY3QKICAtIGBhZGRpdGlvbmFsUHJvcGVydGllc2AgbWFwcGluZyBmb3IgYC5jYXRjaGFsbCgpYCwgYC5zdHJpY3QoKWAKICAtIGBhbGxPZmAgbWFwcGluZyBmb3IgYC5leHRlbmQoKWAgd2hlbiB0aGUgYmFzZSBvYmplY3QgaXMgcmVnaXN0ZXJlZCBhbmQgZG9lcyBub3QgaGF2ZSBgY2F0Y2hhbGwoKWAsIGBzdHJpY3QoKWAgYW5kIGV4dGVuc2lvbiBkb2VzIG5vdCBvdmVycmlkZSBhIGZpZWxkLgotIFpvZE9wdGlvbmFsCi0gWm9kUGlwZWxpbmUKICAtIFNlZSBbWm9kIEVmZmVjdHNdKCN6b2QtZWZmZWN0cykgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gWm9kUmVhZG9ubHkKLSBab2RSZWNvcmQKLSBab2RTZXQKICAtIFRyZWF0ZWQgYXMgYW4gYXJyYXkgd2l0aCBgdW5pcXVlSXRlbXNgICh5b3UgbWF5IG5lZWQgdG8gYWRkIGEgcHJlLXByb2Nlc3MgdG8gY29udmVydCBpdCB0byBhIHNldCkKLSBab2RTdHJpbmcKICAtIGBmb3JtYXRgIG1hcHBpbmcgZm9yIGAudXJsKClgLCBgLnV1aWQoKWAsIGAuZW1haWwoKWAsIGAuZGF0ZXRpbWUoKWAsIGAuZGF0ZSgpYCwgYC50aW1lKClgLCBgLmR1cmF0aW9uKClgCiAgLSBgbWluTGVuZ3RoYC9gbWF4TGVuZ3RoYCBtYXBwaW5nIGZvciBgLmxlbmd0aCgpYCwgYC5taW4oKWAsIGAubWF4KClgCiAgLSBgcGF0dGVybmAgbWFwcGluZyBmb3IgYC5yZWdleCgpYCwgYC5zdGFydHNXaXRoKClgLCBgLmVuZHNXaXRoKClgLCBgLmluY2x1ZGVzKClgCiAgLSBgY29udGVudEVuY29kaW5nYCBtYXBwaW5nIGZvciBgLmJhc2U2NCgpYCBmb3IgT3BlbkFQSSAzLjEuMCsKLSBab2RUdXBsZQogIC0gYGl0ZW1zYCBtYXBwaW5nIGZvciBgLnJlc3QoKWAKICAtIGBwcmVmaXhJdGVtc2AgbWFwcGluZyBmb3IgT3BlbkFQSSAzLjEuMCsKLSBab2RVbmRlZmluZWQKLSBab2RVbmlvbgogIC0gQnkgZGVmYXVsdCBpdCBvdXRwdXRzIGFuIGBhbGxPZmAgc2NoZW1hLiBVc2UgYHVuaW9uT25lT2ZgIHRvIGNoYW5nZSB0aGlzIHRvIG91dHB1dCBgb25lT2ZgIGluc3RlYWQuCi0gWm9kVW5rbm93bgoKSWYgdGhpcyBsaWJyYXJ5IGNhbm5vdCBkZXRlcm1pbmUgYSB0eXBlIGZvciBhIFpvZCBTY2hlbWEsIGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IuIFRvIGF2b2lkIHRoaXMsIGRlY2xhcmUgYSBtYW51YWwgYHR5cGVgIGluIHRoZSBgLm9wZW5hcGkoKWAgc2VjdGlvbiBvZiB0aGF0IHNjaGVtYS4KCmVnLgoKYGBgdHlwZXNjcmlwdAp6LmN1c3RvbSgpLm9wZW5hcGkoeyB0eXBlOiAnc3RyaW5nJyB9KTsKYGBgCgojIyBFeGFtcGxlcwoKU2VlIHRoZSBsaWJyYXJ5IGluIHVzZSBpbiB0aGUgW2V4YW1wbGVzXSguL2V4YW1wbGVzLykgZm9sZGVyLgoKLSBTaW1wbGUgLSBbc2V0dXBdKC4vZXhhbXBsZXMvc2ltcGxlL2NyZWF0ZVNjaGVtYS50cykgfCBbb3BlbmFwaS55bWxdKC4vZXhhbXBsZXMvc2ltcGxlL29wZW5hcGkueW1sKSB8IFtyZWRvYyBkb2N1bWVudGF0aW9uXShodHRwczovL3NhbWNodW5neS5naXRodWIuaW8vem9kLW9wZW5hcGkvZXhhbXBsZXMvc2ltcGxlL3JlZG9jLXN0YXRpYy5odG1sKQoKIyMgRWNvc3lzdGVtCgotIFtmYXN0aWZ5LXpvZC1vcGVuYXBpXShodHRwczovL2dpdGh1Yi5jb20vc2FtY2h1bmd5L2Zhc3RpZnktem9kLW9wZW5hcGkpIC0gRmFzdGlmeSBwbHVnaW4gZm9yIHpvZC1vcGVuYXBpLiBUaGlzIGluY2x1ZGVzIHR5cGUgcHJvdmlkZXIsIFpvZCBzY2hlbWEgdmFsaWRhdGlvbiwgWm9kIHNjaGVtYSBzZXJpYWxpemF0aW9uIGFuZCBTd2FnZ2VyIFVJIHN1cHBvcnQuCgotIFtlc2xpbnQtcGx1Z2luLXpvZC1vcGVuYXBpXShodHRwczovL2dpdGh1Yi5jb20vc2FtY2h1bmd5L2VzbGludC1wbHVnaW4tem9kLW9wZW5hcGkpIC0gRXNsaW50IHJ1bGVzIGZvciB6b2Qtb3BlbmFwaS4gVGhpcyBpbmNsdWRlcyBmZWF0dXJlcyB3aGljaCBjYW4gYXV0b2dlbmVyYXRlIFR5cGVzY3JpcHQgY29tbWVudHMgZm9yIHlvdXIgWm9kIHR5cGVzIGJhc2VkIG9uIHlvdXIgYGRlc2NyaXB0aW9uYCwgYGV4YW1wbGVgIGFuZCBgZGVwcmVjYXRlZGAgZmllbGRzLgoKIyMgQ29tcGFyaXNvbnMKCiMjIyBbQGFzdGVhc29sdXRpb25zL3pvZC10by1vcGVuYXBpXSguL2RvY3MvY29tcGFyaXNvbnMubWQpCgojIyBEZXZlbG9wbWVudAoKIyMjIFByZXJlcXVpc2l0ZXMKCi0gTm9kZS5qcyBMVFMKLSBwbnBtCgpgYGBzaGVsbApwbnBtCnBucG0gYnVpbGQKYGBgCgojIyMgVGVzdAoKYGBgc2hlbGwKcG5wbSB0ZXN0CmBgYAoKIyMjIExpbnQKCmBgYHNoZWxsCiMgRml4IGlzc3VlcwpwbnBtIGZvcm1hdAoKIyBDaGVjayBmb3IgaXNzdWVzCnBucG0gbGludApgYGAKCiMjIyBSZWxlYXNlCgpUbyByZWxlYXNlIGEgbmV3IHZlcnNpb24KCjEuIENyZWF0ZSBhIFtuZXcgR2l0SHViIFJlbGVhc2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9zYW1jaHVuZ3kvem9kLW9wZW5hcGkvcmVsZWFzZXMvbmV3KQoyLiBTZWxlY3QgYPCfj7fvuI8gQ2hvb3NlIGEgdGFnYCwgZW50ZXIgYSB2ZXJzaW9uIG51bWJlci4gZWcuIGB2MS4yLjBgIGFuZCBjbGljayBgKyBDcmVhdGUgbmV3IHRhZzogdlguWC5YIG9uIHB1Ymxpc2hgLgozLiBDbGljayB0aGUgYEdlbmVyYXRlIHJlbGVhc2Ugbm90ZXNgIGJ1dHRvbiBhbmQgYWRqdXN0IHRoZSBkZXNjcmlwdGlvbi4KNC4gVGljayB0aGUgYFNldCBhcyB0aGUgbGF0ZXN0IHJlbGVhc2VgIGJveCBhbmQgY2xpY2sgYFB1Ymxpc2ggcmVsZWFzZWAuIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBgUmVsZWFzZWAgd29ya2Zsb3cuCjUuIENoZWNrIHRoZSBgUHVsbCBSZXF1ZXN0c2AgdGFiIGZvciBhIFBSIGxhYmVsbGVkIGBSZWxlYXNlIHZYLlguWGAuCjYuIENsaWNrIGBNZXJnZSBQdWxsIFJlcXVlc3RgIG9uIHRoYXQgUHVsbCBSZXF1ZXN0IHRvIHVwZGF0ZSBtYXN0ZXIgd2l0aCB0aGUgbmV3IHBhY2thZ2UgdmVyc2lvbi4KClRvIHJlbGVhc2UgYSBuZXcgYmV0YSB2ZXJzaW9uCgoxLiBDcmVhdGUgYSBbbmV3IEdpdEh1YiBSZWxlYXNlXShodHRwczovL2dpdGh1Yi5jb20vc2FtY2h1bmd5L3pvZC1vcGVuYXBpL3JlbGVhc2VzL25ldykKMi4gU2VsZWN0IGDwn4+377iPIENob29zZSBhIHRhZ2AsIGVudGVyIGEgdmVyc2lvbiBudW1iZXIgd2l0aCBhIGAtYmV0YS5YYCBzdWZmaXggZWcuIGB2MS4yLjAtYmV0YS4xYCBhbmQgY2xpY2sgYCsgQ3JlYXRlIG5ldyB0YWc6IHZYLlguWC1iZXRhLlggb24gcHVibGlzaGAuCjMuIENsaWNrIHRoZSBgR2VuZXJhdGUgcmVsZWFzZSBub3Rlc2AgYnV0dG9uIGFuZCBhZGp1c3QgdGhlIGRlc2NyaXB0aW9uLgo0LiBUaWNrIHRoZSBgU2V0IGFzIGEgcHJlLXJlbGVhc2VgIGJveCBhbmQgY2xpY2sgYFB1Ymxpc2ggcmVsZWFzZWAuIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBgUHJlcmVsZWFzZWAgd29ya2Zsb3cuCg==
+ readmeEtag: '"2eb06193ad2fa54541926607438dabedc668f90c"'
+ readmeLastModified: Mon, 07 Oct 2024 02:29:14 GMT
repositoryId: 628179878
description: Use Zod Schemas to create OpenAPI v3.x documentation
created: '2023-04-15T06:28:51Z'
- updated: '2024-10-05T21:03:26Z'
+ updated: '2024-10-07T02:29:17Z'
language: TypeScript
archived: false
- stars: 267
+ stars: 268
watchers: 2
- forks: 12
+ forks: 13
owner: samchungy
logo: https://avatars.githubusercontent.com/u/18017094?v=4
license: MIT
- repoEtag: '"0f672b28fdc984b59369be90457b4c3d49d91d78de3d3e31cd315e9d43d2db03"'
- repoLastModified: Sat, 05 Oct 2024 21:03:26 GMT
+ repoEtag: '"d4aced509e4926efbbdcfbd50d250089af8eab315c0ce5afc4346c590efd4130"'
+ repoLastModified: Mon, 07 Oct 2024 02:29:17 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -9494,11 +9494,11 @@
archived: false
stars: 218
watchers: 20
- forks: 53
+ forks: 54
owner: Cornutum
logo: https://avatars.githubusercontent.com/u/11477145?v=4
license: MIT
- repoEtag: '"4e21dbadfcd911dd3971b921ae955857f1f7e1501602300b587f29f62645963d"'
+ repoEtag: '"b70e0ee59614dee78e192e25ce9b905c342d5ee0e492c1706ef454549bb780b5"'
repoLastModified: Fri, 04 Oct 2024 18:31:46 GMT
foundInMaster: true
category: Testing
@@ -9742,17 +9742,17 @@
Autogenered docs, Zod - BullMQ - Nodemailer - Docker - MongoDB (Mongoose)
- Socket.io
created: '2024-08-11T02:19:59Z'
- updated: '2024-10-03T09:16:13Z'
+ updated: '2024-10-06T13:36:22Z'
language: TypeScript
archived: false
- stars: 197
+ stars: 198
watchers: 2
forks: 35
owner: muneebhashone
logo: https://avatars.githubusercontent.com/u/88892379?v=4
license: MIT
- repoEtag: '"54cfdc2113fbc0a2f005dfa427fb64a0b2520698deb29e98802129fffd0ee952"'
- repoLastModified: Thu, 03 Oct 2024 09:16:13 GMT
+ repoEtag: '"674deea7202a714f27ef447e639b997ea2d37a68431e2bb16ef87e0af5f261e2"'
+ repoLastModified: Sun, 06 Oct 2024 13:36:22 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -9900,17 +9900,17 @@
repositoryId: 362315893
description: Generate REST API and OpenAPI documentation for your Flask project.
created: '2021-04-28T02:39:57Z'
- updated: '2024-10-05T06:09:47Z'
+ updated: '2024-10-06T21:44:52Z'
language: Python
archived: false
- stars: 186
+ stars: 187
watchers: 7
forks: 28
owner: luolingchun
logo: https://avatars.githubusercontent.com/u/22740403?v=4
license: MIT
- repoEtag: '"f606f7473ba182bf44ff3ffec03c5b2e891f16ad5bf235bd327a11e6c2a391c4"'
- repoLastModified: Sat, 05 Oct 2024 06:09:47 GMT
+ repoEtag: '"6c69ba0d17fa1839022aeb58e2ef8cb01ecbc7dda6712ee8d89b997f48e3f8b6"'
+ repoLastModified: Sun, 06 Oct 2024 21:44:52 GMT
foundInMaster: true
category: Server Implementations
id: 7baa4046f5397a8fd006511115871ac0
@@ -9926,17 +9926,17 @@
repositoryId: 543052826
description: Speakeasy CLI - Enterprise developer experience for your API
created: '2022-09-29T10:13:15Z'
- updated: '2024-10-04T17:37:33Z'
+ updated: '2024-10-06T21:32:10Z'
language: JavaScript
archived: false
- stars: 182
+ stars: 184
watchers: 12
forks: 14
owner: speakeasy-api
logo: https://avatars.githubusercontent.com/u/91446104?v=4
license: NOASSERTION
- repoEtag: '"9aed5a96600998c46e1555e23a1c7fd8e1b676961cb8d0fbd5978942b151c1e1"'
- repoLastModified: Fri, 04 Oct 2024 17:37:33 GMT
+ repoEtag: '"40366d5a2922b440402b914359fb2081d653015cd2bfc50b6c8e75c6cca6bc66"'
+ repoLastModified: Sun, 06 Oct 2024 21:32:10 GMT
category: Parsers
foundInMaster: true
- source:
@@ -10039,7 +10039,7 @@
A collection of Visual Studio custom tool code generators for Swagger /
OpenAPI specification files
created: '2019-01-17T12:58:50Z'
- updated: '2024-10-04T17:07:40Z'
+ updated: '2024-10-06T22:03:59Z'
language: C#
archived: false
stars: 177
@@ -10048,8 +10048,8 @@
owner: christianhelle
logo: https://avatars.githubusercontent.com/u/710400?v=4
license: GPL-3.0
- repoEtag: '"834da79da74ac49c0b0158ad44a71fdc681f05311f188e0fe269509f653aca41"'
- repoLastModified: Fri, 04 Oct 2024 17:07:40 GMT
+ repoEtag: '"6570bb92ad78aefa1943f2045f8accdbc808d0a64ad149b45adabcd4a9eb7350"'
+ repoLastModified: Sun, 06 Oct 2024 22:03:59 GMT
category: SDK
foundInMaster: true
- source: openapi3 tags
@@ -10220,7 +10220,7 @@
repositoryId: 122702750
description: API Management and Testing Platform
created: '2018-02-24T04:23:08Z'
- updated: '2024-10-05T03:56:13Z'
+ updated: '2024-10-07T02:52:54Z'
language: Go
archived: false
stars: 147
@@ -10229,8 +10229,8 @@
owner: deeptest-com
logo: https://avatars.githubusercontent.com/u/127812389?v=4
license: GPL-3.0
- repoEtag: '"741be6ea9084e9eebac580565c7f7cd5c9c238f8608982d7f0624d222cbd38a6"'
- repoLastModified: Sat, 05 Oct 2024 03:56:13 GMT
+ repoEtag: '"c7944ac7fdf1614e3935b315f30639db4c5706199c704121aac1b247e5e2d9ab"'
+ repoLastModified: Mon, 07 Oct 2024 02:52:54 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -10525,11 +10525,11 @@
archived: false
stars: 113
watchers: 22
- forks: 56
+ forks: 57
owner: OAI
logo: https://avatars.githubusercontent.com/u/16343502?v=4
license: CC-BY-4.0
- repoEtag: '"9589fb895fc259bf776e8ca9cda30f24b3070a62655c56e760939db7001a8be7"'
+ repoEtag: '"711048fac7b7e59ec50a687c1284de2d56182351768b51ae222c936259502c68"'
repoLastModified: Thu, 26 Sep 2024 17:20:06 GMT
category:
- Parsers
@@ -10765,17 +10765,17 @@
repositoryId: 373055212
description: Swagger 3.0 implementation for go
created: '2021-06-02T05:54:10Z'
- updated: '2024-09-25T16:32:45Z'
+ updated: '2024-10-07T01:19:56Z'
language: Go
archived: false
- stars: 103
+ stars: 104
watchers: 5
forks: 11
owner: parvez3019
logo: https://avatars.githubusercontent.com/u/10362597?v=4
license: MIT
- repoEtag: '"a24b371ed7dcb6a370c56b80aa5061721acb51b457462ab2faf2f5ce520afaac"'
- repoLastModified: Wed, 25 Sep 2024 16:32:45 GMT
+ repoEtag: '"c50dd0fba37e3a252e88021d6c2e34621244213bec842f7d6ba9fa140b0e10b0"'
+ repoLastModified: Mon, 07 Oct 2024 01:19:56 GMT
foundInMaster: true
category: Server Implementations
id: 00ef51b7bb2f326af2de90739df6907b
@@ -10827,7 +10827,7 @@
A collection of open-source and commercial tools for creating your APIs
with OpenAPI - Sourced from and published for the community
created: '2022-01-14T19:24:14Z'
- updated: '2024-10-05T03:33:42Z'
+ updated: '2024-10-06T03:37:32Z'
language: JavaScript
archived: false
stars: 99
@@ -10835,8 +10835,8 @@
forks: 27
owner: OAI
logo: https://avatars.githubusercontent.com/u/16343502?v=4
- repoEtag: '"a1a972fb5d271abd6b7b241ca4a8e6ff89fd16ebb32dcdf5379c9ac0cd0ade2b"'
- repoLastModified: Sat, 05 Oct 2024 03:33:42 GMT
+ repoEtag: '"0fc117816982674f765a71f278d0079d2d457ab7dce604c5e9c670a49c53c3c1"'
+ repoLastModified: Sun, 06 Oct 2024 03:37:32 GMT
category: Server Implementations
foundInMaster: true
oldLocations:
@@ -11055,7 +11055,7 @@
owner: jellyfin
logo: https://avatars.githubusercontent.com/u/45698031?v=4
license: LGPL-3.0
- repoEtag: '"f31020e3ec5b97221e9650e1e3e4cf0e574c32c962f2b4cfe44eeb83a0bae282"'
+ repoEtag: '"7f25fa9f7bce0888962c9f434fc6043b9ccc0761c15108e6c8181fd78c19e5d2"'
repoLastModified: Tue, 01 Oct 2024 13:42:45 GMT
foundInMaster: true
category: Testing
@@ -11178,17 +11178,17 @@
repositoryId: 714590129
description: Generate .http files from OpenAPI (Swagger) specifications
created: '2023-11-05T10:19:39Z'
- updated: '2024-10-03T12:17:01Z'
+ updated: '2024-10-06T19:04:46Z'
language: C#
archived: false
- stars: 77
+ stars: 78
watchers: 2
forks: 6
owner: christianhelle
logo: https://avatars.githubusercontent.com/u/710400?v=4
license: MIT
- repoEtag: '"e75bb28b10109d0dc2cd209628d8c05a5e8bc7b507f42057863c2adc58a521d4"'
- repoLastModified: Thu, 03 Oct 2024 12:17:01 GMT
+ repoEtag: '"a5f230ac3469ab43d182066ac9bd5b073d9d57154c5c551e863ca5089a448610"'
+ repoLastModified: Sun, 06 Oct 2024 19:04:46 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -11237,11 +11237,11 @@
archived: false
stars: 76
watchers: 9
- forks: 12
+ forks: 13
owner: landgraf-dev
logo: https://avatars.githubusercontent.com/u/52084575?v=4
license: NOASSERTION
- repoEtag: '"54843f308ee915d8fc4554cd59bff7063b6e8b658d83f3388ccc801517376869"'
+ repoEtag: '"217764ebf94a2f2b4a31669b2351034ff41c958c4acdc2b6788eb35b1736ae4d"'
repoLastModified: Tue, 01 Oct 2024 13:20:04 GMT
category: Parsers
foundInMaster: true
@@ -11477,10 +11477,10 @@
archived: false
stars: 60
watchers: 5
- forks: 93
+ forks: 94
owner: eazybytes
logo: https://avatars.githubusercontent.com/u/79041235?v=4
- repoEtag: '"5b0fd60c07792941c375703462f7f7551ff71204c73cd264c6277ae62add146d"'
+ repoEtag: '"a1bae2f31898b11ee756805f025507f504d858bfbb0c041aae2609d6c245207d"'
repoLastModified: Sun, 29 Sep 2024 20:54:57 GMT
category: Parsers
foundInMaster: true
@@ -11983,7 +11983,7 @@
owner: pb33f
logo: https://avatars.githubusercontent.com/u/104016643?v=4
license: NOASSERTION
- repoEtag: '"39d438e9f2ff7a760e4b32254f575ad028c01728cfa14effd6a56e4d8daabeca"'
+ repoEtag: '"4562318dd6fd8c51db3a856c948617f2675b4fadf591d1a77a335b2644949d1f"'
repoLastModified: Thu, 03 Oct 2024 06:54:17 GMT
category: Parsers
foundInMaster: true
@@ -12024,7 +12024,7 @@
repositoryId: 286198180
description: Example application built using Quarkus framework
created: '2020-08-09T08:34:19Z'
- updated: '2024-09-30T10:58:16Z'
+ updated: '2024-10-06T15:24:32Z'
language: Java
archived: false
stars: 47
@@ -12032,8 +12032,8 @@
forks: 26
owner: piomin
logo: https://avatars.githubusercontent.com/u/2892502?v=4
- repoEtag: '"b606617e74b9bb58347ab42460fbdee66d3d50d3025eba102c9587075d3c58dd"'
- repoLastModified: Mon, 30 Sep 2024 10:58:16 GMT
+ repoEtag: '"3b46acdb89232ed89abd59ac7dc35fc0eb51db039a3908ee71ac6271c8b26977"'
+ repoLastModified: Sun, 06 Oct 2024 15:24:32 GMT
foundInMaster: true
category: SDK
id: dd8f9923c6579fbc72bcd8fc5a69a30c
@@ -12500,7 +12500,7 @@
repositoryId: 196863956
description: an OpenAPI 3.0 & 3.1 interface & model java code generator for Spring Boot
created: '2019-07-14T17:16:49Z'
- updated: '2024-10-04T08:31:09Z'
+ updated: '2024-10-06T08:02:16Z'
language: Kotlin
archived: false
stars: 38
@@ -12509,8 +12509,8 @@
owner: openapi-processor
logo: https://avatars.githubusercontent.com/u/66728774?v=4
license: Apache-2.0
- repoEtag: '"6ee4903703e796be2db163b62a571ee3ff38ca319c3210266a05a47209b2755c"'
- repoLastModified: Fri, 04 Oct 2024 08:31:09 GMT
+ repoEtag: '"a922cc232d6801cf1574f460042b5ff236c74c4c7ad9c175f37cde1bc2af177c"'
+ repoLastModified: Sun, 06 Oct 2024 08:02:16 GMT
foundInMaster: true
id: 544de493e48dbce482dd3fcfc87ad568
v3_1: true
@@ -12965,31 +12965,33 @@
- source:
- openapi3 tags
- openapi31 tags
- repository: https://github.com/enzonotario/vitepress-theme-openapi
+ repository: https://github.com/enzonotario/vitepress-openapi
v3: true
v3_1: true
- id: 74ef0931b8963642c1eb5febd3ab5aca
+ id: 6b0b55df8cbd772582e7b1db14781e00
repositoryMetadata:
base64Readme: >-
- IyB2aXRlcHJlc3MtdGhlbWUtb3BlbmFwaQoKQSBWaXRlUHJlc3MgdGhlbWUgZm9yIE9wZW5BUEkgZG9jdW1lbnRhdGlvbi4KCiMjIERlbW8KCi0gW0RvbGFyQXBpLmNvbV0oaHR0cHM6Ly9kb2xhcmFwaS5jb20vKQotIFtBcmdlbnRpbmFEYXRvc10oaHR0cHM6Ly9hcmdlbnRpbmFkYXRvcy5jb20vKQotIFtDcmlwdG9ZYSBBUEldKGh0dHBzOi8vZG9jcy5jcmlwdG95YS5jb20vKQoKIyMgRG9jdW1lbnRhdGlvbgoKVG8gZ2V0IHN0YXJ0ZWQsIGNoZWNrIG91dCB0aGUgW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vdml0ZXByZXNzLXRoZW1lLW9wZW5hcGkudmVyY2VsLmFwcC8pLgoKIyMgTGljZW5zZQoKW01JVCBMaWNlbnNlXSguL0xJQ0VOU0UpIMKpIDIwMjMtcHJlc2VudCBbRW56byBOb3RhcmlvXShodHRwczovL2dpdGh1Yi5jb20vZW56b25vdGFyaW8pLgo=
- readmeEtag: '"a07c3a22166ab7fd527fa162dd05d49496add580"'
- readmeLastModified: Sat, 28 Sep 2024 22:25:05 GMT
+ IyB2aXRlcHJlc3Mtb3BlbmFwaQoKR2VuZXJhdGUgVml0ZVByZXNzIEFQSSBEb2N1bWVudGF0aW9uIGZyb20gT3BlbkFQSSBTcGVjaWZpY2F0aW9uLgoKIyMgRGVtbwoKLSBbRG9sYXJBcGkuY29tXShodHRwczovL2RvbGFyYXBpLmNvbS8pCi0gW0FyZ2VudGluYURhdG9zXShodHRwczovL2FyZ2VudGluYWRhdG9zLmNvbS8pCi0gW0NyaXB0b1lhIEFQSV0oaHR0cHM6Ly9kb2NzLmNyaXB0b3lhLmNvbS8pCgojIyBEb2N1bWVudGF0aW9uCgpUbyBnZXQgc3RhcnRlZCwgY2hlY2sgb3V0IHRoZSBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly92aXRlcHJlc3Mtb3BlbmFwaS52ZXJjZWwuYXBwLykuCgojIyBMaWNlbnNlCgpbTUlUIExpY2Vuc2VdKC4vTElDRU5TRSkgwqkgMjAyMy1wcmVzZW50IFtFbnpvIE5vdGFyaW9dKGh0dHBzOi8vZ2l0aHViLmNvbS9lbnpvbm90YXJpbykuCg==
+ readmeEtag: '"945c857cc919ee85cbaa88612c040beaf1d84c92"'
+ readmeLastModified: Sun, 06 Oct 2024 14:54:39 GMT
repositoryId: 735578513
description: Generate VitePress API Docs from OpenAPI specifications
created: '2023-12-25T12:25:21Z'
- updated: '2024-10-06T01:39:50Z'
+ updated: '2024-10-06T17:57:22Z'
language: TypeScript
archived: false
- stars: 33
+ stars: 35
watchers: 2
- forks: 6
+ forks: 7
owner: enzonotario
logo: https://avatars.githubusercontent.com/u/10469299?v=4
license: MIT
- repoEtag: '"ba5bee67e8ed0543f260e72c280f6dd1146c087d4aab101999cc56ff683758b8"'
- repoLastModified: Sun, 06 Oct 2024 01:39:50 GMT
+ repoEtag: '"7d97e916fae10dc6c64102e235fe18711cf1ef138f1e4d77b643ef4e17e2c6ce"'
+ repoLastModified: Sun, 06 Oct 2024 17:57:22 GMT
category: Parsers
foundInMaster: true
+ oldLocations:
+ - https://github.com/enzonotario/vitepress-theme-openapi
- source: openapi3 tags
repository: https://github.com/ryan-mars/workers-queue-demo
v3: true
@@ -13952,7 +13954,7 @@
repositoryId: 178213765
description: Generate schema sources for Scala, Java and Elm from an openapi 3.0 spec.
created: '2019-03-28T13:53:17Z'
- updated: '2024-09-26T23:09:48Z'
+ updated: '2024-10-06T06:26:14Z'
language: Scala
archived: false
stars: 21
@@ -13961,8 +13963,8 @@
owner: eikek
logo: https://avatars.githubusercontent.com/u/701128?v=4
license: MIT
- repoEtag: '"54e34daee8c6b89e755f2efd073422d239437efb45f6da67ea5e1adea5e9f570"'
- repoLastModified: Thu, 26 Sep 2024 23:09:48 GMT
+ repoEtag: '"dad0344f6f3ad8cb3c6fd04cc997c07bc18dd082b68b19ea79ebdafc83bb54f3"'
+ repoLastModified: Sun, 06 Oct 2024 06:26:14 GMT
foundInMaster: true
category: Parsers
id: c55aff4f35aaeecc6904953f3eb67cb6
@@ -14348,17 +14350,17 @@
repositoryId: 247984856
description: CloudedBats-WURB. The DIY bat detector.
created: '2020-03-17T14:03:00Z'
- updated: '2024-05-04T22:49:25Z'
+ updated: '2024-10-06T07:48:48Z'
language: Python
archived: false
- stars: 19
+ stars: 20
watchers: 5
forks: 2
owner: cloudedbats
logo: https://avatars.githubusercontent.com/u/16818499?v=4
license: MIT
- repoEtag: '"7243f91ebb5d77ebe67696b53ab5cefc82547dc81a525d64f4d535469ce33403"'
- repoLastModified: Sat, 04 May 2024 22:49:25 GMT
+ repoEtag: '"73257b4717b71d3d0734c5c048edb87a2e0758afe822d98e600b0fa538653792"'
+ repoLastModified: Sun, 06 Oct 2024 07:48:48 GMT
foundInMaster: true
category: Server Implementations
id: 2acd0e2152c96fbe7f024c2c46ddd40c
@@ -15725,7 +15727,7 @@
owner: Jnig
logo: https://avatars.githubusercontent.com/u/3729585?v=4
license: MIT
- repoEtag: '"c1796c943a9045c804e82bdfed9126b27729144a577f1a4d2e11704b1fa21a83"'
+ repoEtag: '"9fe8fadebd6cc5b52f5fcbaa72584c069aea1a2319aa2e5b4ff1ad357ddc273d"'
repoLastModified: Sat, 05 Oct 2024 01:15:22 GMT
category:
- Data Validators
@@ -16927,7 +16929,7 @@
owner: danicc097
logo: https://avatars.githubusercontent.com/u/71724149?v=4
license: Apache-2.0
- repoEtag: '"47cd3b75c9e2eb7fde15cdf8606cd1d6f93c842b6e5859a6e82c43e9e3477a9b"'
+ repoEtag: '"28f0221838dfa46a10d602e7bb5988aff196077e582fa2b3dd022602801d0eb6"'
repoLastModified: Sat, 05 Oct 2024 20:50:03 GMT
category: Parsers
foundInMaster: true
@@ -16951,7 +16953,7 @@
forks: 0
owner: 0xsirsaif
logo: https://avatars.githubusercontent.com/u/55336614?v=4
- repoEtag: '"bf722aa82f00172548e38736e1201d8f36c166c4cbd4d84f9474acc6b5be3b7c"'
+ repoEtag: '"7b99b5afddb4a353734f4691ee748b39bcef26886e693ee7b5f87913c5d7367f"'
repoLastModified: Thu, 26 Sep 2024 01:05:02 GMT
category: Server Implementations
foundInMaster: true
@@ -17187,7 +17189,7 @@
owner: welthee
logo: https://avatars.githubusercontent.com/u/78427472?v=4
license: MIT
- repoEtag: '"cd9d46d07d1f108e69b5ea84b62c800b2518edf03abb56b48856b171d2f34fe2"'
+ repoEtag: '"8a0a8d87317d4d0547958d99f0710a7f866672f38fedfb978f91b080d351115c"'
repoLastModified: Thu, 26 Sep 2024 10:17:59 GMT
foundInMaster: true
category:
@@ -17258,17 +17260,17 @@
repositoryId: 84661950
description: goa framework example
created: '2017-03-11T16:01:20Z'
- updated: '2024-08-06T16:59:54Z'
+ updated: '2024-10-06T20:33:01Z'
language: Go
archived: false
- stars: 8
+ stars: 7
watchers: 3
forks: 2
owner: hiromaily
logo: https://avatars.githubusercontent.com/u/301692?v=4
license: MIT
- repoEtag: '"504c458a865d9295fb556a039022bc38e209c978e4e50e5ebeafc0b810fc5c3b"'
- repoLastModified: Tue, 06 Aug 2024 16:59:54 GMT
+ repoEtag: '"754d638600abe57286680ae2e7e134ea751ea52023996f2afd43bea2c249c0dc"'
+ repoLastModified: Sun, 06 Oct 2024 20:33:01 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -17857,7 +17859,7 @@
owner: cerberauth
logo: https://avatars.githubusercontent.com/u/127022998?v=4
license: MIT
- repoEtag: '"a936da5ae612491e2fc09f998cf120ded3b7df3c9269c31a31e3fa43c1e250b4"'
+ repoEtag: '"6316fe442c5c9b58d9c8d37902f9caf2ac8847eccde171e8fd030e3dde3dea75"'
repoLastModified: Sun, 15 Sep 2024 15:43:08 GMT
category: Parsers
foundInMaster: true
@@ -18627,7 +18629,7 @@
owner: seipan
logo: https://avatars.githubusercontent.com/u/88176012?v=4
license: MIT
- repoEtag: '"7609e3080d0c93e115e56d9a55bb296eef5fa1d7a7470fbe024347a7af295d7a"'
+ repoEtag: '"5de2a07d30b2991d5c8b97c635762741c41e6fe9cc458fe26f01357c4db58cb0"'
repoLastModified: Tue, 06 Aug 2024 15:30:15 GMT
category: Server Implementations
foundInMaster: true
@@ -19829,7 +19831,7 @@
owner: aereal
logo: https://avatars.githubusercontent.com/u/87649?v=4
license: MIT
- repoEtag: '"49e307675d6bd8cb919f5e343fec380a1f7fec1b559386eea2c85ebccd4f4592"'
+ repoEtag: '"298f6dd69534ecc12e064f3de4bc750aae37376cc22f3b485ee7534debff5542"'
repoLastModified: Tue, 01 Aug 2023 19:43:43 GMT
foundInMaster: true
category: Data Validators
@@ -20960,7 +20962,7 @@
Template repo for creating Pulumi providers based on pulschema and
pulumi-provider-framework
created: '2022-11-08T10:44:25Z'
- updated: '2024-10-04T14:53:39Z'
+ updated: '2024-10-07T00:37:25Z'
language: Go
archived: false
stars: 3
@@ -20969,8 +20971,8 @@
owner: cloudy-sky-software
logo: https://avatars.githubusercontent.com/u/97355959?v=4
license: Apache-2.0
- repoEtag: '"b7c4d16c86f230aca9693791eed526753af499af2e44838275130c7273f16908"'
- repoLastModified: Fri, 04 Oct 2024 14:53:39 GMT
+ repoEtag: '"46702872457509be705774a595785b67daec8113b180a0121f874c2c3b1b42d2"'
+ repoLastModified: Mon, 07 Oct 2024 00:37:25 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -22229,7 +22231,7 @@
owner: hiroyoshii
logo: https://avatars.githubusercontent.com/u/40140638?v=4
license: Apache-2.0
- repoEtag: '"532ded27405f08641dcf6ea94470fa7260a45ac37cfc218a3d40ec0a8219b33a"'
+ repoEtag: '"f668a77c9035a83e925fe73526487cf844a49f01eb7d7f72773d8b8bfc3204c1"'
repoLastModified: Mon, 09 Sep 2024 14:21:56 GMT
category: Server Implementations
foundInMaster: true
@@ -23411,15 +23413,15 @@
id: 6221a7dad056965aa69ad16ff0132577
repositoryMetadata:
base64Readme: >-
- W0dvb2dsZSBHZW1pbmkgTm90ZWJvb2tMTSBEZWVwIERpdmVdKGh0dHBzOi8vbm90ZWJvb2tsbS5nb29nbGUuY29tL25vdGVib29rLzJjNWQzNDA5LTA4ZGItNDYyNy04MzM1LWE4NzFhY2I4ZDZhYi9hdWRpbykKCiMgU3lzdGVtcyBTcGFjZQoKMS4gWyoqVGhlIFNoaWZ0IGZyb20gTW9kZWxzIHRvIENvbXBvdW5kIEFJIFN5c3RlbXMqKl0oaHR0cHM6Ly9iYWlyLmJlcmtlbGV5LmVkdS9ibG9nLzIwMjQvMDIvMTgvY29tcG91bmQtYWktc3lzdGVtcy8pIC0gVGhpcyBhcnRpY2xlIGZyb20gQmVya2VsZXkgQUkgUmVzZWFyY2ggKEJBSVIpIGhpZ2hsaWdodHMgYSBncm93aW5nIHRyZW5kIHdoZXJlIEFJIGFkdmFuY2VtZW50cyBpbmNyZWFzaW5nbHkgcmVseSBvbiAqKmNvbXBvdW5kIEFJIHN5c3RlbXMqKuKAlGNvbWJpbmF0aW9ucyBvZiBtdWx0aXBsZSBtb2RlbHMgYW5kIGNvbXBvbmVudHPigJRyYXRoZXIgdGhhbiB0cmFkaXRpb25hbCBtb25vbGl0aGljIG1vZGVscy4gQ29tcG91bmQgc3lzdGVtcyBvZmZlciBtb3JlIGZsZXhpYmlsaXR5IGFuZCBhZGFwdGFiaWxpdHksIGFzIGVhY2ggY29tcG9uZW50IGNhbiBzcGVjaWFsaXplIGluIGEgZGlmZmVyZW50IHRhc2sgb3IgcGhhc2Ugb2YgdGhlIHBpcGVsaW5lLiAgCgpLZXkgcG9pbnRzOgotICoqRGVzaWduLCBvcHRpbWl6YXRpb24sIGFuZCBvcGVyYXRpb246KiogQXBwcm9hY2hlcyBhcmUgc3RpbGwgZW1lcmdpbmcsIGJ1dCBjb21wb3VuZCBBSSBzeXN0ZW1zIGFyZSBwcm92aW5nIG1vcmUgZWZmaWNpZW50IGZvciBjb21wbGV4IHRhc2tzLgotICoqTWF4aW1pemluZyByZWxpYWJpbGl0eSBhbmQgcXVhbGl0eToqKiBUaGVzZSBzeXN0ZW1zIHByb21pc2UgaGlnaGVyIHJlbGlhYmlsaXR5LCBwYXJ0aWN1bGFybHkgZm9yIGxhcmdlLXNjYWxlIGFwcGxpY2F0aW9ucywgYnkgYnJlYWtpbmcgZG93biB0YXNrcyBpbnRvIHNtYWxsZXIsIG1vcmUgbWFuYWdlYWJsZSB1bml0cy4gCi0gKipUcmVuZCBmb3IgMjAyNDoqKiBCQUlSIHNlZXMgdGhpcyBhcyBvbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IHRyZW5kcywgd2hlcmUgZGV2ZWxvcGVycyB3aWxsIGZvY3VzIG9uIGhvdyB0byBhc3NlbWJsZSB0aGVzZSBjb21wb25lbnRzIGluIGVmZmVjdGl2ZSB3YXlzLgogICAKIVtpbWFnZV0oaHR0cHM6Ly9naXRodWIuY29tL3VzZXItYXR0YWNobWVudHMvYXNzZXRzL2Q4NzRlODJmLTliODktNDg3ZS04OTRjLTFlZDNiMjQ3Mjk0ZCkKPHAgYWxpZ249ImNlbnRlciI+SW5jcmVhc2luZ2x5IG1hbnkgbmV3IEFJIHJlc3VsdHMgYXJlIGZyb20gY29tcG91bmQgc3lzdGVtcy48L3A+CgoiX0ZpZ3VyaW5nIG91dCB0aGUgYmVzdCBwcmFjdGljZXMgZm9yIGRldmVsb3BpbmcgY29tcG91bmQgQUkgc3lzdGVtcyBpcyBzdGlsbCBhbiBvcGVuIHF1ZXN0aW9uLCBidXQgdGhlcmUgYXJlIGFscmVhZHkgZXhjaXRpbmcgYXBwcm9hY2hlcyB0byBhaWQgd2l0aCBkZXNpZ24sIGVuZC10by1lbmQgb3B0aW1pemF0aW9uLCBhbmQgb3BlcmF0aW9uLiBXZSBiZWxpZXZlIHRoYXQgY29tcG91bmQgQUkgc3lzdGVtcyB3aWxsIHJlbWFpbiB0aGUgYmVzdCB3YXkgdG8gbWF4aW1pemUgdGhlIHF1YWxpdHkgYW5kIHJlbGlhYmlsaXR5IG9mIEFJIGFwcGxpY2F0aW9ucyBnb2luZyBmb3J3YXJkLCBhbmQgbWF5IGJlIG9uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgdHJlbmRzIGluIEFJIGluIDIwMjQuXyIKCjIuIFsqKkJ1aWxkaW5nIEEgR2VuZXJhdGl2ZSBBSSBQbGF0Zm9ybSoqXShodHRwczovL2h1eWVuY2hpcC5jb20vMjAyNC8wNy8yNS9nZW5haS1wbGF0Zm9ybS5odG1sKSAtIFRoaXMgYXJ0aWNsZSBleHBsb3JlcyB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBkZXZlbG9wbWVudCBvZiBhIGdlbmVyYXRpdmUgQUkgcGxhdGZvcm0sIGZvY3VzaW5nIG9uIHRoZSBjaGFsbGVuZ2VzIG9mIGludGVncmF0aW5nIHZhcmlvdXMgQUkgY29tcG9uZW50cy4gSXQgZW1waGFzaXplczoKLSAqKk9wZW4gU291cmNlIExMTSBUb29sczoqKiBUaGUgYXJ0aWNsZSByZWZlcmVuY2VzIHNldmVyYWwgdG9vbHMgYW5kIHRlY2huaXF1ZXMgZm9yIGJ1aWxkaW5nIGdlbmVyYXRpdmUgQUksIGVzcGVjaWFsbHkgZm9jdXNpbmcgb24gbW9kZWwgYWxpZ25tZW50LCBvcHRpbWl6YXRpb24sIGFuZCBhZGFwdGFiaWxpdHkuIFRoZSByZWZlcmVuY2VkIFtPcGVuIFNvdXJjZSBMTE0gVG9vbHNdKGh0dHBzOi8vaHV5ZW5jaGlwLmNvbS9sbGFtYS1wb2xpY2UpIGFyZSBjcnVjaWFsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBlY29zeXN0ZW0gc3Vycm91bmRpbmcgZ2VuZXJhdGl2ZSBBSSBtb2RlbHMgbGlrZSBNZXRh4oCZcyBMTGFNQS4KLSAqKkNoYWxsZW5nZXMgaW4gcGxhdGZvcm0gYnVpbGRpbmc6KiogRnJvbSBtb2RlbCBpbnRlZ3JhdGlvbiB0byBlbnN1cmluZyB0aGUgYWxpZ25tZW50IG9mIGdlbmVyYXRpdmUgQUkgb3V0cHV0IHdpdGggaW50ZW5kZWQgdXNlIGNhc2VzLCB0aGVyZSBhcmUgbWFueSBodXJkbGVzIGluIGFjaGlldmluZyBhbiBvcGVyYXRpb25hbCBwbGF0Zm9ybS4KCkJvdGggYXJ0aWNsZXMgc3RyZXNzIHRoYXQgdGhlIGZ1dHVyZSBvZiBBSSB3aWxsIGludm9sdmUgKiptb3JlIHNvcGhpc3RpY2F0ZWQgc3lzdGVtcyoqLCByZWx5aW5nIG9uIHRoZSBjb29wZXJhdGlvbiBvZiB2YXJpb3VzIHNwZWNpYWxpemVkIG1vZGVscyAoY29tcG91bmQgQUkpIGFuZCB0aGUgaW50ZWdyYXRpb24gb2YgZGl2ZXJzZSB0b29scyBmb3IgZ2VuZXJhdGl2ZSBBSSBwbGF0Zm9ybSBkZXZlbG9wbWVudC4gVGhpcyBhbGlnbnMgd2l0aCBvbmdvaW5nIGV4cGxvcmF0aW9uIG9mICoqY29tcG91bmQgQUkgc3lzdGVtcyoqIGFuZCAqKmdlbmVyYXRpdmUgQUkgcGxhdGZvcm0gYXJjaGl0ZWN0dXJlKiouCiAgIAojIyBBUElzCnN0YXJ0ZWQgd2l0aCB0aGlzIG9uZSBlbmRwb2ludCBDb21wbGV0aW9ucyAqKi9jb21wbGV0aW9ucyoqIHdpdGggVGV4dCBJbnB1dC9PdXRwdXQgKG5vdyBMZWdhY3kpCgpUaGVuIENoYXRHUFQsIENoYXQgY29tcGxldGlvbnMgKiovY2hhdC9jb21wbGV0aW9ucyoqICB3aXRoIE1lc3NhZ2VzIElucHV0L091dHB1dAogIAozLiBFbWJlZGRpbmdzCQkJKiovZW1iZWRkaW5ncyoqCjQuIEltYWdlIGdlbmVyYXRpb24JCSoqL2ltYWdlcy9nZW5lcmF0aW9ucyoqCjUuIFRleHQgdG8gc3BlZWNoCQkJKiovYXVkaW8vc3BlZWNoKioKNi4gU3BlZWNoIHRvIHRleHQJCQkqKi9hdWRpby90cmFuc2NyaXB0aW9ucyoqCjcuIE1vZGVyYXRpb24JCQkqKi9tb2RlcmF0aW9ucyoqCjguIEZpbmUtdHVuaW5nICAqKi9maW5lX3R1bmluZy9qb2JzKioKOS4gQmF0Y2gJCQkJKiovZmlsZXMgL2JhdGNoZXMqKgoKLSBGdW5jdGlvbiBDYWxsaW5nIC0gUXVlcnkgRGF0YWJhc2UsIFNlbmQgQWxlcnRzIGV0Yy4KLSBSZXNwb25zZSBGb3JtYXRzIC0gW0J1aWxkaW5nIEFHSSB3aXRoIE9wZW5BSSdzIFN0cnVjdHVyZWQgT3V0cHV0cyBBUEldKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9TmpPZkg5RDhhSm8pCgpSRVNUIEFQSTogIAotIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIFtPcGVuQUkgQVBJXShodHRwczovL2dpdGh1Yi5jb20vb3BlbmFpL29wZW5haS1vcGVuYXBpL2Jsb2IvbWFzdGVyL29wZW5hcGkueWFtbCkgIAotIFNwZWNpZmljYXRpb24gZm9yIHRoZSBbQXp1cmUgT3BlbkFJIEFQSV0oaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL2FpLXNlcnZpY2VzL29wZW5haS9yZWZlcmVuY2UjYXBpLXNwZWNzKQogIAoqKk1vcmUgQVBJczoqKgogIC0gW0JlZHJvY2sgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYmVkcm9jay9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9ydW50aW1lX0ludm9rZU1vZGVsLmh0bWwpIC0gPwogIC0gR2VtaW5pIEFQSSAtID8KICAtIFtMbGFtYSBTdGFjayBBUEldKGh0dHBzOi8vZ2l0aHViLmNvbS9tZXRhLWxsYW1hL2xsYW1hLXN0YWNrL2Jsb2IvbWFpbi9kb2NzL3Jlc291cmNlcy9sbGFtYS1zdGFjay1zcGVjLnlhbWwpIC0gPwoKUHl0aG9uIFNES3M6ICAKLSBPcGVuQUkgUHl0aG9uIFtBUEldKGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuYWkvb3BlbmFpLXB5dGhvbi9ibG9iL21haW4vYXBpLm1kKSBsaWJyYXJ5IGluIHRoZSBUaGUgb2ZmaWNpYWwgUHl0aG9uIGxpYnJhcnkgZm9yIHRoZSBbT3BlbkFJIEFQSV0oaHR0cHM6Ly9naXRodWIuY29tL29wZW5haS9vcGVuYWktcHl0aG9uKQoKYGBgcHl0aG9uICAKaW1wb3J0IG9zCmZyb20gb3BlbmFpIGltcG9ydCBPcGVuQUkKCmNsaWVudCA9IE9wZW5BSSgKICAgICMgVGhpcyBpcyB0aGUgZGVmYXVsdCBhbmQgY2FuIGJlIG9taXR0ZWQKICAgIGFwaV9rZXk9b3MuZW52aXJvbi5nZXQoIk9QRU5BSV9BUElfS0VZIiksCikKCmNoYXRfY29tcGxldGlvbiA9IGNsaWVudC5jaGF0LmNvbXBsZXRpb25zLmNyZWF0ZSgKICAgIG1lc3NhZ2VzPVsKICAgICAgICB7CiAgICAgICAgICAgICJyb2xlIjogInVzZXIiLAogICAgICAgICAgICAiY29udGVudCI6ICJTYXkgdGhpcyBpcyBhIHRlc3QiLAogICAgICAgIH0KICAgIF0sCiAgICBtb2RlbD0iZ3B0LTMuNS10dXJibyIsCikKCnByaW50KGNoYXRfY29tcGxldGlvbi50b19qc29uKCkpCiMgcHJpbnQoY2hhdF9jb21wbGV0aW9uLmNob2ljZXNbMF0ubWVzc2FnZS5jb250ZW50KQoKZnJvbSBvcGVuYWkgaW1wb3J0IEF6dXJlT3BlbkFJCgojIGdldHMgdGhlIEFQSSBLZXkgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZSBBWlVSRV9PUEVOQUlfQVBJX0tFWQpjbGllbnQgPSBBenVyZU9wZW5BSSgKICAgICMgaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2F6dXJlL2FpLXNlcnZpY2VzL29wZW5haS9yZWZlcmVuY2UjcmVzdC1hcGktdmVyc2lvbmluZwogICAgYXBpX3ZlcnNpb249IjIwMjMtMDctMDEtcHJldmlldyIsCiAgICAjIGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9henVyZS9jb2duaXRpdmUtc2VydmljZXMvb3BlbmFpL2hvdy10by9jcmVhdGUtcmVzb3VyY2U/cGl2b3RzPXdlYi1wb3J0YWwjY3JlYXRlLWEtcmVzb3VyY2UKICAgIGF6dXJlX2VuZHBvaW50PSJodHRwczovL2V4YW1wbGUtZW5kcG9pbnQub3BlbmFpLmF6dXJlLmNvbSIsCiAgICAjIGF6dXJlX2RlcGxveW1lbnQ9ImdwdDM1IiwKKQoKY2hhdF9jb21wbGV0aW9uID0gY2xpZW50LmNoYXQuY29tcGxldGlvbnMuY3JlYXRlKAogICAgIyBtb2RlbD0iZGVwbG95bWVudC1uYW1lIiwgICMgZS5nLiBncHQtMzUtaW5zdGFudAogICAgbW9kZWw9ImdwdDM1IiwgICMgZ3B0LTM1LXR1cmJvCiAgICBtZXNzYWdlcz1bCiAgICAgICAgewogICAgICAgICAgICAicm9sZSI6ICJ1c2VyIiwKICAgICAgICAgICAgImNvbnRlbnQiOiAiSG93IGRvIEkgb3V0cHV0IGFsbCBmaWxlcyBpbiBhIGRpcmVjdG9yeSB1c2luZyBQeXRob24/IiwKICAgICAgICB9LAogICAgXSwKKQpwcmludChjaGF0X2NvbXBsZXRpb24udG9fanNvbigpKQpgYGAKCioqTW9yZSBBUEkgUGF0dGVybnM6KioKCmNsaWVudCA9IEFudGhyb3BpYygpICAKY2xpZW50ID0gQW50aHJvcGljQmVkcm9jaygpICAKY2xpZW50ID0gQW50aHJvcGljVmVydGV4KCkgIAoKbWVzc2FnZSA9IGNsaWVudC5tZXNzYWdlcy5jcmVhdGUoKSAgCnByaW50KG1lc3NhZ2UuY29udGVudCkgIAoKICAKCi0gW0Ryb3AgaW4gcmVwbGFjZW1lbnRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhc3RheC9hc3RyYS1hc3Npc3RhbnRzLWFwaSkgZm9yIHRoZSBPcGVuQUkgQXNzaXN0YW50cyBBUEkKICAtIEZ1bGwgY292ZXJhZ2Ugb2YgT3BlbkFJIGVuZHBvaW50cyBpbiB0aGUgcmVwbyBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGFzdGF4L2FzdHJhLWFzc2lzdGFudHMtYXBpL2Jsb2IvbWFpbi9jb3ZlcmFnZS5tZCkKIAotIFtMbGFtYSBTdGFjayBSRkNdKGh0dHBzOi8vZ2l0aHViLmNvbS9tZXRhLWxsYW1hL2xsYW1hLXN0YWNrL2Jsb2IvbWFpbi9yZmNzL1JGQy0wMDAxLWxsYW1hLXN0YWNrLm1kKQogIC0gaHR0cHM6Ly9naXRodWIuY29tL21ldGEtbGxhbWEvbGxhbWEtc3RhY2stYXBwcwogIC0gaHR0cHM6Ly9naXRodWIuY29tL21ldGEtbGxhbWEvbGxhbWEtc3RhY2sKCioqTW9yZSBMYW5ndWFnZXM6KioKLSBUaGUgb2ZmaWNpYWwgW0dvXShodHRwczovL2dpdGh1Yi5jb20vb3BlbmFpL29wZW5haS1nbykgbGlicmFyeSBmb3IgdGhlIE9wZW5BSSBBUEkKICAgIAojIyBTZWNyZXRzCgojIyMgMS4gQVBJIEtleXMKQW4gQVBJIGtleSBpcyBhIHNpbXBsZSBzdHJpbmcgKG9mdGVuIGFscGhhbnVtZXJpYykgdXNlZCB0byBhdXRoZW50aWNhdGUgcmVxdWVzdHMuIEl0IGNhbiBiZSBpbmNsdWRlZCBhczoKLSAqKlVSTCBQYXJhbWV0ZXIqKjogIAogIGBodHRwczovL2V4YW1wbGUuY29tL2FwaS9yZXNvdXJjZT9hcGlfa2V5PVlPVVJfQVBJX0tFWWAKLSAqKkhlYWRlcioqOiAgCiAgYEF1dGhvcml6YXRpb246IEFwaUtleSBZT1VSX0FQSV9LRVlgCgpBUEkga2V5cyBhcmUgdHlwaWNhbGx5IHVzZWQgZm9yIHNpbXBsZSBhdXRoZW50aWNhdGlvbiBhbmQgYXJlIHN1aXRlZCBmb3Igc2VydmVyLXRvLXNlcnZlciBjb21tdW5pY2F0aW9uIGJ1dCBhcmUgbGVzcyBzZWN1cmUgaWYgZXhwb3NlZCBpbiBVUkxzLgoKLS0tCgojIyMgMi4gQmVhcmVyIFRva2VuCkEgKipCZWFyZXIgVG9rZW4qKiBpcyBhIHNlY3VyaXR5IHRva2VuIHRoYXQgaXMgaXNzdWVkIGFzIHBhcnQgb2YgT0F1dGggMi4wLiBUaGlzIHRva2VuIGdyYW50cyB0aGUgYmVhcmVyIGFjY2VzcyB0byByZXNvdXJjZXMuIEl0J3MgdXN1YWxseSBwYXNzZWQgaW4gdGhlIHJlcXVlc3QgaGVhZGVyOgotICoqSGVhZGVyKio6ICAKICBgQXV0aG9yaXphdGlvbjogQmVhcmVyIFlPVVJfVE9LRU5gCgpCZWFyZXIgdG9rZW5zIG9mZmVyIG1vcmUgc2VjdXJpdHkgY29tcGFyZWQgdG8gQVBJIGtleXMsIGVzcGVjaWFsbHkgd2hlbiBjb21iaW5lZCB3aXRoIHRva2VuIGV4cGlyYXRpb24gYW5kIHJlZnJlc2ggbWVjaGFuaXNtcy4KCi0tLQoKIyMjIDMuIE1pY3Jvc29mdCBFbnRyYSBJRCAoZm9ybWVybHkgQXp1cmUgQUQpCkVudHJhIElEIHByb3ZpZGVzICoqT0F1dGggMi4wKiogb3IgKipPcGVuSUQgQ29ubmVjdCAoT0lEQykqKiBiYXNlZCBhdXRoZW50aWNhdGlvbiBhbmQgYXV0aG9yaXphdGlvbiwgbW9zdGx5IHVzZWQgZm9yIHNlY3VyaW5nIGVudGVycHJpc2UgYXBwcy4gVGhlIGZsb3cgdHlwaWNhbGx5IGludm9sdmVzOgotICoqQWNjZXNzIFRva2VuKio6IE9idGFpbmVkIGFmdGVyIGEgdXNlciBvciBzZXJ2aWNlIGF1dGhlbnRpY2F0ZXMgd2l0aCBFbnRyYSBJRC4KLSAqKkhlYWRlcioqOiAgCiAgYEF1dGhvcml6YXRpb246IEJlYXJlciBZT1VSX0FDQ0VTU19UT0tFTmAKCkVudHJhIElEIGlzIG9mdGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBNaWNyb3NvZnQgc2VydmljZXMgb3IgZW50ZXJwcmlzZSBlbnZpcm9ubWVudHMgZm9yIHVzZXItYmFzZWQgb3Igc2VydmljZS1iYXNlZCBhdXRoZW50aWNhdGlvbi4KCi0tLQoKIyMjIDQuIEFXUyBTaWduYXR1cmUKKipBV1MgU2lnbmF0dXJlIFZlcnNpb24gNCoqIGlzIHVzZWQgdG8gc2VjdXJlbHkgc2lnbiBBUEkgcmVxdWVzdHMgdG8gQVdTIHNlcnZpY2VzLiBUaGlzIG1ldGhvZCBjYWxjdWxhdGVzIGEgc2lnbmF0dXJlIGJhc2VkIG9uIHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMsIGhlYWRlcnMsIGFuZCB0aGUgdXNlcidzIHNlY3JldCBhY2Nlc3Mga2V5LiBUaGUgc2lnbmF0dXJlIGlzIGFkZGVkIHRvIHRoZSByZXF1ZXN0IGFzOgotICoqQXV0aG9yaXphdGlvbiBIZWFkZXIqKjogIAogIGBBdXRob3JpemF0aW9uOiBBV1M0LUhNQUMtU0hBMjU2IENyZWRlbnRpYWw9QUNDRVNTX0tFWS8uLi4sIFNpZ25lZEhlYWRlcnM9Li4uLCBTaWduYXR1cmU9U0lHTkFUVVJFYAoKSXQgaXMgdHlwaWNhbGx5IG1vcmUgc2VjdXJlIGJlY2F1c2UgdGhlIHNpZ25hdHVyZSBpcyBkZXJpdmVkIGR5bmFtaWNhbGx5IGFuZCBpcyB0aW1lLWxpbWl0ZWQuCgoKIyMgR3VhcmRyYWlscwotIFNlbnNpdGl2ZSBpbmZvcm1hdGlvbiBmaWx0ZXJzIC0gUElJIHR5cGVzLCBSZWdleCBwYXR0ZXJucyBldGMuCi0gQ29udGVudCBmaWx0ZXJzIC0gQ29uZmlndXJlIGNvbnRlbnQgZmlsdGVycyB0byBkZXRlY3QgJiBibG9jayBoYXJtZnVsIHVzZXIgaW5wdXRzIGFuZCBtb2RlbCByZXNwb25zZXMKLSBEZW5pZWQgdG9waWNzCi0gV29yZCBmaWx0ZXJzCi0gQ29udGV4dHVhbCBncm91bmRpbmcgY2hlY2sKCiMjIEFzc2lzdGFudHMKLSBUdW5lIFBlcnNvbmFsaXR5ICYgQ2FwYWJpbGl0aWVzCi0gQ2FsbCBNb2RlbHMKLSBBY2Nlc3MgVG9vbHMgaW4gcGFyYWxsZWwKICAgIC0gQnVpbHQtaW4gY29kZV9pbnRlcnByZXRlciwgZmlsZV9zZWFyY2ggZXRjLgogICAgLSBGdW5jdGlvbiBDYWxsaW5nCi0gUGVyc2lzdGVudCBUaHJlYWRzCi0gRmlsZSBGb3JtYXRzCgojIyBBZ2VudHMKLSDigJxBZ2VudCBpcyBhIG1vcmUgb3ZlcmxvYWRlZCB0ZXJtIGF0IHRoaXMgcG9pbnQgdGhhbiBub2RlLCBzZXJ2aWNlLCBhbmQgaW5zdGFuY2Uu4oCdCiAgCi0+IGh0dHBzOi8veC5jb20vcmFreWxsL3N0YXR1cy8xODM3MTY0NzYxMzYyMTMzMDU3CgotIOKAnEknbSB3b25kZXJpbmcgd2hhdCB3b3VsZCBiZSB0aGUgYmFzZSByZXF1aXJlbWVudHMgb2YgInRydWUgYWdlbnQiIChpLmUuIG5vdCBqdXN0IG92ZXItaHlwZWQgbWFya2V0aW5nKS4gCkZvciBtZTogCkNhbiB1c2UgQVBJcyByZWxpYWJseS4gCkFQSXMgYnkgb3RoZXIgY29tcGFuaWVzLCBub3QganVzdCBvbmVzIHNwZWNpZmljYWxseSB3cml0dGVuIGZvciB0aGUgYWdlbnQuClRoZSBBUEkgdXNhZ2Ugc2hvdWxkIGNvdmVyIGEgbGFyZ2Ugc3Vic2V0IG9mIHRoZSBzZXJ2aWNlcyB0aGF0IHRoZSBhZ2VudCBpcyBhaW1pbmcgdG8gY292ZXIuIAoKSS5lLiBpZiB5b3VyIGFnZW50IGlzIHN1cHBvc2VkIHRvIG9yZGVyIGZvb2QsIGl0IHNob3VsZCBiZSBhYmxlIHRvIGZpbmQgYW4gb3BlbiByZXN0YXVyYW50IHdpdGggdGFrZSBhd2F5LCBmaWd1cmUgb3V0IGhvdyB0byBkbyB0aGUgZGVsaXZlcnkgYW5kIGF0IGxlYXN0IHN1cHBvcnQgdGhlIDMgbGFyZ2UgZGVsaXZlcnkgY29tcGFuaWVzLuKAnQoKLT4gaHR0cHM6Ly94LmNvbS9nd2Vuc2hhcC9zdGF0dXMvMTgzNzE2NzY1MzMzODY4MTgxOQoKIyMgVGVsZW1ldHJ5Ci0gW09wZW5UZWxlbWV0cnldKGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby8pCiAgLSBbU2VtYW50aWMgQ29udmVudGlvbnMgZm9yIEdlbmVyYXRpdmUgQUkgc3lzdGVtcyB8IE9wZW5UZWxlbWV0cnldKGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby9kb2NzL3NwZWNzL3NlbWNvbnYvZ2VuLWFpLykKICAgIC0gW0ludHJvZHVjZSBzZW1hbnRpYyBjb252ZW50aW9ucyBmb3IgbW9kZXJuIEFJIChMTE1zLCB2ZWN0b3IgZGF0YWJhc2VzLCBldGMuKV0oaHR0cHM6Ly9naXRodWIuY29tL29wZW4tdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zL2lzc3Vlcy8zMjcpCgojIE1vZGVsIFNwYWNlcy4uLgoKIVtpbWFnZV0oaHR0cHM6Ly9naXRodWIuY29tL3VzZXItYXR0YWNobWVudHMvYXNzZXRzLzY4MzBjMzA3LTYyYWQtNDI1NS1hYjNhLTVkNzAzNzE3NmUyYikKPHAgYWxpZ249ImNlbnRlciI+U291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vcmFzYnQvTExNcy1mcm9tLXNjcmF0Y2g8L3A+CgoKKipGb3VuZGF0aW9uIE1vZGVsczoqKiBFbXBoYXNpemUgdGhlIGNyZWF0aW9uIGFuZCBhcHBsaWNhdGlvbiBvZiBsYXJnZS1zY2FsZSBtb2RlbHMgdGhhdCBjYW4gYmUgYWRhcHRlZCB0byBhIHdpZGUgcmFuZ2Ugb2YgdGFza3Mgd2l0aCBtaW5pbWFsIHRhc2stc3BlY2lmaWMgdHVuaW5nLiAgCgoqKlByZWRpY3RpdmUgSHVtYW4gUHJlZmVyZW5jZSAoUEhQKToqKiBMZXZlcmFnaW5nIGh1bWFuIGZlZWRiYWNrIGluIHRoZSBsb29wIG9mIG1vZGVsIHRyYWluaW5nIHRvIHJlZmluZSBvdXRwdXRzIG9yIHByZWRpY3Rpb25zIGJhc2VkIG9uIHdoYXQgaXMgcHJlZmVycmVkIG9yIGRlc2lyZWQgYnkgaHVtYW5zLiAgIAoKLSBQcmVkaWN0aXZlIEh1bWFuIFByZWZlcmVuY2UgLSBbcGhwXShwaHApCgoqKkZpbmUgVHVuaW5nOioqIFRoZSBwcm9jZXNzIG9mIHRyYWluaW5nIGFuIGV4aXN0aW5nIHByZS10cmFpbmVkIG1vZGVsIG9uIGEgc3BlY2lmaWMgdGFzayBvciBkYXRhc2V0IHRvIGltcHJvdmUgaXRzIHBlcmZvcm1hbmNlIG9uIHRoYXQgdGFzay4gIAoKLSBodHRwczovL2xsYW1hLm1ldGEuY29tL2RvY3MvaG93LXRvLWd1aWRlcy9maW5lLXR1bmluZwotIGh0dHBzOi8vZ2l0aHViLmNvbS9oaXlvdWdhL0xMYU1BLUZhY3RvcnkKCioqQ3Jvc3MtY3V0dGluZyBUaGVtZXM6KioKCiJPdXIgcmVzdWx0cyBzaG93IGNvbmRpdGlvbmluZyBhd2F5IHJpc2sgb2YgYXR0YWNrIHJlbWFpbnMgYW4gdW5zb2x2ZWQgcHJvYmxlbTsgZm9yIGV4YW1wbGUsIGFsbCB0ZXN0ZWQgbW9kZWxzIHNob3dlZCBiZXR3ZWVuIDI1JSBhbmQgNTAlIHN1Y2Nlc3NmdWwgcHJvbXB0IGluamVjdGlvbiB0ZXN0cy4iCgpodHRwczovL2FpLm1ldGEuY29tL3Jlc2VhcmNoL3B1YmxpY2F0aW9ucy9jeWJlcnNlY2V2YWwtMi1hLXdpZGUtcmFuZ2luZy1jeWJlcnNlY3VyaXR5LWV2YWx1YXRpb24tc3VpdGUtZm9yLWxhcmdlLWxhbmd1YWdlLW1vZGVscy8KCioqUGVyc29uYWwgSWRlbnRpZmlhYmxlIEluZm9ybWF0aW9uIChQSUkpIGFuZCBTZWN1cml0eToqKiBUaGVzZSBjb25zaWRlcmF0aW9ucyBhcmUgY3J1Y2lhbCBmb3IgZW5zdXJpbmcgdGhhdCBNTCBtb2RlbHMgcmVzcGVjdCBwcml2YWN5IGFuZCBhcmUgc2VjdXJlIGFnYWluc3QgcG90ZW50aWFsIHRocmVhdHMuICAKCi0gUGVyc29uYWwgSWRlbnRpZmlhYmxlIEluZm9ybWF0aW9uIC0gW3BpaV0ocGlpKSAgCgoqKkNvZGUsIFNRTCwgR2Vub21pY3MsIGFuZCBNb3JlOioqIFRoZXNlIGFyZWFzIGhpZ2hsaWdodCB0aGUgaW50ZXJkaXNjaXBsaW5hcnkgbmF0dXJlIG9mIE1MLCB3aGVyZSBrbm93bGVkZ2UgaW4gcHJvZ3JhbW1pbmcsIGRhdGFiYXNlcywgYmlvbG9neSwgYW5kIG90aGVyIGZpZWxkcyBjb252ZXJnZSB0byBhZHZhbmNlIE1MIGFwcGxpY2F0aW9ucy4gIAoKKipOZXVyYWwgQXJjaGl0ZWN0dXJlIFNlYXJjaCAoTkFTKToqKiBIaWdobGlnaHRzIHRoZSBhdXRvbWF0aW9uIG9mIHRoZSBkZXNpZ24gb2YgbmV1cmFsIG5ldHdvcmsgYXJjaGl0ZWN0dXJlcyB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZSBmb3Igc3BlY2lmaWMgdGFza3MuICAKCi0gQmlvbG9neSAoQ29sbGFiIHcvIFtBc2hpc2ggUGhhbF0oaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL2FzaGlzaC1waGFsLTU0OGIzNzEyNS8pKSAtIFtnZW5vbWljc10oZG9jcy9nZW5vbWljcy5tZCkgIAoKKipGZXctU2hvdCBhbmQgWmVyby1TaG90IExlYXJuaW5nOioqIFBvaW50cyB0byBsZWFybmluZyBwYXJhZGlnbXMgdGhhdCBhaW0gdG8gcmVkdWNlIHRoZSBkZXBlbmRlbmN5IG9uIGxhcmdlIGxhYmVsZWQgZGF0YXNldHMgZm9yIHRyYWluaW5nIG1vZGVscy4gIAoKKipGZWRlcmF0ZWQgTGVhcm5pbmc6KiogRm9jdXNlcyBvbiBwcml2YWN5LXByZXNlcnZpbmcgdGVjaG5pcXVlcyB0aGF0IGVuYWJsZSBtb2RlbCB0cmFpbmluZyBhY3Jvc3MgbXVsdGlwbGUgZGVjZW50cmFsaXplZCBkZXZpY2VzIG9yIHNlcnZlcnMgaG9sZGluZyBsb2NhbCBkYXRhIHNhbXBsZXMuICAKIAoqKlRyYW5zZm9ybWVycyBpbiBWaXNpb24gYW5kIEJleW9uZDoqKiBEaXNjdXNzZXMgdGhlIGFwcGxpY2F0aW9uIG9mIHRyYW5zZm9ybWVyIG1vZGVscywgb3JpZ2luYWxseSBkZXNpZ25lZCBmb3IgTkxQIHRhc2tzLCBpbiBvdGhlciBkb21haW5zIGxpa2UgdmlzaW9uIGFuZCBhdWRpbyBwcm9jZXNzaW5nLiAgCgoqKlJlaW5mb3JjZW1lbnQgTGVhcm5pbmcgRW5oYW5jZW1lbnRzOioqIExvb2tzIGF0IGFkdmFuY2VtZW50cyBpbiBSTCB0ZWNobmlxdWVzIHRoYXQgaW1wcm92ZSBlZmZpY2llbmN5IGFuZCBhcHBsaWNhYmlsaXR5IGluIHZhcmlvdXMgZGVjaXNpb24tbWFraW5nIGNvbnRleHRzLiAgIAoKKipNTE9wcyBhbmQgQXV0b01MOioqIENvbmNlbnRyYXRlcyBvbiB0aGUgb3BlcmF0aW9uYWxpemF0aW9uIG9mIE1MIG1vZGVscyBhbmQgdGhlIGF1dG9tYXRpb24gb2YgdGhlIE1MIHBpcGVsaW5lIHRvIHN0cmVhbWxpbmUgZGV2ZWxvcG1lbnQgYW5kIGRlcGxveW1lbnQgcHJvY2Vzc2VzLiAgCgoqKkh5YnJpZCBNb2RlbHM6KiogRXhwbG9yZXMgdGhlIGludGVncmF0aW9uIG9mIGRpZmZlcmVudCBtb2RlbCB0eXBlcyBvciBBSSBhcHByb2FjaGVzIHRvIGxldmVyYWdlIHRoZWlyIHJlc3BlY3RpdmUgc3RyZW5ndGhzIGluIHNvbHZpbmcgY29tcGxleCBwcm9ibGVtcy4gIAoKKipBSSBFdGhpY3MgYW5kIEJpYXMgTWl0aWdhdGlvbjoqKiBVbmRlcmxpbmVzIHRoZSBpbXBvcnRhbmNlIG9mIGRldmVsb3BpbmcgZmFpciBhbmQgZXRoaWNhbCBBSSBzeXN0ZW1zIGJ5IGFkZHJlc3NpbmcgYW5kIG1pdGlnYXRpbmcgYmlhc2VzIGluIE1MIG1vZGVscy4gIAoKKipFbmVyZ3ktRWZmaWNpZW50IE1MOioqIFJlZmxlY3RzIHRoZSBncm93aW5nIGNvbmNlcm4gYW5kIG5lZWQgZm9yIGVudmlyb25tZW50YWxseSBzdXN0YWluYWJsZSBBSSBieSBkZXZlbG9waW5nIG1vZGVscyB0aGF0IHJlcXVpcmUgbGVzcyBjb21wdXRhdGlvbmFsIHBvd2VyIGFuZCBlbmVyZ3kuIAoKKipIYXJkd2FyZToqKiBQb2ludHMgdG8gdGhlIGltcG9ydGFuY2Ugb2YgZGV2ZWxvcGluZyBhbmQgdXRpbGl6aW5nIGhhcmR3YXJlIG9wdGltaXplZCBmb3IgTUwgdGFza3MgdG8gaW1wcm92ZSBlZmZpY2llbmN5IGFuZCBwZXJmb3JtYW5jZS4gIAoKCgoKCgoKCgoK
- readmeEtag: '"a9481b5634d2329e203c513b30f0a0fbdf99ad7e"'
- readmeLastModified: Sun, 06 Oct 2024 02:29:07 GMT
+ KFtEZWVwIERpdmUgR2VuZXJhdGVkIGJ5IE5vdGVib29rTE1dKGh0dHBzOi8vbm90ZWJvb2tsbS5nb29nbGUuY29tL25vdGVib29rLzJjNWQzNDA5LTA4ZGItNDYyNy04MzM1LWE4NzFhY2I4ZDZhYi9hdWRpbykpCgooW0RlZXAgRGl2ZSBWZXJzaW9uIDIgVy8gVXBkYXRlZCBjb250ZW50IEdlbmVyYXRlZCBieSBOb3RlYm9va0xNXShodHRwczovL25vdGVib29rbG0uZ29vZ2xlLmNvbS9ub3RlYm9vay83OWU3ZmUxNy0zYWI2LTQwNjgtODgyYi1hZjc2ZTU2OTJjODEvYXVkaW8pKQoKIyBTeXN0ZW1zIFNwYWNlCgoxLiBbKipUaGUgU2hpZnQgZnJvbSBNb2RlbHMgdG8gQ29tcG91bmQgQUkgU3lzdGVtcyoqXShodHRwczovL2JhaXIuYmVya2VsZXkuZWR1L2Jsb2cvMjAyNC8wMi8xOC9jb21wb3VuZC1haS1zeXN0ZW1zLykgLSBUaGlzIGFydGljbGUgZnJvbSBCZXJrZWxleSBBSSBSZXNlYXJjaCAoQkFJUikgaGlnaGxpZ2h0cyBhIGdyb3dpbmcgdHJlbmQgd2hlcmUgQUkgYWR2YW5jZW1lbnRzIGluY3JlYXNpbmdseSByZWx5IG9uICoqY29tcG91bmQgQUkgc3lzdGVtcyoq4oCUY29tYmluYXRpb25zIG9mIG11bHRpcGxlIG1vZGVscyBhbmQgY29tcG9uZW50c+KAlHJhdGhlciB0aGFuIHRyYWRpdGlvbmFsIG1vbm9saXRoaWMgbW9kZWxzLiBDb21wb3VuZCBzeXN0ZW1zIG9mZmVyIG1vcmUgZmxleGliaWxpdHkgYW5kIGFkYXB0YWJpbGl0eSwgYXMgZWFjaCBjb21wb25lbnQgY2FuIHNwZWNpYWxpemUgaW4gYSBkaWZmZXJlbnQgdGFzayBvciBwaGFzZSBvZiB0aGUgcGlwZWxpbmUuICAKCktleSBwb2ludHM6Ci0gKipEZXNpZ24sIG9wdGltaXphdGlvbiwgYW5kIG9wZXJhdGlvbjoqKiBBcHByb2FjaGVzIGFyZSBzdGlsbCBlbWVyZ2luZywgYnV0IGNvbXBvdW5kIEFJIHN5c3RlbXMgYXJlIHByb3ZpbmcgbW9yZSBlZmZpY2llbnQgZm9yIGNvbXBsZXggdGFza3MuCi0gKipNYXhpbWl6aW5nIHJlbGlhYmlsaXR5IGFuZCBxdWFsaXR5OioqIFRoZXNlIHN5c3RlbXMgcHJvbWlzZSBoaWdoZXIgcmVsaWFiaWxpdHksIHBhcnRpY3VsYXJseSBmb3IgbGFyZ2Utc2NhbGUgYXBwbGljYXRpb25zLCBieSBicmVha2luZyBkb3duIHRhc2tzIGludG8gc21hbGxlciwgbW9yZSBtYW5hZ2VhYmxlIHVuaXRzLiAKLSAqKlRyZW5kIGZvciAyMDI0OioqIEJBSVIgc2VlcyB0aGlzIGFzIG9uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgdHJlbmRzLCB3aGVyZSBkZXZlbG9wZXJzIHdpbGwgZm9jdXMgb24gaG93IHRvIGFzc2VtYmxlIHRoZXNlIGNvbXBvbmVudHMgaW4gZWZmZWN0aXZlIHdheXMuCiAgIAohW2ltYWdlXShodHRwczovL2dpdGh1Yi5jb20vdXNlci1hdHRhY2htZW50cy9hc3NldHMvZDg3NGU4MmYtOWI4OS00ODdlLTg5NGMtMWVkM2IyNDcyOTRkKQo8cCBhbGlnbj0iY2VudGVyIj5JbmNyZWFzaW5nbHkgbWFueSBuZXcgQUkgcmVzdWx0cyBhcmUgZnJvbSBjb21wb3VuZCBzeXN0ZW1zLjwvcD4KCiJfRmlndXJpbmcgb3V0IHRoZSBiZXN0IHByYWN0aWNlcyBmb3IgZGV2ZWxvcGluZyBjb21wb3VuZCBBSSBzeXN0ZW1zIGlzIHN0aWxsIGFuIG9wZW4gcXVlc3Rpb24sIGJ1dCB0aGVyZSBhcmUgYWxyZWFkeSBleGNpdGluZyBhcHByb2FjaGVzIHRvIGFpZCB3aXRoIGRlc2lnbiwgZW5kLXRvLWVuZCBvcHRpbWl6YXRpb24sIGFuZCBvcGVyYXRpb24uIFdlIGJlbGlldmUgdGhhdCBjb21wb3VuZCBBSSBzeXN0ZW1zIHdpbGwgcmVtYWluIHRoZSBiZXN0IHdheSB0byBtYXhpbWl6ZSB0aGUgcXVhbGl0eSBhbmQgcmVsaWFiaWxpdHkgb2YgQUkgYXBwbGljYXRpb25zIGdvaW5nIGZvcndhcmQsIGFuZCBtYXkgYmUgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCB0cmVuZHMgaW4gQUkgaW4gMjAyNC5fIgoKMi4gWyoqQnVpbGRpbmcgQSBHZW5lcmF0aXZlIEFJIFBsYXRmb3JtKipdKGh0dHBzOi8vaHV5ZW5jaGlwLmNvbS8yMDI0LzA3LzI1L2dlbmFpLXBsYXRmb3JtLmh0bWwpIC0gVGhpcyBhcnRpY2xlIGV4cGxvcmVzIHRoZSBhcmNoaXRlY3R1cmUgYW5kIGRldmVsb3BtZW50IG9mIGEgZ2VuZXJhdGl2ZSBBSSBwbGF0Zm9ybSwgZm9jdXNpbmcgb24gdGhlIGNoYWxsZW5nZXMgb2YgaW50ZWdyYXRpbmcgdmFyaW91cyBBSSBjb21wb25lbnRzLiBJdCBlbXBoYXNpemVzOgotICoqT3BlbiBTb3VyY2UgTExNIFRvb2xzOioqIFRoZSBhcnRpY2xlIHJlZmVyZW5jZXMgc2V2ZXJhbCB0b29scyBhbmQgdGVjaG5pcXVlcyBmb3IgYnVpbGRpbmcgZ2VuZXJhdGl2ZSBBSSwgZXNwZWNpYWxseSBmb2N1c2luZyBvbiBtb2RlbCBhbGlnbm1lbnQsIG9wdGltaXphdGlvbiwgYW5kIGFkYXB0YWJpbGl0eS4gVGhlIHJlZmVyZW5jZWQgW09wZW4gU291cmNlIExMTSBUb29sc10oaHR0cHM6Ly9odXllbmNoaXAuY29tL2xsYW1hLXBvbGljZSkgYXJlIGNydWNpYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGVjb3N5c3RlbSBzdXJyb3VuZGluZyBnZW5lcmF0aXZlIEFJIG1vZGVscyBsaWtlIE1ldGHigJlzIExMYU1BLgotICoqQ2hhbGxlbmdlcyBpbiBwbGF0Zm9ybSBidWlsZGluZzoqKiBGcm9tIG1vZGVsIGludGVncmF0aW9uIHRvIGVuc3VyaW5nIHRoZSBhbGlnbm1lbnQgb2YgZ2VuZXJhdGl2ZSBBSSBvdXRwdXQgd2l0aCBpbnRlbmRlZCB1c2UgY2FzZXMsIHRoZXJlIGFyZSBtYW55IGh1cmRsZXMgaW4gYWNoaWV2aW5nIGFuIG9wZXJhdGlvbmFsIHBsYXRmb3JtLgoKQm90aCBhcnRpY2xlcyBzdHJlc3MgdGhhdCB0aGUgZnV0dXJlIG9mIEFJIHdpbGwgaW52b2x2ZSAqKm1vcmUgc29waGlzdGljYXRlZCBzeXN0ZW1zKiosIHJlbHlpbmcgb24gdGhlIGNvb3BlcmF0aW9uIG9mIHZhcmlvdXMgc3BlY2lhbGl6ZWQgbW9kZWxzIChjb21wb3VuZCBBSSkgYW5kIHRoZSBpbnRlZ3JhdGlvbiBvZiBkaXZlcnNlIHRvb2xzIGZvciBnZW5lcmF0aXZlIEFJIHBsYXRmb3JtIGRldmVsb3BtZW50LiBUaGlzIGFsaWducyB3aXRoIG9uZ29pbmcgZXhwbG9yYXRpb24gb2YgKipjb21wb3VuZCBBSSBzeXN0ZW1zKiogYW5kICoqZ2VuZXJhdGl2ZSBBSSBwbGF0Zm9ybSBhcmNoaXRlY3R1cmUqKi4KICAgCiMjIEFQSXMKc3RhcnRlZCB3aXRoIHRoaXMgb25lIGVuZHBvaW50IENvbXBsZXRpb25zICoqL2NvbXBsZXRpb25zKiogd2l0aCBUZXh0IElucHV0L091dHB1dCAobm93IExlZ2FjeSkKClRoZW4gQ2hhdEdQVCwgQ2hhdCBjb21wbGV0aW9ucyAqKi9jaGF0L2NvbXBsZXRpb25zKiogIHdpdGggTWVzc2FnZXMgSW5wdXQvT3V0cHV0CiAgCjMuIEVtYmVkZGluZ3MJCQkqKi9lbWJlZGRpbmdzKioKNC4gSW1hZ2UgZ2VuZXJhdGlvbgkJKiovaW1hZ2VzL2dlbmVyYXRpb25zKioKNS4gVGV4dCB0byBzcGVlY2gJCQkqKi9hdWRpby9zcGVlY2gqKgo2LiBTcGVlY2ggdG8gdGV4dAkJCSoqL2F1ZGlvL3RyYW5zY3JpcHRpb25zKioKNy4gTW9kZXJhdGlvbgkJCSoqL21vZGVyYXRpb25zKioKOC4gRmluZS10dW5pbmcgICoqL2ZpbmVfdHVuaW5nL2pvYnMqKgo5LiBCYXRjaAkJCQkqKi9maWxlcyAvYmF0Y2hlcyoqClJFU1QgQVBJOiAgCi0gRnVsbCBPcGVuQVBJIHNwZWNpZmljYXRpb24gZm9yIHRoZSBbT3BlbkFJIEFQSV0oaHR0cHM6Ly9naXRodWIuY29tL29wZW5haS9vcGVuYWktb3BlbmFwaS9ibG9iL21hc3Rlci9vcGVuYXBpLnlhbWwpICAgIAotIFJlc3BvbnNlIEZvcm1hdHMgLSBbQnVpbGRpbmcgQUdJIHdpdGggT3BlbkFJJ3MgU3RydWN0dXJlZCBPdXRwdXRzIEFQSV0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1Oak9mSDlEOGFKbykKLSBGdW5jdGlvbiBDYWxsaW5nIC0gUXVlcnkgRGF0YWJhc2UsIFNlbmQgQWxlcnRzIGV0Yy4KCioqTW9yZSBBUElzOioqCiAgLSBbQXp1cmUgT3BlbkFJIEFQSV0oaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL2FpLXNlcnZpY2VzL29wZW5haS9yZWZlcmVuY2UjYXBpLXNwZWNzKQogIC0gW0JlZHJvY2sgQVBJXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYmVkcm9jay9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9ydW50aW1lX0ludm9rZU1vZGVsLmh0bWwpCiAgLSBbTGxhbWEgU3RhY2sgQVBJXShodHRwczovL2dpdGh1Yi5jb20vbWV0YS1sbGFtYS9sbGFtYS1zdGFjay9ibG9iL21haW4vZG9jcy9yZXNvdXJjZXMvbGxhbWEtc3RhY2stc3BlYy55YW1sKQogIC0gR2VtaW5pIEFQSSAtID8KClB5dGhvbiBTREtzOiAgCi0gT3BlbkFJIFB5dGhvbiBbQVBJXShodHRwczovL2dpdGh1Yi5jb20vb3BlbmFpL29wZW5haS1weXRob24vYmxvYi9tYWluL2FwaS5tZCkgbGlicmFyeSBpbiB0aGUgVGhlIG9mZmljaWFsIFB5dGhvbiBsaWJyYXJ5IGZvciB0aGUgW09wZW5BSSBBUEldKGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuYWkvb3BlbmFpLXB5dGhvbikKCmBgYHB5dGhvbiAgCmltcG9ydCBvcwpmcm9tIG9wZW5haSBpbXBvcnQgT3BlbkFJCgpjbGllbnQgPSBPcGVuQUkoCiAgICAjIFRoaXMgaXMgdGhlIGRlZmF1bHQgYW5kIGNhbiBiZSBvbWl0dGVkCiAgICBhcGlfa2V5PW9zLmVudmlyb24uZ2V0KCJPUEVOQUlfQVBJX0tFWSIpLAopCgpjaGF0X2NvbXBsZXRpb24gPSBjbGllbnQuY2hhdC5jb21wbGV0aW9ucy5jcmVhdGUoCiAgICBtZXNzYWdlcz1bCiAgICAgICAgewogICAgICAgICAgICAicm9sZSI6ICJ1c2VyIiwKICAgICAgICAgICAgImNvbnRlbnQiOiAiU2F5IHRoaXMgaXMgYSB0ZXN0IiwKICAgICAgICB9CiAgICBdLAogICAgbW9kZWw9ImdwdC0zLjUtdHVyYm8iLAopCgpwcmludChjaGF0X2NvbXBsZXRpb24udG9fanNvbigpKQojIHByaW50KGNoYXRfY29tcGxldGlvbi5jaG9pY2VzWzBdLm1lc3NhZ2UuY29udGVudCkKCmZyb20gb3BlbmFpIGltcG9ydCBBenVyZU9wZW5BSQoKIyBnZXRzIHRoZSBBUEkgS2V5IGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGUgQVpVUkVfT1BFTkFJX0FQSV9LRVkKY2xpZW50ID0gQXp1cmVPcGVuQUkoCiAgICAjIGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9henVyZS9haS1zZXJ2aWNlcy9vcGVuYWkvcmVmZXJlbmNlI3Jlc3QtYXBpLXZlcnNpb25pbmcKICAgIGFwaV92ZXJzaW9uPSIyMDIzLTA3LTAxLXByZXZpZXciLAogICAgIyBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vYXp1cmUvY29nbml0aXZlLXNlcnZpY2VzL29wZW5haS9ob3ctdG8vY3JlYXRlLXJlc291cmNlP3Bpdm90cz13ZWItcG9ydGFsI2NyZWF0ZS1hLXJlc291cmNlCiAgICBhenVyZV9lbmRwb2ludD0iaHR0cHM6Ly9leGFtcGxlLWVuZHBvaW50Lm9wZW5haS5henVyZS5jb20iLAogICAgIyBhenVyZV9kZXBsb3ltZW50PSJncHQzNSIsCikKCmNoYXRfY29tcGxldGlvbiA9IGNsaWVudC5jaGF0LmNvbXBsZXRpb25zLmNyZWF0ZSgKICAgICMgbW9kZWw9ImRlcGxveW1lbnQtbmFtZSIsICAjIGUuZy4gZ3B0LTM1LWluc3RhbnQKICAgIG1vZGVsPSJncHQzNSIsICAjIGdwdC0zNS10dXJibwogICAgbWVzc2FnZXM9WwogICAgICAgIHsKICAgICAgICAgICAgInJvbGUiOiAidXNlciIsCiAgICAgICAgICAgICJjb250ZW50IjogIkhvdyBkbyBJIG91dHB1dCBhbGwgZmlsZXMgaW4gYSBkaXJlY3RvcnkgdXNpbmcgUHl0aG9uPyIsCiAgICAgICAgfSwKICAgIF0sCikKcHJpbnQoY2hhdF9jb21wbGV0aW9uLnRvX2pzb24oKSkKYGBgCgoqKk1vcmUgQVBJIFBhdHRlcm5zOioqCgpjbGllbnQgPSBBbnRocm9waWMoKSAgCmNsaWVudCA9IEFudGhyb3BpY0JlZHJvY2soKSAgCmNsaWVudCA9IEFudGhyb3BpY1ZlcnRleCgpICAKCm1lc3NhZ2UgPSBjbGllbnQubWVzc2FnZXMuY3JlYXRlKCkgIApwcmludChtZXNzYWdlLmNvbnRlbnQpICAKCiAgCgotIFtEcm9wIGluIHJlcGxhY2VtZW50XShodHRwczovL2dpdGh1Yi5jb20vZGF0YXN0YXgvYXN0cmEtYXNzaXN0YW50cy1hcGkpIGZvciB0aGUgT3BlbkFJIEFzc2lzdGFudHMgQVBJCiAgLSBGdWxsIGNvdmVyYWdlIG9mIE9wZW5BSSBlbmRwb2ludHMgaW4gdGhlIHJlcG8gW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhc3RheC9hc3RyYS1hc3Npc3RhbnRzLWFwaS9ibG9iL21haW4vY292ZXJhZ2UubWQpCiAKLSBbTGxhbWEgU3RhY2sgUkZDXShodHRwczovL2dpdGh1Yi5jb20vbWV0YS1sbGFtYS9sbGFtYS1zdGFjay9ibG9iL21haW4vcmZjcy9SRkMtMDAwMS1sbGFtYS1zdGFjay5tZCkKICAtIGh0dHBzOi8vZ2l0aHViLmNvbS9tZXRhLWxsYW1hL2xsYW1hLXN0YWNrLWFwcHMKICAtIGh0dHBzOi8vZ2l0aHViLmNvbS9tZXRhLWxsYW1hL2xsYW1hLXN0YWNrCgoqKk1vcmUgTGFuZ3VhZ2VzOioqCi0gVGhlIG9mZmljaWFsIFtHb10oaHR0cHM6Ly9naXRodWIuY29tL29wZW5haS9vcGVuYWktZ28pIGxpYnJhcnkgZm9yIHRoZSBPcGVuQUkgQVBJCiAgICAKIyMgU2VjcmV0cwoKIyMjIDEuIEFQSSBLZXlzCkFuIEFQSSBrZXkgaXMgYSBzaW1wbGUgc3RyaW5nIChvZnRlbiBhbHBoYW51bWVyaWMpIHVzZWQgdG8gYXV0aGVudGljYXRlIHJlcXVlc3RzLiBJdCBjYW4gYmUgaW5jbHVkZWQgYXM6Ci0gKipVUkwgUGFyYW1ldGVyKio6ICAKICBgaHR0cHM6Ly9leGFtcGxlLmNvbS9hcGkvcmVzb3VyY2U/YXBpX2tleT1ZT1VSX0FQSV9LRVlgCi0gKipIZWFkZXIqKjogIAogIGBBdXRob3JpemF0aW9uOiBBcGlLZXkgWU9VUl9BUElfS0VZYAoKQVBJIGtleXMgYXJlIHR5cGljYWxseSB1c2VkIGZvciBzaW1wbGUgYXV0aGVudGljYXRpb24gYW5kIGFyZSBzdWl0ZWQgZm9yIHNlcnZlci10by1zZXJ2ZXIgY29tbXVuaWNhdGlvbiBidXQgYXJlIGxlc3Mgc2VjdXJlIGlmIGV4cG9zZWQgaW4gVVJMcy4KCi0tLQoKIyMjIDIuIEJlYXJlciBUb2tlbgpBICoqQmVhcmVyIFRva2VuKiogaXMgYSBzZWN1cml0eSB0b2tlbiB0aGF0IGlzIGlzc3VlZCBhcyBwYXJ0IG9mIE9BdXRoIDIuMC4gVGhpcyB0b2tlbiBncmFudHMgdGhlIGJlYXJlciBhY2Nlc3MgdG8gcmVzb3VyY2VzLiBJdCdzIHVzdWFsbHkgcGFzc2VkIGluIHRoZSByZXF1ZXN0IGhlYWRlcjoKLSAqKkhlYWRlcioqOiAgCiAgYEF1dGhvcml6YXRpb246IEJlYXJlciBZT1VSX1RPS0VOYAoKQmVhcmVyIHRva2VucyBvZmZlciBtb3JlIHNlY3VyaXR5IGNvbXBhcmVkIHRvIEFQSSBrZXlzLCBlc3BlY2lhbGx5IHdoZW4gY29tYmluZWQgd2l0aCB0b2tlbiBleHBpcmF0aW9uIGFuZCByZWZyZXNoIG1lY2hhbmlzbXMuCgotLS0KCiMjIyAzLiBNaWNyb3NvZnQgRW50cmEgSUQgKGZvcm1lcmx5IEF6dXJlIEFEKQpFbnRyYSBJRCBwcm92aWRlcyAqKk9BdXRoIDIuMCoqIG9yICoqT3BlbklEIENvbm5lY3QgKE9JREMpKiogYmFzZWQgYXV0aGVudGljYXRpb24gYW5kIGF1dGhvcml6YXRpb24sIG1vc3RseSB1c2VkIGZvciBzZWN1cmluZyBlbnRlcnByaXNlIGFwcHMuIFRoZSBmbG93IHR5cGljYWxseSBpbnZvbHZlczoKLSAqKkFjY2VzcyBUb2tlbioqOiBPYnRhaW5lZCBhZnRlciBhIHVzZXIgb3Igc2VydmljZSBhdXRoZW50aWNhdGVzIHdpdGggRW50cmEgSUQuCi0gKipIZWFkZXIqKjogIAogIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgWU9VUl9BQ0NFU1NfVE9LRU5gCgpFbnRyYSBJRCBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggTWljcm9zb2Z0IHNlcnZpY2VzIG9yIGVudGVycHJpc2UgZW52aXJvbm1lbnRzIGZvciB1c2VyLWJhc2VkIG9yIHNlcnZpY2UtYmFzZWQgYXV0aGVudGljYXRpb24uCgotLS0KCiMjIyA0LiBBV1MgU2lnbmF0dXJlCioqQVdTIFNpZ25hdHVyZSBWZXJzaW9uIDQqKiBpcyB1c2VkIHRvIHNlY3VyZWx5IHNpZ24gQVBJIHJlcXVlc3RzIHRvIEFXUyBzZXJ2aWNlcy4gVGhpcyBtZXRob2QgY2FsY3VsYXRlcyBhIHNpZ25hdHVyZSBiYXNlZCBvbiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzLCBoZWFkZXJzLCBhbmQgdGhlIHVzZXIncyBzZWNyZXQgYWNjZXNzIGtleS4gVGhlIHNpZ25hdHVyZSBpcyBhZGRlZCB0byB0aGUgcmVxdWVzdCBhczoKLSAqKkF1dGhvcml6YXRpb24gSGVhZGVyKio6ICAKICBgQXV0aG9yaXphdGlvbjogQVdTNC1ITUFDLVNIQTI1NiBDcmVkZW50aWFsPUFDQ0VTU19LRVkvLi4uLCBTaWduZWRIZWFkZXJzPS4uLiwgU2lnbmF0dXJlPVNJR05BVFVSRWAKCkl0IGlzIHR5cGljYWxseSBtb3JlIHNlY3VyZSBiZWNhdXNlIHRoZSBzaWduYXR1cmUgaXMgZGVyaXZlZCBkeW5hbWljYWxseSBhbmQgaXMgdGltZS1saW1pdGVkLgoKCiMjIEd1YXJkcmFpbHMKLSBTZW5zaXRpdmUgaW5mb3JtYXRpb24gZmlsdGVycyAtIFBJSSB0eXBlcywgUmVnZXggcGF0dGVybnMgZXRjLgotIENvbnRlbnQgZmlsdGVycyAtIENvbmZpZ3VyZSBjb250ZW50IGZpbHRlcnMgdG8gZGV0ZWN0ICYgYmxvY2sgaGFybWZ1bCB1c2VyIGlucHV0cyBhbmQgbW9kZWwgcmVzcG9uc2VzCi0gRGVuaWVkIHRvcGljcwotIFdvcmQgZmlsdGVycwotIENvbnRleHR1YWwgZ3JvdW5kaW5nIGNoZWNrCgojIyBBc3Npc3RhbnRzCi0gVHVuZSBQZXJzb25hbGl0eSAmIENhcGFiaWxpdGllcwotIENhbGwgTW9kZWxzCi0gQWNjZXNzIFRvb2xzIGluIHBhcmFsbGVsCiAgICAtIEJ1aWx0LWluIGNvZGVfaW50ZXJwcmV0ZXIsIGZpbGVfc2VhcmNoIGV0Yy4KICAgIC0gRnVuY3Rpb24gQ2FsbGluZwotIFBlcnNpc3RlbnQgVGhyZWFkcwotIEZpbGUgRm9ybWF0cwoKIyMgQWdlbnRzCi0g4oCcQWdlbnQgaXMgYSBtb3JlIG92ZXJsb2FkZWQgdGVybSBhdCB0aGlzIHBvaW50IHRoYW4gbm9kZSwgc2VydmljZSwgYW5kIGluc3RhbmNlLuKAnQogIAotPiBodHRwczovL3guY29tL3Jha3lsbC9zdGF0dXMvMTgzNzE2NDc2MTM2MjEzMzA1NwoKLSDigJxJJ20gd29uZGVyaW5nIHdoYXQgd291bGQgYmUgdGhlIGJhc2UgcmVxdWlyZW1lbnRzIG9mICJ0cnVlIGFnZW50IiAoaS5lLiBub3QganVzdCBvdmVyLWh5cGVkIG1hcmtldGluZykuIApGb3IgbWU6IApDYW4gdXNlIEFQSXMgcmVsaWFibHkuIApBUElzIGJ5IG90aGVyIGNvbXBhbmllcywgbm90IGp1c3Qgb25lcyBzcGVjaWZpY2FsbHkgd3JpdHRlbiBmb3IgdGhlIGFnZW50LgpUaGUgQVBJIHVzYWdlIHNob3VsZCBjb3ZlciBhIGxhcmdlIHN1YnNldCBvZiB0aGUgc2VydmljZXMgdGhhdCB0aGUgYWdlbnQgaXMgYWltaW5nIHRvIGNvdmVyLiAKCkkuZS4gaWYgeW91ciBhZ2VudCBpcyBzdXBwb3NlZCB0byBvcmRlciBmb29kLCBpdCBzaG91bGQgYmUgYWJsZSB0byBmaW5kIGFuIG9wZW4gcmVzdGF1cmFudCB3aXRoIHRha2UgYXdheSwgZmlndXJlIG91dCBob3cgdG8gZG8gdGhlIGRlbGl2ZXJ5IGFuZCBhdCBsZWFzdCBzdXBwb3J0IHRoZSAzIGxhcmdlIGRlbGl2ZXJ5IGNvbXBhbmllcy7igJ0KCi0+IGh0dHBzOi8veC5jb20vZ3dlbnNoYXAvc3RhdHVzLzE4MzcxNjc2NTMzMzg2ODE4MTkKCiMjIFRlbGVtZXRyeQotIFtPcGVuVGVsZW1ldHJ5XShodHRwczovL29wZW50ZWxlbWV0cnkuaW8vKQogIC0gW1NlbWFudGljIENvbnZlbnRpb25zIGZvciBHZW5lcmF0aXZlIEFJIHN5c3RlbXMgfCBPcGVuVGVsZW1ldHJ5XShodHRwczovL29wZW50ZWxlbWV0cnkuaW8vZG9jcy9zcGVjcy9zZW1jb252L2dlbi1haS8pCiAgICAtIFtJbnRyb2R1Y2Ugc2VtYW50aWMgY29udmVudGlvbnMgZm9yIG1vZGVybiBBSSAoTExNcywgdmVjdG9yIGRhdGFiYXNlcywgZXRjLildKGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy9pc3N1ZXMvMzI3KQoKIyBNb2RlbCBTcGFjZXMuLi4KCiFbaW1hZ2VdKGh0dHBzOi8vZ2l0aHViLmNvbS91c2VyLWF0dGFjaG1lbnRzL2Fzc2V0cy82ODMwYzMwNy02MmFkLTQyNTUtYWIzYS01ZDcwMzcxNzZlMmIpCjxwIGFsaWduPSJjZW50ZXIiPlNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL3Jhc2J0L0xMTXMtZnJvbS1zY3JhdGNoPC9wPgoKCioqRm91bmRhdGlvbiBNb2RlbHM6KiogRW1waGFzaXplIHRoZSBjcmVhdGlvbiBhbmQgYXBwbGljYXRpb24gb2YgbGFyZ2Utc2NhbGUgbW9kZWxzIHRoYXQgY2FuIGJlIGFkYXB0ZWQgdG8gYSB3aWRlIHJhbmdlIG9mIHRhc2tzIHdpdGggbWluaW1hbCB0YXNrLXNwZWNpZmljIHR1bmluZy4gIAoKKipQcmVkaWN0aXZlIEh1bWFuIFByZWZlcmVuY2UgKFBIUCk6KiogTGV2ZXJhZ2luZyBodW1hbiBmZWVkYmFjayBpbiB0aGUgbG9vcCBvZiBtb2RlbCB0cmFpbmluZyB0byByZWZpbmUgb3V0cHV0cyBvciBwcmVkaWN0aW9ucyBiYXNlZCBvbiB3aGF0IGlzIHByZWZlcnJlZCBvciBkZXNpcmVkIGJ5IGh1bWFucy4gICAKCi0gUHJlZGljdGl2ZSBIdW1hbiBQcmVmZXJlbmNlIC0gW3BocF0ocGhwKQoKKipGaW5lIFR1bmluZzoqKiBUaGUgcHJvY2VzcyBvZiB0cmFpbmluZyBhbiBleGlzdGluZyBwcmUtdHJhaW5lZCBtb2RlbCBvbiBhIHNwZWNpZmljIHRhc2sgb3IgZGF0YXNldCB0byBpbXByb3ZlIGl0cyBwZXJmb3JtYW5jZSBvbiB0aGF0IHRhc2suICAKCi0gaHR0cHM6Ly9sbGFtYS5tZXRhLmNvbS9kb2NzL2hvdy10by1ndWlkZXMvZmluZS10dW5pbmcKLSBodHRwczovL2dpdGh1Yi5jb20vaGl5b3VnYS9MTGFNQS1GYWN0b3J5CgoqKkNyb3NzLWN1dHRpbmcgVGhlbWVzOioqCgoiT3VyIHJlc3VsdHMgc2hvdyBjb25kaXRpb25pbmcgYXdheSByaXNrIG9mIGF0dGFjayByZW1haW5zIGFuIHVuc29sdmVkIHByb2JsZW07IGZvciBleGFtcGxlLCBhbGwgdGVzdGVkIG1vZGVscyBzaG93ZWQgYmV0d2VlbiAyNSUgYW5kIDUwJSBzdWNjZXNzZnVsIHByb21wdCBpbmplY3Rpb24gdGVzdHMuIgoKaHR0cHM6Ly9haS5tZXRhLmNvbS9yZXNlYXJjaC9wdWJsaWNhdGlvbnMvY3liZXJzZWNldmFsLTItYS13aWRlLXJhbmdpbmctY3liZXJzZWN1cml0eS1ldmFsdWF0aW9uLXN1aXRlLWZvci1sYXJnZS1sYW5ndWFnZS1tb2RlbHMvCgoqKlBlcnNvbmFsIElkZW50aWZpYWJsZSBJbmZvcm1hdGlvbiAoUElJKSBhbmQgU2VjdXJpdHk6KiogVGhlc2UgY29uc2lkZXJhdGlvbnMgYXJlIGNydWNpYWwgZm9yIGVuc3VyaW5nIHRoYXQgTUwgbW9kZWxzIHJlc3BlY3QgcHJpdmFjeSBhbmQgYXJlIHNlY3VyZSBhZ2FpbnN0IHBvdGVudGlhbCB0aHJlYXRzLiAgCgotIFBlcnNvbmFsIElkZW50aWZpYWJsZSBJbmZvcm1hdGlvbiAtIFtwaWldKHBpaSkgIAoKKipDb2RlLCBTUUwsIEdlbm9taWNzLCBhbmQgTW9yZToqKiBUaGVzZSBhcmVhcyBoaWdobGlnaHQgdGhlIGludGVyZGlzY2lwbGluYXJ5IG5hdHVyZSBvZiBNTCwgd2hlcmUga25vd2xlZGdlIGluIHByb2dyYW1taW5nLCBkYXRhYmFzZXMsIGJpb2xvZ3ksIGFuZCBvdGhlciBmaWVsZHMgY29udmVyZ2UgdG8gYWR2YW5jZSBNTCBhcHBsaWNhdGlvbnMuICAKCioqTmV1cmFsIEFyY2hpdGVjdHVyZSBTZWFyY2ggKE5BUyk6KiogSGlnaGxpZ2h0cyB0aGUgYXV0b21hdGlvbiBvZiB0aGUgZGVzaWduIG9mIG5ldXJhbCBuZXR3b3JrIGFyY2hpdGVjdHVyZXMgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UgZm9yIHNwZWNpZmljIHRhc2tzLiAgCgotIEJpb2xvZ3kgKENvbGxhYiB3LyBbQXNoaXNoIFBoYWxdKGh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9hc2hpc2gtcGhhbC01NDhiMzcxMjUvKSkgLSBbZ2Vub21pY3NdKGRvY3MvZ2Vub21pY3MubWQpICAKCioqRmV3LVNob3QgYW5kIFplcm8tU2hvdCBMZWFybmluZzoqKiBQb2ludHMgdG8gbGVhcm5pbmcgcGFyYWRpZ21zIHRoYXQgYWltIHRvIHJlZHVjZSB0aGUgZGVwZW5kZW5jeSBvbiBsYXJnZSBsYWJlbGVkIGRhdGFzZXRzIGZvciB0cmFpbmluZyBtb2RlbHMuICAKCioqRmVkZXJhdGVkIExlYXJuaW5nOioqIEZvY3VzZXMgb24gcHJpdmFjeS1wcmVzZXJ2aW5nIHRlY2huaXF1ZXMgdGhhdCBlbmFibGUgbW9kZWwgdHJhaW5pbmcgYWNyb3NzIG11bHRpcGxlIGRlY2VudHJhbGl6ZWQgZGV2aWNlcyBvciBzZXJ2ZXJzIGhvbGRpbmcgbG9jYWwgZGF0YSBzYW1wbGVzLiAgCiAKKipUcmFuc2Zvcm1lcnMgaW4gVmlzaW9uIGFuZCBCZXlvbmQ6KiogRGlzY3Vzc2VzIHRoZSBhcHBsaWNhdGlvbiBvZiB0cmFuc2Zvcm1lciBtb2RlbHMsIG9yaWdpbmFsbHkgZGVzaWduZWQgZm9yIE5MUCB0YXNrcywgaW4gb3RoZXIgZG9tYWlucyBsaWtlIHZpc2lvbiBhbmQgYXVkaW8gcHJvY2Vzc2luZy4gIAoKKipSZWluZm9yY2VtZW50IExlYXJuaW5nIEVuaGFuY2VtZW50czoqKiBMb29rcyBhdCBhZHZhbmNlbWVudHMgaW4gUkwgdGVjaG5pcXVlcyB0aGF0IGltcHJvdmUgZWZmaWNpZW5jeSBhbmQgYXBwbGljYWJpbGl0eSBpbiB2YXJpb3VzIGRlY2lzaW9uLW1ha2luZyBjb250ZXh0cy4gICAKCioqTUxPcHMgYW5kIEF1dG9NTDoqKiBDb25jZW50cmF0ZXMgb24gdGhlIG9wZXJhdGlvbmFsaXphdGlvbiBvZiBNTCBtb2RlbHMgYW5kIHRoZSBhdXRvbWF0aW9uIG9mIHRoZSBNTCBwaXBlbGluZSB0byBzdHJlYW1saW5lIGRldmVsb3BtZW50IGFuZCBkZXBsb3ltZW50IHByb2Nlc3Nlcy4gIAoKKipIeWJyaWQgTW9kZWxzOioqIEV4cGxvcmVzIHRoZSBpbnRlZ3JhdGlvbiBvZiBkaWZmZXJlbnQgbW9kZWwgdHlwZXMgb3IgQUkgYXBwcm9hY2hlcyB0byBsZXZlcmFnZSB0aGVpciByZXNwZWN0aXZlIHN0cmVuZ3RocyBpbiBzb2x2aW5nIGNvbXBsZXggcHJvYmxlbXMuICAKCioqQUkgRXRoaWNzIGFuZCBCaWFzIE1pdGlnYXRpb246KiogVW5kZXJsaW5lcyB0aGUgaW1wb3J0YW5jZSBvZiBkZXZlbG9waW5nIGZhaXIgYW5kIGV0aGljYWwgQUkgc3lzdGVtcyBieSBhZGRyZXNzaW5nIGFuZCBtaXRpZ2F0aW5nIGJpYXNlcyBpbiBNTCBtb2RlbHMuICAKCioqRW5lcmd5LUVmZmljaWVudCBNTDoqKiBSZWZsZWN0cyB0aGUgZ3Jvd2luZyBjb25jZXJuIGFuZCBuZWVkIGZvciBlbnZpcm9ubWVudGFsbHkgc3VzdGFpbmFibGUgQUkgYnkgZGV2ZWxvcGluZyBtb2RlbHMgdGhhdCByZXF1aXJlIGxlc3MgY29tcHV0YXRpb25hbCBwb3dlciBhbmQgZW5lcmd5LiAKCioqSGFyZHdhcmU6KiogUG9pbnRzIHRvIHRoZSBpbXBvcnRhbmNlIG9mIGRldmVsb3BpbmcgYW5kIHV0aWxpemluZyBoYXJkd2FyZSBvcHRpbWl6ZWQgZm9yIE1MIHRhc2tzIHRvIGltcHJvdmUgZWZmaWNpZW5jeSBhbmQgcGVyZm9ybWFuY2UuICAKCgoKCgoKCgoKCg==
+ readmeEtag: '"7aa42daf2cfdbb62971946c4b204d09cbf989618"'
+ readmeLastModified: Sun, 06 Oct 2024 22:04:11 GMT
repositoryId: 747875001
description: >-
The landscape of machine learning (ML) is constantly evolving with new
techniques, tools, and frameworks emerging at a rapid pace.
created: '2024-01-24T20:13:28Z'
- updated: '2024-10-06T02:29:11Z'
+ updated: '2024-10-06T22:04:14Z'
language: Python
archived: false
stars: 2
@@ -23427,8 +23429,8 @@
forks: 0
owner: ankumar
logo: https://avatars.githubusercontent.com/u/658791?v=4
- repoEtag: '"7a8e41e470b4c894f23712fd13ae3f634a1a19c911c49e038e91a3d3c348c8dd"'
- repoLastModified: Sun, 06 Oct 2024 02:29:11 GMT
+ repoEtag: '"2b0f007eea0e60f79837f40d8e801dd845a4f1a60d60fc8212d83a052ad2ffd3"'
+ repoLastModified: Sun, 06 Oct 2024 22:04:14 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -24033,6 +24035,7 @@
repoEtag: '"e518e5c110d6786452e6df4bc03557b640a7f23f2f1feb218dc8afc7cbf1601d"'
repoLastModified: Tue, 01 Oct 2024 08:59:12 GMT
category: Parsers
+ foundInMaster: true
- source: openapi3 tags
repository: https://github.com/api-stuff/spectral-spelling-grammar
v3: true
@@ -24164,7 +24167,7 @@
owner: sky0621
logo: https://avatars.githubusercontent.com/u/15807041?v=4
license: MIT
- repoEtag: '"2dc04b7fec84e7c4f50f7e4302fb7390b9a218a04db823b13325af8737087416"'
+ repoEtag: '"6448d8022e53b1bf61f8e5d71b58eeb044431ec956dce5e69e2519b711fb0eb4"'
repoLastModified: Tue, 07 May 2024 08:02:17 GMT
category: Code Generators
foundInMaster: true
@@ -24329,15 +24332,15 @@
id: 8c7c34b973e448a59fbc3042c39cbc07
repositoryMetadata:
base64Readme: >-
- PHAgYWxpZ249ImNlbnRlciI+CiAgICA8aW1nIHNyYz1odHRwczovL2ltZy5mcmVlZmlzaC5sb3ZlL2xvZ28ucG5nIHdpZHRoPTE4OC8+CjwvcD4KPGgxIGFsaWduPSJjZW50ZXIiPuWSuOmxvC1BUEkg5o6l5Y+j5byA5pS+5bmz5Y+wPC9oMT4KPHAgYWxpZ249ImNlbnRlciI+PHN0cm9uZz7lkrjpsbwtQVBJIOaOpeWPo+W8gOaUvuW5s+WPsOaYr+S4gOS4quS4uueUqOaIt+WSjOW8gOWPkeiAheaPkOS+m+WFqOmdokFQSeaOpeWPo+iwg+eUqOacjeWKoeeahOW5s+WPsCDwn5ugPC9zdHJvbmc+PC9wPgo8ZGl2IGFsaWduPSJjZW50ZXIiPgo8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3doaWNoMDExMy9hcGktYmFja2VuZCI+CiAgICA8aW1nIGFsdD0iIiBzcmM9Imh0dHBzOi8vZ2l0aHViLmNvbS93aGljaDAxMTMvYXBpLWJhY2tlbmQvYmFkZ2Uvc3Rhci5zdmc/dGhlbWU9Z3ZwIi8+CjwvYT4KICAgIDxpbWcgYWx0PSJNYXZlbiIgc3JjPSJodHRwczovL3Jhc3Rlci5zaGllbGRzLmlvL2JhZGdlL01hdmVuLTMuOC4xLXJlZC5zdmciLz4KPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHBzOi8vd3d3Lm9yYWNsZS5jb20vdGVjaG5ldHdvcmsvamF2YS9qYXZhc2UvZG93bmxvYWRzL2luZGV4Lmh0bWwiPgogICAgICAgIDxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9KREstMS44Ky1ncmVlbi5zdmciLz4KPC9hPgogICAgPGltZyBhbHQ9IlNwcmluZ0Jvb3QiIHNyYz0iaHR0cHM6Ly9yYXN0ZXIuc2hpZWxkcy5pby9iYWRnZS9TcHJpbmdCb290LTIuNystZ3JlZW4uc3ZnIi8+CjwvZGl2PgoKIyMg6aG555uu5LuL57uNCgrwn5iAIOS9nOS4uueUqOaIt+aCqOWPr+S7pemAmui/h+azqOWGjOeZu+W9lei0puaIt++8jOiOt+WPluaOpeWPo+iwg+eUqOadg+mZkO+8jOW5tuagueaNruiHquW3seeahOmcgOaxgua1j+iniOWSjOmAieaLqemAguWQiOeahOaOpeWPo+OAguaCqOWPr+S7peWcqOe6v+i/m+ihjOaOpeWPo+iwg+ivle+8jOW/q+mAn+mqjOivgeaOpeWPo+eahOWKn+iDveWSjOaViOaenOOAggoK8J+SuyDkvZzkuLrlvIDlj5HogIXvvIzmiJHku6zmj5DkvpvkuoZb5ZK46bG8LUFQSSBTREtdKGh0dHBzOi8vZ2l0aHViLmNvbS93aGljaDAxMTMvYXBpLXNkaynvvIwK6YCa6L+HW+W8gOWPkeiAheWHreivgV0oaHR0cHM6Ly93d3cuZnJlZWZpc2gubG92ZS9hY2NvdW50L2NlbnRlcinljbPlj6/lsIbovbvmnb7pm4bmiJDmjqXlj6PliLDmgqjnmoTpobnnm67kuK3vvIzlrp7njrDmm7Tpq5jmlYjnmoTlvIDlj5HlkozosIPnlKjjgIIKCvCfpJ0g5oKo5Y+v5Lul5bCG6Ieq5bex55qE5o6l5Y+j5o6l5YWl5YiwICoqX+WSuOmxvC1BUElfKiog5o6l5Y+j5byA5pS+5bmz5Y+w5bmz5Y+w5LiK77yM5bm25Y+R5biD57uZ5YW25LuW55So5oi35L2/55So44CCCuaCqOWPr+S7peeuoeeQhuWSjOWQhOS4quaOpeWPo++8jOS7peS+v+abtOWlveWcsOWIhuaekOWSjOS8mOWMluaOpeWPo+aAp+iDveOAggoK8J+UjiDmgqjlj6rpnIDopoHlr7zlhaXmnIDljp/lp4vnmoTmlbDmja7pm4bvvIzovpPlhaXpnIDopoHliIbmnpDnmoTnm67moIfvvIzlsLHog73liKnnlKhbQUnmmbrog73nlJ/miJBdKGh0dHBzOi8vd3d3LmZyZWVmaXNoLmxvdmUvYW5hbHlzZSkK5LiA5Liq5Y+v5LiL6L2955qE5pWw5o2u5YiG5p6Q5Zu+6KGo5ZKM5YiG5p6Q57uT6K6644CCCgrwn4+BIOaXoOiuuuaCqOaYr+eUqOaIt+i/mOaYr+W8gOWPkeiAhe+8jCoqX+WSuOmxvC1BUElfKioK5ZK46bG8LUFQSSDmjqXlj6PlvIDmlL7lubPlj7Dpg73oh7Tlipvkuo7mj5DkvpvnqLPlrprjgIHlronlhajjgIHpq5jmlYjnmoTmjqXlj6PosIPnlKjlkozmlbDmja7liIbmnpDmnI3liqHvvIzluK7liqnmgqjlrp7njrDmm7Tpq5jmlYjjgIHkvr/mjbfljJbnmoTlvIDlj5HlkozosIPnlKjkvZPpqozjgIIKCiMjIOe9keermeWvvOiIqgoKLSBb6aG555uu5Zyo57q/5ryU56S65Zyw5Z2AIPCflJddKGh0dHBzOi8vd3d3LmZyZWVmaXNoLmxvdmUpCi0g5ryU56S66LSm5Y+377yaZGVtbwotIOWvhuegge+8mjEyMzQ1Njc4Ci0gW+mhueebruWJjeerr+WcsOWdgCDwn5SXXShodHRwczovL2dpdGh1Yi5jb20vd2hpY2gwMTEzL2FwaS1mcm9udGVuZCkKLSBb6aG555uu5ZCO56uv5Zyw5Z2AIPCflJddKGh0dHBzOi8vZ2l0aHViLmNvbS93aGljaDAxMTMvZnJlZWZpc2gtYXBpKQoKIyMg5L2/55So5oyH5a+8CgojIyMg5YWL6ZqG6aG555uu5Yiw5pys5ZywCgpgYGBiYXNoCmdpdCBjbG9uZSBnaXRAZ2l0aHViLmNvbTp3aGljaDAxMTMvYXBpLWZyb250ZW5kLmdpdApgYGAKCiMjIyDov5DooYzliY3nq68KCuehruS/nSBub2RlID49IDE477yM5p+l55yLIG5vZGUg54mI5pysCgpgYGBiYXNoCm5vZGUgLXYKYGBgCgojIyMjIOWuieijheS+nei1lgoKYGBgYmFzaApucG0gaW5zdGFsbApgYGAKCiMjIyMg5ZCv5YqoCgpgYGBiYXNoCm5wbSBydW4gZGV2CmBgYAoKIyMjIyDlhbbku5YKCi0gW3JlcXVlc3RDb25maWcudHNdKHNyYyUyRnJlcXVlc3RDb25maWcudHMpIOaWh+S7tuWPr+S/ruaUueWvueaOpeWQjuerr+acjeWKoeWZqOaOpeWPo+eahOWcsOWdgO+8jOm7mOiupO+8mmh0dHA6Ly9sb2NhbGhvc3Q6OTAwMQotIFtpbmRleC50c3hdKHNyYyUyRnBhZ2VzJTJGTXlDaGFydCUyRmluZGV4LnRzeCkg5Y+v5L+u5pS5IFdlYlNvY2tldCDoh6rlrprkuYnov57mjqXlnLDlnYDvvIzpu5jorqTvvJp3czovL2xvY2FsaG9zdDo5MDAxL2FwaS93cy8KCiMjIyMg6YOo572y5YmN56uvCgrmlrnms5XkuIDvvJrnlJ/miJAgZGlzdCDmlofku7bpg6jnvbIKCmBgYGJhc2gKbnBtIHJ1biBidWlsZApgYGAKCuaWueazleS6jO+8muS9v+eUqCBkb2NrZXIg5a655Zmo6YOo572yCgrmnoTlu7rvvJoKCmBgYGJhc2gKZG9ja2VyIGJ1aWxkIC10IGZyZWVmaXNoLWFwaS1mcm9udGVuZDp2MC4wLjEgLgpgYGAKCui/kOihjO+8mgoKYGBgYmFzaApkb2NrZXIgcnVuIC1wIDgwOjgwIC1kIGZyZWVmaXNoLWFwaS1mcm9udGVuZDp2MC4wLjEKYGBgCgojIyDpobnnm67lsZXnpLoKCiMjIyDpppbpobUKCiFbaG9tZS5wbmddKGRvYyUyRmhvbWUucG5nKQoKIyMjIOaOpeWPo+W5v+WcugoKIyMjIyDmjqXlj6PlsZXnpLoKCiFbYXBpLWRpc3BsYXkucG5nXShkb2MlMkZhcGktZGlzcGxheS5wbmcpCgojIyMjIOaOpeWPo+ivpuaDhQoKIVthcGktZGV0YWlscy5wbmddKGRvYyUyRmFwaS1kZXRhaWxzLnBuZykKCiMjIyMjIEFQSeaWh+ahowoKIVthcGktZG9jLnBuZ10oZG9jJTJGYXBpLWRvYy5wbmcpCgojIyMjIyDplJnor6/noIEKCiFbZXJyb3ItY29kZXMucG5nXShkb2MlMkZlcnJvci1jb2Rlcy5wbmcpCgojIyMjIyDnpLrkvovku6PnoIEKCiFbc2FtcGxlLWNvZGUucG5nXShkb2MlMkZzYW1wbGUtY29kZS5wbmcpCgojIyMjIyDlnKjnur/osIPor5UKCiFbb25saW5lLWNvbW1pc3Npb25pbmcucG5nXShkb2MlMkZvbmxpbmUtY29tbWlzc2lvbmluZy5wbmcpCgojIyMg5pm66IO95YiG5p6QCgohW2ludGVsbGlnZW50LWFuYWx5dGljcy5wbmddKGRvYyUyRmludGVsbGlnZW50LWFuYWx5dGljcy5wbmcpCgojIyMg5oiR55qE5Zu+6KGoCgojIyMjIOWbvuihqOWxleekugoKIVtjaGFydC1kaXNwbGF5LnBuZ10oZG9jJTJGY2hhcnQtZGlzcGxheS5wbmcpCgojIyMjIOWbvuihqOS4i+i9vQoKIVtjaGFydC1kb3dubG9hZC5wbmddKGRvYyUyRmNoYXJ0LWRvd25sb2FkLnBuZykKCiMjIyDnlKjmiLflip/og70KCiMjIyMg55m75b2VCgohW2xvZ2luLnBuZ10oZG9jJTJGbG9naW4ucG5nKQoKIyMjIyDms6jlhowKCiFbcmVnaXN0ZXIucG5nXShkb2MlMkZyZWdpc3Rlci5wbmcpCgojIyMjIOS4quS6uuS4reW/gwoKIVtwZXJzb25hbC1jZW50ZXIucG5nXShkb2MlMkZwZXJzb25hbC1jZW50ZXIucG5nKQoKIyMjIOeuoeeQhuWRmOWKn+iDvQoKIyMjIyDmjqXlj6PnrqHnkIYKCiFbaW50ZXJmYWNlLW1hbmFnZW1lbnQucG5nXShkb2MlMkZpbnRlcmZhY2UtbWFuYWdlbWVudC5wbmcpCgojIyMjIOWbvuihqOeuoeeQhgoKIVtjaGFydC1tYW5hZ2VtZW50LnBuZ10oZG9jJTJGY2hhcnQtbWFuYWdlbWVudC5wbmcpCgojIyMjIOeUqOaIt+euoeeQhgoKIVt1c2VyLW1hbmFnZW1lbnQucG5nXShkb2MlMkZ1c2VyLW1hbmFnZW1lbnQucG5nKQoKIyMg5oqA5pyv5qCICgotIFJlYWN0IDE4Ci0gQW50IERlc2lnbiBQcm8gNS54IOiEmuaJi+aetgotIEFudCBEZXNpZ24gJiBQcm9jb21wb25lbnRzIOe7hOS7tuW6kwotIFVtaSA0IOWJjeerr+ahhuaetgotIE9wZW5BUEkg5YmN56uv5Luj56CB55Sf5oiQCg==
- readmeEtag: '"22f230b4d6449e49f8db75980d5acbe939929921"'
- readmeLastModified: Mon, 24 Jun 2024 09:45:26 GMT
+ PHAgYWxpZ249ImNlbnRlciI+CiAgICA8aW1nIHNyYz1kb2MvbG9nby5wbmcgd2lkdGg9MTg4Lz4KPC9wPgo8aDEgYWxpZ249ImNlbnRlciI+5ZK46bG8LUFQSSDmjqXlj6PlvIDmlL7lubPlj7A8L2gxPgo8cCBhbGlnbj0iY2VudGVyIj48c3Ryb25nPuWSuOmxvC1BUEkg5o6l5Y+j5byA5pS+5bmz5Y+w5piv5LiA5Liq5Li655So5oi35ZKM5byA5Y+R6ICF5o+Q5L6b5YWo6Z2iQVBJ5o6l5Y+j6LCD55So5pyN5Yqh55qE5bmz5Y+wIPCfm6A8L3N0cm9uZz48L3A+CjxkaXYgYWxpZ249ImNlbnRlciI+CjxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vd2hpY2gwMTEzL2FwaS1iYWNrZW5kIj4KICAgIDxpbWcgYWx0PSIiIHNyYz0iaHR0cHM6Ly9naXRodWIuY29tL3doaWNoMDExMy9hcGktYmFja2VuZC9iYWRnZS9zdGFyLnN2Zz90aGVtZT1ndnAiLz4KPC9hPgogICAgPGltZyBhbHQ9Ik1hdmVuIiBzcmM9Imh0dHBzOi8vcmFzdGVyLnNoaWVsZHMuaW8vYmFkZ2UvTWF2ZW4tMy44LjEtcmVkLnN2ZyIvPgo8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cHM6Ly93d3cub3JhY2xlLmNvbS90ZWNobmV0d29yay9qYXZhL2phdmFzZS9kb3dubG9hZHMvaW5kZXguaHRtbCI+CiAgICAgICAgPGltZyBhbHQ9IiIgc3JjPSJodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL0pESy0xLjgrLWdyZWVuLnN2ZyIvPgo8L2E+CiAgICA8aW1nIGFsdD0iU3ByaW5nQm9vdCIgc3JjPSJodHRwczovL3Jhc3Rlci5zaGllbGRzLmlvL2JhZGdlL1NwcmluZ0Jvb3QtMi43Ky1ncmVlbi5zdmciLz4KPC9kaXY+CgojIyDpobnnm67ku4vnu40KCvCfmIAg5L2c5Li655So5oi35oKo5Y+v5Lul6YCa6L+H5rOo5YaM55m75b2V6LSm5oi377yM6I635Y+W5o6l5Y+j6LCD55So5p2D6ZmQ77yM5bm25qC55o2u6Ieq5bex55qE6ZyA5rGC5rWP6KeI5ZKM6YCJ5oup6YCC5ZCI55qE5o6l5Y+j44CC5oKo5Y+v5Lul5Zyo57q/6L+b6KGM5o6l5Y+j6LCD6K+V77yM5b+r6YCf6aqM6K+B5o6l5Y+j55qE5Yqf6IO95ZKM5pWI5p6c44CCCgrwn5K7IOS9nOS4uuW8gOWPkeiAhe+8jOaIkeS7rOaPkOS+m+S6hlvlkrjpsbwtQVBJIFNES10oaHR0cHM6Ly9naXRodWIuY29tL3doaWNoMDExMy9hcGktc2RrKe+8jArpgJrov4db5byA5Y+R6ICF5Yet6K+BXShodHRwczovL3d3dy5mcmVlZmlzaC5sb3ZlL2FjY291bnQvY2VudGVyKeWNs+WPr+Wwhui9u+advumbhuaIkOaOpeWPo+WIsOaCqOeahOmhueebruS4re+8jOWunueOsOabtOmrmOaViOeahOW8gOWPkeWSjOiwg+eUqOOAggoK8J+knSDmgqjlj6/ku6XlsIboh6rlt7HnmoTmjqXlj6PmjqXlhaXliLAgKipf5ZK46bG8LUFQSV8qKiDmjqXlj6PlvIDmlL7lubPlj7DlubPlj7DkuIrvvIzlubblj5HluIPnu5nlhbbku5bnlKjmiLfkvb/nlKjjgIIK5oKo5Y+v5Lul566h55CG5ZKM5ZCE5Liq5o6l5Y+j77yM5Lul5L6/5pu05aW95Zyw5YiG5p6Q5ZKM5LyY5YyW5o6l5Y+j5oCn6IO944CCCgrwn5SOIOaCqOWPqumcgOimgeWvvOWFpeacgOWOn+Wni+eahOaVsOaNrumbhu+8jOi+k+WFpemcgOimgeWIhuaekOeahOebruagh++8jOWwseiDveWIqeeUqFtBSeaZuuiDveeUn+aIkF0oaHR0cHM6Ly93d3cuZnJlZWZpc2gubG92ZS9hbmFseXNlKQrkuIDkuKrlj6/kuIvovb3nmoTmlbDmja7liIbmnpDlm77ooajlkozliIbmnpDnu5PorrrjgIIKCvCfj4Eg5peg6K665oKo5piv55So5oi36L+Y5piv5byA5Y+R6ICF77yMKipf5ZK46bG8LUFQSV8qKgrlkrjpsbwtQVBJIOaOpeWPo+W8gOaUvuW5s+WPsOmDveiHtOWKm+S6juaPkOS+m+eos+WumuOAgeWuieWFqOOAgemrmOaViOeahOaOpeWPo+iwg+eUqOWSjOaVsOaNruWIhuaekOacjeWKoe+8jOW4ruWKqeaCqOWunueOsOabtOmrmOaViOOAgeS+v+aNt+WMlueahOW8gOWPkeWSjOiwg+eUqOS9k+mqjOOAggoKIyMg572R56uZ5a+86IiqCgotIFvpobnnm67lnKjnur/mvJTnpLrlnLDlnYAg8J+Ul10oaHR0cHM6Ly93d3cuZnJlZWZpc2gubG92ZSkKLSDmvJTnpLrotKblj7fvvJpkZW1vCi0g5a+G56CB77yaMTIzNDU2NzgKLSBb6aG555uu5YmN56uv5Zyw5Z2AIPCflJddKGh0dHBzOi8vZ2l0aHViLmNvbS93aGljaDAxMTMvYXBpLWZyb250ZW5kKQotIFvpobnnm67lkI7nq6/lnLDlnYAg8J+Ul10oaHR0cHM6Ly9naXRodWIuY29tL3doaWNoMDExMy9mcmVlZmlzaC1hcGkpCgojIyDkvb/nlKjmjIflr7wKCiMjIyDlhYvpmobpobnnm67liLDmnKzlnLAKCmBgYGJhc2gKZ2l0IGNsb25lIGdpdEBnaXRodWIuY29tOndoaWNoMDExMy9hcGktZnJvbnRlbmQuZ2l0CmBgYAoKIyMjIOi/kOihjOWJjeerrwoK56Gu5L+dIG5vZGUgPj0gMTjvvIzmn6XnnIsgbm9kZSDniYjmnKwKCmBgYGJhc2gKbm9kZSAtdgpgYGAKCiMjIyMg5a6J6KOF5L6d6LWWCgpgYGBiYXNoCm5wbSBpbnN0YWxsCmBgYAoKIyMjIyDlkK/liqgKCmBgYGJhc2gKbnBtIHJ1biBkZXYKYGBgCgojIyMjIOWFtuS7lgoKLSBbcmVxdWVzdENvbmZpZy50c10oc3JjJTJGcmVxdWVzdENvbmZpZy50cykg5paH5Lu25Y+v5L+u5pS55a+55o6l5ZCO56uv5pyN5Yqh5Zmo5o6l5Y+j55qE5Zyw5Z2A77yM6buY6K6k77yaaHR0cDovL2xvY2FsaG9zdDo5MDAxCi0gW2luZGV4LnRzeF0oc3JjJTJGcGFnZXMlMkZNeUNoYXJ0JTJGaW5kZXgudHN4KSDlj6/kv67mlLkgV2ViU29ja2V0IOiHquWumuS5iei/nuaOpeWcsOWdgO+8jOm7mOiupO+8mndzOi8vbG9jYWxob3N0OjkwMDEvYXBpL3dzLwoKIyMjIyDpg6jnvbLliY3nq68KCuaWueazleS4gO+8mueUn+aIkCBkaXN0IOaWh+S7tumDqOe9sgoKYGBgYmFzaApucG0gcnVuIGJ1aWxkCmBgYAoK5pa55rOV5LqM77ya5L2/55SoIGRvY2tlciDlrrnlmajpg6jnvbIKCuaehOW7uu+8mgoKYGBgYmFzaApkb2NrZXIgYnVpbGQgLXQgZnJlZWZpc2gtYXBpLWZyb250ZW5kOnYwLjAuMSAuCmBgYAoK6L+Q6KGM77yaCgpgYGBiYXNoCmRvY2tlciBydW4gLXAgODA6ODAgLWQgZnJlZWZpc2gtYXBpLWZyb250ZW5kOnYwLjAuMQpgYGAKCiMjIOmhueebruWxleekugoKIyMjIOmmlumhtQoKIVtob21lLnBuZ10oZG9jJTJGaG9tZS5wbmcpCgojIyMg5o6l5Y+j5bm/5Zy6CgojIyMjIOaOpeWPo+WxleekugoKIVthcGktZGlzcGxheS5wbmddKGRvYyUyRmFwaS1kaXNwbGF5LnBuZykKCiMjIyMg5o6l5Y+j6K+m5oOFCgohW2FwaS1kZXRhaWxzLnBuZ10oZG9jJTJGYXBpLWRldGFpbHMucG5nKQoKIyMjIyMgQVBJ5paH5qGjCgohW2FwaS1kb2MucG5nXShkb2MlMkZhcGktZG9jLnBuZykKCiMjIyMjIOmUmeivr+eggQoKIVtlcnJvci1jb2Rlcy5wbmddKGRvYyUyRmVycm9yLWNvZGVzLnBuZykKCiMjIyMjIOekuuS+i+S7o+eggQoKIVtzYW1wbGUtY29kZS5wbmddKGRvYyUyRnNhbXBsZS1jb2RlLnBuZykKCiMjIyMjIOWcqOe6v+iwg+ivlQoKIVtvbmxpbmUtY29tbWlzc2lvbmluZy5wbmddKGRvYyUyRm9ubGluZS1jb21taXNzaW9uaW5nLnBuZykKCiMjIyDmmbrog73liIbmnpAKCiFbaW50ZWxsaWdlbnQtYW5hbHl0aWNzLnBuZ10oZG9jJTJGaW50ZWxsaWdlbnQtYW5hbHl0aWNzLnBuZykKCiMjIyDmiJHnmoTlm77ooagKCiMjIyMg5Zu+6KGo5bGV56S6CgohW2NoYXJ0LWRpc3BsYXkucG5nXShkb2MlMkZjaGFydC1kaXNwbGF5LnBuZykKCiMjIyMg5Zu+6KGo5LiL6L29CgohW2NoYXJ0LWRvd25sb2FkLnBuZ10oZG9jJTJGY2hhcnQtZG93bmxvYWQucG5nKQoKIyMjIOeUqOaIt+WKn+iDvQoKIyMjIyDnmbvlvZUKCiFbbG9naW4ucG5nXShkb2MlMkZsb2dpbi5wbmcpCgojIyMjIOazqOWGjAoKIVtyZWdpc3Rlci5wbmddKGRvYyUyRnJlZ2lzdGVyLnBuZykKCiMjIyMg5Liq5Lq65Lit5b+DCgohW3BlcnNvbmFsLWNlbnRlci5wbmddKGRvYyUyRnBlcnNvbmFsLWNlbnRlci5wbmcpCgojIyMg566h55CG5ZGY5Yqf6IO9CgojIyMjIOaOpeWPo+euoeeQhgoKIVtpbnRlcmZhY2UtbWFuYWdlbWVudC5wbmddKGRvYyUyRmludGVyZmFjZS1tYW5hZ2VtZW50LnBuZykKCiMjIyMg5Zu+6KGo566h55CGCgohW2NoYXJ0LW1hbmFnZW1lbnQucG5nXShkb2MlMkZjaGFydC1tYW5hZ2VtZW50LnBuZykKCiMjIyMg55So5oi3566h55CGCgohW3VzZXItbWFuYWdlbWVudC5wbmddKGRvYyUyRnVzZXItbWFuYWdlbWVudC5wbmcpCgojIyDmioDmnK/moIgKCi0gUmVhY3QgMTgKLSBBbnQgRGVzaWduIFBybyA1Lngg6ISa5omL5p62Ci0gQW50IERlc2lnbiAmIFByb2NvbXBvbmVudHMg57uE5Lu25bqTCi0gVW1pIDQg5YmN56uv5qGG5p62Ci0gT3BlbkFQSSDliY3nq6/ku6PnoIHnlJ/miJAK
+ readmeEtag: '"a84070c88e22d9a6dee11cea21f247ef9622823c"'
+ readmeLastModified: Sun, 06 Oct 2024 14:18:51 GMT
repositoryId: 736579965
description: >-
本项目基于 React + Spring Boot + Dubbo + AIGC,致力于为用户和开发者提供全面 API 接口调用和 AI
数据分析服务。
created: '2023-12-28T09:39:19Z'
- updated: '2024-06-24T09:45:42Z'
+ updated: '2024-10-06T14:18:59Z'
language: TypeScript
archived: false
stars: 2
@@ -24345,8 +24348,8 @@
forks: 0
owner: which0113
logo: https://avatars.githubusercontent.com/u/119718783?v=4
- repoEtag: '"45090baf8b7e28e956e161572d84465344083375f9f901e48334f1d18f0fa6b5"'
- repoLastModified: Mon, 24 Jun 2024 09:45:42 GMT
+ repoEtag: '"d6a534c4e441f22473d6812e468611fda0404d378b4d6e3256fab0325903efba"'
+ repoLastModified: Sun, 06 Oct 2024 14:18:59 GMT
category: Testing
foundInMaster: true
- source: openapi3 tags
@@ -24911,7 +24914,7 @@
owner: protung
logo: https://avatars.githubusercontent.com/u/81255167?v=4
license: MIT
- repoEtag: '"f3b2cf3c2255a7e8fc28a7517d0498d473fd834b0492d1b18958f8dd8f573682"'
+ repoEtag: '"f24116284a7de53a9540a84be476caeffd5a1450c3133f35b6f364c1ab98f8ca"'
repoLastModified: Sat, 28 Sep 2024 14:25:45 GMT
category:
- Server
@@ -26531,7 +26534,7 @@
repositoryId: 729817092
description: Java parser of the OpenAPI workflow (Arazzo) specification
created: '2023-12-10T13:02:41Z'
- updated: '2024-09-25T20:11:37Z'
+ updated: '2024-10-06T16:57:17Z'
language: Java
archived: false
stars: 1
@@ -26540,8 +26543,8 @@
owner: API-Flows
logo: https://avatars.githubusercontent.com/u/153562650?v=4
license: Apache-2.0
- repoEtag: '"1f8c940b9652331c5ca8d59292d1d063c37a259bca67f340e7dd39a520843170"'
- repoLastModified: Wed, 25 Sep 2024 20:11:37 GMT
+ repoEtag: '"c578c6804c5797a6ec6de95b87616906671d9a25b14d8063c24ceaefd85987dd"'
+ repoLastModified: Sun, 06 Oct 2024 16:57:17 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -28159,6 +28162,7 @@
repoEtag: '"0d11ec07f0873d9855bca02bbf79f22e4510cc357ca8396decb8772a7163bb9f"'
repoLastModified: Wed, 02 Oct 2024 19:38:43 GMT
category: Server Implementations
+ foundInMaster: true
- source: openapi3 tags
repository: https://github.com/uttesh/exude-api
v3: true
@@ -28587,7 +28591,7 @@
[BugStalker] OpenAPI 3 specification and generation tool for bs-business
and bs-web-client projects
created: '2022-05-15T19:59:13Z'
- updated: '2024-07-28T11:54:23Z'
+ updated: '2024-10-06T13:20:46Z'
language: YAML
archived: false
stars: 1
@@ -28595,8 +28599,8 @@
forks: 0
owner: Kaliszando
logo: https://avatars.githubusercontent.com/u/45283134?v=4
- repoEtag: '"29e2c2ec8498a308ba9bc3a9c493d15f35626956cf929bdf337d9863d842d874"'
- repoLastModified: Sun, 28 Jul 2024 11:54:23 GMT
+ repoEtag: '"a8a852ff1e8a5d88bf71f94b84e03f56285768a92871f8a970ea8a0e59377106"'
+ repoLastModified: Sun, 06 Oct 2024 13:20:46 GMT
foundInMaster: true
category: Server Implementations
- source: openapi3 tags
@@ -28666,7 +28670,7 @@
Generate mock responses based on your OpenAPI specification. No
dependencies. Lightweight, fast, simple.
created: '2023-10-27T07:58:04Z'
- updated: '2024-09-01T08:19:17Z'
+ updated: '2024-10-06T14:30:26Z'
language: Java
archived: false
stars: 1
@@ -28675,8 +28679,8 @@
owner: gcatanese
logo: https://avatars.githubusercontent.com/u/1771700?v=4
license: Apache-2.0
- repoEtag: '"aa89d9d5a17c3e3a6b76df1c1d21a93f9aa19187acb3b51089ba308cc9544869"'
- repoLastModified: Sun, 01 Sep 2024 08:19:17 GMT
+ repoEtag: '"b323b5224e47fcde3279e522ea422fdcd586f79007505866074ee9c628956ec2"'
+ repoLastModified: Sun, 06 Oct 2024 14:30:26 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -29740,7 +29744,7 @@
repositoryId: 736327040
description: 'Visualize OpenAPI (Arazzo) workflows '
created: '2023-12-27T15:51:24Z'
- updated: '2024-10-05T17:07:09Z'
+ updated: '2024-10-06T16:45:05Z'
language: Java
archived: false
stars: 1
@@ -29749,8 +29753,8 @@
owner: API-Flows
logo: https://avatars.githubusercontent.com/u/153562650?v=4
license: Apache-2.0
- repoEtag: '"35adb309b5876b5df34b41ed2f21ac1b325a719ea93478754480537e55429d07"'
- repoLastModified: Sat, 05 Oct 2024 17:07:09 GMT
+ repoEtag: '"9d3ce73dd75ce75b7367a4018aafde9c8a8063857f30b811609ef7a9dd4980e2"'
+ repoLastModified: Sun, 06 Oct 2024 16:45:05 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -29979,11 +29983,11 @@
archived: false
stars: 1
watchers: 7
- forks: 6
+ forks: 7
owner: traefik
logo: https://avatars.githubusercontent.com/u/14280338?v=4
license: Apache-2.0
- repoEtag: '"900f4254b05f6fab4bdc79f39a54ff7aa66bb7f01542a9cdf228318a084c67d1"'
+ repoEtag: '"be098a6c2ed68073bada6cb35232dbf6f1e736857e72724048dd4c03a00097cc"'
repoLastModified: Fri, 27 Sep 2024 10:01:01 GMT
category: Server Implementations
foundInMaster: true
@@ -30894,6 +30898,7 @@
repoEtag: '"74b730443f251a81550f9510a04f4861cfa02b64f6c972cf46ebc72a548e6d99"'
repoLastModified: Thu, 03 Oct 2024 13:58:02 GMT
category: Parsers
+ foundInMaster: true
- source: openapi3 tags
repository: https://github.com/lordent/openapi-doc
v3: true
@@ -31944,17 +31949,17 @@
Simple, Fast, Code first and Compile time generated OpenAPI documentation
for Rust
created: '2021-09-30T22:00:31Z'
- updated: '2024-10-05T14:31:59Z'
+ updated: '2024-10-06T22:40:42Z'
language: Rust
archived: false
- stars: 2245
+ stars: 2249
watchers: 9
forks: 175
owner: juhaku
logo: https://avatars.githubusercontent.com/u/26358664?v=4
license: Apache-2.0
- repoEtag: '"0d32ad8f8b821f65b4f97b5103935803a21ea8f4f7b121a32e22852394c67dad"'
- repoLastModified: Sat, 05 Oct 2024 14:31:59 GMT
+ repoEtag: '"71ca7fe6231e0f45bebdb13ab15ba687b55a55fb148a2504fd3950f08f28cb42"'
+ repoLastModified: Sun, 06 Oct 2024 22:40:42 GMT
foundInMaster: true
category: Parsers
id: 14269a89115b3be71493769fca4d995e
@@ -32025,7 +32030,7 @@
Structures and tools to parse, navigate and validate OpenAPI v3.1
specifications.
created: '2020-10-12T16:49:47Z'
- updated: '2024-09-30T03:05:55Z'
+ updated: '2024-10-07T03:00:50Z'
language: Rust
archived: false
stars: 33
@@ -32034,8 +32039,8 @@
owner: x52dev
logo: https://avatars.githubusercontent.com/u/140988044?v=4
license: MIT
- repoEtag: '"adf6909e77ee619d4e02226e63af0e1461c645495c091e6ad495fcc58bde7e53"'
- repoLastModified: Mon, 30 Sep 2024 03:05:55 GMT
+ repoEtag: '"d0a3b0d965b4a752c4250517ac867e6f5a7eb646144b9cb4cbcb4ac46f08ec3f"'
+ repoLastModified: Mon, 07 Oct 2024 03:00:50 GMT
category: Parsers
foundInMaster: true
- source: openapi31 tags
@@ -32657,17 +32662,17 @@
(TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either
in yaml or json formats. 🍺
created: '2020-02-05T08:31:50Z'
- updated: '2024-10-06T01:27:46Z'
+ updated: '2024-10-07T03:04:31Z'
language: TypeScript
archived: false
- stars: 2902
+ stars: 2907
watchers: 12
- forks: 325
+ forks: 326
owner: orval-labs
logo: https://avatars.githubusercontent.com/u/176128704?v=4
license: MIT
- repoEtag: '"404ba8f90585ae3eb3fb10a11effba137f44b4b79f7f5d0b0112f4768c3c0739"'
- repoLastModified: Sun, 06 Oct 2024 01:27:46 GMT
+ repoEtag: '"fa86e4db31dd364ae9230e13a20fa8d63f8402a2870b150a64c4fe453176be65"'
+ repoLastModified: Mon, 07 Oct 2024 03:04:31 GMT
foundInMaster: true
oldLocations:
- https://github.com/anymaniax/orval
@@ -32786,7 +32791,7 @@
owner: Sudokuru
logo: https://avatars.githubusercontent.com/u/114212382?v=4
license: GPL-3.0
- repoEtag: '"e25f1b14ad76d65d42f7209ebebcac760adb0db36666c85ad860ab792d8e99d8"'
+ repoEtag: '"e8e9df2dbe27f67af921d52f75f5695d3130148f1970fcfcd7af3891c21c28e1"'
repoLastModified: Sat, 28 Sep 2024 21:30:33 GMT
category: Server Implementations
foundInMaster: true
@@ -33388,9 +33393,9 @@
v3: true
repositoryMetadata:
base64Readme: >-
- IyBFdm9NYXN0ZXI6IEEgVG9vbCBGb3IgQXV0b21hdGljYWxseSBHZW5lcmF0aW5nIFN5c3RlbS1MZXZlbCBUZXN0IENhc2VzCgoKIVtdKGRvY3MvaW1nL2NhcmwtY2Vyc3RyYW5kLTEzNjgxMF9jb21wcmVzc2VkLmpwZyAgIlBob3RvIGJ5IENhcmwgQ2Vyc3RyYW5kIG9uIFVuc3BsYXNoIikKClshW01hdmVuIENlbnRyYWxdKGh0dHBzOi8vbWF2ZW4tYmFkZ2VzLmhlcm9rdWFwcC5jb20vbWF2ZW4tY2VudHJhbC9vcmcuZXZvbWFzdGVyL2V2b21hc3Rlci1jbGllbnQtamF2YS9iYWRnZS5zdmcpXShodHRwczovL21hdmVuLWJhZGdlcy5oZXJva3VhcHAuY29tL21hdmVuLWNlbnRyYWwvb3JnLmV2b21hc3Rlci9ldm9tYXN0ZXItY2xpZW50LWphdmEpClshW2phdmFkb2NdKGh0dHBzOi8vamF2YWRvYy5pby9iYWRnZTIvb3JnLmV2b21hc3Rlci9ldm9tYXN0ZXItY2xpZW50LWphdmEtY29udHJvbGxlci9qYXZhZG9jLnN2ZyldKGh0dHBzOi8vamF2YWRvYy5pby9kb2Mvb3JnLmV2b21hc3Rlci9ldm9tYXN0ZXItY2xpZW50LWphdmEtY29udHJvbGxlcikKIVtDSV0oaHR0cHM6Ly9naXRodWIuY29tL1dlYkZ1enppbmcvRXZvTWFzdGVyL3dvcmtmbG93cy9DSS9iYWRnZS5zdmcpClshW2NvZGVjb3ZdKGh0dHBzOi8vY29kZWNvdi5pby9naC9XZWJGdXp6aW5nL0V2b01hc3Rlci9icmFuY2gvbWFzdGVyL2dyYXBoL2JhZGdlLnN2ZyldKGh0dHBzOi8vY29kZWNvdi5pby9naC9XZWJGdXp6aW5nL0V2b01hc3RlcikKWyFbRE9JXShodHRwczovL3plbm9kby5vcmcvYmFkZ2UvOTIzODU5MzMuc3ZnKV0oaHR0cHM6Ly96ZW5vZG8ub3JnL2JhZGdlL2xhdGVzdGRvaS85MjM4NTkzMykKWyFbTGljZW5zZTogTEdQTCB2M10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9MaWNlbnNlLUxHUExfdjMtYmx1ZS5zdmcpXShodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xncGwtMy4wKQpbIVtHaXRodWIgQWxsIFJlbGVhc2VzXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9kb3dubG9hZHMvV2ViRnV6emluZy9ldm9tYXN0ZXIvdG90YWwuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL1dlYkZ1enppbmcvRXZvTWFzdGVyL3JlbGVhc2VzKQoKCiMjIyBTdW1tYXJ5CgpfRXZvTWFzdGVyXyAoW3d3dy5ldm9tYXN0ZXIub3JnXShodHRwOi8vZXZvbWFzdGVyLm9yZykpIGlzIHRoZSBmaXJzdCAoMjAxNikgb3Blbi1zb3VyY2UgQUktZHJpdmVuIHRvb2wKdGhhdCBhdXRvbWF0aWNhbGx5ICpnZW5lcmF0ZXMqIHN5c3RlbS1sZXZlbCB0ZXN0IGNhc2VzCmZvciB3ZWIvZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMuClRoaXMgaXMgcmVsYXRlZCB0byBbRnV6emluZ10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRnV6emluZykuCk5vdCBvbmx5IF9Fdm9NYXN0ZXJfIGNhbiBnZW5lcmF0ZSBpbnB1dHMgdGhhdCBmaW5kIHByb2dyYW0gY3Jhc2hlcywgYnV0IGFsc28gaXQgZ2VuZXJhdGVzIHNtYWxsIGVmZmVjdGl2ZSB0ZXN0IHN1aXRlcyAoZS5nLiwgaW4gSlVuaXQgZm9ybWF0KSB0aGF0IGNhbiBiZSB1c2VkIGZvciBfcmVncmVzc2lvbiB0ZXN0aW5nXy4KCl9Fdm9NYXN0ZXJfIGlzIGFuIEFJIGRyaXZlbiB0b29sLgpJbiBwYXJ0aWN1bGFyLCBpbnRlcm5hbGx5IGl0IHVzZXMgYW4gW0V2b2x1dGlvbmFyeSBBbGdvcml0aG1dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0V2b2x1dGlvbmFyeV9hbGdvcml0aG0pCmFuZCBbRHluYW1pYyBQcm9ncmFtIEFuYWx5c2lzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EeW5hbWljX3Byb2dyYW1fYW5hbHlzaXMpICB0byBiZQphYmxlIHRvIGdlbmVyYXRlIGVmZmVjdGl2ZSB0ZXN0IGNhc2VzLgpUaGUgYXBwcm9hY2ggaXMgdG8gKmV2b2x2ZSogdGVzdCBjYXNlcyBmcm9tIGFuIGluaXRpYWwgcG9wdWxhdGlvbiBvZgpyYW5kb20gb25lcywgdHJ5aW5nIHRvIG1heGltaXplIG1lYXN1cmVzIGxpa2UgY29kZSBjb3ZlcmFnZSBhbmQgZmF1bHQgZGV0ZWN0aW9uLgpfRXZvTWFzdGVyXyB1c2VzIHNldmVyYWwga2luZHMgb2YgQUkgaGV1cmlzdGljcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGV2ZW4gZnVydGhlciwKYnVpbGRpbmcgb24gZGVjYWRlcyBvZiByZXNlYXJjaCBpbiB0aGUgZmllbGQgb2YgW1NlYXJjaC1CYXNlZCBTb2Z0d2FyZSBUZXN0aW5nXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TZWFyY2gtYmFzZWRfc29mdHdhcmVfZW5naW5lZXJpbmcpLgoKCl9fS2V5IGZlYXR1cmVzX186CgoqIF9XZWIgQVBJc186IEF0IHRoZSBtb21lbnQsIF9Fdm9NYXN0ZXJfIGNhbiBnZW5lcmF0ZSB0ZXN0IGNhc2VzIGZvciBfX1JFU1RfXywgX19HcmFwaFFMX18gYW5kIF9fUlBDX18gKGUuZy4sIF9fZ1JQQ19fIGFuZCBfX1RocmlmdF9fKSBBUElzLgoKKiBfQmxhY2stQm94XyB0ZXN0aW5nIG1vZGU6IGNhbiBydW4gb24gYW55IEFQSSAocmVnYXJkbGVzcyBvZiBpdHMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIGUuZy4sIFB5dGhvbiBhbmQgR28pLgogIEhvd2V2ZXIsIHJlc3VsdHMgZm9yIGJsYWNrLWJveCB0ZXN0aW5nIHdpbGwgYmUgd29yc2UgdGhhbiB3aGl0ZS1ib3ggdGVzdGluZyAoZS5nLiwgZHVlIHRvIGxhY2sgb2YgY29kZSBhbmFseXNpcykuCiAgRGVmYXVsdCB0ZXN0IGNhc2Ugb3V0cHV0IGlzIGluIFB5dGhvbiwgYnV0IG90aGVyIGZvcm1hdHMgYXJlIGF2YWlsYWJsZSBhcyB3ZWxsLiAKCiogX1doaXRlLUJveF8gdGVzdGluZyBtb2RlOiBjYW4gYmUgdXNlZCBmb3IgQVBJcyBjb21waWxlZCB0bwogIEpWTSAoZS5nLiwgSmF2YSBhbmQgS290bGluKS4gX0V2b01hc3Rlcl8gYW5hbHlzZXMgdGhlIGJ5dGVjb2RlIG9mIHRoZSB0ZXN0ZWQgYXBwbGljYXRpb25zLCBhbmQgdXNlcwogIHNldmVyYWwgaGV1cmlzdGljcyBzdWNoIGFzIF90ZXN0YWJpbGl0eSB0cmFuc2Zvcm1hdGlvbnNfIGFuZCBfdGFpbnQgYW5hbHlzaXNfIHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUKICBtb3JlIGVmZmVjdGl2ZSB0ZXN0IGNhc2VzLiBXZSBzdXBwb3J0IEpESyBfXzhfXyBhbmQgdGhlIG1ham9yIExUUyB2ZXJzaW9ucyBhZnRlciB0aGF0IChjdXJyZW50bHkgSkRLIF9fMjFfXykuIE1pZ2h0IHdvcmsgb24gb3RoZXIgSlZNIHZlcnNpb25zLCBidXQgd2UgcHJvdmlkZSBfX05PX18gc3VwcG9ydCBmb3IgaXQuCiAgTm90ZTogdGhlcmUgd2FzIGluaXRpYWwgc3VwcG9ydCBmb3Igb3RoZXIgbGFuZ3VhZ2VzIGFzIHdlbGwsIGxpa2UgZm9yIGV4YW1wbGUgSmF2YVNjcmlwdC9UeXBlU2NyaXB0IGFuZCBDIywgYnV0IHRoZXkgd2VyZSBub3QgaW4gYSBzdGFibGUsIGZlYXR1cmUtY29tcGxldGUgc3RhdGUuIFRoZSBzdXBwb3J0IGZvciB0aG9zZSBsYW5ndWFnZXMgZm9yIHdoaXRlLWJveCB0ZXN0aW5nIGhhcyBiZWVuIGRyb3BwZWQsIGF0IGxlYXN0IGZvciB0aGUgdGltZSBiZWluZy4gCgoqIF9JbnN0YWxsYXRpb25fOiB3ZSBwcm92aWRlIGluc3RhbGxlcnMgZm9yIHRoZSBtYWluIG9wZXJhdGluZyBzeXN0ZW1zOiBfV2luZG93c18gKGAubXNpYCksCiAgX09TWF8gKGAuZG1nYCkgYW5kIF9MaW51eF8gKGAuZGViYCkuIFdlIGFsc28gcHJvdmlkZSBhbiB1YmVyLWZhdCBKQVIgZmlsZS4KICBUbyBkb3dubG9hZCB0aGVtLCBzZWUgdGhlIFtSZWxlYXNlIHBhZ2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJGdXp6aW5nL0V2b01hc3Rlci9yZWxlYXNlcykuCiAgUmVsZWFzZSBub3RlcyBhcmUgcHJlc2VudCBpbiB0aGUgZmlsZSBbcmVsZWFzZV9ub3Rlcy5tZF0oaHR0cHM6Ly9naXRodWIuY29tL1dlYkZ1enppbmcvRXZvTWFzdGVyL2Jsb2IvbWFzdGVyL3JlbGVhc2Vfbm90ZXMubWQpLgogIElmIHlvdSBhcmUgdXNpbmcgdGhlIHViZXItZmF0IEpBUiwgaXQgc2hvdWxkIHdvcmsgd2l0aCBhbnkgbWFqb3IgTFRTIHZlcnNpb24gKGZyb20gSkRLIDggb24pLgogICBXaGVyZWFzIGZvciB0aGUgY2xpZW50IGxpYnJhcnksIG5lZWRlZCBmb3Igd2hpdGUtYm94IHRlc3RpbmcsIHdlIHdpbGwgc3VwcG9ydCBKREsgOCBsaWtlbHkgZm9yIGEgbG9uZywgbG9uZyB3aGlsZSwgYmUgd2FybmVkIHRoYXQgZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBleGVjdXRhYmxlIEpBUiBtaWdodCBzdGFydCB0byByZXF1aXJlIGhpZ2hlciB2ZXJzaW9ucyBvZiB0aGUgSkRLIGluIGEgbm9uLXNvLWRpc3RhbnQgZnV0dXJlLgogICBJZiB0aGF0IGlzIGdvaW5nIHRvIGJlIGhpZ2hlciB0aGFuIHlvdXIgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBKVk0sIGlmIHlvdSBjYW5ub3QgdXBncmFkZSBvciBoYXZlIDIgZGlmZmVyZW50IEpES3Mgb24geW91ciBtYWNoaW5lLCB0aGVuIHlvdSBzaG91bGQgbm90IHVzZSB0aGUgdWJlci1qYXIgYnV0IHJhdGhlciBvbmUgb2YgdGhlIGluc3RhbGxlcnMuIAogICBXaGVuIHlvdSB1c2Ugb25lIG9mIHRoZSBpbnN0YWxsZXJzLCBrZWVwIGluIG1pbmQgdGhhdCBjdXJyZW50bHkgdGhleSBkbyBub3QgdXBkYXRlIHRoZSBgUEFUSGAgdmFyaWFibGUuIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBtYW51YWxseSwgW3NlZSBkb2N1bWVudGF0aW9uXShkb2NzL2Rvd25sb2FkLm1kKS4gCgoqIF9TdGF0ZS1vZi10aGUtYXJ0XzogYW4gW2luZGVwZW5kZW50IHN0dWR5ICgyMDIyKV0oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzIyMDQuMDgzNDgpLCBjb21wYXJpbmcgMTAgZnV6emVycyBvbiAyMCBSRVNUZnVsIEFQSXMsIHNob3dzIHRoYXQgX0V2b01hc3Rlcl8gZ2l2ZXMgdGhlIGJlc3QgcmVzdWx0cy4KCiogX1NjaGVtYV86IFJFU1QgQVBJcyBtdXN0IHByb3ZpZGUgYSBzY2hlbWEgaW4gW09wZW5BUEkvU3dhZ2dlcl0oaHR0cHM6Ly9zd2FnZ2VyLmlvKQogIGZvcm1hdCAoZWl0aGVyIF92Ml8gb3IgX3YzXykuCgoqIF9PdXRwdXRfOiB0aGUgdG9vbCBnZW5lcmF0ZXMgX0pVbml0XyAodmVyc2lvbiA0IG9yIDUpIHRlc3RzLCB3cml0dGVuIGluIGVpdGhlciBKYXZhIG9yIEtvdGxpbiwgYXMgd2VsbCBhcyB0ZXN0IHN1aXRlcyBpbiBQeXRob24gYW5kIEphdmFTY3JpcHQuIEZvciBhIGNvbXBsZXRlIGxpc3QsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIENMSSBwYXJhbWV0ZXIgWy0tb3V0cHV0Rm9ybWF0XShkb2NzL29wdGlvbnMubWQpLiAKICBTb21lIGV4YW1wbGVzIGFyZTogUFlUSE9OX1VOSVRURVNULCBLT1RMSU5fSlVOSVRfNSwgSkFWQV9KVU5JVF80IGFuZCBKU19KRVNULgogIE5vdGUgdGhhdCB0aGUgZ2VuZXJhdGVkIHRlc3RzIHJlbHkgb24gdGhpcmQtcGFydHkgbGlicmFyaWVzIChlLmcuLCB0byBtYWtlIEhUVFAgY2FsbHMpLiAKICBUaGVzZSB3aWxsIG5lZWQgdG8gYmUgc2V0dXAgaW4geW91ciBwcm9qZWN0cywgW3NlZSBkb2N1bWVudGF0aW9uXShkb2NzL2xpYnJhcnlfZGVwZW5kZW5jaWVzLm1kKS4KCiogX0ZhdWx0IGRldGVjdGlvbl86IF9Fdm9NYXN0ZXJfIGNhbiBnZW5lcmF0ZSB0ZXN0cyBjYXNlcyB0aGF0IHJldmVhbCBmYXVsdHMvYnVncyBpbiB0aGUgdGVzdGVkIGFwcGxpY2F0aW9ucy4KICBEaWZmZXJlbnQgaGV1cmlzdGljcyBhcmUgZW1wbG95ZWQsIGxpa2UgY2hlY2tpbmcgZm9yIDUwMCBzdGF0dXMgY29kZXMgYW5kIG1pc21hdGNoZXMgZnJvbSB0aGUgQVBJIHNjaGVtYXMuCgoqIF9TZWxmLWNvbnRhaW5lZCB0ZXN0c186IGZvciB3aGl0ZS1ib3ggdGVzdGluZywgdGhlIGdlbmVyYXRlZCB0ZXN0cyBkbyBzdGFydC9zdG9wIHRoZSBhcHBsaWNhdGlvbiwgYmluZGluZyB0byBhbiBlcGhlbWVyYWwgcG9ydC4KICBUaGlzIG1lYW5zIHRoYXQgdGhlIGdlbmVyYXRlZCB0ZXN0cyBjYW4gYmUgdXNlZCBmb3IgX3JlZ3Jlc3Npb24gdGVzdGluZ18gKGUuZy4sIGFkZGVkIHRvIHRoZSBHaXQgcmVwb3NpdG9yeQogIG9mIHRoZSBhcHBsaWNhdGlvbiwgYW5kIHJ1biB3aXRoIGFueSBidWlsZCB0b29sIHN1Y2ggYXMgTWF2ZW4gYW5kIEdyYWRsZSkuCiAgRm9yIGJsYWNrLWJveCB0ZXN0aW5nLCB5b3Ugd2lsbCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgYXBwbGljYXRpb24gaXMgdXAgYW5kIHJ1bm5pbmcgYmVmb3JlIGV4ZWN1dGluZyB0aGUgdGVzdHMuIAoKCiogX1NRTCBoYW5kbGluZ186IGZvciB3aGl0ZS1ib3ggdGVzdGluZywgX0V2b01hc3Rlcl8gY2FuIGludGVyY2VwdCBhbmQgYW5hbHlzZSBhbGwgY29tbXVuaWNhdGlvbnMgZG9uZSB3aXRoIFNRTCBkYXRhYmFzZXMsIGFuZCB1c2UKICBzdWNoIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIGhpZ2hlciBjb2RlIGNvdmVyYWdlIHRlc3QgY2FzZXMuIEZ1cnRoZXJtb3JlLCBpdCBjYW4gZ2VuZXJhdGUgZGF0YSBkaXJlY3RseQogIGludG8gdGhlIGRhdGFiYXNlcywgYW5kIGhhdmUgc3VjaCBpbml0aWFsaXphdGlvbiBhdXRvbWF0aWNhbGx5IGFkZGVkIGluIHRoZSBnZW5lcmF0ZWQgdGVzdHMuCiAgQXQgdGhlIG1vbWVudCwgX0V2b01hc3Rlcl8gc3VwcG9ydHMgX1Bvc3RncmVzXywgX015U1FMXyBhbmQgX0gyXyAgZGF0YWJhc2VzLgoKCiogX0F1dGhlbnRpY2F0aW9uXzogd2Ugc3VwcG9ydCBhdXRoIGJhc2VkIG9uIGF1dGhlbnRpY2F0aW9uIGhlYWRlcnMgYW5kIGNvb2tpZXMuCiAgQmVzaWRlcyB1c2luZyBmaXhlZCBIVFRQIGhlYWRlcnMsIAogIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZGVjbGFyYXRpdmVseSBzcGVjaWZ5IHdoaWNoIGxvZ2luIGVuZHBvaW50IHNob3VsZCBiZSB1c2VkIHRvIGR5bmFtaWNhbGx5IG9idGFpbiBhdXRoZW50aWNhdGlvbiBpbmZvIChlLmcuLCBhdXRoIHRva2VucyBvciBjb29raWVzKSBmb3IgZWFjaCB0ZXN0IGV4ZWN1dGlvbi4gW1NlZSBkb2N1bWVudGF0aW9uXShkb2NzL2F1dGgubWQpLgoKX19Lbm93biBsaW1pdGF0aW9uc19fOgoKKiBfRHJpdmVyXzogdG8gYmUgdXNlZCBmb3IgX3doaXRlLWJveF8gdGVzdGluZywgdXNlcnMgbmVlZCB0byB3cml0ZSBhIFtkcml2ZXIgbWFudWFsbHldKGRvY3Mvd3JpdGVfZHJpdmVyLm1kKS4KICBXZSByZWNvbW1lbmQgdG8gdHJ5IF9ibGFjay1ib3hfIG1vZGUgZmlyc3QgKHNob3VsZCBqdXN0IG5lZWQgYSBmZXcgbWludXRlcyB0byBnZXQgaXQgdXAgYW5kIHJ1bm5pbmcpIHRvIGdldAogIGFuIGlkZWEgb2Ygd2hhdCBfRXZvTWFzdGVyXyBjYW4gZG8gZm9yIHlvdS4KCiogX0pESyA5K186IHdoaXRlLWJveCB0ZXN0aW5nIHJlcXVpcmVzIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbi4gCiAgICAgICAgICAgIEVhY2ggbmV3IHJlbGVhc2Ugb2YgdGhlIEpESyBtYWtlcyBkb2luZyB0aGlzIGhhcmRlciBhbmQgaGFyZGVyLiAKICAgICAgICAgICAgRGVhbGluZyB3aXRoIEpES3MgYWJvdmUgX184X18gaXMgZG9hYmxlLCBidXQgaXQgcmVxdWlyZXMgc29tZSBzZXR0aW5ncy4KICAgICAgICAgICAgW1NlZSBkb2N1bWVudGF0aW9uXShkb2NzL2pka3MubWQpLgoKKiBfRXhlY3V0aW9uIHRpbWVfOiB0byBnZXQgZ29vZCByZXN1bHRzLCB5b3UgbWlnaHQgbmVlZCB0byBydW4gdGhlIHNlYXJjaCBmb3Igc2V2ZXJhbCBob3Vycy4KICBXZSByZWNvbW1lbmQgdG8gZmlyc3QgdHJ5IHRoZSBzZWFyY2ggZm9yIDEwIG1pbnV0ZXMsIGp1c3QgdG8gZ2V0IGFuIGlkZWEgb2Ygd2hhdCB0eXBlIG9mIHRlc3RzIGNhbiBiZSBnZW5lcmF0ZWQuCiAgQnV0LCB0aGVuLCB5b3Ugc2hvdWxkIHJ1biBfRXZvTWFzdGVyXyBmb3Igc29tZXRoaW5nIGxpa2UgYmV0d2VlbiAxIGFuZCAyNCBob3VycyAodGhlIGxvbmdlciB0aGUgYmV0dGVyLCBidXQKICBpdCBpcyB1bmxpa2VseSB0byBnZXQgYmV0dGVyIHJlc3VsdHMgYWZ0ZXIgMjQgaG91cnMpLgoKKiBfUlBDIEFQSXNfOiBmb3IgdGhlIG1vbWVudCwgd2UgZG8gbm90IGRpcmVjdGx5IHN1cHBvcnQgUlBDIHNjaGVtYSBkZWZpbml0aW9ucy4gRnV6emluZyBSUEMgQVBJcyByZXF1aXJlcyB0byB3cml0ZSBhIGRyaXZlciwgdXNpbmcgdGhlIGNsaWVudCBsaWJyYXJ5IG9mIHRoZSBBUEkgdG8gbWFrZSB0aGUgY2FsbHMuCgoqIF9FeHRlcm5hbCBzZXJ2aWNlc186IChlLmcuLCBvdGhlciBSRVNUZnVsIEFQSXMpIGN1cnJlbnRseSB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciB0aGVtIChlLmcuLCB0byBhdXRvbWF0aWNhbGx5IG1vY2sgdGhlbSkuCiAgSXQgaXMgd29yayBpbiBwcm9ncmVzcy4KCiogX05vU1FMIGRhdGFiYXNlc186IChlLmcuLCBNb25nb0RCKSBjdXJyZW50bHkgbm8gc3VwcG9ydC4gSXQgaXMgd29yayBpbiBwcm9ncmVzcy4KCiogX0ZhaWxpbmcgdGVzdHNfOiB0aGUgdGVzdHMgZ2VuZXJhdGVkIGJ5IF9Fdm9NYXN0ZXJfIHNob3VsZCBhbGwgcGFzcywgYW5kIG5vdCBmYWlsLCBldmVuIHdoZW4gdGhleSBkZXRlY3QgYSBmYXVsdC4KICBJbiB0aG9zZSBjYXNlcywgY29tbWVudHMvdGVzdC1uYW1lcyB3b3VsZCBwb2ludCBvdXQgdGhhdCBhIHRlc3QgaXMgcmV2ZWFsaW5nIGEgcG9zc2libGUgZmF1bHQsIHdoaWxlIHN0aWxsIHBhc3NpbmcuCiAgSG93ZXZlciwgaW4gc29tZSBjYXNlcyB0aGUgZ2VuZXJhdGVkIHRlc3RzIG1pZ2h0IGZhaWwuIFRoaXMgaXMgZHVlIHRvIHRoZSBzbyBjYWxsZWQgX2ZsYWt5XyB0ZXN0cywgZS5nLiwgd2hlbgogIGEgdGVzdCBoYXMgYXNzZXJ0aW9ucyBiYXNlZCBvbiB0aGUgdGltZSBjbG9jayAoZS5nLiwgZGF0ZXMgYW5kIHRpbWVzdGFtcHMpLgogIFRoZXJlIGlzIG9uZ29pbmcgZWZmb3J0IHRvIGFkZHJlc3MgdGhpcyBwcm9ibGVtLCBidXQgaXQgaXMgc3RpbGwgbm90IGZ1bGx5IHNvbHZlZC4KCjwhLS0jIyMgVmlkZW9zLS0tPiAKPCEtLSAKPGRpdj5JY29ucyBtYWRlIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmZsYXRpY29uLmNvbS9hdXRob3JzL2ZyZWVwaWsiIHRpdGxlPSJGcmVlcGlrIj5GcmVlcGlrPC9hPiBmcm9tIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmZsYXRpY29uLmNvbS8iIHRpdGxlPSJGbGF0aWNvbiI+d3d3LmZsYXRpY29uLmNvbTwvYT48L2Rpdj4gCi0tPgoKCiMjIyBWaWRlb3MKCiFbXShkb2NzL2ltZy92aWRlby1wbGF5ZXItZmxhdGljb24ucG5nKQoKKiBBIFtzaG9ydCB2aWRlb10oaHR0cHM6Ly95b3V0dS5iZS8zbVl4amduaExFbykgKDUgbWludXRlcykKICBzaG93cyB0aGUgdXNlIG9mIF9Fdm9NYXN0ZXJfIG9uIG9uZSBvZiB0aGUKICBjYXNlIHN0dWRpZXMgaW4gW0VNQl0oaHR0cHM6Ly9naXRodWIuY29tL1dlYkZ1enppbmcvRU1CKS4KCiogVGhpcyBbMTMtbWludXRlIHZpZGVvXShodHRwczovL3lvdXR1LmJlL09SeFpvWXc3TG5NKQogIHNob3dzIGhvdyB0byB3cml0ZSBhIHdoaXRlLWJveCBkcml2ZXIgZm9yIEV2b01hc3RlciwgZm9yIHRoZQogIFtyZXN0LWFwaS1leGFtcGxlXShodHRwczovL2dpdGh1Yi5jb20vV2ViRnV6emluZy9yZXN0LWFwaS1leGFtcGxlKS4KCiogSG93IHRvIFtEb3dubG9hZCBhbmQgSW5zdGFsbCBFdm9NYXN0ZXIgb24gV2luZG93cyAxMF0oaHR0cHM6Ly95b3V0dS5iZS91aF9Yekd4d3M5byksIHVzaW5nIGl0cyBfLm1zaV8gaW5zdGFsbGVyLgoKKiBbU2hvcnQgcHJlc2VudGF0aW9uXShodHRwczovL3lvdXR1LmJlL2lRU0FscnItUFpvKSAoNSBtaW51dGVzKSBhYm91dCB2ZXJzaW9uIDIuMC4wLiAKCiMjIyBBbHRlcm5hdGl2ZXMKCkluIHRoZSBsYXN0IGZldyB5ZWFycywgc2V2ZXJhbCBmZXcgdG9vbHMgaGF2ZSBiZWVuIHByb3Bvc2VkIGluIHRoZSBhY2FkZW1pYyBsaXRlcmF0dXJlIGFuZCBpbiB0aGUgb3Blbi1zb3VyY2UgY29tbXVuaXR5LgpZb3UgY2FuIHJlYWQgbW9yZSBkZXRhaWxzIGluIHRoaXMgWzIwMjMgc3VydmV5XShkb2NzL3B1YmxpY2F0aW9ucy8yMDIzX3Rvc2VtX3N1cnZleS5wZGYpIG9uIFJFU1QgQVBJIHRlc3RpbmcuCgpFeGlzdGluZyBvcGVuLXNvdXJjZSB0b29scyBmb3IgUkVTVCBBUEkgZnV6emluZyBhcmUgZm9yIGV4YW1wbGUgKGluIGFscGhhYmV0aWMgb3JkZXIpOgpbQ0FUU10oaHR0cHM6Ly9naXRodWIuY29tL0VuZGF2YS9jYXRzKSwKW0RyZWRkXShodHRwczovL2dpdGh1Yi5jb20vYXBpYXJ5aW8vZHJlZGQpLApbRnV6ei1saWdodHllYXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ZZWxwL2Z1enotbGlnaHR5ZWFyKSwKW1Jlc1Rlc3RdKGh0dHBzOi8vZ2l0aHViLmNvbS9pc2EtZ3JvdXAvUkVTVGVzdCksCltSZXN0Q1RdKGh0dHBzOi8vZ2l0aHViLmNvbS9HSVNULU5KVS9SZXN0Q1QpLApbUmVzdGxlcl0oaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9yZXN0bGVyLWZ1enplciksCltSZXN0VGVzdEdlbl0oaHR0cHM6Ly9naXRodWIuY29tL1NlVW5pVnIvUmVzdFRlc3RHZW4pLAphbmQKW1NjaGVtYXRoZXNpc10oaHR0cHM6Ly9naXRodWIuY29tL3NjaGVtYXRoZXNpcy9zY2hlbWF0aGVzaXMpLgoKQWxsIHRoZXNlIHRvb2xzIGFyZSBfYmxhY2stYm94XywgaS5lLiwgdGhleSBkbyBub3QgYW5hbHl6ZSB0aGUgc291cmNlLWNvZGUgb2YgdGhlIHRlc3RlZCBBUElzIHRvIGdlbmVyYXRlIG1vcmUgZWZmZWN0aXZlIHRlc3QgZGF0YS4KQXMgd2UgYXJlIHRoZSBhdXRob3JzIG9mIEV2b01hc3Rlciwgd2UgYXJlIHRvbyBiaWFzZWQgdG8gY29tcGFyZSBpdCBwcm9wZXJseSB3aXRoIHRob3NlIG90aGVyIGJsYWNrLWJveCB0b29scy4KSG93ZXZlciwgYW4gW2luZGVwZW5kZW50IHN0dWR5ICgyMDIyKV0oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzIyMDQuMDgzNDgpIHNob3dzIHRoYXQgRXZvTWFzdGVyIGlzIGFtb25nIHRoZSBiZXN0IHBlcmZvcm1hbnQuCkZ1cnRoZXJtb3JlLCBpZiB5b3VyIEFQSXMgYXJlIHJ1bm5pbmcgb24gdGhlIEpWTSAoZS5nLiwgd3JpdHRlbiBpbiBKYXZhIG9yIEtvdGxpbiksIHRoZW4gRXZvTWFzdGVyIGhhcyBjbGVhcmx5IGFuIGFkdmFudGFnZSwgYXMgaXQgc3VwcG9ydHMgX3doaXRlLWJveF8gdGVzdGluZy4gCgo8IS0tLQojIyMgSGlyaW5nCgpEZXBlbmRpbmcgb24gdGhlIHllYXIsIHdlIG1pZ2h0IGhhdmUgZnVuZGluZyBmb3IgX3Bvc3Rkb2NfIGFuZCBfUGhEIHN0dWRlbnRfIHBvc2l0aW9ucyB0byB3b3JrIG9uIHRoaXMgcHJvamVjdCAoaW4gT3NsbywgTm9yd2F5KS4KCkN1cnJlbnQgb3BlbiBwb3NpdGlvbnM6IG5vbmUuCjwgIS0tLQoqIDIwMjM6IFBoRCBzdHVkZW50IHBvc2l0aW9ucy4gTm8gbmV3IGNhbGxzIHNjaGVkdWxlZCBmb3IgdGhlIG1vbWVudC4KKiAyMDIzOiBQb3N0ZG9jIHBvc2l0aW9ucy4gTm8gbmV3IGNhbGxzIHNjaGVkdWxlZCBmb3IgdGhlIG1vbWVudC4KLS0tID4KCkZvciBxdWVzdGlvbnMgb24gdGhlc2UgcG9zaXRpb25zLCBwbGVhc2UgY29udGFjdCBQcm9mLiBBbmRyZWEgQXJjdXJpLgoKPCAhLS0tCkZvciBtb3JlIGRldGFpbHMgb24gY3VycmVudCB2YWNhbmNpZXMsIHNlZSBvdXIgZ3JvdXAgcGFnZSBhdCBbQUlTRSBMYWJdKGh0dHBzOi8vZW1yZXNlYXJjaC5naXRodWIuaW8vKS4KLS0tPgoKCgojIyMgRG9jdW1lbnRhdGlvbgoKSWYgeW91IGFyZSB0cnlpbmcgdG8gdXNlIF9Fdm9NYXN0ZXJfLCBidXQgdGhlIGluc3RydWN0aW9ucyBpbiB0aGlzIGRvY3VtZW50YXRpb24gYXJlIG5vdCBlbm91Z2ggdG8gZ2V0IHlvdSBzdGFydGVkLCBvciB0aGV5IGFyZSB0b28gdW5jbGVhciwgdGhlbiBpdCBtZWFucyBpdCBpcyBhIF9idWdfIGluIHRoZSBkb2N1bWVudGF0aW9uLCB3aGljaCB0aGVuIHdvdWxkIG5lZWQgdG8gYmUgY2xhcmlmaWVkIGFuZCB1cGRhdGVkLiBJbiBzdWNoIGNhc2VzLCBwbGVhc2UgY3JlYXRlIGEgbmV3IFtpc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL1dlYkZ1enppbmcvRXZvTWFzdGVyL2lzc3VlcykuCgpBbHNvLCBmZWVsIGZyZWUgdG8gc3RhcnQgbmV3IGRpc2N1c3Npb24gdG9waWNzIGluIHRoZSBbRGlzY3Vzc2lvbnMgZm9ydW1dKGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJGdXp6aW5nL0V2b01hc3Rlci9kaXNjdXNzaW9ucykuCklmIHlvdSBoYXZlIHRpbWUsIHBsZWFzZSBjb25zaWRlciBhbnN3ZXJpbmcgdGhlIHBvbGxzIHRoZXJlLgoKSWYgeW91IGFyZSB3b3JraW5nIG9uIGFuIG9wZW4tc291cmNlIEFQSSwgeW91IGNhbiBkcm9wIHVzIGEgbWVzc2FnZSBpZiB5b3UgaGF2ZSBwcm9ibGVtcyB1c2luZyBFdm9NYXN0ZXIgb24gaXQuIApPdGhlcndpc2UsIGlmIHlvdSBhcmUgd29ya2luZyBpbiBpbmR1c3RyeSBvbiBjbG9zZWQtc291cmNlIEFQSXMsIHdlIGhhdmUgb3B0aW9ucyBmb3IgYWNhZGVtaWEtaW5kdXN0cnkgY29sbGFib3JhdGlvbnMgKFtzZWUgbW9yZSBpbmZvIGhlcmVdKGRvY3MvY29udHJpYnV0ZS5tZCkpLiAgCgoKKiBbRXhhbXBsZSBvZiBnZW5lcmF0ZWQgdGVzdHNdKGRvY3MvZXhhbXBsZS5tZCkKKiBbRG93bmxvYWQgYW5kIEluc3RhbGwgRXZvTWFzdGVyXShkb2NzL2Rvd25sb2FkLm1kKQoqIFtCdWlsZCBFdm9NYXN0ZXIgZnJvbSBzb3VyY2VdKGRvY3MvYnVpbGQubWQpCiogW0NvbW1hbmQtTGluZSBJbnRlcmZhY2UgKENMSSkgb3B0aW9uc10oZG9jcy9vcHRpb25zLm1kKQoqIFtPcGVuQXBpL1N3YWdnZXIgU2NoZW1hXShkb2NzL29wZW5hcGkubWQpCiogW1VzaW5nIEV2b01hc3RlciBmb3IgQmxhY2stQm94IFRlc3RpbmcgKGVhc2llciB0byBzZXR1cCwgYnV0IHdvcnNlIHJlc3VsdHMpXShkb2NzL2JsYWNrYm94Lm1kKQoqIFtVc2luZyBFdm9NYXN0ZXIgZm9yIFdoaXRlLUJveCBUZXN0aW5nIChoYXJkZXIgdG8gc2V0dXAsIGJ1dCBiZXR0ZXIgcmVzdWx0cyldKGRvY3Mvd2hpdGVib3gubWQpCiAgKiBbV3JpdGUgYW4gRXZvTWFzdGVyIERyaXZlciBmb3IgV2hpdGUtQm94IFRlc3RpbmddKGRvY3Mvd3JpdGVfZHJpdmVyLm1kKQogICogW0RlYWxpbmcgd2l0aCBKREtzIGFib3ZlIHZlcnNpb24gOF0oZG9jcy9qZGtzLm1kKQoqIFtDb25maWd1cmluZyBhdXRoZW50aWNhdGlvbl0oZG9jcy9hdXRoLm1kKSAgCiogW0NvbnNvbGUgb3V0cHV0XShkb2NzL2NvbnNvbGVfb3V0cHV0Lm1kKQoqIFtMaWJyYXJ5IGRlcGVuZGVuY2llcyBmb3IgdGhlIGdlbmVyYXRlZCB0ZXN0c10oZG9jcy9saWJyYXJ5X2RlcGVuZGVuY2llcy5tZCkKKiBbSG93IHRvIGNvbnRyaWJ1dGVdKGRvY3MvY29udHJpYnV0ZS5tZCkKICAqIFtUZWNobmljYWwgbm90ZXMgZm9yIGRldmVsb3BlcnMgY29udHJpYnV0aW5nIHRvIEV2b01hc3Rlcl0oZG9jcy9mb3JfZGV2ZWxvcGVycy5tZCkKKiBUcm91Ymxlc2hvb3RpbmcKICAqIFtXaW5kb3dzIGFuZCBuZXR3b3JraW5nXShkb2NzL3Ryb3VibGVzaG9vdGluZy93aW5kb3dzLm1kKQoqIE1vcmUgSW5mbwogICogW0FjYWRlbWljIHBhcGVycyByZWxhdGVkIHRvIEV2b01hc3Rlcl0oZG9jcy9wdWJsaWNhdGlvbnMubWQpCiAgKiBbU2xpZGVzIG9mIHByZXNlbnRhdGlvbnMvc2VtaW5hcnNdKGRvY3MvcHJlc2VudGF0aW9ucy5tZCkKICAqIFtSZXBsaWNhdGluZyBzdHVkaWVzXShkb2NzL3JlcGxpY2F0aW5nX3N0dWRpZXMubWQpCgoKCgoKCiMjIyBGdW5kaW5nCgpfRXZvTWFzdGVyXyBoYXMgYmVlbiBmdW5kZWQgYnk6CiogMjAyMC0yMDI1OiBhIDIgbWlsbGlvbiBFdXJvIGdyYW50IGJ5IHRoZSBFdXJvcGVhbiBSZXNlYXJjaCBDb3VuY2lsIChFUkMpLAogIGFzIHBhcnQgb2YgdGhlICpFUkMgQ29uc29saWRhdG9yKiBwcm9qZWN0CiAgPGk+VXNpbmcgRXZvbHV0aW9uYXJ5IEFsZ29yaXRobXMgdG8gVW5kZXJzdGFuZCBhbmQgU2VjdXJlIFdlYi9FbnRlcnByaXNlIFN5c3RlbXM8L2k+LgoqICAyMDE4LTIwMjE6IGEgNy44IG1pbGxpb24gTm9yd2VnaWFuIEtyb25lciBncmFudCAgYnkgdGhlIFJlc2VhcmNoIENvdW5jaWwgb2YgTm9yd2F5IChSQ04pLAogICBhcyBwYXJ0IG9mIHRoZSBGcmluYXRlayBwcm9qZWN0IDxpPkV2b2x1dGlvbmFyeSBFbnRlcnByaXNlIFRlc3Rpbmc8L2k+LgoKCjxpbWcgc3JjPSJodHRwczovL2dpdGh1Yi5jb20vV2ViRnV6emluZy9Fdm9NYXN0ZXIvYmxvYi9tYXN0ZXIvZG9jcy9pbWcvTE9HT19FUkMtRkxBR19FVV8uanBnP3Jhdz10cnVlIiB3aWR0aD0iMjAwIiA+CgoKVGhpcyBwcm9qZWN0IGhhcyByZWNlaXZlZCBmdW5kaW5nIGZyb20gdGhlIEV1cm9wZWFuIFJlc2VhcmNoIENvdW5jaWwgKEVSQykgdW5kZXIgdGhlIEV1cm9wZWFuIFVuaW9u4oCZcyBIb3Jpem9uIDIwMjAgcmVzZWFyY2ggYW5kIGlubm92YXRpb24gcHJvZ3JhbW1lIChncmFudCBhZ3JlZW1lbnQgTm8gODY0OTcyKS4KCgojIyMgTGljZW5zZQpfRXZvTWFzdGVyXydzIHNvdXJjZSBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBMR1BMICh2MykgbGljZW5zZS4KRm9yIGEgbGlzdCBvZiB0aGUgdXNlZCB0aGlyZC1wYXJ0eSBsaWJyYXJpZXMsIHlvdSBjYW4gZGlyZWN0bHkgc2VlIHRoZSByb290IFtwb20ueG1sXSguL3BvbS54bWwpIGZpbGUuCkZvciBhIGxpc3Qgb2YgY29kZSBkaXJlY3RseSBpbXBvcnRlZCAoYW5kIHRoZW4gcG9zc2libHkgbW9kaWZpZWQvdXBkYXRlZCkgZnJvbQpvdGhlciBvcGVuLXNvdXJjZSBwcm9qZWN0cywgc2VlIFtoZXJlXSguL2RvY3MvcmV1c2VkX2NvZGUubWQpLgoKCjwhLS0KIyMjICFbXShodHRwczovL3d3dy55b3Vya2l0LmNvbS9pbWFnZXMveWtsb2dvLnBuZykKCllvdXJLaXQgc3VwcG9ydHMgb3BlbiBzb3VyY2UgcHJvamVjdHMgd2l0aCBpdHMgZnVsbC1mZWF0dXJlZCBKYXZhIFByb2ZpbGVyLgpZb3VyS2l0LCBMTEMgaXMgdGhlIGNyZWF0b3Igb2YKPGEgaHJlZj0iaHR0cHM6Ly93d3cueW91cmtpdC5jb20vamF2YS9wcm9maWxlci8iPllvdXJLaXQgSmF2YSBQcm9maWxlcjwvYT4KYW5kCjxhIGhyZWY9Imh0dHBzOi8vd3d3LnlvdXJraXQuY29tLy5uZXQvcHJvZmlsZXIvIj5Zb3VyS2l0IC5ORVQgUHJvZmlsZXI8L2E+LAppbm5vdmF0aXZlIGFuZCBpbnRlbGxpZ2VudCB0b29scyBmb3IgcHJvZmlsaW5nIEphdmEgYW5kIC5ORVQgYXBwbGljYXRpb25zLgotLT4KCg==
- readmeEtag: '"0bdac08a37f963daf1e6bc6bf2a77838b0688002"'
- readmeLastModified: Fri, 27 Sep 2024 11:25:25 GMT
+ IyBFdm9NYXN0ZXI6IEEgVG9vbCBGb3IgQXV0b21hdGljYWxseSBHZW5lcmF0aW5nIFN5c3RlbS1MZXZlbCBUZXN0IENhc2VzCgoKIVtdKGRvY3MvaW1nL2NhcmwtY2Vyc3RyYW5kLTEzNjgxMF9jb21wcmVzc2VkLmpwZyAgIlBob3RvIGJ5IENhcmwgQ2Vyc3RyYW5kIG9uIFVuc3BsYXNoIikKClshW01hdmVuIENlbnRyYWxdKGh0dHBzOi8vbWF2ZW4tYmFkZ2VzLmhlcm9rdWFwcC5jb20vbWF2ZW4tY2VudHJhbC9vcmcuZXZvbWFzdGVyL2V2b21hc3Rlci1jbGllbnQtamF2YS9iYWRnZS5zdmcpXShodHRwczovL21hdmVuLWJhZGdlcy5oZXJva3VhcHAuY29tL21hdmVuLWNlbnRyYWwvb3JnLmV2b21hc3Rlci9ldm9tYXN0ZXItY2xpZW50LWphdmEpClshW2phdmFkb2NdKGh0dHBzOi8vamF2YWRvYy5pby9iYWRnZTIvb3JnLmV2b21hc3Rlci9ldm9tYXN0ZXItY2xpZW50LWphdmEtY29udHJvbGxlci9qYXZhZG9jLnN2ZyldKGh0dHBzOi8vamF2YWRvYy5pby9kb2Mvb3JnLmV2b21hc3Rlci9ldm9tYXN0ZXItY2xpZW50LWphdmEtY29udHJvbGxlcikKIVtDSV0oaHR0cHM6Ly9naXRodWIuY29tL1dlYkZ1enppbmcvRXZvTWFzdGVyL3dvcmtmbG93cy9DSS9iYWRnZS5zdmcpClshW2NvZGVjb3ZdKGh0dHBzOi8vY29kZWNvdi5pby9naC9XZWJGdXp6aW5nL0V2b01hc3Rlci9icmFuY2gvbWFzdGVyL2dyYXBoL2JhZGdlLnN2ZyldKGh0dHBzOi8vY29kZWNvdi5pby9naC9XZWJGdXp6aW5nL0V2b01hc3RlcikKWyFbRE9JXShodHRwczovL3plbm9kby5vcmcvYmFkZ2UvOTIzODU5MzMuc3ZnKV0oaHR0cHM6Ly96ZW5vZG8ub3JnL2JhZGdlL2xhdGVzdGRvaS85MjM4NTkzMykKWyFbTGljZW5zZTogTEdQTCB2M10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9MaWNlbnNlLUxHUExfdjMtYmx1ZS5zdmcpXShodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xncGwtMy4wKQpbIVtHaXRodWIgQWxsIFJlbGVhc2VzXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9kb3dubG9hZHMvV2ViRnV6emluZy9ldm9tYXN0ZXIvdG90YWwuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL1dlYkZ1enppbmcvRXZvTWFzdGVyL3JlbGVhc2VzKQoKCiMjIyBTdW1tYXJ5CgpfRXZvTWFzdGVyXyAoW3d3dy5ldm9tYXN0ZXIub3JnXShodHRwOi8vZXZvbWFzdGVyLm9yZykpIGlzIHRoZSBmaXJzdCAoMjAxNikgb3Blbi1zb3VyY2UgQUktZHJpdmVuIHRvb2wKdGhhdCBhdXRvbWF0aWNhbGx5ICpnZW5lcmF0ZXMqIHN5c3RlbS1sZXZlbCB0ZXN0IGNhc2VzCmZvciB3ZWIvZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnMuClRoaXMgaXMgcmVsYXRlZCB0byBbRnV6emluZ10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRnV6emluZykuCkluIHBhcnRpY3VsYXIsIF9Fdm9NYXN0ZXJfIGNhbiBmdXp6IEFQSXMgc3VjaCBhcyBSRVNULCBHcmFwaFFMIGFuZCBSUEMuCk5vdCBvbmx5IF9Fdm9NYXN0ZXJfIGNhbiBnZW5lcmF0ZSBpbnB1dHMgdGhhdCBmaW5kIHByb2dyYW0gY3Jhc2hlcywgYnV0IGFsc28gaXQgZ2VuZXJhdGVzIHNtYWxsIGVmZmVjdGl2ZSB0ZXN0IHN1aXRlcyAoZS5nLiwgaW4gUHl0aG9uLCBKUyBhbmQgSmF2YS9Lb3RsaW4gSlVuaXQgZm9ybWF0KSB0aGF0IGNhbiBiZSB1c2VkIGZvciBfcmVncmVzc2lvbiB0ZXN0aW5nXy4KCl9Fdm9NYXN0ZXJfIGlzIGFuIEFJIGRyaXZlbiB0b29sLgpJbiBwYXJ0aWN1bGFyLCBpbnRlcm5hbGx5IGl0IHVzZXMgYW4gW0V2b2x1dGlvbmFyeSBBbGdvcml0aG1dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0V2b2x1dGlvbmFyeV9hbGdvcml0aG0pCmFuZCBbRHluYW1pYyBQcm9ncmFtIEFuYWx5c2lzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EeW5hbWljX3Byb2dyYW1fYW5hbHlzaXMpICB0byBiZQphYmxlIHRvIGdlbmVyYXRlIGVmZmVjdGl2ZSB0ZXN0IGNhc2VzLgpUaGUgYXBwcm9hY2ggaXMgdG8gKmV2b2x2ZSogdGVzdCBjYXNlcyBmcm9tIGFuIGluaXRpYWwgcG9wdWxhdGlvbiBvZgpyYW5kb20gb25lcywgdHJ5aW5nIHRvIG1heGltaXplIG1lYXN1cmVzIGxpa2UgY29kZSBjb3ZlcmFnZSBhbmQgZmF1bHQgZGV0ZWN0aW9uLgpfRXZvTWFzdGVyXyB1c2VzIHNldmVyYWwga2luZHMgb2YgQUkgaGV1cmlzdGljcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGV2ZW4gZnVydGhlciwKYnVpbGRpbmcgb24gZGVjYWRlcyBvZiByZXNlYXJjaCBpbiB0aGUgZmllbGQgb2YgW1NlYXJjaC1CYXNlZCBTb2Z0d2FyZSBUZXN0aW5nXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TZWFyY2gtYmFzZWRfc29mdHdhcmVfZW5naW5lZXJpbmcpLgoKCl9fS2V5IGZlYXR1cmVzX186CgoqIF9XZWIgQVBJc186IEF0IHRoZSBtb21lbnQsIF9Fdm9NYXN0ZXJfIGNhbiBnZW5lcmF0ZSB0ZXN0IGNhc2VzIGZvciBfX1JFU1RfXywgX19HcmFwaFFMX18gYW5kIF9fUlBDX18gKGUuZy4sIF9fZ1JQQ19fIGFuZCBfX1RocmlmdF9fKSBBUElzLgoKKiBfQmxhY2stQm94XyB0ZXN0aW5nIG1vZGU6IGNhbiBydW4gb24gYW55IEFQSSAocmVnYXJkbGVzcyBvZiBpdHMgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIGUuZy4sIFB5dGhvbiBhbmQgR28pLgogIEhvd2V2ZXIsIHJlc3VsdHMgZm9yIGJsYWNrLWJveCB0ZXN0aW5nIHdpbGwgYmUgd29yc2UgdGhhbiB3aGl0ZS1ib3ggdGVzdGluZyAoZS5nLiwgZHVlIHRvIGxhY2sgb2YgY29kZSBhbmFseXNpcykuCiAgRGVmYXVsdCB0ZXN0IGNhc2Ugb3V0cHV0IGlzIGluIFB5dGhvbiwgYnV0IG90aGVyIGZvcm1hdHMgYXJlIGF2YWlsYWJsZSBhcyB3ZWxsLiAKCiogX1doaXRlLUJveF8gdGVzdGluZyBtb2RlOiBjYW4gYmUgdXNlZCBmb3IgQVBJcyBjb21waWxlZCB0bwogIEpWTSAoZS5nLiwgSmF2YSBhbmQgS290bGluKS4gX0V2b01hc3Rlcl8gYW5hbHlzZXMgdGhlIGJ5dGVjb2RlIG9mIHRoZSB0ZXN0ZWQgYXBwbGljYXRpb25zLCBhbmQgdXNlcwogIHNldmVyYWwgaGV1cmlzdGljcyBzdWNoIGFzIF90ZXN0YWJpbGl0eSB0cmFuc2Zvcm1hdGlvbnNfIGFuZCBfdGFpbnQgYW5hbHlzaXNfIHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUKICBtb3JlIGVmZmVjdGl2ZSB0ZXN0IGNhc2VzLiBXZSBzdXBwb3J0IEpESyBfXzhfXyBhbmQgdGhlIG1ham9yIExUUyB2ZXJzaW9ucyBhZnRlciB0aGF0IChjdXJyZW50bHkgSkRLIF9fMjFfXykuIE1pZ2h0IHdvcmsgb24gb3RoZXIgSlZNIHZlcnNpb25zLCBidXQgd2UgcHJvdmlkZSBfX05PX18gc3VwcG9ydCBmb3IgaXQuCiAgTm90ZTogdGhlcmUgd2FzIGluaXRpYWwgc3VwcG9ydCBmb3Igb3RoZXIgbGFuZ3VhZ2VzIGFzIHdlbGwsIGxpa2UgZm9yIGV4YW1wbGUgSmF2YVNjcmlwdC9UeXBlU2NyaXB0IGFuZCBDIywgYnV0IHRoZXkgd2VyZSBub3QgaW4gYSBzdGFibGUsIGZlYXR1cmUtY29tcGxldGUgc3RhdGUuIFRoZSBzdXBwb3J0IGZvciB0aG9zZSBsYW5ndWFnZXMgZm9yIHdoaXRlLWJveCB0ZXN0aW5nIGhhcyBiZWVuIGRyb3BwZWQsIGF0IGxlYXN0IGZvciB0aGUgdGltZSBiZWluZy4gCgoqIF9JbnN0YWxsYXRpb25fOiB3ZSBwcm92aWRlIGluc3RhbGxlcnMgZm9yIHRoZSBtYWluIG9wZXJhdGluZyBzeXN0ZW1zOiBfV2luZG93c18gKGAubXNpYCksCiAgX09TWF8gKGAuZG1nYCkgYW5kIF9MaW51eF8gKGAuZGViYCkuIFdlIGFsc28gcHJvdmlkZSBhbiB1YmVyLWZhdCBKQVIgZmlsZS4KICBUbyBkb3dubG9hZCB0aGVtLCBzZWUgdGhlIFtSZWxlYXNlIHBhZ2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJGdXp6aW5nL0V2b01hc3Rlci9yZWxlYXNlcykuCiAgUmVsZWFzZSBub3RlcyBhcmUgcHJlc2VudCBpbiB0aGUgZmlsZSBbcmVsZWFzZV9ub3Rlcy5tZF0oaHR0cHM6Ly9naXRodWIuY29tL1dlYkZ1enppbmcvRXZvTWFzdGVyL2Jsb2IvbWFzdGVyL3JlbGVhc2Vfbm90ZXMubWQpLgogIElmIHlvdSBhcmUgdXNpbmcgdGhlIHViZXItZmF0IEpBUiwgaXQgc2hvdWxkIHdvcmsgd2l0aCBhbnkgbWFqb3IgTFRTIHZlcnNpb24gKGZyb20gSkRLIDggb24pLgogICBXaGVyZWFzIGZvciB0aGUgY2xpZW50IGxpYnJhcnksIG5lZWRlZCBmb3Igd2hpdGUtYm94IHRlc3RpbmcsIHdlIHdpbGwgc3VwcG9ydCBKREsgOCBsaWtlbHkgZm9yIGEgbG9uZywgbG9uZyB3aGlsZSwgYmUgd2FybmVkIHRoYXQgZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBleGVjdXRhYmxlIEpBUiBtaWdodCBzdGFydCB0byByZXF1aXJlIGhpZ2hlciB2ZXJzaW9ucyBvZiB0aGUgSkRLIGluIGEgbm9uLXNvLWRpc3RhbnQgZnV0dXJlLgogICBJZiB0aGF0IGlzIGdvaW5nIHRvIGJlIGhpZ2hlciB0aGFuIHlvdXIgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBKVk0sIGlmIHlvdSBjYW5ub3QgdXBncmFkZSBvciBoYXZlIDIgZGlmZmVyZW50IEpES3Mgb24geW91ciBtYWNoaW5lLCB0aGVuIHlvdSBzaG91bGQgbm90IHVzZSB0aGUgdWJlci1qYXIgYnV0IHJhdGhlciBvbmUgb2YgdGhlIGluc3RhbGxlcnMuIAogICBXaGVuIHlvdSB1c2Ugb25lIG9mIHRoZSBpbnN0YWxsZXJzLCBrZWVwIGluIG1pbmQgdGhhdCBjdXJyZW50bHkgdGhleSBkbyBub3QgdXBkYXRlIHRoZSBgUEFUSGAgdmFyaWFibGUuIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBtYW51YWxseSwgW3NlZSBkb2N1bWVudGF0aW9uXShkb2NzL2Rvd25sb2FkLm1kKS4gCgoqIF9TdGF0ZS1vZi10aGUtYXJ0XzogYW4gW2luZGVwZW5kZW50IHN0dWR5ICgyMDIyKV0oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzIyMDQuMDgzNDgpLCBjb21wYXJpbmcgMTAgZnV6emVycyBvbiAyMCBSRVNUZnVsIEFQSXMsIHNob3dzIHRoYXQgX0V2b01hc3Rlcl8gZ2l2ZXMgdGhlIGJlc3QgcmVzdWx0cy4KCiogX1NjaGVtYV86IFJFU1QgQVBJcyBtdXN0IHByb3ZpZGUgYSBzY2hlbWEgaW4gW09wZW5BUEkvU3dhZ2dlcl0oaHR0cHM6Ly9zd2FnZ2VyLmlvKQogIGZvcm1hdCAoZWl0aGVyIF92Ml8gb3IgX3YzXykuCgoqIF9PdXRwdXRfOiB0aGUgdG9vbCBnZW5lcmF0ZXMgX0pVbml0XyAodmVyc2lvbiA0IG9yIDUpIHRlc3RzLCB3cml0dGVuIGluIGVpdGhlciBKYXZhIG9yIEtvdGxpbiwgYXMgd2VsbCBhcyB0ZXN0IHN1aXRlcyBpbiBQeXRob24gYW5kIEphdmFTY3JpcHQuIEZvciBhIGNvbXBsZXRlIGxpc3QsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIENMSSBwYXJhbWV0ZXIgWy0tb3V0cHV0Rm9ybWF0XShkb2NzL29wdGlvbnMubWQpLiAKICBTb21lIGV4YW1wbGVzIGFyZTogUFlUSE9OX1VOSVRURVNULCBLT1RMSU5fSlVOSVRfNSwgSkFWQV9KVU5JVF80IGFuZCBKU19KRVNULgogIE5vdGUgdGhhdCB0aGUgZ2VuZXJhdGVkIHRlc3RzIHJlbHkgb24gdGhpcmQtcGFydHkgbGlicmFyaWVzIChlLmcuLCB0byBtYWtlIEhUVFAgY2FsbHMpLiAKICBUaGVzZSB3aWxsIG5lZWQgdG8gYmUgc2V0dXAgaW4geW91ciBwcm9qZWN0cywgW3NlZSBkb2N1bWVudGF0aW9uXShkb2NzL2xpYnJhcnlfZGVwZW5kZW5jaWVzLm1kKS4KCiogX0ZhdWx0IGRldGVjdGlvbl86IF9Fdm9NYXN0ZXJfIGNhbiBnZW5lcmF0ZSB0ZXN0cyBjYXNlcyB0aGF0IHJldmVhbCBmYXVsdHMvYnVncyBpbiB0aGUgdGVzdGVkIGFwcGxpY2F0aW9ucy4KICBEaWZmZXJlbnQgaGV1cmlzdGljcyBhcmUgZW1wbG95ZWQsIGxpa2UgY2hlY2tpbmcgZm9yIDUwMCBzdGF0dXMgY29kZXMgYW5kIG1pc21hdGNoZXMgZnJvbSB0aGUgQVBJIHNjaGVtYXMuCgoqIF9TZWxmLWNvbnRhaW5lZCB0ZXN0c186IGZvciB3aGl0ZS1ib3ggdGVzdGluZywgdGhlIGdlbmVyYXRlZCB0ZXN0cyBkbyBzdGFydC9zdG9wIHRoZSBhcHBsaWNhdGlvbiwgYmluZGluZyB0byBhbiBlcGhlbWVyYWwgcG9ydC4KICBUaGlzIG1lYW5zIHRoYXQgdGhlIGdlbmVyYXRlZCB0ZXN0cyBjYW4gYmUgdXNlZCBmb3IgX3JlZ3Jlc3Npb24gdGVzdGluZ18gKGUuZy4sIGFkZGVkIHRvIHRoZSBHaXQgcmVwb3NpdG9yeQogIG9mIHRoZSBhcHBsaWNhdGlvbiwgYW5kIHJ1biB3aXRoIGFueSBidWlsZCB0b29sIHN1Y2ggYXMgTWF2ZW4gYW5kIEdyYWRsZSkuCiAgRm9yIGJsYWNrLWJveCB0ZXN0aW5nLCB5b3Ugd2lsbCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgYXBwbGljYXRpb24gaXMgdXAgYW5kIHJ1bm5pbmcgYmVmb3JlIGV4ZWN1dGluZyB0aGUgdGVzdHMuIAoKCiogX1NRTCBoYW5kbGluZ186IGZvciB3aGl0ZS1ib3ggdGVzdGluZywgX0V2b01hc3Rlcl8gY2FuIGludGVyY2VwdCBhbmQgYW5hbHlzZSBhbGwgY29tbXVuaWNhdGlvbnMgZG9uZSB3aXRoIFNRTCBkYXRhYmFzZXMsIGFuZCB1c2UKICBzdWNoIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIGhpZ2hlciBjb2RlIGNvdmVyYWdlIHRlc3QgY2FzZXMuIEZ1cnRoZXJtb3JlLCBpdCBjYW4gZ2VuZXJhdGUgZGF0YSBkaXJlY3RseQogIGludG8gdGhlIGRhdGFiYXNlcywgYW5kIGhhdmUgc3VjaCBpbml0aWFsaXphdGlvbiBhdXRvbWF0aWNhbGx5IGFkZGVkIGluIHRoZSBnZW5lcmF0ZWQgdGVzdHMuCiAgQXQgdGhlIG1vbWVudCwgX0V2b01hc3Rlcl8gc3VwcG9ydHMgX1Bvc3RncmVzXywgX015U1FMXyBhbmQgX0gyXyAgZGF0YWJhc2VzLgoKCiogX0F1dGhlbnRpY2F0aW9uXzogd2Ugc3VwcG9ydCBhdXRoIGJhc2VkIG9uIGF1dGhlbnRpY2F0aW9uIGhlYWRlcnMgYW5kIGNvb2tpZXMuCiAgQmVzaWRlcyB1c2luZyBmaXhlZCBIVFRQIGhlYWRlcnMsIAogIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZGVjbGFyYXRpdmVseSBzcGVjaWZ5IHdoaWNoIGxvZ2luIGVuZHBvaW50IHNob3VsZCBiZSB1c2VkIHRvIGR5bmFtaWNhbGx5IG9idGFpbiBhdXRoZW50aWNhdGlvbiBpbmZvIChlLmcuLCBhdXRoIHRva2VucyBvciBjb29raWVzKSBmb3IgZWFjaCB0ZXN0IGV4ZWN1dGlvbi4gW1NlZSBkb2N1bWVudGF0aW9uXShkb2NzL2F1dGgubWQpLgoKX19Lbm93biBsaW1pdGF0aW9uc19fOgoKKiBfRHJpdmVyXzogdG8gYmUgdXNlZCBmb3IgX3doaXRlLWJveF8gdGVzdGluZywgdXNlcnMgbmVlZCB0byB3cml0ZSBhIFtkcml2ZXIgbWFudWFsbHldKGRvY3Mvd3JpdGVfZHJpdmVyLm1kKS4KICBXZSByZWNvbW1lbmQgdG8gdHJ5IF9ibGFjay1ib3hfIG1vZGUgZmlyc3QgKHNob3VsZCBqdXN0IG5lZWQgYSBmZXcgbWludXRlcyB0byBnZXQgaXQgdXAgYW5kIHJ1bm5pbmcpIHRvIGdldAogIGFuIGlkZWEgb2Ygd2hhdCBfRXZvTWFzdGVyXyBjYW4gZG8gZm9yIHlvdS4KCiogX0pESyA5K186IHdoaXRlLWJveCB0ZXN0aW5nIHJlcXVpcmVzIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbi4gCiAgICAgICAgICAgIEVhY2ggbmV3IHJlbGVhc2Ugb2YgdGhlIEpESyBtYWtlcyBkb2luZyB0aGlzIGhhcmRlciBhbmQgaGFyZGVyLiAKICAgICAgICAgICAgRGVhbGluZyB3aXRoIEpES3MgYWJvdmUgX184X18gaXMgZG9hYmxlLCBidXQgaXQgcmVxdWlyZXMgc29tZSBzZXR0aW5ncy4KICAgICAgICAgICAgW1NlZSBkb2N1bWVudGF0aW9uXShkb2NzL2pka3MubWQpLgoKKiBfRXhlY3V0aW9uIHRpbWVfOiB0byBnZXQgZ29vZCByZXN1bHRzLCB5b3UgbWlnaHQgbmVlZCB0byBydW4gdGhlIHNlYXJjaCBmb3Igc2V2ZXJhbCBob3Vycy4KICBXZSByZWNvbW1lbmQgdG8gZmlyc3QgdHJ5IHRoZSBzZWFyY2ggZm9yIDEwIG1pbnV0ZXMsIGp1c3QgdG8gZ2V0IGFuIGlkZWEgb2Ygd2hhdCB0eXBlIG9mIHRlc3RzIGNhbiBiZSBnZW5lcmF0ZWQuCiAgQnV0LCB0aGVuLCB5b3Ugc2hvdWxkIHJ1biBfRXZvTWFzdGVyXyBmb3Igc29tZXRoaW5nIGxpa2UgYmV0d2VlbiAxIGFuZCAyNCBob3VycyAodGhlIGxvbmdlciB0aGUgYmV0dGVyLCBidXQKICBpdCBpcyB1bmxpa2VseSB0byBnZXQgYmV0dGVyIHJlc3VsdHMgYWZ0ZXIgMjQgaG91cnMpLgoKKiBfUlBDIEFQSXNfOiBmb3IgdGhlIG1vbWVudCwgd2UgZG8gbm90IGRpcmVjdGx5IHN1cHBvcnQgUlBDIHNjaGVtYSBkZWZpbml0aW9ucy4gRnV6emluZyBSUEMgQVBJcyByZXF1aXJlcyB0byB3cml0ZSBhIGRyaXZlciwgdXNpbmcgdGhlIGNsaWVudCBsaWJyYXJ5IG9mIHRoZSBBUEkgdG8gbWFrZSB0aGUgY2FsbHMuCgoqIF9FeHRlcm5hbCBzZXJ2aWNlc186IChlLmcuLCBvdGhlciBSRVNUZnVsIEFQSXMpIGN1cnJlbnRseSB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciB0aGVtIChlLmcuLCB0byBhdXRvbWF0aWNhbGx5IG1vY2sgdGhlbSkuCiAgSXQgaXMgd29yayBpbiBwcm9ncmVzcy4KCiogX05vU1FMIGRhdGFiYXNlc186IChlLmcuLCBNb25nb0RCKSBjdXJyZW50bHkgbm8gc3VwcG9ydC4gSXQgaXMgd29yayBpbiBwcm9ncmVzcy4KCiogX0ZhaWxpbmcgdGVzdHNfOiB0aGUgdGVzdHMgZ2VuZXJhdGVkIGJ5IF9Fdm9NYXN0ZXJfIHNob3VsZCBhbGwgcGFzcywgYW5kIG5vdCBmYWlsLCBldmVuIHdoZW4gdGhleSBkZXRlY3QgYSBmYXVsdC4KICBJbiB0aG9zZSBjYXNlcywgY29tbWVudHMvdGVzdC1uYW1lcyB3b3VsZCBwb2ludCBvdXQgdGhhdCBhIHRlc3QgaXMgcmV2ZWFsaW5nIGEgcG9zc2libGUgZmF1bHQsIHdoaWxlIHN0aWxsIHBhc3NpbmcuCiAgSG93ZXZlciwgaW4gc29tZSBjYXNlcyB0aGUgZ2VuZXJhdGVkIHRlc3RzIG1pZ2h0IGZhaWwuIFRoaXMgaXMgZHVlIHRvIHRoZSBzbyBjYWxsZWQgX2ZsYWt5XyB0ZXN0cywgZS5nLiwgd2hlbgogIGEgdGVzdCBoYXMgYXNzZXJ0aW9ucyBiYXNlZCBvbiB0aGUgdGltZSBjbG9jayAoZS5nLiwgZGF0ZXMgYW5kIHRpbWVzdGFtcHMpLgogIFRoZXJlIGlzIG9uZ29pbmcgZWZmb3J0IHRvIGFkZHJlc3MgdGhpcyBwcm9ibGVtLCBidXQgaXQgaXMgc3RpbGwgbm90IGZ1bGx5IHNvbHZlZC4KCjwhLS0jIyMgVmlkZW9zLS0tPiAKPCEtLSAKPGRpdj5JY29ucyBtYWRlIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmZsYXRpY29uLmNvbS9hdXRob3JzL2ZyZWVwaWsiIHRpdGxlPSJGcmVlcGlrIj5GcmVlcGlrPC9hPiBmcm9tIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmZsYXRpY29uLmNvbS8iIHRpdGxlPSJGbGF0aWNvbiI+d3d3LmZsYXRpY29uLmNvbTwvYT48L2Rpdj4gCi0tPgoKCiMjIyBWaWRlb3MKCiFbXShkb2NzL2ltZy92aWRlby1wbGF5ZXItZmxhdGljb24ucG5nKQoKKiBBIFtzaG9ydCB2aWRlb10oaHR0cHM6Ly95b3V0dS5iZS8zbVl4amduaExFbykgKDUgbWludXRlcykKICBzaG93cyB0aGUgdXNlIG9mIF9Fdm9NYXN0ZXJfIG9uIG9uZSBvZiB0aGUKICBjYXNlIHN0dWRpZXMgaW4gW0VNQl0oaHR0cHM6Ly9naXRodWIuY29tL1dlYkZ1enppbmcvRU1CKS4KCiogVGhpcyBbMTMtbWludXRlIHZpZGVvXShodHRwczovL3lvdXR1LmJlL09SeFpvWXc3TG5NKQogIHNob3dzIGhvdyB0byB3cml0ZSBhIHdoaXRlLWJveCBkcml2ZXIgZm9yIEV2b01hc3RlciwgZm9yIHRoZQogIFtyZXN0LWFwaS1leGFtcGxlXShodHRwczovL2dpdGh1Yi5jb20vV2ViRnV6emluZy9yZXN0LWFwaS1leGFtcGxlKS4KCiogSG93IHRvIFtEb3dubG9hZCBhbmQgSW5zdGFsbCBFdm9NYXN0ZXIgb24gV2luZG93cyAxMF0oaHR0cHM6Ly95b3V0dS5iZS91aF9Yekd4d3M5byksIHVzaW5nIGl0cyBfLm1zaV8gaW5zdGFsbGVyLgoKKiBbU2hvcnQgcHJlc2VudGF0aW9uXShodHRwczovL3lvdXR1LmJlL2lRU0FscnItUFpvKSAoNSBtaW51dGVzKSBhYm91dCB2ZXJzaW9uIDIuMC4wLiAKCiMjIyBBbHRlcm5hdGl2ZXMKCkluIHRoZSBsYXN0IGZldyB5ZWFycywgc2V2ZXJhbCBmZXcgdG9vbHMgaGF2ZSBiZWVuIHByb3Bvc2VkIGluIHRoZSBhY2FkZW1pYyBsaXRlcmF0dXJlIGFuZCBpbiB0aGUgb3Blbi1zb3VyY2UgY29tbXVuaXR5LgpZb3UgY2FuIHJlYWQgbW9yZSBkZXRhaWxzIGluIHRoaXMgWzIwMjMgc3VydmV5XShkb2NzL3B1YmxpY2F0aW9ucy8yMDIzX3Rvc2VtX3N1cnZleS5wZGYpIG9uIFJFU1QgQVBJIHRlc3RpbmcuCgpFeGlzdGluZyBvcGVuLXNvdXJjZSB0b29scyBmb3IgUkVTVCBBUEkgZnV6emluZyBhcmUgZm9yIGV4YW1wbGUgKGluIGFscGhhYmV0aWMgb3JkZXIpOgpbQ0FUU10oaHR0cHM6Ly9naXRodWIuY29tL0VuZGF2YS9jYXRzKSwKW0RyZWRkXShodHRwczovL2dpdGh1Yi5jb20vYXBpYXJ5aW8vZHJlZGQpLApbRnV6ei1saWdodHllYXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9ZZWxwL2Z1enotbGlnaHR5ZWFyKSwKW1Jlc1Rlc3RdKGh0dHBzOi8vZ2l0aHViLmNvbS9pc2EtZ3JvdXAvUkVTVGVzdCksCltSZXN0Q1RdKGh0dHBzOi8vZ2l0aHViLmNvbS9HSVNULU5KVS9SZXN0Q1QpLApbUmVzdGxlcl0oaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9yZXN0bGVyLWZ1enplciksCltSZXN0VGVzdEdlbl0oaHR0cHM6Ly9naXRodWIuY29tL1NlVW5pVnIvUmVzdFRlc3RHZW4pLAphbmQKW1NjaGVtYXRoZXNpc10oaHR0cHM6Ly9naXRodWIuY29tL3NjaGVtYXRoZXNpcy9zY2hlbWF0aGVzaXMpLgoKQWxsIHRoZXNlIHRvb2xzIGFyZSBfYmxhY2stYm94XywgaS5lLiwgdGhleSBkbyBub3QgYW5hbHl6ZSB0aGUgc291cmNlLWNvZGUgb2YgdGhlIHRlc3RlZCBBUElzIHRvIGdlbmVyYXRlIG1vcmUgZWZmZWN0aXZlIHRlc3QgZGF0YS4KQXMgd2UgYXJlIHRoZSBhdXRob3JzIG9mIEV2b01hc3Rlciwgd2UgYXJlIHRvbyBiaWFzZWQgdG8gY29tcGFyZSBpdCBwcm9wZXJseSB3aXRoIHRob3NlIG90aGVyIGJsYWNrLWJveCB0b29scy4KSG93ZXZlciwgYW4gW2luZGVwZW5kZW50IHN0dWR5ICgyMDIyKV0oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzIyMDQuMDgzNDgpIHNob3dzIHRoYXQgRXZvTWFzdGVyIGlzIGFtb25nIHRoZSBiZXN0IHBlcmZvcm1hbnQuCkZ1cnRoZXJtb3JlLCBpZiB5b3VyIEFQSXMgYXJlIHJ1bm5pbmcgb24gdGhlIEpWTSAoZS5nLiwgd3JpdHRlbiBpbiBKYXZhIG9yIEtvdGxpbiksIHRoZW4gRXZvTWFzdGVyIGhhcyBjbGVhcmx5IGFuIGFkdmFudGFnZSwgYXMgaXQgc3VwcG9ydHMgX3doaXRlLWJveF8gdGVzdGluZy4gCgo8IS0tLQojIyMgSGlyaW5nCgpEZXBlbmRpbmcgb24gdGhlIHllYXIsIHdlIG1pZ2h0IGhhdmUgZnVuZGluZyBmb3IgX3Bvc3Rkb2NfIGFuZCBfUGhEIHN0dWRlbnRfIHBvc2l0aW9ucyB0byB3b3JrIG9uIHRoaXMgcHJvamVjdCAoaW4gT3NsbywgTm9yd2F5KS4KCkN1cnJlbnQgb3BlbiBwb3NpdGlvbnM6IG5vbmUuCjwgIS0tLQoqIDIwMjM6IFBoRCBzdHVkZW50IHBvc2l0aW9ucy4gTm8gbmV3IGNhbGxzIHNjaGVkdWxlZCBmb3IgdGhlIG1vbWVudC4KKiAyMDIzOiBQb3N0ZG9jIHBvc2l0aW9ucy4gTm8gbmV3IGNhbGxzIHNjaGVkdWxlZCBmb3IgdGhlIG1vbWVudC4KLS0tID4KCkZvciBxdWVzdGlvbnMgb24gdGhlc2UgcG9zaXRpb25zLCBwbGVhc2UgY29udGFjdCBQcm9mLiBBbmRyZWEgQXJjdXJpLgoKPCAhLS0tCkZvciBtb3JlIGRldGFpbHMgb24gY3VycmVudCB2YWNhbmNpZXMsIHNlZSBvdXIgZ3JvdXAgcGFnZSBhdCBbQUlTRSBMYWJdKGh0dHBzOi8vZW1yZXNlYXJjaC5naXRodWIuaW8vKS4KLS0tPgoKCgojIyMgRG9jdW1lbnRhdGlvbgoKSWYgeW91IGFyZSB0cnlpbmcgdG8gdXNlIF9Fdm9NYXN0ZXJfLCBidXQgdGhlIGluc3RydWN0aW9ucyBpbiB0aGlzIGRvY3VtZW50YXRpb24gYXJlIG5vdCBlbm91Z2ggdG8gZ2V0IHlvdSBzdGFydGVkLCBvciB0aGV5IGFyZSB0b28gdW5jbGVhciwgdGhlbiBpdCBtZWFucyBpdCBpcyBhIF9idWdfIGluIHRoZSBkb2N1bWVudGF0aW9uLCB3aGljaCB0aGVuIHdvdWxkIG5lZWQgdG8gYmUgY2xhcmlmaWVkIGFuZCB1cGRhdGVkLiBJbiBzdWNoIGNhc2VzLCBwbGVhc2UgY3JlYXRlIGEgbmV3IFtpc3N1ZV0oaHR0cHM6Ly9naXRodWIuY29tL1dlYkZ1enppbmcvRXZvTWFzdGVyL2lzc3VlcykuCgpBbHNvLCBmZWVsIGZyZWUgdG8gc3RhcnQgbmV3IGRpc2N1c3Npb24gdG9waWNzIGluIHRoZSBbRGlzY3Vzc2lvbnMgZm9ydW1dKGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJGdXp6aW5nL0V2b01hc3Rlci9kaXNjdXNzaW9ucykuCklmIHlvdSBoYXZlIHRpbWUsIHBsZWFzZSBjb25zaWRlciBhbnN3ZXJpbmcgdGhlIHBvbGxzIHRoZXJlLgoKSWYgeW91IGFyZSB3b3JraW5nIG9uIGFuIG9wZW4tc291cmNlIEFQSSwgeW91IGNhbiBkcm9wIHVzIGEgbWVzc2FnZSBpZiB5b3UgaGF2ZSBwcm9ibGVtcyB1c2luZyBFdm9NYXN0ZXIgb24gaXQuIApPdGhlcndpc2UsIGlmIHlvdSBhcmUgd29ya2luZyBpbiBpbmR1c3RyeSBvbiBjbG9zZWQtc291cmNlIEFQSXMsIHdlIGhhdmUgb3B0aW9ucyBmb3IgYWNhZGVtaWEtaW5kdXN0cnkgY29sbGFib3JhdGlvbnMgKFtzZWUgbW9yZSBpbmZvIGhlcmVdKGRvY3MvY29udHJpYnV0ZS5tZCkpLiAgCgoKKiBbRXhhbXBsZSBvZiBnZW5lcmF0ZWQgdGVzdHNdKGRvY3MvZXhhbXBsZS5tZCkKKiBbRG93bmxvYWQgYW5kIEluc3RhbGwgRXZvTWFzdGVyXShkb2NzL2Rvd25sb2FkLm1kKQoqIFtCdWlsZCBFdm9NYXN0ZXIgZnJvbSBzb3VyY2VdKGRvY3MvYnVpbGQubWQpCiogW0NvbW1hbmQtTGluZSBJbnRlcmZhY2UgKENMSSkgb3B0aW9uc10oZG9jcy9vcHRpb25zLm1kKQoqIFtPcGVuQXBpL1N3YWdnZXIgU2NoZW1hXShkb2NzL29wZW5hcGkubWQpCiogW1VzaW5nIEV2b01hc3RlciBmb3IgQmxhY2stQm94IFRlc3RpbmcgKGVhc2llciB0byBzZXR1cCwgYnV0IHdvcnNlIHJlc3VsdHMpXShkb2NzL2JsYWNrYm94Lm1kKQoqIFtVc2luZyBFdm9NYXN0ZXIgZm9yIFdoaXRlLUJveCBUZXN0aW5nIChoYXJkZXIgdG8gc2V0dXAsIGJ1dCBiZXR0ZXIgcmVzdWx0cyldKGRvY3Mvd2hpdGVib3gubWQpCiAgKiBbV3JpdGUgYW4gRXZvTWFzdGVyIERyaXZlciBmb3IgV2hpdGUtQm94IFRlc3RpbmddKGRvY3Mvd3JpdGVfZHJpdmVyLm1kKQogICogW0RlYWxpbmcgd2l0aCBKREtzIGFib3ZlIHZlcnNpb24gOF0oZG9jcy9qZGtzLm1kKQoqIFtDb25maWd1cmluZyBhdXRoZW50aWNhdGlvbl0oZG9jcy9hdXRoLm1kKSAgCiogW0NvbnNvbGUgb3V0cHV0XShkb2NzL2NvbnNvbGVfb3V0cHV0Lm1kKQoqIFtMaWJyYXJ5IGRlcGVuZGVuY2llcyBmb3IgdGhlIGdlbmVyYXRlZCB0ZXN0c10oZG9jcy9saWJyYXJ5X2RlcGVuZGVuY2llcy5tZCkKKiBbSG93IHRvIGNvbnRyaWJ1dGVdKGRvY3MvY29udHJpYnV0ZS5tZCkKICAqIFtUZWNobmljYWwgbm90ZXMgZm9yIGRldmVsb3BlcnMgY29udHJpYnV0aW5nIHRvIEV2b01hc3Rlcl0oZG9jcy9mb3JfZGV2ZWxvcGVycy5tZCkKKiBUcm91Ymxlc2hvb3RpbmcKICAqIFtXaW5kb3dzIGFuZCBuZXR3b3JraW5nXShkb2NzL3Ryb3VibGVzaG9vdGluZy93aW5kb3dzLm1kKQoqIE1vcmUgSW5mbwogICogW0FjYWRlbWljIHBhcGVycyByZWxhdGVkIHRvIEV2b01hc3Rlcl0oZG9jcy9wdWJsaWNhdGlvbnMubWQpCiAgKiBbU2xpZGVzIG9mIHByZXNlbnRhdGlvbnMvc2VtaW5hcnNdKGRvY3MvcHJlc2VudGF0aW9ucy5tZCkKICAqIFtSZXBsaWNhdGluZyBzdHVkaWVzXShkb2NzL3JlcGxpY2F0aW5nX3N0dWRpZXMubWQpCgoKCgoKCiMjIyBGdW5kaW5nCgpfRXZvTWFzdGVyXyBoYXMgYmVlbiBmdW5kZWQgYnk6CiogMjAyMC0yMDI1OiBhIDIgbWlsbGlvbiBFdXJvIGdyYW50IGJ5IHRoZSBFdXJvcGVhbiBSZXNlYXJjaCBDb3VuY2lsIChFUkMpLAogIGFzIHBhcnQgb2YgdGhlICpFUkMgQ29uc29saWRhdG9yKiBwcm9qZWN0CiAgPGk+VXNpbmcgRXZvbHV0aW9uYXJ5IEFsZ29yaXRobXMgdG8gVW5kZXJzdGFuZCBhbmQgU2VjdXJlIFdlYi9FbnRlcnByaXNlIFN5c3RlbXM8L2k+LgoqICAyMDE4LTIwMjE6IGEgNy44IG1pbGxpb24gTm9yd2VnaWFuIEtyb25lciBncmFudCAgYnkgdGhlIFJlc2VhcmNoIENvdW5jaWwgb2YgTm9yd2F5IChSQ04pLAogICBhcyBwYXJ0IG9mIHRoZSBGcmluYXRlayBwcm9qZWN0IDxpPkV2b2x1dGlvbmFyeSBFbnRlcnByaXNlIFRlc3Rpbmc8L2k+LgoKCjxpbWcgc3JjPSJodHRwczovL2dpdGh1Yi5jb20vV2ViRnV6emluZy9Fdm9NYXN0ZXIvYmxvYi9tYXN0ZXIvZG9jcy9pbWcvTE9HT19FUkMtRkxBR19FVV8uanBnP3Jhdz10cnVlIiB3aWR0aD0iMjAwIiA+CgoKVGhpcyBwcm9qZWN0IGhhcyByZWNlaXZlZCBmdW5kaW5nIGZyb20gdGhlIEV1cm9wZWFuIFJlc2VhcmNoIENvdW5jaWwgKEVSQykgdW5kZXIgdGhlIEV1cm9wZWFuIFVuaW9u4oCZcyBIb3Jpem9uIDIwMjAgcmVzZWFyY2ggYW5kIGlubm92YXRpb24gcHJvZ3JhbW1lIChncmFudCBhZ3JlZW1lbnQgTm8gODY0OTcyKS4KCgojIyMgTGljZW5zZQpfRXZvTWFzdGVyXydzIHNvdXJjZSBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBMR1BMICh2MykgbGljZW5zZS4KRm9yIGEgbGlzdCBvZiB0aGUgdXNlZCB0aGlyZC1wYXJ0eSBsaWJyYXJpZXMsIHlvdSBjYW4gZGlyZWN0bHkgc2VlIHRoZSByb290IFtwb20ueG1sXSguL3BvbS54bWwpIGZpbGUuCkZvciBhIGxpc3Qgb2YgY29kZSBkaXJlY3RseSBpbXBvcnRlZCAoYW5kIHRoZW4gcG9zc2libHkgbW9kaWZpZWQvdXBkYXRlZCkgZnJvbQpvdGhlciBvcGVuLXNvdXJjZSBwcm9qZWN0cywgc2VlIFtoZXJlXSguL2RvY3MvcmV1c2VkX2NvZGUubWQpLgoKCjwhLS0KIyMjICFbXShodHRwczovL3d3dy55b3Vya2l0LmNvbS9pbWFnZXMveWtsb2dvLnBuZykKCllvdXJLaXQgc3VwcG9ydHMgb3BlbiBzb3VyY2UgcHJvamVjdHMgd2l0aCBpdHMgZnVsbC1mZWF0dXJlZCBKYXZhIFByb2ZpbGVyLgpZb3VyS2l0LCBMTEMgaXMgdGhlIGNyZWF0b3Igb2YKPGEgaHJlZj0iaHR0cHM6Ly93d3cueW91cmtpdC5jb20vamF2YS9wcm9maWxlci8iPllvdXJLaXQgSmF2YSBQcm9maWxlcjwvYT4KYW5kCjxhIGhyZWY9Imh0dHBzOi8vd3d3LnlvdXJraXQuY29tLy5uZXQvcHJvZmlsZXIvIj5Zb3VyS2l0IC5ORVQgUHJvZmlsZXI8L2E+LAppbm5vdmF0aXZlIGFuZCBpbnRlbGxpZ2VudCB0b29scyBmb3IgcHJvZmlsaW5nIEphdmEgYW5kIC5ORVQgYXBwbGljYXRpb25zLgotLT4KCg==
+ readmeEtag: '"10125b606a840537a2312b4e2f031b032c12781a"'
+ readmeLastModified: Sun, 06 Oct 2024 20:34:52 GMT
repositoryId: 92385933
description: >-
The first open-source AI-driven tool for automatically generating
@@ -33398,17 +33403,17 @@
applications. Currently targeting whitebox and blackbox testing of Web
APIs, like REST, GraphQL and RPC (e.g., gRPC and Thrift).
created: '2017-05-25T09:11:23Z'
- updated: '2024-10-05T16:53:25Z'
+ updated: '2024-10-06T20:34:56Z'
language: Kotlin
archived: false
- stars: 499
+ stars: 500
watchers: 24
forks: 83
owner: WebFuzzing
logo: https://avatars.githubusercontent.com/u/29148026?v=4
license: LGPL-3.0
- repoEtag: '"406b9052d3f438e942c1a8352bfe1c94c39865265257e0e7b0160fe88b9176fd"'
- repoLastModified: Sat, 05 Oct 2024 16:53:25 GMT
+ repoEtag: '"43ab3735ac622ae60765ef27d352a7098aa28de6b65ae5a7435fdf0e8abe16e5"'
+ repoLastModified: Sun, 06 Oct 2024 20:34:56 GMT
foundInMaster: true
id: d1d3d85149c4a9437dbdbf157cf3d7c7
oldLocations:
@@ -33791,17 +33796,17 @@
Convert API descriptions between popular formats such as OpenAPI(fka
Swagger), RAML, API Blueprint, WADL, etc.
created: '2015-05-05T18:30:05Z'
- updated: '2024-10-02T18:32:57Z'
+ updated: '2024-10-06T14:23:32Z'
language: JavaScript
archived: false
- stars: 1109
+ stars: 1110
watchers: 22
forks: 180
owner: LucyBot-Inc
logo: https://avatars.githubusercontent.com/u/26313641?v=4
license: MIT
- repoEtag: '"8c61fb34728b39d99339fa4f60819afcaad846cc202397663486f515a0f2b994"'
- repoLastModified: Wed, 02 Oct 2024 18:32:57 GMT
+ repoEtag: '"0c7a63ac8b6829f24ce58185793b5cc65f56c8798d3b3593240d30a4fd6bf08a"'
+ repoLastModified: Sun, 06 Oct 2024 14:23:32 GMT
foundInMaster: true
id: dccbe92257187d6d136bb4b5f304d6fe
- source: https://openapi.tools/
@@ -34726,17 +34731,17 @@
repositoryId: 586543156
description: The ultimate toolkit for working with APIs.
created: '2023-01-08T14:15:23Z'
- updated: '2024-10-05T13:02:51Z'
+ updated: '2024-10-06T19:07:09Z'
language: TypeScript
archived: false
- stars: 669
+ stars: 670
watchers: 5
- forks: 53
+ forks: 54
owner: kubb-labs
logo: https://avatars.githubusercontent.com/u/122118236?v=4
license: MIT
- repoEtag: '"782a47ebaa337d96fa9800087cd1ecd67e38fcdcb8d64beed7026a14791b5b03"'
- repoLastModified: Sat, 05 Oct 2024 13:02:51 GMT
+ repoEtag: '"6c8e691d51a61f3c37946b85ebc59a612db4a544f1c99e2951db7588e23d8941"'
+ repoLastModified: Sun, 06 Oct 2024 19:07:09 GMT
foundInMaster: true
oldLocations:
- https://github.com/kubb-project/kubb
@@ -34834,17 +34839,17 @@
Full stack, modern web application template. Using FastAPI, React,
SQLModel, PostgreSQL, Docker, GitHub Actions, automatic HTTPS and more.
created: '2019-02-23T15:08:34Z'
- updated: '2024-10-06T02:27:02Z'
+ updated: '2024-10-07T03:11:49Z'
language: TypeScript
archived: false
- stars: 26639
- watchers: 263
- forks: 4693
+ stars: 26657
+ watchers: 262
+ forks: 4694
owner: fastapi
logo: https://avatars.githubusercontent.com/u/156354296?v=4
license: MIT
- repoEtag: '"070408ff06f031f30e998475e2540f90191a5491317f5500cf138adfc3f0d66d"'
- repoLastModified: Sun, 06 Oct 2024 02:27:02 GMT
+ repoEtag: '"1d6765df602f39fbbe9cfc2cc525c5ddc95bf673507fb14fff18fc1e178b3acb"'
+ repoLastModified: Mon, 07 Oct 2024 03:11:49 GMT
foundInMaster: true
category: Server Implementations
id: 0354007b562b4efc3f08ce3da7f03afb
@@ -35518,7 +35523,7 @@
forks: 12
owner: uibakery
logo: https://avatars.githubusercontent.com/u/92528127?v=4
- repoEtag: '"425c32ff6d3411acd6c07e8cc8bb8ce5a4020798a2b9cd466892d7cd01d15bdd"'
+ repoEtag: '"87e68f3a41cbd8fa589f7e1afdf29dd67281a14636c9b57203f2a7870af2c027"'
repoLastModified: Sat, 05 Oct 2024 00:26:58 GMT
category: Server Implementations
- source: openapi3 tags
@@ -38847,7 +38852,7 @@
Supports out of the box filtering, along with sorting and projection
support
created: '2021-12-29T04:18:26Z'
- updated: '2024-04-24T00:33:51Z'
+ updated: '2024-10-07T00:17:39Z'
language: JavaScript
archived: false
stars: 0
@@ -38856,8 +38861,8 @@
owner: saurhkumar
logo: https://avatars.githubusercontent.com/u/2967058?v=4
license: MIT
- repoEtag: '"bd9f36a8e26b795e22259f7b4682d1f910aaf1f2a96fd49d5631812eba57cf1e"'
- repoLastModified: Wed, 24 Apr 2024 00:33:51 GMT
+ repoEtag: '"8b39b5ca70f3ee9655b522456566fe34704c6a3a82af154ecbcb7f7bc3715814"'
+ repoLastModified: Mon, 07 Oct 2024 00:17:39 GMT
category: Server Implementations
foundInMaster: true
oldLocations:
@@ -39733,17 +39738,17 @@
Examples and server integrations for generating the Swagger API
Specification, which enables easy access to your REST API
created: '2011-07-05T23:44:11Z'
- updated: '2024-10-05T03:10:13Z'
+ updated: '2024-10-06T16:45:42Z'
language: Java
archived: false
- stars: 7374
+ stars: 7375
watchers: 311
- forks: 2174
+ forks: 2176
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"aaaedd191b031ffda3defe5d1ab692da6082fab63bf27ff22301544a2c3b29a1"'
- repoLastModified: Sat, 05 Oct 2024 03:10:13 GMT
+ repoEtag: '"7f0573778954ddecb1e3c31dfd8a0724b4e9cdf2c24ef804d8ab84b37d4967b3"'
+ repoLastModified: Sun, 06 Oct 2024 16:45:42 GMT
id: 266d60df2d48ad8a47539de3c1071f3a
- source: IMPLEMENTATIONS.md
name: Microsoft.OpenApi.net
@@ -39977,11 +39982,11 @@
archived: false
stars: 218
watchers: 20
- forks: 53
+ forks: 54
owner: Cornutum
logo: https://avatars.githubusercontent.com/u/11477145?v=4
license: MIT
- repoEtag: '"4e21dbadfcd911dd3971b921ae955857f1f7e1501602300b587f29f62645963d"'
+ repoEtag: '"b70e0ee59614dee78e192e25ce9b905c342d5ee0e492c1706ef454549bb780b5"'
repoLastModified: Fri, 04 Oct 2024 18:31:46 GMT
id: 14da7572a7632f9a9fb1c1ab2acef586
- source: IMPLEMENTATIONS.md
@@ -40951,17 +40956,17 @@
LoopBack makes it easy to build modern API applications that require
complex integrations.
created: '2017-01-09T17:27:14Z'
- updated: '2024-10-06T02:17:36Z'
+ updated: '2024-10-07T00:55:49Z'
language: TypeScript
archived: false
- stars: 4942
+ stars: 4944
watchers: 136
forks: 1063
owner: loopbackio
logo: https://avatars.githubusercontent.com/u/22173486?v=4
license: NOASSERTION
- repoEtag: '"6912f1d3cd45898961b56242a613983d6fcfac10df206c9f8a8cacca9ab3e0cb"'
- repoLastModified: Sun, 06 Oct 2024 02:17:36 GMT
+ repoEtag: '"136659dcd0ea42160339feec98ece7aa501cd7b6c60bc4bcc5b336c1270bf3e0"'
+ repoLastModified: Mon, 07 Oct 2024 00:55:49 GMT
foundInMaster: true
id: 9132c25ad468bed25b9dbbe3a352abc2
v3: true
@@ -41498,7 +41503,7 @@
owner: neo-f
logo: https://avatars.githubusercontent.com/u/20187646?v=4
license: MIT
- repoEtag: '"79c4b27ea3cb6a3310a00645ca06a4a02345a22550e1951fef0a571f69610537"'
+ repoEtag: '"86c056087b132ea3a4aa82ba8ba9bd91f20ce623ebd26219d1931b9e4542f389"'
repoLastModified: Thu, 05 Sep 2024 03:42:10 GMT
category: Parsers
foundInMaster: true
@@ -41715,17 +41720,17 @@
repositoryId: 26628954
description: HTTP web applications for Vert.x
created: '2014-11-14T08:15:20Z'
- updated: '2024-10-05T21:15:29Z'
+ updated: '2024-10-06T04:26:21Z'
language: Java
archived: false
- stars: 1107
+ stars: 1108
watchers: 82
- forks: 531
+ forks: 532
owner: vert-x3
logo: https://avatars.githubusercontent.com/u/8124623?v=4
license: Apache-2.0
- repoEtag: '"a36e949a4a3e58361b393993b2fd638c11367fac72760b773cfa81bf5da47297"'
- repoLastModified: Sat, 05 Oct 2024 21:15:29 GMT
+ repoEtag: '"e7048822bcaabff0001441c6a6e04f57e720df85e023f419af9ed0d4ba398728"'
+ repoLastModified: Sun, 06 Oct 2024 04:26:21 GMT
foundInMaster: true
v3_link: https://github.com/vert-x3/vertx-web/issues/1872
id: 649e1f8cd9ccaccf681527e6984f2785