diff --git a/docs/categories/all.html b/docs/categories/all.html
index 18af5bc7..905ca6b6 100644
--- a/docs/categories/all.html
+++ b/docs/categories/all.html
@@ -234,7 +234,7 @@
No
Yes |
Yes |
- 4475 |
+ 4474 |
@@ -334,7 +334,7 @@ Yes |
Yes |
No |
- 210 |
+ 211 |
@@ -357,7 +357,7 @@ Yes |
Yes |
Yes |
- 6229 |
+ 6239 |
@@ -380,7 +380,7 @@ Yes |
No |
No |
- 1172 |
+ 1173 |
@@ -403,7 +403,7 @@ No |
Yes |
No |
- 1702 |
+ 1703 |
@@ -466,7 +466,7 @@ Yes |
Yes |
Yes |
- 23353 |
+ 23358 |
@@ -887,7 +887,7 @@ No |
Yes |
Yes |
- 21424 |
+ 21427 |
@@ -933,7 +933,7 @@ No |
Yes |
Yes |
- 2862 |
+ 2863 |
@@ -1091,7 +1091,7 @@ Yes |
Yes |
Yes |
- 8886 |
+ 8887 |
@@ -1134,7 +1134,7 @@ Yes |
Yes |
Yes |
- 35 |
+ 36 |
@@ -1410,7 +1410,7 @@ Yes |
Yes |
Yes |
- 4246 |
+ 4248 |
@@ -1433,7 +1433,7 @@ Yes |
Yes |
Yes |
- 1360 |
+ 1361 |
@@ -1587,7 +1587,7 @@ Yes |
Yes |
Yes |
- 1070 |
+ 1077 |
@@ -1922,7 +1922,7 @@ No |
Yes |
No |
- 913 |
+ 914 |
@@ -1989,7 +1989,7 @@ No |
Yes |
No |
- 1632 |
+ 1633 |
@@ -2098,7 +2098,7 @@ Yes |
Yes |
Yes |
- 909 |
+ 911 |
@@ -2341,7 +2341,7 @@ No |
Yes |
Yes |
- 2568 |
+ 2569 |
@@ -2710,7 +2710,7 @@ No |
Yes |
Yes |
- 6713 |
+ 6715 |
@@ -2756,7 +2756,7 @@ No |
Yes |
Yes |
- 16928 |
+ 16929 |
@@ -2846,7 +2846,7 @@ Yes |
Yes |
Yes |
- 572 |
+ 573 |
@@ -3279,7 +3279,7 @@ No |
Yes |
No |
- 5039 |
+ 5040 |
@@ -3415,7 +3415,7 @@ Yes |
Yes |
No |
- 3911 |
+ 3912 |
@@ -3438,7 +3438,7 @@ No |
Yes |
No |
- 4344 |
+ 4347 |
@@ -3484,7 +3484,7 @@ Yes |
Yes |
No |
- 896 |
+ 898 |
@@ -3637,7 +3637,7 @@ No |
Yes |
Yes |
- 12552 |
+ 12555 |
@@ -3878,7 +3878,7 @@ No |
Yes |
No |
- 28202 |
+ 28204 |
@@ -4053,7 +4053,7 @@ Yes |
Yes |
Yes |
- 1735 |
+ 1738 |
@@ -4369,7 +4369,7 @@ Yes |
Yes |
Yes |
- 576 |
+ 578 |
@@ -4662,7 +4662,7 @@ Yes |
Yes |
Yes |
- 176 |
+ 177 |
@@ -4987,7 +4987,7 @@ Yes |
Yes |
Yes |
- 104 |
+ 106 |
@@ -5121,7 +5121,7 @@ No |
Yes |
No |
- 813 |
+ 815 |
@@ -5144,7 +5144,7 @@ Yes |
Yes |
No |
- 1927 |
+ 1931 |
@@ -5282,7 +5282,7 @@ Yes |
Yes |
No |
- 57 |
+ 58 |
@@ -5305,7 +5305,7 @@ No |
Yes |
No |
- 76109 |
+ 76135 |
@@ -5328,7 +5328,7 @@ Yes |
Yes |
No |
- 26381 |
+ 26387 |
@@ -5351,7 +5351,7 @@ Yes |
Yes |
No |
- 23353 |
+ 23358 |
@@ -5416,7 +5416,7 @@ No |
Yes |
No |
- 6075 |
+ 6079 |
@@ -5439,7 +5439,7 @@ Yes |
Yes |
Yes |
- 5625 |
+ 5626 |
@@ -5504,7 +5504,7 @@ No |
Yes |
No |
- 3256 |
+ 3254 |
@@ -5525,7 +5525,7 @@ No |
Yes |
No |
- 2693 |
+ 2694 |
@@ -5546,7 +5546,7 @@ Yes |
Yes |
No |
- 2619 |
+ 2620 |
@@ -5567,7 +5567,7 @@ No |
Yes |
No |
- 2332 |
+ 2333 |
@@ -5588,7 +5588,7 @@ No |
Yes |
No |
- 2283 |
+ 2285 |
@@ -5611,7 +5611,7 @@ No |
Yes |
No |
- 2243 |
+ 2245 |
@@ -5674,7 +5674,7 @@ No |
Yes |
No |
- 1425 |
+ 1426 |
@@ -5697,7 +5697,7 @@ No |
Yes |
No |
- 1410 |
+ 1411 |
@@ -5739,7 +5739,7 @@ No |
Yes |
No |
- 1171 |
+ 1170 |
@@ -5823,7 +5823,7 @@ No |
Yes |
No |
- 807 |
+ 808 |
@@ -6308,7 +6308,7 @@ No |
Yes |
No |
- 372 |
+ 373 |
@@ -6373,7 +6373,7 @@ No |
Yes |
No |
- 359 |
+ 360 |
@@ -6541,7 +6541,7 @@ No |
Yes |
No |
- 295 |
+ 297 |
@@ -6625,7 +6625,7 @@ No |
Yes |
No |
- 256 |
+ 257 |
@@ -6900,7 +6900,7 @@ No |
Yes |
No |
- 205 |
+ 206 |
@@ -7028,7 +7028,7 @@ No |
Yes |
No |
- 194 |
+ 195 |
@@ -7070,7 +7070,7 @@ No |
Yes |
No |
- 191 |
+ 192 |
@@ -7364,7 +7364,7 @@ No |
Yes |
No |
- 146 |
+ 147 |
@@ -8227,7 +8227,7 @@ Yes |
Yes |
No |
- 67 |
+ 68 |
@@ -8714,7 +8714,7 @@ No |
Yes |
No |
- 48 |
+ 49 |
@@ -8821,7 +8821,7 @@ Yes |
Yes |
No |
- 45 |
+ 46 |
@@ -9115,7 +9115,7 @@ No |
Yes |
No |
- 40 |
+ 41 |
@@ -9728,7 +9728,7 @@ No |
Yes |
No |
- 28 |
+ 27 |
@@ -10386,27 +10386,6 @@
- kafka-streams-redis-statestore |
- A demo project demonstrating how to read and write data into a Redis-backed state store using Kafka Streams. |
-
- No
- |
-
-
- Link
-
- |
- No |
- Yes |
- No |
- 21 |
-
-
-
-
-
-
|
openapi-eller |
Generate OpenAPI v3 clients and servers from the command line |
@@ -11123,27 +11102,6 @@
- springboot-kafka-streams-rest-api |
- A sample RESTful API with Kafka Streams (2.6.0) using Spring Boot (2.3.3) and Java 14. |
-
- No
- |
-
-
- Link
-
- |
- No |
- Yes |
- No |
- 16 |
-
-
-
-
- |
-
play-api-refiner |
Not available |
@@ -12620,27 +12578,6 @@
- springboot-swagger-rest-api |
- A sample RESTful API using Spring Boot (2.3.2) and Java 14 with Swagger enabled. |
-
- No
- |
-
-
- Link
-
- |
- No |
- Yes |
- No |
- 9 |
-
-
-
-
- |
-
openapi |
Reposository holding the API specifications of Brønnøysundregistrene |
@@ -15490,7 +15427,7 @@ No
Yes |
No |
- 4 |
+ 5 |
@@ -21013,7 +20950,7 @@ No |
Yes |
No |
- 1 |
+ 2 |
@@ -25360,7 +25297,7 @@ No |
Yes |
Yes |
- 2869 |
+ 2872 |
@@ -27065,7 +27002,7 @@ Yes |
Yes |
Yes |
- 661 |
+ 663 |
@@ -27149,7 +27086,7 @@ No |
Yes |
No |
- 26531 |
+ 26552 |
@@ -27695,7 +27632,7 @@ Yes |
Yes |
No |
- 140 |
+ 141 |
@@ -31543,7 +31480,7 @@ No |
No |
No |
- 3590 |
+ 3589 |
@@ -32197,7 +32134,7 @@ No |
Yes |
No |
- 4935 |
+ 4936 |
@@ -32241,7 +32178,7 @@ No |
Yes |
Yes |
- 2581 |
+ 2582 |
@@ -33364,7 +33301,7 @@ Connexion (link)
|
Stars |
- 4475 |
+ 4474 |
Watchers |
@@ -33380,7 +33317,7 @@ Connexion (link)
Last Updated |
- 2024-09-26T18:03:58Z |
+ 2024-10-01T01:31:24Z |
Archived |
@@ -33619,7 +33556,7 @@ Rate My OpenAPI (link)
Stars |
- 210 |
+ 211 |
Watchers |
@@ -33635,7 +33572,7 @@ Rate My OpenAPI (link)
Last Updated |
- 2024-09-26T02:48:58Z |
+ 2024-09-30T22:48:30Z |
Archived |
@@ -33670,7 +33607,7 @@ Scalar (link)
Stars |
- 6229 |
+ 6239 |
Watchers |
@@ -33678,7 +33615,7 @@ Scalar (link)
Forks |
- 199 |
+ 200 |
Created |
@@ -33686,7 +33623,7 @@ Scalar (link)
Last Updated |
- 2024-09-30T03:37:22Z |
+ 2024-10-01T02:00:38Z |
Archived |
@@ -33721,7 +33658,7 @@ Scramble (link)
Stars |
- 1172 |
+ 1173 |
Watchers |
@@ -33737,7 +33674,7 @@ Scramble (link)
Last Updated |
- 2024-09-28T10:59:59Z |
+ 2024-09-30T13:18:36Z |
Archived |
@@ -33772,7 +33709,7 @@ Scribe (link)
Stars |
- 1702 |
+ 1703 |
Watchers |
@@ -33788,7 +33725,7 @@ Scribe (link)
Last Updated |
- 2024-09-30T03:20:41Z |
+ 2024-09-30T04:23:24Z |
Archived |
@@ -33925,7 +33862,7 @@ ReDoc (link)
Stars |
- 23353 |
+ 23358 |
Watchers |
@@ -33941,7 +33878,7 @@ ReDoc (link)
Last Updated |
- 2024-09-30T02:02:49Z |
+ 2024-09-30T21:24:05Z |
Archived |
@@ -34894,7 +34831,7 @@ OpenAPI Generator (link)
Stars |
- 21424 |
+ 21427 |
Watchers |
@@ -34902,7 +34839,7 @@ OpenAPI Generator (link)
Forks |
- 6479 |
+ 6482 |
Created |
@@ -34910,7 +34847,7 @@ OpenAPI Generator (link)
Last Updated |
- 2024-09-30T03:22:50Z |
+ 2024-10-01T03:34:17Z |
Archived |
@@ -34996,7 +34933,7 @@ Kiota Api Client Generator (link)
Stars |
- 2862 |
+ 2863 |
Watchers |
@@ -35012,7 +34949,7 @@ Kiota Api Client Generator (link)
Last Updated |
- 2024-09-30T02:27:51Z |
+ 2024-09-30T16:25:47Z |
Archived |
@@ -35353,7 +35290,7 @@ Swagger Editor (link)
Stars |
- 8886 |
+ 8887 |
Watchers |
@@ -35361,7 +35298,7 @@ Swagger Editor (link)
Forks |
- 2247 |
+ 2248 |
Created |
@@ -35369,7 +35306,7 @@ Swagger Editor (link)
Last Updated |
- 2024-09-29T17:33:14Z |
+ 2024-09-30T08:15:36Z |
Archived |
@@ -35455,7 +35392,7 @@ Redocly VSCode Extension (link)
Stars |
- 35 |
+ 36 |
Watchers |
@@ -35471,7 +35408,7 @@ Redocly VSCode Extension (link)
Last Updated |
- 2024-06-30T23:14:20Z |
+ 2024-09-30T05:43:52Z |
Archived |
@@ -36118,7 +36055,7 @@ Prism (link)
Stars |
- 4246 |
+ 4248 |
Watchers |
@@ -36134,7 +36071,7 @@ Prism (link)
Last Updated |
- 2024-09-28T06:34:20Z |
+ 2024-09-30T22:46:57Z |
Archived |
@@ -36169,7 +36106,7 @@ Microcks (link)
Stars |
- 1360 |
+ 1361 |
Watchers |
@@ -36177,7 +36114,7 @@ Microcks (link)
Forks |
- 212 |
+ 213 |
Created |
@@ -36185,7 +36122,7 @@ Microcks (link)
Last Updated |
- 2024-09-29T00:33:01Z |
+ 2024-09-30T13:28:07Z |
Archived |
@@ -36526,7 +36463,7 @@ @hey-api/openapi-ts (link)
Stars |
- 1070 |
+ 1077 |
Watchers |
@@ -36542,7 +36479,7 @@ @hey-api/openapi-ts (link)
Last Updated |
- 2024-09-29T15:41:11Z |
+ 2024-10-01T01:49:39Z |
Archived |
@@ -36785,7 +36722,7 @@ API Platform (link)
Watchers |
- 212 |
+ 213 |
Forks |
@@ -36797,7 +36734,7 @@ API Platform (link)
Last Updated |
- 2024-09-29T21:46:00Z |
+ 2024-09-30T18:30:18Z |
Archived |
@@ -37103,7 +37040,7 @@ @nestjs/swagger (link)
Last Updated |
- 2024-09-29T09:59:24Z |
+ 2024-09-30T22:08:15Z |
Archived |
@@ -37291,7 +37228,7 @@ express-openapi-validator (link)
Stars |
- 913 |
+ 914 |
Watchers |
@@ -37307,7 +37244,7 @@ express-openapi-validator (link)
Last Updated |
- 2024-09-23T03:04:21Z |
+ 2024-09-30T20:31:31Z |
Archived |
@@ -37444,7 +37381,7 @@ Step CI (link)
Stars |
- 1632 |
+ 1633 |
Watchers |
@@ -37460,7 +37397,7 @@ Step CI (link)
Last Updated |
- 2024-09-29T22:13:27Z |
+ 2024-09-30T07:05:28Z |
Archived |
@@ -37699,7 +37636,7 @@ Redocly CLI (link)
Stars |
- 909 |
+ 911 |
Watchers |
@@ -37715,7 +37652,7 @@ Redocly CLI (link)
Last Updated |
- 2024-09-29T18:36:49Z |
+ 2024-09-30T12:41:29Z |
Archived |
@@ -38013,7 +37950,7 @@ APIDevTools/swagger-parser (link)
Forks |
- 154 |
+ 155 |
Created |
@@ -38260,7 +38197,7 @@ kin-openapi (link)
Stars |
- 2568 |
+ 2569 |
Watchers |
@@ -38276,7 +38213,7 @@ kin-openapi (link)
Last Updated |
- 2024-09-29T21:49:10Z |
+ 2024-09-30T15:21:42Z |
Archived |
@@ -38633,7 +38570,7 @@ Microsoft/OpenAPI.NET (link)
Last Updated |
- 2024-09-26T15:51:13Z |
+ 2024-09-30T09:30:53Z |
Archived |
@@ -38982,7 +38919,7 @@ go-swagger (link)
Forks |
- 1246 |
+ 1247 |
Created |
@@ -39127,7 +39064,7 @@ NSwag (link)
Stars |
- 6713 |
+ 6715 |
Watchers |
@@ -39135,7 +39072,7 @@ NSwag (link)
Forks |
- 1244 |
+ 1289 |
Created |
@@ -39143,7 +39080,7 @@ NSwag (link)
Last Updated |
- 2024-09-29T12:53:01Z |
+ 2024-09-30T14:31:52Z |
Archived |
@@ -39229,7 +39166,7 @@ Swagger-Codegen (link)
Stars |
- 16928 |
+ 16929 |
Watchers |
@@ -39245,7 +39182,7 @@ Swagger-Codegen (link)
Last Updated |
- 2024-09-29T20:27:29Z |
+ 2024-10-01T01:12:29Z |
Archived |
@@ -39284,7 +39221,7 @@ Azure AutoRest (link)
Watchers |
- 894 |
+ 896 |
Forks |
@@ -39433,7 +39370,7 @@ api (link)
Stars |
- 572 |
+ 573 |
Watchers |
@@ -39449,7 +39386,7 @@ api (link)
Last Updated |
- 2024-09-28T16:07:40Z |
+ 2024-09-30T20:44:27Z |
Archived |
@@ -40061,7 +39998,7 @@ cats (link)
Last Updated |
- 2024-09-29T20:33:47Z |
+ 2024-09-30T06:06:45Z |
Archived |
@@ -40453,7 +40390,7 @@ mitmproxy2swagger (link)
Stars |
- 5039 |
+ 5040 |
Watchers |
@@ -40469,7 +40406,7 @@ mitmproxy2swagger (link)
Last Updated |
- 2024-09-30T03:24:11Z |
+ 2024-09-30T19:12:33Z |
Archived |
@@ -40759,7 +40696,7 @@ OpenAPI DevTools (link)
Stars |
- 3911 |
+ 3912 |
Watchers |
@@ -40775,7 +40712,7 @@ OpenAPI DevTools (link)
Last Updated |
- 2024-09-29T02:19:22Z |
+ 2024-09-30T12:16:38Z |
Archived |
@@ -40810,7 +40747,7 @@ TypeSpec (link)
Stars |
- 4344 |
+ 4347 |
Watchers |
@@ -40818,7 +40755,7 @@ TypeSpec (link)
Forks |
- 202 |
+ 201 |
Created |
@@ -40826,7 +40763,7 @@ TypeSpec (link)
Last Updated |
- 2024-09-30T03:18:44Z |
+ 2024-09-30T23:09:38Z |
Archived |
@@ -40912,7 +40849,7 @@ Restish (link)
Stars |
- 896 |
+ 898 |
Watchers |
@@ -40928,7 +40865,7 @@ Restish (link)
Last Updated |
- 2024-09-29T17:22:05Z |
+ 2024-09-30T15:05:40Z |
Archived |
@@ -41269,7 +41206,7 @@ OWASP ZAP (link)
Stars |
- 12552 |
+ 12555 |
Watchers |
@@ -41285,7 +41222,7 @@ OWASP ZAP (link)
Last Updated |
- 2024-09-29T17:22:10Z |
+ 2024-09-30T17:13:24Z |
Archived |
@@ -41787,7 +41724,7 @@ APIFuzzer (link)
Forks |
- 65 |
+ 66 |
Created |
@@ -41830,7 +41767,7 @@ Django REST Framework (link)
Stars |
- 28202 |
+ 28204 |
Watchers |
@@ -41838,7 +41775,7 @@ Django REST Framework (link)
Forks |
- 6815 |
+ 6813 |
Created |
@@ -41846,7 +41783,7 @@ Django REST Framework (link)
Last Updated |
- 2024-09-30T03:21:08Z |
+ 2024-10-01T00:14:19Z |
Archived |
@@ -42152,11 +42089,11 @@ JSONSchema::Validator (link)
Last Updated |
- 2024-04-12T09:18:53Z |
+ 2024-09-30T14:11:46Z |
Archived |
- Yes |
+ No |
Language |
@@ -42238,7 +42175,7 @@ Elements (link)
Stars |
- 1735 |
+ 1738 |
Watchers |
@@ -42254,7 +42191,7 @@ Elements (link)
Last Updated |
- 2024-09-29T23:40:42Z |
+ 2024-09-30T15:12:21Z |
Archived |
@@ -42560,7 +42497,7 @@ Typoas (link)
Last Updated |
- 2024-09-26T23:39:51Z |
+ 2024-09-30T08:22:54Z |
Archived |
@@ -42952,7 +42889,7 @@ vacuum (link)
Stars |
- 576 |
+ 578 |
Watchers |
@@ -42968,7 +42905,7 @@ vacuum (link)
Last Updated |
- 2024-09-28T13:51:45Z |
+ 2024-09-30T13:18:27Z |
Archived |
@@ -43615,7 +43552,7 @@ openapi-changes (link)
Stars |
- 176 |
+ 177 |
Watchers |
@@ -43631,7 +43568,7 @@ openapi-changes (link)
Last Updated |
- 2024-09-26T08:12:34Z |
+ 2024-09-30T04:13:57Z |
Archived |
@@ -44039,7 +43976,7 @@ allof-merge (link)
Last Updated |
- 2024-09-28T07:24:58Z |
+ 2024-09-30T22:44:38Z |
Archived |
@@ -44090,7 +44027,7 @@ api-ref-bundler (link)
Last Updated |
- 2024-09-28T07:22:21Z |
+ 2024-09-30T22:42:45Z |
Archived |
@@ -44192,7 +44129,7 @@ 🌿 Fern (link)
Last Updated |
- 2024-09-29T23:54:51Z |
+ 2024-09-30T19:01:09Z |
Archived |
@@ -44337,7 +44274,7 @@ Swift OpenAPI Generator (link)
Forks |
- 111 |
+ 113 |
Created |
@@ -44380,7 +44317,7 @@ wiretap (link)
Stars |
- 104 |
+ 106 |
Watchers |
@@ -44396,7 +44333,7 @@ wiretap (link)
Last Updated |
- 2024-09-30T03:22:59Z |
+ 2024-09-30T14:13:29Z |
Archived |
@@ -44686,7 +44623,7 @@ Fuego (link)
Stars |
- 813 |
+ 815 |
Watchers |
@@ -44702,7 +44639,7 @@ Fuego (link)
Last Updated |
- 2024-09-27T10:26:47Z |
+ 2024-09-30T19:02:02Z |
Archived |
@@ -44737,7 +44674,7 @@ Huma (link)
Stars |
- 1927 |
+ 1931 |
Watchers |
@@ -44745,7 +44682,7 @@ Huma (link)
Forks |
- 139 |
+ 142 |
Created |
@@ -44753,7 +44690,7 @@ Huma (link)
Last Updated |
- 2024-09-29T23:17:03Z |
+ 2024-09-30T20:09:15Z |
Archived |
@@ -45043,7 +44980,7 @@ Zudoku (link)
Stars |
- 57 |
+ 58 |
Watchers |
@@ -45059,7 +44996,7 @@ Zudoku (link)
Last Updated |
- 2024-09-27T14:13:00Z |
+ 2024-09-30T21:17:53Z |
Archived |
@@ -45094,7 +45031,7 @@ FastAPI (link)
Stars |
- 76109 |
+ 76135 |
Watchers |
@@ -45102,7 +45039,7 @@ FastAPI (link)
Forks |
- 6418 |
+ 6420 |
Created |
@@ -45110,7 +45047,7 @@ FastAPI (link)
Last Updated |
- 2024-09-30T03:28:42Z |
+ 2024-10-01T03:05:57Z |
Archived |
@@ -45145,7 +45082,7 @@ swagger-ui (link)
Stars |
- 26381 |
+ 26387 |
Watchers |
@@ -45153,7 +45090,7 @@ swagger-ui (link)
Forks |
- 8921 |
+ 8922 |
Created |
@@ -45161,7 +45098,7 @@ swagger-ui (link)
Last Updated |
- 2024-09-30T03:15:26Z |
+ 2024-10-01T00:44:06Z |
Archived |
@@ -45196,7 +45133,7 @@ Redoc (link)
Stars |
- 23353 |
+ 23358 |
Watchers |
@@ -45212,7 +45149,7 @@ Redoc (link)
Last Updated |
- 2024-09-30T02:02:49Z |
+ 2024-09-30T21:24:05Z |
Archived |
@@ -45314,7 +45251,7 @@ mockoon (link)
Last Updated |
- 2024-09-30T01:33:07Z |
+ 2024-09-30T18:29:05Z |
Archived |
@@ -45349,7 +45286,7 @@ OpenAPI Server Code Generator (oapi-cod
Stars |
- 6075 |
+ 6079 |
Watchers |
@@ -45365,7 +45302,7 @@ OpenAPI Server Code Generator (oapi-cod
Last Updated |
- 2024-09-30T01:57:16Z |
+ 2024-09-30T14:59:59Z |
Archived |
@@ -45400,7 +45337,7 @@ OpenAPI TypeScript (link)
Stars |
- 5625 |
+ 5626 |
Watchers |
@@ -45408,7 +45345,7 @@ OpenAPI TypeScript (link)
Forks |
- 453 |
+ 454 |
Created |
@@ -45416,7 +45353,7 @@ OpenAPI TypeScript (link)
Last Updated |
- 2024-09-30T02:49:13Z |
+ 2024-09-30T17:51:04Z |
Archived |
@@ -45553,7 +45490,7 @@ springdoc-openapi (link)
Stars |
- 3256 |
+ 3254 |
Watchers |
@@ -45569,7 +45506,7 @@ springdoc-openapi (link)
Last Updated |
- 2024-09-29T23:11:22Z |
+ 2024-09-30T16:53:57Z |
Archived |
@@ -45604,7 +45541,7 @@ uvicorn-gunicorn-fastapi-docker (link)<
Stars |
- 2693 |
+ 2694 |
Watchers |
@@ -45620,7 +45557,7 @@ uvicorn-gunicorn-fastapi-docker (link)<
Last Updated |
- 2024-09-30T01:26:51Z |
+ 2024-09-30T18:10:40Z |
Archived |
@@ -45655,7 +45592,7 @@ swagger-js (link)
Stars |
- 2619 |
+ 2620 |
Watchers |
@@ -45671,7 +45608,7 @@ swagger-js (link)
Last Updated |
- 2024-09-26T00:03:26Z |
+ 2024-09-30T16:49:12Z |
Archived |
@@ -45706,7 +45643,7 @@ drf-spectacular (link)
Stars |
- 2332 |
+ 2333 |
Watchers |
@@ -45722,7 +45659,7 @@ drf-spectacular (link)
Last Updated |
- 2024-09-30T01:01:01Z |
+ 2024-09-30T09:28:52Z |
Archived |
@@ -45757,7 +45694,7 @@ msgspec (link)
Stars |
- 2283 |
+ 2285 |
Watchers |
@@ -45773,7 +45710,7 @@ msgspec (link)
Last Updated |
- 2024-09-29T17:42:46Z |
+ 2024-10-01T03:17:35Z |
Archived |
@@ -45808,7 +45745,7 @@ Schemathesis (link)
Stars |
- 2243 |
+ 2245 |
Watchers |
@@ -45824,7 +45761,7 @@ Schemathesis (link)
Last Updated |
- 2024-09-29T19:57:54Z |
+ 2024-09-30T23:46:03Z |
Archived |
@@ -45926,7 +45863,7 @@ rapidoc (link)
Last Updated |
- 2024-09-30T02:34:41Z |
+ 2024-09-30T17:20:05Z |
Archived |
@@ -45961,7 +45898,7 @@ openapi-generator-cli (link)
Stars |
- 1425 |
+ 1426 |
Watchers |
@@ -45977,7 +45914,7 @@ openapi-generator-cli (link)
Last Updated |
- 2024-09-29T19:01:17Z |
+ 2024-09-30T21:50:20Z |
Archived |
@@ -46012,7 +45949,7 @@ OpenAPI-gui (link)
Stars |
- 1410 |
+ 1411 |
Watchers |
@@ -46028,7 +45965,7 @@ OpenAPI-gui (link)
Last Updated |
- 2024-09-20T14:40:31Z |
+ 2024-09-30T21:39:39Z |
Archived |
@@ -46114,7 +46051,7 @@ apispec (link)
Stars |
- 1171 |
+ 1170 |
Watchers |
@@ -46130,7 +46067,7 @@ apispec (link)
Last Updated |
- 2024-09-28T02:43:36Z |
+ 2024-09-30T19:45:28Z |
Archived |
@@ -46318,11 +46255,11 @@ openapi-diff (link)
Stars |
- 807 |
+ 808 |
Watchers |
- 20 |
+ 19 |
Forks |
@@ -46334,7 +46271,7 @@ openapi-diff (link)
Last Updated |
- 2024-09-26T08:29:50Z |
+ 2024-09-30T18:05:20Z |
Archived |
@@ -46844,7 +46781,7 @@ stackql (link)
Last Updated |
- 2024-09-27T20:56:16Z |
+ 2024-09-30T20:56:18Z |
Archived |
@@ -46938,7 +46875,7 @@ oazapfts (link)
Forks |
- 78 |
+ 79 |
Created |
@@ -47491,7 +47428,7 @@ fastapi-clean-example (link)
Stars |
- 372 |
+ 373 |
Watchers |
@@ -47507,7 +47444,7 @@ fastapi-clean-example (link)
Last Updated |
- 2024-09-26T16:49:13Z |
+ 2024-09-30T07:39:21Z |
Archived |
@@ -47644,7 +47581,7 @@ rest (link)
Stars |
- 359 |
+ 360 |
Watchers |
@@ -47660,7 +47597,7 @@ rest (link)
Last Updated |
- 2024-09-28T16:54:26Z |
+ 2024-09-30T11:51:01Z |
Archived |
@@ -48052,7 +47989,7 @@ esmerald (link)
Stars |
- 295 |
+ 297 |
Watchers |
@@ -48068,7 +48005,7 @@ esmerald (link)
Last Updated |
- 2024-09-29T15:42:12Z |
+ 2024-09-30T23:54:03Z |
Archived |
@@ -48256,7 +48193,7 @@ zod-openapi (link)
Stars |
- 256 |
+ 257 |
Watchers |
@@ -48272,7 +48209,7 @@ zod-openapi (link)
Last Updated |
- 2024-09-30T01:58:32Z |
+ 2024-09-30T14:49:01Z |
Archived |
@@ -48374,7 +48311,7 @@ znai (link)
Last Updated |
- 2024-09-29T18:56:15Z |
+ 2024-09-30T22:29:29Z |
Archived |
@@ -48919,7 +48856,7 @@ openapi.net.odata (link)
Stars |
- 205 |
+ 206 |
Watchers |
@@ -48935,7 +48872,7 @@ openapi.net.odata (link)
Last Updated |
- 2024-09-24T06:26:57Z |
+ 2024-09-30T16:47:18Z |
Archived |
@@ -48978,7 +48915,7 @@ fastify-openapi-glue (link)
Forks |
- 34 |
+ 33 |
Created |
@@ -49225,7 +49162,7 @@ typescript-backend-toolkit (link)
Stars |
- 194 |
+ 195 |
Watchers |
@@ -49241,7 +49178,7 @@ typescript-backend-toolkit (link)
Last Updated |
- 2024-09-29T23:15:05Z |
+ 2024-09-30T10:00:13Z |
Archived |
@@ -49327,7 +49264,7 @@ paypal-rest-api-specifications (link)
Stars |
- 191 |
+ 192 |
Watchers |
@@ -49343,7 +49280,7 @@ paypal-rest-api-specifications (link)
Last Updated |
- 2024-09-29T10:11:25Z |
+ 2024-09-30T10:13:00Z |
Archived |
@@ -49496,7 +49433,7 @@ speakeasy (link)
Last Updated |
- 2024-09-29T22:18:56Z |
+ 2024-09-30T23:49:57Z |
Archived |
@@ -49700,7 +49637,7 @@ apiclientcodegen (link)
Last Updated |
- 2024-09-28T22:55:33Z |
+ 2024-09-30T20:59:51Z |
Archived |
@@ -50041,7 +49978,7 @@ deeptest (link)
Stars |
- 146 |
+ 147 |
Watchers |
@@ -50057,7 +49994,7 @@ deeptest (link)
Last Updated |
- 2024-09-30T02:45:05Z |
+ 2024-09-30T22:57:43Z |
Archived |
@@ -51230,7 +51167,7 @@ tools.openapis.org (link)
Last Updated |
- 2024-09-29T13:33:09Z |
+ 2024-09-30T03:39:33Z |
Archived |
@@ -51281,7 +51218,7 @@ openapi-to-plantuml (link)
Last Updated |
- 2024-09-27T17:16:49Z |
+ 2024-09-30T17:04:42Z |
Archived |
@@ -51587,7 +51524,7 @@ jellyfin-sdk-kotlin (link)
Last Updated |
- 2024-09-27T08:11:15Z |
+ 2024-09-30T16:46:32Z |
Archived |
@@ -52097,7 +52034,7 @@ apidom (link)
Last Updated |
- 2024-09-28T00:08:25Z |
+ 2024-09-30T23:18:31Z |
Archived |
@@ -52132,7 +52069,7 @@ spectral-owasp-ruleset (link)
Stars |
- 67 |
+ 68 |
Watchers |
@@ -52148,7 +52085,7 @@ spectral-owasp-ruleset (link)
Last Updated |
- 2024-09-18T13:34:29Z |
+ 2024-09-30T19:11:13Z |
Archived |
@@ -53305,7 +53242,7 @@ rest (link)
Stars |
- 48 |
+ 49 |
Watchers |
@@ -53321,7 +53258,7 @@ rest (link)
Last Updated |
- 2024-09-27T16:35:36Z |
+ 2024-09-30T17:53:07Z |
Archived |
@@ -53423,7 +53360,7 @@ sample-quarkus-applications (link)
Last Updated |
- 2024-09-23T15:36:48Z |
+ 2024-09-30T10:58:16Z |
Archived |
@@ -53560,7 +53497,7 @@ libopenapi-validator (link)
Stars |
- 45 |
+ 46 |
Watchers |
@@ -53576,7 +53513,7 @@ libopenapi-validator (link)
Last Updated |
- 2024-09-22T08:01:07Z |
+ 2024-10-01T01:41:13Z |
Archived |
@@ -53729,7 +53666,7 @@ javalin-openapi (link)
Last Updated |
- 2024-09-26T03:35:55Z |
+ 2024-09-30T16:59:32Z |
Archived |
@@ -54274,7 +54211,7 @@ full-stack-fastapi-mysql (link)
Stars |
- 40 |
+ 41 |
Watchers |
@@ -54290,7 +54227,7 @@ full-stack-fastapi-mysql (link)
Last Updated |
- 2024-09-26T11:59:34Z |
+ 2024-09-30T08:32:06Z |
Archived |
@@ -55753,7 +55690,7 @@ hei-admin-api (link)
Stars |
- 28 |
+ 27 |
Watchers |
@@ -55769,7 +55706,7 @@ hei-admin-api (link)
Last Updated |
- 2024-09-27T13:31:53Z |
+ 2024-09-30T16:49:39Z |
Archived |
@@ -57366,57 +57303,6 @@ openapify (link)
-
-
-
-
-
- Repository Owner |
- ben-jamin-chen |
-
-
- Stars |
- 21 |
-
-
- Watchers |
- 1 |
-
-
- Forks |
- 7 |
-
-
- Created |
- 2020-08-22T04:54:11Z |
-
-
- Last Updated |
- 2024-09-08T18:44:30Z |
-
-
- Archived |
- No |
-
-
- Language |
- Java |
-
-
-
-
-
-
-
Last Updated |
- 2024-09-28T09:34:53Z |
+ 2024-09-30T18:45:50Z |
Archived |
@@ -59151,57 +59037,6 @@ postgrest-openapi (link)
-
-
-
-
-
- Repository Owner |
- ben-jamin-chen |
-
-
- Stars |
- 16 |
-
-
- Watchers |
- 3 |
-
-
- Forks |
- 9 |
-
-
- Created |
- 2020-07-22T03:43:45Z |
-
-
- Last Updated |
- 2024-09-08T15:02:38Z |
-
-
- Archived |
- No |
-
-
- Language |
- Java |
-
-
-
-
-
-
-
Last Updated |
- 2024-09-26T12:50:35Z |
+ 2024-09-30T16:13:44Z |
Archived |
@@ -62603,7 +62438,7 @@ aiohttp-deps (link)
Last Updated |
- 2024-09-29T23:57:26Z |
+ 2024-09-30T23:19:19Z |
Archived |
@@ -62772,57 +62607,6 @@ openapi-parser (link)
-
-
-
-
-
- Repository Owner |
- ben-jamin-chen |
-
-
- Stars |
- 9 |
-
-
- Watchers |
- 1 |
-
-
- Forks |
- 7 |
-
-
- Created |
- 2020-07-21T23:28:43Z |
-
-
- Last Updated |
- 2024-08-29T06:57:42Z |
-
-
- Archived |
- No |
-
-
- Language |
- Java |
-
-
-
-
-
-
-
Last Updated |
- 2024-09-27T15:10:22Z |
+ 2024-09-30T15:35:21Z |
Archived |
@@ -65102,7 +64886,7 @@ openapi-specs (link)
Last Updated |
- 2024-09-25T08:31:06Z |
+ 2024-09-30T13:56:21Z |
Archived |
@@ -67499,7 +67283,7 @@ cossim-server (link)
Last Updated |
- 2024-09-15T12:49:50Z |
+ 2024-09-30T19:23:59Z |
Archived |
@@ -69727,7 +69511,7 @@ nest-starter (link)
Stars |
- 4 |
+ 5 |
Watchers |
@@ -69743,7 +69527,7 @@ nest-starter (link)
Last Updated |
- 2024-09-03T16:13:15Z |
+ 2024-09-30T17:45:12Z |
Archived |
@@ -74588,7 +74372,7 @@ restdocs-openapi3 (link)
Last Updated |
- 2024-09-24T01:28:11Z |
+ 2024-10-01T01:28:30Z |
Archived |
@@ -79994,7 +79778,7 @@ pkg (link)
Last Updated |
- 2024-09-25T13:09:45Z |
+ 2024-09-30T21:24:11Z |
Archived |
@@ -80810,7 +80594,7 @@ openapi-to-java-records-mustache-templa
Last Updated |
- 2024-09-27T20:52:48Z |
+ 2024-09-30T17:00:55Z |
Archived |
@@ -83140,7 +82924,7 @@ programming-machine-learning (link)
Stars |
- 1 |
+ 2 |
Watchers |
@@ -83156,7 +82940,7 @@ programming-machine-learning (link)
Last Updated |
- 2024-09-26T18:33:01Z |
+ 2024-09-30T21:10:52Z |
Archived |
@@ -92234,7 +92018,7 @@ utoipa (link)
Last Updated |
- 2024-09-28T13:57:33Z |
+ 2024-09-30T22:30:13Z |
Archived |
@@ -93697,7 +93481,7 @@ orval (link)
Stars |
- 2869 |
+ 2872 |
Watchers |
@@ -93705,7 +93489,7 @@ orval (link)
Forks |
- 321 |
+ 322 |
Created |
@@ -93713,7 +93497,7 @@ orval (link)
Last Updated |
- 2024-09-29T17:42:47Z |
+ 2024-09-30T14:14:34Z |
Archived |
@@ -97828,7 +97612,7 @@ kubb (link)
Stars |
- 661 |
+ 663 |
Watchers |
@@ -97844,7 +97628,7 @@ kubb (link)
Last Updated |
- 2024-09-29T22:31:07Z |
+ 2024-09-30T22:44:22Z |
Archived |
@@ -98032,7 +97816,7 @@ full-stack-fastapi-template (link)
Stars |
- 26531 |
+ 26552 |
Watchers |
@@ -98040,7 +97824,7 @@ full-stack-fastapi-template (link)
Forks |
- 4655 |
+ 4665 |
Created |
@@ -98048,7 +97832,7 @@ full-stack-fastapi-template (link)
Last Updated |
- 2024-09-30T03:12:19Z |
+ 2024-10-01T02:15:33Z |
Archived |
@@ -99272,7 +99056,7 @@ spring-boot-starter-tomcat (link)
Last Updated |
- 2024-09-27T20:04:05Z |
+ 2024-09-30T15:23:37Z |
Archived |
@@ -99358,7 +99142,7 @@ UI Bakery (link)
Stars |
- 140 |
+ 141 |
Watchers |
@@ -99374,7 +99158,7 @@ UI Bakery (link)
Last Updated |
- 2024-09-29T20:09:14Z |
+ 2024-09-30T17:43:26Z |
Archived |
@@ -107993,7 +107777,7 @@ Microsoft.OpenApi.net (link)
Last Updated |
- 2024-09-26T15:51:13Z |
+ 2024-09-30T09:30:53Z |
Archived |
@@ -108742,7 +108526,7 @@ PHP-CRUD-API (link)
Stars |
- 3590 |
+ 3589 |
Watchers |
@@ -108758,7 +108542,7 @@ PHP-CRUD-API (link)
Last Updated |
- 2024-09-26T15:05:44Z |
+ 2024-09-30T15:39:32Z |
Archived |
@@ -108860,11 +108644,11 @@ JSONSchema::Validator (link)
Last Updated |
- 2024-04-12T09:18:53Z |
+ 2024-09-30T14:11:46Z |
Archived |
- Yes |
+ No |
Language |
@@ -110272,7 +110056,7 @@ LoopBack 4 (link)
Stars |
- 4935 |
+ 4936 |
Watchers |
@@ -110288,7 +110072,7 @@ LoopBack 4 (link)
Last Updated |
- 2024-09-28T18:45:42Z |
+ 2024-09-30T07:46:15Z |
Archived |
@@ -110374,7 +110158,7 @@ RESTler (link)
Stars |
- 2581 |
+ 2582 |
Watchers |
@@ -110390,7 +110174,7 @@ RESTler (link)
Last Updated |
- 2024-09-29T01:17:09Z |
+ 2024-09-30T06:59:09Z |
Archived |
@@ -119318,22 +119102,6 @@ odata2openapi (link)
- document
- .getElementById("574d5c6f9e5705994875220ae1875d15-open-button")
- .onclick = function () {
- const wrapper = document.getElementById("tool-content")
- const content = document.getElementById("574d5c6f9e5705994875220ae1875d15-info")
-
- content.removeAttribute("hidden")
-
- wrapper.appendChild(content)
- modal.style.display = "block";
- }
-
-
-
-
-
document
.getElementById("9ab6e634f0f3553238502aa27b3e5a45-open-button")
.onclick = function () {
@@ -119878,22 +119646,6 @@ odata2openapi (link)
- document
- .getElementById("0c2d44cef1118bbebe90119d0b6e9879-open-button")
- .onclick = function () {
- const wrapper = document.getElementById("tool-content")
- const content = document.getElementById("0c2d44cef1118bbebe90119d0b6e9879-info")
-
- content.removeAttribute("hidden")
-
- wrapper.appendChild(content)
- modal.style.display = "block";
- }
-
-
-
-
-
document
.getElementById("df6e428f59101c20eaeb110a9e268e9b-open-button")
.onclick = function () {
@@ -121014,22 +120766,6 @@ odata2openapi (link)
- document
- .getElementById("a9df75197b7dc50eefc61eead6539c2b-open-button")
- .onclick = function () {
- const wrapper = document.getElementById("tool-content")
- const content = document.getElementById("a9df75197b7dc50eefc61eead6539c2b-info")
-
- content.removeAttribute("hidden")
-
- wrapper.appendChild(content)
- modal.style.display = "block";
- }
-
-
-
-
-
document
.getElementById("2c7899a38f9d43d529cf65be2bd07bd6-open-button")
.onclick = function () {
diff --git a/docs/categories/auto-generators.html b/docs/categories/auto-generators.html
index 4b0326bc..4594b01a 100644
--- a/docs/categories/auto-generators.html
+++ b/docs/categories/auto-generators.html
@@ -91,7 +91,7 @@ Yes
No |
No |
- 1172 |
+ 1173 |
@@ -114,7 +114,7 @@ No |
Yes |
No |
- 5039 |
+ 5040 |
@@ -250,7 +250,7 @@ Yes |
Yes |
No |
- 3911 |
+ 3912 |
@@ -273,7 +273,7 @@ No |
Yes |
No |
- 4344 |
+ 4347 |
@@ -296,7 +296,7 @@ No |
Yes |
No |
- 813 |
+ 815 |
@@ -319,7 +319,7 @@ Yes |
Yes |
No |
- 1927 |
+ 1931 |
@@ -373,7 +373,7 @@ Scramble (link)
|
Stars |
- 1172 |
+ 1173 |
Watchers |
@@ -389,7 +389,7 @@ Scramble (link)
Last Updated |
- 2024-09-28T10:59:59Z |
+ 2024-09-30T13:18:36Z |
Archived |
@@ -424,7 +424,7 @@ mitmproxy2swagger (link)
Stars |
- 5039 |
+ 5040 |
Watchers |
@@ -440,7 +440,7 @@ mitmproxy2swagger (link)
Last Updated |
- 2024-09-30T03:24:11Z |
+ 2024-09-30T19:12:33Z |
Archived |
@@ -730,7 +730,7 @@ OpenAPI DevTools (link)
Stars |
- 3911 |
+ 3912 |
Watchers |
@@ -746,7 +746,7 @@ OpenAPI DevTools (link)
Last Updated |
- 2024-09-29T02:19:22Z |
+ 2024-09-30T12:16:38Z |
Archived |
@@ -781,7 +781,7 @@ TypeSpec (link)
Stars |
- 4344 |
+ 4347 |
Watchers |
@@ -789,7 +789,7 @@ TypeSpec (link)
Forks |
- 202 |
+ 201 |
Created |
@@ -797,7 +797,7 @@ TypeSpec (link)
Last Updated |
- 2024-09-30T03:18:44Z |
+ 2024-09-30T23:09:38Z |
Archived |
@@ -832,7 +832,7 @@ Fuego (link)
Stars |
- 813 |
+ 815 |
Watchers |
@@ -848,7 +848,7 @@ Fuego (link)
Last Updated |
- 2024-09-27T10:26:47Z |
+ 2024-09-30T19:02:02Z |
Archived |
@@ -883,7 +883,7 @@ Huma (link)
Stars |
- 1927 |
+ 1931 |
Watchers |
@@ -891,7 +891,7 @@ Huma (link)
Forks |
- 139 |
+ 142 |
Created |
@@ -899,7 +899,7 @@ Huma (link)
Last Updated |
- 2024-09-29T23:17:03Z |
+ 2024-09-30T20:09:15Z |
Archived |
diff --git a/docs/categories/code-generators.html b/docs/categories/code-generators.html
index 4d0c51a3..0765640a 100644
--- a/docs/categories/code-generators.html
+++ b/docs/categories/code-generators.html
@@ -114,7 +114,7 @@ No
Yes |
Yes |
- 21424 |
+ 21427 |
@@ -160,7 +160,7 @@ No |
Yes |
Yes |
- 2862 |
+ 2863 |
@@ -248,7 +248,7 @@ No |
Yes |
Yes |
- 16928 |
+ 16929 |
@@ -386,7 +386,7 @@ Yes |
Yes |
No |
- 26381 |
+ 26387 |
@@ -430,7 +430,7 @@ No |
Yes |
No |
- 6075 |
+ 6079 |
@@ -451,7 +451,7 @@ Yes |
Yes |
No |
- 2619 |
+ 2620 |
@@ -472,7 +472,7 @@ No |
Yes |
No |
- 1425 |
+ 1426 |
@@ -558,7 +558,7 @@ No |
Yes |
No |
- 191 |
+ 192 |
@@ -707,7 +707,7 @@ No |
Yes |
No |
- 28 |
+ 27 |
@@ -1381,7 +1381,7 @@ No |
Yes |
Yes |
- 2869 |
+ 2872 |
@@ -1591,7 +1591,7 @@ Yes |
Yes |
Yes |
- 661 |
+ 663 |
@@ -2168,7 +2168,7 @@ OpenAPI Generator (link)
|
Stars |
- 21424 |
+ 21427 |
Watchers |
@@ -2176,7 +2176,7 @@ OpenAPI Generator (link)
Forks |
- 6479 |
+ 6482 |
Created |
@@ -2184,7 +2184,7 @@ OpenAPI Generator (link)
Last Updated |
- 2024-09-30T03:22:50Z |
+ 2024-10-01T03:34:17Z |
Archived |
@@ -2270,7 +2270,7 @@ Kiota Api Client Generator (link)
Stars |
- 2862 |
+ 2863 |
Watchers |
@@ -2286,7 +2286,7 @@ Kiota Api Client Generator (link)
Last Updated |
- 2024-09-30T02:27:51Z |
+ 2024-09-30T16:25:47Z |
Archived |
@@ -2474,7 +2474,7 @@ Swagger-Codegen (link)
Stars |
- 16928 |
+ 16929 |
Watchers |
@@ -2490,7 +2490,7 @@ Swagger-Codegen (link)
Last Updated |
- 2024-09-29T20:27:29Z |
+ 2024-10-01T01:12:29Z |
Archived |
@@ -2694,7 +2694,7 @@ 🌿 Fern (link)
Last Updated |
- 2024-09-29T23:54:51Z |
+ 2024-09-30T19:01:09Z |
Archived |
@@ -2780,7 +2780,7 @@ swagger-ui (link)
Stars |
- 26381 |
+ 26387 |
Watchers |
@@ -2788,7 +2788,7 @@ swagger-ui (link)
Forks |
- 8921 |
+ 8922 |
Created |
@@ -2796,7 +2796,7 @@ swagger-ui (link)
Last Updated |
- 2024-09-30T03:15:26Z |
+ 2024-10-01T00:44:06Z |
Archived |
@@ -2882,7 +2882,7 @@ OpenAPI Server Code Generator (oapi-cod
Stars |
- 6075 |
+ 6079 |
Watchers |
@@ -2898,7 +2898,7 @@ OpenAPI Server Code Generator (oapi-cod
Last Updated |
- 2024-09-30T01:57:16Z |
+ 2024-09-30T14:59:59Z |
Archived |
@@ -2933,7 +2933,7 @@ swagger-js (link)
Stars |
- 2619 |
+ 2620 |
Watchers |
@@ -2949,7 +2949,7 @@ swagger-js (link)
Last Updated |
- 2024-09-26T00:03:26Z |
+ 2024-09-30T16:49:12Z |
Archived |
@@ -2984,7 +2984,7 @@ openapi-generator-cli (link)
Stars |
- 1425 |
+ 1426 |
Watchers |
@@ -3000,7 +3000,7 @@ openapi-generator-cli (link)
Last Updated |
- 2024-09-29T19:01:17Z |
+ 2024-09-30T21:50:20Z |
Archived |
@@ -3188,7 +3188,7 @@ paypal-rest-api-specifications (link)
Stars |
- 191 |
+ 192 |
Watchers |
@@ -3204,7 +3204,7 @@ paypal-rest-api-specifications (link)
Last Updated |
- 2024-09-29T10:11:25Z |
+ 2024-09-30T10:13:00Z |
Archived |
@@ -3545,7 +3545,7 @@ hei-admin-api (link)
Stars |
- 28 |
+ 27 |
Watchers |
@@ -3561,7 +3561,7 @@ hei-admin-api (link)
Last Updated |
- 2024-09-27T13:31:53Z |
+ 2024-09-30T16:49:39Z |
Archived |
@@ -5177,7 +5177,7 @@ orval (link)
Stars |
- 2869 |
+ 2872 |
Watchers |
@@ -5185,7 +5185,7 @@ orval (link)
Forks |
- 321 |
+ 322 |
Created |
@@ -5193,7 +5193,7 @@ orval (link)
Last Updated |
- 2024-09-29T17:42:47Z |
+ 2024-09-30T14:14:34Z |
Archived |
@@ -5687,7 +5687,7 @@ kubb (link)
Stars |
- 661 |
+ 663 |
Watchers |
@@ -5703,7 +5703,7 @@ kubb (link)
Last Updated |
- 2024-09-29T22:31:07Z |
+ 2024-09-30T22:44:22Z |
Archived |
diff --git a/docs/categories/converters.html b/docs/categories/converters.html
index 8eb84c99..cbfd6baa 100644
--- a/docs/categories/converters.html
+++ b/docs/categories/converters.html
@@ -221,7 +221,7 @@ Yes
Yes |
Yes |
- 1070 |
+ 1077 |
@@ -267,7 +267,7 @@ No |
Yes |
No |
- 1632 |
+ 1633 |
@@ -359,7 +359,7 @@ Yes |
Yes |
Yes |
- 572 |
+ 573 |
@@ -604,7 +604,7 @@ Yes |
Yes |
Yes |
- 5625 |
+ 5626 |
@@ -1470,7 +1470,7 @@ @hey-api/openapi-ts (link)
|
Stars |
- 1070 |
+ 1077 |
Watchers |
@@ -1486,7 +1486,7 @@ @hey-api/openapi-ts (link)
Last Updated |
- 2024-09-29T15:41:11Z |
+ 2024-10-01T01:49:39Z |
Archived |
@@ -1572,7 +1572,7 @@ Step CI (link)
Stars |
- 1632 |
+ 1633 |
Watchers |
@@ -1588,7 +1588,7 @@ Step CI (link)
Last Updated |
- 2024-09-29T22:13:27Z |
+ 2024-09-30T07:05:28Z |
Archived |
@@ -1631,7 +1631,7 @@ go-swagger (link)
Forks |
- 1246 |
+ 1247 |
Created |
@@ -1776,7 +1776,7 @@ api (link)
Stars |
- 572 |
+ 573 |
Watchers |
@@ -1792,7 +1792,7 @@ api (link)
Last Updated |
- 2024-09-28T16:07:40Z |
+ 2024-09-30T20:44:27Z |
Archived |
@@ -2149,7 +2149,7 @@ allof-merge (link)
Last Updated |
- 2024-09-28T07:24:58Z |
+ 2024-09-30T22:44:38Z |
Archived |
@@ -2200,7 +2200,7 @@ api-ref-bundler (link)
Last Updated |
- 2024-09-28T07:22:21Z |
+ 2024-09-30T22:42:45Z |
Archived |
@@ -2337,7 +2337,7 @@ OpenAPI TypeScript (link)
Stars |
- 5625 |
+ 5626 |
Watchers |
@@ -2345,7 +2345,7 @@ OpenAPI TypeScript (link)
Forks |
- 453 |
+ 454 |
Created |
@@ -2353,7 +2353,7 @@ OpenAPI TypeScript (link)
Last Updated |
- 2024-09-30T02:49:13Z |
+ 2024-09-30T17:51:04Z |
Archived |
diff --git a/docs/categories/data-validators.html b/docs/categories/data-validators.html
index 9689beaf..54ad93ee 100644
--- a/docs/categories/data-validators.html
+++ b/docs/categories/data-validators.html
@@ -154,7 +154,7 @@ No
Yes |
No |
- 913 |
+ 914 |
@@ -177,7 +177,7 @@ No |
Yes |
No |
- 1632 |
+ 1633 |
@@ -309,7 +309,7 @@ No |
Yes |
Yes |
- 2568 |
+ 2569 |
@@ -527,7 +527,7 @@ Yes |
Yes |
Yes |
- 576 |
+ 578 |
@@ -573,7 +573,7 @@ Yes |
Yes |
Yes |
- 176 |
+ 177 |
@@ -640,7 +640,7 @@ Yes |
Yes |
Yes |
- 104 |
+ 106 |
@@ -663,7 +663,7 @@ No |
Yes |
No |
- 813 |
+ 815 |
@@ -686,7 +686,7 @@ Yes |
Yes |
No |
- 1927 |
+ 1931 |
@@ -2121,7 +2121,7 @@ express-openapi-validator (link)
|
Stars |
- 913 |
+ 914 |
Watchers |
@@ -2137,7 +2137,7 @@ express-openapi-validator (link)
Last Updated |
- 2024-09-23T03:04:21Z |
+ 2024-09-30T20:31:31Z |
Archived |
@@ -2172,7 +2172,7 @@ Step CI (link)
Stars |
- 1632 |
+ 1633 |
Watchers |
@@ -2188,7 +2188,7 @@ Step CI (link)
Last Updated |
- 2024-09-29T22:13:27Z |
+ 2024-09-30T07:05:28Z |
Archived |
@@ -2478,7 +2478,7 @@ kin-openapi (link)
Stars |
- 2568 |
+ 2569 |
Watchers |
@@ -2494,7 +2494,7 @@ kin-openapi (link)
Last Updated |
- 2024-09-29T21:49:10Z |
+ 2024-09-30T15:21:42Z |
Archived |
@@ -2843,7 +2843,7 @@ APIFuzzer (link)
Forks |
- 65 |
+ 66 |
Created |
@@ -2953,11 +2953,11 @@ JSONSchema::Validator (link)
Last Updated |
- 2024-04-12T09:18:53Z |
+ 2024-09-30T14:11:46Z |
Archived |
- Yes |
+ No |
Language |
@@ -2988,7 +2988,7 @@ vacuum (link)
Stars |
- 576 |
+ 578 |
Watchers |
@@ -3004,7 +3004,7 @@ vacuum (link)
Last Updated |
- 2024-09-28T13:51:45Z |
+ 2024-09-30T13:18:27Z |
Archived |
@@ -3090,7 +3090,7 @@ openapi-changes (link)
Stars |
- 176 |
+ 177 |
Watchers |
@@ -3106,7 +3106,7 @@ openapi-changes (link)
Last Updated |
- 2024-09-26T08:12:34Z |
+ 2024-09-30T04:13:57Z |
Archived |
@@ -3243,7 +3243,7 @@ wiretap (link)
Stars |
- 104 |
+ 106 |
Watchers |
@@ -3259,7 +3259,7 @@ wiretap (link)
Last Updated |
- 2024-09-30T03:22:59Z |
+ 2024-09-30T14:13:29Z |
Archived |
@@ -3294,7 +3294,7 @@ Fuego (link)
Stars |
- 813 |
+ 815 |
Watchers |
@@ -3310,7 +3310,7 @@ Fuego (link)
Last Updated |
- 2024-09-27T10:26:47Z |
+ 2024-09-30T19:02:02Z |
Archived |
@@ -3345,7 +3345,7 @@ Huma (link)
Stars |
- 1927 |
+ 1931 |
Watchers |
@@ -3353,7 +3353,7 @@ Huma (link)
Forks |
- 139 |
+ 142 |
Created |
@@ -3361,7 +3361,7 @@ Huma (link)
Last Updated |
- 2024-09-29T23:17:03Z |
+ 2024-09-30T20:09:15Z |
Archived |
@@ -3557,7 +3557,7 @@ fastify-openapi-glue (link)
Forks |
- 34 |
+ 33 |
Created |
diff --git a/docs/categories/description-validators.html b/docs/categories/description-validators.html
index 2e0b7b1d..a88143e8 100644
--- a/docs/categories/description-validators.html
+++ b/docs/categories/description-validators.html
@@ -112,7 +112,7 @@ Yes
Yes |
No |
- 210 |
+ 211 |
@@ -153,7 +153,7 @@ No |
Yes |
No |
- 913 |
+ 914 |
@@ -262,7 +262,7 @@ Yes |
Yes |
Yes |
- 909 |
+ 911 |
@@ -352,7 +352,7 @@ Yes |
Yes |
Yes |
- 572 |
+ 573 |
@@ -440,7 +440,7 @@ Yes |
Yes |
Yes |
- 576 |
+ 578 |
@@ -1708,7 +1708,7 @@ Rate My OpenAPI (link)
|
Stars |
- 210 |
+ 211 |
Watchers |
@@ -1724,7 +1724,7 @@ Rate My OpenAPI (link)
Last Updated |
- 2024-09-26T02:48:58Z |
+ 2024-09-30T22:48:30Z |
Archived |
@@ -1810,7 +1810,7 @@ express-openapi-validator (link)
Stars |
- 913 |
+ 914 |
Watchers |
@@ -1826,7 +1826,7 @@ express-openapi-validator (link)
Last Updated |
- 2024-09-23T03:04:21Z |
+ 2024-09-30T20:31:31Z |
Archived |
@@ -2065,7 +2065,7 @@ Redocly CLI (link)
Stars |
- 909 |
+ 911 |
Watchers |
@@ -2081,7 +2081,7 @@ Redocly CLI (link)
Last Updated |
- 2024-09-29T18:36:49Z |
+ 2024-09-30T12:41:29Z |
Archived |
@@ -2269,7 +2269,7 @@ api (link)
Stars |
- 572 |
+ 573 |
Watchers |
@@ -2285,7 +2285,7 @@ api (link)
Last Updated |
- 2024-09-28T16:07:40Z |
+ 2024-09-30T20:44:27Z |
Archived |
@@ -2473,7 +2473,7 @@ vacuum (link)
Stars |
- 576 |
+ 578 |
Watchers |
@@ -2489,7 +2489,7 @@ vacuum (link)
Last Updated |
- 2024-09-28T13:51:45Z |
+ 2024-09-30T13:18:27Z |
Archived |
diff --git a/docs/categories/documentation.html b/docs/categories/documentation.html
index 62289e3d..113346cd 100644
--- a/docs/categories/documentation.html
+++ b/docs/categories/documentation.html
@@ -169,7 +169,7 @@ Yes
Yes |
Yes |
- 6229 |
+ 6239 |
@@ -192,7 +192,7 @@ Yes |
No |
No |
- 1172 |
+ 1173 |
@@ -215,7 +215,7 @@ No |
Yes |
No |
- 1702 |
+ 1703 |
@@ -259,7 +259,7 @@ Yes |
Yes |
Yes |
- 23353 |
+ 23358 |
@@ -544,7 +544,7 @@ Yes |
Yes |
Yes |
- 909 |
+ 911 |
@@ -634,7 +634,7 @@ Yes |
Yes |
No |
- 3911 |
+ 3912 |
@@ -657,7 +657,7 @@ Yes |
Yes |
No |
- 896 |
+ 898 |
@@ -722,7 +722,7 @@ Yes |
Yes |
Yes |
- 1735 |
+ 1738 |
@@ -877,7 +877,7 @@ Yes |
Yes |
Yes |
- 176 |
+ 177 |
@@ -1072,7 +1072,7 @@ Yes |
Yes |
No |
- 57 |
+ 58 |
@@ -2602,7 +2602,7 @@ Scalar (link)
|
Stars |
- 6229 |
+ 6239 |
Watchers |
@@ -2610,7 +2610,7 @@ Scalar (link)
Forks |
- 199 |
+ 200 |
Created |
@@ -2618,7 +2618,7 @@ Scalar (link)
Last Updated |
- 2024-09-30T03:37:22Z |
+ 2024-10-01T02:00:38Z |
Archived |
@@ -2653,7 +2653,7 @@ Scramble (link)
Stars |
- 1172 |
+ 1173 |
Watchers |
@@ -2669,7 +2669,7 @@ Scramble (link)
Last Updated |
- 2024-09-28T10:59:59Z |
+ 2024-09-30T13:18:36Z |
Archived |
@@ -2704,7 +2704,7 @@ Scribe (link)
Stars |
- 1702 |
+ 1703 |
Watchers |
@@ -2720,7 +2720,7 @@ Scribe (link)
Last Updated |
- 2024-09-30T03:20:41Z |
+ 2024-09-30T04:23:24Z |
Archived |
@@ -2806,7 +2806,7 @@ ReDoc (link)
Stars |
- 23353 |
+ 23358 |
Watchers |
@@ -2822,7 +2822,7 @@ ReDoc (link)
Last Updated |
- 2024-09-30T02:02:49Z |
+ 2024-09-30T21:24:05Z |
Archived |
@@ -3469,7 +3469,7 @@ Redocly CLI (link)
Stars |
- 909 |
+ 911 |
Watchers |
@@ -3485,7 +3485,7 @@ Redocly CLI (link)
Last Updated |
- 2024-09-29T18:36:49Z |
+ 2024-09-30T12:41:29Z |
Archived |
@@ -3673,7 +3673,7 @@ OpenAPI DevTools (link)
Stars |
- 3911 |
+ 3912 |
Watchers |
@@ -3689,7 +3689,7 @@ OpenAPI DevTools (link)
Last Updated |
- 2024-09-29T02:19:22Z |
+ 2024-09-30T12:16:38Z |
Archived |
@@ -3724,7 +3724,7 @@ Restish (link)
Stars |
- 896 |
+ 898 |
Watchers |
@@ -3740,7 +3740,7 @@ Restish (link)
Last Updated |
- 2024-09-29T17:22:05Z |
+ 2024-09-30T15:05:40Z |
Archived |
@@ -3877,7 +3877,7 @@ Elements (link)
Stars |
- 1735 |
+ 1738 |
Watchers |
@@ -3893,7 +3893,7 @@ Elements (link)
Last Updated |
- 2024-09-29T23:40:42Z |
+ 2024-09-30T15:12:21Z |
Archived |
@@ -4234,7 +4234,7 @@ openapi-changes (link)
Stars |
- 176 |
+ 177 |
Watchers |
@@ -4250,7 +4250,7 @@ openapi-changes (link)
Last Updated |
- 2024-09-26T08:12:34Z |
+ 2024-09-30T04:13:57Z |
Archived |
@@ -4454,7 +4454,7 @@ 🌿 Fern (link)
Last Updated |
- 2024-09-29T23:54:51Z |
+ 2024-09-30T19:01:09Z |
Archived |
@@ -4693,7 +4693,7 @@ Zudoku (link)
Stars |
- 57 |
+ 58 |
Watchers |
@@ -4709,7 +4709,7 @@ Zudoku (link)
Last Updated |
- 2024-09-27T14:13:00Z |
+ 2024-09-30T21:17:53Z |
Archived |
@@ -4760,7 +4760,7 @@ rapidoc (link)
Last Updated |
- 2024-09-30T02:34:41Z |
+ 2024-09-30T17:20:05Z |
Archived |
@@ -4862,7 +4862,7 @@ znai (link)
Last Updated |
- 2024-09-29T18:56:15Z |
+ 2024-09-30T22:29:29Z |
Archived |
diff --git a/docs/categories/editors.html b/docs/categories/editors.html
index 2f2c21a2..e83f4120 100644
--- a/docs/categories/editors.html
+++ b/docs/categories/editors.html
@@ -91,7 +91,7 @@ No
Yes |
No |
- 1410 |
+ 1411 |
@@ -261,7 +261,7 @@ OpenAPI-gui (link)
|
Stars |
- 1410 |
+ 1411 |
Watchers |
@@ -277,7 +277,7 @@ OpenAPI-gui (link)
Last Updated |
- 2024-09-20T14:40:31Z |
+ 2024-09-30T21:39:39Z |
Archived |
diff --git a/docs/categories/gateway.html b/docs/categories/gateway.html
index 531b41a5..f5f48224 100644
--- a/docs/categories/gateway.html
+++ b/docs/categories/gateway.html
@@ -217,7 +217,7 @@ Yes
Yes |
Yes |
- 104 |
+ 106 |
@@ -600,7 +600,7 @@ wiretap (link)
|
Stars |
- 104 |
+ 106 |
Watchers |
@@ -616,7 +616,7 @@ wiretap (link)
Last Updated |
- 2024-09-30T03:22:59Z |
+ 2024-09-30T14:13:29Z |
Archived |
diff --git a/docs/categories/low-level-tooling.html b/docs/categories/low-level-tooling.html
index 648abaaa..499eb9bd 100644
--- a/docs/categories/low-level-tooling.html
+++ b/docs/categories/low-level-tooling.html
@@ -91,7 +91,7 @@ No
Yes |
No |
- 3256 |
+ 3254 |
@@ -156,7 +156,7 @@ No |
Yes |
No |
- 205 |
+ 206 |
@@ -1440,7 +1440,7 @@ springdoc-openapi (link)
|
Stars |
- 3256 |
+ 3254 |
Watchers |
@@ -1456,7 +1456,7 @@ springdoc-openapi (link)
Last Updated |
- 2024-09-29T23:11:22Z |
+ 2024-09-30T16:53:57Z |
Archived |
@@ -1593,7 +1593,7 @@ openapi.net.odata (link)
Stars |
- 205 |
+ 206 |
Watchers |
@@ -1609,7 +1609,7 @@ openapi.net.odata (link)
Last Updated |
- 2024-09-24T06:26:57Z |
+ 2024-09-30T16:47:18Z |
Archived |
@@ -4363,7 +4363,7 @@ Microsoft.OpenApi.net (link)
Last Updated |
- 2024-09-26T15:51:13Z |
+ 2024-09-30T09:30:53Z |
Archived |
diff --git a/docs/categories/mock-testing.html b/docs/categories/mock-testing.html
index 424aae57..8fbbbe80 100644
--- a/docs/categories/mock-testing.html
+++ b/docs/categories/mock-testing.html
@@ -91,7 +91,7 @@ Yes
Yes |
Yes |
- 1360 |
+ 1361 |
@@ -145,7 +145,7 @@ Microcks (link)
|
Stars |
- 1360 |
+ 1361 |
Watchers |
@@ -153,7 +153,7 @@ Microcks (link)
Forks |
- 212 |
+ 213 |
Created |
@@ -161,7 +161,7 @@ Microcks (link)
Last Updated |
- 2024-09-29T00:33:01Z |
+ 2024-09-30T13:28:07Z |
Archived |
diff --git a/docs/categories/mock.html b/docs/categories/mock.html
index 25a39e19..c2e11148 100644
--- a/docs/categories/mock.html
+++ b/docs/categories/mock.html
@@ -110,7 +110,7 @@ Yes
Yes |
Yes |
- 4246 |
+ 4248 |
@@ -543,7 +543,7 @@ No |
Yes |
Yes |
- 2869 |
+ 2872 |
@@ -821,7 +821,7 @@ Prism (link)
|
Stars |
- 4246 |
+ 4248 |
Watchers |
@@ -837,7 +837,7 @@ Prism (link)
Last Updated |
- 2024-09-28T06:34:20Z |
+ 2024-09-30T22:46:57Z |
Archived |
@@ -1841,7 +1841,7 @@ orval (link)
Stars |
- 2869 |
+ 2872 |
Watchers |
@@ -1849,7 +1849,7 @@ orval (link)
Forks |
- 321 |
+ 322 |
Created |
@@ -1857,7 +1857,7 @@ orval (link)
Last Updated |
- 2024-09-29T17:42:47Z |
+ 2024-09-30T14:14:34Z |
Archived |
diff --git a/docs/categories/parsers.html b/docs/categories/parsers.html
index 22b6b97e..b54fb46e 100644
--- a/docs/categories/parsers.html
+++ b/docs/categories/parsers.html
@@ -91,7 +91,7 @@ Yes
Yes |
Yes |
- 23353 |
+ 23358 |
@@ -292,7 +292,7 @@ Yes |
Yes |
Yes |
- 35 |
+ 36 |
@@ -719,7 +719,7 @@ No |
Yes |
Yes |
- 2568 |
+ 2569 |
@@ -1010,7 +1010,7 @@ Yes |
Yes |
Yes |
- 572 |
+ 573 |
@@ -1801,7 +1801,7 @@ Yes |
Yes |
No |
- 23353 |
+ 23358 |
@@ -1822,7 +1822,7 @@ No |
Yes |
No |
- 1425 |
+ 1426 |
@@ -1864,7 +1864,7 @@ No |
Yes |
No |
- 1171 |
+ 1170 |
@@ -1927,7 +1927,7 @@ No |
Yes |
No |
- 807 |
+ 808 |
@@ -2221,7 +2221,7 @@ No |
Yes |
No |
- 256 |
+ 257 |
@@ -2328,7 +2328,7 @@ No |
Yes |
No |
- 205 |
+ 206 |
@@ -3237,7 +3237,7 @@ No |
Yes |
No |
- 48 |
+ 49 |
@@ -3302,7 +3302,7 @@ Yes |
Yes |
No |
- 45 |
+ 46 |
@@ -11005,7 +11005,7 @@ ReDoc (link)
|
Stars |
- 23353 |
+ 23358 |
Watchers |
@@ -11021,7 +11021,7 @@ ReDoc (link)
Last Updated |
- 2024-09-30T02:02:49Z |
+ 2024-09-30T21:24:05Z |
Archived |
@@ -11464,7 +11464,7 @@ Redocly VSCode Extension (link)
Stars |
- 35 |
+ 36 |
Watchers |
@@ -11480,7 +11480,7 @@ Redocly VSCode Extension (link)
Last Updated |
- 2024-06-30T23:14:20Z |
+ 2024-09-30T05:43:52Z |
Archived |
@@ -12186,7 +12186,7 @@ APIDevTools/swagger-parser (link)
Forks |
- 154 |
+ 155 |
Created |
@@ -12433,7 +12433,7 @@ kin-openapi (link)
Stars |
- 2568 |
+ 2569 |
Watchers |
@@ -12449,7 +12449,7 @@ kin-openapi (link)
Last Updated |
- 2024-09-29T21:49:10Z |
+ 2024-09-30T15:21:42Z |
Archived |
@@ -12704,7 +12704,7 @@ Microsoft/OpenAPI.NET (link)
Last Updated |
- 2024-09-26T15:51:13Z |
+ 2024-09-30T09:30:53Z |
Archived |
@@ -12900,7 +12900,7 @@ go-swagger (link)
Forks |
- 1246 |
+ 1247 |
Created |
@@ -13096,7 +13096,7 @@ api (link)
Stars |
- 572 |
+ 573 |
Watchers |
@@ -13112,7 +13112,7 @@ api (link)
Last Updated |
- 2024-09-28T16:07:40Z |
+ 2024-09-30T20:44:27Z |
Archived |
@@ -14081,7 +14081,7 @@ Typoas (link)
Last Updated |
- 2024-09-26T23:39:51Z |
+ 2024-09-30T08:22:54Z |
Archived |
@@ -14881,7 +14881,7 @@ Redoc (link)
Stars |
- 23353 |
+ 23358 |
Watchers |
@@ -14897,7 +14897,7 @@ Redoc (link)
Last Updated |
- 2024-09-30T02:02:49Z |
+ 2024-09-30T21:24:05Z |
Archived |
@@ -14932,7 +14932,7 @@ openapi-generator-cli (link)
Stars |
- 1425 |
+ 1426 |
Watchers |
@@ -14948,7 +14948,7 @@ openapi-generator-cli (link)
Last Updated |
- 2024-09-29T19:01:17Z |
+ 2024-09-30T21:50:20Z |
Archived |
@@ -15034,7 +15034,7 @@ apispec (link)
Stars |
- 1171 |
+ 1170 |
Watchers |
@@ -15050,7 +15050,7 @@ apispec (link)
Last Updated |
- 2024-09-28T02:43:36Z |
+ 2024-09-30T19:45:28Z |
Archived |
@@ -15187,11 +15187,11 @@ openapi-diff (link)
Stars |
- 807 |
+ 808 |
Watchers |
- 20 |
+ 19 |
Forks |
@@ -15203,7 +15203,7 @@ openapi-diff (link)
Last Updated |
- 2024-09-26T08:29:50Z |
+ 2024-09-30T18:05:20Z |
Archived |
@@ -15450,7 +15450,7 @@ oazapfts (link)
Forks |
- 78 |
+ 79 |
Created |
@@ -15901,7 +15901,7 @@ zod-openapi (link)
Stars |
- 256 |
+ 257 |
Watchers |
@@ -15917,7 +15917,7 @@ zod-openapi (link)
Last Updated |
- 2024-09-30T01:58:32Z |
+ 2024-09-30T14:49:01Z |
Archived |
@@ -16156,7 +16156,7 @@ openapi.net.odata (link)
Stars |
- 205 |
+ 206 |
Watchers |
@@ -16172,7 +16172,7 @@ openapi.net.odata (link)
Last Updated |
- 2024-09-24T06:26:57Z |
+ 2024-09-30T16:47:18Z |
Archived |
@@ -16215,7 +16215,7 @@ fastify-openapi-glue (link)
Forks |
- 34 |
+ 33 |
Created |
@@ -16478,7 +16478,7 @@ speakeasy (link)
Last Updated |
- 2024-09-29T22:18:56Z |
+ 2024-09-30T23:49:57Z |
Archived |
@@ -17804,7 +17804,7 @@ apidom (link)
Last Updated |
- 2024-09-28T00:08:25Z |
+ 2024-09-30T23:18:31Z |
Archived |
@@ -18349,7 +18349,7 @@ rest (link)
Stars |
- 48 |
+ 49 |
Watchers |
@@ -18365,7 +18365,7 @@ rest (link)
Last Updated |
- 2024-09-27T16:35:36Z |
+ 2024-09-30T17:53:07Z |
Archived |
@@ -18502,7 +18502,7 @@ libopenapi-validator (link)
Stars |
- 45 |
+ 46 |
Watchers |
@@ -18518,7 +18518,7 @@ libopenapi-validator (link)
Last Updated |
- 2024-09-22T08:01:07Z |
+ 2024-10-01T01:41:13Z |
Archived |
@@ -21527,7 +21527,7 @@ yapily-openapi (link)
Last Updated |
- 2024-09-26T12:50:35Z |
+ 2024-09-30T16:13:44Z |
Archived |
@@ -27800,7 +27800,7 @@ pkg (link)
Last Updated |
- 2024-09-25T13:09:45Z |
+ 2024-09-30T21:24:11Z |
Archived |
@@ -28157,7 +28157,7 @@ openapi-to-java-records-mustache-templa
Last Updated |
- 2024-09-27T20:52:48Z |
+ 2024-09-30T17:00:55Z |
Archived |
@@ -32186,7 +32186,7 @@ utoipa (link)
Last Updated |
- 2024-09-28T13:57:33Z |
+ 2024-09-30T22:30:13Z |
Archived |
@@ -36011,7 +36011,7 @@ Microsoft.OpenApi.net (link)
Last Updated |
- 2024-09-26T15:51:13Z |
+ 2024-09-30T09:30:53Z |
Archived |
diff --git a/docs/categories/sdk.html b/docs/categories/sdk.html
index 8d17b495..8564d2bf 100644
--- a/docs/categories/sdk.html
+++ b/docs/categories/sdk.html
@@ -114,7 +114,7 @@ No
Yes |
Yes |
- 21424 |
+ 21427 |
@@ -160,7 +160,7 @@ No |
Yes |
Yes |
- 2862 |
+ 2863 |
@@ -206,7 +206,7 @@ Yes |
Yes |
Yes |
- 1360 |
+ 1361 |
@@ -229,7 +229,7 @@ Yes |
Yes |
Yes |
- 1070 |
+ 1077 |
@@ -382,7 +382,7 @@ No |
Yes |
Yes |
- 6713 |
+ 6715 |
@@ -537,7 +537,7 @@ No |
Yes |
Yes |
- 12552 |
+ 12555 |
@@ -878,7 +878,7 @@ Yes |
Yes |
Yes |
- 5625 |
+ 5626 |
@@ -3169,7 +3169,7 @@ OpenAPI Generator (link)
|
Stars |
- 21424 |
+ 21427 |
Watchers |
@@ -3177,7 +3177,7 @@ OpenAPI Generator (link)
Forks |
- 6479 |
+ 6482 |
Created |
@@ -3185,7 +3185,7 @@ OpenAPI Generator (link)
Last Updated |
- 2024-09-30T03:22:50Z |
+ 2024-10-01T03:34:17Z |
Archived |
@@ -3271,7 +3271,7 @@ Kiota Api Client Generator (link)
Stars |
- 2862 |
+ 2863 |
Watchers |
@@ -3287,7 +3287,7 @@ Kiota Api Client Generator (link)
Last Updated |
- 2024-09-30T02:27:51Z |
+ 2024-09-30T16:25:47Z |
Archived |
@@ -3373,7 +3373,7 @@ Microcks (link)
Stars |
- 1360 |
+ 1361 |
Watchers |
@@ -3381,7 +3381,7 @@ Microcks (link)
Forks |
- 212 |
+ 213 |
Created |
@@ -3389,7 +3389,7 @@ Microcks (link)
Last Updated |
- 2024-09-29T00:33:01Z |
+ 2024-09-30T13:28:07Z |
Archived |
@@ -3424,7 +3424,7 @@ @hey-api/openapi-ts (link)
Stars |
- 1070 |
+ 1077 |
Watchers |
@@ -3440,7 +3440,7 @@ @hey-api/openapi-ts (link)
Last Updated |
- 2024-09-29T15:41:11Z |
+ 2024-10-01T01:49:39Z |
Archived |
@@ -3636,7 +3636,7 @@ go-swagger (link)
Forks |
- 1246 |
+ 1247 |
Created |
@@ -3781,7 +3781,7 @@ NSwag (link)
Stars |
- 6713 |
+ 6715 |
Watchers |
@@ -3789,7 +3789,7 @@ NSwag (link)
Forks |
- 1244 |
+ 1289 |
Created |
@@ -3797,7 +3797,7 @@ NSwag (link)
Last Updated |
- 2024-09-29T12:53:01Z |
+ 2024-09-30T14:31:52Z |
Archived |
@@ -3887,7 +3887,7 @@ Azure AutoRest (link)
Watchers |
- 894 |
+ 896 |
Forks |
@@ -4138,7 +4138,7 @@ OWASP ZAP (link)
Stars |
- 12552 |
+ 12555 |
Watchers |
@@ -4154,7 +4154,7 @@ OWASP ZAP (link)
Last Updated |
- 2024-09-29T17:22:10Z |
+ 2024-09-30T17:13:24Z |
Archived |
@@ -4358,7 +4358,7 @@ Typoas (link)
Last Updated |
- 2024-09-26T23:39:51Z |
+ 2024-09-30T08:22:54Z |
Archived |
@@ -4664,7 +4664,7 @@ 🌿 Fern (link)
Last Updated |
- 2024-09-29T23:54:51Z |
+ 2024-09-30T19:01:09Z |
Archived |
@@ -4809,7 +4809,7 @@ Swift OpenAPI Generator (link)
Forks |
- 111 |
+ 113 |
Created |
@@ -4903,7 +4903,7 @@ OpenAPI TypeScript (link)
Stars |
- 5625 |
+ 5626 |
Watchers |
@@ -4911,7 +4911,7 @@ OpenAPI TypeScript (link)
Forks |
- 453 |
+ 454 |
Created |
@@ -4919,7 +4919,7 @@ OpenAPI TypeScript (link)
Last Updated |
- 2024-09-30T02:49:13Z |
+ 2024-09-30T17:51:04Z |
Archived |
@@ -5378,7 +5378,7 @@ apiclientcodegen (link)
Last Updated |
- 2024-09-28T22:55:33Z |
+ 2024-09-30T20:59:51Z |
Archived |
@@ -5429,7 +5429,7 @@ openapi-to-plantuml (link)
Last Updated |
- 2024-09-27T17:16:49Z |
+ 2024-09-30T17:04:42Z |
Archived |
@@ -5684,7 +5684,7 @@ sample-quarkus-applications (link)
Last Updated |
- 2024-09-23T15:36:48Z |
+ 2024-09-30T10:58:16Z |
Archived |
@@ -5735,7 +5735,7 @@ javalin-openapi (link)
Last Updated |
- 2024-09-26T03:35:55Z |
+ 2024-09-30T16:59:32Z |
Archived |
@@ -6143,7 +6143,7 @@ yapily-openapi (link)
Last Updated |
- 2024-09-26T12:50:35Z |
+ 2024-09-30T16:13:44Z |
Archived |
diff --git a/docs/categories/security.html b/docs/categories/security.html
index 32646934..504af7f9 100644
--- a/docs/categories/security.html
+++ b/docs/categories/security.html
@@ -91,7 +91,7 @@ Yes
Yes |
No |
- 210 |
+ 211 |
@@ -240,7 +240,7 @@ No |
Yes |
Yes |
- 12552 |
+ 12555 |
@@ -326,7 +326,7 @@ No |
Yes |
Yes |
- 2581 |
+ 2582 |
@@ -380,7 +380,7 @@ Rate My OpenAPI (link)
|
Stars |
- 210 |
+ 211 |
Watchers |
@@ -396,7 +396,7 @@ Rate My OpenAPI (link)
Last Updated |
- 2024-09-26T02:48:58Z |
+ 2024-09-30T22:48:30Z |
Archived |
@@ -651,7 +651,7 @@ cats (link)
Last Updated |
- 2024-09-29T20:33:47Z |
+ 2024-09-30T06:06:45Z |
Archived |
@@ -737,7 +737,7 @@ OWASP ZAP (link)
Stars |
- 12552 |
+ 12555 |
Watchers |
@@ -753,7 +753,7 @@ OWASP ZAP (link)
Last Updated |
- 2024-09-29T17:22:10Z |
+ 2024-09-30T17:13:24Z |
Archived |
@@ -941,7 +941,7 @@ RESTler (link)
Stars |
- 2581 |
+ 2582 |
Watchers |
@@ -957,7 +957,7 @@ RESTler (link)
Last Updated |
- 2024-09-29T01:17:09Z |
+ 2024-09-30T06:59:09Z |
Archived |
diff --git a/docs/categories/server-implementations.html b/docs/categories/server-implementations.html
index d9f9f2d8..f75cb92d 100644
--- a/docs/categories/server-implementations.html
+++ b/docs/categories/server-implementations.html
@@ -91,7 +91,7 @@ No
Yes |
Yes |
- 4475 |
+ 4474 |
@@ -114,7 +114,7 @@ Yes |
Yes |
No |
- 210 |
+ 211 |
@@ -137,7 +137,7 @@ Yes |
No |
No |
- 1172 |
+ 1173 |
@@ -298,7 +298,7 @@ Yes |
Yes |
Yes |
- 8886 |
+ 8887 |
@@ -344,7 +344,7 @@ Yes |
Yes |
Yes |
- 4246 |
+ 4248 |
@@ -434,7 +434,7 @@ Yes |
Yes |
Yes |
- 909 |
+ 911 |
@@ -480,7 +480,7 @@ No |
Yes |
No |
- 5039 |
+ 5040 |
@@ -549,7 +549,7 @@ No |
Yes |
No |
- 4344 |
+ 4347 |
@@ -616,7 +616,7 @@ No |
Yes |
No |
- 28202 |
+ 28204 |
@@ -777,7 +777,7 @@ No |
Yes |
No |
- 76109 |
+ 76135 |
@@ -800,7 +800,7 @@ No |
Yes |
No |
- 3256 |
+ 3254 |
@@ -821,7 +821,7 @@ No |
Yes |
No |
- 2693 |
+ 2694 |
@@ -842,7 +842,7 @@ No |
Yes |
No |
- 2332 |
+ 2333 |
@@ -863,7 +863,7 @@ No |
Yes |
No |
- 2283 |
+ 2285 |
@@ -886,7 +886,7 @@ No |
Yes |
No |
- 2243 |
+ 2245 |
@@ -930,7 +930,7 @@ No |
Yes |
No |
- 1410 |
+ 1411 |
@@ -1100,7 +1100,7 @@ No |
Yes |
No |
- 372 |
+ 373 |
@@ -1144,7 +1144,7 @@ No |
Yes |
No |
- 359 |
+ 360 |
@@ -1228,7 +1228,7 @@ No |
Yes |
No |
- 295 |
+ 297 |
@@ -1333,7 +1333,7 @@ No |
Yes |
No |
- 194 |
+ 195 |
@@ -1396,7 +1396,7 @@ No |
Yes |
No |
- 146 |
+ 147 |
@@ -1606,7 +1606,7 @@ Yes |
Yes |
No |
- 67 |
+ 68 |
@@ -1858,7 +1858,7 @@ No |
Yes |
No |
- 40 |
+ 41 |
@@ -2285,27 +2285,6 @@
- kafka-streams-redis-statestore |
- A demo project demonstrating how to read and write data into a Redis-backed state store using Kafka Streams. |
-
- No
- |
-
-
- Link
-
- |
- No |
- Yes |
- No |
- 21 |
-
-
-
-
- | |
-
redocly-cli-cookbook |
A community-created collection of configuration, plugins and techniques for getting the best from Redocly CLI in every situation. |
@@ -2516,27 +2495,6 @@
- springboot-kafka-streams-rest-api |
- A sample RESTful API with Kafka Streams (2.6.0) using Spring Boot (2.3.3) and Java 14. |
-
- No
- |
-
-
- Link
-
- |
- No |
- Yes |
- No |
- 16 |
-
-
-
-
- |
-
simple-go-webserver |
Golang webserver with DDD and Clean Architecture |
@@ -2980,27 +2938,6 @@
- springboot-swagger-rest-api |
- A sample RESTful API using Spring Boot (2.3.2) and Java 14 with Swagger enabled. |
-
- No
- |
-
-
- Link
-
- |
- No |
- Yes |
- No |
- 9 |
-
-
-
-
- |
-
frappe-api |
FastAPI for Frappe |
@@ -4191,7 +4128,7 @@ No
Yes |
No |
- 4 |
+ 5 |
@@ -6354,7 +6291,7 @@ No |
Yes |
No |
- 1 |
+ 2 |
@@ -9319,7 +9256,7 @@ No |
Yes |
No |
- 26531 |
+ 26552 |
@@ -9594,7 +9531,7 @@ Yes |
Yes |
No |
- 140 |
+ 141 |
@@ -11257,7 +11194,7 @@ No |
No |
No |
- 3590 |
+ 3589 |
@@ -11760,7 +11697,7 @@ Connexion (link)
|
Stars |
- 4475 |
+ 4474 |
Watchers |
@@ -11776,7 +11713,7 @@ Connexion (link)
Last Updated |
- 2024-09-26T18:03:58Z |
+ 2024-10-01T01:31:24Z |
Archived |
@@ -11811,7 +11748,7 @@ Rate My OpenAPI (link)
Stars |
- 210 |
+ 211 |
Watchers |
@@ -11827,7 +11764,7 @@ Rate My OpenAPI (link)
Last Updated |
- 2024-09-26T02:48:58Z |
+ 2024-09-30T22:48:30Z |
Archived |
@@ -11862,7 +11799,7 @@ Scramble (link)
Stars |
- 1172 |
+ 1173 |
Watchers |
@@ -11878,7 +11815,7 @@ Scramble (link)
Last Updated |
- 2024-09-28T10:59:59Z |
+ 2024-09-30T13:18:36Z |
Archived |
@@ -12219,7 +12156,7 @@ Swagger Editor (link)
Stars |
- 8886 |
+ 8887 |
Watchers |
@@ -12227,7 +12164,7 @@ Swagger Editor (link)
Forks |
- 2247 |
+ 2248 |
Created |
@@ -12235,7 +12172,7 @@ Swagger Editor (link)
Last Updated |
- 2024-09-29T17:33:14Z |
+ 2024-09-30T08:15:36Z |
Archived |
@@ -12321,7 +12258,7 @@ Prism (link)
Stars |
- 4246 |
+ 4248 |
Watchers |
@@ -12337,7 +12274,7 @@ Prism (link)
Last Updated |
- 2024-09-28T06:34:20Z |
+ 2024-09-30T22:46:57Z |
Archived |
@@ -12376,7 +12313,7 @@ API Platform (link)
Watchers |
- 212 |
+ 213 |
Forks |
@@ -12388,7 +12325,7 @@ API Platform (link)
Last Updated |
- 2024-09-29T21:46:00Z |
+ 2024-09-30T18:30:18Z |
Archived |
@@ -12525,7 +12462,7 @@ Redocly CLI (link)
Stars |
- 909 |
+ 911 |
Watchers |
@@ -12541,7 +12478,7 @@ Redocly CLI (link)
Last Updated |
- 2024-09-29T18:36:49Z |
+ 2024-09-30T12:41:29Z |
Archived |
@@ -12592,7 +12529,7 @@ cats (link)
Last Updated |
- 2024-09-29T20:33:47Z |
+ 2024-09-30T06:06:45Z |
Archived |
@@ -12627,7 +12564,7 @@ mitmproxy2swagger (link)
Stars |
- 5039 |
+ 5040 |
Watchers |
@@ -12643,7 +12580,7 @@ mitmproxy2swagger (link)
Last Updated |
- 2024-09-30T03:24:11Z |
+ 2024-09-30T19:12:33Z |
Archived |
@@ -12780,7 +12717,7 @@ TypeSpec (link)
Stars |
- 4344 |
+ 4347 |
Watchers |
@@ -12788,7 +12725,7 @@ TypeSpec (link)
Forks |
- 202 |
+ 201 |
Created |
@@ -12796,7 +12733,7 @@ TypeSpec (link)
Last Updated |
- 2024-09-30T03:18:44Z |
+ 2024-09-30T23:09:38Z |
Archived |
@@ -12933,7 +12870,7 @@ Django REST Framework (link)
Stars |
- 28202 |
+ 28204 |
Watchers |
@@ -12941,7 +12878,7 @@ Django REST Framework (link)
Forks |
- 6815 |
+ 6813 |
Created |
@@ -12949,7 +12886,7 @@ Django REST Framework (link)
Last Updated |
- 2024-09-30T03:21:08Z |
+ 2024-10-01T00:14:19Z |
Archived |
@@ -13290,7 +13227,7 @@ FastAPI (link)
Stars |
- 76109 |
+ 76135 |
Watchers |
@@ -13298,7 +13235,7 @@ FastAPI (link)
Forks |
- 6418 |
+ 6420 |
Created |
@@ -13306,7 +13243,7 @@ FastAPI (link)
Last Updated |
- 2024-09-30T03:28:42Z |
+ 2024-10-01T03:05:57Z |
Archived |
@@ -13341,7 +13278,7 @@ springdoc-openapi (link)
Stars |
- 3256 |
+ 3254 |
Watchers |
@@ -13357,7 +13294,7 @@ springdoc-openapi (link)
Last Updated |
- 2024-09-29T23:11:22Z |
+ 2024-09-30T16:53:57Z |
Archived |
@@ -13392,7 +13329,7 @@ uvicorn-gunicorn-fastapi-docker (link)<
Stars |
- 2693 |
+ 2694 |
Watchers |
@@ -13408,7 +13345,7 @@ uvicorn-gunicorn-fastapi-docker (link)<
Last Updated |
- 2024-09-30T01:26:51Z |
+ 2024-09-30T18:10:40Z |
Archived |
@@ -13443,7 +13380,7 @@ drf-spectacular (link)
Stars |
- 2332 |
+ 2333 |
Watchers |
@@ -13459,7 +13396,7 @@ drf-spectacular (link)
Last Updated |
- 2024-09-30T01:01:01Z |
+ 2024-09-30T09:28:52Z |
Archived |
@@ -13494,7 +13431,7 @@ msgspec (link)
Stars |
- 2283 |
+ 2285 |
Watchers |
@@ -13510,7 +13447,7 @@ msgspec (link)
Last Updated |
- 2024-09-29T17:42:46Z |
+ 2024-10-01T03:17:35Z |
Archived |
@@ -13545,7 +13482,7 @@ Schemathesis (link)
Stars |
- 2243 |
+ 2245 |
Watchers |
@@ -13561,7 +13498,7 @@ Schemathesis (link)
Last Updated |
- 2024-09-29T19:57:54Z |
+ 2024-09-30T23:46:03Z |
Archived |
@@ -13612,7 +13549,7 @@ rapidoc (link)
Last Updated |
- 2024-09-30T02:34:41Z |
+ 2024-09-30T17:20:05Z |
Archived |
@@ -13647,7 +13584,7 @@ OpenAPI-gui (link)
Stars |
- 1410 |
+ 1411 |
Watchers |
@@ -13663,7 +13600,7 @@ OpenAPI-gui (link)
Last Updated |
- 2024-09-20T14:40:31Z |
+ 2024-09-30T21:39:39Z |
Archived |
@@ -13867,7 +13804,7 @@ stackql (link)
Last Updated |
- 2024-09-27T20:56:16Z |
+ 2024-09-30T20:56:18Z |
Archived |
@@ -14055,7 +13992,7 @@ fastapi-clean-example (link)
Stars |
- 372 |
+ 373 |
Watchers |
@@ -14071,7 +14008,7 @@ fastapi-clean-example (link)
Last Updated |
- 2024-09-26T16:49:13Z |
+ 2024-09-30T07:39:21Z |
Archived |
@@ -14157,7 +14094,7 @@ rest (link)
Stars |
- 359 |
+ 360 |
Watchers |
@@ -14173,7 +14110,7 @@ rest (link)
Last Updated |
- 2024-09-28T16:54:26Z |
+ 2024-09-30T11:51:01Z |
Archived |
@@ -14361,7 +14298,7 @@ esmerald (link)
Stars |
- 295 |
+ 297 |
Watchers |
@@ -14377,7 +14314,7 @@ esmerald (link)
Last Updated |
- 2024-09-29T15:42:12Z |
+ 2024-09-30T23:54:03Z |
Archived |
@@ -14616,7 +14553,7 @@ typescript-backend-toolkit (link)
Stars |
- 194 |
+ 195 |
Watchers |
@@ -14632,7 +14569,7 @@ typescript-backend-toolkit (link)
Last Updated |
- 2024-09-29T23:15:05Z |
+ 2024-09-30T10:00:13Z |
Archived |
@@ -14769,7 +14706,7 @@ deeptest (link)
Stars |
- 146 |
+ 147 |
Watchers |
@@ -14785,7 +14722,7 @@ deeptest (link)
Last Updated |
- 2024-09-30T02:45:05Z |
+ 2024-09-30T22:57:43Z |
Archived |
@@ -15142,7 +15079,7 @@ tools.openapis.org (link)
Last Updated |
- 2024-09-29T13:33:09Z |
+ 2024-09-30T03:39:33Z |
Archived |
@@ -15279,7 +15216,7 @@ spectral-owasp-ruleset (link)
Stars |
- 67 |
+ 68 |
Watchers |
@@ -15295,7 +15232,7 @@ spectral-owasp-ruleset (link)
Last Updated |
- 2024-09-18T13:34:29Z |
+ 2024-09-30T19:11:13Z |
Archived |
@@ -15891,7 +15828,7 @@ full-stack-fastapi-mysql (link)
Stars |
- 40 |
+ 41 |
Watchers |
@@ -15907,7 +15844,7 @@ full-stack-fastapi-mysql (link)
Last Updated |
- 2024-09-26T11:59:34Z |
+ 2024-09-30T08:32:06Z |
Archived |
@@ -16943,57 +16880,6 @@ bingchain (link)
-
-
-
-
-
- Repository Owner |
- ben-jamin-chen |
-
-
- Stars |
- 21 |
-
-
- Watchers |
- 1 |
-
-
- Forks |
- 7 |
-
-
- Created |
- 2020-08-22T04:54:11Z |
-
-
- Last Updated |
- 2024-09-08T18:44:30Z |
-
-
- Archived |
- No |
-
-
- Language |
- Java |
-
-
-
-
-
-
-
Last Updated |
- 2024-09-29T23:57:26Z |
+ 2024-09-30T23:19:19Z |
Archived |
@@ -18626,57 +18461,6 @@ aiohttp-deps (link)
-
-
-
-
-
- Repository Owner |
- ben-jamin-chen |
-
-
- Stars |
- 9 |
-
-
- Watchers |
- 1 |
-
-
- Forks |
- 7 |
-
-
- Created |
- 2020-07-21T23:28:43Z |
-
-
- Last Updated |
- 2024-08-29T06:57:42Z |
-
-
- Archived |
- No |
-
-
- Language |
- Java |
-
-
-
-
-
-
-
Last Updated |
- 2024-09-27T15:10:22Z |
+ 2024-09-30T15:35:21Z |
Archived |
@@ -20803,7 +20587,7 @@ cossim-server (link)
Last Updated |
- 2024-09-15T12:49:50Z |
+ 2024-09-30T19:23:59Z |
Archived |
@@ -21552,7 +21336,7 @@ nest-starter (link)
Stars |
- 4 |
+ 5 |
Watchers |
@@ -21568,7 +21352,7 @@ nest-starter (link)
Last Updated |
- 2024-09-03T16:13:15Z |
+ 2024-09-30T17:45:12Z |
Archived |
@@ -26805,7 +26589,7 @@ programming-machine-learning (link)
Stars |
- 1 |
+ 2 |
Watchers |
@@ -26821,7 +26605,7 @@ programming-machine-learning (link)
Last Updated |
- 2024-09-26T18:33:01Z |
+ 2024-09-30T21:10:52Z |
Archived |
@@ -33996,7 +33780,7 @@ full-stack-fastapi-template (link)
Stars |
- 26531 |
+ 26552 |
Watchers |
@@ -34004,7 +33788,7 @@ full-stack-fastapi-template (link)
Forks |
- 4655 |
+ 4665 |
Created |
@@ -34012,7 +33796,7 @@ full-stack-fastapi-template (link)
Last Updated |
- 2024-09-30T03:12:19Z |
+ 2024-10-01T02:15:33Z |
Archived |
@@ -34624,7 +34408,7 @@ spring-boot-starter-tomcat (link)
Last Updated |
- 2024-09-27T20:04:05Z |
+ 2024-09-30T15:23:37Z |
Archived |
@@ -34659,7 +34443,7 @@ UI Bakery (link)
Stars |
- 140 |
+ 141 |
Watchers |
@@ -34675,7 +34459,7 @@ UI Bakery (link)
Last Updated |
- 2024-09-29T20:09:14Z |
+ 2024-09-30T17:43:26Z |
Archived |
@@ -38688,7 +38472,7 @@ PHP-CRUD-API (link)
Stars |
- 3590 |
+ 3589 |
Watchers |
@@ -38704,7 +38488,7 @@ PHP-CRUD-API (link)
Last Updated |
- 2024-09-26T15:05:44Z |
+ 2024-09-30T15:39:32Z |
Archived |
@@ -38806,11 +38590,11 @@ JSONSchema::Validator (link)
Last Updated |
- 2024-04-12T09:18:53Z |
+ 2024-09-30T14:11:46Z |
Archived |
- Yes |
+ No |
Language |
@@ -41529,22 +41313,6 @@ pyswagger (link)
- document
- .getElementById("574d5c6f9e5705994875220ae1875d15-open-button")
- .onclick = function () {
- const wrapper = document.getElementById("tool-content")
- const content = document.getElementById("574d5c6f9e5705994875220ae1875d15-info")
-
- content.removeAttribute("hidden")
-
- wrapper.appendChild(content)
- modal.style.display = "block";
- }
-
-
-
-
-
document
.getElementById("2d252e6d912a2772d88fd6f022fff74f-open-button")
.onclick = function () {
@@ -41705,22 +41473,6 @@ pyswagger (link)
- document
- .getElementById("0c2d44cef1118bbebe90119d0b6e9879-open-button")
- .onclick = function () {
- const wrapper = document.getElementById("tool-content")
- const content = document.getElementById("0c2d44cef1118bbebe90119d0b6e9879-info")
-
- content.removeAttribute("hidden")
-
- wrapper.appendChild(content)
- modal.style.display = "block";
- }
-
-
-
-
-
document
.getElementById("407da12faa6c6f82979cc1d77ea6233c-open-button")
.onclick = function () {
@@ -42057,22 +41809,6 @@ pyswagger (link)
- document
- .getElementById("a9df75197b7dc50eefc61eead6539c2b-open-button")
- .onclick = function () {
- const wrapper = document.getElementById("tool-content")
- const content = document.getElementById("a9df75197b7dc50eefc61eead6539c2b-info")
-
- content.removeAttribute("hidden")
-
- wrapper.appendChild(content)
- modal.style.display = "block";
- }
-
-
-
-
-
document
.getElementById("5236d3cd66d4217b20b78ce5142a773e-open-button")
.onclick = function () {
diff --git a/docs/categories/server.html b/docs/categories/server.html
index f5cf08cf..9bb2fbba 100644
--- a/docs/categories/server.html
+++ b/docs/categories/server.html
@@ -91,7 +91,7 @@ No
Yes |
Yes |
- 4475 |
+ 4474 |
@@ -592,7 +592,7 @@ No |
Yes |
No |
- 813 |
+ 815 |
@@ -615,7 +615,7 @@ Yes |
Yes |
No |
- 1927 |
+ 1931 |
@@ -2771,7 +2771,7 @@ No |
Yes |
No |
- 4935 |
+ 4936 |
@@ -2892,7 +2892,7 @@ Connexion (link)
|
Stars |
- 4475 |
+ 4474 |
Watchers |
@@ -2908,7 +2908,7 @@ Connexion (link)
Last Updated |
- 2024-09-26T18:03:58Z |
+ 2024-10-01T01:31:24Z |
Archived |
@@ -3202,7 +3202,7 @@ API Platform (link)
Watchers |
- 212 |
+ 213 |
Forks |
@@ -3214,7 +3214,7 @@ API Platform (link)
Last Updated |
- 2024-09-29T21:46:00Z |
+ 2024-09-30T18:30:18Z |
Archived |
@@ -3469,7 +3469,7 @@ @nestjs/swagger (link)
Last Updated |
- 2024-09-29T09:59:24Z |
+ 2024-09-30T22:08:15Z |
Archived |
@@ -3928,7 +3928,7 @@ 🌿 Fern (link)
Last Updated |
- 2024-09-29T23:54:51Z |
+ 2024-09-30T19:01:09Z |
Archived |
@@ -3971,7 +3971,7 @@ Swift OpenAPI Generator (link)
Forks |
- 111 |
+ 113 |
Created |
@@ -4014,7 +4014,7 @@ Fuego (link)
Stars |
- 813 |
+ 815 |
Watchers |
@@ -4030,7 +4030,7 @@ Fuego (link)
Last Updated |
- 2024-09-27T10:26:47Z |
+ 2024-09-30T19:02:02Z |
Archived |
@@ -4065,7 +4065,7 @@ Huma (link)
Stars |
- 1927 |
+ 1931 |
Watchers |
@@ -4073,7 +4073,7 @@ Huma (link)
Forks |
- 139 |
+ 142 |
Created |
@@ -4081,7 +4081,7 @@ Huma (link)
Last Updated |
- 2024-09-29T23:17:03Z |
+ 2024-09-30T20:09:15Z |
Archived |
@@ -5866,7 +5866,7 @@ restdocs-openapi3 (link)
Last Updated |
- 2024-09-24T01:28:11Z |
+ 2024-10-01T01:28:30Z |
Archived |
@@ -9267,7 +9267,7 @@ LoopBack 4 (link)
Stars |
- 4935 |
+ 4936 |
Watchers |
@@ -9283,7 +9283,7 @@ LoopBack 4 (link)
Last Updated |
- 2024-09-28T18:45:42Z |
+ 2024-09-30T07:46:15Z |
Archived |
diff --git a/docs/categories/testing-tools.html b/docs/categories/testing-tools.html
index 35158357..2005963e 100644
--- a/docs/categories/testing-tools.html
+++ b/docs/categories/testing-tools.html
@@ -91,7 +91,7 @@ Yes
Yes |
Yes |
- 104 |
+ 106 |
@@ -114,7 +114,7 @@ No |
Yes |
No |
- 2243 |
+ 2245 |
@@ -191,7 +191,7 @@ wiretap (link)
|
Stars |
- 104 |
+ 106 |
Watchers |
@@ -207,7 +207,7 @@ wiretap (link)
Last Updated |
- 2024-09-30T03:22:59Z |
+ 2024-09-30T14:13:29Z |
Archived |
@@ -242,7 +242,7 @@ Schemathesis (link)
Stars |
- 2243 |
+ 2245 |
Watchers |
@@ -258,7 +258,7 @@ Schemathesis (link)
Last Updated |
- 2024-09-29T19:57:54Z |
+ 2024-09-30T23:46:03Z |
Archived |
diff --git a/docs/categories/testing.html b/docs/categories/testing.html
index 7e250a33..47b8c0cd 100644
--- a/docs/categories/testing.html
+++ b/docs/categories/testing.html
@@ -240,7 +240,7 @@ No
Yes |
No |
- 1632 |
+ 1633 |
@@ -368,7 +368,7 @@ Yes |
Yes |
No |
- 896 |
+ 898 |
@@ -631,7 +631,7 @@ Yes |
Yes |
Yes |
- 176 |
+ 177 |
@@ -677,7 +677,7 @@ Yes |
Yes |
Yes |
- 104 |
+ 106 |
@@ -2640,7 +2640,7 @@ No |
Yes |
Yes |
- 2581 |
+ 2582 |
@@ -3091,7 +3091,7 @@ Step CI (link)
|
Stars |
- 1632 |
+ 1633 |
Watchers |
@@ -3107,7 +3107,7 @@ Step CI (link)
Last Updated |
- 2024-09-29T22:13:27Z |
+ 2024-09-30T07:05:28Z |
Archived |
@@ -3397,7 +3397,7 @@ Restish (link)
Stars |
- 896 |
+ 898 |
Watchers |
@@ -3413,7 +3413,7 @@ Restish (link)
Last Updated |
- 2024-09-29T17:22:05Z |
+ 2024-09-30T15:05:40Z |
Archived |
@@ -4009,7 +4009,7 @@ openapi-changes (link)
Stars |
- 176 |
+ 177 |
Watchers |
@@ -4025,7 +4025,7 @@ openapi-changes (link)
Last Updated |
- 2024-09-26T08:12:34Z |
+ 2024-09-30T04:13:57Z |
Archived |
@@ -4111,7 +4111,7 @@ wiretap (link)
Stars |
- 104 |
+ 106 |
Watchers |
@@ -4127,7 +4127,7 @@ wiretap (link)
Last Updated |
- 2024-09-30T03:22:59Z |
+ 2024-09-30T14:13:29Z |
Archived |
@@ -4229,7 +4229,7 @@ mockoon (link)
Last Updated |
- 2024-09-30T01:33:07Z |
+ 2024-09-30T18:29:05Z |
Archived |
@@ -4739,7 +4739,7 @@ jellyfin-sdk-kotlin (link)
Last Updated |
- 2024-09-27T08:11:15Z |
+ 2024-09-30T16:46:32Z |
Archived |
@@ -5045,7 +5045,7 @@ mockoon.com (link)
Last Updated |
- 2024-09-28T09:34:53Z |
+ 2024-09-30T18:45:50Z |
Archived |
@@ -5504,7 +5504,7 @@ openapi-specs (link)
Last Updated |
- 2024-09-25T08:31:06Z |
+ 2024-09-30T13:56:21Z |
Archived |
@@ -8854,7 +8854,7 @@ RESTler (link)
Stars |
- 2581 |
+ 2582 |
Watchers |
@@ -8870,7 +8870,7 @@ RESTler (link)
Last Updated |
- 2024-09-29T01:17:09Z |
+ 2024-09-30T06:59:09Z |
Archived |
diff --git a/docs/categories/text-editors.html b/docs/categories/text-editors.html
index dbc931d0..eb511e37 100644
--- a/docs/categories/text-editors.html
+++ b/docs/categories/text-editors.html
@@ -157,7 +157,7 @@ Yes
Yes |
Yes |
- 8886 |
+ 8887 |
@@ -200,7 +200,7 @@ Yes |
Yes |
Yes |
- 35 |
+ 36 |
@@ -594,7 +594,7 @@ Swagger Editor (link)
|
Stars |
- 8886 |
+ 8887 |
Watchers |
@@ -602,7 +602,7 @@ Swagger Editor (link)
Forks |
- 2247 |
+ 2248 |
Created |
@@ -610,7 +610,7 @@ Swagger Editor (link)
Last Updated |
- 2024-09-29T17:33:14Z |
+ 2024-09-30T08:15:36Z |
Archived |
@@ -696,7 +696,7 @@ Redocly VSCode Extension (link)
Stars |
- 35 |
+ 36 |
Watchers |
@@ -712,7 +712,7 @@ Redocly VSCode Extension (link)
Last Updated |
- 2024-06-30T23:14:20Z |
+ 2024-09-30T05:43:52Z |
Archived |
diff --git a/docs/categories/user-interfaces.html b/docs/categories/user-interfaces.html
index 87917d08..e334d295 100644
--- a/docs/categories/user-interfaces.html
+++ b/docs/categories/user-interfaces.html
@@ -91,7 +91,7 @@ Yes
Yes |
No |
- 26381 |
+ 26387 |
@@ -114,7 +114,7 @@ Yes |
Yes |
No |
- 23353 |
+ 23358 |
@@ -275,7 +275,7 @@ swagger-ui (link)
|
Stars |
- 26381 |
+ 26387 |
Watchers |
@@ -283,7 +283,7 @@ swagger-ui (link)
Forks |
- 8921 |
+ 8922 |
Created |
@@ -291,7 +291,7 @@ swagger-ui (link)
Last Updated |
- 2024-09-30T03:15:26Z |
+ 2024-10-01T00:44:06Z |
Archived |
@@ -326,7 +326,7 @@ Redoc (link)
Stars |
- 23353 |
+ 23358 |
Watchers |
@@ -342,7 +342,7 @@ Redoc (link)
Last Updated |
- 2024-09-30T02:02:49Z |
+ 2024-09-30T21:24:05Z |
Archived |
diff --git a/docs/index.html b/docs/index.html
index fe98f47a..b3e7456b 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -110,7 +110,7 @@
- All (1552)
+ All (1549)
@@ -119,7 +119,7 @@
- Server Implementations (550)
+ Server Implementations (547)
diff --git a/src/_data/tools.yaml b/src/_data/tools.yaml
index 0562bb50..32f7d90c 100644
--- a/src/_data/tools.yaml
+++ b/src/_data/tools.yaml
@@ -142,17 +142,17 @@
Connexion is a modern Python web framework that makes spec-first and
api-first development easy.
created: '2015-05-19T13:05:58Z'
- updated: '2024-09-26T18:03:58Z'
+ updated: '2024-10-01T01:31:24Z'
language: Python
archived: false
- stars: 4475
+ stars: 4474
watchers: 84
forks: 761
owner: spec-first
logo: https://avatars.githubusercontent.com/u/58754196?v=4
license: Apache-2.0
- repoEtag: '"125c299e637b7a5b776b052fcd8a311146edabf663ed2efd9400c849cd6ebf6c"'
- repoLastModified: Thu, 26 Sep 2024 18:03:58 GMT
+ repoEtag: '"e37a70fc9eab8171d5043b0c1895c1b073f874bba1ff15225ea20873091680c8"'
+ repoLastModified: Tue, 01 Oct 2024 01:31:24 GMT
foundInMaster: true
homepage: https://github.com/zalando/connexion
id: 2d575abdf2671028868058b2442d9131
@@ -241,17 +241,17 @@
repositoryId: 653466139
description: null
created: '2023-06-14T05:39:38Z'
- updated: '2024-09-26T02:48:58Z'
+ updated: '2024-09-30T22:48:30Z'
language: TypeScript
archived: false
- stars: 210
+ stars: 211
watchers: 4
forks: 5
owner: zuplo
logo: https://avatars.githubusercontent.com/u/85497839?v=4
license: MIT
- repoEtag: '"0ef8105534f332bcacc2835364b32f6736fcdae0c82befa801fc1551dbf28a63"'
- repoLastModified: Thu, 26 Sep 2024 02:48:58 GMT
+ repoEtag: '"d46132e2e848ecdf2b55e77f279b2cdbba47b22abc61a313ad7182df7706401b"'
+ repoLastModified: Mon, 30 Sep 2024 22:48:30 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-09-30T03:37:22Z'
+ updated: '2024-10-01T02:00:38Z'
language: TypeScript
archived: false
- stars: 6229
+ stars: 6239
watchers: 21
- forks: 199
+ forks: 200
owner: scalar
logo: https://avatars.githubusercontent.com/u/301879?v=4
license: MIT
- repoEtag: '"fd011e90545614818f2f7b115b74ac4ffb3a1e2c9e81feecb115e5cb711f8161"'
- repoLastModified: Mon, 30 Sep 2024 03:37:22 GMT
+ repoEtag: '"235e216ce5b0fe2f39789d8a972dcecaf1d1573c08a070d817d2accd97be507a"'
+ repoLastModified: Tue, 01 Oct 2024 02:00:38 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-09-28T10:59:59Z'
+ updated: '2024-09-30T13:18:36Z'
language: PHP
archived: false
- stars: 1172
+ stars: 1173
watchers: 14
forks: 112
owner: dedoc
logo: https://avatars.githubusercontent.com/u/93313138?v=4
license: MIT
- repoEtag: '"05a64c73011a5301e1feb97a77d4edf18bd6ab87268aad59e6c2cd43f8abccaf"'
- repoLastModified: Sat, 28 Sep 2024 10:59:59 GMT
+ repoEtag: '"970b29a62275b604c9eeaab772cb3f11ed3b7e6d842abb419761d224fca691f4"'
+ repoLastModified: Mon, 30 Sep 2024 13:18:36 GMT
foundInMaster: true
- source: https://openapi.tools/
name: Scribe
@@ -348,17 +348,17 @@
repositoryId: 260729799
description: Generate API documentation for humans from your Laravel codebase.✍
created: '2020-05-02T16:36:45Z'
- updated: '2024-09-30T03:20:41Z'
+ updated: '2024-09-30T04:23:24Z'
language: PHP
archived: false
- stars: 1702
+ stars: 1703
watchers: 18
forks: 303
owner: knuckleswtf
logo: https://avatars.githubusercontent.com/u/63367037?v=4
license: MIT
- repoEtag: '"06f88214216525ec40e3411c4807f8b43526950296455944d75170d4833500d9"'
- repoLastModified: Mon, 30 Sep 2024 03:20:41 GMT
+ repoEtag: '"3d1e39f8e404205e0cf9fa3d5ab3da73a0839aaeb168b62224c9651f36949c0f"'
+ repoLastModified: Mon, 30 Sep 2024 04:23:24 GMT
foundInMaster: true
- source: https://openapi.tools/
name: Supermodel
@@ -405,17 +405,17 @@
repositoryId: 45250726
description: 📘 OpenAPI/Swagger-generated API Reference Documentation
created: '2015-10-30T12:53:02Z'
- updated: '2024-09-30T02:02:49Z'
+ updated: '2024-09-30T21:24:05Z'
language: TypeScript
archived: false
- stars: 23353
+ stars: 23358
watchers: 297
forks: 2290
owner: Redocly
logo: https://avatars.githubusercontent.com/u/32099856?v=4
license: MIT
- repoEtag: '"a4e015080fbd42957a29d1a566c3ab95d06a0c9a1f3a7de3c10f2a36da87c454"'
- repoLastModified: Mon, 30 Sep 2024 02:02:49 GMT
+ repoEtag: '"76bb6334600743d05579e617ac7b97478819d20c566ef33da1f20e10b13567a1"'
+ repoLastModified: Mon, 30 Sep 2024 21:24:05 GMT
foundInMaster: true
- source: https://openapi.tools/
name: RestCase Docs
@@ -486,7 +486,7 @@
owner: rookie-luochao
logo: https://avatars.githubusercontent.com/u/22948077?v=4
license: MIT
- repoEtag: '"a3bcf098f535a9550570fb7e33bb2254d72fb1b76f8d1212c298979f2210cb41"'
+ repoEtag: '"291f67030568ed8e5f280ad83746e61bdc1058e89d00ab640cc50238e16779ef"'
repoLastModified: Sat, 28 Sep 2024 07:15:57 GMT
category: Documentation
foundInMaster: true
@@ -579,7 +579,7 @@
owner: opticdev
logo: https://avatars.githubusercontent.com/u/34556970?v=4
license: MIT
- repoEtag: '"5cd43de37dc7db923ccc3f02c28814b640caf99d5d8d1d9b668773b4f7b85885"'
+ repoEtag: '"94c52e87bfb83702e03fb5ea2bb7e7ff9942ce6c48045c9a6b6219a3cc75eaa6"'
repoLastModified: Thu, 26 Sep 2024 16:25:45 GMT
foundInMaster: true
id: 8c3d08406ca659662808d51ddc10b4e4
@@ -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-09-30T03:22:50Z'
+ updated: '2024-10-01T03:34:17Z'
language: Java
archived: false
- stars: 21424
+ stars: 21427
watchers: 220
- forks: 6479
+ forks: 6482
owner: OpenAPITools
logo: https://avatars.githubusercontent.com/u/37325267?v=4
license: Apache-2.0
- repoEtag: '"9da6793b3247f5c1b80a67b4d0da755d91def1767fd8ffd5c54d92b9ad98ede4"'
- repoLastModified: Mon, 30 Sep 2024 03:22:50 GMT
+ repoEtag: '"0ab1443e8f93878ccdb8f59ae26ca216d1336b49194e44dcdcfa7bbc1c646c81"'
+ repoLastModified: Tue, 01 Oct 2024 03:34:17 GMT
foundInMaster: true
id: 0418f8afcd0196c648d1a46c0c5c20d1
v3_1_link: https://github.com/OpenAPITools/openapi-generator/issues/9083
@@ -1119,17 +1119,17 @@
repositoryId: 323665366
description: OpenAPI based HTTP Client code generator
created: '2020-12-22T15:35:49Z'
- updated: '2024-09-30T02:27:51Z'
+ updated: '2024-09-30T16:25:47Z'
language: C#
archived: false
- stars: 2862
+ stars: 2863
watchers: 43
forks: 195
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"906eba728fe5222db222afc7a776f58eb551e0b89e956729941409a2e5a6401a"'
- repoLastModified: Mon, 30 Sep 2024 02:27:51 GMT
+ repoEtag: '"f68d25c4dfe1d974086ce6fd8ce3386f36236cc1799f1db34f80d7697c86a091"'
+ repoLastModified: Mon, 30 Sep 2024 16:25:47 GMT
foundInMaster: true
- source: https://openapi.tools/
name: FabriKt
@@ -1166,7 +1166,7 @@
owner: cjbooms
logo: https://avatars.githubusercontent.com/u/868640?v=4
license: Apache-2.0
- repoEtag: '"4346690e6f067fc6f0be6b31668ac7d5d9ed5a4fe3cb538c3940799c9b82aca5"'
+ repoEtag: '"3aa0af7c5bcdb67db8b9bab0a9aaa8e842ed5aa337cf690fa8e2cd826c746b5c"'
repoLastModified: Fri, 20 Sep 2024 20:28:06 GMT
foundInMaster: true
- source:
@@ -1359,17 +1359,17 @@
repositoryId: 19390712
description: Swagger Editor
created: '2014-05-02T22:47:10Z'
- updated: '2024-09-29T17:33:14Z'
+ updated: '2024-09-30T08:15:36Z'
language: JavaScript
archived: false
- stars: 8886
+ stars: 8887
watchers: 261
- forks: 2247
+ forks: 2248
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"8067a74a23fcf14bb3f7de3bf75a34c03fc2d6ae3483010d384a3cb20a299d30"'
- repoLastModified: Sun, 29 Sep 2024 17:33:14 GMT
+ repoEtag: '"2c699c5d68e721077cc3c5fb98c581ed0354863dfd7b5daa6466245f758e38b8"'
+ repoLastModified: Mon, 30 Sep 2024 08:15:36 GMT
foundInMaster: true
id: 951cf61d12c812ef9b201ad76b5d278d
v3_1: true
@@ -1411,16 +1411,16 @@
repositoryId: 424036264
description: Redocly VS Code extension
created: '2021-11-03T00:03:16Z'
- updated: '2024-06-30T23:14:20Z'
+ updated: '2024-09-30T05:43:52Z'
language: null
archived: false
- stars: 35
+ stars: 36
watchers: 17
forks: 6
owner: Redocly
logo: https://avatars.githubusercontent.com/u/32099856?v=4
- repoEtag: '"faca03bea67243085a3485774f7ccf3e67024499c4ac7490ad8c7ac29a94b664"'
- repoLastModified: Sun, 30 Jun 2024 23:14:20 GMT
+ repoEtag: '"022366cbc6154f10401efaa8b877ca969bab44f5ac62db5d8ac747b2c36ce2e2"'
+ repoLastModified: Mon, 30 Sep 2024 05:43:52 GMT
foundInMaster: true
- source: https://openapi.tools/
name: Api-Fiddle
@@ -1522,7 +1522,7 @@
owner: Apicurio
logo: https://avatars.githubusercontent.com/u/28107283?v=4
license: Apache-2.0
- repoEtag: '"1ec9a448ff2b51c70b5b971b1ff5f1737ef5a84aa63494cfba2483341c7c2cc3"'
+ repoEtag: '"d0550a1d6b8f231a39967b5388784eeb94a8ea5fae804c6994765dd8f0f10f17"'
repoLastModified: Fri, 20 Sep 2024 12:41:38 GMT
foundInMaster: true
homepage: https://github.com/Apicurio/apicurio-studio
@@ -1729,17 +1729,17 @@
Turn any OpenAPI2/3 and Postman Collection file into an API server with
mocking, transformations and validations.
created: '2016-03-18T03:52:09Z'
- updated: '2024-09-28T06:34:20Z'
+ updated: '2024-09-30T22:46:57Z'
language: TypeScript
archived: false
- stars: 4246
+ stars: 4248
watchers: 55
forks: 345
owner: stoplightio
logo: https://avatars.githubusercontent.com/u/10767217?v=4
license: Apache-2.0
- repoEtag: '"51fe9c1af47a3b7ebd1fc6e55cca8d396e0e464bd9d3992366a9a548ee37b885"'
- repoLastModified: Sat, 28 Sep 2024 06:34:20 GMT
+ repoEtag: '"8f8fe6375d23b8b008bf62992ac485c858c24a837edbbd487fba18c25c8bc83d"'
+ repoLastModified: Mon, 30 Sep 2024 22:46:57 GMT
foundInMaster: true
useMasterProperties: true
id: 15aad8cd322242e03733b07f2a37890a
@@ -1764,25 +1764,25 @@
v3_1: true
repositoryMetadata:
base64Readme: >-
- PGltZyBzcmM9Ii4vbWljcm9ja3MtYmFubmVyLnBuZyIgd2lkdGg9IjYwMCI+IAoKWyFbR2l0SHViIFdvcmtmbG93IFN0YXR1c10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9naXRodWIvYWN0aW9ucy93b3JrZmxvdy9zdGF0dXMvbWljcm9ja3MvbWljcm9ja3MvYnVpbGQtdmVyaWZ5LnltbD9sb2dvPWdpdGh1YiZzdHlsZT1mb3ItdGhlLWJhZGdlKV0oaHR0cHM6Ly9naXRodWIuY29tL21pY3JvY2tzL21pY3JvY2tzL2FjdGlvbnMpClshW0NvbnRhaW5lcl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9keW5hbWljL2pzb24/Y29sb3I9Ymx1ZXZpb2xldCZsb2dvPWRvY2tlciZzdHlsZT1mb3ItdGhlLWJhZGdlJmxhYmVsPVF1YXkuaW8mcXVlcnk9dGFnc1swXS5uYW1lJnVybD1odHRwczovL3F1YXkuaW8vYXBpL3YxL3JlcG9zaXRvcnkvbWljcm9ja3MvbWljcm9ja3MvdGFnLz9saW1pdD0xMCZwYWdlPTEmb25seUFjdGl2ZVRhZ3M9dHJ1ZSldKGh0dHBzOi8vcXVheS5pby9yZXBvc2l0b3J5L21pY3JvY2tzL21pY3JvY2tzP3RhYj10YWdzKQpbIVtWZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL21hdmVuLWNlbnRyYWwvdi9pby5naXRodWIubWljcm9ja3MvbWljcm9ja3M/Y29sb3I9Ymx1ZSZzdHlsZT1mb3ItdGhlLWJhZGdlKV0oKGh0dHBzOi8vc2VhcmNoLm1hdmVuLm9yZy9hcnRpZmFjdC9pby5naXRodWIubWljcm9ja3MvbWljcm9ja3MpKQpbIVtMaWNlbnNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9saWNlbnNlL21pY3JvY2tzL21pY3JvY2tzP3N0eWxlPWZvci10aGUtYmFkZ2UmbG9nbz1hcGFjaGUpXShodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKQpbIVtQcm9qZWN0IENoYXRdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvZGlzY29yZC1taWNyb2Nrcy1waW5rLnN2Zz9jb2xvcj03Mjg5ZGEmc3R5bGU9Zm9yLXRoZS1iYWRnZSZsb2dvPWRpc2NvcmQpXShodHRwczovL21pY3JvY2tzLmlvL2Rpc2NvcmQtaW52aXRlLykKWyFbQXJ0aWZhY3QgSFVCXShodHRwczovL2ltZy5zaGllbGRzLmlvL2VuZHBvaW50P3VybD1odHRwczovL2FydGlmYWN0aHViLmlvL2JhZGdlL3JlcG9zaXRvcnkvbWljcm9ja3Mmc3R5bGU9Zm9yLXRoZS1iYWRnZSldKGh0dHBzOi8vYXJ0aWZhY3RodWIuaW8vcGFja2FnZXMvc2VhcmNoP3JlcG89bWljcm9ja3MpClshW0NOQ0YgTGFuZHNjYXBlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL0NOQ0YlMjBMYW5kc2NhcGUtNTY5OUM2P3N0eWxlPWZvci10aGUtYmFkZ2UmbG9nbz1jbmNmKV0oaHR0cHM6Ly9sYW5kc2NhcGUuY25jZi5pby8/aXRlbT1hcHAtZGVmaW5pdGlvbi1hbmQtZGV2ZWxvcG1lbnQtLWFwcGxpY2F0aW9uLWRlZmluaXRpb24taW1hZ2UtYnVpbGQtLW1pY3JvY2tzKQoKIyBNaWNyb2NrcyAtIEt1YmVybmV0ZXMgbmF0aXZlIHRvb2wgZm9yIEFQSSBNb2NraW5nICYgVGVzdGluZwoKTWljcm9ja3MgaXMgYSBwbGF0Zm9ybSBmb3IgdHVybmluZyB5b3VyIEFQSSBhbmQgbWljcm9zZXJ2aWNlcyBhc3NldHMgLSAqT3BlbkFQSSBzcGVjcyosICpBc3luY0FQSSBzcGVjcyosICpnUlBDIHByb3RvYnVmKiwgKkdyYXBoUUwgc2NoZW1hKiwgKlBvc3RtYW4gY29sbGVjdGlvbnMqLCAqU29hcFVJIHByb2plY3RzKiAtIGludG8gbGl2ZSBtb2NrcyBpbiBzZWNvbmRzLgoKSXQgYWxzbyByZXVzZXMgdGhlc2UgYXNzZXRzIGZvciBydW5uaW5nIGNvbXBsaWFuY2UgYW5kIG5vbi1yZWdyZXNzaW9uIHRlc3RzIGFnYWluc3QgeW91ciBBUEkgaW1wbGVtZW50YXRpb24uIFdlIHByb3ZpZGUgaW50ZWdyYXRpb25zIHdpdGggKkplbmtpbnMqLCAqR2l0SHViIEFjdGlvbnMqLCAqVGVrdG9uKiBhbmQgbWFueSBvdGhlcnMgdGhyb3VnaCBhIHNpbXBsZSBDTEkuCgojIyBHZXR0aW5nIFN0YXJ0ZWQKCiogW0RvY3VtZW50YXRpb25dKGh0dHBzOi8vbWljcm9ja3MuaW8vZG9jdW1lbnRhdGlvbi90dXRvcmlhbHMvZ2V0dGluZy1zdGFydGVkLykKKiBbTWljcm9ja3MgQ29tbXVuaXR5XShodHRwczovL2dpdGh1Yi5jb20vbWljcm9ja3MvY29tbXVuaXR5KSBhbmQgY29tbXVuaXR5IG1lZXRpbmcKClRvIGdldCBpbnZvbHZlZCB3aXRoIG91ciBjb21tdW5pdHksIHBsZWFzZSBtYWtlIHN1cmUgeW91IGFyZSBmYW1pbGlhciB3aXRoIHRoZSBwcm9qZWN0J3MgW0NvZGUgb2YgQ29uZHVjdF0oLi9DT0RFX09GX0NPTkRVQ1QubWQpLgoKIyMgQnVpbGQgU3RhdHVzCgpUaGUgY3VycmVudCBkZXZlbG9wbWVudCB2ZXJzaW9uIGlzIGAxLjEwLjEtU05BUFNIT1RgLiAKClshW0dpdEh1YiBXb3JrZmxvdyBTdGF0dXNdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZ2l0aHViL2FjdGlvbnMvd29ya2Zsb3cvc3RhdHVzL21pY3JvY2tzL21pY3JvY2tzL2J1aWxkLXZlcmlmeS55bWw/YnJhbmNoPTEuMTAueCZsb2dvPWdpdGh1YiZzdHlsZT1mb3ItdGhlLWJhZGdlKV0oaHR0cHM6Ly9naXRodWIuY29tL21pY3JvY2tzL21pY3JvY2tzL2FjdGlvbnMpCgojIyMjIFNvbmFyY2xvdWQgUXVhbGl0eSBtZXRyaWNzCgpbIVtDb2RlIFNtZWxsc10oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2FwaS9wcm9qZWN0X2JhZGdlcy9tZWFzdXJlP3Byb2plY3Q9bWljcm9ja3NfbWljcm9ja3MmbWV0cmljPWNvZGVfc21lbGxzKV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL3N1bW1hcnkvbmV3X2NvZGU/aWQ9bWljcm9ja3NfbWljcm9ja3MpClshW1JlbGlhYmlsaXR5IFJhdGluZ10oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2FwaS9wcm9qZWN0X2JhZGdlcy9tZWFzdXJlP3Byb2plY3Q9bWljcm9ja3NfbWljcm9ja3MmbWV0cmljPXJlbGlhYmlsaXR5X3JhdGluZyldKGh0dHBzOi8vc29uYXJjbG91ZC5pby9zdW1tYXJ5L25ld19jb2RlP2lkPW1pY3JvY2tzX21pY3JvY2tzKQpbIVtCdWdzXShodHRwczovL3NvbmFyY2xvdWQuaW8vYXBpL3Byb2plY3RfYmFkZ2VzL21lYXN1cmU/cHJvamVjdD1taWNyb2Nrc19taWNyb2NrcyZtZXRyaWM9YnVncyldKGh0dHBzOi8vc29uYXJjbG91ZC5pby9zdW1tYXJ5L25ld19jb2RlP2lkPW1pY3JvY2tzX21pY3JvY2tzKQpbIVtDb3ZlcmFnZV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2FwaS9wcm9qZWN0X2JhZGdlcy9tZWFzdXJlP3Byb2plY3Q9bWljcm9ja3NfbWljcm9ja3MmbWV0cmljPWNvdmVyYWdlKV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL3N1bW1hcnkvbmV3X2NvZGU/aWQ9bWljcm9ja3NfbWljcm9ja3MpClshW1RlY2huaWNhbCBEZWJ0XShodHRwczovL3NvbmFyY2xvdWQuaW8vYXBpL3Byb2plY3RfYmFkZ2VzL21lYXN1cmU/cHJvamVjdD1taWNyb2Nrc19taWNyb2NrcyZtZXRyaWM9c3FhbGVfaW5kZXgpXShodHRwczovL3NvbmFyY2xvdWQuaW8vc3VtbWFyeS9uZXdfY29kZT9pZD1taWNyb2Nrc19taWNyb2NrcykKWyFbU2VjdXJpdHkgUmF0aW5nXShodHRwczovL3NvbmFyY2xvdWQuaW8vYXBpL3Byb2plY3RfYmFkZ2VzL21lYXN1cmU/cHJvamVjdD1taWNyb2Nrc19taWNyb2NrcyZtZXRyaWM9c2VjdXJpdHlfcmF0aW5nKV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL3N1bW1hcnkvbmV3X2NvZGU/aWQ9bWljcm9ja3NfbWljcm9ja3MpClshW01haW50YWluYWJpbGl0eSBSYXRpbmddKGh0dHBzOi8vc29uYXJjbG91ZC5pby9hcGkvcHJvamVjdF9iYWRnZXMvbWVhc3VyZT9wcm9qZWN0PW1pY3JvY2tzX21pY3JvY2tzJm1ldHJpYz1zcWFsZV9yYXRpbmcpXShodHRwczovL3NvbmFyY2xvdWQuaW8vc3VtbWFyeS9uZXdfY29kZT9pZD1taWNyb2Nrc19taWNyb2NrcykKCiMjIyMgRm9zc2EgbGljZW5zZSBhbmQgc2VjdXJpdHkgc2NhbnMKClshW0ZPU1NBIFN0YXR1c10oaHR0cHM6Ly9hcHAuZm9zc2EuY29tL2FwaS9wcm9qZWN0cy9naXQlMkJnaXRodWIuY29tJTJGbWljcm9ja3MlMkZtaWNyb2Nrcy5zdmc/dHlwZT1zaGllbGQmaXNzdWVUeXBlPWxpY2Vuc2UpXShodHRwczovL2FwcC5mb3NzYS5jb20vcHJvamVjdHMvZ2l0JTJCZ2l0aHViLmNvbSUyRm1pY3JvY2tzJTJGbWljcm9ja3M/cmVmPWJhZGdlX3NoaWVsZCZpc3N1ZVR5cGU9bGljZW5zZSkKWyFbRk9TU0EgU3RhdHVzXShodHRwczovL2FwcC5mb3NzYS5jb20vYXBpL3Byb2plY3RzL2dpdCUyQmdpdGh1Yi5jb20lMkZtaWNyb2NrcyUyRm1pY3JvY2tzLnN2Zz90eXBlPXNoaWVsZCZpc3N1ZVR5cGU9c2VjdXJpdHkpXShodHRwczovL2FwcC5mb3NzYS5jb20vcHJvamVjdHMvZ2l0JTJCZ2l0aHViLmNvbSUyRm1pY3JvY2tzJTJGbWljcm9ja3M/cmVmPWJhZGdlX3NoaWVsZCZpc3N1ZVR5cGU9c2VjdXJpdHkpClshW0ZPU1NBIFN0YXR1c10oaHR0cHM6Ly9hcHAuZm9zc2EuY29tL2FwaS9wcm9qZWN0cy9naXQlMkJnaXRodWIuY29tJTJGbWljcm9ja3MlMkZtaWNyb2Nrcy5zdmc/dHlwZT1zbWFsbCldKGh0dHBzOi8vYXBwLmZvc3NhLmNvbS9wcm9qZWN0cy9naXQlMkJnaXRodWIuY29tJTJGbWljcm9ja3MlMkZtaWNyb2Nrcz9yZWY9YmFkZ2Vfc21hbGwpCgojIyMjIE9wZW5TU0YgYmVzdCBwcmFjdGljZXMKClshW0NJSSBCZXN0IFByYWN0aWNlc10oaHR0cHM6Ly9iZXN0cHJhY3RpY2VzLmNvcmVpbmZyYXN0cnVjdHVyZS5vcmcvcHJvamVjdHMvNzUxMy9iYWRnZSldKGh0dHBzOi8vYmVzdHByYWN0aWNlcy5jb3JlaW5mcmFzdHJ1Y3R1cmUub3JnL3Byb2plY3RzLzc1MTMpClshW09wZW5TU0YgU2NvcmVjYXJkXShodHRwczovL2FwaS5zZWN1cml0eXNjb3JlY2FyZHMuZGV2L3Byb2plY3RzL2dpdGh1Yi5jb20vbWljcm9ja3MvbWljcm9ja3MvYmFkZ2UpXShodHRwczovL3NlY3VyaXR5c2NvcmVjYXJkcy5kZXYvdmlld2VyLz91cmk9Z2l0aHViLmNvbS9taWNyb2Nrcy9taWNyb2NrcykKCgojIyBWZXJzaW9ucwoKSGVyZSBhcmUgdGhlIG5hbWluZyBjb252ZW50aW9ucyB3ZSdyZSB1c2luZyBmb3IgY3VycmVudCByZWxlYXNlcywgb25nb2luZyBkZXZlbG9wbWVudCBtYWludGVuYW5jZSBhY3Rpdml0aWVzLgoKfCBTdGF0dXMgICAgICB8IFZlcnNpb24gICAgICAgICAgIHwgQnJhbmNoICAgfCBDb250YWluZXIgaW1hZ2VzIHRhZ3MgfAp8IC0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgU3RhYmxlICAgICAgfCBgMS4xMC4wYCAgICAgICAgICB8IGBtYXN0ZXJgIHwgYDEuMTAuMGAsIGBsYXRlc3RgICAgIHwKfCBEZXYgICAgICAgICB8IGAxLjEwLjEtU05BUFNIT1RgIHwgYDEuMTAueGAgfCBgbmlnaHRseWAgICAgICAgICAgICAgfAp8IE1haW50ZW5hbmNlIHwgYDEuOS4yLVNOQVBTSE9UYCAgfCBgMS45LnhgICB8IGBtYWludGVuYW5jZWAgICAgICAgICB8CgoKIyMgSG93IHRvIGJ1aWxkIE1pY3JvY2tzCgpUaGUgYnVpbGQgaW5zdHJ1Y3Rpb25zIGFyZSBhdmFpbGFibGUgaW4gdGhlIFtjb250cmlidXRpb24gZ3VpZGVdKENPTlRSSUJVVElORy5tZCkuCgojIyBUaGFua3MgdG8gY29tbXVuaXR5IQoKWyFbU3RhcmdhemVycyByZXBvIHJvc3RlciBmb3IgQG1pY3JvY2tzL21pY3JvY2tzXShodHRwOi8vcmVwb3Jvc3Rlci5jb20vc3RhcnMvbWljcm9ja3MvbWljcm9ja3MpXShodHRwOi8vZ2l0aHViLmNvbS9taWNyb2Nrcy9taWNyb2Nrcy9zdGFyZ2F6ZXJzKQpbIVtGb3JrZXJzIHJlcG8gcm9zdGVyIGZvciBAbWljcm9ja3MvbWljcm9ja3NdKGh0dHA6Ly9yZXBvcm9zdGVyLmNvbS9mb3Jrcy9taWNyb2Nrcy9taWNyb2NrcyldKGh0dHA6Ly9naXRodWIuY29tL21pY3JvY2tzL21pY3JvY2tzL25ldHdvcmsvbWVtYmVycykK
- readmeEtag: '"cc6574796451c6b0eb54c9203be04c919c924e33"'
- readmeLastModified: Thu, 12 Sep 2024 16:55:54 GMT
+ PGltZyBzcmM9Ii4vbWljcm9ja3MtYmFubmVyLnBuZyIgd2lkdGg9IjYwMCI+IAoKWyFbR2l0SHViIFdvcmtmbG93IFN0YXR1c10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9naXRodWIvYWN0aW9ucy93b3JrZmxvdy9zdGF0dXMvbWljcm9ja3MvbWljcm9ja3MvYnVpbGQtdmVyaWZ5LnltbD9sb2dvPWdpdGh1YiZzdHlsZT1mb3ItdGhlLWJhZGdlKV0oaHR0cHM6Ly9naXRodWIuY29tL21pY3JvY2tzL21pY3JvY2tzL2FjdGlvbnMpClshW0NvbnRhaW5lcl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9keW5hbWljL2pzb24/Y29sb3I9Ymx1ZXZpb2xldCZsb2dvPWRvY2tlciZzdHlsZT1mb3ItdGhlLWJhZGdlJmxhYmVsPVF1YXkuaW8mcXVlcnk9dGFnc1swXS5uYW1lJnVybD1odHRwczovL3F1YXkuaW8vYXBpL3YxL3JlcG9zaXRvcnkvbWljcm9ja3MvbWljcm9ja3MvdGFnLz9saW1pdD0xMCZwYWdlPTEmb25seUFjdGl2ZVRhZ3M9dHJ1ZSldKGh0dHBzOi8vcXVheS5pby9yZXBvc2l0b3J5L21pY3JvY2tzL21pY3JvY2tzP3RhYj10YWdzKQpbIVtWZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL21hdmVuLWNlbnRyYWwvdi9pby5naXRodWIubWljcm9ja3MvbWljcm9ja3M/Y29sb3I9Ymx1ZSZzdHlsZT1mb3ItdGhlLWJhZGdlKV0oKGh0dHBzOi8vc2VhcmNoLm1hdmVuLm9yZy9hcnRpZmFjdC9pby5naXRodWIubWljcm9ja3MvbWljcm9ja3MpKQpbIVtMaWNlbnNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9saWNlbnNlL21pY3JvY2tzL21pY3JvY2tzP3N0eWxlPWZvci10aGUtYmFkZ2UmbG9nbz1hcGFjaGUpXShodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKQpbIVtQcm9qZWN0IENoYXRdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvZGlzY29yZC1taWNyb2Nrcy1waW5rLnN2Zz9jb2xvcj03Mjg5ZGEmc3R5bGU9Zm9yLXRoZS1iYWRnZSZsb2dvPWRpc2NvcmQpXShodHRwczovL21pY3JvY2tzLmlvL2Rpc2NvcmQtaW52aXRlLykKWyFbQXJ0aWZhY3QgSFVCXShodHRwczovL2ltZy5zaGllbGRzLmlvL2VuZHBvaW50P3VybD1odHRwczovL2FydGlmYWN0aHViLmlvL2JhZGdlL3JlcG9zaXRvcnkvbWljcm9ja3Mmc3R5bGU9Zm9yLXRoZS1iYWRnZSldKGh0dHBzOi8vYXJ0aWZhY3RodWIuaW8vcGFja2FnZXMvc2VhcmNoP3JlcG89bWljcm9ja3MpClshW0NOQ0YgTGFuZHNjYXBlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL0NOQ0YlMjBMYW5kc2NhcGUtNTY5OUM2P3N0eWxlPWZvci10aGUtYmFkZ2UmbG9nbz1jbmNmKV0oaHR0cHM6Ly9sYW5kc2NhcGUuY25jZi5pby8/aXRlbT1hcHAtZGVmaW5pdGlvbi1hbmQtZGV2ZWxvcG1lbnQtLWFwcGxpY2F0aW9uLWRlZmluaXRpb24taW1hZ2UtYnVpbGQtLW1pY3JvY2tzKQoKIyBNaWNyb2NrcyAtIEt1YmVybmV0ZXMgbmF0aXZlIHRvb2wgZm9yIEFQSSBNb2NraW5nICYgVGVzdGluZwoKTWljcm9ja3MgaXMgYSBwbGF0Zm9ybSBmb3IgdHVybmluZyB5b3VyIEFQSSBhbmQgbWljcm9zZXJ2aWNlcyBhc3NldHMgLSAqT3BlbkFQSSBzcGVjcyosICpBc3luY0FQSSBzcGVjcyosICpnUlBDIHByb3RvYnVmKiwgKkdyYXBoUUwgc2NoZW1hKiwgKlBvc3RtYW4gY29sbGVjdGlvbnMqLCAqU29hcFVJIHByb2plY3RzKiAtIGludG8gbGl2ZSBtb2NrcyBpbiBzZWNvbmRzLgoKSXQgYWxzbyByZXVzZXMgdGhlc2UgYXNzZXRzIGZvciBydW5uaW5nIGNvbXBsaWFuY2UgYW5kIG5vbi1yZWdyZXNzaW9uIHRlc3RzIGFnYWluc3QgeW91ciBBUEkgaW1wbGVtZW50YXRpb24uIFdlIHByb3ZpZGUgaW50ZWdyYXRpb25zIHdpdGggKkplbmtpbnMqLCAqR2l0SHViIEFjdGlvbnMqLCAqVGVrdG9uKiBhbmQgbWFueSBvdGhlcnMgdGhyb3VnaCBhIHNpbXBsZSBDTEkuCgojIyBHZXR0aW5nIFN0YXJ0ZWQKCiogW0RvY3VtZW50YXRpb25dKGh0dHBzOi8vbWljcm9ja3MuaW8vZG9jdW1lbnRhdGlvbi90dXRvcmlhbHMvZ2V0dGluZy1zdGFydGVkLykKKiBbTWljcm9ja3MgQ29tbXVuaXR5XShodHRwczovL2dpdGh1Yi5jb20vbWljcm9ja3MvY29tbXVuaXR5KSBhbmQgY29tbXVuaXR5IG1lZXRpbmcKClRvIGdldCBpbnZvbHZlZCB3aXRoIG91ciBjb21tdW5pdHksIHBsZWFzZSBtYWtlIHN1cmUgeW91IGFyZSBmYW1pbGlhciB3aXRoIHRoZSBwcm9qZWN0J3MgW0NvZGUgb2YgQ29uZHVjdF0oLi9DT0RFX09GX0NPTkRVQ1QubWQpLgoKIyMgQnVpbGQgU3RhdHVzCgpUaGUgY3VycmVudCBkZXZlbG9wbWVudCB2ZXJzaW9uIGlzIGAxLjExLjAtU05BUFNIT1RgIG9uIGJyYW5jaCBgMS4xMS54YC4gCgpbIVtHaXRIdWIgV29ya2Zsb3cgU3RhdHVzXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9hY3Rpb25zL3dvcmtmbG93L3N0YXR1cy9taWNyb2Nrcy9taWNyb2Nrcy9idWlsZC12ZXJpZnkueW1sP2JyYW5jaD0xLjEwLngmbG9nbz1naXRodWImc3R5bGU9Zm9yLXRoZS1iYWRnZSldKGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb2Nrcy9taWNyb2Nrcy9hY3Rpb25zKQoKIyMjIyBTb25hcmNsb3VkIFF1YWxpdHkgbWV0cmljcwoKWyFbQ29kZSBTbWVsbHNdKGh0dHBzOi8vc29uYXJjbG91ZC5pby9hcGkvcHJvamVjdF9iYWRnZXMvbWVhc3VyZT9wcm9qZWN0PW1pY3JvY2tzX21pY3JvY2tzJm1ldHJpYz1jb2RlX3NtZWxscyldKGh0dHBzOi8vc29uYXJjbG91ZC5pby9zdW1tYXJ5L25ld19jb2RlP2lkPW1pY3JvY2tzX21pY3JvY2tzKQpbIVtSZWxpYWJpbGl0eSBSYXRpbmddKGh0dHBzOi8vc29uYXJjbG91ZC5pby9hcGkvcHJvamVjdF9iYWRnZXMvbWVhc3VyZT9wcm9qZWN0PW1pY3JvY2tzX21pY3JvY2tzJm1ldHJpYz1yZWxpYWJpbGl0eV9yYXRpbmcpXShodHRwczovL3NvbmFyY2xvdWQuaW8vc3VtbWFyeS9uZXdfY29kZT9pZD1taWNyb2Nrc19taWNyb2NrcykKWyFbQnVnc10oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2FwaS9wcm9qZWN0X2JhZGdlcy9tZWFzdXJlP3Byb2plY3Q9bWljcm9ja3NfbWljcm9ja3MmbWV0cmljPWJ1Z3MpXShodHRwczovL3NvbmFyY2xvdWQuaW8vc3VtbWFyeS9uZXdfY29kZT9pZD1taWNyb2Nrc19taWNyb2NrcykKWyFbQ292ZXJhZ2VdKGh0dHBzOi8vc29uYXJjbG91ZC5pby9hcGkvcHJvamVjdF9iYWRnZXMvbWVhc3VyZT9wcm9qZWN0PW1pY3JvY2tzX21pY3JvY2tzJm1ldHJpYz1jb3ZlcmFnZSldKGh0dHBzOi8vc29uYXJjbG91ZC5pby9zdW1tYXJ5L25ld19jb2RlP2lkPW1pY3JvY2tzX21pY3JvY2tzKQpbIVtUZWNobmljYWwgRGVidF0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2FwaS9wcm9qZWN0X2JhZGdlcy9tZWFzdXJlP3Byb2plY3Q9bWljcm9ja3NfbWljcm9ja3MmbWV0cmljPXNxYWxlX2luZGV4KV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL3N1bW1hcnkvbmV3X2NvZGU/aWQ9bWljcm9ja3NfbWljcm9ja3MpClshW1NlY3VyaXR5IFJhdGluZ10oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2FwaS9wcm9qZWN0X2JhZGdlcy9tZWFzdXJlP3Byb2plY3Q9bWljcm9ja3NfbWljcm9ja3MmbWV0cmljPXNlY3VyaXR5X3JhdGluZyldKGh0dHBzOi8vc29uYXJjbG91ZC5pby9zdW1tYXJ5L25ld19jb2RlP2lkPW1pY3JvY2tzX21pY3JvY2tzKQpbIVtNYWludGFpbmFiaWxpdHkgUmF0aW5nXShodHRwczovL3NvbmFyY2xvdWQuaW8vYXBpL3Byb2plY3RfYmFkZ2VzL21lYXN1cmU/cHJvamVjdD1taWNyb2Nrc19taWNyb2NrcyZtZXRyaWM9c3FhbGVfcmF0aW5nKV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL3N1bW1hcnkvbmV3X2NvZGU/aWQ9bWljcm9ja3NfbWljcm9ja3MpCgojIyMjIEZvc3NhIGxpY2Vuc2UgYW5kIHNlY3VyaXR5IHNjYW5zCgpbIVtGT1NTQSBTdGF0dXNdKGh0dHBzOi8vYXBwLmZvc3NhLmNvbS9hcGkvcHJvamVjdHMvZ2l0JTJCZ2l0aHViLmNvbSUyRm1pY3JvY2tzJTJGbWljcm9ja3Muc3ZnP3R5cGU9c2hpZWxkJmlzc3VlVHlwZT1saWNlbnNlKV0oaHR0cHM6Ly9hcHAuZm9zc2EuY29tL3Byb2plY3RzL2dpdCUyQmdpdGh1Yi5jb20lMkZtaWNyb2NrcyUyRm1pY3JvY2tzP3JlZj1iYWRnZV9zaGllbGQmaXNzdWVUeXBlPWxpY2Vuc2UpClshW0ZPU1NBIFN0YXR1c10oaHR0cHM6Ly9hcHAuZm9zc2EuY29tL2FwaS9wcm9qZWN0cy9naXQlMkJnaXRodWIuY29tJTJGbWljcm9ja3MlMkZtaWNyb2Nrcy5zdmc/dHlwZT1zaGllbGQmaXNzdWVUeXBlPXNlY3VyaXR5KV0oaHR0cHM6Ly9hcHAuZm9zc2EuY29tL3Byb2plY3RzL2dpdCUyQmdpdGh1Yi5jb20lMkZtaWNyb2NrcyUyRm1pY3JvY2tzP3JlZj1iYWRnZV9zaGllbGQmaXNzdWVUeXBlPXNlY3VyaXR5KQpbIVtGT1NTQSBTdGF0dXNdKGh0dHBzOi8vYXBwLmZvc3NhLmNvbS9hcGkvcHJvamVjdHMvZ2l0JTJCZ2l0aHViLmNvbSUyRm1pY3JvY2tzJTJGbWljcm9ja3Muc3ZnP3R5cGU9c21hbGwpXShodHRwczovL2FwcC5mb3NzYS5jb20vcHJvamVjdHMvZ2l0JTJCZ2l0aHViLmNvbSUyRm1pY3JvY2tzJTJGbWljcm9ja3M/cmVmPWJhZGdlX3NtYWxsKQoKIyMjIyBPcGVuU1NGIGJlc3QgcHJhY3RpY2VzCgpbIVtDSUkgQmVzdCBQcmFjdGljZXNdKGh0dHBzOi8vYmVzdHByYWN0aWNlcy5jb3JlaW5mcmFzdHJ1Y3R1cmUub3JnL3Byb2plY3RzLzc1MTMvYmFkZ2UpXShodHRwczovL2Jlc3RwcmFjdGljZXMuY29yZWluZnJhc3RydWN0dXJlLm9yZy9wcm9qZWN0cy83NTEzKQpbIVtPcGVuU1NGIFNjb3JlY2FyZF0oaHR0cHM6Ly9hcGkuc2VjdXJpdHlzY29yZWNhcmRzLmRldi9wcm9qZWN0cy9naXRodWIuY29tL21pY3JvY2tzL21pY3JvY2tzL2JhZGdlKV0oaHR0cHM6Ly9zZWN1cml0eXNjb3JlY2FyZHMuZGV2L3ZpZXdlci8/dXJpPWdpdGh1Yi5jb20vbWljcm9ja3MvbWljcm9ja3MpCgoKIyMgVmVyc2lvbnMKCkhlcmUgYXJlIHRoZSBuYW1pbmcgY29udmVudGlvbnMgd2UncmUgdXNpbmcgZm9yIGN1cnJlbnQgcmVsZWFzZXMsIG9uZ29pbmcgZGV2ZWxvcG1lbnQgbWFpbnRlbmFuY2UgYWN0aXZpdGllcy4KCnwgU3RhdHVzICAgICAgfCBWZXJzaW9uICAgICAgICAgICB8IEJyYW5jaCAgIHwgQ29udGFpbmVyIGltYWdlcyB0YWdzIHwKfCAtLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IFN0YWJsZSAgICAgIHwgYDEuMTAuMWAgICAgICAgICAgfCBgbWFzdGVyYCB8IGAxLjEwLjFgLCBgbGF0ZXN0YCAgICB8CnwgRGV2ICAgICAgICAgfCBgMS4xMS4wLVNOQVBTSE9UYCB8IGAxLjExLnhgIHwgYG5pZ2h0bHlgICAgICAgICAgICAgIHwKfCBNYWludGVuYW5jZSB8IGAxLjEwLjItU05BUFNIT1RgIHwgYDEuMTAueGAgfCBgbWFpbnRlbmFuY2VgICAgICAgICAgfAoKCiMjIEhvdyB0byBidWlsZCBNaWNyb2NrcwoKVGhlIGJ1aWxkIGluc3RydWN0aW9ucyBhcmUgYXZhaWxhYmxlIGluIHRoZSBbY29udHJpYnV0aW9uIGd1aWRlXShDT05UUklCVVRJTkcubWQpLgoKIyMgVGhhbmtzIHRvIGNvbW11bml0eSEKClshW1N0YXJnYXplcnMgcmVwbyByb3N0ZXIgZm9yIEBtaWNyb2Nrcy9taWNyb2Nrc10oaHR0cDovL3JlcG9yb3N0ZXIuY29tL3N0YXJzL21pY3JvY2tzL21pY3JvY2tzKV0oaHR0cDovL2dpdGh1Yi5jb20vbWljcm9ja3MvbWljcm9ja3Mvc3RhcmdhemVycykKWyFbRm9ya2VycyByZXBvIHJvc3RlciBmb3IgQG1pY3JvY2tzL21pY3JvY2tzXShodHRwOi8vcmVwb3Jvc3Rlci5jb20vZm9ya3MvbWljcm9ja3MvbWljcm9ja3MpXShodHRwOi8vZ2l0aHViLmNvbS9taWNyb2Nrcy9taWNyb2Nrcy9uZXR3b3JrL21lbWJlcnMpCg==
+ readmeEtag: '"690e15bca389c2141013a715a0ec16fe649945b4"'
+ readmeLastModified: Mon, 30 Sep 2024 13:28:03 GMT
repositoryId: 31214867
description: >-
The open source, cloud native tool for API Mocking and Testing. Microcks
is a Cloud Native Computing Foundation sandbox project 🚀
created: '2015-02-23T15:46:09Z'
- updated: '2024-09-29T00:33:01Z'
+ updated: '2024-09-30T13:28:07Z'
language: Java
archived: false
- stars: 1360
+ stars: 1361
watchers: 22
- forks: 212
+ forks: 213
owner: microcks
logo: https://avatars.githubusercontent.com/u/11051048?v=4
license: Apache-2.0
- repoEtag: '"c28f4b553405e8a218435abd09230f119978eb1301362762384d1e729700c6fd"'
- repoLastModified: Sun, 29 Sep 2024 00:33:01 GMT
+ repoEtag: '"9d6804c42c089c5cbf5462dacc1e17fa94eaed4a476ab054b44d7c738e610351"'
+ repoLastModified: Mon, 30 Sep 2024 13:28:07 GMT
foundInMaster: true
id: 1c0e918b5a733b0f1726199e3ea101d6
- source: https://openapi.tools/
@@ -1978,17 +1978,17 @@
repositoryId: 741524414
description: ✨ Turn your OpenAPI specification into a beautiful TypeScript client
created: '2024-01-10T15:19:25Z'
- updated: '2024-09-29T15:41:11Z'
+ updated: '2024-10-01T01:49:39Z'
language: TypeScript
archived: false
- stars: 1070
+ stars: 1077
watchers: 7
forks: 89
owner: hey-api
logo: https://avatars.githubusercontent.com/u/164436240?v=4
license: NOASSERTION
- repoEtag: '"29189f4de3f6073e868513d2c0411c2e1e845fee89439409dabbc514f7fa707d"'
- repoLastModified: Sun, 29 Sep 2024 15:41:11 GMT
+ repoEtag: '"33d6ed93623bda670fd3dc5c4399ba608c00f316b70994c415b5b65e61978813"'
+ repoLastModified: Tue, 01 Oct 2024 01:49:39 GMT
category:
- Converters
- SDK
@@ -2033,7 +2033,7 @@
owner: vert-x3
logo: https://avatars.githubusercontent.com/u/8124623?v=4
license: Apache-2.0
- repoEtag: '"b2ade993e605bcb163ef542037915a10020447b3a9fbe81da400743922e71376"'
+ repoEtag: '"a5b4166a7016280caf8ad3c9544c48d32284338ab32106c218fcc8b23f461751"'
repoLastModified: Fri, 27 Sep 2024 13:26:23 GMT
foundInMaster: true
v3_link: https://github.com/vert-x3/vertx-web/issues/1872
@@ -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-09-29T21:46:00Z'
+ updated: '2024-09-30T18:30:18Z'
language: TypeScript
archived: false
stars: 8541
- watchers: 212
+ watchers: 213
forks: 960
owner: api-platform
logo: https://avatars.githubusercontent.com/u/13420081?v=4
license: MIT
- repoEtag: '"a81900a59754bf5c5314f2a4fe15ff0b95094a918861df975defb1b7845e6341"'
- repoLastModified: Sun, 29 Sep 2024 21:46:00 GMT
+ repoEtag: '"b99ba2271ae85d2699853fa03eeba2163f22c028beff1ab497cab8c4ad7863f2"'
+ repoLastModified: Mon, 30 Sep 2024 18:30:18 GMT
foundInMaster: true
id: d14f5904300aabf1ceef4660a6b3d57e
- source: https://openapi.tools/
@@ -2347,7 +2347,7 @@
repositoryId: 105440153
description: 'OpenAPI (Swagger) module for Nest framework (node.js) :earth_americas:'
created: '2017-10-01T12:20:24Z'
- updated: '2024-09-29T09:59:24Z'
+ updated: '2024-09-30T22:08:15Z'
language: TypeScript
archived: false
stars: 1681
@@ -2356,8 +2356,8 @@
owner: nestjs
logo: https://avatars.githubusercontent.com/u/28507035?v=4
license: MIT
- repoEtag: '"c249f4cb0bfed56fc6a71078913e3bd92fed32f8db8530b174dadb01ea1c59b5"'
- repoLastModified: Sun, 29 Sep 2024 09:59:24 GMT
+ repoEtag: '"f7fa786aac66824b39e8ddf0d3febc8a6415afaa46463882b444fd64ea77f7de"'
+ repoLastModified: Mon, 30 Sep 2024 22:08:15 GMT
foundInMaster: true
id: 7071babd9853fc901c5decfa9b465b67
- source:
@@ -2489,17 +2489,17 @@
🦋 Auto-validates api requests, responses, and securities using ExpressJS
and an OpenAPI 3.x specification
created: '2019-03-19T19:08:05Z'
- updated: '2024-09-23T03:04:21Z'
+ updated: '2024-09-30T20:31:31Z'
language: TypeScript
archived: false
- stars: 913
+ stars: 914
watchers: 19
forks: 208
owner: cdimascio
logo: https://avatars.githubusercontent.com/u/4706618?v=4
license: MIT
- repoEtag: '"bf8ce9b4293f792c5b6ee9214cb08e4d699b317e967860a927c9ab728906c488"'
- repoLastModified: Mon, 23 Sep 2024 03:04:21 GMT
+ repoEtag: '"fe4d49208a7364f32c3ff58291d7f4cfd5ad58ca7ddb193aa6451919b7b4c0f8"'
+ repoLastModified: Mon, 30 Sep 2024 20:31:31 GMT
foundInMaster: true
id: 3a27bc1a71642e0c1c020c41dc66e206
- source: https://openapi.tools/
@@ -2600,17 +2600,17 @@
repositoryId: 537500924
description: Automated API Testing and Quality Assurance
created: '2022-09-16T14:48:21Z'
- updated: '2024-09-29T22:13:27Z'
+ updated: '2024-09-30T07:05:28Z'
language: TypeScript
archived: false
- stars: 1632
+ stars: 1633
watchers: 14
forks: 76
owner: stepci
logo: https://avatars.githubusercontent.com/u/61350067?v=4
license: MPL-2.0
- repoEtag: '"e06cdd6328f0b759235d3b7a1cf3abb2a30d16a95755fe5abc8dae26b17fbf6d"'
- repoLastModified: Sun, 29 Sep 2024 22:13:27 GMT
+ repoEtag: '"818b1e47cc9e25edd953c9af8967299bc1fc68415a4da06d59afb87bdf983c78"'
+ repoLastModified: Mon, 30 Sep 2024 07:05:28 GMT
foundInMaster: true
- source:
- https://openapi.tools/
@@ -2725,7 +2725,7 @@
owner: OpenAPITools
logo: https://avatars.githubusercontent.com/u/37325267?v=4
license: Apache-2.0
- repoEtag: '"50e240ec5e88b491acc58f43be15f9e904467a436eed94f7ea69cb73e9aee965"'
+ repoEtag: '"d5086dc7b68c1e7cd578554110d8dc32a3dc8fe0474cb54e6eb62387c9699827"'
repoLastModified: Sat, 14 Sep 2024 11:47:07 GMT
foundInMaster: true
id: 30d322c922366df3f6f8fb9c681b2139
@@ -2754,7 +2754,7 @@
owner: IBM
logo: https://avatars.githubusercontent.com/u/1459110?v=4
license: Apache-2.0
- repoEtag: '"824c495ccb48078093e278393dfcfeb7c0b1416003c3f15acb73240311faa305"'
+ repoEtag: '"9734e9c7fbe206151dce2eb802f374a0aa5131ce63db7f5a72a0c2edb3b3ef7f"'
repoLastModified: Wed, 25 Sep 2024 15:24:05 GMT
foundInMaster: true
id: 0bf7dd29a9d07232135bb00764928296
@@ -2777,17 +2777,17 @@
⚒️ Redocly CLI makes OpenAPI easy. Lint/validate to any standard, generate
beautiful docs, and more.
created: '2019-09-10T14:56:25Z'
- updated: '2024-09-29T18:36:49Z'
+ updated: '2024-09-30T12:41:29Z'
language: TypeScript
archived: false
- stars: 909
+ stars: 911
watchers: 29
forks: 139
owner: Redocly
logo: https://avatars.githubusercontent.com/u/32099856?v=4
license: MIT
- repoEtag: '"07170975d19d57c5b369170a6b34ab6806fafda408622a0fff9248a01ffcb029"'
- repoLastModified: Sun, 29 Sep 2024 18:36:49 GMT
+ repoEtag: '"d36daae86eeaf5543172f96d8320ab6d40b5923e851c723ae669bb6eeda4d154"'
+ repoLastModified: Mon, 30 Sep 2024 12:41:29 GMT
category:
- Description Validators
- Documentation
@@ -3006,11 +3006,11 @@
archived: false
stars: 1097
watchers: 18
- forks: 154
+ forks: 155
owner: APIDevTools
logo: https://avatars.githubusercontent.com/u/43750074?v=4
license: MIT
- repoEtag: '"f2505bd980faf920ec735264620af2c6e62b11d1f926de7a94e755428d4d5c61"'
+ repoEtag: '"1a896f5b8e7305055ed8763dc68fbcc999bab6422375defaecdb0d6e1e7a348e"'
repoLastModified: Fri, 27 Sep 2024 11:29:50 GMT
category: Parsers
foundInMaster: true
@@ -3169,17 +3169,17 @@
OpenAPI 3.0 (and Swagger v2) implementation for Go (parsing, converting,
validation, and more)
created: '2017-06-11T20:12:06Z'
- updated: '2024-09-29T21:49:10Z'
+ updated: '2024-09-30T15:21:42Z'
language: Go
archived: false
- stars: 2568
+ stars: 2569
watchers: 24
forks: 426
owner: getkin
logo: https://avatars.githubusercontent.com/u/40365715?v=4
license: MIT
- repoEtag: '"a8312254be4e892a0f3436cefc2250fda3c0f3d048d27943b2ef6790b7f44a39"'
- repoLastModified: Sun, 29 Sep 2024 21:49:10 GMT
+ repoEtag: '"46f562a44cd5a443e964f339b823e26bb7329e140b91af7c499149702071b020"'
+ repoLastModified: Mon, 30 Sep 2024 15:21:42 GMT
foundInMaster: true
v2: true
id: f6838ce08e87fa4c3dc813c97193ece3
@@ -3225,7 +3225,7 @@
owner: thephpleague
logo: https://avatars.githubusercontent.com/u/527621?v=4
license: MIT
- repoEtag: '"7117ae2f37ece3e8773ae2fb6c4f25b2fcc7b7e26cf5b7bf7ed65d1f55595a37"'
+ repoEtag: '"1066bdb5b5e243ac672b9dc97541c7f35cc7ead4cc33f7f3fdb7be26607c1cfd"'
repoLastModified: Sat, 14 Sep 2024 22:02:43 GMT
foundInMaster: true
v3_1_link: https://github.com/thephpleague/openapi-psr7-validator/issues/163
@@ -3378,7 +3378,7 @@
in .NET along with common serializers to extract raw OpenAPI JSON and YAML
documents from the model.
created: '2017-07-14T00:24:14Z'
- updated: '2024-09-26T15:51:13Z'
+ updated: '2024-09-30T09:30:53Z'
language: C#
archived: false
stars: 1391
@@ -3387,8 +3387,8 @@
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"bbc75f1e091009186d7fb9586afde9742836c2dcec831188986f4ca9243122fa"'
- repoLastModified: Thu, 26 Sep 2024 15:51:13 GMT
+ repoEtag: '"ecd9d7bf9ce06064666f0a6bac10971c03275e92e6b8ca1fee131019dacdceca"'
+ repoLastModified: Mon, 30 Sep 2024 09:30:53 GMT
foundInMaster: true
id: 1066748bb5b1f114a70856a29fee4aa7
- source:
@@ -3590,11 +3590,11 @@
archived: false
stars: 9489
watchers: 120
- forks: 1246
+ forks: 1247
owner: go-swagger
logo: https://avatars.githubusercontent.com/u/10362650?v=4
license: Apache-2.0
- repoEtag: '"e2c5ea146f43d04f793ed40d1b16dfcb7ac821a5c642f6372d08671e7f80041f"'
+ repoEtag: '"60c9d7ffbe76bf684e7f80ba52208bed3ab6a0f1658ac77d305579ef252d8723"'
repoLastModified: Mon, 30 Sep 2024 01:05:08 GMT
foundInMaster: true
id: ef136df9ffb40bb33ccbd76665d8f5b4
@@ -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-09-29T12:53:01Z'
+ updated: '2024-09-30T14:31:52Z'
language: C#
archived: false
- stars: 6713
+ stars: 6715
watchers: 167
- forks: 1244
+ forks: 1289
owner: RicoSuter
logo: https://avatars.githubusercontent.com/u/2603405?v=4
license: MIT
- repoEtag: '"31111474eb97bfe3d2b1ddf197990aebf4fc3b404c1ede218198730ef22cb2bc"'
- repoLastModified: Sun, 29 Sep 2024 12:53:01 GMT
+ repoEtag: '"12151242133f8e228d6fdc0e95f1abcab195a29ad132a062d41df7c45103b6c4"'
+ repoLastModified: Mon, 30 Sep 2024 14:31:52 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-09-29T20:27:29Z'
+ updated: '2024-10-01T01:12:29Z'
language: Mustache
archived: false
- stars: 16928
+ stars: 16929
watchers: 412
forks: 6025
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"df53d6e9cbff5860205cb527b7ff1a3b57c1a8a3602d23dc9951d42b0af38922"'
- repoLastModified: Sun, 29 Sep 2024 20:27:29 GMT
+ repoEtag: '"076c5eba241b8165903825f9f5f17adaac9c7c770975f6e784b8373de886b637"'
+ repoLastModified: Tue, 01 Oct 2024 01:12:29 GMT
foundInMaster: true
id: eda1e66e1b7805496e42f57851791a32
- source: https://openapi.tools/
@@ -3799,12 +3799,12 @@
language: TypeScript
archived: false
stars: 4600
- watchers: 894
+ watchers: 896
forks: 733
owner: Azure
logo: https://avatars.githubusercontent.com/u/6844498?v=4
license: MIT
- repoEtag: '"d5e80ec0d1f4a90040e9413d992396c2e1e8ba00a5b7e6c41032e0d9377c3bc1"'
+ repoEtag: '"da6e1e7d9be576d92fb94874fb5c891509b342e490b852854a259c220ad7bd86"'
repoLastModified: Sun, 29 Sep 2024 04:40:37 GMT
foundInMaster: true
id: 648d92bca90bf58cd74407e0bcad2936
@@ -3904,17 +3904,17 @@
repositoryId: 81140437
description: 🚀 Automatic SDK generation from an OpenAPI definition
created: '2017-02-06T22:31:07Z'
- updated: '2024-09-28T16:07:40Z'
+ updated: '2024-09-30T20:44:27Z'
language: TypeScript
archived: false
- stars: 572
+ stars: 573
watchers: 21
forks: 25
owner: readmeio
logo: https://avatars.githubusercontent.com/u/6878153?v=4
license: MIT
- repoEtag: '"1553edc7d3ec7b4b44cc4a96d55a306472a3c1046394cd2187c0b8a7a430d3c5"'
- repoLastModified: Sat, 28 Sep 2024 16:07:40 GMT
+ repoEtag: '"214a849f7d0487ff9061196dee1e06c9bb008145fcf80cfef25c2debad659eb9"'
+ repoLastModified: Mon, 30 Sep 2024 20:44:27 GMT
foundInMaster: true
- source:
- https://openapi.tools/
@@ -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-09-29T20:33:47Z'
+ updated: '2024-09-30T06:06:45Z'
language: Java
archived: false
stars: 1170
@@ -4239,8 +4239,8 @@
owner: Endava
logo: https://avatars.githubusercontent.com/u/19396140?v=4
license: Apache-2.0
- repoEtag: '"fbed9b3df6611a13822acfdfcb6e4602d6352435416287060393f0b26929d7d9"'
- repoLastModified: Sun, 29 Sep 2024 20:33:47 GMT
+ repoEtag: '"785559e98ec580976e7230e44020b19140c7298eced94237d029d0730912e66b"'
+ repoLastModified: Mon, 30 Sep 2024 06:06:45 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-09-30T03:24:11Z'
+ updated: '2024-09-30T19:12:33Z'
language: HTML
archived: false
- stars: 5039
+ stars: 5040
watchers: 23
forks: 217
owner: alufers
logo: https://avatars.githubusercontent.com/u/5400940?v=4
- repoEtag: '"3e2296f58eb4602b60159db57da88e5a75dad3492af9ff3e796061db2fd2ea94"'
- repoLastModified: Mon, 30 Sep 2024 03:24:11 GMT
+ repoEtag: '"f6bb3eadddd99f02969a27bddac6b4c35223a431ce557917f66340003966259c"'
+ repoLastModified: Mon, 30 Sep 2024 19:12:33 GMT
foundInMaster: true
- source: https://openapi.tools/
name: OpenApiSpecGeneratorPlugin
@@ -4515,7 +4515,7 @@
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"414d6a69530085af4fc5322966fd86143c74b8ec6073f1bad0d787a7d7eeeb7a"'
+ repoEtag: '"c434e38923daa5941c8035f55868175a0235974d29bb1b4736fe8589925c7dcd"'
repoLastModified: Fri, 27 Sep 2024 06:53:23 GMT
foundInMaster: true
- source: https://openapi.tools/
@@ -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-09-29T02:19:22Z'
+ updated: '2024-09-30T12:16:38Z'
language: TypeScript
archived: false
- stars: 3911
+ stars: 3912
watchers: 22
forks: 71
owner: AndrewWalsh
logo: https://avatars.githubusercontent.com/u/15863952?v=4
license: MIT
- repoEtag: '"c2c742cc8a4b9b57ecd2b0b631c9e39efdf4c39c9f484e99cfcb743b7a5874b5"'
- repoLastModified: Sun, 29 Sep 2024 02:19:22 GMT
+ repoEtag: '"5ede778091ebcc89a7d0d4f7aa462d3c0e9bd66e770617109958301d45c6cd1a"'
+ repoLastModified: Mon, 30 Sep 2024 12:16:38 GMT
category:
- Auto Generators
- Documentation
@@ -4686,17 +4686,17 @@
repositoryId: 381857226
description: null
created: '2021-06-30T23:29:49Z'
- updated: '2024-09-30T03:18:44Z'
+ updated: '2024-09-30T23:09:38Z'
language: Java
archived: false
- stars: 4344
+ stars: 4347
watchers: 45
- forks: 202
+ forks: 201
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"e688231fcc69039455d32c23e879b30762b0a47c18f073f8db866edc2b25866c"'
- repoLastModified: Mon, 30 Sep 2024 03:18:44 GMT
+ repoEtag: '"709e1ec4930750b7782d8d95e6cf0cbbbca4129b842f9c24a4a674a4424cdc26"'
+ repoLastModified: Mon, 30 Sep 2024 23:09:38 GMT
category:
- Auto Generators
- Server Implementations
@@ -4773,17 +4773,17 @@
Restish is a CLI for interacting with REST-ish HTTP APIs with some nice
features built-in
created: '2020-05-15T06:45:59Z'
- updated: '2024-09-29T17:22:05Z'
+ updated: '2024-09-30T15:05:40Z'
language: Go
archived: false
- stars: 896
+ stars: 898
watchers: 8
forks: 74
owner: danielgtaylor
logo: https://avatars.githubusercontent.com/u/106826?v=4
license: MIT
- repoEtag: '"7a4319cc94709f812756c22d5bd6e9e42d304909d36a57e65b6e6635bacdd5df"'
- repoLastModified: Sun, 29 Sep 2024 17:22:05 GMT
+ repoEtag: '"d0194ee391bf438c2ecec56816bbb2219837b254c4e63c04c96bc6426281ace2"'
+ repoLastModified: Mon, 30 Sep 2024 15:05:40 GMT
foundInMaster: true
id: 22a8c610015b1b9d89af39221beabe66
v3_1: true
@@ -4817,7 +4817,7 @@
owner: codekie
logo: https://avatars.githubusercontent.com/u/1512840?v=4
license: MIT
- repoEtag: '"5f68e5c17d4ae2dc0f88d72e494b34b8e839dfcff47e33e7565c7b357cb2a650"'
+ repoEtag: '"b57eb637e986246380dd0e49e7febadb8ce6618cbaa85ff63b8fa2edb33f01c8"'
repoLastModified: Wed, 28 Aug 2024 16:03:44 GMT
foundInMaster: true
id: 301e3f380f248daf345a88c8971d2a71
@@ -4926,7 +4926,7 @@
owner: github
logo: https://avatars.githubusercontent.com/u/9919?v=4
license: MIT
- repoEtag: '"455ae3d2708bac9d550281f6a7d424fa76afd5bfd4a73625d02e5924237dbf30"'
+ repoEtag: '"f2e2b4b5af715e450be62dbc971ae5d8228ad959f0bf8d20f7837adedde10ab8"'
repoLastModified: Mon, 23 Sep 2024 14:00:26 GMT
foundInMaster: true
id: ec6a7a1e4a69a9beeb95bdebb88cb36d
@@ -5020,17 +5020,17 @@
repositoryId: 36817565
description: The ZAP by Checkmarx Core project
created: '2015-06-03T16:55:01Z'
- updated: '2024-09-29T17:22:10Z'
+ updated: '2024-09-30T17:13:24Z'
language: Java
archived: false
- stars: 12552
+ stars: 12555
watchers: 395
forks: 2243
owner: zaproxy
logo: https://avatars.githubusercontent.com/u/6716868?v=4
license: Apache-2.0
- repoEtag: '"27b67ef2dbe594fcec31b8eb71661349130cbaa104ad5eecc18bb06b6caedd98"'
- repoLastModified: Sun, 29 Sep 2024 17:22:10 GMT
+ repoEtag: '"9c783696893139ef5d4d65c2f2a6c298a3aa20b945fd0c885b4464d9aede1fbe"'
+ repoLastModified: Mon, 30 Sep 2024 17:13:24 GMT
foundInMaster: true
id: 9eedc1be44837a65f912bcf562844f39
- source:
@@ -5337,11 +5337,11 @@
archived: false
stars: 419
watchers: 9
- forks: 65
+ forks: 66
owner: KissPeter
logo: https://avatars.githubusercontent.com/u/19633417?v=4
license: GPL-3.0
- repoEtag: '"62eca828d3b4d80efb604720ba56781172d064f06ec6e1df6e0a15337dcaf1d7"'
+ repoEtag: '"73eadc5a8ecd60e9375187785d3b9fbf82fb66e1aeb7cd168650240b6d2baf80"'
repoLastModified: Fri, 27 Sep 2024 09:58:12 GMT
foundInMaster: true
id: bd38b4a53d7dcb21f05b494be14573e6
@@ -5364,17 +5364,17 @@
repositoryId: 1431547
description: Web APIs for Django. 🎸
created: '2011-03-02T17:13:56Z'
- updated: '2024-09-30T03:21:08Z'
+ updated: '2024-10-01T00:14:19Z'
language: Python
archived: false
- stars: 28202
+ stars: 28204
watchers: 628
- forks: 6815
+ forks: 6813
owner: encode
logo: https://avatars.githubusercontent.com/u/19159390?v=4
license: NOASSERTION
- repoEtag: '"9b4e7bea7ffdb42b086dfc9a0733d73e24b8c7e33f094515a1e62700585b237c"'
- repoLastModified: Mon, 30 Sep 2024 03:21:08 GMT
+ repoEtag: '"100b4c6700e9869150d1a62a89d11254984f688b9ccea3fb9ef7d223fce7f92a"'
+ repoLastModified: Tue, 01 Oct 2024 00:14:19 GMT
foundInMaster: true
id: fb8994c078a380cc3510b024f6ed1202
category: Server Implementations
@@ -5524,17 +5524,17 @@
repositoryId: 382338785
description: JSON Schema and OpenAPI data validator for Perl
created: '2021-07-02T12:25:14Z'
- updated: '2024-04-12T09:18:53Z'
+ updated: '2024-09-30T14:11:46Z'
language: Perl
- archived: true
+ archived: false
stars: 8
watchers: 8
forks: 4
owner: skbkontur
logo: https://avatars.githubusercontent.com/u/5087073?v=4
license: NOASSERTION
- repoEtag: '"ff215f3bd7fdfcd72416a95fe0a601626e5c122b4486c3845d91058163c1a6bb"'
- repoLastModified: Fri, 12 Apr 2024 09:18:53 GMT
+ repoEtag: '"4020f0aca3d6e8f145b4129769ff719e04926d3ac5960a701fc3da8d55a3191a"'
+ repoLastModified: Mon, 30 Sep 2024 14:11:46 GMT
foundInMaster: true
id: 66dd4d5692dee0c9db5adb6f7788057a
- source:
@@ -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-09-29T23:40:42Z'
+ updated: '2024-09-30T15:12:21Z'
language: TypeScript
archived: false
- stars: 1735
+ stars: 1738
watchers: 18
forks: 201
owner: stoplightio
logo: https://avatars.githubusercontent.com/u/10767217?v=4
license: Apache-2.0
- repoEtag: '"fed239c78e3e8b8156c70eda9f982f4f1e4e5f3f59eeafa8bb74d87a95aa2413"'
- repoLastModified: Sun, 29 Sep 2024 23:40:42 GMT
+ repoEtag: '"026b6033f0437443f9507ff746308a59af3116fb402e023e75a04f365c4621b0"'
+ repoLastModified: Mon, 30 Sep 2024 15:12:21 GMT
foundInMaster: true
id: 2f94cc1fc980953b17a9979d4ff2e7ec
- source:
@@ -5813,7 +5813,7 @@
repositoryId: 350501832
description: Open API (OAS 3.0) Typescript generator
created: '2021-03-22T22:01:11Z'
- updated: '2024-09-26T23:39:51Z'
+ updated: '2024-09-30T08:22:54Z'
language: TypeScript
archived: false
stars: 40
@@ -5822,8 +5822,8 @@
owner: Embraser01
logo: https://avatars.githubusercontent.com/u/8802277?v=4
license: MIT
- repoEtag: '"865154701d7973b5921f2a4885358e19679c86e90fdfa1ae0e1dfdee356a5a6d"'
- repoLastModified: Thu, 26 Sep 2024 23:39:51 GMT
+ repoEtag: '"e1e5f3951118f8aa2ed84e63f5bf97ad30858d16f0cb195a5782412fb964153b"'
+ repoLastModified: Mon, 30 Sep 2024 08:22:54 GMT
foundInMaster: true
category:
- SDK
@@ -6020,7 +6020,7 @@
owner: pmcelhaney
logo: https://avatars.githubusercontent.com/u/51504?v=4
license: MIT
- repoEtag: '"2666b6d06ace4118c164e393c529ac321fd6ec796dff8033fc73e5a7659dc092"'
+ repoEtag: '"06acf453df227c3c33c10c87049f782448a0810b26c92fc0727e15e3bae12c88"'
repoLastModified: Fri, 27 Sep 2024 21:35:45 GMT
category:
- Mock
@@ -6074,17 +6074,17 @@
you can think. vacuum is compatible with Spectral rulesets and generates
compatible reports.
created: '2021-10-10T18:24:19Z'
- updated: '2024-09-28T13:51:45Z'
+ updated: '2024-09-30T13:18:27Z'
language: Go
archived: false
- stars: 576
+ stars: 578
watchers: 7
forks: 48
owner: daveshanley
logo: https://avatars.githubusercontent.com/u/187345?v=4
license: MIT
- repoEtag: '"31ba57a5fa47eb63dbc6e5097745b44a9fc3865858f8240aa10c8b2f627f887e"'
- repoLastModified: Sat, 28 Sep 2024 13:51:45 GMT
+ repoEtag: '"f334e76869b583d709529abc15e772f348e939cc2c85133587cd7b1cce8a8303"'
+ repoLastModified: Mon, 30 Sep 2024 13:18:27 GMT
foundInMaster: true
category:
- Description Validators
@@ -6178,7 +6178,7 @@
owner: pb33f
logo: https://avatars.githubusercontent.com/u/104016643?v=4
license: NOASSERTION
- repoEtag: '"20b9dd190b1879f6b6b7fe308449e04a376e7f0026cc3122671be2e935b875a4"'
+ repoEtag: '"f80216c29f93f1c03222866be47ded414c949c8f88051bed1bba1bd9740e7eae"'
repoLastModified: Sun, 29 Sep 2024 18:27:20 GMT
category: Parsers
foundInMaster: true
@@ -6483,7 +6483,7 @@
owner: znsio
logo: https://avatars.githubusercontent.com/u/75619722?v=4
license: MIT
- repoEtag: '"603699e20f9d6a1e8ec836d04a508a1d8d3ee1fead8ea022de73167a403b1ebb"'
+ repoEtag: '"4813455240ddf6326bdfc9be3cd9f453fcf7f454d8e3987aaa7d5ef298158594"'
repoLastModified: Fri, 27 Sep 2024 15:47:26 GMT
foundInMaster: true
- source:
@@ -6503,17 +6503,17 @@
changed between two OpenAPI specs, or a single spec over time. Supports
OpenAPI 3.1, 3.0 and Swagger
created: '2022-11-28T16:53:14Z'
- updated: '2024-09-26T08:12:34Z'
+ updated: '2024-09-30T04:13:57Z'
language: Go
archived: false
- stars: 176
+ stars: 177
watchers: 1
forks: 16
owner: pb33f
logo: https://avatars.githubusercontent.com/u/104016643?v=4
license: NOASSERTION
- repoEtag: '"537ff66fb01388319c025dcabca5f609d493f7bd63ac288ce8e630b2fb3fc405"'
- repoLastModified: Thu, 26 Sep 2024 08:12:34 GMT
+ repoEtag: '"799eec0f7001a0db79b078f05ff799f9809b1719a5eebb1ea137a0cdc41b38b0"'
+ repoLastModified: Mon, 30 Sep 2024 04:13:57 GMT
category:
- Data Validators
- Testing
@@ -6758,7 +6758,7 @@
repositoryId: 654923338
description: Simplify your JsonSchema by combining allOf safely.
created: '2023-06-17T10:45:41Z'
- updated: '2024-09-28T07:24:58Z'
+ updated: '2024-09-30T22:44:38Z'
language: TypeScript
archived: false
stars: 14
@@ -6767,8 +6767,8 @@
owner: udamir
logo: https://avatars.githubusercontent.com/u/29271460?v=4
license: MIT
- repoEtag: '"f6c40c6cfea4e3a114bce797e4ae0edac285930380c396ff4a9924fadd2e7274"'
- repoLastModified: Sat, 28 Sep 2024 07:24:58 GMT
+ repoEtag: '"1172236595560f3ab4119af321734c340d2223abdb0a7c17f8e2271a9c65623d"'
+ repoLastModified: Mon, 30 Sep 2024 22:44:38 GMT
foundInMaster: true
- source: https://openapi.tools/
name: api-ref-bundler
@@ -6789,7 +6789,7 @@
repositoryId: 507419359
description: Bundle all external $ref in Json based API document into single document
created: '2022-06-25T21:21:05Z'
- updated: '2024-09-28T07:22:21Z'
+ updated: '2024-09-30T22:42:45Z'
language: TypeScript
archived: false
stars: 17
@@ -6798,8 +6798,8 @@
owner: udamir
logo: https://avatars.githubusercontent.com/u/29271460?v=4
license: MIT
- repoEtag: '"9ccf806269696cce5779702126c174337c7a518218482af87ad8250c13d3a61f"'
- repoLastModified: Sat, 28 Sep 2024 07:22:21 GMT
+ repoEtag: '"4240c91766cc9934f10d6bc8ea2c38a65df813b88994aaa550fe3ec5d63cf438"'
+ repoLastModified: Mon, 30 Sep 2024 22:42:45 GMT
foundInMaster: true
- source: https://openapi.tools/
name: rswag
@@ -6833,7 +6833,7 @@
owner: rswag
logo: https://avatars.githubusercontent.com/u/55741034?v=4
license: MIT
- repoEtag: '"b081e3b732b8fe6b68003808e8bdf96ff6799f3087e354ceefff924320407277"'
+ repoEtag: '"edc6a65715d378cbf557c3e82151fe46a6e3be879f6e4cc6698f3b84814e4585"'
repoLastModified: Sun, 29 Sep 2024 14:16:49 GMT
foundInMaster: true
v3_1_link: https://github.com/rswag/rswag/pull/714
@@ -6878,7 +6878,7 @@
repositoryId: 476820102
description: Input OpenAPI. Output SDKs and Docs.
created: '2022-04-01T17:56:54Z'
- updated: '2024-09-29T23:54:51Z'
+ updated: '2024-09-30T19:01:09Z'
language: TypeScript
archived: false
stars: 2600
@@ -6887,8 +6887,8 @@
owner: fern-api
logo: https://avatars.githubusercontent.com/u/102944815?v=4
license: Apache-2.0
- repoEtag: '"589e9536fcb2029d5627be4bfaf3d3b26014b35b4a718e1b525b09b5830ae5b4"'
- repoLastModified: Sun, 29 Sep 2024 23:54:51 GMT
+ repoEtag: '"c822f7ece538c81e7815b2e89286fa3a659dfba49b9ab002486a6fb880d8e46f"'
+ repoLastModified: Mon, 30 Sep 2024 19:01:09 GMT
foundInMaster: true
sponsored: true
testimonial: >
@@ -6997,11 +6997,11 @@
archived: false
stars: 1376
watchers: 106
- forks: 111
+ forks: 113
owner: apple
logo: https://avatars.githubusercontent.com/u/10639145?v=4
license: Apache-2.0
- repoEtag: '"63880debee5bc2332b73aabbf83f053f7cdb4f6d303ab5e3667b0472e0ffc6b6"'
+ repoEtag: '"d7f0ce39b526b7dbd6105c65f41693517b7baf9c26daed1de44dbebfd39ac6b1"'
repoLastModified: Sun, 29 Sep 2024 17:15:35 GMT
foundInMaster: true
- source:
@@ -7020,17 +7020,17 @@
The world's coolest API Validation and compliance tool. Validate APIs
against OpenAPI specifications and much more
created: '2023-05-01T17:19:15Z'
- updated: '2024-09-30T03:22:59Z'
+ updated: '2024-09-30T14:13:29Z'
language: Go
archived: false
- stars: 104
+ stars: 106
watchers: 1
forks: 17
owner: pb33f
logo: https://avatars.githubusercontent.com/u/104016643?v=4
license: NOASSERTION
- repoEtag: '"d8c40037bc4becf6ec970a507b540f4e7e4e4bacaaf46fea8966888161b43454"'
- repoLastModified: Mon, 30 Sep 2024 03:22:59 GMT
+ repoEtag: '"71b09358307dc461d3580db17216094693488d8b76bf4d94ff6d5e0773706223"'
+ repoLastModified: Mon, 30 Sep 2024 14:13:29 GMT
category:
- Testing Tools
- Testing
@@ -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-09-27T10:26:47Z'
+ updated: '2024-09-30T19:02:02Z'
language: Go
archived: false
- stars: 813
+ stars: 815
watchers: 7
forks: 41
owner: go-fuego
logo: https://avatars.githubusercontent.com/u/148255240?v=4
license: MIT
- repoEtag: '"a11c294c22baa300b85e470be3b52d285300f6c707a9fe5f0d7153ba75c4b221"'
- repoLastModified: Fri, 27 Sep 2024 10:26:47 GMT
+ repoEtag: '"962181cb4b4475b354f87cbe37f375a4573cc9d1f0010718df26de9f3b7a8433"'
+ repoLastModified: Mon, 30 Sep 2024 19:02:02 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-09-29T23:17:03Z'
+ updated: '2024-09-30T20:09:15Z'
language: Go
archived: false
- stars: 1927
+ stars: 1931
watchers: 27
- forks: 139
+ forks: 142
owner: danielgtaylor
logo: https://avatars.githubusercontent.com/u/106826?v=4
license: MIT
- repoEtag: '"a60e0322b157fbe65a4048b0ec426f15130fca5bbee797c062678fc9c8709f4c"'
- repoLastModified: Sun, 29 Sep 2024 23:17:03 GMT
+ repoEtag: '"f0366d0f7a4244036b1dac334fefb4cf89d08f7c332ebde553cc7d2562300217"'
+ repoLastModified: Mon, 30 Sep 2024 20:09:15 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-09-27T14:13:00Z'
+ updated: '2024-09-30T21:17:53Z'
language: TypeScript
archived: false
- stars: 57
+ stars: 58
watchers: 3
forks: 2
owner: zuplo
logo: https://avatars.githubusercontent.com/u/85497839?v=4
license: MIT
- repoEtag: '"87c9a8dbfd06adea17721b52e2ba7421c1ccfa13546dffccbcd5c5b8bc7e018b"'
- repoLastModified: Fri, 27 Sep 2024 14:13:00 GMT
+ repoEtag: '"418ea776ebad9ff7f9b08fe090649006ee9dcf59d3ebf3a70217a2d139066ba0"'
+ repoLastModified: Mon, 30 Sep 2024 21:17:53 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-09-30T03:28:42Z'
+ updated: '2024-10-01T03:05:57Z'
language: Python
archived: false
- stars: 76109
+ stars: 76135
watchers: 677
- forks: 6418
+ forks: 6420
owner: fastapi
logo: https://avatars.githubusercontent.com/u/156354296?v=4
license: MIT
- repoEtag: '"6d77c25233154eb9ba68af562717fcc1a6eff81a0c911a479c3dc266303f42e4"'
- repoLastModified: Mon, 30 Sep 2024 03:28:42 GMT
+ repoEtag: '"ad88361de12ffb1fc2ef3d245ac0bdef0ff1c19a26fa9ae5fae913f498058771"'
+ repoLastModified: Tue, 01 Oct 2024 03:05: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-09-30T03:15:26Z'
+ updated: '2024-10-01T00:44:06Z'
language: JavaScript
archived: false
- stars: 26381
+ stars: 26387
watchers: 653
- forks: 8921
+ forks: 8922
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"5bf495c89fd785d7c8b113aeb4d3909e764d09ad3b728eb35ed18ff529b99e0d"'
- repoLastModified: Mon, 30 Sep 2024 03:15:26 GMT
+ repoEtag: '"d7ce027275996e90ac5beca5a37fda2450a0870dd2185cb26c66f61985545fde"'
+ repoLastModified: Tue, 01 Oct 2024 00:44:06 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-09-30T02:02:49Z'
+ updated: '2024-09-30T21:24:05Z'
language: TypeScript
archived: false
- stars: 23353
+ stars: 23358
watchers: 297
forks: 2290
owner: Redocly
logo: https://avatars.githubusercontent.com/u/32099856?v=4
license: MIT
- repoEtag: '"a4e015080fbd42957a29d1a566c3ab95d06a0c9a1f3a7de3c10f2a36da87c454"'
- repoLastModified: Mon, 30 Sep 2024 02:02:49 GMT
+ repoEtag: '"76bb6334600743d05579e617ac7b97478819d20c566ef33da1f20e10b13567a1"'
+ repoLastModified: Mon, 30 Sep 2024 21:24:05 GMT
foundInMaster: true
v3_1: true
id: 2725d6db6977c1dd12ceaf9701787e07
@@ -7637,7 +7637,7 @@
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-09-30T01:33:07Z'
+ updated: '2024-09-30T18:29:05Z'
language: TypeScript
archived: false
stars: 6287
@@ -7646,8 +7646,8 @@
owner: mockoon
logo: https://avatars.githubusercontent.com/u/49429147?v=4
license: NOASSERTION
- repoEtag: '"a21a627d00a06158ef1260511099d17312fdc2f80d31d8882adb431c1386d7d3"'
- repoLastModified: Mon, 30 Sep 2024 01:33:07 GMT
+ repoEtag: '"adc0b4eed12407835605671e0b19149bfb210615ee90cc2ecb38a9beb9a13aaa"'
+ repoLastModified: Mon, 30 Sep 2024 18:29:05 GMT
foundInMaster: true
category: Testing
id: 8728dfca2c1908dbecdcddd31597fad4
@@ -7664,23 +7664,23 @@
v3: true
repositoryMetadata:
base64Readme: >-
- IyBgb2FwaS1jb2RlZ2VuYAoKWyFbT3BlblNTRiBCZXN0IFByYWN0aWNlc10oaHR0cHM6Ly93d3cuYmVzdHByYWN0aWNlcy5kZXYvcHJvamVjdHMvOTQ1MC9iYWRnZSldKGh0dHBzOi8vd3d3LmJlc3RwcmFjdGljZXMuZGV2L3Byb2plY3RzLzk0NTApCgpgb2FwaS1jb2RlZ2VuYCBpcyBhIGNvbW1hbmQtbGluZSB0b29sIGFuZCBsaWJyYXJ5IHRvIGNvbnZlcnQgT3BlbkFQSSBzcGVjaWZpY2F0aW9ucyB0byBHbyBjb2RlLCBiZSBpdCBbc2VydmVyLXNpZGUgaW1wbGVtZW50YXRpb25zXSgjZ2VuZXJhdGluZy1zZXJ2ZXItc2lkZS1ib2lsZXJwbGF0ZSksIFtBUEkgY2xpZW50c10oI2dlbmVyYXRpbmctYXBpLWNsaWVudHMpLCBvciBzaW1wbHkgW0hUVFAgbW9kZWxzXSgjZ2VuZXJhdGluZy1hcGktbW9kZWxzKS4KClVzaW5nIGBvYXBpLWNvZGVnZW5gIGFsbG93cyB5b3UgdG8gcmVkdWNlIHRoZSBib2lsZXJwbGF0ZSByZXF1aXJlZCB0byBjcmVhdGUgb3IgaW50ZWdyYXRlIHdpdGggc2VydmljZXMgYmFzZWQgb24gW09wZW5BUEkgMy4wXShodHRwczovL2dpdGh1Yi5jb20vT0FJL09wZW5BUEktU3BlY2lmaWNhdGlvbi9ibG9iL21haW4vdmVyc2lvbnMvMy4wLjAubWQpLCBhbmQgaW5zdGVhZCBmb2N1cyBvbiB3cml0aW5nIHlvdXIgYnVzaW5lc3MgbG9naWMsIGFuZCB3b3JraW5nIG9uIHRoZSByZWFsIHZhbHVlLWFkZCBmb3IgeW91ciBvcmdhbmlzYXRpb24uCgpXaXRoIGBvYXBpLWNvZGVnZW5gLCB0aGVyZSBhcmUgYSBmZXcgW0tleSBEZXNpZ24gRGVjaXNpb25zXSgja2V5LWRlc2lnbi1kZWNpc2lvbnMpIHdlJ3ZlIG1hZGUsIGluY2x1ZGluZzoKCi0gaWRpb21hdGljIEdvLCB3aGVyZSBwb3NzaWJsZQotIGZhaXJseSBzaW1wbGUgZ2VuZXJhdGVkIGNvZGUsIGVycmluZyBvbiB0aGUgc2lkZSBvZiBkdXBsaWNhdGUgY29kZSBvdmVyIG5pY2VseSByZWZhY3RvcmVkIGNvZGUKLSBzdXBwb3J0aW5nIGFzIG11Y2ggb2YgT3BlbkFQSSAzLnggYXMgaXMgcG9zc2libGUsIGFsb25nc2lkZSBHbydzIHR5cGUgc3lzdGVtCgpgb2FwaS1jb2RlZ2VuYCBpcyBvbmUgcGFydCBvZiBhIHdpZGVyIGVjb3N5c3RlbSwgd2hpY2ggY2FuIGJlIGZvdW5kIGRlc2NyaWJlZCBpbiBmdXJ0aGVyIGRldGFpbCBpbiB0aGUgW29hcGktY29kZWdlbiBvcmdhbmlzYXRpb24gb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuKS4KCuKaoO+4jyBUaGlzIFJFQURNRSBtYXkgYmUgZm9yIHRoZSBsYXRlc3QgZGV2ZWxvcG1lbnQgdmVyc2lvbiwgd2hpY2ggbWF5IGNvbnRhaW4gdW5yZWxlYXNlZCBjaGFuZ2VzLiBQbGVhc2UgZW5zdXJlIHlvdSdyZSBsb29raW5nIGF0IHRoZSBSRUFETUUgZm9yIHRoZSBsYXRlc3QgcmVsZWFzZSB2ZXJzaW9uLgoKIyMgQWN0aW9uIFJlcXVpcmVkOiBUaGUgcmVwb3NpdG9yeSBmb3IgdGhpcyBwcm9qZWN0IGhhcyBjaGFuZ2VkCgpBcyBhbm5vdW5jZWQgaW4gW01heSAyMDI0XShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9kaXNjdXNzaW9ucy8xNjA1KSwKd2UgaGF2ZSBtb3ZlZCB0aGUgcHJvamVjdCBmcm9tIHRoZSBkZWVwbWFwIG9yZ2FuaXphdGlvbiB0byBvdXIgb3duIG9yZ2FuaXphdGlvbiwgYW5kIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHlvdXIKaW1wb3J0IHBhdGhzIHRvIHB1bGwgdXBkYXRlcyBwYXN0IHRoaXMgcG9pbnQuIFlvdSBuZWVkIHRvIGRvIGEgcmVjdXJzaXZlIHNlYXJjaC9yZXBsYWNlIGZyb20KYGdpdGh1Yi5jb20vZGVlcG1hcC9vYXBpLWNvZGVnZW4vdjJgIHRvIGBnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjJgLgoKPiBbIUlNUE9SVEFOVF0KPiBgb2FwaS1jb2RlZ2VuYCBtb3ZlZCB0byBpdHMgbmV3IGhvbWUgd2l0aCB0aGUgdmVyc2lvbiB0YWcgYHYyLjMuMGAuCgpJZiB5b3UgYXJlIHVzaW5nIGB2Mi4yLjBgIG9yIGJlbG93LCBwbGVhc2UgaW5zdGFsbCBsaWtlIHNvOgoKYGBgc2gKIyBmb3IgdGhlIGJpbmFyeSBpbnN0YWxsCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9kZWVwbWFwL29hcGktY29kZWdlbi92Mi9jbWQvb2FwaS1jb2RlZ2VuQHYyLjIuMApgYGAKCklmIHlvdSBhcmUgdXNpbmcgYHYyLjMuMGAgb3IgYWJvdmUsIHBsZWFzZSBpbnN0YWxsIGxpa2Ugc28sIHVzaW5nIHRoZSBuZXcgbW9kdWxlIGltcG9ydCBwYXRoOgoKYGBgc2gKIyBmb3IgdGhlIGJpbmFyeSBpbnN0YWxsCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyL2NtZC9vYXBpLWNvZGVnZW5AbGF0ZXN0CmBgYAoKIyMgSW5zdGFsbAoKSXQgaXMgcmVjb21tZW5kZWQgdG8gZm9sbG93IFt0aGUgYHRvb2xzLmdvYCBwYXR0ZXJuXShodHRwczovL3d3dy5qdnQubWUvcG9zdHMvMjAyMi8wNi8xNS9nby10b29scy1kZXBlbmRlbmN5LW1hbmFnZW1lbnQvKSBmb3IgbWFuYWdpbmcgdGhlIGRlcGVuZGVuY3kgb2YgYG9hcGktY29kZWdlbmAgYWxvbmdzaWRlIHlvdXIgY29yZSBhcHBsaWNhdGlvbi4KClRoaXMgd291bGQgZ2l2ZSB5b3UgYSBgdG9vbHMvdG9vbHMuZ29gOgoKYGBgZ28KLy9nbzpidWlsZCB0b29scwovLyArYnVpbGQgdG9vbHMKCnBhY2thZ2UgbWFpbgoKaW1wb3J0ICgKCV8gImdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9jbWQvb2FwaS1jb2RlZ2VuIgopCmBgYAoKVGhlbiwgZWFjaCBpbnZvY2F0aW9uIG9mIGBvYXBpLWNvZGVnZW5gIHdvdWxkIGJlIHVzZWQgbGlrZSBzbzoKCmBgYGdvCi8vZ286Z2VuZXJhdGUgZ28gcnVuIGdpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9jbWQvb2FwaS1jb2RlZ2VuIC0tY29uZmlnPWNvbmZpZy55YW1sIC4uLy4uL2FwaS55YW1sCmBgYAoKQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBpbnN0YWxsIGl0IGFzIGEgYmluYXJ5IHdpdGg6CgpgYGBzaAokIGdvIGluc3RhbGwgZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyL2NtZC9vYXBpLWNvZGVnZW5AbGF0ZXN0CiQgb2FwaS1jb2RlZ2VuIC12ZXJzaW9uCmBgYAoKV2hpY2ggdGhlbiBtZWFucyB5b3UgY2FuIGludm9rZSBpdCBsaWtlIHNvOgoKYGBgZ28KLy9nbzpnZW5lcmF0ZSBvYXBpLWNvZGVnZW4gLS1jb25maWc9Y29uZmlnLnlhbWwgLi4vLi4vYXBpLnlhbWwKYGBgCgojIyMgUGlubmluZyB0byBjb21taXRzCgpXaGlsZSB0aGUgcHJvamVjdCBkb2VzIG5vdCAoW3lldF0oaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vaXNzdWVzLzE1MTkpKSBoYXZlIGEgZGVmaW5lZCByZWxlYXNlIGNhZGVuY2UsIHRoZXJlIG1heSBiZSBjYXNlcyB3aGVyZSB5b3Ugd2FudCB0byBwdWxsIGluIHlldC11bnJlbGVhc2VkIGNoYW5nZXMgdG8geW91ciBjb2RlYmFzZS4KClRoZXJlZm9yZSwgeW91IG1heSB3YW50IHRvIHBpbiB5b3VyIGRlcGVuZGVuY3kgb24gYG9hcGktY29kZWdlbmAgdG8gYSBnaXZlbiBjb21taXQgaGFzaCwgcmF0aGVyIHRoYW4gYSB0YWcuCgpUaGlzIGlzICoqb2ZmaWNpYWxseSByZWNvbW1lbmRlZCoqIGZvciBjb25zdW1lcnMgb2YgYG9hcGktY29kZWdlbmAsIHdobyB3YW50IGZlYXR1cmVzL2J1ZyBmaXhlcyB0aGF0IGhhdmVuJ3QgeWV0IGJlZW4gcmVsZWFzZWQuCgpXZSBhaW0gdG8ga2VlcCB0aGUgZGVmYXVsdCBicmFuY2ggcmVhZHktdG8tcmVsZWFzZSBzbyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gc2FmZWx5IHBpbi4KClRvIGRvIHNvLCB5b3UgY2FuIHJ1bjoKCmBgYHNoCiMgcGluIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvbiB0aGUgZGVmYXVsdCBicmFuY2gKJCBnbyBnZXQgZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyQG1haW4KIyBhbHRlcm5hdGl2ZWx5LCB0byBhIGNvbW1pdCBoYXNoIGkuZS4gaHR0cHM6Ly9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vY29tbWl0LzcxZTkxNmM1OTY4OGE2Mzc5YjU3NzRkZmU1OTA0ZWMyMjJiOWE1MzcKJCBnbyBnZXQgZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyQDcxZTkxNmM1OTY4OGE2Mzc5YjU3NzRkZmU1OTA0ZWMyMjJiOWE1MzcKYGBgCgpUaGlzIHdpbGwgdGhlbiBtYWtlIGEgY2hhbmdlIHN1Y2ggYXM6CgpgYGBkaWZmCmRpZmYgLS1naXQgZ28ubW9kIGdvLm1vZAppbmRleCA0NGYyOWE0Li40MzZhNzgwIDEwMDY0NAotLS0gZ28ubW9kCisrKyBnby5tb2QKQEAgLTIsMjEgKzIsMjAgQEAKLXJlcXVpcmUgZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL3YyIHYyLjEuMAorcmVxdWlyZSBnaXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIgdjIuMS4xLTAuMjAyNDAzMzEyMTI1MTQtODBmMGI5NzhlZjE2CmBgYAoKIyMgVXNhZ2UKCmBvYXBpLWNvZGVnZW5gIGlzIGxhcmdlbHkgY29uZmlndXJlZCB1c2luZyBhIFlBTUwgY29uZmlndXJhdGlvbiBmaWxlLCB0byBzaW1wbGlmeSB0aGUgbnVtYmVyIG9mIGZsYWdzIHRoYXQgdXNlcnMgbmVlZCB0byByZW1lbWJlciwgYW5kIHRvIG1ha2UgcmVhZGluZyB0aGUgYGdvOmdlbmVyYXRlYCBjb21tYW5kIGxlc3MgZGF1bnRpbmcuCgpGb3IgZnVsbCBkZXRhaWxzIG9mIHdoYXQgaXMgc3VwcG9ydGVkLCBpdCdzIHdvcnRoIGNoZWNraW5nIG91dCBbdGhlIEdvRG9jIGZvciBgY29kZWdlbi5Db25maWd1cmF0aW9uYF0oaHR0cHM6Ly9wa2cuZ28uZGV2L2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi92Mi9wa2cvY29kZWdlbiNDb25maWd1cmF0aW9uKS4KCldlIGFsc28gaGF2ZSBbYSBKU09OIFNjaGVtYV0oY29uZmlndXJhdGlvbi1zY2hlbWEuanNvbikgdGhhdCBjYW4gYmUgdXNlZCBieSBJREVzL2VkaXRvcnMgd2l0aCB0aGUgTGFuZ3VhZ2UgU2VydmVyIFByb3RvY29sIChMU1ApIHRvIHBlcmZvcm0gaW50ZWxsaWdlbnQgc3VnZ2VzdGlvbnMsIGkuZS46CgpgYGB5YW1sCiMgeWFtbC1sYW5ndWFnZS1zZXJ2ZXI6ICRzY2hlbWE9aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vSEVBRC9jb25maWd1cmF0aW9uLXNjaGVtYS5qc29uCnBhY2thZ2U6IGFwaQojIC4uLgpgYGAKCiMjIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoKQWx0aG91Z2ggd2Ugc3RyaXZlIHRvIHJldGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAtIGFzIGEgcHJvamVjdCB0aGF0J3MgdXNpbmcgYSBzdGFibGUgQVBJIHBlciBTZW1WZXIgLSB0aGVyZSBhcmUgc29tZXRpbWVzIG9wcG9ydHVuaXRpZXMgd2UgbXVzdCB0YWtlIHRvIGZpeCBhIGJ1ZyB0aGF0IGNvdWxkIGNhdXNlIGEgYnJlYWtpbmcgY2hhbmdlIGZvciBbcGVvcGxlIHJlbHlpbmcgdXBvbiB0aGUgYmVoYXZpb3VyXShodHRwczovL3hrY2QuY29tLzExNzIvKS4KCkluIHRoaXMgY2FzZSwgd2Ugd2lsbCBleHBvc2UgYSBbY29tcGF0aWJpbGl0eSBvcHRpb25dKGh0dHBzOi8vcGtnLmdvLmRldi9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvcGtnL2NvZGVnZW4jQ29tcGF0aWJpbGl0eU9wdGlvbnMpIHRvIHJlc3RvcmUgb2xkIGJlaGF2aW91ci4KCiMjIEZlYXR1cmVzCgpBdCBhIGhpZ2ggbGV2ZWwsIGBvYXBpLWNvZGVnZW5gIHN1cHBvcnRzOgoKLSBHZW5lcmF0aW5nIHNlcnZlci1zaWRlIGJvaWxlcnBsYXRlIGZvciBbYSBudW1iZXIgb2Ygc2VydmVyc10oI3N1cHBvcnRlZC1zZXJ2ZXJzKSAoW2RvY3NdKCNnZW5lcmF0aW5nLXNlcnZlci1zaWRlLWJvaWxlcnBsYXRlKSkKLSBHZW5lcmF0aW5nIGNsaWVudCBBUEkgYm9pbGVycGxhdGUgKFtkb2NzXSgjZ2VuZXJhdGluZy1hcGktY2xpZW50cykpCi0gR2VuZXJhdGluZyB0aGUgdHlwZXMgKFtkb2NzXSgjZ2VuZXJhdGluZy1hcGktbW9kZWxzKSkKLSBTcGxpdHRpbmcgbGFyZ2UgT3BlbkFQSSBzcGVjcyBhY3Jvc3MgbXVsdGlwbGUgcGFja2FnZXMoW2RvY3NdKCNpbXBvcnQtbWFwcGluZykpCiAgLSBUaGlzIGlzIGFsc28ga25vd24gYXMgIkltcG9ydCBNYXBwaW5nIiBvciAiZXh0ZXJuYWwgcmVmZXJlbmNlcyIgYWNyb3NzIG91ciBkb2N1bWVudGF0aW9uIC8gZGlzY3Vzc2lvbiBpbiBHaXRIdWIgaXNzdWVzCgojIyBXaGF0IGRvZXMgaXQgbG9vayBsaWtlPwoKQmVsb3cgd2UgY2FuIHNlZSBhIHRyaW1tZWQgZG93biBleGFtcGxlIHRha2VuIGZyb20gdGhlIE9wZW5BUEkgUGV0c3RvcmUgW2V4YW1wbGVdKGV4YW1wbGVzL3BldHN0b3JlLWV4cGFuZGVkL3N0ZGh0dHAvYXBpL3BldHN0b3JlLmdlbi5nbyk6CgpgYGBnbwovLyBnZW5lcmF0ZWQgY29kZQoKdHlwZSBTZXJ2ZXJJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCS8vIC4uLgoJLy8gUmV0dXJucyBhbGwgcGV0cwoJLy8gKEdFVCAvcGV0cykKCUZpbmRQZXRzKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0LCBwYXJhbXMgRmluZFBldHNQYXJhbXMpCgkvLyAuLi4KfQoKLy8gRmluZFBldHMgb3BlcmF0aW9uIG1pZGRsZXdhcmUKZnVuYyAoc2l3ICpTZXJ2ZXJJbnRlcmZhY2VXcmFwcGVyKSBGaW5kUGV0cyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgewoKCXZhciBlcnIgZXJyb3IKCgkvLyBQYXJhbWV0ZXIgb2JqZWN0IHdoZXJlIHdlIHdpbGwgdW5tYXJzaGFsIGFsbCBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbnRleHQKCXZhciBwYXJhbXMgRmluZFBldHNQYXJhbXMKCgkvLyAtLS0tLS0tLS0tLS0tIE9wdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlciAidGFncyIgLS0tLS0tLS0tLS0tLQoKCWVyciA9IHJ1bnRpbWUuQmluZFF1ZXJ5UGFyYW1ldGVyKCJmb3JtIiwgdHJ1ZSwgZmFsc2UsICJ0YWdzIiwgci5VUkwuUXVlcnkoKSwgJnBhcmFtcy5UYWdzKQoJaWYgZXJyICE9IG5pbCB7CgkJc2l3LkVycm9ySGFuZGxlckZ1bmModywgciwgJkludmFsaWRQYXJhbUZvcm1hdEVycm9ye1BhcmFtTmFtZTogInRhZ3MiLCBFcnI6IGVycn0pCgkJcmV0dXJuCgl9CgoJLy8gLS0tLS0tLS0tLS0tLSBPcHRpb25hbCBxdWVyeSBwYXJhbWV0ZXIgImxpbWl0IiAtLS0tLS0tLS0tLS0tCgoJZXJyID0gcnVudGltZS5CaW5kUXVlcnlQYXJhbWV0ZXIoImZvcm0iLCB0cnVlLCBmYWxzZSwgImxpbWl0Iiwgci5VUkwuUXVlcnkoKSwgJnBhcmFtcy5MaW1pdCkKCWlmIGVyciAhPSBuaWwgewoJCXNpdy5FcnJvckhhbmRsZXJGdW5jKHcsIHIsICZJbnZhbGlkUGFyYW1Gb3JtYXRFcnJvcntQYXJhbU5hbWU6ICJsaW1pdCIsIEVycjogZXJyfSkKCQlyZXR1cm4KCX0KCgloYW5kbGVyIDo9IGh0dHAuSGFuZGxlcihodHRwLkhhbmRsZXJGdW5jKGZ1bmModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpIHsKCQlzaXcuSGFuZGxlci5GaW5kUGV0cyh3LCByLCBwYXJhbXMpCgl9KSkKCglmb3IgXywgbWlkZGxld2FyZSA6PSByYW5nZSBzaXcuSGFuZGxlck1pZGRsZXdhcmVzIHsKCQloYW5kbGVyID0gbWlkZGxld2FyZShoYW5kbGVyKQoJfQoKCWhhbmRsZXIuU2VydmVIVFRQKHcsIHIpCn0KCi8vIEhhbmRsZXJXaXRoT3B0aW9ucyBjcmVhdGVzIGh0dHAuSGFuZGxlciB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucwpmdW5jIEhhbmRsZXJXaXRoT3B0aW9ucyhzaSBTZXJ2ZXJJbnRlcmZhY2UsIG9wdGlvbnMgU3RkSFRUUFNlcnZlck9wdGlvbnMpIGh0dHAuSGFuZGxlciB7CgltIDo9IG9wdGlvbnMuQmFzZVJvdXRlcgoKCWlmIG0gPT0gbmlsIHsKCQltID0gaHR0cC5OZXdTZXJ2ZU11eCgpCgl9CglpZiBvcHRpb25zLkVycm9ySGFuZGxlckZ1bmMgPT0gbmlsIHsKCQlvcHRpb25zLkVycm9ySGFuZGxlckZ1bmMgPSBmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0LCBlcnIgZXJyb3IpIHsKCQkJaHR0cC5FcnJvcih3LCBlcnIuRXJyb3IoKSwgaHR0cC5TdGF0dXNCYWRSZXF1ZXN0KQoJCX0KCX0KCgl3cmFwcGVyIDo9IFNlcnZlckludGVyZmFjZVdyYXBwZXJ7CgkJSGFuZGxlcjogICAgICAgICAgICBzaSwKCQlIYW5kbGVyTWlkZGxld2FyZXM6IG9wdGlvbnMuTWlkZGxld2FyZXMsCgkJRXJyb3JIYW5kbGVyRnVuYzogICBvcHRpb25zLkVycm9ySGFuZGxlckZ1bmMsCgl9CgoJbS5IYW5kbGVGdW5jKCJHRVQgIitvcHRpb25zLkJhc2VVUkwrIi9wZXRzIiwgd3JhcHBlci5GaW5kUGV0cykKCglyZXR1cm4gbQp9CmBgYAoKVGhlbiwgaW4geW91ciBvd24gY29kZSwgeW91IGltcGxlbWVudCB0aGUgdW5kZXJseWluZyBsb2dpYyBmb3IgdGhlIGBGaW5kUGV0c2AgaW1wbGVtZW50YXRpb246CgpgYGBnbwp0eXBlIFBldFN0b3JlIHN0cnVjdCB7CglQZXRzICAgbWFwW2ludDY0XVBldAoJTmV4dElkIGludDY0CglMb2NrICAgc3luYy5NdXRleAp9CgovLyBNYWtlIHN1cmUgd2UgY29uZm9ybSB0byBTZXJ2ZXJJbnRlcmZhY2UKCnZhciBfIFNlcnZlckludGVyZmFjZSA9ICgqUGV0U3RvcmUpKG5pbCkKCmZ1bmMgTmV3UGV0U3RvcmUoKSAqUGV0U3RvcmUgewoJcmV0dXJuICZQZXRTdG9yZXsKCQlQZXRzOiAgIG1ha2UobWFwW2ludDY0XVBldCksCgkJTmV4dElkOiAxMDAwLAoJfQp9CgovLyBGaW5kUGV0cyBpbXBsZW1lbnRzIGFsbCB0aGUgaGFuZGxlcnMgaW4gdGhlIFNlcnZlckludGVyZmFjZQpmdW5jIChwICpQZXRTdG9yZSkgRmluZFBldHModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QsIHBhcmFtcyBGaW5kUGV0c1BhcmFtcykgewoJcC5Mb2NrLkxvY2soKQoJZGVmZXIgcC5Mb2NrLlVubG9jaygpCgoJdmFyIHJlc3VsdCBbXVBldAoKCWZvciBfLCBwZXQgOj0gcmFuZ2UgcC5QZXRzIHsKCQlpZiBwYXJhbXMuVGFncyAhPSBuaWwgewoJCQkvLyBJZiB3ZSBoYXZlIHRhZ3MsICBmaWx0ZXIgcGV0cyBieSB0YWcKCQkJZm9yIF8sIHQgOj0gcmFuZ2UgKnBhcmFtcy5UYWdzIHsKCQkJCWlmIHBldC5UYWcgIT0gbmlsICYmICgqcGV0LlRhZyA9PSB0KSB7CgkJCQkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgcGV0KQoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gQWRkIGFsbCBwZXRzIGlmIHdlJ3JlIG5vdCBmaWx0ZXJpbmcKCQkJcmVzdWx0ID0gYXBwZW5kKHJlc3VsdCwgcGV0KQoJCX0KCgkJaWYgcGFyYW1zLkxpbWl0ICE9IG5pbCB7CgkJCWwgOj0gaW50KCpwYXJhbXMuTGltaXQpCgkJCWlmIGxlbihyZXN1bHQpID49IGwgewoJCQkJLy8gV2UncmUgYXQgdGhlIGxpbWl0CgkJCQlicmVhawoJCQl9CgkJfQoJfQoKCXcuV3JpdGVIZWFkZXIoaHR0cC5TdGF0dXNPSykKCV8gPSBqc29uLk5ld0VuY29kZXIodykuRW5jb2RlKHJlc3VsdCkKfQpgYGAKCkFzIHdlIGNhbiBzZWUsIGBvYXBpLWNvZGVnZW5gIHNpbXBsaWZpZXMgc29tZSBvZiB0aGUgYm9pbGVycGxhdGUgYnkgdGFraW5nIHBhcmFtZXRlcnMgb3V0IG9mIHRoZSByZXF1ZXN0IGFuZCBpbnN0ZWFkIGFsbG93cyB1cyB0byBmb2N1cyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCgpZb3UnbGwgbm90ZSB0aGF0IHRoZXJlJ3Mgc3RpbGwgYSBiaXQgbW9yZSBtYXJzaGFsaW5nIG9mIHJlcXVlc3QvcmVzcG9uc2UgZGF0YSwgd2hpY2ggaXMgZnVydGhlciByZWR1Y2VkIGJ5IHVzaW5nIHRoZSBbU3RyaWN0IHNlcnZlcl0oI3N0cmljdC1zZXJ2ZXIpIGZ1bmN0aW9uYWxpdHkuCgo8YSBuYW1lPSJ3aGF0LWRvZXMtaXQtbG9vay1saWtlLXN0cmljdCI+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+CgpCeSBkZWZhdWx0LCBgb2FwaS1jb2RlZ2VuYCB3aWxsIHBlcmZvcm0gY2FtZWwtY2FzZSBjb252ZXJzaW9uLCBzbyBmb3IgYSBzcGVjIHN1Y2ggYXM6CgpgYGB5YW1sCm9wZW5hcGk6ICIzLjAuMCIKaW5mbzoKICB2ZXJzaW9uOiAxLjAuMAogIHRpdGxlOiBFeGFtcGxlIGNvZGUgZm9yIHRoZSBgbmFtZS1ub3JtYWxpemVyYCBvdXRwdXQgb3B0aW9uCnBhdGhzOgogIC9hcGkvcGV0cy97cGV0SWR9OgogICAgZ2V0OgogICAgICBzdW1tYXJ5OiBHZXQgcGV0IGdpdmVuIGlkZW50aWZpZXIuCiAgICAgIG9wZXJhdGlvbklkOiBnZXRIdHRwUGV0CiAgICAgIHBhcmFtZXRlcnM6CiAgICAgIC0gbmFtZTogcGV0SWQKICAgICAgICBpbjogcGF0aAogICAgICAgIHJlcXVpcmVkOiB0cnVlCiAgICAgICAgc2NoZW1hOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgIHJlc3BvbnNlczoKICAgICAgICAnMjAwJzoKICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWxpZCBwZXQKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL1BldCcKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgUGV0OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSB1dWlkCiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgdXVpZDoKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwZXQgdXVpZC4KICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBkZXNjcmlwdGlvbjogVGhlIG5hbWUgb2YgdGhlIHBldC4KICAgIEVycm9yOgogICAgICByZXF1aXJlZDoKICAgICAgICAtIGNvZGUKICAgICAgICAtIG1lc3NhZ2UKICAgICAgcHJvcGVydGllczoKICAgICAgICBjb2RlOgogICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgICAgZm9ybWF0OiBpbnQzMgogICAgICAgICAgZGVzY3JpcHRpb246IEVycm9yIGNvZGUKICAgICAgICBtZXNzYWdlOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBkZXNjcmlwdGlvbjogRXJyb3IgbWVzc2FnZQogICAgT25lT2YydGhpbmdzOgogICAgICBkZXNjcmlwdGlvbjogIk5vdGljZSB0aGF0IHRoZSBgdGhpbmdzYCBpcyBub3QgY2FwaXRhbGlzZWQiCiAgICAgIG9uZU9mOgogICAgICAgIC0gdHlwZTogb2JqZWN0CiAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgLSBpZAogICAgICAgICAgcHJvcGVydGllczoKICAgICAgICAgICAgaWQ6CiAgICAgICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgIC0gdHlwZTogb2JqZWN0CiAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgLSBpZAogICAgICAgICAgcHJvcGVydGllczoKICAgICAgICAgICAgaWQ6CiAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAgICAgZm9ybWF0OiB1dWlkCmBgYAoKVGhpcyB3aWxsIHByb2R1Y2U6CgpgYGBnbwovLyBPbmVPZjJ0aGluZ3MgTm90aWNlIHRoYXQgdGhlIGB0aGluZ3NgIGlzIG5vdCBjYXBpdGFsaXNlZAp0eXBlIE9uZU9mMnRoaW5ncyBzdHJ1Y3QgewoJdW5pb24ganNvbi5SYXdNZXNzYWdlCn0KCi8vIFBldCBkZWZpbmVzIG1vZGVsIGZvciBQZXQuCnR5cGUgUGV0IHN0cnVjdCB7CgkvLyBOYW1lIFRoZSBuYW1lIG9mIHRoZSBwZXQuCglOYW1lIHN0cmluZyBganNvbjoibmFtZSJgCgoJLy8gVVVJRCBUaGUgcGV0IHV1aWQuCglVVUlEIHN0cmluZyBganNvbjoidXVpZCJgCn0KCi8vIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGNsaWVudCBhYm92ZS4KdHlwZSBDbGllbnRJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCS8vIEdldEhUVFBQZXQgcmVxdWVzdAoJR2V0SFRUUFBldChjdHggY29udGV4dC5Db250ZXh0LCBwZXRJRCBzdHJpbmcsIHJlcUVkaXRvcnMgLi4uUmVxdWVzdEVkaXRvckZuKSAoKmh0dHAuUmVzcG9uc2UsIGVycm9yKQp9CmBgYAoKPC9kZXRhaWxzPgoKCkZvciBtb3JlIGRldGFpbHMgb2Ygd2hhdCB0aGUgcmVzdWx0aW5nIGNvZGUgbG9va3MgbGlrZSwgY2hlY2sgb3V0IFt0aGUgdGVzdCBjYXNlc10oaW50ZXJuYWwvdGVzdC9vdXRwdXRvcHRpb25zL25hbWUtbm9ybWFsaXplci8pLgoKIyMgRXhhbXBsZXMKClRoZSBbZXhhbXBsZXMgZGlyZWN0b3J5XShleGFtcGxlcykgY29udGFpbnMgc29tZSBhZGRpdGlvbmFsIGNhc2VzIHdoaWNoIGFyZSB1c2VmdWwgZXhhbXBsZXMgZm9yIGhvdyB0byB1c2UgYG9hcGktY29kZWdlbmAsIGluY2x1ZGluZyBob3cgeW91J2QgdGFrZSB0aGUgUGV0c3RvcmUgQVBJIGFuZCBpbXBsZW1lbnQgaXQgd2l0aCBgb2FwaS1jb2RlZ2VuYC4KCllvdSBjb3VsZCBhbHNvIGZpbmQgc29tZSBjYXNlcyBvZiBob3cgdGhlIHByb2plY3QgY2FuIGJlIHVzZWQgYnkgY2hlY2tpbmcgb3V0IG91ciBbaW50ZXJuYWwgdGVzdCBjYXNlc10oaW50ZXJuYWwvdGVzdCkgd2hpY2ggYXJlIHJlYWwtd29ybGQgdXNhZ2VzIHRoYXQgbWFrZSB1cCBvdXIgcmVncmVzc2lvbiB0ZXN0cy4KCiMjIyBCbG9nIHBvc3RzCgpXZSBsb3ZlIHJlYWRpbmcgcG9zdHMgYnkgdGhlIGNvbW11bml0eSBhYm91dCBob3cgdG8gdXNlIHRoZSBwcm9qZWN0LgoKSGVyZSBhcmUgYSBmZXcgd2UndmUgZm91bmQgYXJvdW5kIHRoZSBXZWI6CgotIFtCdWlsZGluZyBhIEdvIFJFU1RmdWwgQVBJIHdpdGggZGVzaWduLWZpcnN0IE9wZW5BUEkgY29udHJhY3RzXShodHRwczovL3d3dy5qdnQubWUvcG9zdHMvMjAyMi8wNy8xMi9nby1vcGVuYXBpLXNlcnZlci8pCi0gW0EgUHJhY3RpY2FsIEd1aWRlIHRvIFVzaW5nIG9hcGktY29kZWdlbiBpbiBHb2xhbmcgQVBJIERldmVsb3BtZW50IHdpdGggdGhlIEZpYmVyIEZyYW1ld29ya10oaHR0cHM6Ly9tZWRpdW0uY29tL0BmaWtpaGFsYW4vYS1wcmFjdGljYWwtZ3VpZGUtdG8tdXNpbmctb2FwaS1jb2RlZ2VuLWluLWdvbGFuZy1hcGktZGV2ZWxvcG1lbnQtd2l0aC10aGUtZmliZXItZnJhbWV3b3JrLWJjZTJhNTkzODBhZSkKLSBbR2VuZXJhdGluZyBHbyBzZXJ2ZXIgY29kZSBmcm9tIE9wZW5BUEkgMyBkZWZpbml0aW9uc10oaHR0cHM6Ly9sZGVqLm5sL3Bvc3QvZ2VuZXJhdGluZy1nby1mcm9tLW9wZW5hcGktMy8pCi0gW0dvIENsaWVudCBDb2RlIEdlbmVyYXRpb24gZnJvbSBTd2FnZ2VyIGFuZCBPcGVuQVBJXShodHRwczovL21lZGl1bS5jb20vQGt5b2RvLXRlY2gvZ28tY2xpZW50LWNvZGUtZ2VuZXJhdGlvbi1mcm9tLXN3YWdnZXItYW5kLW9wZW5hcGktYTA1NzY4MzE4MzZjKQotIFtHbyBvYXBpLWNvZGVnZW4gKyByZXF1ZXN0IHZhbGlkYXRpb25dKGh0dHBzOi8vYmxvZy5jb21taXRzbWFydC5jb20vZ28tb2FwaS1jb2RlZ2VuLXJlcXVlc3QtdmFsaWRhdGlvbi0yODUzOThiMzdkYzgpCgpHb3Qgb25lIHRvIGFkZD8gUGxlYXNlIHJhaXNlIGEgUFIhCgojIyBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyAoRkFRcykKCiMjIyBIb3cgZG9lcyBgb2FwaS1jb2RlZ2VuYCBoYW5kbGUgYGFueU9mYCwgYGFsbE9mYCBhbmQgYG9uZU9mYD8KCmBvYXBpLWNvZGVnZW5gIHN1cHBvcnRzIGBhbnlPZmAsIGBhbGxPZmAgYW5kIGBvbmVPZmAgZm9yIGdlbmVyYXRlZCBjb2RlLgoKRm9yIGluc3RhbmNlLCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgT3BlbkFQSSBzcGVjOgoKYGBgeWFtbApvcGVuYXBpOiAiMy4wLjAiCmluZm86CiAgdmVyc2lvbjogMS4wLjAKICB0aXRsZTogVXNpbmcgY29tcGxleCBzY2hlbWFzCiAgZGVzY3JpcHRpb246IEFuIGV4YW1wbGUgb2YgYGFueU9mYCwgYGFsbE9mYCBhbmQgYG9uZU9mYApjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICAjIGJhc2UgdHlwZXMKICAgIENsaWVudDoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gbmFtZQogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIG5hbWU6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgIElkZW50aXR5OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBpc3N1ZXIKICAgICAgcHJvcGVydGllczoKICAgICAgICBpc3N1ZXI6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKCiAgICAjIGFsbE9mIHBlcmZvcm1zIGEgdW5pb24gb2YgYWxsIHR5cGVzIGRlZmluZWQKICAgIENsaWVudFdpdGhJZDoKICAgICAgYWxsT2Y6CiAgICAgICAgLSAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvQ2xpZW50JwogICAgICAgIC0gcHJvcGVydGllczoKICAgICAgICAgICAgaWQ6CiAgICAgICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgICAgcmVxdWlyZWQ6CiAgICAgICAgICAgIC0gaWQKCiAgICAjIGFsbE9mIHBlcmZvcm1zIGEgdW5pb24gb2YgYWxsIHR5cGVzIGRlZmluZWQsIGJ1dCBpZiB0aGVyZSdzIGEgZHVwbGljYXRlIGZpZWxkIGRlZmluZWQsIGl0J2xsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBsYXN0IHNjaGVtYQogICAgIyBodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9pc3N1ZXMvMTU2OQogICAgSWRlbnRpdHlXaXRoRHVwbGljYXRlRmllbGQ6CiAgICAgIGFsbE9mOgogICAgICAgICMgYGlzc3VlcmAgd2lsbCBiZSBpZ25vcmVkCiAgICAgICAgLSAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvSWRlbnRpdHknCiAgICAgICAgIyBgaXNzdWVyYCB3aWxsIGJlIGlnbm9yZWQKICAgICAgICAtIHByb3BlcnRpZXM6CiAgICAgICAgICAgIGlzc3VlcjoKICAgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCiAgICAgICAgIyBgaXNzdWVyYCB3aWxsIHRha2UgcHJlY2VkZW5jZQogICAgICAgIC0gcHJvcGVydGllczoKICAgICAgICAgICAgaXNzdWVyOgogICAgICAgICAgICAgIHR5cGU6IG9iamVjdAogICAgICAgICAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgICAgICAgICBuYW1lOgogICAgICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgICAgIC0gbmFtZQoKICAgICMgYW55T2YgcmVzdWx0cyBpbiBhIHR5cGUgdGhhdCBoYXMgYW4gYEFzQ2xpZW50YC9gTWVyZ2VDbGllbnRgL2BGcm9tQ2xpZW50YCBhbmQgYW4gYEFzSWRlbnRpdHlgL2BNZXJnZUlkZW50aXR5YC9gRnJvbUlkZW50aXR5YCBtZXRob2Qgc28geW91IGNhbiBjaG9vc2Ugd2hpY2ggb2YgdGhlbSB5b3Ugd2FudCB0byByZXRyaWV2ZQogICAgQ2xpZW50QW5kTWF5YmVJZGVudGl0eToKICAgICAgYW55T2Y6CiAgICAgICAgLSAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvQ2xpZW50JwogICAgICAgIC0gJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL0lkZW50aXR5JwoKICAgICMgb25lT2YgcmVzdWx0cyBpbiBhIHR5cGUgdGhhdCBoYXMgYW4gYEFzQ2xpZW50YC9gTWVyZ2VDbGllbnRgL2BGcm9tQ2xpZW50YCBhbmQgYW4gYEFzSWRlbnRpdHlgL2BNZXJnZUlkZW50aXR5YC9gRnJvbUlkZW50aXR5YCBtZXRob2Qgc28geW91IGNhbiBjaG9vc2Ugd2hpY2ggb2YgdGhlbSB5b3Ugd2FudCB0byByZXRyaWV2ZQogICAgQ2xpZW50T3JJZGVudGl0eToKICAgICAgb25lT2Y6CiAgICAgICAgLSAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvQ2xpZW50JwogICAgICAgIC0gJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL0lkZW50aXR5JwpgYGAKClRoaXMgcmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nIHR5cGVzOgoKPGRldGFpbHM+Cgo8c3VtbWFyeT5CYXNlIHR5cGVzPC9zdW1tYXJ5PgoKYGBgZ28KLy8gQ2xpZW50IGRlZmluZXMgbW9kZWwgZm9yIENsaWVudC4KdHlwZSBDbGllbnQgc3RydWN0IHsKCU5hbWUgc3RyaW5nIGBqc29uOiJuYW1lImAKfQoKLy8gSWRlbnRpdHkgZGVmaW5lcyBtb2RlbCBmb3IgSWRlbnRpdHkuCnR5cGUgSWRlbnRpdHkgc3RydWN0IHsKCUlzc3VlciBzdHJpbmcgYGpzb246Imlzc3VlciJgCn0KYGBgCgo8L2RldGFpbHM+Cgo8ZGV0YWlscz4KCjxzdW1tYXJ5Pjxjb2RlPmFsbE9mPC9jb2RlPjwvc3VtbWFyeT4KCmBgYGdvCi8vIENsaWVudFdpdGhJZCBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnRXaXRoSWQuCnR5cGUgQ2xpZW50V2l0aElkIHN0cnVjdCB7CglJZCAgIGludCAgICBganNvbjoiaWQiYAoJTmFtZSBzdHJpbmcgYGpzb246Im5hbWUiYAp9CgovLyBJZGVudGl0eVdpdGhEdXBsaWNhdGVGaWVsZCBkZWZpbmVzIG1vZGVsIGZvciBJZGVudGl0eVdpdGhEdXBsaWNhdGVGaWVsZC4KdHlwZSBJZGVudGl0eVdpdGhEdXBsaWNhdGVGaWVsZCBzdHJ1Y3QgewoJSXNzdWVyIHN0cnVjdCB7CgkJTmFtZSBzdHJpbmcgYGpzb246Im5hbWUiYAoJfSBganNvbjoiaXNzdWVyImAKfQpgYGAKCjwvZGV0YWlscz4KCjxkZXRhaWxzPgoKPHN1bW1hcnk+PGNvZGU+YW55T2Y8L2NvZGU+PC9zdW1tYXJ5PgoKYGBgZ28KaW1wb3J0ICgKCSJlbmNvZGluZy9qc29uIgoKCSJnaXRodWIuY29tL29hcGktY29kZWdlbi9ydW50aW1lIgopCgovLyBDbGllbnRBbmRNYXliZUlkZW50aXR5IGRlZmluZXMgbW9kZWwgZm9yIENsaWVudEFuZE1heWJlSWRlbnRpdHkuCnR5cGUgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSBzdHJ1Y3QgewoJdW5pb24ganNvbi5SYXdNZXNzYWdlCn0KCi8vIEFzQ2xpZW50IHJldHVybnMgdGhlIHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRBbmRNYXliZUlkZW50aXR5IGFzIGEgQ2xpZW50CmZ1bmMgKHQgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSkgQXNDbGllbnQoKSAoQ2xpZW50LCBlcnJvcikgewoJdmFyIGJvZHkgQ2xpZW50CgllcnIgOj0ganNvbi5Vbm1hcnNoYWwodC51bmlvbiwgJmJvZHkpCglyZXR1cm4gYm9keSwgZXJyCn0KCi8vIEZyb21DbGllbnQgb3ZlcndyaXRlcyBhbnkgdW5pb24gZGF0YSBpbnNpZGUgdGhlIENsaWVudEFuZE1heWJlSWRlbnRpdHkgYXMgdGhlIHByb3ZpZGVkIENsaWVudApmdW5jICh0ICpDbGllbnRBbmRNYXliZUlkZW50aXR5KSBGcm9tQ2xpZW50KHYgQ2xpZW50KSBlcnJvciB7CgliLCBlcnIgOj0ganNvbi5NYXJzaGFsKHYpCgl0LnVuaW9uID0gYgoJcmV0dXJuIGVycgp9CgovLyBNZXJnZUNsaWVudCBwZXJmb3JtcyBhIG1lcmdlIHdpdGggYW55IHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRBbmRNYXliZUlkZW50aXR5LCB1c2luZyB0aGUgcHJvdmlkZWQgQ2xpZW50CmZ1bmMgKHQgKkNsaWVudEFuZE1heWJlSWRlbnRpdHkpIE1lcmdlQ2xpZW50KHYgQ2xpZW50KSBlcnJvciB7CgliLCBlcnIgOj0ganNvbi5NYXJzaGFsKHYpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJbWVyZ2VkLCBlcnIgOj0gcnVudGltZS5KU09OTWVyZ2UodC51bmlvbiwgYikKCXQudW5pb24gPSBtZXJnZWQKCXJldHVybiBlcnIKfQoKLy8gQXNJZGVudGl0eSByZXR1cm5zIHRoZSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSBhcyBhIElkZW50aXR5CmZ1bmMgKHQgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSkgQXNJZGVudGl0eSgpIChJZGVudGl0eSwgZXJyb3IpIHsKCXZhciBib2R5IElkZW50aXR5CgllcnIgOj0ganNvbi5Vbm1hcnNoYWwodC51bmlvbiwgJmJvZHkpCglyZXR1cm4gYm9keSwgZXJyCn0KCi8vIEZyb21JZGVudGl0eSBvdmVyd3JpdGVzIGFueSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSBhcyB0aGUgcHJvdmlkZWQgSWRlbnRpdHkKZnVuYyAodCAqQ2xpZW50QW5kTWF5YmVJZGVudGl0eSkgRnJvbUlkZW50aXR5KHYgSWRlbnRpdHkpIGVycm9yIHsKCWIsIGVyciA6PSBqc29uLk1hcnNoYWwodikKCXQudW5pb24gPSBiCglyZXR1cm4gZXJyCn0KCi8vIE1lcmdlSWRlbnRpdHkgcGVyZm9ybXMgYSBtZXJnZSB3aXRoIGFueSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSwgdXNpbmcgdGhlIHByb3ZpZGVkIElkZW50aXR5CmZ1bmMgKHQgKkNsaWVudEFuZE1heWJlSWRlbnRpdHkpIE1lcmdlSWRlbnRpdHkodiBJZGVudGl0eSkgZXJyb3IgewoJYiwgZXJyIDo9IGpzb24uTWFyc2hhbCh2KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCW1lcmdlZCwgZXJyIDo9IHJ1bnRpbWUuSlNPTk1lcmdlKHQudW5pb24sIGIpCgl0LnVuaW9uID0gbWVyZ2VkCglyZXR1cm4gZXJyCn0KCmZ1bmMgKHQgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSkgTWFyc2hhbEpTT04oKSAoW11ieXRlLCBlcnJvcikgewoJYiwgZXJyIDo9IHQudW5pb24uTWFyc2hhbEpTT04oKQoJcmV0dXJuIGIsIGVycgp9CgpmdW5jICh0ICpDbGllbnRBbmRNYXliZUlkZW50aXR5KSBVbm1hcnNoYWxKU09OKGIgW11ieXRlKSBlcnJvciB7CgllcnIgOj0gdC51bmlvbi5Vbm1hcnNoYWxKU09OKGIpCglyZXR1cm4gZXJyCn0KCgpgYGAKCjwvZGV0YWlscz4KCjxkZXRhaWxzPgoKPHN1bW1hcnk+PGNvZGU+b25lT2Y8L2NvZGU+PC9zdW1tYXJ5PgoKYGBgZ28KLy8gQXNDbGllbnQgcmV0dXJucyB0aGUgdW5pb24gZGF0YSBpbnNpZGUgdGhlIENsaWVudE9ySWRlbnRpdHkgYXMgYSBDbGllbnQKZnVuYyAodCBDbGllbnRPcklkZW50aXR5KSBBc0NsaWVudCgpIChDbGllbnQsIGVycm9yKSB7Cgl2YXIgYm9keSBDbGllbnQKCWVyciA6PSBqc29uLlVubWFyc2hhbCh0LnVuaW9uLCAmYm9keSkKCXJldHVybiBib2R5LCBlcnIKfQoKLy8gRnJvbUNsaWVudCBvdmVyd3JpdGVzIGFueSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50T3JJZGVudGl0eSBhcyB0aGUgcHJvdmlkZWQgQ2xpZW50CmZ1bmMgKHQgKkNsaWVudE9ySWRlbnRpdHkpIEZyb21DbGllbnQodiBDbGllbnQpIGVycm9yIHsKCWIsIGVyciA6PSBqc29uLk1hcnNoYWwodikKCXQudW5pb24gPSBiCglyZXR1cm4gZXJyCn0KCi8vIE1lcmdlQ2xpZW50IHBlcmZvcm1zIGEgbWVyZ2Ugd2l0aCBhbnkgdW5pb24gZGF0YSBpbnNpZGUgdGhlIENsaWVudE9ySWRlbnRpdHksIHVzaW5nIHRoZSBwcm92aWRlZCBDbGllbnQKZnVuYyAodCAqQ2xpZW50T3JJZGVudGl0eSkgTWVyZ2VDbGllbnQodiBDbGllbnQpIGVycm9yIHsKCWIsIGVyciA6PSBqc29uLk1hcnNoYWwodikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCgltZXJnZWQsIGVyciA6PSBydW50aW1lLkpTT05NZXJnZSh0LnVuaW9uLCBiKQoJdC51bmlvbiA9IG1lcmdlZAoJcmV0dXJuIGVycgp9CgovLyBBc0lkZW50aXR5IHJldHVybnMgdGhlIHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRPcklkZW50aXR5IGFzIGEgSWRlbnRpdHkKZnVuYyAodCBDbGllbnRPcklkZW50aXR5KSBBc0lkZW50aXR5KCkgKElkZW50aXR5LCBlcnJvcikgewoJdmFyIGJvZHkgSWRlbnRpdHkKCWVyciA6PSBqc29uLlVubWFyc2hhbCh0LnVuaW9uLCAmYm9keSkKCXJldHVybiBib2R5LCBlcnIKfQoKLy8gRnJvbUlkZW50aXR5IG92ZXJ3cml0ZXMgYW55IHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRPcklkZW50aXR5IGFzIHRoZSBwcm92aWRlZCBJZGVudGl0eQpmdW5jICh0ICpDbGllbnRPcklkZW50aXR5KSBGcm9tSWRlbnRpdHkodiBJZGVudGl0eSkgZXJyb3IgewoJYiwgZXJyIDo9IGpzb24uTWFyc2hhbCh2KQoJdC51bmlvbiA9IGIKCXJldHVybiBlcnIKfQoKLy8gTWVyZ2VJZGVudGl0eSBwZXJmb3JtcyBhIG1lcmdlIHdpdGggYW55IHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRPcklkZW50aXR5LCB1c2luZyB0aGUgcHJvdmlkZWQgSWRlbnRpdHkKZnVuYyAodCAqQ2xpZW50T3JJZGVudGl0eSkgTWVyZ2VJZGVudGl0eSh2IElkZW50aXR5KSBlcnJvciB7CgliLCBlcnIgOj0ganNvbi5NYXJzaGFsKHYpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJbWVyZ2VkLCBlcnIgOj0gcnVudGltZS5KU09OTWVyZ2UodC51bmlvbiwgYikKCXQudW5pb24gPSBtZXJnZWQKCXJldHVybiBlcnIKfQoKZnVuYyAodCBDbGllbnRPcklkZW50aXR5KSBNYXJzaGFsSlNPTigpIChbXWJ5dGUsIGVycm9yKSB7CgliLCBlcnIgOj0gdC51bmlvbi5NYXJzaGFsSlNPTigpCglyZXR1cm4gYiwgZXJyCn0KCmZ1bmMgKHQgKkNsaWVudE9ySWRlbnRpdHkpIFVubWFyc2hhbEpTT04oYiBbXWJ5dGUpIGVycm9yIHsKCWVyciA6PSB0LnVuaW9uLlVubWFyc2hhbEpTT04oYikKCXJldHVybiBlcnIKfQpgYGAKCjwvZGV0YWlscz4KCkZvciBtb3JlIGluZm8sIGNoZWNrIG91dCBbdGhlIGV4YW1wbGUgY29kZV0oZXhhbXBsZXMvYW55b2YtYWxsb2Ytb25lb2YvKS4KCiMjIyBIb3cgY2FuIEkgaWdub3JlIHBhcnRzIG9mIHRoZSBzcGVjIEkgZG9uJ3QgY2FyZSBhYm91dD8KCkJ5IGRlZmF1bHQsIGBvYXBpLWNvZGVnZW5gIHdpbGwgZ2VuZXJhdGUgZXZlcnl0aGluZyBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgoKSWYgeW91J2QgbGlrZSB0byByZWR1Y2Ugd2hhdCdzIGdlbmVyYXRlZCwgeW91IGNhbiB1c2Ugb25lIG9mIGEgZmV3IG9wdGlvbnMgaW4gW3RoZSBjb25maWd1cmF0aW9uIGZpbGVdKCN1c2FnZSkgdG8gdHVuZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgcmVzdWx0aW5nIG91dHB1dDoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogJHNjaGVtYT1odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9IRUFEL2NvbmZpZ3VyYXRpb24tc2NoZW1hLmpzb24Kb3V0cHV0LW9wdGlvbnM6CiAgaW5jbHVkZS10YWdzOiBbXQogIGV4Y2x1ZGUtdGFnczogW10KICBpbmNsdWRlLW9wZXJhdGlvbi1pZHM6IFtdCiAgZXhjbHVkZS1vcGVyYXRpb24taWRzOiBbXQogIGV4Y2x1ZGUtc2NoZW1hczogW10KYGBgCgpDaGVjayBbdGhlIGRvY3NdKGh0dHBzOi8vcGtnLmdvLmRldi9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvcGtnL2NvZGVnZW4jT3V0cHV0T3B0aW9ucykgZm9yIG1vcmUgZGV0YWlscyBvZiB1c2FnZS4KCiMjIyBTaG91bGQgSSBjb21taXQgdGhlIGdlbmVyYXRlZCBjb2RlPwoKV2UgcmVjb21tZW5kIGRvaW5nIHNvLCB5ZXMsIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbnM6CgotIEl0IG1lYW5zIGl0J3MgZWFzaWVyIHRvIHZpZXcgdGhlIGltcGFjdCBvZiBhIGNoYW5nZSAtIGJlIGl0IGR1ZSB0byBhbiB1cGdyYWRlIG9mIGBvYXBpLWNvZGVnZW5gLCBvciBhIGNoYW5nZSB0byB5b3VyIHNwZWMgLSBhbmQgaGFzIGhlbHBlZCBjYXRjaCAocG9zc2libHkpIGJyZWFraW5nIGNoYW5nZXMgaW4gdGhlIHBhc3QgbW9yZSBlYXNpbHkKLSBJdCB0aGVuIGFsbG93cyB5b3VyIGNvZGViYXNlIHRvIGJlIGNvbnN1bWVkIGFzIGEgbGlicmFyeSwgYXMgYWxsIHRoZSBmaWxlcyBhcmUgY29tbWl0dGVkCgpUaGlzIG1lYW5zIHlvdSdsbCBuZWVkIHRvIGhhdmUgeW91ciBDSS9DRCBwaXBlbGluZSB2YWxpZGF0ZSB0aGF0IGdlbmVyYXRlZCBmaWxlcyBhcmUgYWxsIHVwLXRvLWRhdGUsIGJ1dCB0aGF0J3MgYSBmYWlybHkgc3RyYWlnaHRmb3J3YXJkIHBpZWNlIG9mIHdvcmsuCgojIyMgU2hvdWxkIEkgbGludCB0aGUgZ2VuZXJhdGVkIGNvZGU/CgpXZSByZWFsbHkgYXNrIHRoYXQgeW91IGRvbid0LiBBbHRob3VnaCBpdCBpbnRlbmRzIHRvIGJlIGlkaW9tYXRpYyBHbyBjb2RlLCBpdCdzIG5vdCBleHBlY3RlZCB0byBwYXNzIGFsbCB0aGUgdmFyaW91cyBsaW50aW5nIHJ1bGVzIHRoYXQgeW91ciBwcm9qZWN0IG1heSBhcHBseS4KCj4gWyFOT1RFXQo+IFdlIHdpbGwsIG9uIG9jY2FzaW9uLCBpbXByb3ZlIHRoZSBnZW5lcmF0ZWQgY29kZSB0byBmaXggc29tZSBsaW50aW5nIHdhcm5pbmdzLCBzdWNoIGFzIHRob3NlIGZyb20gYGdvIHZldGAsIGJ1dCB0aGlzIHNob3VsZCBub3QgYmUgYW4gZXhwZWN0ZWQgY2hhbmdlLgoKIyMjIEkndmUganVzdCB1cGRhdGVkIG15IHZlcnNpb24gb2YgYGtpbi1vcGVuYXBpYCwgYW5kIG5vdyBJIGNhbid0IGJ1aWxkIG15IGNvZGUg8J+YoAoKVGhlIFtraW4tb3BlbmFwaV0oaHR0cHM6Ly9naXRodWIuY29tL2dldGtpbi9raW4tb3BlbmFwaSkgcHJvamVjdCAtIHdoaWNoIHdlIPCfkpwgZm9yIHByb3ZpZGluZyBhIGdyZWF0IGxpYnJhcnkgYW5kIHNldCBvZiB0b29saW5nIGZvciBpbnRlcmFjdGluZyB3aXRoIE9wZW5BUEkgLSBpcyBhIHByZS12MSByZWxlYXNlLCB3aGljaCBtZWFucyB0aGF0IHRoZXkncmUgd2l0aGluIHRoZWlyIHJpZ2h0cyB0byBwdXNoIGJyZWFraW5nIGNoYW5nZXMuCgpUaGlzIG1heSBsZWFkIHRvIGJyZWFrYWdlIGluIHlvdXIgY29uc3VtaW5nIGNvZGUsIGFuZCBpZiBzbywgc29ycnkgdGhhdCdzIGhhcHBlbmVkIQoKV2UnbGwgYmUgYXdhcmUgb2YgdGhlIGlzc3VlLCBhbmQgd2lsbCB3b3JrIHRvIHVwZGF0ZSBib3RoIHRoZSBjb3JlIGBvYXBpLWNvZGVnZW5gIGFuZCB0aGUgbWlkZGxld2FyZXMgYWNjb3JkaW5nbHkuCgojIyBTcG9uc29ycwoKRm9yIHRoZSBtb3N0IHBhcnQsIGBvYXBpLWNvZGVnZW5gIGlzIG1haW50YWluZWQgaW4gdHdvIGJ1c3kgcGVvcGxlcycgZnJlZSB0aW1lLiBBcyBub3RlZCBpbiBbQ3JlYXRpbmcgYSBtb3JlIHN1c3RhaW5hYmxlIG1vZGVsIGZvciBgb2FwaS1jb2RlZ2VuYCBpbiB0aGUgZnV0dXJlXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9kaXNjdXNzaW9ucy8xNjA2KSwgd2UncmUgbG9va2luZyB0byBtYWtlIHRoaXMgYSBtb3JlIHN1c3RhaW5hYmxlIHByb2plY3QgaW4gdGhlIGZ1dHVyZS4KCldlJ3JlIHZlcnkgYXBwcmVjaWF0aXZlIG9mIFt0aGUgbWFueSBjb250cmlidXRvcnMgb3ZlciB0aGUgeWVhcnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL2dyYXBocy9jb250cmlidXRvcnMpIGFuZCB0aGUgb25nb2luZyB1c2Ugb2YgdGhlIHByb2plY3Qg8J+SnAoKUGxlYXNlIGNvbnNpZGVyIHNwb25zb3JpbmcgdXMgdGhyb3VnaCBHaXRIdWIgU3BvbnNvcnMgZWl0aGVyIFtvbiB0aGUgb3JnYW5pc2F0aW9uXShodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvb2FwaS1jb2RlZ2VuLykgb3IgW2RpcmVjdGx5IGZvciBKYW1pZV0oaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL2phbWlldGFubmEvKSwgd2hpY2ggaGVscHMgd29yayB0b3dhcmRzIHVzIGJlaW5nIGFibGUgdG8gbWFpbnRhaW4gdGhlIHByb2plY3QgbG9uZyB0ZXJtLgoKU2VlIFt0aGlzIGJsb2cgcG9zdCBmcm9tIFRpZGVsaWZ0XShodHRwczovL2Jsb2cudGlkZWxpZnQuY29tL3BheWluZy1tYWludGFpbmVycy10aGUtaG93dG8pIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIHRhbGsgdG8geW91ciBjb21wYW55IGFib3V0IHNwb25zb3JpbmcgbWFpbnRhaW5lcnMgb2YgKE9wZW4gU291cmNlKSBwcm9qZWN0cyB5b3UgZGVwZW5kIG9uLgoKV2UgYXJlIGN1cnJlbnRseSBzcG9uc29yZWQgZm9yIDQgaG91cnMgb2Ygd29yayBhIG1vbnRoIGJ5IEVsYXN0aWM6Cgo8cCBhbGlnbj0iY2VudGVyIj4KCTxhIGhyZWY9Imh0dHBzOi8vZWxhc3RpYy5jbz91dG1fc291cmNlPW9hcGktY29kZWdlbityZXBvJnV0bV9tZWRpdW09Z2l0aHViK3Nwb25zb3JzaGlwIj4KCQk8cGljdHVyZT4KCQkgIDxzb3VyY2UgbWVkaWE9IihwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIiBzcmNzZXQ9Ii5naXRodWIvc3BvbnNvcnMvZWxhc3RpYy1saWdodC5zdmciPgoJCSAgPHNvdXJjZSBtZWRpYT0iKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIgc3Jjc2V0PSIuZ2l0aHViL3Nwb25zb3JzL2VsYXN0aWMtZGFyay5zdmciPgoJCSAgPGltZyBhbHQ9IkVsYXN0aWMgbG9nbyIgc3JjPSIuZ2l0aHViL3Nwb25zb3JzL2VsYXN0aWMtZGFyay5zdmciIGhlaWdodD0iMTAwcHgiPgoJCTwvcGljdHVyZT4KCTwvYT4KPC9wPgoKSW4gYWRkaXRpb24sIHdlIGFyZSBhbHNvIGdlbmVyb3VzbHkgc3BvbnNvcmVkIGJ5IHRoZSBmb2xsb3dpbmcgZm9sa3MsIGVhY2ggb2Ygd2hvbSBwcm92aWRlIHNwb25zb3JzaGlwIGZvciAxIGhvdXIgb2Ygd29yayBhIG1vbnRoOgoKPHAgYWxpZ249ImNlbnRlciI+Cgk8YSBocmVmPSJodHRwczovL3d3dy5kZXZ6ZXJvLmlvL2xwL2Rldi1lbnZpcm9ubWVudD91dG1fY2FtcGFpZ249Z2l0aHViJnV0bV9zb3VyY2U9b2FwaS1jb2RlZ2VuJTIwcmVwbyZ1dG1fbWVkaXVtPWdpdGh1YiUyMHNwb25zb3JzaGlwIj4KCQk8cGljdHVyZT4KCQkgIDxzb3VyY2UgbWVkaWE9IihwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIiBzcmNzZXQ9Ii5naXRodWIvc3BvbnNvcnMvZGV2emVyby1saWdodC5zdmciPgoJCSAgPHNvdXJjZSBtZWRpYT0iKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIgc3Jjc2V0PSIuZ2l0aHViL3Nwb25zb3JzL2Rldnplcm8tZGFyay5zdmciPgoJCSAgPGltZyBhbHQ9IkRldlplcm8gbG9nbyIgc3JjPSIuZ2l0aHViL3Nwb25zb3JzL2Rldnplcm8tZGFyay5zdmciIGhlaWdodD0iMTAwcHgiPgoJCTwvcGljdHVyZT4KCTwvYT4KPC9wPgoKPHAgYWxpZ249ImNlbnRlciI+Cgk8YSBocmVmPSJodHRwczovL3NwZWFrZWFzeS5jb20/dXRtX3NvdXJjZT1vYXBpLWNvZGVnZW4rcmVwbyZ1dG1fbWVkaXVtPWdpdGh1YitzcG9uc29yc2hpcCI+CgkJPHBpY3R1cmU+CgkJICA8c291cmNlIG1lZGlhPSIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSIgc3Jjc2V0PSIuZ2l0aHViL3Nwb25zb3JzL3NwZWFrZWFzeS1saWdodC5zdmciPgoJCSAgPHNvdXJjZSBtZWRpYT0iKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIgc3Jjc2V0PSIuZ2l0aHViL3Nwb25zb3JzL3NwZWFrZWFzeS1kYXJrLnN2ZyI+CgkJICA8aW1nIGFsdD0iU3BlYWtlYXN5IGxvZ28iIHNyYz0iLmdpdGh1Yi9zcG9uc29ycy9zcGVha2Vhc3ktZGFyay5zdmciIGhlaWdodD0iMTAwcHgiPgoJCTwvcGljdHVyZT4KCTwvYT4KPC9wPgoKPHAgYWxpZ249ImNlbnRlciI+Cgk8YSBocmVmPSJodHRwczovL2N5Ym96dS5jby5qcC8/dXRtX3NvdXJjZT1vYXBpLWNvZGVnZW4rcmVwbyZ1dG1fbWVkaXVtPWdpdGh1YitzcG9uc29yc2hpcCI+CgkJPGltZyBhbHQ9IkN5Ym96dSBsb2dvIiBzcmM9Ii5naXRodWIvc3BvbnNvcnMvY3lib3p1LnN2ZyIgaGVpZ2h0PSIxMDBweCI+Cgk8L2E+CjwvcD4KCihOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIGFwcGVhcmFuY2UgdGhlIG9yZGVyIGluIHdoaWNoIHNwb25zb3JzaGlwIHdhcyByZWNlaXZlZCkK
- readmeEtag: '"89db9d7eb438ae3f7c7c2e6013136abcba2b20b9"'
- readmeLastModified: Sat, 28 Sep 2024 10:37:40 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+CgpCeSBkZWZhdWx0LCBgb2FwaS1jb2RlZ2VuYCB3aWxsIHBlcmZvcm0gY2FtZWwtY2FzZSBjb252ZXJzaW9uLCBzbyBmb3IgYSBzcGVjIHN1Y2ggYXM6CgpgYGB5YW1sCm9wZW5hcGk6ICIzLjAuMCIKaW5mbzoKICB2ZXJzaW9uOiAxLjAuMAogIHRpdGxlOiBFeGFtcGxlIGNvZGUgZm9yIHRoZSBgbmFtZS1ub3JtYWxpemVyYCBvdXRwdXQgb3B0aW9uCnBhdGhzOgogIC9hcGkvcGV0cy97cGV0SWR9OgogICAgZ2V0OgogICAgICBzdW1tYXJ5OiBHZXQgcGV0IGdpdmVuIGlkZW50aWZpZXIuCiAgICAgIG9wZXJhdGlvbklkOiBnZXRIdHRwUGV0CiAgICAgIHBhcmFtZXRlcnM6CiAgICAgIC0gbmFtZTogcGV0SWQKICAgICAgICBpbjogcGF0aAogICAgICAgIHJlcXVpcmVkOiB0cnVlCiAgICAgICAgc2NoZW1hOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgIHJlc3BvbnNlczoKICAgICAgICAnMjAwJzoKICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWxpZCBwZXQKICAgICAgICAgIGNvbnRlbnQ6CiAgICAgICAgICAgIGFwcGxpY2F0aW9uL2pzb246CiAgICAgICAgICAgICAgc2NoZW1hOgogICAgICAgICAgICAgICAgJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL1BldCcKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgUGV0OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSB1dWlkCiAgICAgICAgLSBuYW1lCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgdXVpZDoKICAgICAgICAgIHR5cGU6IHN0cmluZwogICAgICAgICAgZGVzY3JpcHRpb246IFRoZSBwZXQgdXVpZC4KICAgICAgICBuYW1lOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBkZXNjcmlwdGlvbjogVGhlIG5hbWUgb2YgdGhlIHBldC4KICAgIEVycm9yOgogICAgICByZXF1aXJlZDoKICAgICAgICAtIGNvZGUKICAgICAgICAtIG1lc3NhZ2UKICAgICAgcHJvcGVydGllczoKICAgICAgICBjb2RlOgogICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgICAgZm9ybWF0OiBpbnQzMgogICAgICAgICAgZGVzY3JpcHRpb246IEVycm9yIGNvZGUKICAgICAgICBtZXNzYWdlOgogICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICBkZXNjcmlwdGlvbjogRXJyb3IgbWVzc2FnZQogICAgT25lT2YydGhpbmdzOgogICAgICBkZXNjcmlwdGlvbjogIk5vdGljZSB0aGF0IHRoZSBgdGhpbmdzYCBpcyBub3QgY2FwaXRhbGlzZWQiCiAgICAgIG9uZU9mOgogICAgICAgIC0gdHlwZTogb2JqZWN0CiAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgLSBpZAogICAgICAgICAgcHJvcGVydGllczoKICAgICAgICAgICAgaWQ6CiAgICAgICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgIC0gdHlwZTogb2JqZWN0CiAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgLSBpZAogICAgICAgICAgcHJvcGVydGllczoKICAgICAgICAgICAgaWQ6CiAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCiAgICAgICAgICAgICAgZm9ybWF0OiB1dWlkCmBgYAoKVGhpcyB3aWxsIHByb2R1Y2U6CgpgYGBnbwovLyBPbmVPZjJ0aGluZ3MgTm90aWNlIHRoYXQgdGhlIGB0aGluZ3NgIGlzIG5vdCBjYXBpdGFsaXNlZAp0eXBlIE9uZU9mMnRoaW5ncyBzdHJ1Y3QgewoJdW5pb24ganNvbi5SYXdNZXNzYWdlCn0KCi8vIFBldCBkZWZpbmVzIG1vZGVsIGZvciBQZXQuCnR5cGUgUGV0IHN0cnVjdCB7CgkvLyBOYW1lIFRoZSBuYW1lIG9mIHRoZSBwZXQuCglOYW1lIHN0cmluZyBganNvbjoibmFtZSJgCgoJLy8gVVVJRCBUaGUgcGV0IHV1aWQuCglVVUlEIHN0cmluZyBganNvbjoidXVpZCJgCn0KCi8vIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGNsaWVudCBhYm92ZS4KdHlwZSBDbGllbnRJbnRlcmZhY2UgaW50ZXJmYWNlIHsKCS8vIEdldEhUVFBQZXQgcmVxdWVzdAoJR2V0SFRUUFBldChjdHggY29udGV4dC5Db250ZXh0LCBwZXRJRCBzdHJpbmcsIHJlcUVkaXRvcnMgLi4uUmVxdWVzdEVkaXRvckZuKSAoKmh0dHAuUmVzcG9uc2UsIGVycm9yKQp9CmBgYAoKPC9kZXRhaWxzPgoKCkZvciBtb3JlIGRldGFpbHMgb2Ygd2hhdCB0aGUgcmVzdWx0aW5nIGNvZGUgbG9va3MgbGlrZSwgY2hlY2sgb3V0IFt0aGUgdGVzdCBjYXNlc10oaW50ZXJuYWwvdGVzdC9vdXRwdXRvcHRpb25zL25hbWUtbm9ybWFsaXplci8pLgoKIyMgRXhhbXBsZXMKClRoZSBbZXhhbXBsZXMgZGlyZWN0b3J5XShleGFtcGxlcykgY29udGFpbnMgc29tZSBhZGRpdGlvbmFsIGNhc2VzIHdoaWNoIGFyZSB1c2VmdWwgZXhhbXBsZXMgZm9yIGhvdyB0byB1c2UgYG9hcGktY29kZWdlbmAsIGluY2x1ZGluZyBob3cgeW91J2QgdGFrZSB0aGUgUGV0c3RvcmUgQVBJIGFuZCBpbXBsZW1lbnQgaXQgd2l0aCBgb2FwaS1jb2RlZ2VuYC4KCllvdSBjb3VsZCBhbHNvIGZpbmQgc29tZSBjYXNlcyBvZiBob3cgdGhlIHByb2plY3QgY2FuIGJlIHVzZWQgYnkgY2hlY2tpbmcgb3V0IG91ciBbaW50ZXJuYWwgdGVzdCBjYXNlc10oaW50ZXJuYWwvdGVzdCkgd2hpY2ggYXJlIHJlYWwtd29ybGQgdXNhZ2VzIHRoYXQgbWFrZSB1cCBvdXIgcmVncmVzc2lvbiB0ZXN0cy4KCiMjIyBCbG9nIHBvc3RzCgpXZSBsb3ZlIHJlYWRpbmcgcG9zdHMgYnkgdGhlIGNvbW11bml0eSBhYm91dCBob3cgdG8gdXNlIHRoZSBwcm9qZWN0LgoKSGVyZSBhcmUgYSBmZXcgd2UndmUgZm91bmQgYXJvdW5kIHRoZSBXZWI6CgotIFtCdWlsZGluZyBhIEdvIFJFU1RmdWwgQVBJIHdpdGggZGVzaWduLWZpcnN0IE9wZW5BUEkgY29udHJhY3RzXShodHRwczovL3d3dy5qdnQubWUvcG9zdHMvMjAyMi8wNy8xMi9nby1vcGVuYXBpLXNlcnZlci8pCi0gW0EgUHJhY3RpY2FsIEd1aWRlIHRvIFVzaW5nIG9hcGktY29kZWdlbiBpbiBHb2xhbmcgQVBJIERldmVsb3BtZW50IHdpdGggdGhlIEZpYmVyIEZyYW1ld29ya10oaHR0cHM6Ly9tZWRpdW0uY29tL0BmaWtpaGFsYW4vYS1wcmFjdGljYWwtZ3VpZGUtdG8tdXNpbmctb2FwaS1jb2RlZ2VuLWluLWdvbGFuZy1hcGktZGV2ZWxvcG1lbnQtd2l0aC10aGUtZmliZXItZnJhbWV3b3JrLWJjZTJhNTkzODBhZSkKLSBbR2VuZXJhdGluZyBHbyBzZXJ2ZXIgY29kZSBmcm9tIE9wZW5BUEkgMyBkZWZpbml0aW9uc10oaHR0cHM6Ly9sZGVqLm5sL3Bvc3QvZ2VuZXJhdGluZy1nby1mcm9tLW9wZW5hcGktMy8pCi0gW0dvIENsaWVudCBDb2RlIEdlbmVyYXRpb24gZnJvbSBTd2FnZ2VyIGFuZCBPcGVuQVBJXShodHRwczovL21lZGl1bS5jb20vQGt5b2RvLXRlY2gvZ28tY2xpZW50LWNvZGUtZ2VuZXJhdGlvbi1mcm9tLXN3YWdnZXItYW5kLW9wZW5hcGktYTA1NzY4MzE4MzZjKQotIFtHbyBvYXBpLWNvZGVnZW4gKyByZXF1ZXN0IHZhbGlkYXRpb25dKGh0dHBzOi8vYmxvZy5jb21taXRzbWFydC5jb20vZ28tb2FwaS1jb2RlZ2VuLXJlcXVlc3QtdmFsaWRhdGlvbi0yODUzOThiMzdkYzgpCgpHb3Qgb25lIHRvIGFkZD8gUGxlYXNlIHJhaXNlIGEgUFIhCgojIyBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyAoRkFRcykKCiMjIyBIb3cgZG9lcyBgb2FwaS1jb2RlZ2VuYCBoYW5kbGUgYGFueU9mYCwgYGFsbE9mYCBhbmQgYG9uZU9mYD8KCmBvYXBpLWNvZGVnZW5gIHN1cHBvcnRzIGBhbnlPZmAsIGBhbGxPZmAgYW5kIGBvbmVPZmAgZm9yIGdlbmVyYXRlZCBjb2RlLgoKRm9yIGluc3RhbmNlLCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgT3BlbkFQSSBzcGVjOgoKYGBgeWFtbApvcGVuYXBpOiAiMy4wLjAiCmluZm86CiAgdmVyc2lvbjogMS4wLjAKICB0aXRsZTogVXNpbmcgY29tcGxleCBzY2hlbWFzCiAgZGVzY3JpcHRpb246IEFuIGV4YW1wbGUgb2YgYGFueU9mYCwgYGFsbE9mYCBhbmQgYG9uZU9mYApjb21wb25lbnRzOgogIHNjaGVtYXM6CiAgICAjIGJhc2UgdHlwZXMKICAgIENsaWVudDoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIHJlcXVpcmVkOgogICAgICAgIC0gbmFtZQogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIG5hbWU6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgIElkZW50aXR5OgogICAgICB0eXBlOiBvYmplY3QKICAgICAgcmVxdWlyZWQ6CiAgICAgICAgLSBpc3N1ZXIKICAgICAgcHJvcGVydGllczoKICAgICAgICBpc3N1ZXI6CiAgICAgICAgICB0eXBlOiBzdHJpbmcKCiAgICAjIGFsbE9mIHBlcmZvcm1zIGEgdW5pb24gb2YgYWxsIHR5cGVzIGRlZmluZWQKICAgIENsaWVudFdpdGhJZDoKICAgICAgYWxsT2Y6CiAgICAgICAgLSAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvQ2xpZW50JwogICAgICAgIC0gcHJvcGVydGllczoKICAgICAgICAgICAgaWQ6CiAgICAgICAgICAgICAgdHlwZTogaW50ZWdlcgogICAgICAgICAgcmVxdWlyZWQ6CiAgICAgICAgICAgIC0gaWQKCiAgICAjIGFsbE9mIHBlcmZvcm1zIGEgdW5pb24gb2YgYWxsIHR5cGVzIGRlZmluZWQsIGJ1dCBpZiB0aGVyZSdzIGEgZHVwbGljYXRlIGZpZWxkIGRlZmluZWQsIGl0J2xsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBsYXN0IHNjaGVtYQogICAgIyBodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9pc3N1ZXMvMTU2OQogICAgSWRlbnRpdHlXaXRoRHVwbGljYXRlRmllbGQ6CiAgICAgIGFsbE9mOgogICAgICAgICMgYGlzc3VlcmAgd2lsbCBiZSBpZ25vcmVkCiAgICAgICAgLSAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvSWRlbnRpdHknCiAgICAgICAgIyBgaXNzdWVyYCB3aWxsIGJlIGlnbm9yZWQKICAgICAgICAtIHByb3BlcnRpZXM6CiAgICAgICAgICAgIGlzc3VlcjoKICAgICAgICAgICAgICB0eXBlOiBpbnRlZ2VyCiAgICAgICAgIyBgaXNzdWVyYCB3aWxsIHRha2UgcHJlY2VkZW5jZQogICAgICAgIC0gcHJvcGVydGllczoKICAgICAgICAgICAgaXNzdWVyOgogICAgICAgICAgICAgIHR5cGU6IG9iamVjdAogICAgICAgICAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgICAgICAgICBuYW1lOgogICAgICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcKICAgICAgICAgICAgICByZXF1aXJlZDoKICAgICAgICAgICAgICAgIC0gbmFtZQoKICAgICMgYW55T2YgcmVzdWx0cyBpbiBhIHR5cGUgdGhhdCBoYXMgYW4gYEFzQ2xpZW50YC9gTWVyZ2VDbGllbnRgL2BGcm9tQ2xpZW50YCBhbmQgYW4gYEFzSWRlbnRpdHlgL2BNZXJnZUlkZW50aXR5YC9gRnJvbUlkZW50aXR5YCBtZXRob2Qgc28geW91IGNhbiBjaG9vc2Ugd2hpY2ggb2YgdGhlbSB5b3Ugd2FudCB0byByZXRyaWV2ZQogICAgQ2xpZW50QW5kTWF5YmVJZGVudGl0eToKICAgICAgYW55T2Y6CiAgICAgICAgLSAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvQ2xpZW50JwogICAgICAgIC0gJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL0lkZW50aXR5JwoKICAgICMgb25lT2YgcmVzdWx0cyBpbiBhIHR5cGUgdGhhdCBoYXMgYW4gYEFzQ2xpZW50YC9gTWVyZ2VDbGllbnRgL2BGcm9tQ2xpZW50YCBhbmQgYW4gYEFzSWRlbnRpdHlgL2BNZXJnZUlkZW50aXR5YC9gRnJvbUlkZW50aXR5YCBtZXRob2Qgc28geW91IGNhbiBjaG9vc2Ugd2hpY2ggb2YgdGhlbSB5b3Ugd2FudCB0byByZXRyaWV2ZQogICAgQ2xpZW50T3JJZGVudGl0eToKICAgICAgb25lT2Y6CiAgICAgICAgLSAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvQ2xpZW50JwogICAgICAgIC0gJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL0lkZW50aXR5JwpgYGAKClRoaXMgcmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nIHR5cGVzOgoKPGRldGFpbHM+Cgo8c3VtbWFyeT5CYXNlIHR5cGVzPC9zdW1tYXJ5PgoKYGBgZ28KLy8gQ2xpZW50IGRlZmluZXMgbW9kZWwgZm9yIENsaWVudC4KdHlwZSBDbGllbnQgc3RydWN0IHsKCU5hbWUgc3RyaW5nIGBqc29uOiJuYW1lImAKfQoKLy8gSWRlbnRpdHkgZGVmaW5lcyBtb2RlbCBmb3IgSWRlbnRpdHkuCnR5cGUgSWRlbnRpdHkgc3RydWN0IHsKCUlzc3VlciBzdHJpbmcgYGpzb246Imlzc3VlciJgCn0KYGBgCgo8L2RldGFpbHM+Cgo8ZGV0YWlscz4KCjxzdW1tYXJ5Pjxjb2RlPmFsbE9mPC9jb2RlPjwvc3VtbWFyeT4KCmBgYGdvCi8vIENsaWVudFdpdGhJZCBkZWZpbmVzIG1vZGVsIGZvciBDbGllbnRXaXRoSWQuCnR5cGUgQ2xpZW50V2l0aElkIHN0cnVjdCB7CglJZCAgIGludCAgICBganNvbjoiaWQiYAoJTmFtZSBzdHJpbmcgYGpzb246Im5hbWUiYAp9CgovLyBJZGVudGl0eVdpdGhEdXBsaWNhdGVGaWVsZCBkZWZpbmVzIG1vZGVsIGZvciBJZGVudGl0eVdpdGhEdXBsaWNhdGVGaWVsZC4KdHlwZSBJZGVudGl0eVdpdGhEdXBsaWNhdGVGaWVsZCBzdHJ1Y3QgewoJSXNzdWVyIHN0cnVjdCB7CgkJTmFtZSBzdHJpbmcgYGpzb246Im5hbWUiYAoJfSBganNvbjoiaXNzdWVyImAKfQpgYGAKCjwvZGV0YWlscz4KCjxkZXRhaWxzPgoKPHN1bW1hcnk+PGNvZGU+YW55T2Y8L2NvZGU+PC9zdW1tYXJ5PgoKYGBgZ28KaW1wb3J0ICgKCSJlbmNvZGluZy9qc29uIgoKCSJnaXRodWIuY29tL29hcGktY29kZWdlbi9ydW50aW1lIgopCgovLyBDbGllbnRBbmRNYXliZUlkZW50aXR5IGRlZmluZXMgbW9kZWwgZm9yIENsaWVudEFuZE1heWJlSWRlbnRpdHkuCnR5cGUgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSBzdHJ1Y3QgewoJdW5pb24ganNvbi5SYXdNZXNzYWdlCn0KCi8vIEFzQ2xpZW50IHJldHVybnMgdGhlIHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRBbmRNYXliZUlkZW50aXR5IGFzIGEgQ2xpZW50CmZ1bmMgKHQgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSkgQXNDbGllbnQoKSAoQ2xpZW50LCBlcnJvcikgewoJdmFyIGJvZHkgQ2xpZW50CgllcnIgOj0ganNvbi5Vbm1hcnNoYWwodC51bmlvbiwgJmJvZHkpCglyZXR1cm4gYm9keSwgZXJyCn0KCi8vIEZyb21DbGllbnQgb3ZlcndyaXRlcyBhbnkgdW5pb24gZGF0YSBpbnNpZGUgdGhlIENsaWVudEFuZE1heWJlSWRlbnRpdHkgYXMgdGhlIHByb3ZpZGVkIENsaWVudApmdW5jICh0ICpDbGllbnRBbmRNYXliZUlkZW50aXR5KSBGcm9tQ2xpZW50KHYgQ2xpZW50KSBlcnJvciB7CgliLCBlcnIgOj0ganNvbi5NYXJzaGFsKHYpCgl0LnVuaW9uID0gYgoJcmV0dXJuIGVycgp9CgovLyBNZXJnZUNsaWVudCBwZXJmb3JtcyBhIG1lcmdlIHdpdGggYW55IHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRBbmRNYXliZUlkZW50aXR5LCB1c2luZyB0aGUgcHJvdmlkZWQgQ2xpZW50CmZ1bmMgKHQgKkNsaWVudEFuZE1heWJlSWRlbnRpdHkpIE1lcmdlQ2xpZW50KHYgQ2xpZW50KSBlcnJvciB7CgliLCBlcnIgOj0ganNvbi5NYXJzaGFsKHYpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJbWVyZ2VkLCBlcnIgOj0gcnVudGltZS5KU09OTWVyZ2UodC51bmlvbiwgYikKCXQudW5pb24gPSBtZXJnZWQKCXJldHVybiBlcnIKfQoKLy8gQXNJZGVudGl0eSByZXR1cm5zIHRoZSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSBhcyBhIElkZW50aXR5CmZ1bmMgKHQgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSkgQXNJZGVudGl0eSgpIChJZGVudGl0eSwgZXJyb3IpIHsKCXZhciBib2R5IElkZW50aXR5CgllcnIgOj0ganNvbi5Vbm1hcnNoYWwodC51bmlvbiwgJmJvZHkpCglyZXR1cm4gYm9keSwgZXJyCn0KCi8vIEZyb21JZGVudGl0eSBvdmVyd3JpdGVzIGFueSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSBhcyB0aGUgcHJvdmlkZWQgSWRlbnRpdHkKZnVuYyAodCAqQ2xpZW50QW5kTWF5YmVJZGVudGl0eSkgRnJvbUlkZW50aXR5KHYgSWRlbnRpdHkpIGVycm9yIHsKCWIsIGVyciA6PSBqc29uLk1hcnNoYWwodikKCXQudW5pb24gPSBiCglyZXR1cm4gZXJyCn0KCi8vIE1lcmdlSWRlbnRpdHkgcGVyZm9ybXMgYSBtZXJnZSB3aXRoIGFueSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSwgdXNpbmcgdGhlIHByb3ZpZGVkIElkZW50aXR5CmZ1bmMgKHQgKkNsaWVudEFuZE1heWJlSWRlbnRpdHkpIE1lcmdlSWRlbnRpdHkodiBJZGVudGl0eSkgZXJyb3IgewoJYiwgZXJyIDo9IGpzb24uTWFyc2hhbCh2KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoKCW1lcmdlZCwgZXJyIDo9IHJ1bnRpbWUuSlNPTk1lcmdlKHQudW5pb24sIGIpCgl0LnVuaW9uID0gbWVyZ2VkCglyZXR1cm4gZXJyCn0KCmZ1bmMgKHQgQ2xpZW50QW5kTWF5YmVJZGVudGl0eSkgTWFyc2hhbEpTT04oKSAoW11ieXRlLCBlcnJvcikgewoJYiwgZXJyIDo9IHQudW5pb24uTWFyc2hhbEpTT04oKQoJcmV0dXJuIGIsIGVycgp9CgpmdW5jICh0ICpDbGllbnRBbmRNYXliZUlkZW50aXR5KSBVbm1hcnNoYWxKU09OKGIgW11ieXRlKSBlcnJvciB7CgllcnIgOj0gdC51bmlvbi5Vbm1hcnNoYWxKU09OKGIpCglyZXR1cm4gZXJyCn0KCgpgYGAKCjwvZGV0YWlscz4KCjxkZXRhaWxzPgoKPHN1bW1hcnk+PGNvZGU+b25lT2Y8L2NvZGU+PC9zdW1tYXJ5PgoKYGBgZ28KLy8gQXNDbGllbnQgcmV0dXJucyB0aGUgdW5pb24gZGF0YSBpbnNpZGUgdGhlIENsaWVudE9ySWRlbnRpdHkgYXMgYSBDbGllbnQKZnVuYyAodCBDbGllbnRPcklkZW50aXR5KSBBc0NsaWVudCgpIChDbGllbnQsIGVycm9yKSB7Cgl2YXIgYm9keSBDbGllbnQKCWVyciA6PSBqc29uLlVubWFyc2hhbCh0LnVuaW9uLCAmYm9keSkKCXJldHVybiBib2R5LCBlcnIKfQoKLy8gRnJvbUNsaWVudCBvdmVyd3JpdGVzIGFueSB1bmlvbiBkYXRhIGluc2lkZSB0aGUgQ2xpZW50T3JJZGVudGl0eSBhcyB0aGUgcHJvdmlkZWQgQ2xpZW50CmZ1bmMgKHQgKkNsaWVudE9ySWRlbnRpdHkpIEZyb21DbGllbnQodiBDbGllbnQpIGVycm9yIHsKCWIsIGVyciA6PSBqc29uLk1hcnNoYWwodikKCXQudW5pb24gPSBiCglyZXR1cm4gZXJyCn0KCi8vIE1lcmdlQ2xpZW50IHBlcmZvcm1zIGEgbWVyZ2Ugd2l0aCBhbnkgdW5pb24gZGF0YSBpbnNpZGUgdGhlIENsaWVudE9ySWRlbnRpdHksIHVzaW5nIHRoZSBwcm92aWRlZCBDbGllbnQKZnVuYyAodCAqQ2xpZW50T3JJZGVudGl0eSkgTWVyZ2VDbGllbnQodiBDbGllbnQpIGVycm9yIHsKCWIsIGVyciA6PSBqc29uLk1hcnNoYWwodikKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCgltZXJnZWQsIGVyciA6PSBydW50aW1lLkpTT05NZXJnZSh0LnVuaW9uLCBiKQoJdC51bmlvbiA9IG1lcmdlZAoJcmV0dXJuIGVycgp9CgovLyBBc0lkZW50aXR5IHJldHVybnMgdGhlIHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRPcklkZW50aXR5IGFzIGEgSWRlbnRpdHkKZnVuYyAodCBDbGllbnRPcklkZW50aXR5KSBBc0lkZW50aXR5KCkgKElkZW50aXR5LCBlcnJvcikgewoJdmFyIGJvZHkgSWRlbnRpdHkKCWVyciA6PSBqc29uLlVubWFyc2hhbCh0LnVuaW9uLCAmYm9keSkKCXJldHVybiBib2R5LCBlcnIKfQoKLy8gRnJvbUlkZW50aXR5IG92ZXJ3cml0ZXMgYW55IHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRPcklkZW50aXR5IGFzIHRoZSBwcm92aWRlZCBJZGVudGl0eQpmdW5jICh0ICpDbGllbnRPcklkZW50aXR5KSBGcm9tSWRlbnRpdHkodiBJZGVudGl0eSkgZXJyb3IgewoJYiwgZXJyIDo9IGpzb24uTWFyc2hhbCh2KQoJdC51bmlvbiA9IGIKCXJldHVybiBlcnIKfQoKLy8gTWVyZ2VJZGVudGl0eSBwZXJmb3JtcyBhIG1lcmdlIHdpdGggYW55IHVuaW9uIGRhdGEgaW5zaWRlIHRoZSBDbGllbnRPcklkZW50aXR5LCB1c2luZyB0aGUgcHJvdmlkZWQgSWRlbnRpdHkKZnVuYyAodCAqQ2xpZW50T3JJZGVudGl0eSkgTWVyZ2VJZGVudGl0eSh2IElkZW50aXR5KSBlcnJvciB7CgliLCBlcnIgOj0ganNvbi5NYXJzaGFsKHYpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CgoJbWVyZ2VkLCBlcnIgOj0gcnVudGltZS5KU09OTWVyZ2UodC51bmlvbiwgYikKCXQudW5pb24gPSBtZXJnZWQKCXJldHVybiBlcnIKfQoKZnVuYyAodCBDbGllbnRPcklkZW50aXR5KSBNYXJzaGFsSlNPTigpIChbXWJ5dGUsIGVycm9yKSB7CgliLCBlcnIgOj0gdC51bmlvbi5NYXJzaGFsSlNPTigpCglyZXR1cm4gYiwgZXJyCn0KCmZ1bmMgKHQgKkNsaWVudE9ySWRlbnRpdHkpIFVubWFyc2hhbEpTT04oYiBbXWJ5dGUpIGVycm9yIHsKCWVyciA6PSB0LnVuaW9uLlVubWFyc2hhbEpTT04oYikKCXJldHVybiBlcnIKfQpgYGAKCjwvZGV0YWlscz4KCkZvciBtb3JlIGluZm8sIGNoZWNrIG91dCBbdGhlIGV4YW1wbGUgY29kZV0oZXhhbXBsZXMvYW55b2YtYWxsb2Ytb25lb2YvKS4KCiMjIyBIb3cgY2FuIEkgaWdub3JlIHBhcnRzIG9mIHRoZSBzcGVjIEkgZG9uJ3QgY2FyZSBhYm91dD8KCkJ5IGRlZmF1bHQsIGBvYXBpLWNvZGVnZW5gIHdpbGwgZ2VuZXJhdGUgZXZlcnl0aGluZyBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgoKSWYgeW91J2QgbGlrZSB0byByZWR1Y2Ugd2hhdCdzIGdlbmVyYXRlZCwgeW91IGNhbiB1c2Ugb25lIG9mIGEgZmV3IG9wdGlvbnMgaW4gW3RoZSBjb25maWd1cmF0aW9uIGZpbGVdKCN1c2FnZSkgdG8gdHVuZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgcmVzdWx0aW5nIG91dHB1dDoKCmBgYHlhbWwKIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogJHNjaGVtYT1odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9IRUFEL2NvbmZpZ3VyYXRpb24tc2NoZW1hLmpzb24Kb3V0cHV0LW9wdGlvbnM6CiAgaW5jbHVkZS10YWdzOiBbXQogIGV4Y2x1ZGUtdGFnczogW10KICBpbmNsdWRlLW9wZXJhdGlvbi1pZHM6IFtdCiAgZXhjbHVkZS1vcGVyYXRpb24taWRzOiBbXQogIGV4Y2x1ZGUtc2NoZW1hczogW10KYGBgCgpDaGVjayBbdGhlIGRvY3NdKGh0dHBzOi8vcGtnLmdvLmRldi9naXRodWIuY29tL29hcGktY29kZWdlbi9vYXBpLWNvZGVnZW4vdjIvcGtnL2NvZGVnZW4jT3V0cHV0T3B0aW9ucykgZm9yIG1vcmUgZGV0YWlscyBvZiB1c2FnZS4KCiMjIyBTaG91bGQgSSBjb21taXQgdGhlIGdlbmVyYXRlZCBjb2RlPwoKV2UgcmVjb21tZW5kIGRvaW5nIHNvLCB5ZXMsIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbnM6CgotIEl0IG1lYW5zIGl0J3MgZWFzaWVyIHRvIHZpZXcgdGhlIGltcGFjdCBvZiBhIGNoYW5nZSAtIGJlIGl0IGR1ZSB0byBhbiB1cGdyYWRlIG9mIGBvYXBpLWNvZGVnZW5gLCBvciBhIGNoYW5nZSB0byB5b3VyIHNwZWMgLSBhbmQgaGFzIGhlbHBlZCBjYXRjaCAocG9zc2libHkpIGJyZWFraW5nIGNoYW5nZXMgaW4gdGhlIHBhc3QgbW9yZSBlYXNpbHkKLSBJdCB0aGVuIGFsbG93cyB5b3VyIGNvZGViYXNlIHRvIGJlIGNvbnN1bWVkIGFzIGEgbGlicmFyeSwgYXMgYWxsIHRoZSBmaWxlcyBhcmUgY29tbWl0dGVkCgpUaGlzIG1lYW5zIHlvdSdsbCBuZWVkIHRvIGhhdmUgeW91ciBDSS9DRCBwaXBlbGluZSB2YWxpZGF0ZSB0aGF0IGdlbmVyYXRlZCBmaWxlcyBhcmUgYWxsIHVwLXRvLWRhdGUsIGJ1dCB0aGF0J3MgYSBmYWlybHkgc3RyYWlnaHRmb3J3YXJkIHBpZWNlIG9mIHdvcmsuCgojIyMgU2hvdWxkIEkgbGludCB0aGUgZ2VuZXJhdGVkIGNvZGU/CgpXZSByZWFsbHkgYXNrIHRoYXQgeW91IGRvbid0LiBBbHRob3VnaCBpdCBpbnRlbmRzIHRvIGJlIGlkaW9tYXRpYyBHbyBjb2RlLCBpdCdzIG5vdCBleHBlY3RlZCB0byBwYXNzIGFsbCB0aGUgdmFyaW91cyBsaW50aW5nIHJ1bGVzIHRoYXQgeW91ciBwcm9qZWN0IG1heSBhcHBseS4KCj4gWyFOT1RFXQo+IFdlIHdpbGwsIG9uIG9jY2FzaW9uLCBpbXByb3ZlIHRoZSBnZW5lcmF0ZWQgY29kZSB0byBmaXggc29tZSBsaW50aW5nIHdhcm5pbmdzLCBzdWNoIGFzIHRob3NlIGZyb20gYGdvIHZldGAsIGJ1dCB0aGlzIHNob3VsZCBub3QgYmUgYW4gZXhwZWN0ZWQgY2hhbmdlLgoKIyMjIEkndmUganVzdCB1cGRhdGVkIG15IHZlcnNpb24gb2YgYGtpbi1vcGVuYXBpYCwgYW5kIG5vdyBJIGNhbid0IGJ1aWxkIG15IGNvZGUg8J+YoAoKVGhlIFtraW4tb3BlbmFwaV0oaHR0cHM6Ly9naXRodWIuY29tL2dldGtpbi9raW4tb3BlbmFwaSkgcHJvamVjdCAtIHdoaWNoIHdlIPCfkpwgZm9yIHByb3ZpZGluZyBhIGdyZWF0IGxpYnJhcnkgYW5kIHNldCBvZiB0b29saW5nIGZvciBpbnRlcmFjdGluZyB3aXRoIE9wZW5BUEkgLSBpcyBhIHByZS12MSByZWxlYXNlLCB3aGljaCBtZWFucyB0aGF0IHRoZXkncmUgd2l0aGluIHRoZWlyIHJpZ2h0cyB0byBwdXNoIGJyZWFraW5nIGNoYW5nZXMuCgpUaGlzIG1heSBsZWFkIHRvIGJyZWFrYWdlIGluIHlvdXIgY29uc3VtaW5nIGNvZGUsIGFuZCBpZiBzbywgc29ycnkgdGhhdCdzIGhhcHBlbmVkIQoKV2UnbGwgYmUgYXdhcmUgb2YgdGhlIGlzc3VlLCBhbmQgd2lsbCB3b3JrIHRvIHVwZGF0ZSBib3RoIHRoZSBjb3JlIGBvYXBpLWNvZGVnZW5gIGFuZCB0aGUgbWlkZGxld2FyZXMgYWNjb3JkaW5nbHkuCgojIyBTcG9uc29ycwoKRm9yIHRoZSBtb3N0IHBhcnQsIGBvYXBpLWNvZGVnZW5gIGlzIG1haW50YWluZWQgaW4gdHdvIGJ1c3kgcGVvcGxlcycgZnJlZSB0aW1lLiBBcyBub3RlZCBpbiBbQ3JlYXRpbmcgYSBtb3JlIHN1c3RhaW5hYmxlIG1vZGVsIGZvciBgb2FwaS1jb2RlZ2VuYCBpbiB0aGUgZnV0dXJlXShodHRwczovL2dpdGh1Yi5jb20vb2FwaS1jb2RlZ2VuL29hcGktY29kZWdlbi9kaXNjdXNzaW9ucy8xNjA2KSwgd2UncmUgbG9va2luZyB0byBtYWtlIHRoaXMgYSBtb3JlIHN1c3RhaW5hYmxlIHByb2plY3QgaW4gdGhlIGZ1dHVyZS4KCldlJ3JlIHZlcnkgYXBwcmVjaWF0aXZlIG9mIFt0aGUgbWFueSBjb250cmlidXRvcnMgb3ZlciB0aGUgeWVhcnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9vYXBpLWNvZGVnZW4vb2FwaS1jb2RlZ2VuL2dyYXBocy9jb250cmlidXRvcnMpIGFuZCB0aGUgb25nb2luZyB1c2Ugb2YgdGhlIHByb2plY3Qg8J+SnAoKUGxlYXNlIGNvbnNpZGVyIHNwb25zb3JpbmcgdXMgdGhyb3VnaCBHaXRIdWIgU3BvbnNvcnMgZWl0aGVyIFtvbiB0aGUgb3JnYW5pc2F0aW9uXShodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvb2FwaS1jb2RlZ2VuLykgb3IgW2RpcmVjdGx5IGZvciBKYW1pZV0oaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL2phbWlldGFubmEvKSwgd2hpY2ggaGVscHMgd29yayB0b3dhcmRzIHVzIGJlaW5nIGFibGUgdG8gbWFpbnRhaW4gdGhlIHByb2plY3QgbG9uZyB0ZXJtLgoKU2VlIFt0aGlzIGJsb2cgcG9zdCBmcm9tIFRpZGVsaWZ0XShodHRwczovL2Jsb2cudGlkZWxpZnQuY29tL3BheWluZy1tYWludGFpbmVycy10aGUtaG93dG8pIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIHRhbGsgdG8geW91ciBjb21wYW55IGFib3V0IHNwb25zb3JpbmcgbWFpbnRhaW5lcnMgb2YgKE9wZW4gU291cmNlKSBwcm9qZWN0cyB5b3UgZGVwZW5kIG9uLgoKV2UgYXJlIGN1cnJlbnRseSBzcG9uc29yZWQgZm9yIDQgaG91cnMgb2Ygd29yayBhIG1vbnRoIGJ5IEVsYXN0aWM6Cgo8cCBhbGlnbj0iY2VudGVyIj4KCTxhIGhyZWY9Imh0dHBzOi8vZWxhc3RpYy5jbz91dG1fc291cmNlPW9hcGktY29kZWdlbityZXBvJnV0bV9tZWRpdW09Z2l0aHViK3Nwb25zb3JzaGlwIj4KCQk8cGljdHVyZT4KCQkgIDxzb3VyY2UgbWVkaWE9IihwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIiBzcmNzZXQ9Ii5naXRodWIvc3BvbnNvcnMvZWxhc3RpYy1saWdodC5zdmciPgoJCSAgPHNvdXJjZSBtZWRpYT0iKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIgc3Jjc2V0PSIuZ2l0aHViL3Nwb25zb3JzL2VsYXN0aWMtZGFyay5zdmciPgoJCSAgPGltZyBhbHQ9IkVsYXN0aWMgbG9nbyIgc3JjPSIuZ2l0aHViL3Nwb25zb3JzL2VsYXN0aWMtZGFyay5zdmciIGhlaWdodD0iMTAwcHgiPgoJCTwvcGljdHVyZT4KCTwvYT4KPC9wPgoKSW4gYWRkaXRpb24sIHdlIGFyZSBhbHNvIGdlbmVyb3VzbHkgc3BvbnNvcmVkIGJ5IHRoZSBmb2xsb3dpbmcgZm9sa3MsIGVhY2ggb2Ygd2hvbSBwcm92aWRlIHNwb25zb3JzaGlwIGZvciAxIGhvdXIgb2Ygd29yayBhIG1vbnRoOgoKPHAgYWxpZ249ImNlbnRlciI+Cgk8YSBocmVmPSJodHRwczovL3d3dy5kZXZ6ZXJvLmlvL2xwL2Rldi1lbnZpcm9ubWVudD91dG1fY2FtcGFpZ249Z2l0aHViJnV0bV9zb3VyY2U9b2FwaS1jb2RlZ2VuJTIwcmVwbyZ1dG1fbWVkaXVtPWdpdGh1YiUyMHNwb25zb3JzaGlwIj4KCQk8cGljdHVyZT4KCQkgIDxzb3VyY2UgbWVkaWE9IihwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIiBzcmNzZXQ9Ii5naXRodWIvc3BvbnNvcnMvZGV2emVyby1saWdodC5zdmciPgoJCSAgPHNvdXJjZSBtZWRpYT0iKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIgc3Jjc2V0PSIuZ2l0aHViL3Nwb25zb3JzL2Rldnplcm8tZGFyay5zdmciPgoJCSAgPGltZyBhbHQ9IkRldlplcm8gbG9nbyIgc3JjPSIuZ2l0aHViL3Nwb25zb3JzL2Rldnplcm8tZGFyay5zdmciIGhlaWdodD0iMTAwcHgiPgoJCTwvcGljdHVyZT4KCTwvYT4KPC9wPgoKPHAgYWxpZ249ImNlbnRlciI+Cgk8YSBocmVmPSJodHRwczovL3NwZWFrZWFzeS5jb20/dXRtX3NvdXJjZT1vYXBpLWNvZGVnZW4rcmVwbyZ1dG1fbWVkaXVtPWdpdGh1YitzcG9uc29yc2hpcCI+CgkJPHBpY3R1cmU+CgkJICA8c291cmNlIG1lZGlhPSIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSIgc3Jjc2V0PSIuZ2l0aHViL3Nwb25zb3JzL3NwZWFrZWFzeS1saWdodC5zdmciPgoJCSAgPHNvdXJjZSBtZWRpYT0iKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIgc3Jjc2V0PSIuZ2l0aHViL3Nwb25zb3JzL3NwZWFrZWFzeS1kYXJrLnN2ZyI+CgkJICA8aW1nIGFsdD0iU3BlYWtlYXN5IGxvZ28iIHNyYz0iLmdpdGh1Yi9zcG9uc29ycy9zcGVha2Vhc3ktZGFyay5zdmciIGhlaWdodD0iMTAwcHgiPgoJCTwvcGljdHVyZT4KCTwvYT4KPC9wPgoKPHAgYWxpZ249ImNlbnRlciI+Cgk8YSBocmVmPSJodHRwczovL2N5Ym96dS5jby5qcC8/dXRtX3NvdXJjZT1vYXBpLWNvZGVnZW4rcmVwbyZ1dG1fbWVkaXVtPWdpdGh1YitzcG9uc29yc2hpcCI+CgkJPGltZyBhbHQ9IkN5Ym96dSBsb2dvIiBzcmM9Ii5naXRodWIvc3BvbnNvcnMvY3lib3p1LnN2ZyIgaGVpZ2h0PSIxMDBweCI+Cgk8L2E+CjwvcD4KCihOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIGFwcGVhcmFuY2UgdGhlIG9yZGVyIGluIHdoaWNoIHNwb25zb3JzaGlwIHdhcyByZWNlaXZlZCkK
+ readmeEtag: '"c7b73fceb1e2e8def2abf1a6d0846b2f21d1dbf0"'
+ readmeLastModified: Mon, 30 Sep 2024 14:59:53 GMT
repositoryId: 173009358
description: Generate Go client and server boilerplate from OpenAPI 3 specifications
created: '2019-02-27T23:59:59Z'
- updated: '2024-09-30T01:57:16Z'
+ updated: '2024-09-30T14:59:59Z'
language: Go
archived: false
- stars: 6075
+ stars: 6079
watchers: 36
forks: 842
owner: oapi-codegen
logo: https://avatars.githubusercontent.com/u/142752710?v=4
license: Apache-2.0
- repoEtag: '"c0b18488dbe0d8105c43a9f85087b1d0456a5891c89455a5144deb19cc4aa6ab"'
- repoLastModified: Mon, 30 Sep 2024 01:57:16 GMT
+ repoEtag: '"dec8fb5bfb2c0d67d3096c6cab9c47884fdb6e7444d887544080bd48d8ce500a"'
+ repoLastModified: Mon, 30 Sep 2024 14:59: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-09-30T02:49:13Z'
+ updated: '2024-09-30T17:51:04Z'
language: TypeScript
archived: false
- stars: 5625
+ stars: 5626
watchers: 25
- forks: 453
+ forks: 454
owner: openapi-ts
logo: https://avatars.githubusercontent.com/u/172838200?v=4
license: MIT
- repoEtag: '"0f77b7212bdfac2426814c1e24d2a49ec71a2395172e7ee3a1ac324c07c436f7"'
- repoLastModified: Mon, 30 Sep 2024 02:49:13 GMT
+ repoEtag: '"fa5e4e61874eaa081fbf97606ed579ef5e49611b6054140a63a5dd60d91e6eaf"'
+ repoLastModified: Mon, 30 Sep 2024 17:51:04 GMT
foundInMaster: true
oldLocations:
- https://github.com/drwpow/openapi-typescript
@@ -7744,7 +7744,7 @@
owner: xiaoymin
logo: https://avatars.githubusercontent.com/u/7894406?v=4
license: Apache-2.0
- repoEtag: '"167429da7ee62a57f94c21cc782180c623dd230c3e1a2174894e897944d7a7fc"'
+ repoEtag: '"52de080e9fc26349d5bb49bc63dfee6365361a6da7e223409236cc1b114ba23d"'
repoLastModified: Sun, 29 Sep 2024 09:46:57 GMT
category: SDK
foundInMaster: true
@@ -7795,17 +7795,17 @@
repositoryId: 196475719
description: Library for OpenAPI 3 with spring-boot
created: '2019-07-11T23:08:20Z'
- updated: '2024-09-29T23:11:22Z'
+ updated: '2024-09-30T16:53:57Z'
language: Java
archived: false
- stars: 3256
+ stars: 3254
watchers: 44
forks: 493
owner: springdoc
logo: https://avatars.githubusercontent.com/u/52804136?v=4
license: Apache-2.0
- repoEtag: '"ae2e0ef814044037a517a41f058aeca7d15e084ef57b45602276d80ff8d8038f"'
- repoLastModified: Sun, 29 Sep 2024 23:11:22 GMT
+ repoEtag: '"b17dfcf70efcc8a35cec7e0100b7a7a1e6158bb31d1faf062994d7bfffeae7d0"'
+ repoLastModified: Mon, 30 Sep 2024 16:53:57 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-09-30T01:26:51Z'
+ updated: '2024-09-30T18:10:40Z'
language: Python
archived: false
- stars: 2693
+ stars: 2694
watchers: 23
forks: 333
owner: tiangolo
logo: https://avatars.githubusercontent.com/u/1326112?v=4
license: MIT
- repoEtag: '"e1ecb8d258ed71f25d9ceb073edea057940feda9fbf312cb14115129ff4209fb"'
- repoLastModified: Mon, 30 Sep 2024 01:26:51 GMT
+ repoEtag: '"d4c7ee274579ddd3904ffec790a86136c46c98b6ec8d367dcef275cc0103cc43"'
+ repoLastModified: Mon, 30 Sep 2024 18:10:40 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-09-26T00:03:26Z'
+ updated: '2024-09-30T16:49:12Z'
language: JavaScript
archived: false
- stars: 2619
+ stars: 2620
watchers: 97
forks: 758
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"5b88d2e613399378b2659fd725aef62cc2d47461e9ad316ba3818d363992ecce"'
- repoLastModified: Thu, 26 Sep 2024 00:03:26 GMT
+ repoEtag: '"8c9ad34937e86a5b89d637e012ccf6948bcdd1dffdbbed087ee05afee69d3e3a"'
+ repoLastModified: Mon, 30 Sep 2024 16:49:12 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-09-30T01:01:01Z'
+ updated: '2024-09-30T09:28:52Z'
language: Python
archived: false
- stars: 2332
+ stars: 2333
watchers: 12
forks: 259
owner: tfranzel
logo: https://avatars.githubusercontent.com/u/13507857?v=4
license: BSD-3-Clause
- repoEtag: '"5d6f68dbac78cae58ceb96c2f2ce77e6ea55bf4f98cf6325add607cbcf0c793c"'
- repoLastModified: Mon, 30 Sep 2024 01:01:01 GMT
+ repoEtag: '"d5f734cce5b121f1297aac6eada57706f6d80377e6d1ee3a4c3f608e9b9f3b91"'
+ repoLastModified: Mon, 30 Sep 2024 09:28:52 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-09-29T17:42:46Z'
+ updated: '2024-10-01T03:17:35Z'
language: Python
archived: false
- stars: 2283
+ stars: 2285
watchers: 19
forks: 67
owner: jcrist
logo: https://avatars.githubusercontent.com/u/2783717?v=4
license: BSD-3-Clause
- repoEtag: '"98b9b45d95de4b1f84e976f75f3fac862bd2c371a24ac3d446ea738d6d641d1d"'
- repoLastModified: Sun, 29 Sep 2024 17:42:46 GMT
+ repoEtag: '"5857d017d9fe9e9f7ab521dd21806ac59f4a17cb9e860a022cd5a66069e12a3e"'
+ repoLastModified: Tue, 01 Oct 2024 03:17:35 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -7937,17 +7937,17 @@
repositoryId: 203157084
description: Supercharge your API testing, catch bugs, and ensure compliance
created: '2019-08-19T11:13:01Z'
- updated: '2024-09-29T19:57:54Z'
+ updated: '2024-09-30T23:46:03Z'
language: Python
archived: false
- stars: 2243
+ stars: 2245
watchers: 21
forks: 157
owner: schemathesis
logo: https://avatars.githubusercontent.com/u/70383271?v=4
license: MIT
- repoEtag: '"b8d660ed5fba82fc67f4bdd69b7d2a2e3e12b3ef8bdd75bfd13ab8962595e84c"'
- repoLastModified: Sun, 29 Sep 2024 19:57:54 GMT
+ repoEtag: '"7e68ad19359e55e0bc559dff29569d07de5ab1217f9c116e87a647be0889606b"'
+ repoLastModified: Mon, 30 Sep 2024 23:46:03 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-09-30T02:34:41Z'
+ updated: '2024-09-30T17:20:05Z'
language: JavaScript
archived: false
stars: 1651
@@ -8001,8 +8001,8 @@
owner: rapi-doc
logo: https://avatars.githubusercontent.com/u/104180085?v=4
license: MIT
- repoEtag: '"002dd16980e4f70b3d1e2dc17b2b72fdd46755d0b60bd3344fe8d19d251f8ee6"'
- repoLastModified: Mon, 30 Sep 2024 02:34:41 GMT
+ repoEtag: '"675f7930d58939c94162624125f73ef2ebf6e05c76c5f78a9efe8baafe7358d5"'
+ repoLastModified: Mon, 30 Sep 2024 17:20:05 GMT
foundInMaster: true
category:
- Documentation
@@ -8023,17 +8023,17 @@
A node package wrapper for
https://github.com/OpenAPITools/openapi-generator
created: '2018-10-26T10:21:23Z'
- updated: '2024-09-29T19:01:17Z'
+ updated: '2024-09-30T21:50:20Z'
language: TypeScript
archived: false
- stars: 1425
+ stars: 1426
watchers: 18
forks: 144
owner: OpenAPITools
logo: https://avatars.githubusercontent.com/u/37325267?v=4
license: Apache-2.0
- repoEtag: '"5da74604c4c3a6e711cb98742e24c17980b1982da6be72774e6fc3043bad65b7"'
- repoLastModified: Sun, 29 Sep 2024 19:01:17 GMT
+ repoEtag: '"47abb2870be90b4ee6a237e559e97477f856ed23a549acddbf58073f7bb03ed3"'
+ repoLastModified: Mon, 30 Sep 2024 21:50:20 GMT
foundInMaster: true
category:
- Code Generators
@@ -8057,17 +8057,17 @@
repositoryId: 71986592
description: GUI / visual editor for creating and editing OpenAPI / Swagger definitions
created: '2016-10-26T09:15:55Z'
- updated: '2024-09-20T14:40:31Z'
+ updated: '2024-09-30T21:39:39Z'
language: JavaScript
archived: false
- stars: 1410
+ stars: 1411
watchers: 42
forks: 170
owner: Mermade
logo: https://avatars.githubusercontent.com/u/15950345?v=4
license: MIT
- repoEtag: '"6d4255d15ffc4313c6d70df323d4932e00485ab7c0df3cf6868f0e2bfbae9ead"'
- repoLastModified: Fri, 20 Sep 2024 14:40:31 GMT
+ repoEtag: '"00f512ecd31f0dea3f3b6d9e17980e2d595adba9d4b3d3b5fa7dc5fea1ba2b75"'
+ repoLastModified: Mon, 30 Sep 2024 21:39:39 GMT
foundInMaster: true
id: 71f1a528dc0a6366fb580d1b8c703ea8
- source: openapi3 tags
@@ -8108,17 +8108,17 @@
A pluggable API specification generator. Currently supports the OpenAPI
Specification (f.k.a. the Swagger specification)..
created: '2014-10-18T23:48:49Z'
- updated: '2024-09-28T02:43:36Z'
+ updated: '2024-09-30T19:45:28Z'
language: Python
archived: false
- stars: 1171
+ stars: 1170
watchers: 24
forks: 175
owner: marshmallow-code
logo: https://avatars.githubusercontent.com/u/10334301?v=4
license: MIT
- repoEtag: '"04cb4590220806f89255c13498ba8ab8e4bc8a4a805069bc1cbf864b97498890"'
- repoLastModified: Sat, 28 Sep 2024 02:43:36 GMT
+ repoEtag: '"63e0c63892943bd0a5721ee7849f378634409042136ac9e0acd0b53f30624150"'
+ repoLastModified: Mon, 30 Sep 2024 19:45:28 GMT
foundInMaster: true
category: Parsers
id: c1528764f05dd585ca47886dd6dabb86
@@ -8170,7 +8170,7 @@
owner: asteasolutions
logo: https://avatars.githubusercontent.com/u/5244095?v=4
license: MIT
- repoEtag: '"537c64e4f25e806b58d5dd66556935c7f9b40e2bcf9b0830bc48df1b84feca55"'
+ repoEtag: '"0d0428283f3d66b1fde5ef817334e040e6c86d16cae507b0c688e4a8c37663d8"'
repoLastModified: Mon, 30 Sep 2024 00:57:25 GMT
category: Parsers
foundInMaster: true
@@ -8212,17 +8212,17 @@
repositoryId: 113924383
description: Utility for comparing two OpenAPI specifications.
created: '2017-12-12T00:39:30Z'
- updated: '2024-09-26T08:29:50Z'
+ updated: '2024-09-30T18:05:20Z'
language: Java
archived: false
- stars: 807
- watchers: 20
+ stars: 808
+ watchers: 19
forks: 154
owner: OpenAPITools
logo: https://avatars.githubusercontent.com/u/37325267?v=4
license: Apache-2.0
- repoEtag: '"1a78c275090b39d4408b5e74b415cf86affa6e1dd278071a5d2ad43111088e37"'
- repoLastModified: Thu, 26 Sep 2024 08:29:50 GMT
+ repoEtag: '"d38f0ee657fb4faacb62929a9d952e4b70ac69416a86ac17a54b24f1cb10103f"'
+ repoLastModified: Mon, 30 Sep 2024 18:05:20 GMT
foundInMaster: true
category: Parsers
id: c128907e9d949a67c1bda0e0ceda755a
@@ -8507,7 +8507,7 @@
Query, provision and operate Cloud and SaaS resources and APIs using an
extensible SQL based framework
created: '2022-01-03T08:20:06Z'
- updated: '2024-09-27T20:56:16Z'
+ updated: '2024-09-30T20:56:18Z'
language: Go
archived: false
stars: 511
@@ -8516,8 +8516,8 @@
owner: stackql
logo: https://avatars.githubusercontent.com/u/95105302?v=4
license: MIT
- repoEtag: '"d8d2bc56dc8b218e3d89958895785304d8ce1e0294e6a2fba1de1bc1417561b4"'
- repoLastModified: Fri, 27 Sep 2024 20:56:16 GMT
+ repoEtag: '"58a1a7ee9938f257487a5b5710db05df08bd1b0dad13a87d2d9aafe2194999f8"'
+ repoLastModified: Mon, 30 Sep 2024 20:56:18 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -8562,10 +8562,10 @@
archived: false
stars: 495
watchers: 7
- forks: 78
+ forks: 79
owner: oazapfts
logo: https://avatars.githubusercontent.com/u/119607625?v=4
- repoEtag: '"a2d41c0cd92ddbaec6875d572842a856ef2c8bb537c7a0b1b456dcec4cc45488"'
+ repoEtag: '"706b2c0ffaf613b218a2c73186d849d41fd2161590b157a41b82919cd91edc36"'
repoLastModified: Wed, 25 Sep 2024 14:26:46 GMT
category: Parsers
foundInMaster: true
@@ -8830,7 +8830,7 @@
owner: dgarcia360
logo: https://avatars.githubusercontent.com/u/9107969?v=4
license: NOASSERTION
- repoEtag: '"c8f68dce72c18a7602374a038c5f70a997a16116c82a95021bb54006532914ff"'
+ repoEtag: '"103f3f7f23223c4f9c6c300623d3a8d8b7a956c0f93c1ef9e81a686c9ce46e7a"'
repoLastModified: Thu, 26 Sep 2024 13:45:56 GMT
foundInMaster: true
category:
@@ -8849,17 +8849,17 @@
repositoryId: 479982630
description: Clean Architecture Example using FastAPI framework
created: '2022-04-10T10:23:51Z'
- updated: '2024-09-26T16:49:13Z'
+ updated: '2024-09-30T07:39:21Z'
language: Python
archived: false
- stars: 372
+ stars: 373
watchers: 4
forks: 53
owner: 0xTheProDev
logo: https://avatars.githubusercontent.com/u/14367736?v=4
license: MIT
- repoEtag: '"57ac5a816688ecacefd9a0621308fac0be5c8d0fe5af984b0d5d5cb1fdf446b5"'
- repoLastModified: Thu, 26 Sep 2024 16:49:13 GMT
+ repoEtag: '"881c819a6649a5d6cfdbfb51424484ecbe832a8b3c5b6837fab41dbcf648e21d"'
+ repoLastModified: Mon, 30 Sep 2024 07:39:21 GMT
category: Server Implementations
foundInMaster: true
oldLocations:
@@ -8935,17 +8935,17 @@
repositoryId: 306110879
description: Web services with OpenAPI and JSON Schema done quick in Go
created: '2020-10-21T18:16:16Z'
- updated: '2024-09-28T16:54:26Z'
+ updated: '2024-09-30T11:51:01Z'
language: Go
archived: false
- stars: 359
+ stars: 360
watchers: 5
forks: 17
owner: swaggest
logo: https://avatars.githubusercontent.com/u/19609628?v=4
license: MIT
- repoEtag: '"c9c769bcca6a72488c65e10014d848e3cfb3ab01b339a0b9f6f61a49d7da00dd"'
- repoLastModified: Sat, 28 Sep 2024 16:54:26 GMT
+ repoEtag: '"2be3950ebf46a2ecfc79fa9ab22143749b6eb734e716b90fb570fcd516f709e6"'
+ repoLastModified: Mon, 30 Sep 2024 11:51:01 GMT
foundInMaster: true
id: ecd2fef7bb4079bda209503f9fb9820b
- source: openapi3 tags
@@ -9145,7 +9145,7 @@
owner: python-openapi
logo: https://avatars.githubusercontent.com/u/126442889?v=4
license: BSD-3-Clause
- repoEtag: '"33ca78c65d17099c0b76cbff9a7af17293b690ece9e83e190c43680ed807506b"'
+ repoEtag: '"75723be274209d48772e3de2f9af1982f865afc1dba5c7c459b882fb331e1d8d"'
repoLastModified: Sat, 21 Sep 2024 04:28:22 GMT
category:
- Data Validators
@@ -9168,17 +9168,17 @@
Esmerald framework - Highly scalable, performant, easy to learn, easy to
code and for every sizeable and complex application
created: '2022-10-18T11:50:26Z'
- updated: '2024-09-29T15:42:12Z'
+ updated: '2024-09-30T23:54:03Z'
language: Python
archived: false
- stars: 295
+ stars: 297
watchers: 8
forks: 18
owner: dymmond
logo: https://avatars.githubusercontent.com/u/65982469?v=4
license: MIT
- repoEtag: '"867e803c2e1217fc3eb0ed20829b1a5bb5e6f23565d83887e675c12771aec126"'
- repoLastModified: Sun, 29 Sep 2024 15:42:12 GMT
+ repoEtag: '"288b01cc8853c2227184219946f2bfcb34216ed8b16ad9ba29f7440271d2edd4"'
+ repoLastModified: Mon, 30 Sep 2024 23:54:03 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -9272,17 +9272,17 @@
repositoryId: 628179878
description: Use Zod Schemas to create OpenAPI v3.x documentation
created: '2023-04-15T06:28:51Z'
- updated: '2024-09-30T01:58:32Z'
+ updated: '2024-09-30T14:49:01Z'
language: TypeScript
archived: false
- stars: 256
+ stars: 257
watchers: 2
forks: 12
owner: samchungy
logo: https://avatars.githubusercontent.com/u/18017094?v=4
license: MIT
- repoEtag: '"b52da5ac78b6f7563d54cc6d03a26ee61b8b348ad94cee406b10a387a2534ad0"'
- repoLastModified: Mon, 30 Sep 2024 01:58:32 GMT
+ repoEtag: '"88f5a95b7c20a810a359eb234bb8be0a6eb1cd4c005b0baf9f2c196e32f16ea5"'
+ repoLastModified: Mon, 30 Sep 2024 14:49:01 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -9332,7 +9332,7 @@
"getting started" sections into slideshow for your workshops. Manage
multiple documentations with self-deployed znai hub.
created: '2016-12-16T16:42:12Z'
- updated: '2024-09-29T18:56:15Z'
+ updated: '2024-09-30T22:29:29Z'
language: Java
archived: false
stars: 248
@@ -9341,8 +9341,8 @@
owner: testingisdocumenting
logo: https://avatars.githubusercontent.com/u/54154955?v=4
license: Apache-2.0
- repoEtag: '"ee2d7165130b92f302b5604f28e7c3cefc572d327a92661c5058dbf76bc501c2"'
- repoLastModified: Sun, 29 Sep 2024 18:56:15 GMT
+ repoEtag: '"9440af4abd4082d824d0a082b598dc335642b3b63b4b1e736a43e9f68f21a6f5"'
+ repoLastModified: Mon, 30 Sep 2024 22:29:29 GMT
foundInMaster: true
category: Documentation
id: e96c15d0478cd8c861932cf44e659757
@@ -9618,17 +9618,17 @@
repositoryId: 107572738
description: Generates OpenAPI document from OData CSDL
created: '2017-10-19T16:39:13Z'
- updated: '2024-09-24T06:26:57Z'
+ updated: '2024-09-30T16:47:18Z'
language: C#
archived: false
- stars: 205
+ stars: 206
watchers: 30
forks: 63
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"34c31d9bb25ff941c57edaa94f05a4d372afb83de84bf4b91c355f815bbe1f5c"'
- repoLastModified: Tue, 24 Sep 2024 06:26:57 GMT
+ repoEtag: '"f7330010b0266accfd3cb1ba8752b40d65340be26f70250aa194c6d47e07d31d"'
+ repoLastModified: Mon, 30 Sep 2024 16:47:18 GMT
foundInMaster: true
category:
- Low-level Tooling
@@ -9652,11 +9652,11 @@
archived: false
stars: 203
watchers: 6
- forks: 34
+ forks: 33
owner: seriousme
logo: https://avatars.githubusercontent.com/u/3322396?v=4
license: MIT
- repoEtag: '"20bacb3b883d148b18754a311a3a257e5c2daf375d728ed2c89936f9912e824c"'
+ repoEtag: '"cd18302126bb516320635ae022829bd44cb826c5841f5c10d9ebd6e51b25a90b"'
repoLastModified: Mon, 23 Sep 2024 21:43:20 GMT
foundInMaster: true
category:
@@ -9799,17 +9799,17 @@
Autogenered docs, Zod - BullMQ - Nodemailer - Docker - MongoDB (Mongoose)
- Socket.io
created: '2024-08-11T02:19:59Z'
- updated: '2024-09-29T23:15:05Z'
+ updated: '2024-09-30T10:00:13Z'
language: TypeScript
archived: false
- stars: 194
+ stars: 195
watchers: 2
forks: 35
owner: muneebhashone
logo: https://avatars.githubusercontent.com/u/88892379?v=4
license: MIT
- repoEtag: '"0dec23daa82c9e1028d0acddd978bdc8910de8ea174cc0b16065eabb2093775d"'
- repoLastModified: Sun, 29 Sep 2024 23:15:05 GMT
+ repoEtag: '"4d6aa15892fdd7472634bcafe567a777565b979b8545603dc322c0226a925657"'
+ repoLastModified: Mon, 30 Sep 2024 10:00:13 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -9849,17 +9849,17 @@
repositoryId: 673944158
description: This repository contains the specification files for PayPal REST APIs.
created: '2023-08-02T19:26:26Z'
- updated: '2024-09-29T10:11:25Z'
+ updated: '2024-09-30T10:13:00Z'
language: null
archived: false
- stars: 191
+ stars: 192
watchers: 21
forks: 130
owner: paypal
logo: https://avatars.githubusercontent.com/u/476675?v=4
license: Apache-2.0
- repoEtag: '"bf54c93caec5461abdf7855521a83e18f39d6eb7c157ede356ae30b9cc3d9c1d"'
- repoLastModified: Sun, 29 Sep 2024 10:11:25 GMT
+ repoEtag: '"4e3811eb69d237714fac7eb955b3cd8933efa3d817a0ecd90bfbfa09e2708719"'
+ repoLastModified: Mon, 30 Sep 2024 10:13:00 GMT
category: Code Generators
foundInMaster: true
- source: openapi3 tags
@@ -9910,7 +9910,7 @@
owner: christianhelle
logo: https://avatars.githubusercontent.com/u/710400?v=4
license: MIT
- repoEtag: '"85d63b75cd76d5756d4606a61c35773f13de6b7e93ba94b42ad5b77a8805a4cd"'
+ repoEtag: '"8d37e4a054a8927177ec69e7f3f3c1e6b1f80383de96702663ebab37b9fa80cb"'
repoLastModified: Sat, 28 Sep 2024 23:08:07 GMT
category: Parsers
foundInMaster: true
@@ -9926,7 +9926,7 @@
repositoryId: 543052826
description: Speakeasy CLI - Enterprise developer experience for your API
created: '2022-09-29T10:13:15Z'
- updated: '2024-09-29T22:18:56Z'
+ updated: '2024-09-30T23:49:57Z'
language: JavaScript
archived: false
stars: 182
@@ -9935,8 +9935,8 @@
owner: speakeasy-api
logo: https://avatars.githubusercontent.com/u/91446104?v=4
license: NOASSERTION
- repoEtag: '"1be3e642829ef5c8eac4c4b2a21d0024fbc242896037fb52d4b6cb95741ddc5c"'
- repoLastModified: Sun, 29 Sep 2024 22:18:56 GMT
+ repoEtag: '"900657500744867ddbf506c85e506cf100944a6f1ea54d9fb941f71ec9999611"'
+ repoLastModified: Mon, 30 Sep 2024 23:49:57 GMT
category: Parsers
foundInMaster: true
- source:
@@ -10031,15 +10031,15 @@
id: 30d6812808d99b1b58b61c10028cb8de
repositoryMetadata:
base64Readme: >-
- WyFbQnVpbGQgc3RhdHVzXShodHRwczovL2NpLmFwcHZleW9yLmNvbS9hcGkvcHJvamVjdHMvc3RhdHVzL2diMmRvZTN0Z3dqdDQ3Y24vYnJhbmNoL21hc3Rlcj9zdmc9dHJ1ZSldKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvY2hyaXN0aWFuaGVsbGUvYXBpY2xpZW50Y29kZWdlbi9icmFuY2gvbWFzdGVyKQohW0NMSSBUb29sXShodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvYXBpY2xpZW50Y29kZWdlbi93b3JrZmxvd3MvQ0xJJTIwVG9vbC9iYWRnZS5zdmcpCiFbVlNJWF0oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL2FwaWNsaWVudGNvZGVnZW4vd29ya2Zsb3dzL1ZTSVgvYmFkZ2Uuc3ZnKQohW1ZTIE1hY10oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL2FwaWNsaWVudGNvZGVnZW4vd29ya2Zsb3dzL1ZTJTIwTWFjL2JhZGdlLnN2ZykKIVtTbW9rZSBUZXN0c10oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL2FwaWNsaWVudGNvZGVnZW4vd29ya2Zsb3dzL1Ntb2tlJTIwVGVzdHMvYmFkZ2Uuc3ZnKQoKWyFbTWFpbnRhaW5hYmlsaXR5IFJhdGluZ10oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2FwaS9wcm9qZWN0X2JhZGdlcy9tZWFzdXJlP3Byb2plY3Q9Y2hyaXN0aWFuaGVsbGVfYXBpY2xpZW50Y29kZWdlbiZtZXRyaWM9c3FhbGVfcmF0aW5nKV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2Rhc2hib2FyZD9pZD1jaHJpc3RpYW5oZWxsZV9hcGljbGllbnRjb2RlZ2VuKQpbIVtSZWxpYWJpbGl0eSBSYXRpbmddKGh0dHBzOi8vc29uYXJjbG91ZC5pby9hcGkvcHJvamVjdF9iYWRnZXMvbWVhc3VyZT9wcm9qZWN0PWNocmlzdGlhbmhlbGxlX2FwaWNsaWVudGNvZGVnZW4mbWV0cmljPXJlbGlhYmlsaXR5X3JhdGluZyldKGh0dHBzOi8vc29uYXJjbG91ZC5pby9kYXNoYm9hcmQ/aWQ9Y2hyaXN0aWFuaGVsbGVfYXBpY2xpZW50Y29kZWdlbikKWyFbU2VjdXJpdHkgUmF0aW5nXShodHRwczovL3NvbmFyY2xvdWQuaW8vYXBpL3Byb2plY3RfYmFkZ2VzL21lYXN1cmU/cHJvamVjdD1jaHJpc3RpYW5oZWxsZV9hcGljbGllbnRjb2RlZ2VuJm1ldHJpYz1zZWN1cml0eV9yYXRpbmcpXShodHRwczovL3NvbmFyY2xvdWQuaW8vZGFzaGJvYXJkP2lkPWNocmlzdGlhbmhlbGxlX2FwaWNsaWVudGNvZGVnZW4pClshW0J1Z3NdKGh0dHBzOi8vc29uYXJjbG91ZC5pby9hcGkvcHJvamVjdF9iYWRnZXMvbWVhc3VyZT9wcm9qZWN0PWNocmlzdGlhbmhlbGxlX2FwaWNsaWVudGNvZGVnZW4mbWV0cmljPWJ1Z3MpXShodHRwczovL3NvbmFyY2xvdWQuaW8vZGFzaGJvYXJkP2lkPWNocmlzdGlhbmhlbGxlX2FwaWNsaWVudGNvZGVnZW4pClshW1Z1bG5lcmFiaWxpdGllc10oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2FwaS9wcm9qZWN0X2JhZGdlcy9tZWFzdXJlP3Byb2plY3Q9Y2hyaXN0aWFuaGVsbGVfYXBpY2xpZW50Y29kZWdlbiZtZXRyaWM9dnVsbmVyYWJpbGl0aWVzKV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2Rhc2hib2FyZD9pZD1jaHJpc3RpYW5oZWxsZV9hcGljbGllbnRjb2RlZ2VuKQpbIVtDb2RlIFNtZWxsc10oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2FwaS9wcm9qZWN0X2JhZGdlcy9tZWFzdXJlP3Byb2plY3Q9Y2hyaXN0aWFuaGVsbGVfYXBpY2xpZW50Y29kZWdlbiZtZXRyaWM9Y29kZV9zbWVsbHMpXShodHRwczovL3NvbmFyY2xvdWQuaW8vc3VtbWFyeS9uZXdfY29kZT9pZD1jaHJpc3RpYW5oZWxsZV9hcGljbGllbnRjb2RlZ2VuKQpbIVtDb3ZlcmFnZV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2FwaS9wcm9qZWN0X2JhZGdlcy9tZWFzdXJlP3Byb2plY3Q9Y2hyaXN0aWFuaGVsbGVfYXBpY2xpZW50Y29kZWdlbiZtZXRyaWM9Y292ZXJhZ2UpXShodHRwczovL3NvbmFyY2xvdWQuaW8vc3VtbWFyeS9uZXdfY29kZT9pZD1jaHJpc3RpYW5oZWxsZV9hcGljbGllbnRjb2RlZ2VuKQoKWyFbVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby92aXN1YWwtc3R1ZGlvLW1hcmtldHBsYWNlL3YvQ2hyaXN0aWFuUmVzbWFIZWxsZS5BcGlDbGllbnRDb2RlR2VuZXJhdG9yMjAyMj9sYWJlbD1NYXJrZXRwbGFjZSldKGh0dHBzOi8vbWFya2V0cGxhY2UudmlzdWFsc3R1ZGlvLmNvbS9pdGVtcz9pdGVtTmFtZT1DaHJpc3RpYW5SZXNtYUhlbGxlLkFQSUNsaWVudENvZGVHZW5lcmF0b3IyMDIyKSAKWyFbRG93bmxvYWRzXShodHRwczovL2ltZy5zaGllbGRzLmlvL3Zpc3VhbC1zdHVkaW8tbWFya2V0cGxhY2UvZC9DaHJpc3RpYW5SZXNtYUhlbGxlLkFwaUNsaWVudENvZGVHZW5lcmF0b3I/bGFiZWw9VlMlMjAyMDE5KV0oaHR0cHM6Ly9tYXJrZXRwbGFjZS52aXN1YWxzdHVkaW8uY29tL2l0ZW1zP2l0ZW1OYW1lPUNocmlzdGlhblJlc21hSGVsbGUuQVBJQ2xpZW50Q29kZUdlbmVyYXRvcikKWyFbUmF0aW5nXShodHRwczovL2ltZy5zaGllbGRzLmlvL3Zpc3VhbC1zdHVkaW8tbWFya2V0cGxhY2Uvc3RhcnMvQ2hyaXN0aWFuUmVzbWFIZWxsZS5BcGlDbGllbnRDb2RlR2VuZXJhdG9yKV0oaHR0cHM6Ly9tYXJrZXRwbGFjZS52aXN1YWxzdHVkaW8uY29tL2l0ZW1zP2l0ZW1OYW1lPUNocmlzdGlhblJlc21hSGVsbGUuQVBJQ2xpZW50Q29kZUdlbmVyYXRvcikKWyFbRG93bmxvYWRzXShodHRwczovL2ltZy5zaGllbGRzLmlvL3Zpc3VhbC1zdHVkaW8tbWFya2V0cGxhY2UvZC9DaHJpc3RpYW5SZXNtYUhlbGxlLkFQSUNsaWVudENvZGVHZW5lcmF0b3IyMDIyP2xhYmVsPVZTJTIwMjAyMildKGh0dHBzOi8vbWFya2V0cGxhY2UudmlzdWFsc3R1ZGlvLmNvbS9pdGVtcz9pdGVtTmFtZT1DaHJpc3RpYW5SZXNtYUhlbGxlLkFQSUNsaWVudENvZGVHZW5lcmF0b3IyMDIyKSAKWyFbUmF0aW5nXShodHRwczovL2ltZy5zaGllbGRzLmlvL3Zpc3VhbC1zdHVkaW8tbWFya2V0cGxhY2Uvc3RhcnMvQ2hyaXN0aWFuUmVzbWFIZWxsZS5BcGlDbGllbnRDb2RlR2VuZXJhdG9yMjAyMildKGh0dHBzOi8vbWFya2V0cGxhY2UudmlzdWFsc3R1ZGlvLmNvbS9pdGVtcz9pdGVtTmFtZT1DaHJpc3RpYW5SZXNtYUhlbGxlLkFQSUNsaWVudENvZGVHZW5lcmF0b3IyMDIyKQpbIVtOdUdldF0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9udWdldC9kdC9yYXBpY2dlbi5zdmc/c3R5bGU9ZmxhdC1zcXVhcmUmbGFiZWw9bnVnZXQpXShodHRwOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9yYXBpY2dlbikKClshW2J1eW1lYWNvZmZlZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9idXklMjBtZSUyMGElMjBjb2ZmZWUtZG9uYXRlLXllbGxvdy5zdmcpXShodHRwczovL3d3dy5idXltZWFjb2ZmZWUuY29tL2NocmlzdGlhbmhlbGxlKQpbIVtKb2luIHRoZSBjaGF0IGF0IGh0dHBzOi8vZ2l0dGVyLmltL2FwaWNsaWVudGNvZGVnZW4vY29tbXVuaXR5XShodHRwczovL2JhZGdlcy5naXR0ZXIuaW0vYXBpY2xpZW50Y29kZWdlbi9jb21tdW5pdHkuc3ZnKV0oaHR0cHM6Ly9naXR0ZXIuaW0vYXBpY2xpZW50Y29kZWdlbi9jb21tdW5pdHk/dXRtX3NvdXJjZT1iYWRnZSZ1dG1fbWVkaXVtPWJhZGdlJnV0bV9jYW1wYWlnbj1wci1iYWRnZSZ1dG1fY29udGVudD1iYWRnZSkKCiMgUkVTVCBBUEkgQ2xpZW50IENvZGUgR2VuZXJhdG9yCgpBIGNvbGxlY3Rpb24gb2YgVmlzdWFsIFN0dWRpbyBDIyBjdXN0b20gdG9vbCBjb2RlIGdlbmVyYXRvcnMgZm9yIFN3YWdnZXIgLyBPcGVuQVBJIHNwZWNpZmljYXRpb24gZmlsZXMKCiMjIERvd25sb2FkCgotICoqW1Zpc3VhbCBTdHVkaW8gMjAyMl0oaHR0cHM6Ly9tYXJrZXRwbGFjZS52aXN1YWxzdHVkaW8uY29tL2l0ZW1zP2l0ZW1OYW1lPUNocmlzdGlhblJlc21hSGVsbGUuQXBpQ2xpZW50Q29kZUdlbmVyYXRvcjIwMjIpKioKLSAqKltWaXN1YWwgU3R1ZGlvIDIwMTldKGh0dHBzOi8vbWFya2V0cGxhY2UudmlzdWFsc3R1ZGlvLmNvbS9pdGVtcz9pdGVtTmFtZT1DaHJpc3RpYW5SZXNtYUhlbGxlLkFwaUNsaWVudENvZGVHZW5lcmF0b3IpKioKLSAqKltWaXN1YWwgU3R1ZGlvIDIwMTddKGh0dHBzOi8vbWFya2V0cGxhY2UudmlzdWFsc3R1ZGlvLmNvbS9pdGVtcz9pdGVtTmFtZT1DaHJpc3RpYW5SZXNtYUhlbGxlLkFwaUNsaWVudENvZGVHZW5lcmF0b3IyMDE3KSoqCi0gKipbVmlzdWFsIFN0dWRpbyBmb3IgTWFjXShodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvYXBpY2xpZW50Y29kZWdlbi9yZWxlYXNlcy9sYXRlc3QpKiouIEZvbGxvdyAqKlt0aGVzZSBpbnN0cnVjdGlvbnNdKCN2aXN1YWwtc3R1ZGlvLWZvci1tYWMpKiogZm9yIHVwZGF0ZSBjb252ZW5pZW5jZSBvbiBWaXN1YWwgU3R1ZGlvIGZvciBNYWMKCiMjIEZlYXR1cmVzCgotIFN1cHBvcnRzIFZpc3VhbCBTdHVkaW8gMjAxNywgMjAxOSwgMjAyMiwgYW5kIFtWaXN1YWwgU3R1ZGlvIGZvciBNYWNdKCN2aXN1YWwtc3R1ZGlvLWZvci1tYWMpCi0gQWRkIE5ldyBSRVNUIEFQSSBDbGllbnQgdG8gYSBwcm9qZWN0IGZyb20gYW4gT3BlbkFQSSBzcGVjaWZpY2F0aW9uIFVSTCAoZS5nIDxodHRwczovL3BldHN0b3JlLnN3YWdnZXIuaW8vdjIvc3dhZ2dlci5qc29uPikgdXNpbmcgdGhlIGZvbGxvd2luZyBjb2RlIGdlbmVyYXRvcnM6CiAgLSBbTlN3YWddKGh0dHBzOi8vZ2l0aHViLmNvbS9SaWNvU3V0ZXIvTlN3YWcpCiAgLSBbT3BlbkFQSSBHZW5lcmF0b3JdKGh0dHBzOi8vZ2l0aHViLmNvbS9PcGVuQVBJVG9vbHMvb3BlbmFwaS1nZW5lcmF0b3IpCiAgLSBbU3dhZ2dlciBDb2RlZ2VuXShodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuKQogIC0gW1JlZml0dGVyXShodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIpCiAgLSBbTWljcm9zb2Z0IEtpb3RhXShodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L2tpb3RhKQogIC0gW0F1dG9SZXN0XShodHRwczovL2dpdGh1Yi5jb20vQXp1cmUvYXV0b3Jlc3QpCi0gRGVmaW5lIGN1c3RvbSBuYW1lc3BhY2UgZm9yIHRoZSBnZW5lcmF0ZWQgZmlsZQotIEF1dG8tdXBkYXRpbmcgb2YgZ2VuZXJhdGVkIGNvZGUgZmlsZSB3aGVuIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBKU09OIG9yIFlBTUwgZmlsZQotIEdlbmVyYXRlIGNvZGUgdXNpbmcgYSBjb25maWd1cmF0aW9uIGZpbGVzIHVzaW5nIHRoZSBmb2xsb3dpbmc6CiAgLSBgLm5zd2FnYCBjb25maWd1cmF0aW9uIGZpbGVzIGZyb20gW05Td2FnU3R1ZGlvXShodHRwczovL2dpdGh1Yi5jb20vUmljb1N1dGVyL05Td2FnL3dpa2kvTlN3YWdTdHVkaW8pIGJ5IGluY2x1ZGluZyBpdCBpbiB0aGUgcHJvamVjdCBhbmQgdXNpbmcgdGhlICoqR2VuZXJhdGUgTlN3YWcgU3R1ZGlvIG91dHB1dCoqIGNvbnRleHQgbWVudQogIC0gYC5yZWZpdHRlcmAgc2V0dGluZ3MgZmlsZXMgZnJvbSBbUmVmaXR0ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlcikgYnkgaW5jbHVkaW5nIGl0IGluIHRoZSBwcm9qZWN0IGFuZCB1c2luZyB0aGUgKipHZW5lcmF0ZSBSZWZpdHRlciBvdXRwdXQqKiBjb250ZXh0IG1lbnUKICAtIGBraW90YS1sb2NrLmpzb25gIGNvbmZpZ3VyYXRpb24gZmlsZXMgZnJvbSBbTWljcm9zb2Z0IEtpb3RhXShodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L2tpb3RhKSBieSBpbmNsdWRpbmcgaXQgaW4gdGhlIHByb2plY3QgYW5kIHVzaW5nIHRoZSAqKkdlbmVyYXRlIEtpb3RhIG91dHB1dCoqIGNvbnRleHQgbWVudQoKIyMjIEN1c3RvbSBUb29scwoKQ3VzdG9tIHRvb2xzIGxldCB5b3UgYXNzb2NpYXRlIGEgdG9vbCB3aXRoIGFuIGl0ZW0gaW4gYSBwcm9qZWN0IGFuZCBydW4gdGhhdCB0b29sIHdoZW5ldmVyIHRoZSBmaWxlIGlzIHNhdmVkCgotICoqKk5Td2FnQ29kZUdlbmVyYXRvcioqKiAtIEdlbmVyYXRlcyBhIHNpbmdsZSBmaWxlIEMjIFJFU1QgQVBJIENsaWVudCB1c2luZyB0aGUgW05Td2FnLkNvZGVHZW5lcmF0aW9uLkNTaGFycF0oaHR0cHM6Ly9naXRodWIuY29tL1JTdXRlci9OU3dhZy93aWtpL0NTaGFycENsaWVudEdlbmVyYXRvcikgW251Z2V0IHBhY2thZ2VdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9OU3dhZy5Db2RlR2VuZXJhdGlvbi5DU2hhcnAvKSAqKnYxNC4xLjAqKgoKLSAqKipPcGVuQXBpQ29kZUdlbmVyYXRvcioqKiAtIEdlbmVyYXRlcyBhIHNpbmdsZSBmaWxlIEMjIFJFU1QgQVBJIENsaWVudCB1c2luZyAqKltPcGVuQVBJIEdlbmVyYXRvciB2Ny44LjBdKGh0dHBzOi8vZ2l0aHViLmNvbS9PcGVuQVBJVG9vbHMvb3BlbmFwaS1nZW5lcmF0b3IvcmVsZWFzZXMvdGFnL3Y3LjguMCkqKi4KVGhlIG91dHB1dCBmaWxlIGlzIHRoZSByZXN1bHQgb2YgbWVyZ2luZyBhbGwgdGhlIGZpbGVzIGdlbmVyYXRlZCB1c2luZyB0aGUgT3BlbkFQSSBHZW5lcmF0b3IgdG9vbCB3aXRoOgpgZ2VuZXJhdGUgLWcgY3NoYXJwIC0taW5wdXQtc3BlYyBbc3dhZ2dlciBmaWxlXSAtLW91dHB1dCBbb3V0cHV0IGZpbGVdIC1EYXBpVGVzdHM9ZmFsc2UgLURtb2RlbFRlc3RzPWZhbHNlIC1EcGFja2FnZU5hbWU9W2RlZmF1bHQgbmFtZXNwYWNlXSAtLXNraXAtb3ZlcndyaXRlYC4gSXQgaXMgcG9zc2libGUgdG8gY29uZmlndXJlIHRoZSBPcGVuQVBJIEdlbmVyYXRvciB0byBnZW5lcmF0ZSBtdWx0aXBsZSBmaWxlcyB3aGljaCB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgc2FtZSBwYXRoIGFzIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb25zIGRvY3VtZW50IHRoYXQgd2FzIHVzZWQgdG8gZ2VuZXJhdGUgY29kZSwgdGhpcyBpcyBkb25lIHVuZGVyIFRvb2xzIC0+IFJFU1QgQVBJIENsaWVudCBDb2RlIEdlbmVyYXRvciAtPiBPcGVuQVBJIEdlbmVyYXRvciBhbmQgc2V0dGluZyAqKkdlbmVyYXRlIE11bHRpcGxlIEZpbGVzKiogdG8gKip0cnVlKioKCi0gKioqS2lvdGFDb2RlR2VuZXJhdG9yKioqIC0gR2VuZXJhdGVzIGEgc2luZ2xlIGZpbGUgQyMgUkVTVCBBUEkgQ2xpZW50IHVzaW5nIHRoZSBNaWNyb3NvZnQgcHJvamVjdCAqKltLaW90YSB2MS4xOC4wXShodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvb3BlbmFwaS9raW90YS8pKiogZ2VuZXJhdG9yLiBUaGUgb3V0cHV0IGZpbGUgaXMgdGhlIHJlc3VsdCBvZiBtZXJnaW5nIGFsbCB0aGUgZmlsZXMgZ2VuZXJhdGVkIHVzaW5nIHRoZSBLaW90YSBkb3RuZXQgdG9vbCB3aXRoOiBgZ2VuZXJhdGUgLWwgQ1NoYXJwIC1kIFtzd2FnZ2VyIGZpbGVdIC1vIFtvdXRwdXQgZmlsZV0gLW4gW2RlZmF1bHQgbmFtZXNwYWNlXWAuIEl0IGlzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSB0aGUgT3BlbkFQSSBHZW5lcmF0b3IgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgZmlsZXMgd2hpY2ggd2lsbCBiZSBwbGFjZWQgYXQgdGhlIHNhbWUgcGF0aCBhcyB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9ucyBkb2N1bWVudCB0aGF0IHdhcyB1c2VkIHRvIGdlbmVyYXRlIGNvZGUsIHRoaXMgaXMgZG9uZSB1bmRlciBUb29scyAtPiBSRVNUIEFQSSBDbGllbnQgQ29kZSBHZW5lcmF0b3IgLT4gS2lvdGEgYW5kIHNldHRpbmcgKipHZW5lcmF0ZSBNdWx0aXBsZSBGaWxlcyoqIHRvICoqdHJ1ZSoqCgotICoqKlN3YWdnZXJDb2RlR2VuZXJhdG9yKioqIC0gR2VuZXJhdGVzIGEgc2luZ2xlIGZpbGUgQyMgUkVTVCBBUEkgQ2xpZW50IHVzaW5nICoqU3dhZ2dlciBDb2RlZ2VuIENMSSB2My4wLjM0KiouClRoZSBvdXRwdXQgZmlsZSBpcyB0aGUgcmVzdWx0IG9mIG1lcmdpbmcgYWxsIHRoZSBmaWxlcyBnZW5lcmF0ZWQgdXNpbmcgdGhlIFN3YWdnZXIgQ29kZWdlbiBDTEkgdG9vbCB3aXRoOgpgZ2VuZXJhdGUgLWwgY3NoYXJwIC0taW5wdXQtc3BlYyBbc3dhZ2dlciBmaWxlXSAtLW91dHB1dCBbb3V0cHV0IGZpbGVdIC1EYXBpVGVzdHM9ZmFsc2UgLURtb2RlbFRlc3RzPWZhbHNlIC1EcGFja2FnZU5hbWU9W2RlZmF1bHQgbmFtZXNwYWNlXSAtLXNraXAtb3ZlcndyaXRlYAoKLSAqKipBdXRvUmVzdENvZGVHZW5lcmF0b3IqKiogLSBHZW5lcmF0ZXMgYSBzaW5nbGUgZmlsZSBDIyBSRVNUIEFQSSBDbGllbnQgdXNpbmcgKipBdXRvUmVzdCB2My4wLjAtYmV0YS4yMDIxMDUwNC4yKiogZm9yIE9wZW5BUEkgdjMgYW5kICoqQXV0b1Jlc3QgdjIuMC40NDE3KiogZm9yIE9wZW5BUEkgdjIuIFRoZSByZXN1bHRpbmcgZmlsZSBpcyB0aGUgZXF1aXZhbGVudCBvZiB1c2luZyB0aGUgQXV0b1Jlc3QgQ0xJIHRvb2wgd2l0aDoKIGAtLWNzaGFycCAtLWlucHV0LWZpbGU9W3N3YWdnZXIgZmlsZV0gLS1vdXRwdXQtZmlsZT1bb3V0cHV0IGZpbGVdIC0tbmFtZXNwYWNlPVtkZWZhdWx0IG5hbWVzcGFjZV0gLS1hZGQtY3JlZGVudGlhbHNgCgotICoqKlJlZml0dGVyQ29kZUdlbmVyYXRvcioqKiAtIEdlbmVyYXRlcyBhIHNpbmdsZSBmaWxlIEMjIFJFU1QgQVBJIENsaWVudCBpbnRlZmFjZSBmb3IgW1JlZml0XShodHRwczovL2dpdGh1Yi5jb20vcmVhY3RpdmV1aS9yZWZpdCkgdXNpbmcgW1JlZml0dGVyLkNvcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlcikgW251Z2V0IHBhY2thZ2VdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9SZWZpdHRlci5Db3JlLykgKip2MS4zLjAqKi4KVGhlIG91dHB1dCBmaWxlIGNvbnRhaW5zIGEgUmVmaXQgaW50ZXJmYWNlIGdlbmVyYXRlZCBieSBbUmVmaXR0ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlcikgYW5kIGNvbnRyYWN0cyBnZW5lcmF0ZWQgdXNpbmcgW05Td2FnLkNvZGVHZW5lcmF0aW9uLkNTaGFycF0oaHR0cHM6Ly9naXRodWIuY29tL1JTdXRlci9OU3dhZy93aWtpL0NTaGFycENsaWVudEdlbmVyYXRvcikgW251Z2V0IHBhY2thZ2VdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9OU3dhZy5Db2RlR2VuZXJhdGlvbi5DU2hhcnAvKQoKIyMjIERlcGVuZGVuY2llcwoKVGhlIGN1c3RvbSB0b29sIGNvZGUgZ2VuZXJhdG9ycyBwaWdneSBiYWNrIG9uIHRvcCBvZiB3ZWxsIGtub3duIE9wZW4gQVBJIGNsaWVudCBjb2RlIGdlbmVyYXRvcnMgbGlrZSAqKkF1dG9SZXN0KiosICoqTlN3YWcqKiwgKipPcGVuQVBJIEdlbmVyYXRvcioqLCAqKk1pY3Jvc29mdCBLaW90YSoqLCAqKlJlZml0dGVyKiosIGFuZCAqKlN3YWdnZXIgQ29kZWdlbiBDTEkqKi4gVGhlc2UgdG9vbHMgcmVxdWlyZSBbTlBNXShodHRwczovL3d3dy5ucG1qcy5jb20vZ2V0LW5wbSkgYW5kIHRoZSBbSmF2YSBSdW50aW1lIEVudmlyb25tZW50XShodHRwczovL2phdmEuY29tL2VuL2Rvd25sb2FkL21hbnVhbC5qc3ApIHRvIGJlIGluc3RhbGxlZCBvbiB0aGUgZGV2ZWxvcGVycyBtYWNoaW5lLiBBbHRlcm5hdGl2ZSBKYXZhIFNESyBpbXBsZW1lbnRhdGlvbnMgc3VjaCBhcyB0aGUgW09wZW5KREtdKGh0dHBzOi8vYWRvcHRvcGVuamRrLm5ldCkgd29ya3MgZmluZSB3aXRoIHRoaXMgZXh0ZW5zaW9uLiBCeSBkZWZhdWx0LCB0aGUgcGF0aCB0byAqKmphdmEuZXhlKiogaXMgcmVhZCBmcm9tIHRoZSAqKkpBVkFfSE9NRSoqIGVudmlyb25tZW50IHZhcmlhYmxlLCBidXQgaXMgYWxzbyBjb25maWd1cmFibGUgaW4gdGhlIFNldHRpbmdzIHNjcmVlbi4gRnV0dXJlIHZlcnNpb25zIG9mIHRoZSBleHRlbnNpb24gd2lsbCBpbmNsdWRlIHRoZSBbT3BlbkpES10oaHR0cHM6Ly9hZG9wdG9wZW5qZGsubmV0KSBpbiB0aGUgVlNJWCBwYWNrYWdlCgpUaGUgKipTd2FnZ2VyIENvZGVnZW4gQ0xJKiogYW5kICoqT3BlbkFQSSBHZW5lcmF0b3IqKiBhcmUgZGlzdHJpYnV0ZWQgYXMgSkFSIGZpbGVzIGFuZCBhcmUgZG93bmxvYWRlZCBvbiBkZW1hbmQgYnV0IHJlcXVpcmVzIHRoZSBKYXZhIFNESyB0byBiZSBpbnN0YWxsZWQgb24gdGhlIG1hY2hpbmUuICoqQXV0b1Jlc3QqKiBpcyBpbnN0YWxsZWQgb24tZGVtYW5kIHZpYSBbTlBNXShodHRwczovL3d3dy5ucG1qcy5jb20vZ2V0LW5wbSkgYXMgYSBnbG9iYWwgdG9vbCBhbmQgdXNlcyB0aGUgbGF0ZXN0IGF2YWlsYWJsZSB2ZXJzaW9uLiAqKk1pY3Jvc29mdCBLaW90YSoqIGlzIGluc3RhbGxlZCBvbi1kZW1hbmQgYXMgYSAuTkVUIFRvb2wgYW5kIHJlcXVpcmVzIC5ORVQgNy4wLiBUaGlzIG1lYW5zIHRoYXQgdXNpbmcgdGhlc2UgY3VzdG9tIHRvb2xzIGhhdmUgYW4gaW5pdGlhbCBkZWxheSB1cG9uIGZpcnN0IHRpbWUgdXNlLiAKCioqTlN3YWdTdHVkaW8qKiBpcyBzdGFuZCBhbG9uZSBVSSB0b29sIGZvciBlZGl0aW5nIGEgKioubnN3YWcqKiBzcGVjaWZpY2F0aW9uIGZpbGUgZm9yIGdlbmVyYXRpbmcgY29kZS4gVGhpcyB0b29sIGlzIG9wdGlvbmFsIHRvIGluc3RhbGwgYW5kIG9mZmljaWFsIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgW05Td2FnIFdpa2kgb24gR2l0aHViXShodHRwczovL2dpdGh1Yi5jb20vUmljb1N1dGVyL05Td2FnL3dpa2kvTlN3YWdTdHVkaW8pLiBJZiAqKk5Td2FnU3R1ZGlvKiogaXMgbm90IGluc3RhbGxlZCBvbiB0aGUgbWFjaGluZSB0aGVuIHRoZSBWaXN1YWwgU3R1ZGlvIEV4dGVuc2lvbiB3aWxsIGluc3RhbGwgdGhlICoqTlN3YWcgQ0xJKiogdmlhIFtOUE1dKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9nZXQtbnBtKSBhcyBhIGdsb2JhbCB0b29sIHVzaW5nIHRoZSBsYXRlc3QgYXZhaWxhYmxlIHZlcnNpb24uIAoKVGhlICoqTlN3YWcqKiBjb2RlIGdlbmVyYXRvciBwcm9kdWNlcyBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGUgW05ld3RvbnNvZnQuSnNvbl0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL05ld3RvbnNvZnQuSnNvbi8xMy4wLjMpIE51R2V0IHBhY2thZ2UKClRoZSAqKlJlZml0dGVyKiogY29kZSBnZW5lcmF0b3IgcHJvZHVjZXMgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhlIFtSZWZpdF0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL1JlZml0LzcuMC4wKSBOdUdldCBwYWNrYWdlCgpUaGUgKipPcGVuQVBJIEdlbmVyYXRvcioqIGNvZGUgZ2VuZXJhdG9yIHByb2R1Y2VzIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoZSBmb2xsb3dpbmcgTnVHZXQgcGFja2FnZXM6CgotIFtSZXN0U2hhcnBdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9SZXN0U2hhcnAvMTEyLjAuMCkKLSBbSnNvblN1YlR5cGVzXShodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvSnNvblN1YlR5cGVzLzIuMC4xKQotIFtQb2xseV0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL1BvbGx5LzguNC4yKQotIFtOZXd0b25zb2Z0Lkpzb25dKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9OZXd0b25zb2Z0Lkpzb24vMTMuMC4zKQoKVGhlIHByb2plY3QgKipLaW90YSoqIGNvZGUgZ2VuZXJhdG9yIHByb2R1Y2VzIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoZSBmb2xsb3dpbmcgTnVHZXQgcGFja2FnZXMKCi0gW01pY3Jvc29mdC5LaW90YS5BYnN0cmFjdGlvbnNdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9NaWNyb3NvZnQuS2lvdGEuQWJzdHJhY3Rpb25zKQotIFtNaWNyb3NvZnQuS2lvdGEuSHR0cC5IdHRwQ2xpZW50TGlicmFyeV0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL01pY3Jvc29mdC5LaW90YS5IdHRwLkh0dHBDbGllbnRMaWJyYXJ5KQotIFtNaWNyb3NvZnQuS2lvdGEuU2VyaWFsaXphdGlvbi5Gb3JtXShodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvTWljcm9zb2Z0Lktpb3RhLlNlcmlhbGl6YXRpb24uRm9ybSkKLSBbTWljcm9zb2Z0Lktpb3RhLlNlcmlhbGl6YXRpb24uVGV4dF0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL01pY3Jvc29mdC5LaW90YS5TZXJpYWxpemF0aW9uLlRleHQpCi0gW01pY3Jvc29mdC5LaW90YS5TZXJpYWxpemF0aW9uLkpzb25dKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9NaWNyb3NvZnQuS2lvdGEuU2VyaWFsaXphdGlvbi5Kc29uKQotIFtNaWNyb3NvZnQuS2lvdGEuU2VyaWFsaXphdGlvbi5NdWx0aXBhcnRdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9NaWNyb3NvZnQuS2lvdGEuU2VyaWFsaXphdGlvbi5NdWx0aXBhcnQpCi0gW01pY3Jvc29mdC5LaW90YS5BdXRoZW50aWNhdGlvbi5BenVyZV0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL01pY3Jvc29mdC5LaW90YS5BdXRoZW50aWNhdGlvbi5BenVyZSkKLSBbQXp1cmUuSWRlbnRpdHldKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9BenVyZS5JZGVudGl0eSkKClRoZSAqKlN3YWdnZXIgQ29kZWdlbiBDTEkqKiBjb2RlIGdlbmVyYXRvciBwcm9kdWNlcyBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGUgW1Jlc3RTaGFycF0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL1Jlc3RTaGFycC8xMDUuMS4wKSBhbmQgW0pzb25TdWJUeXBlc10oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL0pzb25TdWJUeXBlcy8xLjkuMCkgTnVHZXQgcGFja2FnZXMKClRoZSAqKkF1dG9SZXN0KiogY29kZSBnZW5lcmF0b3IgcHJvZHVjZXMgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhlIFtNaWNyb3NvZnQuUmVzdC5DbGllbnRSdW50aW1lXShodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvTWljcm9zb2Z0LlJlc3QuQ2xpZW50UnVudGltZS8yLjMuMjQpIGFuZCBbTmV3dG9uc29mdC5Kc29uXShodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvTmV3dG9uc29mdC5Kc29uLzEzLjAuMykgTnVHZXQgcGFja2FnZXMKClRoaXMgVmlzdWFsIFN0dWRpbyBFeHRlbnNpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgcmVxdWlyZWQgTnVHZXQgcGFja2FnZXMgdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgZGVwZW5kcyBvbgoKIyMgU2NyZWVuc2hvdHMKCiFbQWRkIC0gQVBJIENsaWVudCBmcm9tIE9wZW5BUEkgU3BlY2lmaWNhdGlvbl0oaW1hZ2VzL2FkZC1uZXctbWVudS5wbmcpCgohW0VudGVyIFVSTCB0byBPcGVuQVBJIFNwZWNpZmljYXRpb25dKGltYWdlcy9hZGQtbmV3LWRpYWxvZy5wbmcpCgohW1NvbHV0aW9uIEV4cGxvcmVyIENvbnRleHQgTWVudXNdKGltYWdlcy9zb2x1dGlvbi1leHBsb3Jlci1jb250ZXh0LW1lbnUuanBnKQoKIVtOU3dhZyBTdHVkaW8gQ29udGV4dCBNZW51XShpbWFnZXMvbnN3YWdzdHVkaW8tY29udGV4dC1tZW51LmpwZykKCiFbUmVmaXR0ZXIgQ29udGV4dCBNZW51XShpbWFnZXMvcmVmaXR0ZXItY29tbWFuZC5wbmcpCgohW0tpb3RhIENvbnRleHQgTWVudV0oaW1hZ2VzL2dlbmVyYXRlLWtpb3RhLW91dHB1dC5wbmcpCgojIyMgU2V0dGluZ3MKClRoaXMgZXh0ZW5zaW9uIHdpbGwgYnkgZGVmYXVsdCBtYWtlIHNvbWUgYXNzdW1wdGlvbnMgb24gdGhlIGluc3RhbGxhdGlvbiBwYXRocyBmb3IgKipKYXZhKiosICoqTlN3YWcqKiBhbmQgKipOUE0qKiBidXQgYWxzbyBwcm92aWRlcyBvcHRpb24gcGFnZXMgZm9yIGNvbmZpZ3VyaW5nIHRoaXMuIFRoZSAqKlN3YWdnZXIgQ29kZWdlbiBDTEkqKiBhbmQgdGhlICoqT3BlbkFQSSBHZW5lcmF0b3IqKiBKQVIgZmlsZXMgYXJlIGJ5IGRlZmF1bHQgZG93bmxvYWRlZCB0byB0aGUgdXNlciBURU1QIGZvbGRlciBidXQgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IHRvIHVzZSBleGlzdGluZyBKQVIgZmlsZXMKCiFbT3B0aW9ucyAtIEdlbmVyYWxdKGltYWdlcy9vcHRpb25zLWdlbmVyYWwucG5nKQoKU3VwcG9ydHMgY3VzdG9taXNpbmcgaG93IEF1dG9SZXN0IGdlbmVyYXRlcyBjb2RlIGJhc2VkIG9uIHRoZSBDIyBnZW5lcmF0b3Igc2V0dGluZ3MgdGhhdCB0aGUgQXV0b1Jlc3QgQ0xJIHRvb2wgcHJvdmlkZXMKCiFbT3B0aW9ucyAtIEF1dG9SZXN0XShpbWFnZXMvb3B0aW9ucy1hdXRvcmVzdC5wbmcpCgpTdXBwb3J0cyBjdXN0b21pc2luZyBob3cgTlN3YWcgZ2VuZXJhdGVzIGNvZGUgdXNpbmcgdGhlIHByb3BlcnRpZXMgZXhwb3NlZCBieSB0aGUgTlN3YWcgTnVHZXQgcGFja2FnZQoKIVtPcHRpb25zIC0gTlN3YWddKGltYWdlcy9vcHRpb25zLW5zd2FnLnBuZykKClN1cHBvcnRzIGN1c3RvbWlzaW5nIGhvdyB0aGUgKioubnN3YWcqKiBmaWxlIGlzIGdlbmVyYXRlZCB1c2luZyBhIHN1YnNldCBvZiB0aGUgb3B0aW9ucyBhdmFpbGFibGUgaW4gTlN3YWcgU3R1ZGlvCgohW09wdGlvbnMgLSBOU3dhZyBTdHVkaW9dKGltYWdlcy9vcHRpb25zLW5zd2Fnc3R1ZGlvLnBuZykKClN1cHBvcnRzIGN1c3RvbWlzaW5nIGhvdyBPcGVuQVBJIEdlbmVyYXRvciBnZW5lcmF0ZXMgY29kZSB1c2luZyB0aGUgYWRkaXRpb25hbCBvcHRpb25hbCBwcm9wZXJ0aWVzIHRoYXQgdGhlIE9wZW5BUEkgR2VuZXJhdG9yIENMSSB0b29sIHByb3ZpZGVzCgohW09wdGlvbnMgLSBPcGVuQVBJIEdlbmVyYXRvcl0oaW1hZ2VzL29wdGlvbnMtb3BlbmFwaWdlbmVyYXRvci5wbmcpCgpTdXBwb3J0cyBjdXN0b21pc2luZyBob3cgUmVmaXR0ZXIgZ2VuZXJhdGVzIHRoZSBSZWZpdCBpbnRlcmZhY2UuIFRoaXMgYWxsb3dzIHlvdSB0byBjb25maWd1cmUgd2hldGhlciB0byByZXR1cm4gdGhlIHR5cGUgZGlyZWN0bHkgb3Igd3JhcCBpdCBpbnNpZGUgYW4gYElBcGlSZXNwb25zZTxUPmAuIFlvdSBjYW4gYWxzbyBkaXNhYmxlIGdlbmVyYXRpbmcgY29udHJhY3RzIG9yIFhNTCBkb2Mgc3R5bGUgY29tbWVudHMKCiFbT3B0aW9ucyAtIFJlZml0dGVyXShpbWFnZXMvcmVmaXR0ZXItb3B0aW9ucy5wbmcpCgpTdXBwb3J0cyBhbGxvd2luZyBLaW90YSB0byBnZW5lcmF0ZSBtdWx0aXBsZSBmaWxlcwoKIVtPcHRpb25zIC0gS2lvdGFdKGltYWdlcy9vcHRpb25zLWtpb3RhLnBuZykKClRoaXMgZXh0ZW5zaW9uIGNvbGxlY3RzIGVycm9ycyBhbmQgdHJhY2tzIGZlYXR1cmUgdXNhZ2VzIHRvIGEgc2VydmljZSBjYWxsZWQgW0V4Y2VwdGlvbmxlc3NdKGh0dHBzOi8vZXhjZXB0aW9ubGVzcy5jb20pIGFuZCBbQXp1cmUgQXBwbGljYXRpb24gSW5zaWdodHNdKGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9henVyZS1tb25pdG9yL2FwcC9hcHAtaW5zaWdodHMtb3ZlcnZpZXc/V1QubWNfaWQ9RFQtTVZQLTUwMDQ4MjIpLiBUaGlzIGlzIGRvbmUgYW5vbnltb3VzbHkgdXNpbmcgYSBzdXBwb3J0IGtleSBhbmQgYSBnZW5lcmF0ZWQgYW5vbnltb3VzIGlkZW50aXR5IGJhc2VkIG9uIGEgc2VjdXJlIGhhc2ggb2YgdXNlcm5hbWVAaG9zdAoKIVtPcHRpb25zIC0gQW5hbHl0aWNzXShpbWFnZXMvc3VwcG9ydC1rZXkucG5nKQoKIyMjIE1hY09TCgohW0FkZCAtIEFQSSBDbGllbnQgZnJvbSBPcGVuQVBJIFNwZWNpZmljYXRpb25dKGltYWdlcy92c21hYy1hZGQtbmV3LW1lbnUucG5nKQoKIVtFbnRlciBVUkwgdG8gT3BlbkFQSSBTcGVjaWZpY2F0aW9uXShpbWFnZXMvdnNtYWMtYWRkLW5ldy1kaWFsb2cucG5nKQoKIVtTb2x1dGlvbiBFeHBsb3JlciBDb250ZXh0IE1lbnVzXShpbWFnZXMvdnNtYWMtZ2VuZXJhdGUtY29kZS5wbmcpCgohW05Td2FnIFN0dWRpbyBDb250ZXh0IE1lbnVdKGltYWdlcy92c21hYy1uc3dhZy1zdHVkaW8ucG5nKQoKIyBJbnN0YWxsYXRpb24KClRoZSBWaXN1YWwgU3R1ZGlvIGV4dGVuc2lvbiBjYW4gYmUgaW5zdGFsbGVkIGRpcmVjdGx5IGZyb20gVmlzdWFsIFN0dWRpbyAyMDE5IGFuZCAyMDIyIHZpYSB0aGUgKipFeHRlbnNpb25zIERpYWxvZyBCb3gqKi4gVGhlIHByb2Nlc3MgaXMgYmVzdCBkZXNjcmliZWQgaW4gdGhlIG9mZmljaWFsIE1pY3Jvc29mdCBkb2N1bWVudGF0aW9uIGZvciBbTWFuYWdpbmcgZXh0ZW5zaW9ucyBmb3IgVmlzdWFsIFN0dWRpb10oaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvdmlzdWFsc3R1ZGlvL2lkZS9maW5kaW5nLWFuZC11c2luZy12aXN1YWwtc3R1ZGlvLWV4dGVuc2lvbnM/dmlldz12cy0yMDE5JldULm1jX2lkPURULU1WUC01MDA0ODIyKQoKIyMgVmlzdWFsIFN0dWRpbyBmb3IgTWFjCgpUaGlzIGluc3RhbGxhdGlvbiBwcm9jZXNzIGZvciAqKlZpc3VhbCBTdHVkaW8gZm9yIE1hYyoqIGlzIGN1cnJlbnRseSBhIGJpdCB0cm91Ymxlc29tZSBhcyB0aGUgTW9ub0RldmVsb3AgQWRkaW4gUmVwb3NpdG9yeSBpcyBjdXJyZW50bHkgbm90IGFjY2VwdGluZyBuZXcgdXNlcnMgc28gSSBjYW4ndCByZWFsbHkgcmVnaXN0ZXIgYW5kIHNldHVwIG15IGV4dGVuc2lvbi4KClRoZXJlIGFyZSAyIHdheXMgb2YgaW5zdGFsbGluZyBteSBleHRlbnNpb24gb24gVmlzdWFsIFN0dWRpbyBmb3IgTWFjOiBBZGRpbmcgYSBjdXN0b20gZXh0ZW5zaW9uIHJlcG9zaXRvcnkgb3IgSW5zdGFsbGluZyB0aGUgKioubXBhY2sqKiBmaWxlIGRpcmVjdGx5IGZyb20gdGhlIEV4dGVuc2lvbnMgTWFuYWdlcgoKIyMjIEFkZGluZyBhIG5ldyBleHRlbnNpb24gcmVwb3NpdG9yeQoKSGVyZSdzIHdoYXQgeW91IG5lZWQgdG8gZG86CgotIE9wZW4gdGhlIFZpc3VhbCBTdHVkaW8gZm9yIE1hYyAqKkV4dGVuc2lvbiBNYW5hZ2VyKioKLSBZb3UgY2FuIGRvIHRoaXMgZnJvbSB0aGUgbWVudSAqKlZpc3VhbCBTdHVkaW8qKiAtPiAqKkV4dGVudGlvbnMqKgoKIVtPcGVuIEV4dGVuc2lvbnMgRGlhbG9nIEJveF0oaW1hZ2VzL3ZzbWFjLWV4dGVuc2lvbnMtbWVudS5wbmcpCgotIFNlbGVjdCB0aGUgKipHYWxsZXJ5KiogVGFiCi0gRXhwYW5kIHRoZSBSZXBvc2l0b3J5IGRyb3AgZG93biBib3ggYW5kIHNlbGVjdCAqKk1hbmFnZSBSZXBvc2l0b3JpZXMqKgoKIVtNYW5hZ2UgUmVwb3NpdG9yaWVzXShpbWFnZXMvdnNtYWMtZXh0ZW5zaW9ucy1tYW5hZ2UtcmVwb3NpdG9yaWVzLnBuZykKCi0gUHJlc3Mgb24gdGhlICoqQWRkKiogYnV0dG9uIHRvIGFkZCBhIG5ldyBjdXN0b20gZXh0ZW5zaW9uIHJlcG9zaXRvcnkKCiFbTWFuYWdlIFJlcG9zaXRvcmllc10oaW1hZ2VzL3ZzbWFjLWV4dGVuc2lvbnMtcmVwb3NpdG9yaWVzLnBuZykKCi0gUmVnaXN0ZXIgYW4gb25saW5lIHJlcG9zaXRvcnkgYXQgKipodHRwczovL2NocmlzdGlhbmhlbGxlLmNvbS92c21hYy9tYWluLm1yZXAqKgotIENsaWNrICoqT0sqKgoKIVtBZGQgUmVwb3NpdG9yeV0oaW1hZ2VzL3ZzbWFjLWV4dGVuc2lvbnMtYWRkLXJlcG9zaXRvcnkucG5nKQoKLSBOb3cgbXkgZXh0ZW5zaW9uIHJlcG9zaXRvcnkgaXMgYWRkZWQgdG8gdGhlIGxpc3QKLSBNYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGVuYWJsZWQgKGluZGljYXRlZCBieSBhIGNoZWNrIGJveCkKCiFbQWRkIFJlcG9zaXRvcnkgRGlhbG9nXShpbWFnZXMvdnNtYWMtZXh0ZW5zaW9ucy1hZGRlZC1yZXBvc2l0b3J5LnBuZykKCi0gWW91IHNob3VsZCBub3cgYmUgYWJsZSB0byBzZWUgbXkgZXh0ZW5zaW9ucyBmcm9tIHRoZSAqKkdhbGxlcnkqKiB0YWIKCiFbQWRkZWQgUmVwb3NpdG9yeV0oaW1hZ2VzL3ZzbWFjLWV4dGVuc2lvbnMtZ2FsbGVyeS5wbmcpCgotIEJ5IGFkZGluZyBteSBleHRlbnNpb24gcmVwb3NpdG9yeSB5b3Ugd2lsbCBiZSBhYmxlIHRvIGNvbnZlbmllbnRseSB1cGRhdGUgbXkgZXh0ZW5zaW9uIHVzaW5nIHRoZSBWaXN1YWwgU3R1ZGlvIGZvciBNYWMgRXh0ZW5zaW9uIE1hbmFnZXIKCiFbQWRkIFJlcG9zaXRvcnldKGltYWdlcy92c21hYy11cGRhdGVzLnBuZykKCiFbQWRkIFJlcG9zaXRvcnldKGltYWdlcy92c21hYy11cGRhdGUtaW5zdGFsbC5wbmcpCgohW0FkZCBSZXBvc2l0b3J5XShpbWFnZXMvdnNtYWMtdXBkYXRlLWluc3RhbGwtcHJvZ3Jlc3MucG5nKQoKIyMjIEluc3RhbGxpbmcgdGhlICoqLm1wYWNrKiogZmlsZSBkaXJlY3RseQoKSGVyZSdzIHdoYXQgeW91IG5lZWQgdG8gZG86Ci0gRG93bmxvYWQgdGhlIGxhdGVzdCAqKi5tcGFjayBmaWxlKiogZnJvbSB0aGUgW0xhdGVzdCBHaXRodWIgUmVsZWFzZV0oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL2FwaWNsaWVudGNvZGVnZW4vcmVsZWFzZXMvbGF0ZXN0KQotIE5vdyBmcm9tIHdpdGhpbiBWaXN1YWwgU3R1ZGlvIGZvciBNYWMgeW91IG5lZWQgdG8gbGF1bmNoIHRoZSAqKkV4dGVuc2lvbnMgRGlhbG9nIEJveCoqLiBZb3UgY2FuIGRvIHRoaXMgZnJvbSB0aGUgbWVudSAqKlZpc3VhbCBTdHVkaW8qKiAtPiAqKkV4dGVudGlvbnMqKgoKIVtPcGVuIEV4dGVuc2lvbnMgRGlhbG9nIEJveF0oaW1hZ2VzL3ZzbWFjLWV4dGVuc2lvbnMtbWVudS5wbmcpCgotIENsaWNrIG9uIHRoZSAqKkluc3RhbGwgZnJvbSBGaWxlKiogYnV0dG9uCgohW01hbnVhbGx5IGluc3RhbGwgLm1wYWNrIGZpbGVdKGltYWdlcy92c21hYy1leHRlbnNpb25zLWluc3RhbGwucG5nKQoKLSBCcm93c2UgdG8gdGhlIC5tcGFjayBmaWxlIGFuZCBzZWxlY3QgaXQuIFlvdSB3aWxsIGJlIHByb21wdGVkIHdpdGggYSBjb25maXJtYXRpb24gZGlhbG9nCgohW0NvbmZpcm0gLm1wYWNrIGZpbGUgaW5zdGFsbF0oaW1hZ2VzL3ZzbWFjLWV4dGVuc2lvbnMtaW5zdGFsbC1jb25maXJtLnBuZykKCi0gQ2xpY2sgKipJbnN0YWxsKiogYW5kIHJlc3RhcnQgVmlzdWFsIFN0dWRpbyBmb3IgTWFjCi0gVG8gVmVyaWZ5IHRoYXQgdGhlIEFkZC1pbiB3YXMgaW5zdGFsbGVkIHlvdSBjYW4gcmUtb3BlbiB0aGUgRXh0ZW5zaW9ucyBEaWFsb2cgQm94LCBzZWxlY3QgdGhlICoqSW5zdGFsbGVkKiogdGFiIGFuZCBleHBhbmQgdGhlICoqSURFIEV4dGVuc2lvbnMqKi4gWW91IHNob3VsZCBiZSBhYmxlIHRvIHNlZSB0aGUgKipSRVNUIEFQSSBDbGllbnQgQ29kZSBHZW5lcmF0b3IqKi4KCi0gVW5pbnN0YWxsaW5nIHRoZSBBZGQtaW4gaXMgZG9uZSBpbiB0aGlzIHNhbWUgZGlhbG9nIGJveCBieSBjbGlja2luZyB0aGUgKipVbmluc3RhbGwqKiBidXR0b24KCiFbTWFudWFsbHkgdW5pbnN0YWxsIEFkZC1pbl0oaW1hZ2VzL3ZzbWFjLWV4dGVuc2lvbnMtdW5pbnN0YWxsLnBuZykKCgojIENyb3NzIFBsYXRmb3JtIENvbW1hbmQgTGluZSBUb29sCkFsbCBjdXN0b20gdG9vbHMgbWVudGlvbmVkIGFib3ZlIGFyZSBhbHNvIGltcGxlbWVudGVkIGluIGEgY3Jvc3MgcGxhdGZvcm0gY29tbWFuZCBsaW5lIGFwcGxpY2F0aW9uCgojIyMjIFJlcXVpcmVtZW50cwotIC5ORVQgNi4wIHJ1bnRpbWUKLSBKYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnQKLSBOUE0KCiMjIyBJbnN0YWxsYXRpb24KVGhlIHRvb2wgY2FuIGJlIGluc3RhbGxlZCBhcyBhIC5ORVQgQ29yZSBnbG9iYWwgdG9vbCB0aGF0IHlvdSBjYW4gY2FsbCBmcm9tIHRoZSBzaGVsbCAvIGNvbW1hbmQgbGluZQpgYGAKZG90bmV0IHRvb2wgaW5zdGFsbCAtLWdsb2JhbCByYXBpY2dlbgpgYGAKb3IgYnkgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbnMgW2hlcmVdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9yYXBpY2dlbikgdG8gaW5zdGFsbCBhIHNwZWNpZmljIHZlcnNpb24gb2YgdG9vbAoKIyMjIFVzYWdlClNpbmNlIHRoZSB0b29sIGlzIHB1Ymxpc2hlZCBhcyBhIC5ORVQgQ29yZSBUb29sLCBpdCBjYW4gYmUgbGF1bmNoZWQgZnJvbSBhbnl3aGVyZSB1c2luZyBhbnkgY29tbWFuZCBsaW5lIGludGVyZmFjZSBieSBjYWxsaW5nICoqcmFwaWNnZW4qKi4KVGhlIGhlbHAgaW5mb3JtYXRpb24gaXMgZGlzcGxheWVkIHdoZW4gbm90IHNwZWNpZnlpbmcgYW55IGFyZ3VtZW50cyB0byAqKnJhcGljZ2VuKioKCmBgYApVc2FnZTogcmFwaWNnZW4gW2NvbW1hbmRdIFtvcHRpb25zXQoKT3B0aW9uczoKICAtdnwtLXZlcmJvc2UgICAgICAgU2hvdyB2ZXJib3NlIG91dHB1dAogIC0/fC1ofC0taGVscCAgICAgICBTaG93IGhlbHAgaW5mb3JtYXRpb24uCgpDb21tYW5kczoKICBjc2hhcnAgICAgICAgICAgICAgR2VuZXJhdGUgQyMgQVBJIGNsaWVudHMKICBqbWV0ZXIgICAgICAgICAgICAgR2VuZXJhdGUgQXBhY2hlIEpNZXRlciB0ZXN0IHBsYW5zCiAgb3BlbmFwaS1nZW5lcmF0b3IgIEdlbmVyYXRlIGNvZGUgdXNpbmcgT3BlbkFQSSBHZW5lcmF0b3IgKHY3LjguMCkuCiAgICAgICAgICAgICAgICAgICAgIFNlZSBzdXBwb3J0ZWQgZ2VuZXJhdG9ycyBhdCBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gvZG9jcy9nZW5lcmF0b3JzLwogIHR5cGVzY3JpcHQgICAgICAgICBHZW5lcmF0ZSBUeXBlU2NyaXB0IEFQSSBjbGllbnRzCgpSdW4gJ3JhcGljZ2VuIFtjb21tYW5kXSAtP3wtaHwtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgY29tbWFuZC4KYGBgCgpTb21lIGhlbHAgaW5mb3JtYXRpb24gaXMgYWxzbyBwcm92aWRlZCBwZXIgY29tbWFuZCBhbmQgY2FuIGJlIGxhdW5jaGVkIGJ5IAoKYGBgCnJhcGljZ2VuIFtjb21tYW5kIG5hbWVdIC0/CmBgYAoKb3IKCmBgYApyYXBpY2dlbiBbY29tbWFuZCBuYW1lXSBbc3ViIGNvbW1hbmQgbmFtZV0gLT8KYGBgCgpGb3IgZXhhbXBsZToKCmBgYApyYXBpY2dlbiBjc2hhcnAgLT8KYGBgIAoKd2lsbCBvdXRwdXQgdGhpczoKCmBgYApHZW5lcmF0ZSBDIyBBUEkgY2xpZW50cwoKVXNhZ2U6IHJhcGljZ2VuIGNzaGFycCBbY29tbWFuZF0gW29wdGlvbnNdCgpPcHRpb25zOgogIC0/fC1ofC0taGVscCAgU2hvdyBoZWxwIGluZm9ybWF0aW9uLgoKQ29tbWFuZHM6CiAgYXV0b3Jlc3QgICAgICBBdXRvUmVzdCAodjMuMC4wLWJldGEuMjAyMTA1MDQuMikKICBraW90YSAgICAgICAgIE1pY3Jvc29mdCBLaW90YSAodjEuMTguMCkKICBuc3dhZyAgICAgICAgIE5Td2FnICh2MTQuMS4wKQogIG9wZW5hcGkgICAgICAgT3BlbkFQSSBHZW5lcmF0b3IgKHY3LjguMCkKICByZWZpdHRlciAgICAgIFJlZml0dGVyICh2MS4zLjApCiAgc3dhZ2dlciAgICAgICBTd2FnZ2VyIENvZGVnZW4gQ0xJICh2My4wLjM0KQoKUnVuICdjc2hhcnAgW2NvbW1hbmRdIC0/fC1ofC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSBjb21tYW5kLgoKYGBgCgphbmQKCmBgYApyYXBpY2dlbiBjc2hhcnAgYXV0b3Jlc3QgLT8KYGBgCgp3aWxsIG91dHB1dCB0aGlzOgoKYGBgCkdlbmVyYXRlIFN3YWdnZXIgLyBPcGVuIEFQSSBjbGllbnQgdXNpbmcgQXV0b1Jlc3QKClVzYWdlOiBydW4gYXV0b3Jlc3QgW29wdGlvbnNdIDxzd2FnZ2VyRmlsZT4gPG5hbWVzcGFjZT4gPG91dHB1dEZpbGU+CgpBcmd1bWVudHM6CiAgc3dhZ2dlckZpbGUgICBQYXRoIHRvIHRoZSBTd2FnZ2VyIC8gT3BlbiBBUEkgc3BlY2lmaWNhdGlvbiBmaWxlCiAgbmFtZXNwYWNlICAgICBEZWZhdWx0IG5hbWVzcGFjZSB0byBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUKICBvdXRwdXRGaWxlICAgIE91dHB1dCBmaWxlbmFtZSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGNvZGUgdG8uIERlZmF1bHQgaXMgdGhlIHN3YWdnZXJGaWxlIC5jcwoKT3B0aW9uczoKICAtP3wtaHwtLWhlbHAgIFNob3cgaGVscCBpbmZvcm1hdGlvbgpgYGAKCm9yIAoKYGBgCnJhcGljZ2VuIHR5cGVzY3JpcHQgLT8KYGBgCgp3aWxsIG91dHB1dCB0aGlzOgoKYGBgCkdlbmVyYXRlIFR5cGVTY3JpcHQgQVBJIGNsaWVudAoKVXNhZ2U6IHJhcGljZ2VuIHR5cGVzY3JpcHQgW29wdGlvbnNdIDxnZW5lcmF0b3I+IDxzd2FnZ2VyRmlsZT4gPG91dHB1dFBhdGg+CgpBcmd1bWVudHM6CiAgZ2VuZXJhdG9yICAgICAgICAgVGhlIHRlY2ggc3RhY2sgdG8gdXNlIGZvciB0aGUgZ2VuZXJhdGVkIGNsaWVudCBsaWJyYXJ5CiAgICAgICAgICAgICAgICAgICAgQWxsb3dlZCB2YWx1ZXMgYXJlOiBBbmd1bGFyLCBBdXJlbGlhLCBBeGlvcywgRmV0Y2gsIEludmVyc2lmeSwgSlF1ZXJ5LCBOZXN0SlMsIE5vZGUsIFJlZHV4UXVlcnksCiAgICAgICAgICAgICAgICAgICAgUnhqcy4KICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlIGlzOiBBbmd1bGFyLgogIHN3YWdnZXJGaWxlICAgICAgIFBhdGggdG8gdGhlIFN3YWdnZXIgLyBPcGVuIEFQSSBzcGVjaWZpY2F0aW9uIGZpbGUKICBvdXRwdXRQYXRoICAgICAgICBPdXRwdXQgZm9sZGVyIHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgY29kZSB0bwogICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXM6IHR5cGVzY3JpcHQtZ2VuZXJhdGVkLWNvZGUuCgpPcHRpb25zOgogIC1ubHwtLW5vLWxvZ2dpbmcgIERpc2FibGVzIEFuYWx5dGljcyBhbmQgRXJyb3IgUmVwb3J0aW5nCiAgLT98LWh8LS1oZWxwICAgICAgU2hvdyBoZWxwIGluZm9ybWF0aW9uLgpgYGAKCiMjIFVzYWdlIEV4YW1wbGVzOgoKTGV0J3Mgc2F5IHdlIGhhdmUgYSBPcGVuQVBJIFNwZWNpZmljYXRpb25zIGRvY3VtZW50IGNhbGxlZCAqKlN3YWdnZXIuanNvbioqCgpGb3Igc3RhcnRlcnMsIHdlIGNhbiB1c2UgdGhlIFN3YWdnZXIgUGV0c3RvcmUgc3BlYy4gSGVyZSdzIGFuIGV4YW1wbGUgcG93ZXJzaGVsbCBzY3JpcHQgZm9yIGRvd25sb2FkaW5nIGl0CgpgYGAKSW52b2tlLVdlYlJlcXVlc3QgLVVyaSBodHRwczovL3BldHN0b3JlLnN3YWdnZXIuaW8vdjMvc3dhZ2dlci5qc29uIC1PdXRGaWxlIFN3YWdnZXIuanNvbgpgYGAKCkluIGNhc2UgeW91IGRvbid0IGhhdmUgdGhlIENMSSB0b29sIGluc3RhbGxlZCB5b3UgY2FuIGluc3RhbGwgaXQgYnkKCmBgYApkb3RuZXQgdG9vbCBpbnN0YWxsIC0tZ2xvYmFsIHJhcGljZ2VuCmBgYAoKSGVyZSdzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGdlbmVyYXRlIGNvZGUgdXNpbmcgKipBdXRvUmVzdCoqCgpgYGAKcmFwaWNnZW4gY3NoYXJwIGF1dG9yZXN0IFN3YWdnZXIuanNvbiBHZW5lcmF0ZWRDb2RlIC4vQXV0b1Jlc3RPdXRwdXQuY3MKYGBgCgpIZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gZ2VuZXJhdGUgY29kZSB1c2luZyAqKktpb3RhKioKCmBgYApyYXBpY2dlbiBjc2hhcnAga2lvdGEgU3dhZ2dlci5qc29uIEdlbmVyYXRlZENvZGUgLi9PcGVuQXBpT3V0cHV0LmNzCmBgYAoKSGVyZSdzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGdlbmVyYXRlIGNvZGUgdXNpbmcgKipOU3dhZyoqCgpgYGAKcmFwaWNnZW4gY3NoYXJwIG5zd2FnIFN3YWdnZXIuanNvbiBHZW5lcmF0ZWRDb2RlIC4vTlN3YWdPdXRwdXQuY3MKYGBgCgpIZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gZ2VuZXJhdGUgY29kZSB1c2luZyAqKlN3YWdnZXIgQ29kZWdlbiBDTEkqKgoKYGBgCnJhcGljZ2VuIGNzaGFycCBzd2FnZ2VyIFN3YWdnZXIuanNvbiBHZW5lcmF0ZWRDb2RlIC4vU3dhZ2dlck91dHB1dC5jcwpgYGAKCkhlcmUncyBhbiBleGFtcGxlIG9mIGhvdyB0byBnZW5lcmF0ZSBjb2RlIHVzaW5nICoqT3BlbkFQSSBHZW5lcmF0b3IqKgoKYGBgCnJhcGljZ2VuIGNzaGFycCBvcGVuYXBpIFN3YWdnZXIuanNvbiBHZW5lcmF0ZWRDb2RlIC4vT3BlbkFwaU91dHB1dC5jcwpgYGAKCkhlcmUncyBhbiBleGFtcGxlIG9mIGhvdyB0byBnZW5lcmF0ZSBjb2RlICoqSk1ldGVyKiogdGVzdCBwbGFucwoKYGBgCnJhcGljZ2VuIGptZXRlciBTd2FnZ2VyLmpzb24KYGBgCgpIZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gZ2VuZXJhdGUgY29kZSBmb3IgKipUeXBlU2NyaXB0KioKCmBgYApyYXBpY2dlbiB0eXBlc2NyaXB0IEFuZ3VsYXIgU3dhZ2dlci5qc29uCmBgYAoKIwoKRm9yIHRpcHMgYW5kIHRyaWNrcyBvbiBzb2Z0d2FyZSBkZXZlbG9wbWVudCwgY2hlY2sgb3V0IFtteSBibG9nXShodHRwczovL2NocmlzdGlhbmhlbGxlLmNvbSkKCklmIHlvdSBmaW5kIHRoaXMgdXNlZnVsIGFuZCBmZWVsIGEgYml0IGdlbmVyb3VzIHRoZW4gZmVlbCBmcmVlIHRvIFtidXkgbWUgYSBjb2ZmZWUg4piVXShodHRwczovL3d3dy5idXltZWFjb2ZmZWUuY29tL2NocmlzdGlhbmhlbGxlKQoK
- readmeEtag: '"7063ee8fed38c171ebe5aa7f81f4075c8179d249"'
- readmeLastModified: Fri, 27 Sep 2024 10:41:02 GMT
+ WyFbQnVpbGQgc3RhdHVzXShodHRwczovL2NpLmFwcHZleW9yLmNvbS9hcGkvcHJvamVjdHMvc3RhdHVzL2diMmRvZTN0Z3dqdDQ3Y24vYnJhbmNoL21hc3Rlcj9zdmc9dHJ1ZSldKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvY2hyaXN0aWFuaGVsbGUvYXBpY2xpZW50Y29kZWdlbi9icmFuY2gvbWFzdGVyKQohW0NMSSBUb29sXShodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvYXBpY2xpZW50Y29kZWdlbi93b3JrZmxvd3MvQ0xJJTIwVG9vbC9iYWRnZS5zdmcpCiFbVlNJWF0oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL2FwaWNsaWVudGNvZGVnZW4vd29ya2Zsb3dzL1ZTSVgvYmFkZ2Uuc3ZnKQohW1ZTIE1hY10oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL2FwaWNsaWVudGNvZGVnZW4vd29ya2Zsb3dzL1ZTJTIwTWFjL2JhZGdlLnN2ZykKIVtTbW9rZSBUZXN0c10oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL2FwaWNsaWVudGNvZGVnZW4vd29ya2Zsb3dzL1Ntb2tlJTIwVGVzdHMvYmFkZ2Uuc3ZnKQoKWyFbTWFpbnRhaW5hYmlsaXR5IFJhdGluZ10oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2FwaS9wcm9qZWN0X2JhZGdlcy9tZWFzdXJlP3Byb2plY3Q9Y2hyaXN0aWFuaGVsbGVfYXBpY2xpZW50Y29kZWdlbiZtZXRyaWM9c3FhbGVfcmF0aW5nKV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2Rhc2hib2FyZD9pZD1jaHJpc3RpYW5oZWxsZV9hcGljbGllbnRjb2RlZ2VuKQpbIVtSZWxpYWJpbGl0eSBSYXRpbmddKGh0dHBzOi8vc29uYXJjbG91ZC5pby9hcGkvcHJvamVjdF9iYWRnZXMvbWVhc3VyZT9wcm9qZWN0PWNocmlzdGlhbmhlbGxlX2FwaWNsaWVudGNvZGVnZW4mbWV0cmljPXJlbGlhYmlsaXR5X3JhdGluZyldKGh0dHBzOi8vc29uYXJjbG91ZC5pby9kYXNoYm9hcmQ/aWQ9Y2hyaXN0aWFuaGVsbGVfYXBpY2xpZW50Y29kZWdlbikKWyFbU2VjdXJpdHkgUmF0aW5nXShodHRwczovL3NvbmFyY2xvdWQuaW8vYXBpL3Byb2plY3RfYmFkZ2VzL21lYXN1cmU/cHJvamVjdD1jaHJpc3RpYW5oZWxsZV9hcGljbGllbnRjb2RlZ2VuJm1ldHJpYz1zZWN1cml0eV9yYXRpbmcpXShodHRwczovL3NvbmFyY2xvdWQuaW8vZGFzaGJvYXJkP2lkPWNocmlzdGlhbmhlbGxlX2FwaWNsaWVudGNvZGVnZW4pClshW0J1Z3NdKGh0dHBzOi8vc29uYXJjbG91ZC5pby9hcGkvcHJvamVjdF9iYWRnZXMvbWVhc3VyZT9wcm9qZWN0PWNocmlzdGlhbmhlbGxlX2FwaWNsaWVudGNvZGVnZW4mbWV0cmljPWJ1Z3MpXShodHRwczovL3NvbmFyY2xvdWQuaW8vZGFzaGJvYXJkP2lkPWNocmlzdGlhbmhlbGxlX2FwaWNsaWVudGNvZGVnZW4pClshW1Z1bG5lcmFiaWxpdGllc10oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2FwaS9wcm9qZWN0X2JhZGdlcy9tZWFzdXJlP3Byb2plY3Q9Y2hyaXN0aWFuaGVsbGVfYXBpY2xpZW50Y29kZWdlbiZtZXRyaWM9dnVsbmVyYWJpbGl0aWVzKV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2Rhc2hib2FyZD9pZD1jaHJpc3RpYW5oZWxsZV9hcGljbGllbnRjb2RlZ2VuKQpbIVtDb2RlIFNtZWxsc10oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2FwaS9wcm9qZWN0X2JhZGdlcy9tZWFzdXJlP3Byb2plY3Q9Y2hyaXN0aWFuaGVsbGVfYXBpY2xpZW50Y29kZWdlbiZtZXRyaWM9Y29kZV9zbWVsbHMpXShodHRwczovL3NvbmFyY2xvdWQuaW8vc3VtbWFyeS9uZXdfY29kZT9pZD1jaHJpc3RpYW5oZWxsZV9hcGljbGllbnRjb2RlZ2VuKQpbIVtDb3ZlcmFnZV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL2FwaS9wcm9qZWN0X2JhZGdlcy9tZWFzdXJlP3Byb2plY3Q9Y2hyaXN0aWFuaGVsbGVfYXBpY2xpZW50Y29kZWdlbiZtZXRyaWM9Y292ZXJhZ2UpXShodHRwczovL3NvbmFyY2xvdWQuaW8vc3VtbWFyeS9uZXdfY29kZT9pZD1jaHJpc3RpYW5oZWxsZV9hcGljbGllbnRjb2RlZ2VuKQoKWyFbVmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby92aXN1YWwtc3R1ZGlvLW1hcmtldHBsYWNlL3YvQ2hyaXN0aWFuUmVzbWFIZWxsZS5BcGlDbGllbnRDb2RlR2VuZXJhdG9yMjAyMj9sYWJlbD1NYXJrZXRwbGFjZSldKGh0dHBzOi8vbWFya2V0cGxhY2UudmlzdWFsc3R1ZGlvLmNvbS9pdGVtcz9pdGVtTmFtZT1DaHJpc3RpYW5SZXNtYUhlbGxlLkFQSUNsaWVudENvZGVHZW5lcmF0b3IyMDIyKSAKWyFbRG93bmxvYWRzXShodHRwczovL2ltZy5zaGllbGRzLmlvL3Zpc3VhbC1zdHVkaW8tbWFya2V0cGxhY2UvZC9DaHJpc3RpYW5SZXNtYUhlbGxlLkFwaUNsaWVudENvZGVHZW5lcmF0b3I/bGFiZWw9VlMlMjAyMDE5KV0oaHR0cHM6Ly9tYXJrZXRwbGFjZS52aXN1YWxzdHVkaW8uY29tL2l0ZW1zP2l0ZW1OYW1lPUNocmlzdGlhblJlc21hSGVsbGUuQVBJQ2xpZW50Q29kZUdlbmVyYXRvcikKWyFbUmF0aW5nXShodHRwczovL2ltZy5zaGllbGRzLmlvL3Zpc3VhbC1zdHVkaW8tbWFya2V0cGxhY2Uvc3RhcnMvQ2hyaXN0aWFuUmVzbWFIZWxsZS5BcGlDbGllbnRDb2RlR2VuZXJhdG9yKV0oaHR0cHM6Ly9tYXJrZXRwbGFjZS52aXN1YWxzdHVkaW8uY29tL2l0ZW1zP2l0ZW1OYW1lPUNocmlzdGlhblJlc21hSGVsbGUuQVBJQ2xpZW50Q29kZUdlbmVyYXRvcikKWyFbRG93bmxvYWRzXShodHRwczovL2ltZy5zaGllbGRzLmlvL3Zpc3VhbC1zdHVkaW8tbWFya2V0cGxhY2UvZC9DaHJpc3RpYW5SZXNtYUhlbGxlLkFQSUNsaWVudENvZGVHZW5lcmF0b3IyMDIyP2xhYmVsPVZTJTIwMjAyMildKGh0dHBzOi8vbWFya2V0cGxhY2UudmlzdWFsc3R1ZGlvLmNvbS9pdGVtcz9pdGVtTmFtZT1DaHJpc3RpYW5SZXNtYUhlbGxlLkFQSUNsaWVudENvZGVHZW5lcmF0b3IyMDIyKSAKWyFbUmF0aW5nXShodHRwczovL2ltZy5zaGllbGRzLmlvL3Zpc3VhbC1zdHVkaW8tbWFya2V0cGxhY2Uvc3RhcnMvQ2hyaXN0aWFuUmVzbWFIZWxsZS5BcGlDbGllbnRDb2RlR2VuZXJhdG9yMjAyMildKGh0dHBzOi8vbWFya2V0cGxhY2UudmlzdWFsc3R1ZGlvLmNvbS9pdGVtcz9pdGVtTmFtZT1DaHJpc3RpYW5SZXNtYUhlbGxlLkFQSUNsaWVudENvZGVHZW5lcmF0b3IyMDIyKQpbIVtOdUdldF0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9udWdldC9kdC9yYXBpY2dlbi5zdmc/c3R5bGU9ZmxhdC1zcXVhcmUmbGFiZWw9bnVnZXQpXShodHRwOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9yYXBpY2dlbikKClshW2J1eW1lYWNvZmZlZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9idXklMjBtZSUyMGElMjBjb2ZmZWUtZG9uYXRlLXllbGxvdy5zdmcpXShodHRwczovL3d3dy5idXltZWFjb2ZmZWUuY29tL2NocmlzdGlhbmhlbGxlKQpbIVtKb2luIHRoZSBjaGF0IGF0IGh0dHBzOi8vZ2l0dGVyLmltL2FwaWNsaWVudGNvZGVnZW4vY29tbXVuaXR5XShodHRwczovL2JhZGdlcy5naXR0ZXIuaW0vYXBpY2xpZW50Y29kZWdlbi9jb21tdW5pdHkuc3ZnKV0oaHR0cHM6Ly9naXR0ZXIuaW0vYXBpY2xpZW50Y29kZWdlbi9jb21tdW5pdHk/dXRtX3NvdXJjZT1iYWRnZSZ1dG1fbWVkaXVtPWJhZGdlJnV0bV9jYW1wYWlnbj1wci1iYWRnZSZ1dG1fY29udGVudD1iYWRnZSkKCiMgUkVTVCBBUEkgQ2xpZW50IENvZGUgR2VuZXJhdG9yCgpBIGNvbGxlY3Rpb24gb2YgVmlzdWFsIFN0dWRpbyBDIyBjdXN0b20gdG9vbCBjb2RlIGdlbmVyYXRvcnMgZm9yIFN3YWdnZXIgLyBPcGVuQVBJIHNwZWNpZmljYXRpb24gZmlsZXMKCiMjIERvd25sb2FkCgotICoqW1Zpc3VhbCBTdHVkaW8gMjAyMl0oaHR0cHM6Ly9tYXJrZXRwbGFjZS52aXN1YWxzdHVkaW8uY29tL2l0ZW1zP2l0ZW1OYW1lPUNocmlzdGlhblJlc21hSGVsbGUuQXBpQ2xpZW50Q29kZUdlbmVyYXRvcjIwMjIpKioKLSAqKltWaXN1YWwgU3R1ZGlvIDIwMTldKGh0dHBzOi8vbWFya2V0cGxhY2UudmlzdWFsc3R1ZGlvLmNvbS9pdGVtcz9pdGVtTmFtZT1DaHJpc3RpYW5SZXNtYUhlbGxlLkFwaUNsaWVudENvZGVHZW5lcmF0b3IpKioKLSAqKltWaXN1YWwgU3R1ZGlvIDIwMTddKGh0dHBzOi8vbWFya2V0cGxhY2UudmlzdWFsc3R1ZGlvLmNvbS9pdGVtcz9pdGVtTmFtZT1DaHJpc3RpYW5SZXNtYUhlbGxlLkFwaUNsaWVudENvZGVHZW5lcmF0b3IyMDE3KSoqCi0gKipbVmlzdWFsIFN0dWRpbyBmb3IgTWFjXShodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvYXBpY2xpZW50Y29kZWdlbi9yZWxlYXNlcy9sYXRlc3QpKiouIEZvbGxvdyAqKlt0aGVzZSBpbnN0cnVjdGlvbnNdKCN2aXN1YWwtc3R1ZGlvLWZvci1tYWMpKiogZm9yIHVwZGF0ZSBjb252ZW5pZW5jZSBvbiBWaXN1YWwgU3R1ZGlvIGZvciBNYWMKCiMjIEZlYXR1cmVzCgotIFN1cHBvcnRzIFZpc3VhbCBTdHVkaW8gMjAxNywgMjAxOSwgMjAyMiwgYW5kIFtWaXN1YWwgU3R1ZGlvIGZvciBNYWNdKCN2aXN1YWwtc3R1ZGlvLWZvci1tYWMpCi0gQWRkIE5ldyBSRVNUIEFQSSBDbGllbnQgdG8gYSBwcm9qZWN0IGZyb20gYW4gT3BlbkFQSSBzcGVjaWZpY2F0aW9uIFVSTCAoZS5nIDxodHRwczovL3BldHN0b3JlLnN3YWdnZXIuaW8vdjIvc3dhZ2dlci5qc29uPikgdXNpbmcgdGhlIGZvbGxvd2luZyBjb2RlIGdlbmVyYXRvcnM6CiAgLSBbTlN3YWddKGh0dHBzOi8vZ2l0aHViLmNvbS9SaWNvU3V0ZXIvTlN3YWcpCiAgLSBbT3BlbkFQSSBHZW5lcmF0b3JdKGh0dHBzOi8vZ2l0aHViLmNvbS9PcGVuQVBJVG9vbHMvb3BlbmFwaS1nZW5lcmF0b3IpCiAgLSBbU3dhZ2dlciBDb2RlZ2VuXShodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuKQogIC0gW1JlZml0dGVyXShodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIpCiAgLSBbTWljcm9zb2Z0IEtpb3RhXShodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L2tpb3RhKQogIC0gW0F1dG9SZXN0XShodHRwczovL2dpdGh1Yi5jb20vQXp1cmUvYXV0b3Jlc3QpCi0gRGVmaW5lIGN1c3RvbSBuYW1lc3BhY2UgZm9yIHRoZSBnZW5lcmF0ZWQgZmlsZQotIEF1dG8tdXBkYXRpbmcgb2YgZ2VuZXJhdGVkIGNvZGUgZmlsZSB3aGVuIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBKU09OIG9yIFlBTUwgZmlsZQotIEdlbmVyYXRlIGNvZGUgdXNpbmcgYSBjb25maWd1cmF0aW9uIGZpbGVzIHVzaW5nIHRoZSBmb2xsb3dpbmc6CiAgLSBgLm5zd2FnYCBjb25maWd1cmF0aW9uIGZpbGVzIGZyb20gW05Td2FnU3R1ZGlvXShodHRwczovL2dpdGh1Yi5jb20vUmljb1N1dGVyL05Td2FnL3dpa2kvTlN3YWdTdHVkaW8pIGJ5IGluY2x1ZGluZyBpdCBpbiB0aGUgcHJvamVjdCBhbmQgdXNpbmcgdGhlICoqR2VuZXJhdGUgTlN3YWcgU3R1ZGlvIG91dHB1dCoqIGNvbnRleHQgbWVudQogIC0gYC5yZWZpdHRlcmAgc2V0dGluZ3MgZmlsZXMgZnJvbSBbUmVmaXR0ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlcikgYnkgaW5jbHVkaW5nIGl0IGluIHRoZSBwcm9qZWN0IGFuZCB1c2luZyB0aGUgKipHZW5lcmF0ZSBSZWZpdHRlciBvdXRwdXQqKiBjb250ZXh0IG1lbnUKICAtIGBraW90YS1sb2NrLmpzb25gIGNvbmZpZ3VyYXRpb24gZmlsZXMgZnJvbSBbTWljcm9zb2Z0IEtpb3RhXShodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L2tpb3RhKSBieSBpbmNsdWRpbmcgaXQgaW4gdGhlIHByb2plY3QgYW5kIHVzaW5nIHRoZSAqKkdlbmVyYXRlIEtpb3RhIG91dHB1dCoqIGNvbnRleHQgbWVudQoKIyMjIEN1c3RvbSBUb29scwoKQ3VzdG9tIHRvb2xzIGxldCB5b3UgYXNzb2NpYXRlIGEgdG9vbCB3aXRoIGFuIGl0ZW0gaW4gYSBwcm9qZWN0IGFuZCBydW4gdGhhdCB0b29sIHdoZW5ldmVyIHRoZSBmaWxlIGlzIHNhdmVkCgotICoqKk5Td2FnQ29kZUdlbmVyYXRvcioqKiAtIEdlbmVyYXRlcyBhIHNpbmdsZSBmaWxlIEMjIFJFU1QgQVBJIENsaWVudCB1c2luZyB0aGUgW05Td2FnLkNvZGVHZW5lcmF0aW9uLkNTaGFycF0oaHR0cHM6Ly9naXRodWIuY29tL1JTdXRlci9OU3dhZy93aWtpL0NTaGFycENsaWVudEdlbmVyYXRvcikgW251Z2V0IHBhY2thZ2VdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9OU3dhZy5Db2RlR2VuZXJhdGlvbi5DU2hhcnAvKSAqKnYxNC4xLjAqKgoKLSAqKipPcGVuQXBpQ29kZUdlbmVyYXRvcioqKiAtIEdlbmVyYXRlcyBhIHNpbmdsZSBmaWxlIEMjIFJFU1QgQVBJIENsaWVudCB1c2luZyAqKltPcGVuQVBJIEdlbmVyYXRvciB2Ny44LjBdKGh0dHBzOi8vZ2l0aHViLmNvbS9PcGVuQVBJVG9vbHMvb3BlbmFwaS1nZW5lcmF0b3IvcmVsZWFzZXMvdGFnL3Y3LjguMCkqKi4KVGhlIG91dHB1dCBmaWxlIGlzIHRoZSByZXN1bHQgb2YgbWVyZ2luZyBhbGwgdGhlIGZpbGVzIGdlbmVyYXRlZCB1c2luZyB0aGUgT3BlbkFQSSBHZW5lcmF0b3IgdG9vbCB3aXRoOgpgZ2VuZXJhdGUgLWcgY3NoYXJwIC0taW5wdXQtc3BlYyBbc3dhZ2dlciBmaWxlXSAtLW91dHB1dCBbb3V0cHV0IGZpbGVdIC1EYXBpVGVzdHM9ZmFsc2UgLURtb2RlbFRlc3RzPWZhbHNlIC1EcGFja2FnZU5hbWU9W2RlZmF1bHQgbmFtZXNwYWNlXSAtLXNraXAtb3ZlcndyaXRlYC4gSXQgaXMgcG9zc2libGUgdG8gY29uZmlndXJlIHRoZSBPcGVuQVBJIEdlbmVyYXRvciB0byBnZW5lcmF0ZSBtdWx0aXBsZSBmaWxlcyB3aGljaCB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgc2FtZSBwYXRoIGFzIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb25zIGRvY3VtZW50IHRoYXQgd2FzIHVzZWQgdG8gZ2VuZXJhdGUgY29kZSwgdGhpcyBpcyBkb25lIHVuZGVyIFRvb2xzIC0+IFJFU1QgQVBJIENsaWVudCBDb2RlIEdlbmVyYXRvciAtPiBPcGVuQVBJIEdlbmVyYXRvciBhbmQgc2V0dGluZyAqKkdlbmVyYXRlIE11bHRpcGxlIEZpbGVzKiogdG8gKip0cnVlKioKCi0gKioqS2lvdGFDb2RlR2VuZXJhdG9yKioqIC0gR2VuZXJhdGVzIGEgc2luZ2xlIGZpbGUgQyMgUkVTVCBBUEkgQ2xpZW50IHVzaW5nIHRoZSBNaWNyb3NvZnQgcHJvamVjdCAqKltLaW90YSB2MS4xOC4wXShodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvb3BlbmFwaS9raW90YS8pKiogZ2VuZXJhdG9yLiBUaGUgb3V0cHV0IGZpbGUgaXMgdGhlIHJlc3VsdCBvZiBtZXJnaW5nIGFsbCB0aGUgZmlsZXMgZ2VuZXJhdGVkIHVzaW5nIHRoZSBLaW90YSBkb3RuZXQgdG9vbCB3aXRoOiBgZ2VuZXJhdGUgLWwgQ1NoYXJwIC1kIFtzd2FnZ2VyIGZpbGVdIC1vIFtvdXRwdXQgZmlsZV0gLW4gW2RlZmF1bHQgbmFtZXNwYWNlXWAuIEl0IGlzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSB0aGUgT3BlbkFQSSBHZW5lcmF0b3IgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgZmlsZXMgd2hpY2ggd2lsbCBiZSBwbGFjZWQgYXQgdGhlIHNhbWUgcGF0aCBhcyB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9ucyBkb2N1bWVudCB0aGF0IHdhcyB1c2VkIHRvIGdlbmVyYXRlIGNvZGUsIHRoaXMgaXMgZG9uZSB1bmRlciBUb29scyAtPiBSRVNUIEFQSSBDbGllbnQgQ29kZSBHZW5lcmF0b3IgLT4gS2lvdGEgYW5kIHNldHRpbmcgKipHZW5lcmF0ZSBNdWx0aXBsZSBGaWxlcyoqIHRvICoqdHJ1ZSoqCgotICoqKlN3YWdnZXJDb2RlR2VuZXJhdG9yKioqIC0gR2VuZXJhdGVzIGEgc2luZ2xlIGZpbGUgQyMgUkVTVCBBUEkgQ2xpZW50IHVzaW5nICoqU3dhZ2dlciBDb2RlZ2VuIENMSSB2My4wLjM0KiouClRoZSBvdXRwdXQgZmlsZSBpcyB0aGUgcmVzdWx0IG9mIG1lcmdpbmcgYWxsIHRoZSBmaWxlcyBnZW5lcmF0ZWQgdXNpbmcgdGhlIFN3YWdnZXIgQ29kZWdlbiBDTEkgdG9vbCB3aXRoOgpgZ2VuZXJhdGUgLWwgY3NoYXJwIC0taW5wdXQtc3BlYyBbc3dhZ2dlciBmaWxlXSAtLW91dHB1dCBbb3V0cHV0IGZpbGVdIC1EYXBpVGVzdHM9ZmFsc2UgLURtb2RlbFRlc3RzPWZhbHNlIC1EcGFja2FnZU5hbWU9W2RlZmF1bHQgbmFtZXNwYWNlXSAtLXNraXAtb3ZlcndyaXRlYAoKLSAqKipBdXRvUmVzdENvZGVHZW5lcmF0b3IqKiogLSBHZW5lcmF0ZXMgYSBzaW5nbGUgZmlsZSBDIyBSRVNUIEFQSSBDbGllbnQgdXNpbmcgKipBdXRvUmVzdCB2My4wLjAtYmV0YS4yMDIxMDUwNC4yKiogZm9yIE9wZW5BUEkgdjMgYW5kICoqQXV0b1Jlc3QgdjIuMC40NDE3KiogZm9yIE9wZW5BUEkgdjIuIFRoZSByZXN1bHRpbmcgZmlsZSBpcyB0aGUgZXF1aXZhbGVudCBvZiB1c2luZyB0aGUgQXV0b1Jlc3QgQ0xJIHRvb2wgd2l0aDoKIGAtLWNzaGFycCAtLWlucHV0LWZpbGU9W3N3YWdnZXIgZmlsZV0gLS1vdXRwdXQtZmlsZT1bb3V0cHV0IGZpbGVdIC0tbmFtZXNwYWNlPVtkZWZhdWx0IG5hbWVzcGFjZV0gLS1hZGQtY3JlZGVudGlhbHNgCgotICoqKlJlZml0dGVyQ29kZUdlbmVyYXRvcioqKiAtIEdlbmVyYXRlcyBhIHNpbmdsZSBmaWxlIEMjIFJFU1QgQVBJIENsaWVudCBpbnRlZmFjZSBmb3IgW1JlZml0XShodHRwczovL2dpdGh1Yi5jb20vcmVhY3RpdmV1aS9yZWZpdCkgdXNpbmcgW1JlZml0dGVyLkNvcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlcikgW251Z2V0IHBhY2thZ2VdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9SZWZpdHRlci5Db3JlLykgKip2MS4zLjIqKi4KVGhlIG91dHB1dCBmaWxlIGNvbnRhaW5zIGEgUmVmaXQgaW50ZXJmYWNlIGdlbmVyYXRlZCBieSBbUmVmaXR0ZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlcikgYW5kIGNvbnRyYWN0cyBnZW5lcmF0ZWQgdXNpbmcgW05Td2FnLkNvZGVHZW5lcmF0aW9uLkNTaGFycF0oaHR0cHM6Ly9naXRodWIuY29tL1JTdXRlci9OU3dhZy93aWtpL0NTaGFycENsaWVudEdlbmVyYXRvcikgW251Z2V0IHBhY2thZ2VdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9OU3dhZy5Db2RlR2VuZXJhdGlvbi5DU2hhcnAvKQoKIyMjIERlcGVuZGVuY2llcwoKVGhlIGN1c3RvbSB0b29sIGNvZGUgZ2VuZXJhdG9ycyBwaWdneSBiYWNrIG9uIHRvcCBvZiB3ZWxsIGtub3duIE9wZW4gQVBJIGNsaWVudCBjb2RlIGdlbmVyYXRvcnMgbGlrZSAqKkF1dG9SZXN0KiosICoqTlN3YWcqKiwgKipPcGVuQVBJIEdlbmVyYXRvcioqLCAqKk1pY3Jvc29mdCBLaW90YSoqLCAqKlJlZml0dGVyKiosIGFuZCAqKlN3YWdnZXIgQ29kZWdlbiBDTEkqKi4gVGhlc2UgdG9vbHMgcmVxdWlyZSBbTlBNXShodHRwczovL3d3dy5ucG1qcy5jb20vZ2V0LW5wbSkgYW5kIHRoZSBbSmF2YSBSdW50aW1lIEVudmlyb25tZW50XShodHRwczovL2phdmEuY29tL2VuL2Rvd25sb2FkL21hbnVhbC5qc3ApIHRvIGJlIGluc3RhbGxlZCBvbiB0aGUgZGV2ZWxvcGVycyBtYWNoaW5lLiBBbHRlcm5hdGl2ZSBKYXZhIFNESyBpbXBsZW1lbnRhdGlvbnMgc3VjaCBhcyB0aGUgW09wZW5KREtdKGh0dHBzOi8vYWRvcHRvcGVuamRrLm5ldCkgd29ya3MgZmluZSB3aXRoIHRoaXMgZXh0ZW5zaW9uLiBCeSBkZWZhdWx0LCB0aGUgcGF0aCB0byAqKmphdmEuZXhlKiogaXMgcmVhZCBmcm9tIHRoZSAqKkpBVkFfSE9NRSoqIGVudmlyb25tZW50IHZhcmlhYmxlLCBidXQgaXMgYWxzbyBjb25maWd1cmFibGUgaW4gdGhlIFNldHRpbmdzIHNjcmVlbi4gRnV0dXJlIHZlcnNpb25zIG9mIHRoZSBleHRlbnNpb24gd2lsbCBpbmNsdWRlIHRoZSBbT3BlbkpES10oaHR0cHM6Ly9hZG9wdG9wZW5qZGsubmV0KSBpbiB0aGUgVlNJWCBwYWNrYWdlCgpUaGUgKipTd2FnZ2VyIENvZGVnZW4gQ0xJKiogYW5kICoqT3BlbkFQSSBHZW5lcmF0b3IqKiBhcmUgZGlzdHJpYnV0ZWQgYXMgSkFSIGZpbGVzIGFuZCBhcmUgZG93bmxvYWRlZCBvbiBkZW1hbmQgYnV0IHJlcXVpcmVzIHRoZSBKYXZhIFNESyB0byBiZSBpbnN0YWxsZWQgb24gdGhlIG1hY2hpbmUuICoqQXV0b1Jlc3QqKiBpcyBpbnN0YWxsZWQgb24tZGVtYW5kIHZpYSBbTlBNXShodHRwczovL3d3dy5ucG1qcy5jb20vZ2V0LW5wbSkgYXMgYSBnbG9iYWwgdG9vbCBhbmQgdXNlcyB0aGUgbGF0ZXN0IGF2YWlsYWJsZSB2ZXJzaW9uLiAqKk1pY3Jvc29mdCBLaW90YSoqIGlzIGluc3RhbGxlZCBvbi1kZW1hbmQgYXMgYSAuTkVUIFRvb2wgYW5kIHJlcXVpcmVzIC5ORVQgNy4wLiBUaGlzIG1lYW5zIHRoYXQgdXNpbmcgdGhlc2UgY3VzdG9tIHRvb2xzIGhhdmUgYW4gaW5pdGlhbCBkZWxheSB1cG9uIGZpcnN0IHRpbWUgdXNlLiAKCioqTlN3YWdTdHVkaW8qKiBpcyBzdGFuZCBhbG9uZSBVSSB0b29sIGZvciBlZGl0aW5nIGEgKioubnN3YWcqKiBzcGVjaWZpY2F0aW9uIGZpbGUgZm9yIGdlbmVyYXRpbmcgY29kZS4gVGhpcyB0b29sIGlzIG9wdGlvbmFsIHRvIGluc3RhbGwgYW5kIG9mZmljaWFsIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgW05Td2FnIFdpa2kgb24gR2l0aHViXShodHRwczovL2dpdGh1Yi5jb20vUmljb1N1dGVyL05Td2FnL3dpa2kvTlN3YWdTdHVkaW8pLiBJZiAqKk5Td2FnU3R1ZGlvKiogaXMgbm90IGluc3RhbGxlZCBvbiB0aGUgbWFjaGluZSB0aGVuIHRoZSBWaXN1YWwgU3R1ZGlvIEV4dGVuc2lvbiB3aWxsIGluc3RhbGwgdGhlICoqTlN3YWcgQ0xJKiogdmlhIFtOUE1dKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9nZXQtbnBtKSBhcyBhIGdsb2JhbCB0b29sIHVzaW5nIHRoZSBsYXRlc3QgYXZhaWxhYmxlIHZlcnNpb24uIAoKVGhlICoqTlN3YWcqKiBjb2RlIGdlbmVyYXRvciBwcm9kdWNlcyBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGUgW05ld3RvbnNvZnQuSnNvbl0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL05ld3RvbnNvZnQuSnNvbi8xMy4wLjMpIE51R2V0IHBhY2thZ2UKClRoZSAqKlJlZml0dGVyKiogY29kZSBnZW5lcmF0b3IgcHJvZHVjZXMgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhlIFtSZWZpdF0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL1JlZml0LzcuMC4wKSBOdUdldCBwYWNrYWdlCgpUaGUgKipPcGVuQVBJIEdlbmVyYXRvcioqIGNvZGUgZ2VuZXJhdG9yIHByb2R1Y2VzIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoZSBmb2xsb3dpbmcgTnVHZXQgcGFja2FnZXM6CgotIFtSZXN0U2hhcnBdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9SZXN0U2hhcnAvMTEyLjAuMCkKLSBbSnNvblN1YlR5cGVzXShodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvSnNvblN1YlR5cGVzLzIuMC4xKQotIFtQb2xseV0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL1BvbGx5LzguNC4yKQotIFtOZXd0b25zb2Z0Lkpzb25dKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9OZXd0b25zb2Z0Lkpzb24vMTMuMC4zKQoKVGhlIHByb2plY3QgKipLaW90YSoqIGNvZGUgZ2VuZXJhdG9yIHByb2R1Y2VzIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoZSBmb2xsb3dpbmcgTnVHZXQgcGFja2FnZXMKCi0gW01pY3Jvc29mdC5LaW90YS5BYnN0cmFjdGlvbnNdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9NaWNyb3NvZnQuS2lvdGEuQWJzdHJhY3Rpb25zKQotIFtNaWNyb3NvZnQuS2lvdGEuSHR0cC5IdHRwQ2xpZW50TGlicmFyeV0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL01pY3Jvc29mdC5LaW90YS5IdHRwLkh0dHBDbGllbnRMaWJyYXJ5KQotIFtNaWNyb3NvZnQuS2lvdGEuU2VyaWFsaXphdGlvbi5Gb3JtXShodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvTWljcm9zb2Z0Lktpb3RhLlNlcmlhbGl6YXRpb24uRm9ybSkKLSBbTWljcm9zb2Z0Lktpb3RhLlNlcmlhbGl6YXRpb24uVGV4dF0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL01pY3Jvc29mdC5LaW90YS5TZXJpYWxpemF0aW9uLlRleHQpCi0gW01pY3Jvc29mdC5LaW90YS5TZXJpYWxpemF0aW9uLkpzb25dKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9NaWNyb3NvZnQuS2lvdGEuU2VyaWFsaXphdGlvbi5Kc29uKQotIFtNaWNyb3NvZnQuS2lvdGEuU2VyaWFsaXphdGlvbi5NdWx0aXBhcnRdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9NaWNyb3NvZnQuS2lvdGEuU2VyaWFsaXphdGlvbi5NdWx0aXBhcnQpCi0gW01pY3Jvc29mdC5LaW90YS5BdXRoZW50aWNhdGlvbi5BenVyZV0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL01pY3Jvc29mdC5LaW90YS5BdXRoZW50aWNhdGlvbi5BenVyZSkKLSBbQXp1cmUuSWRlbnRpdHldKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9BenVyZS5JZGVudGl0eSkKClRoZSAqKlN3YWdnZXIgQ29kZWdlbiBDTEkqKiBjb2RlIGdlbmVyYXRvciBwcm9kdWNlcyBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGUgW1Jlc3RTaGFycF0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL1Jlc3RTaGFycC8xMDUuMS4wKSBhbmQgW0pzb25TdWJUeXBlc10oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL0pzb25TdWJUeXBlcy8xLjkuMCkgTnVHZXQgcGFja2FnZXMKClRoZSAqKkF1dG9SZXN0KiogY29kZSBnZW5lcmF0b3IgcHJvZHVjZXMgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhlIFtNaWNyb3NvZnQuUmVzdC5DbGllbnRSdW50aW1lXShodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvTWljcm9zb2Z0LlJlc3QuQ2xpZW50UnVudGltZS8yLjMuMjQpIGFuZCBbTmV3dG9uc29mdC5Kc29uXShodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvTmV3dG9uc29mdC5Kc29uLzEzLjAuMykgTnVHZXQgcGFja2FnZXMKClRoaXMgVmlzdWFsIFN0dWRpbyBFeHRlbnNpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgcmVxdWlyZWQgTnVHZXQgcGFja2FnZXMgdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgZGVwZW5kcyBvbgoKIyMgU2NyZWVuc2hvdHMKCiFbQWRkIC0gQVBJIENsaWVudCBmcm9tIE9wZW5BUEkgU3BlY2lmaWNhdGlvbl0oaW1hZ2VzL2FkZC1uZXctbWVudS5wbmcpCgohW0VudGVyIFVSTCB0byBPcGVuQVBJIFNwZWNpZmljYXRpb25dKGltYWdlcy9hZGQtbmV3LWRpYWxvZy5wbmcpCgohW1NvbHV0aW9uIEV4cGxvcmVyIENvbnRleHQgTWVudXNdKGltYWdlcy9zb2x1dGlvbi1leHBsb3Jlci1jb250ZXh0LW1lbnUuanBnKQoKIVtOU3dhZyBTdHVkaW8gQ29udGV4dCBNZW51XShpbWFnZXMvbnN3YWdzdHVkaW8tY29udGV4dC1tZW51LmpwZykKCiFbUmVmaXR0ZXIgQ29udGV4dCBNZW51XShpbWFnZXMvcmVmaXR0ZXItY29tbWFuZC5wbmcpCgohW0tpb3RhIENvbnRleHQgTWVudV0oaW1hZ2VzL2dlbmVyYXRlLWtpb3RhLW91dHB1dC5wbmcpCgojIyMgU2V0dGluZ3MKClRoaXMgZXh0ZW5zaW9uIHdpbGwgYnkgZGVmYXVsdCBtYWtlIHNvbWUgYXNzdW1wdGlvbnMgb24gdGhlIGluc3RhbGxhdGlvbiBwYXRocyBmb3IgKipKYXZhKiosICoqTlN3YWcqKiBhbmQgKipOUE0qKiBidXQgYWxzbyBwcm92aWRlcyBvcHRpb24gcGFnZXMgZm9yIGNvbmZpZ3VyaW5nIHRoaXMuIFRoZSAqKlN3YWdnZXIgQ29kZWdlbiBDTEkqKiBhbmQgdGhlICoqT3BlbkFQSSBHZW5lcmF0b3IqKiBKQVIgZmlsZXMgYXJlIGJ5IGRlZmF1bHQgZG93bmxvYWRlZCB0byB0aGUgdXNlciBURU1QIGZvbGRlciBidXQgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IHRvIHVzZSBleGlzdGluZyBKQVIgZmlsZXMKCiFbT3B0aW9ucyAtIEdlbmVyYWxdKGltYWdlcy9vcHRpb25zLWdlbmVyYWwucG5nKQoKU3VwcG9ydHMgY3VzdG9taXNpbmcgaG93IEF1dG9SZXN0IGdlbmVyYXRlcyBjb2RlIGJhc2VkIG9uIHRoZSBDIyBnZW5lcmF0b3Igc2V0dGluZ3MgdGhhdCB0aGUgQXV0b1Jlc3QgQ0xJIHRvb2wgcHJvdmlkZXMKCiFbT3B0aW9ucyAtIEF1dG9SZXN0XShpbWFnZXMvb3B0aW9ucy1hdXRvcmVzdC5wbmcpCgpTdXBwb3J0cyBjdXN0b21pc2luZyBob3cgTlN3YWcgZ2VuZXJhdGVzIGNvZGUgdXNpbmcgdGhlIHByb3BlcnRpZXMgZXhwb3NlZCBieSB0aGUgTlN3YWcgTnVHZXQgcGFja2FnZQoKIVtPcHRpb25zIC0gTlN3YWddKGltYWdlcy9vcHRpb25zLW5zd2FnLnBuZykKClN1cHBvcnRzIGN1c3RvbWlzaW5nIGhvdyB0aGUgKioubnN3YWcqKiBmaWxlIGlzIGdlbmVyYXRlZCB1c2luZyBhIHN1YnNldCBvZiB0aGUgb3B0aW9ucyBhdmFpbGFibGUgaW4gTlN3YWcgU3R1ZGlvCgohW09wdGlvbnMgLSBOU3dhZyBTdHVkaW9dKGltYWdlcy9vcHRpb25zLW5zd2Fnc3R1ZGlvLnBuZykKClN1cHBvcnRzIGN1c3RvbWlzaW5nIGhvdyBPcGVuQVBJIEdlbmVyYXRvciBnZW5lcmF0ZXMgY29kZSB1c2luZyB0aGUgYWRkaXRpb25hbCBvcHRpb25hbCBwcm9wZXJ0aWVzIHRoYXQgdGhlIE9wZW5BUEkgR2VuZXJhdG9yIENMSSB0b29sIHByb3ZpZGVzCgohW09wdGlvbnMgLSBPcGVuQVBJIEdlbmVyYXRvcl0oaW1hZ2VzL29wdGlvbnMtb3BlbmFwaWdlbmVyYXRvci5wbmcpCgpTdXBwb3J0cyBjdXN0b21pc2luZyBob3cgUmVmaXR0ZXIgZ2VuZXJhdGVzIHRoZSBSZWZpdCBpbnRlcmZhY2UuIFRoaXMgYWxsb3dzIHlvdSB0byBjb25maWd1cmUgd2hldGhlciB0byByZXR1cm4gdGhlIHR5cGUgZGlyZWN0bHkgb3Igd3JhcCBpdCBpbnNpZGUgYW4gYElBcGlSZXNwb25zZTxUPmAuIFlvdSBjYW4gYWxzbyBkaXNhYmxlIGdlbmVyYXRpbmcgY29udHJhY3RzIG9yIFhNTCBkb2Mgc3R5bGUgY29tbWVudHMKCiFbT3B0aW9ucyAtIFJlZml0dGVyXShpbWFnZXMvcmVmaXR0ZXItb3B0aW9ucy5wbmcpCgpTdXBwb3J0cyBhbGxvd2luZyBLaW90YSB0byBnZW5lcmF0ZSBtdWx0aXBsZSBmaWxlcwoKIVtPcHRpb25zIC0gS2lvdGFdKGltYWdlcy9vcHRpb25zLWtpb3RhLnBuZykKClRoaXMgZXh0ZW5zaW9uIGNvbGxlY3RzIGVycm9ycyBhbmQgdHJhY2tzIGZlYXR1cmUgdXNhZ2VzIHRvIGEgc2VydmljZSBjYWxsZWQgW0V4Y2VwdGlvbmxlc3NdKGh0dHBzOi8vZXhjZXB0aW9ubGVzcy5jb20pIGFuZCBbQXp1cmUgQXBwbGljYXRpb24gSW5zaWdodHNdKGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9henVyZS1tb25pdG9yL2FwcC9hcHAtaW5zaWdodHMtb3ZlcnZpZXc/V1QubWNfaWQ9RFQtTVZQLTUwMDQ4MjIpLiBUaGlzIGlzIGRvbmUgYW5vbnltb3VzbHkgdXNpbmcgYSBzdXBwb3J0IGtleSBhbmQgYSBnZW5lcmF0ZWQgYW5vbnltb3VzIGlkZW50aXR5IGJhc2VkIG9uIGEgc2VjdXJlIGhhc2ggb2YgdXNlcm5hbWVAaG9zdAoKIVtPcHRpb25zIC0gQW5hbHl0aWNzXShpbWFnZXMvc3VwcG9ydC1rZXkucG5nKQoKIyMjIE1hY09TCgohW0FkZCAtIEFQSSBDbGllbnQgZnJvbSBPcGVuQVBJIFNwZWNpZmljYXRpb25dKGltYWdlcy92c21hYy1hZGQtbmV3LW1lbnUucG5nKQoKIVtFbnRlciBVUkwgdG8gT3BlbkFQSSBTcGVjaWZpY2F0aW9uXShpbWFnZXMvdnNtYWMtYWRkLW5ldy1kaWFsb2cucG5nKQoKIVtTb2x1dGlvbiBFeHBsb3JlciBDb250ZXh0IE1lbnVzXShpbWFnZXMvdnNtYWMtZ2VuZXJhdGUtY29kZS5wbmcpCgohW05Td2FnIFN0dWRpbyBDb250ZXh0IE1lbnVdKGltYWdlcy92c21hYy1uc3dhZy1zdHVkaW8ucG5nKQoKIyBJbnN0YWxsYXRpb24KClRoZSBWaXN1YWwgU3R1ZGlvIGV4dGVuc2lvbiBjYW4gYmUgaW5zdGFsbGVkIGRpcmVjdGx5IGZyb20gVmlzdWFsIFN0dWRpbyAyMDE5IGFuZCAyMDIyIHZpYSB0aGUgKipFeHRlbnNpb25zIERpYWxvZyBCb3gqKi4gVGhlIHByb2Nlc3MgaXMgYmVzdCBkZXNjcmliZWQgaW4gdGhlIG9mZmljaWFsIE1pY3Jvc29mdCBkb2N1bWVudGF0aW9uIGZvciBbTWFuYWdpbmcgZXh0ZW5zaW9ucyBmb3IgVmlzdWFsIFN0dWRpb10oaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvdmlzdWFsc3R1ZGlvL2lkZS9maW5kaW5nLWFuZC11c2luZy12aXN1YWwtc3R1ZGlvLWV4dGVuc2lvbnM/dmlldz12cy0yMDE5JldULm1jX2lkPURULU1WUC01MDA0ODIyKQoKIyMgVmlzdWFsIFN0dWRpbyBmb3IgTWFjCgpUaGlzIGluc3RhbGxhdGlvbiBwcm9jZXNzIGZvciAqKlZpc3VhbCBTdHVkaW8gZm9yIE1hYyoqIGlzIGN1cnJlbnRseSBhIGJpdCB0cm91Ymxlc29tZSBhcyB0aGUgTW9ub0RldmVsb3AgQWRkaW4gUmVwb3NpdG9yeSBpcyBjdXJyZW50bHkgbm90IGFjY2VwdGluZyBuZXcgdXNlcnMgc28gSSBjYW4ndCByZWFsbHkgcmVnaXN0ZXIgYW5kIHNldHVwIG15IGV4dGVuc2lvbi4KClRoZXJlIGFyZSAyIHdheXMgb2YgaW5zdGFsbGluZyBteSBleHRlbnNpb24gb24gVmlzdWFsIFN0dWRpbyBmb3IgTWFjOiBBZGRpbmcgYSBjdXN0b20gZXh0ZW5zaW9uIHJlcG9zaXRvcnkgb3IgSW5zdGFsbGluZyB0aGUgKioubXBhY2sqKiBmaWxlIGRpcmVjdGx5IGZyb20gdGhlIEV4dGVuc2lvbnMgTWFuYWdlcgoKIyMjIEFkZGluZyBhIG5ldyBleHRlbnNpb24gcmVwb3NpdG9yeQoKSGVyZSdzIHdoYXQgeW91IG5lZWQgdG8gZG86CgotIE9wZW4gdGhlIFZpc3VhbCBTdHVkaW8gZm9yIE1hYyAqKkV4dGVuc2lvbiBNYW5hZ2VyKioKLSBZb3UgY2FuIGRvIHRoaXMgZnJvbSB0aGUgbWVudSAqKlZpc3VhbCBTdHVkaW8qKiAtPiAqKkV4dGVudGlvbnMqKgoKIVtPcGVuIEV4dGVuc2lvbnMgRGlhbG9nIEJveF0oaW1hZ2VzL3ZzbWFjLWV4dGVuc2lvbnMtbWVudS5wbmcpCgotIFNlbGVjdCB0aGUgKipHYWxsZXJ5KiogVGFiCi0gRXhwYW5kIHRoZSBSZXBvc2l0b3J5IGRyb3AgZG93biBib3ggYW5kIHNlbGVjdCAqKk1hbmFnZSBSZXBvc2l0b3JpZXMqKgoKIVtNYW5hZ2UgUmVwb3NpdG9yaWVzXShpbWFnZXMvdnNtYWMtZXh0ZW5zaW9ucy1tYW5hZ2UtcmVwb3NpdG9yaWVzLnBuZykKCi0gUHJlc3Mgb24gdGhlICoqQWRkKiogYnV0dG9uIHRvIGFkZCBhIG5ldyBjdXN0b20gZXh0ZW5zaW9uIHJlcG9zaXRvcnkKCiFbTWFuYWdlIFJlcG9zaXRvcmllc10oaW1hZ2VzL3ZzbWFjLWV4dGVuc2lvbnMtcmVwb3NpdG9yaWVzLnBuZykKCi0gUmVnaXN0ZXIgYW4gb25saW5lIHJlcG9zaXRvcnkgYXQgKipodHRwczovL2NocmlzdGlhbmhlbGxlLmNvbS92c21hYy9tYWluLm1yZXAqKgotIENsaWNrICoqT0sqKgoKIVtBZGQgUmVwb3NpdG9yeV0oaW1hZ2VzL3ZzbWFjLWV4dGVuc2lvbnMtYWRkLXJlcG9zaXRvcnkucG5nKQoKLSBOb3cgbXkgZXh0ZW5zaW9uIHJlcG9zaXRvcnkgaXMgYWRkZWQgdG8gdGhlIGxpc3QKLSBNYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGVuYWJsZWQgKGluZGljYXRlZCBieSBhIGNoZWNrIGJveCkKCiFbQWRkIFJlcG9zaXRvcnkgRGlhbG9nXShpbWFnZXMvdnNtYWMtZXh0ZW5zaW9ucy1hZGRlZC1yZXBvc2l0b3J5LnBuZykKCi0gWW91IHNob3VsZCBub3cgYmUgYWJsZSB0byBzZWUgbXkgZXh0ZW5zaW9ucyBmcm9tIHRoZSAqKkdhbGxlcnkqKiB0YWIKCiFbQWRkZWQgUmVwb3NpdG9yeV0oaW1hZ2VzL3ZzbWFjLWV4dGVuc2lvbnMtZ2FsbGVyeS5wbmcpCgotIEJ5IGFkZGluZyBteSBleHRlbnNpb24gcmVwb3NpdG9yeSB5b3Ugd2lsbCBiZSBhYmxlIHRvIGNvbnZlbmllbnRseSB1cGRhdGUgbXkgZXh0ZW5zaW9uIHVzaW5nIHRoZSBWaXN1YWwgU3R1ZGlvIGZvciBNYWMgRXh0ZW5zaW9uIE1hbmFnZXIKCiFbQWRkIFJlcG9zaXRvcnldKGltYWdlcy92c21hYy11cGRhdGVzLnBuZykKCiFbQWRkIFJlcG9zaXRvcnldKGltYWdlcy92c21hYy11cGRhdGUtaW5zdGFsbC5wbmcpCgohW0FkZCBSZXBvc2l0b3J5XShpbWFnZXMvdnNtYWMtdXBkYXRlLWluc3RhbGwtcHJvZ3Jlc3MucG5nKQoKIyMjIEluc3RhbGxpbmcgdGhlICoqLm1wYWNrKiogZmlsZSBkaXJlY3RseQoKSGVyZSdzIHdoYXQgeW91IG5lZWQgdG8gZG86Ci0gRG93bmxvYWQgdGhlIGxhdGVzdCAqKi5tcGFjayBmaWxlKiogZnJvbSB0aGUgW0xhdGVzdCBHaXRodWIgUmVsZWFzZV0oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL2FwaWNsaWVudGNvZGVnZW4vcmVsZWFzZXMvbGF0ZXN0KQotIE5vdyBmcm9tIHdpdGhpbiBWaXN1YWwgU3R1ZGlvIGZvciBNYWMgeW91IG5lZWQgdG8gbGF1bmNoIHRoZSAqKkV4dGVuc2lvbnMgRGlhbG9nIEJveCoqLiBZb3UgY2FuIGRvIHRoaXMgZnJvbSB0aGUgbWVudSAqKlZpc3VhbCBTdHVkaW8qKiAtPiAqKkV4dGVudGlvbnMqKgoKIVtPcGVuIEV4dGVuc2lvbnMgRGlhbG9nIEJveF0oaW1hZ2VzL3ZzbWFjLWV4dGVuc2lvbnMtbWVudS5wbmcpCgotIENsaWNrIG9uIHRoZSAqKkluc3RhbGwgZnJvbSBGaWxlKiogYnV0dG9uCgohW01hbnVhbGx5IGluc3RhbGwgLm1wYWNrIGZpbGVdKGltYWdlcy92c21hYy1leHRlbnNpb25zLWluc3RhbGwucG5nKQoKLSBCcm93c2UgdG8gdGhlIC5tcGFjayBmaWxlIGFuZCBzZWxlY3QgaXQuIFlvdSB3aWxsIGJlIHByb21wdGVkIHdpdGggYSBjb25maXJtYXRpb24gZGlhbG9nCgohW0NvbmZpcm0gLm1wYWNrIGZpbGUgaW5zdGFsbF0oaW1hZ2VzL3ZzbWFjLWV4dGVuc2lvbnMtaW5zdGFsbC1jb25maXJtLnBuZykKCi0gQ2xpY2sgKipJbnN0YWxsKiogYW5kIHJlc3RhcnQgVmlzdWFsIFN0dWRpbyBmb3IgTWFjCi0gVG8gVmVyaWZ5IHRoYXQgdGhlIEFkZC1pbiB3YXMgaW5zdGFsbGVkIHlvdSBjYW4gcmUtb3BlbiB0aGUgRXh0ZW5zaW9ucyBEaWFsb2cgQm94LCBzZWxlY3QgdGhlICoqSW5zdGFsbGVkKiogdGFiIGFuZCBleHBhbmQgdGhlICoqSURFIEV4dGVuc2lvbnMqKi4gWW91IHNob3VsZCBiZSBhYmxlIHRvIHNlZSB0aGUgKipSRVNUIEFQSSBDbGllbnQgQ29kZSBHZW5lcmF0b3IqKi4KCi0gVW5pbnN0YWxsaW5nIHRoZSBBZGQtaW4gaXMgZG9uZSBpbiB0aGlzIHNhbWUgZGlhbG9nIGJveCBieSBjbGlja2luZyB0aGUgKipVbmluc3RhbGwqKiBidXR0b24KCiFbTWFudWFsbHkgdW5pbnN0YWxsIEFkZC1pbl0oaW1hZ2VzL3ZzbWFjLWV4dGVuc2lvbnMtdW5pbnN0YWxsLnBuZykKCgojIENyb3NzIFBsYXRmb3JtIENvbW1hbmQgTGluZSBUb29sCkFsbCBjdXN0b20gdG9vbHMgbWVudGlvbmVkIGFib3ZlIGFyZSBhbHNvIGltcGxlbWVudGVkIGluIGEgY3Jvc3MgcGxhdGZvcm0gY29tbWFuZCBsaW5lIGFwcGxpY2F0aW9uCgojIyMjIFJlcXVpcmVtZW50cwotIC5ORVQgNi4wIHJ1bnRpbWUKLSBKYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnQKLSBOUE0KCiMjIyBJbnN0YWxsYXRpb24KVGhlIHRvb2wgY2FuIGJlIGluc3RhbGxlZCBhcyBhIC5ORVQgQ29yZSBnbG9iYWwgdG9vbCB0aGF0IHlvdSBjYW4gY2FsbCBmcm9tIHRoZSBzaGVsbCAvIGNvbW1hbmQgbGluZQpgYGAKZG90bmV0IHRvb2wgaW5zdGFsbCAtLWdsb2JhbCByYXBpY2dlbgpgYGAKb3IgYnkgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbnMgW2hlcmVdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9yYXBpY2dlbikgdG8gaW5zdGFsbCBhIHNwZWNpZmljIHZlcnNpb24gb2YgdG9vbAoKIyMjIFVzYWdlClNpbmNlIHRoZSB0b29sIGlzIHB1Ymxpc2hlZCBhcyBhIC5ORVQgQ29yZSBUb29sLCBpdCBjYW4gYmUgbGF1bmNoZWQgZnJvbSBhbnl3aGVyZSB1c2luZyBhbnkgY29tbWFuZCBsaW5lIGludGVyZmFjZSBieSBjYWxsaW5nICoqcmFwaWNnZW4qKi4KVGhlIGhlbHAgaW5mb3JtYXRpb24gaXMgZGlzcGxheWVkIHdoZW4gbm90IHNwZWNpZnlpbmcgYW55IGFyZ3VtZW50cyB0byAqKnJhcGljZ2VuKioKCmBgYApVc2FnZTogcmFwaWNnZW4gW2NvbW1hbmRdIFtvcHRpb25zXQoKT3B0aW9uczoKICAtdnwtLXZlcmJvc2UgICAgICAgU2hvdyB2ZXJib3NlIG91dHB1dAogIC0/fC1ofC0taGVscCAgICAgICBTaG93IGhlbHAgaW5mb3JtYXRpb24uCgpDb21tYW5kczoKICBjc2hhcnAgICAgICAgICAgICAgR2VuZXJhdGUgQyMgQVBJIGNsaWVudHMKICBqbWV0ZXIgICAgICAgICAgICAgR2VuZXJhdGUgQXBhY2hlIEpNZXRlciB0ZXN0IHBsYW5zCiAgb3BlbmFwaS1nZW5lcmF0b3IgIEdlbmVyYXRlIGNvZGUgdXNpbmcgT3BlbkFQSSBHZW5lcmF0b3IgKHY3LjguMCkuCiAgICAgICAgICAgICAgICAgICAgIFNlZSBzdXBwb3J0ZWQgZ2VuZXJhdG9ycyBhdCBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gvZG9jcy9nZW5lcmF0b3JzLwogIHR5cGVzY3JpcHQgICAgICAgICBHZW5lcmF0ZSBUeXBlU2NyaXB0IEFQSSBjbGllbnRzCgpSdW4gJ3JhcGljZ2VuIFtjb21tYW5kXSAtP3wtaHwtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgY29tbWFuZC4KYGBgCgpTb21lIGhlbHAgaW5mb3JtYXRpb24gaXMgYWxzbyBwcm92aWRlZCBwZXIgY29tbWFuZCBhbmQgY2FuIGJlIGxhdW5jaGVkIGJ5IAoKYGBgCnJhcGljZ2VuIFtjb21tYW5kIG5hbWVdIC0/CmBgYAoKb3IKCmBgYApyYXBpY2dlbiBbY29tbWFuZCBuYW1lXSBbc3ViIGNvbW1hbmQgbmFtZV0gLT8KYGBgCgpGb3IgZXhhbXBsZToKCmBgYApyYXBpY2dlbiBjc2hhcnAgLT8KYGBgIAoKd2lsbCBvdXRwdXQgdGhpczoKCmBgYApHZW5lcmF0ZSBDIyBBUEkgY2xpZW50cwoKVXNhZ2U6IHJhcGljZ2VuIGNzaGFycCBbY29tbWFuZF0gW29wdGlvbnNdCgpPcHRpb25zOgogIC0/fC1ofC0taGVscCAgU2hvdyBoZWxwIGluZm9ybWF0aW9uLgoKQ29tbWFuZHM6CiAgYXV0b3Jlc3QgICAgICBBdXRvUmVzdCAodjMuMC4wLWJldGEuMjAyMTA1MDQuMikKICBraW90YSAgICAgICAgIE1pY3Jvc29mdCBLaW90YSAodjEuMTguMCkKICBuc3dhZyAgICAgICAgIE5Td2FnICh2MTQuMS4wKQogIG9wZW5hcGkgICAgICAgT3BlbkFQSSBHZW5lcmF0b3IgKHY3LjguMCkKICByZWZpdHRlciAgICAgIFJlZml0dGVyICh2MS4zLjIpCiAgc3dhZ2dlciAgICAgICBTd2FnZ2VyIENvZGVnZW4gQ0xJICh2My4wLjM0KQoKUnVuICdjc2hhcnAgW2NvbW1hbmRdIC0/fC1ofC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSBjb21tYW5kLgoKYGBgCgphbmQKCmBgYApyYXBpY2dlbiBjc2hhcnAgYXV0b3Jlc3QgLT8KYGBgCgp3aWxsIG91dHB1dCB0aGlzOgoKYGBgCkdlbmVyYXRlIFN3YWdnZXIgLyBPcGVuIEFQSSBjbGllbnQgdXNpbmcgQXV0b1Jlc3QKClVzYWdlOiBydW4gYXV0b3Jlc3QgW29wdGlvbnNdIDxzd2FnZ2VyRmlsZT4gPG5hbWVzcGFjZT4gPG91dHB1dEZpbGU+CgpBcmd1bWVudHM6CiAgc3dhZ2dlckZpbGUgICBQYXRoIHRvIHRoZSBTd2FnZ2VyIC8gT3BlbiBBUEkgc3BlY2lmaWNhdGlvbiBmaWxlCiAgbmFtZXNwYWNlICAgICBEZWZhdWx0IG5hbWVzcGFjZSB0byBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUKICBvdXRwdXRGaWxlICAgIE91dHB1dCBmaWxlbmFtZSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGNvZGUgdG8uIERlZmF1bHQgaXMgdGhlIHN3YWdnZXJGaWxlIC5jcwoKT3B0aW9uczoKICAtP3wtaHwtLWhlbHAgIFNob3cgaGVscCBpbmZvcm1hdGlvbgpgYGAKCm9yIAoKYGBgCnJhcGljZ2VuIHR5cGVzY3JpcHQgLT8KYGBgCgp3aWxsIG91dHB1dCB0aGlzOgoKYGBgCkdlbmVyYXRlIFR5cGVTY3JpcHQgQVBJIGNsaWVudAoKVXNhZ2U6IHJhcGljZ2VuIHR5cGVzY3JpcHQgW29wdGlvbnNdIDxnZW5lcmF0b3I+IDxzd2FnZ2VyRmlsZT4gPG91dHB1dFBhdGg+CgpBcmd1bWVudHM6CiAgZ2VuZXJhdG9yICAgICAgICAgVGhlIHRlY2ggc3RhY2sgdG8gdXNlIGZvciB0aGUgZ2VuZXJhdGVkIGNsaWVudCBsaWJyYXJ5CiAgICAgICAgICAgICAgICAgICAgQWxsb3dlZCB2YWx1ZXMgYXJlOiBBbmd1bGFyLCBBdXJlbGlhLCBBeGlvcywgRmV0Y2gsIEludmVyc2lmeSwgSlF1ZXJ5LCBOZXN0SlMsIE5vZGUsIFJlZHV4UXVlcnksCiAgICAgICAgICAgICAgICAgICAgUnhqcy4KICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlIGlzOiBBbmd1bGFyLgogIHN3YWdnZXJGaWxlICAgICAgIFBhdGggdG8gdGhlIFN3YWdnZXIgLyBPcGVuIEFQSSBzcGVjaWZpY2F0aW9uIGZpbGUKICBvdXRwdXRQYXRoICAgICAgICBPdXRwdXQgZm9sZGVyIHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgY29kZSB0bwogICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXM6IHR5cGVzY3JpcHQtZ2VuZXJhdGVkLWNvZGUuCgpPcHRpb25zOgogIC1ubHwtLW5vLWxvZ2dpbmcgIERpc2FibGVzIEFuYWx5dGljcyBhbmQgRXJyb3IgUmVwb3J0aW5nCiAgLT98LWh8LS1oZWxwICAgICAgU2hvdyBoZWxwIGluZm9ybWF0aW9uLgpgYGAKCiMjIFVzYWdlIEV4YW1wbGVzOgoKTGV0J3Mgc2F5IHdlIGhhdmUgYSBPcGVuQVBJIFNwZWNpZmljYXRpb25zIGRvY3VtZW50IGNhbGxlZCAqKlN3YWdnZXIuanNvbioqCgpGb3Igc3RhcnRlcnMsIHdlIGNhbiB1c2UgdGhlIFN3YWdnZXIgUGV0c3RvcmUgc3BlYy4gSGVyZSdzIGFuIGV4YW1wbGUgcG93ZXJzaGVsbCBzY3JpcHQgZm9yIGRvd25sb2FkaW5nIGl0CgpgYGAKSW52b2tlLVdlYlJlcXVlc3QgLVVyaSBodHRwczovL3BldHN0b3JlLnN3YWdnZXIuaW8vdjMvc3dhZ2dlci5qc29uIC1PdXRGaWxlIFN3YWdnZXIuanNvbgpgYGAKCkluIGNhc2UgeW91IGRvbid0IGhhdmUgdGhlIENMSSB0b29sIGluc3RhbGxlZCB5b3UgY2FuIGluc3RhbGwgaXQgYnkKCmBgYApkb3RuZXQgdG9vbCBpbnN0YWxsIC0tZ2xvYmFsIHJhcGljZ2VuCmBgYAoKSGVyZSdzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGdlbmVyYXRlIGNvZGUgdXNpbmcgKipBdXRvUmVzdCoqCgpgYGAKcmFwaWNnZW4gY3NoYXJwIGF1dG9yZXN0IFN3YWdnZXIuanNvbiBHZW5lcmF0ZWRDb2RlIC4vQXV0b1Jlc3RPdXRwdXQuY3MKYGBgCgpIZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gZ2VuZXJhdGUgY29kZSB1c2luZyAqKktpb3RhKioKCmBgYApyYXBpY2dlbiBjc2hhcnAga2lvdGEgU3dhZ2dlci5qc29uIEdlbmVyYXRlZENvZGUgLi9PcGVuQXBpT3V0cHV0LmNzCmBgYAoKSGVyZSdzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGdlbmVyYXRlIGNvZGUgdXNpbmcgKipOU3dhZyoqCgpgYGAKcmFwaWNnZW4gY3NoYXJwIG5zd2FnIFN3YWdnZXIuanNvbiBHZW5lcmF0ZWRDb2RlIC4vTlN3YWdPdXRwdXQuY3MKYGBgCgpIZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gZ2VuZXJhdGUgY29kZSB1c2luZyAqKlN3YWdnZXIgQ29kZWdlbiBDTEkqKgoKYGBgCnJhcGljZ2VuIGNzaGFycCBzd2FnZ2VyIFN3YWdnZXIuanNvbiBHZW5lcmF0ZWRDb2RlIC4vU3dhZ2dlck91dHB1dC5jcwpgYGAKCkhlcmUncyBhbiBleGFtcGxlIG9mIGhvdyB0byBnZW5lcmF0ZSBjb2RlIHVzaW5nICoqT3BlbkFQSSBHZW5lcmF0b3IqKgoKYGBgCnJhcGljZ2VuIGNzaGFycCBvcGVuYXBpIFN3YWdnZXIuanNvbiBHZW5lcmF0ZWRDb2RlIC4vT3BlbkFwaU91dHB1dC5jcwpgYGAKCkhlcmUncyBhbiBleGFtcGxlIG9mIGhvdyB0byBnZW5lcmF0ZSBjb2RlICoqSk1ldGVyKiogdGVzdCBwbGFucwoKYGBgCnJhcGljZ2VuIGptZXRlciBTd2FnZ2VyLmpzb24KYGBgCgpIZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gZ2VuZXJhdGUgY29kZSBmb3IgKipUeXBlU2NyaXB0KioKCmBgYApyYXBpY2dlbiB0eXBlc2NyaXB0IEFuZ3VsYXIgU3dhZ2dlci5qc29uCmBgYAoKIwoKRm9yIHRpcHMgYW5kIHRyaWNrcyBvbiBzb2Z0d2FyZSBkZXZlbG9wbWVudCwgY2hlY2sgb3V0IFtteSBibG9nXShodHRwczovL2NocmlzdGlhbmhlbGxlLmNvbSkKCklmIHlvdSBmaW5kIHRoaXMgdXNlZnVsIGFuZCBmZWVsIGEgYml0IGdlbmVyb3VzIHRoZW4gZmVlbCBmcmVlIHRvIFtidXkgbWUgYSBjb2ZmZWUg4piVXShodHRwczovL3d3dy5idXltZWFjb2ZmZWUuY29tL2NocmlzdGlhbmhlbGxlKQoK
+ readmeEtag: '"7c36d8f81324598e0be1b4b20b1a277f4a59b64f"'
+ readmeLastModified: Mon, 30 Sep 2024 20:59:47 GMT
repositoryId: 166226127
description: >-
A collection of Visual Studio custom tool code generators for Swagger /
OpenAPI specification files
created: '2019-01-17T12:58:50Z'
- updated: '2024-09-28T22:55:33Z'
+ updated: '2024-09-30T20:59:51Z'
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: '"c044a5d6acafa4328019eb27a76a269ff9243bda6a849b3184edb68ff7ef1445"'
- repoLastModified: Sat, 28 Sep 2024 22:55:33 GMT
+ repoEtag: '"6706ca52e0a89cd1ca001c2c91b583b8fc63443d7ef7d9b630a8e5776f1a6458"'
+ repoLastModified: Mon, 30 Sep 2024 20:59:51 GMT
category: SDK
foundInMaster: true
- source: openapi3 tags
@@ -10072,7 +10072,7 @@
owner: pace
logo: https://avatars.githubusercontent.com/u/16001479?v=4
license: MIT
- repoEtag: '"3eb0b5fc0ba6c4e13992fa61672b31c588c135e53dca67f2170bf2ebdffe55cf"'
+ repoEtag: '"58bbe30253a65bf94899c730289b2487ed0deda0cbf0a1bd4e38b7bf7838cd20"'
repoLastModified: Mon, 02 Sep 2024 12:22:32 GMT
foundInMaster: true
category: Server
@@ -10220,17 +10220,17 @@
repositoryId: 122702750
description: API Management and Testing Platform
created: '2018-02-24T04:23:08Z'
- updated: '2024-09-30T02:45:05Z'
+ updated: '2024-09-30T22:57:43Z'
language: Go
archived: false
- stars: 146
+ stars: 147
watchers: 18
forks: 66
owner: deeptest-com
logo: https://avatars.githubusercontent.com/u/127812389?v=4
license: GPL-3.0
- repoEtag: '"703e173a14213caed8fac1a3baca4840c9f3646875f6a3452899ed1d39e792fa"'
- repoLastModified: Mon, 30 Sep 2024 02:45:05 GMT
+ repoEtag: '"e3139236cc9449c4d609b25145799cc1700f86f4c4af9dc6968deaacd77d0117"'
+ repoLastModified: Mon, 30 Sep 2024 22:57:43 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -10337,7 +10337,7 @@
owner: netwo-io
logo: https://avatars.githubusercontent.com/u/64151169?v=4
license: MIT
- repoEtag: '"25d172d36907c32ed8e71c0d80e4a4f2c579f031ee43232826da9552d7be1824"'
+ repoEtag: '"43ade5cda6cc3ab32bf55c86d7dd20699f6c60b25e238e4cce838a1f6623ebd6"'
repoLastModified: Sun, 29 Sep 2024 22:25:35 GMT
category: Parsers
foundInMaster: true
@@ -10669,7 +10669,7 @@
owner: digitalocean
logo: https://avatars.githubusercontent.com/u/4650108?v=4
license: Apache-2.0
- repoEtag: '"1f7bfc87775422711e7173616c76ab21a36350fc5911ed77e30e6911b500b6cc"'
+ repoEtag: '"a850971e598c99e426c1383cfbf74fd2e8e67a2c6ebc66fd0617ebe0e9c1c7b2"'
repoLastModified: Fri, 27 Sep 2024 18:55:55 GMT
foundInMaster: true
category:
@@ -10749,7 +10749,7 @@
owner: playpauseandstop
logo: https://avatars.githubusercontent.com/u/21325?v=4
license: BSD-3-Clause
- repoEtag: '"93755dd7c40b11091f4dc5f28f16e44e4710637789c87c61da79c9122f4e6823"'
+ repoEtag: '"96018bbb03591a6da1102446a88d97b226e353dbe92532309c600af55c4be599"'
repoLastModified: Wed, 04 Sep 2024 09:42:03 GMT
foundInMaster: true
category: Server Implementations
@@ -10859,7 +10859,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-09-29T13:33:09Z'
+ updated: '2024-09-30T03:39:33Z'
language: JavaScript
archived: false
stars: 98
@@ -10867,8 +10867,8 @@
forks: 26
owner: OAI
logo: https://avatars.githubusercontent.com/u/16343502?v=4
- repoEtag: '"d69f8a216a17e5b45e523f3966a8ba2ed57452b43f8fb99a4e4d5577e71dd5bc"'
- repoLastModified: Sun, 29 Sep 2024 13:33:09 GMT
+ repoEtag: '"84589fa6e0e37abb7fbc17064ad410da83af3d2952943fdbdd9fcd01e9389926"'
+ repoLastModified: Mon, 30 Sep 2024 03:39:33 GMT
category: Server Implementations
foundInMaster: true
oldLocations:
@@ -10886,7 +10886,7 @@
Converts OpenAPI 3.0 definitions to Plant UML text for visualisation of
your API.
created: '2021-02-17T03:47:43Z'
- updated: '2024-09-27T17:16:49Z'
+ updated: '2024-09-30T17:04:42Z'
language: Java
archived: false
stars: 95
@@ -10895,8 +10895,8 @@
owner: davidmoten
logo: https://avatars.githubusercontent.com/u/318187?v=4
license: Apache-2.0
- repoEtag: '"f34040f9926f27653ca0eab938d7c052a1cfffc736365bdf1f2a60414008a646"'
- repoLastModified: Fri, 27 Sep 2024 17:16:49 GMT
+ repoEtag: '"fd177966a25ec2b847dc1953d4c3fcc70569b3479afeef0bac7af4bb39317d25"'
+ repoLastModified: Mon, 30 Sep 2024 17:04:42 GMT
foundInMaster: true
category: SDK
id: d4f9d833f5a48b843c52f5ec6f582976
@@ -11046,7 +11046,7 @@
repositoryId: 162836730
description: Kotlin SDK for Jellyfin, supporting Android and JVM targets
created: '2018-12-22T19:14:06Z'
- updated: '2024-09-27T08:11:15Z'
+ updated: '2024-09-30T16:46:32Z'
language: Kotlin
archived: false
stars: 87
@@ -11055,8 +11055,8 @@
owner: jellyfin
logo: https://avatars.githubusercontent.com/u/45698031?v=4
license: LGPL-3.0
- repoEtag: '"54211a28620c40d9e6389b00bf57d6816bc0b7335914ab08a89c68366f2f133a"'
- repoLastModified: Fri, 27 Sep 2024 08:11:15 GMT
+ repoEtag: '"399d31bf9d1c801353919b52f99bfc854aae2298c99274b4737f846d46fcc643"'
+ repoLastModified: Mon, 30 Sep 2024 16:46:32 GMT
foundInMaster: true
category: Testing
id: f51a5c8eb1a78ed2479cabdb83d894d5
@@ -11187,7 +11187,7 @@
owner: christianhelle
logo: https://avatars.githubusercontent.com/u/710400?v=4
license: MIT
- repoEtag: '"a7e6ae99265086a3301b5f7d2798e442c73e1d1dabdc4772977a2cec99bc1cf6"'
+ repoEtag: '"326002b35d9a9b55a86100ebae1ea58e691edff9e0515ab3d56b53cfe9ef3f20"'
repoLastModified: Sun, 29 Sep 2024 20:16:43 GMT
category: Parsers
foundInMaster: true
@@ -11314,7 +11314,7 @@
repositoryId: 249737066
description: Semantic parser for API specifications
created: '2020-03-24T14:55:51Z'
- updated: '2024-09-28T00:08:25Z'
+ updated: '2024-09-30T23:18:31Z'
language: TypeScript
archived: false
stars: 68
@@ -11322,8 +11322,8 @@
forks: 17
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
- repoEtag: '"503f3e71d0ba8661d36c7c297ae057af50865e5ee1d1c121b45fcae04d48f783"'
- repoLastModified: Sat, 28 Sep 2024 00:08:25 GMT
+ repoEtag: '"d3e7da82b44798b2fdf7fc8ded4b98d65a8334aa78c5200d70ee6f9b8894fe45"'
+ repoLastModified: Mon, 30 Sep 2024 23:18:31 GMT
category: Parsers
foundInMaster: true
- source:
@@ -11343,16 +11343,16 @@
Improve the security of your API by detecting common vulnerabilities as
defined by OWASP and enforced with Spectral.
created: '2022-08-25T18:14:13Z'
- updated: '2024-09-18T13:34:29Z'
+ updated: '2024-09-30T19:11:13Z'
language: TypeScript
archived: false
- stars: 67
+ stars: 68
watchers: 5
forks: 11
owner: stoplightio
logo: https://avatars.githubusercontent.com/u/10767217?v=4
- repoEtag: '"24181f4d55f0be9e12c8c97dad7ef2c5a33beda5010990e1c46e358addd5a4ac"'
- repoLastModified: Wed, 18 Sep 2024 13:34:29 GMT
+ repoEtag: '"17f372b382f91eb1c210df3cffdb42485abfc15101ebe804f66dec1b0d6eaf5a"'
+ repoLastModified: Mon, 30 Sep 2024 19:11:13 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -11556,7 +11556,7 @@
forks: 23
owner: italia
logo: https://avatars.githubusercontent.com/u/15377824?v=4
- repoEtag: '"37d1e738d479bfccce7019fef74bde6fbb183f93d7d68f26241638c459dfbc9d"'
+ repoEtag: '"80d5126412dc203bdd2b3f31f74c62ef219219e6f4d176bf3ce7928c1d3fed37"'
repoLastModified: Mon, 16 Sep 2024 12:02:24 GMT
foundInMaster: true
category: Description Validators
@@ -11732,7 +11732,7 @@
owner: SmartBear
logo: https://avatars.githubusercontent.com/u/1644671?v=4
license: Apache-2.0
- repoEtag: '"78d411c2330ae300b04d857865e8838159fd7d2d84c21cce183efea2b1c10064"'
+ repoEtag: '"771a40c9686b4fddcb18c4d48347570dc6c13856bf7607f8823760fb3884ba12"'
repoLastModified: Fri, 13 Sep 2024 15:22:37 GMT
foundInMaster: true
category: Code Generators
@@ -11945,17 +11945,17 @@
repositoryId: 599199253
description: Generate OpenAPI 3.0 specifications from Go code.
created: '2023-02-08T16:53:48Z'
- updated: '2024-09-27T16:35:36Z'
+ updated: '2024-09-30T17:53:07Z'
language: Go
archived: false
- stars: 48
+ stars: 49
watchers: 3
forks: 17
owner: a-h
logo: https://avatars.githubusercontent.com/u/1029947?v=4
license: MIT
- repoEtag: '"7f9091dde382053b6bb93583cb0cd0beda7df4a00df1e8ac4259f7df5ac3e378"'
- repoLastModified: Fri, 27 Sep 2024 16:35:36 GMT
+ repoEtag: '"37ab9b6951d367e9b964bb02dbd408d4d87458329d96e2d8fc8ebdd70ba4e26d"'
+ repoLastModified: Mon, 30 Sep 2024 17:53:07 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -11994,7 +11994,7 @@
repositoryId: 286198180
description: Example application built using Quarkus framework
created: '2020-08-09T08:34:19Z'
- updated: '2024-09-23T15:36:48Z'
+ updated: '2024-09-30T10:58:16Z'
language: Java
archived: false
stars: 47
@@ -12002,8 +12002,8 @@
forks: 26
owner: piomin
logo: https://avatars.githubusercontent.com/u/2892502?v=4
- repoEtag: '"59b1d6c0bfbf8974baa00e1dc3010a2013abfa07c096218edb3fe17d219e749a"'
- repoLastModified: Mon, 23 Sep 2024 15:36:48 GMT
+ repoEtag: '"b606617e74b9bb58347ab42460fbdee66d3d50d3025eba102c9587075d3c58dd"'
+ repoLastModified: Mon, 30 Sep 2024 10:58:16 GMT
foundInMaster: true
category: SDK
id: dd8f9923c6579fbc72bcd8fc5a69a30c
@@ -12087,17 +12087,17 @@
OpenAPI validation extension for libopenapi, validate http requests and
responses as well as schemas
created: '2023-03-31T11:28:11Z'
- updated: '2024-09-22T08:01:07Z'
+ updated: '2024-10-01T01:41:13Z'
language: Go
archived: false
- stars: 45
+ stars: 46
watchers: 4
forks: 16
owner: pb33f
logo: https://avatars.githubusercontent.com/u/104016643?v=4
license: NOASSERTION
- repoEtag: '"d30a1a6a6edadcf4686d8f62af2096add78e26c80411d3d133c78d12c6c7995a"'
- repoLastModified: Sun, 22 Sep 2024 08:01:07 GMT
+ repoEtag: '"84c03caf40a1e81eb3365e1fb1905efa6a523f93eb32aeb5e5bc73e38b6d789a"'
+ repoLastModified: Tue, 01 Oct 2024 01:41:13 GMT
category: Parsers
foundInMaster: true
v3_1: true
@@ -12164,7 +12164,7 @@
Annotation processor for compile-time OpenAPI & JsonSchema, with
out-of-the-box support for Javalin 5.x, Swagger & ReDoc
created: '2021-05-04T16:10:52Z'
- updated: '2024-09-26T03:35:55Z'
+ updated: '2024-09-30T16:59:32Z'
language: Kotlin
archived: false
stars: 44
@@ -12173,8 +12173,8 @@
owner: javalin
logo: https://avatars.githubusercontent.com/u/28701086?v=4
license: Apache-2.0
- repoEtag: '"1c74786ebbe8206d11fc57221524d0e064c0ef41962f7e6f7ea2df9a7bdcc0b0"'
- repoLastModified: Thu, 26 Sep 2024 03:35:55 GMT
+ repoEtag: '"aa36ccb2c0ef3884fb1929ed4afa7f56f9f3b3ca4a656c3a5cdd428a0f99a1ee"'
+ repoLastModified: Mon, 30 Sep 2024 16:59:32 GMT
category: SDK
foundInMaster: true
oldLocations:
@@ -12388,7 +12388,7 @@
owner: Backbase
logo: https://avatars.githubusercontent.com/u/1914334?v=4
license: NOASSERTION
- repoEtag: '"c410631d0d95c8ea58f4217f157d471351bf3e362f26fd929fcd63ee3efd89ff"'
+ repoEtag: '"c9e9bb5b474ee835544534578821fcc6c30a119407205735908ec3fa0d7bbc93"'
repoLastModified: Sun, 29 Sep 2024 08:22:22 GMT
foundInMaster: true
category: SDK
@@ -12464,17 +12464,17 @@
Full stack, modern web application generator. Using FastAPI, MySQL as
database, Docker, automatic HTTPS and more.
created: '2022-04-09T05:32:37Z'
- updated: '2024-09-26T11:59:34Z'
+ updated: '2024-09-30T08:32:06Z'
language: Python
archived: false
- stars: 40
+ stars: 41
watchers: 3
forks: 14
owner: vuongtlt13
logo: https://avatars.githubusercontent.com/u/14292473?v=4
license: MIT
- repoEtag: '"11f36530a3f23f1134e9c2a5de6f12102de0ff3a7201a664b027a8ad694fefcc"'
- repoLastModified: Thu, 26 Sep 2024 11:59:34 GMT
+ repoEtag: '"e7e26589e737157b2160283461d7cef6691373697533de710fe43ed4cd1579b8"'
+ repoLastModified: Mon, 30 Sep 2024 08:32:06 GMT
foundInMaster: true
category: Server Implementations
id: 288909aadff60d6d617f878d02cb018c
@@ -12905,7 +12905,7 @@
owner: data-fair
logo: https://avatars.githubusercontent.com/u/83776320?v=4
license: AGPL-3.0
- repoEtag: '"d7ac51cb2d85ac4b6d501a219d2942895a229e2d79ca09495276718340cc33a8"'
+ repoEtag: '"851ab951e1fc00f92702fa91ec9c078d06fa72033fa3ecf7a44c905613a18e1e"'
repoLastModified: Fri, 27 Sep 2024 12:13:17 GMT
foundInMaster: true
category:
@@ -13239,17 +13239,17 @@
repositoryId: 393620909
description: RESTful API for managing a school
created: '2021-08-07T08:06:01Z'
- updated: '2024-09-27T13:31:53Z'
+ updated: '2024-09-30T16:49:39Z'
language: Java
archived: false
- stars: 28
+ stars: 27
watchers: 3
forks: 123
owner: hei-school
logo: https://avatars.githubusercontent.com/u/88576095?v=4
license: MIT
- repoEtag: '"b6b40de5103386029d40dea2349bfcbf233e7434f2c167e51a0224bbab2f79b2"'
- repoLastModified: Fri, 27 Sep 2024 13:31:53 GMT
+ repoEtag: '"cd6b19abde982494a310c008e05ccf4e69b1282615ebfa1427868de508afd4bb"'
+ repoLastModified: Mon, 30 Sep 2024 16:49:39 GMT
foundInMaster: true
category: Code Generators
id: bf98240ea893afa32efc180fb73dd5b6
@@ -14037,7 +14037,7 @@
owner: dkackman
logo: https://avatars.githubusercontent.com/u/5160233?v=4
license: Apache-2.0
- repoEtag: '"fc4f5985e9910a636fdde4f8651f23afb09b1e3d8315f367ab2d2278a9150dfc"'
+ repoEtag: '"8bf4e33d6f3f9652f56a7ed8b7e701c91b5a31fe64475469e592ef6cd50fd538"'
repoLastModified: Fri, 06 Sep 2024 21:01:37 GMT
foundInMaster: true
category: Server
@@ -14070,36 +14070,6 @@
repoLastModified: Sun, 23 Jun 2024 15:15:20 GMT
category: Parsers
foundInMaster: true
-- source: openapi3 tags
- repository: https://github.com/ben-jamin-chen/kafka-streams-redis-statestore
- v3: true
- id: 574d5c6f9e5705994875220ae1875d15
- repositoryMetadata:
- base64Readme: >-
- IyBLYWZrYSBTdHJlYW1zICgyLjYuMCkgd2l0aCBhIFJlZGlzLWJhY2tlZCBTdGF0ZSBTdG9yZQpCeSBkZWZhdWx0LCBLYWZrYSBTdHJlYW1zIHV0aWxpemVzIHRoZSBSb2Nrc0RCIHN0b3JhZ2UgZW5naW5lIGZvciBwZXJzaXN0ZW50IHN0YXRlIHN0b3Jlcy4gT25lIGdsYXJpbmcgaXNzdWUgeW91IG1heSBoYXZlIG5vdGljZWQgaXMgdGhlIGJpZ2dlc3QgZGVsYXkgb2NjdXJzIHdoZW4gS2Fma2EgU3RyZWFtcyBpcyBpbiBhIHJlYmFsYW5jaW5nIHN0YXRlLCB3aGVyZSBpdCBpbnRlcm5hbGx5IHJlYnVpbGRzIHRoZXNlIHN0YXRlIHN0b3JlcyBmcm9tIHRoZSBjaGFuZ2UtbG9nIHRvcGljcy4gVGhpcyBpcyBlc3BlY2lhbGx5IGEgY29tbW9uIHByb2JsZW0gaWYgeW91IHVzZSBbS3ViZXJuZXRlc10oaHR0cHM6Ly9rdWJlcm5ldGVzLmlvKSBhbmQgeW91ciBlbnZpcm9ubWVudCBpcyBkZXNpZ25lZCB0byBzY2FsZSB1cCAobmV3IHBvZHMpIG9yIGRvd24gKG5vZGVzIGFyZSByZW1vdmVkKS4gV2hpbGUgaXTigJlzIGluIGEgcmViYWxhbmNpbmcgc3RhdGUsIGFsbCBpbnZvbHZlZCBjb25zdW1lciBwcm9jZXNzaW5nIGlzIGJsb2NrZWQsIHNvIHdoYXQgdGhpcyBtZWFucyBpcyB0aGUgYXBwbGljYXRpb24gd29u4oCZdCBiZSBhYmxlIHRvIHNlcnZpY2UgYW55IHJlcXVlc3RzIHVudGlsIHRoZSBwcm9jZXNzIGJlY29tZXMgdW5ibG9ja2VkLiBUaGlzIGlzbuKAmXQgaWRlYWwgZXNwZWNpYWxseSBpbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQgb3IgZnJvbSBhIHByYWN0aWNhbGl0eSBzdGFuZHBvaW50LiBUaGUgb3ZlcmFsbCB0aW1lIHdpdGggdGhpcyBkZWxheSBzZWVtcyB0byBjb3JyZXNwb25kIHdpdGggaG93IGxhcmdlIHlvdXIgZGF0YXNldCBpcyBpbiB5b3VyIHRvcGljcywgc28gaWYgeW91J3JlIGRldmVsb3BpbmcgdW5kZXIgYSBjb250aW51b3VzIGludGVncmF0aW9uIGVudmlyb25tZW50IHRoaXMgcG9zZXMgYSBtYWpvciBjaGFsbGVuZ2Ugc2luY2UgZXZlcnkgZGVwbG95bWVudCB3aWxsIHJlcXVpcmUgc29tZSBhbW91bnQgb2YgdXBmcm9udCB0aW1lIHRvIHJlYmFsYW5jZS4KCkFueXdheXMsIHRoaXMgaXMgdGhlIHByaW1hcnkgbW90aXZhdGlvbiBmb3Igc3dpdGNoaW5nIG92ZXIgdG8gYSBjdXN0b20gc3RhdGUgc3RvcmUuIFdlIGNhbiBsZXZlcmFnZSBhIHBlcm1hbmVudCBzdG9yYWdlIHNvbHV0aW9uIGxpa2UgUmVkaXMgc3VjaCB0aGF0IGluIGFueSBuZXcgZGVwbG95bWVudCBvciBhcHBsaWNhdGlvbiByZXN0YXJ0LCB3ZSBjYW4gYXZvaWQgdGhlc2UgdXBmcm9udCByZWJhbGFuY2luZyBkZWxheS4KCiMjIFdoYXQgWW91IE5lZWQKCiogSmF2YSAxNAoqIE1hdmVuIDMuNi4wKwoqIERvY2tlciAxOSsKKiBSZWRpcyA1KwoKIyMgR2V0dGluZyBTdGFydGVkCkZpcnN0LCBpbnN0YWxsIGEgbG9jYWwgaW5zdGFuY2Ugb2YgUmVkaXMgKGlmIHlvdSBoYXZlbid0IGFscmVhZHkpLiBJZiB5b3UncmUgcnVubmluZyBvbiBNYWMgT1MgWCwgeW91IGNhbiB1c2UgW0hvbWVicmV3XShodHRwczovL2JyZXcuc2gpIHZpYSB0aGUgY29tbWFuZDoKCmBgYHpzaAokICBicmV3IGluc3RhbGwgcmVkaXMKYGBgCgpGb3IgV2luZG93cywgdGhlcmUncyBhIGNvdXBsZSBvZiB3YXlzIHRvIGRvIHRoaXMsIGJ1dCBJIGdlbmVyYWxseSBsaWtlIHRvIGRlcGxveSBhbmQgcnVuIFtSZWRpc10oaHR0cHM6Ly9odWIuZG9ja2VyLmNvbS9fL3JlZGlzKSBpbiBbRG9ja2VyXShodHRwczovL2RvY3MuZG9ja2VyLmNvbS9kb2NrZXItZm9yLXdpbmRvd3MvaW5zdGFsbCkuCgpgYGBwd3NoCj4gIGRvY2tlciBydW4gLS1uYW1lIHNvbWUtcmVkaXMgLXAgNjM3OSAtZCByZWRpcwpgYGAKClRoZSBlYXNpZXN0IHdheSB0byBzdGFydCB0aGUgUmVkaXMgc2VydmVyIGlzIGp1c3QgZXhlY3V0aW5nIHRoZSBgcmVkaXMtc2VydmVyYCBjb21tYW5kIHdpdGhvdXQgYW55IGFyZ3VtZW50cy4KCmBgYHpzaAokICByZWRpcy1zZXJ2ZXIKYGBgCgpZb3UgY2FuIGNvbm5lY3QgdG8gdGhlIFJlZGlzIGluc3RhbmNlICh3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbnMpIHVzaW5nIHRoZSBgcmVkaXMtY2xpYCBjb21tYW5kOgoKYGBgenNoCiQgIHJlZGlzLWNsaSAtaCBsb2NhbGhvc3QgLXAgNjM3OQpgYGAKCk5leHQsIHdlIG5lZWQgdG8gbGF1bmNoIHRoZSB2YXJpb3VzIENvbmZsdWVudCBzZXJ2aWNlcyAoaS5lLiBTY2hlbWEgUmVnaXN0cnksIEJyb2tlciwgWm9vS2VlcGVyKSBsb2NhbGx5IGJ5IHJ1bm5pbmcgdGhlIGBkb2NrZXItY29tcG9zZSB1cCAtZGAgQ0xJIGNvbW1hbmQgd2hlcmUgdGhlIFtkb2NrZXItY29tcG9zZS55bWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9iY2hlbjA0L2thZmthLXN0cmVhbXMtcmVkaXMtc3RhdGVzdG9yZS9ibG9iL21hc3Rlci9kb2NrZXItY29tcG9zZS55bWwpIGZpbGUgaXMuIFR5cGljYWxseSwgeW91IGNhbiBjcmVhdGUgYSBzdGFjayBmaWxlIChpbiB0aGUgZm9ybSBvZiBhIFlBTUwgZmlsZSkgdG8gZGVmaW5lIHlvdXIgYXBwbGljYXRpb25zLiBZb3UgY2FuIGFsc28gcnVuIGBkb2NrZXItY29tcG9zZSBwc2AgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3RhY2suIE5vdGljZSwgdGhlIGVuZHBvaW50cyBmcm9tIHdpdGhpbiB0aGUgY29udGFpbmVycyBvbiB5b3VyIGhvc3QgbWFjaGluZS4KCnwgTmFtZSB8IEZyb20gd2l0aGluIGNvbnRhaW5lcnMgfCBGcm9tIGhvc3QgbWFjaGluZSB8CnwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tIHwKfCBLYWZrYSBCcm9rZXIgfCBicm9rZXI6OTA5MiB8IGxvY2FsaG9zdDo5MDkyIHwKfCBTY2hlbWEgUmVnaXN0cnkgIHwgaHR0cDovL3NjaGVtYS1yZWdpc3RyeTo4MDgxIHwgaHR0cDovL2xvY2FsaG9zdDo4MDgxIHwKfCBab29LZWVwZXIgfCB6b29rZWVwZXI6MjE4MSB8IGxvY2FsaG9zdDoyMTgxIHwKCj4gTm90ZTogeW91IGNhbiBydW4gYGRvY2tlci1jb21wb3NlIGRvd25gIHRvIHN0b3AgYWxsIHNlcnZpY2VzIGFuZCBjb250YWluZXJzLgoKQXMgcGFydCBvZiB0aGlzIHNhbXBsZSwgSSd2ZSByZXRyb2ZpdHRlZCB0aGUgYXZlcmFnZSBhZ2dyZWdhdGUgZXhhbXBsZSBmcm9tIFtDb25mbHVlbnQncyBLYWZrYSBUdXRvcmlhbHNdKGh0dHBzOi8va2Fma2EtdHV0b3JpYWxzLmNvbmZsdWVudC5pby9hZ2dyZWdhdGluZy1hdmVyYWdlL2tzdHJlYW1zLmh0bWwpIGludG8gdGhpcyBwcm9qZWN0LiBUaGUgQVBJIHdpbGwgY2FsY3VsYXRlIGFuZCByZXR1cm4gYSBydW5uaW5nIGF2ZXJhZ2UgcmF0aW5nIGZvciBhIGdpdmVuIG1vdmllIGlkZW50aWZpZXIuIFRoaXMgc2hvdWxkIGRlbW9uc3RyYXRlIGhvdyB0byBidWlsZCBhIGJhc2ljIEFQSSBzZXJ2aWNlIG9uIHRvcCBvZiBhbiBhZ2dyZWdhdGlvbiByZXN1bHQuCgpOb3RpY2UgaW4gdGhlIGB+L3NyYy9tYWluL2F2cm9gIGRpcmVjdG9yeSwgd2UgaGF2ZSBhbGwgb3VyIEF2cm8gc2NoZW1hIGZpbGVzIGZvciB0aGUgc3RyZWFtIG9mIGByYXRpbmdzYCBhbmQgYGNvdW50c3VtYC4gRm9yIHlvdXIgY29udmVuaWVuY2UsIHRoZSBjbGFzc2VzIHdlcmUgYWxyZWFkeSBnZW5lcmF0ZWQgdW5kZXIgdGhlIGB+L3NyYy9tYWluL2phdmEvaW8vY29uZmx1ZW50L2RlbW9gIGRpcmVjdG9yeSwgYnV0IGZlZWwgZnJlZSB0byB0aW5rZXIgd2l0aCB0aGVtIGFuZCByZWNvbXBpbGUgdGhlIHNjaGVtYXMgaWYgbmVlZGVkLiBUaGUgQXZybyBjbGFzc2VzIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IGdlbmVyYXRlZCB1c2luZyBgTWF2ZW5gIG9yIGJ5IG1hbnVhbGx5IGludm9raW5nIHRoZSBbc2NoZW1hIGNvbXBpbGVyXShodHRwczovL2F2cm8uYXBhY2hlLm9yZy9kb2NzLzEuMTAuMC9nZXR0aW5nc3RhcnRlZGphdmEuaHRtbCNDb21waWxpbmcrdGhlK3NjaGVtYSkuIAoKU28gYmVmb3JlIGJ1aWxkaW5nIGFuZCBydW5uaW5nIHRoZSBwcm9qZWN0LCBvcGVuIGEgbmV3IHRlcm1pbmFsIGFuZCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kcyB0byBnZW5lcmF0ZSB5b3VyIGlucHV0IGFuZCBvdXRwdXQgdG9waWNzLgoKYGBgenNoCiQgIGRvY2tlci1jb21wb3NlIGV4ZWMgYnJva2VyIGthZmthLXRvcGljcyAtLWNyZWF0ZSAtLWJvb3RzdHJhcC1zZXJ2ZXIgXAogICBsb2NhbGhvc3Q6OTA5MiAtLXJlcGxpY2F0aW9uLWZhY3RvciAxIC0tcGFydGl0aW9ucyAxIC0tdG9waWMgcmF0aW5ncwoKJCAgZG9ja2VyLWNvbXBvc2UgZXhlYyBicm9rZXIga2Fma2EtdG9waWNzIC0tY3JlYXRlIC0tYm9vdHN0cmFwLXNlcnZlciBcCiAgIGxvY2FsaG9zdDo5MDkyIC0tcmVwbGljYXRpb24tZmFjdG9yIDEgLS1wYXJ0aXRpb25zIDEgLS10b3BpYyByYXRpbmctYXZlcmFnZXMKYGBgCgpOZXh0LCB3ZSB3aWxsIG5lZWQgdG8gcHJvZHVjZSBzb21lIGRhdGEgb250byB0aGUgaW5wdXQgdG9waWMuCgpgYGB6c2gKJCAgZG9ja2VyIGV4ZWMgLWkgc2NoZW1hLXJlZ2lzdHJ5IC91c3IvYmluL2thZmthLWF2cm8tY29uc29sZS1wcm9kdWNlciAtLXRvcGljIHJhdGluZ3MgLS1icm9rZXItbGlzdCBicm9rZXI6OTA5MlwKICAgIC0tcHJvcGVydHkgInBhcnNlLmtleT1mYWxzZSJcCiAgICAtLXByb3BlcnR5ICJrZXkuc2VwYXJhdG9yPToiXAogICAgLS1wcm9wZXJ0eSB2YWx1ZS5zY2hlbWE9IiQoPCBzcmMvbWFpbi9hdnJvL3JhdGluZy5hdnNjKSIKIGBgYAogClBhc3RlIGluIHRoZSBmb2xsb3dpbmcgYGpzb25gIGRhdGEgd2hlbiBwcm9tcHRlZCBhbmQgYmUgc3VyZSB0byBwcmVzcyBlbnRlciB0d2ljZSB0byBhY3R1YWxseSBzdWJtaXQgaXQuCgpgYGBqc29uCnsibW92aWVfaWQiOjM2MiwicmF0aW5nIjoxMH0KeyJtb3ZpZV9pZCI6MzYyLCJyYXRpbmciOjh9CiBgYGAKCk9wdGlvbmFsbHksIHlvdSBjYW4gYWxzbyBzZWUgdGhlIGNvbnN1bWVyIHJlc3VsdHMgb24gdGhlIG91dHB1dCB0b3BpYyBieSBydW5uaW5nIHRoaXMgY29tbWFuZCBvbiBhIG5ldyB0ZXJtaW5hbCB3aW5kb3c6CgpgYGB6c2gKJCAgZG9ja2VyIGV4ZWMgLWl0IGJyb2tlciAvdXNyL2Jpbi9rYWZrYS1jb25zb2xlLWNvbnN1bWVyIC0tdG9waWMgcmF0aW5nLWF2ZXJhZ2VzIC0tYm9vdHN0cmFwLXNlcnZlciBicm9rZXI6OTA5MiBcCiAgICAtLXByb3BlcnR5ICJwcmludC5rZXk9dHJ1ZSJcCiAgICAtLXByb3BlcnR5ICJrZXkuZGVzZXJpYWxpemVyPW9yZy5hcGFjaGUua2Fma2EuY29tbW9uLnNlcmlhbGl6YXRpb24uTG9uZ0Rlc2VyaWFsaXplciIgXAogICAgLS1wcm9wZXJ0eSAidmFsdWUuZGVzZXJpYWxpemVyPW9yZy5hcGFjaGUua2Fma2EuY29tbW9uLnNlcmlhbGl6YXRpb24uRG91YmxlRGVzZXJpYWxpemVyIiBcCiAgICAtLWZyb20tYmVnaW5uaW5nCmBgYAoKIyMgQnVpbGQgYW5kIFJ1biB0aGUgU2FtcGxlCgpZb3UgY2FuIGltcG9ydCB0aGUgY29kZSBzdHJhaWdodCBpbnRvIHlvdXIgcHJlZmVycmVkIElERSBvciBydW4gdGhlIHNhbXBsZSB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQgKGluIHRoZSByb290IHByb2plY3QgZm9sZGVyKS4KCmBgYHpzaAokICBtdm4gc3ByaW5nLWJvb3Q6cnVuCmBgYAoKQWZ0ZXIgdGhlIGFwcGxpY2F0aW9uIHJ1bnMsIGZyb20gdGhlIGByZWRpcy1jbGlgLCBvYnNlcnZlIHRoYXQgYSBuZXcgW1JlZGlzIHN0cmVhbV0oaHR0cHM6Ly9yZWRpcy5pby90b3BpY3Mvc3RyZWFtcy1pbnRybykgZ290IGNyZWF0ZWQgdXNpbmcgdGhlIGBLRVlTYCBjb21tYW5kOgoKYGBgenNoCmxvY2FsaG9zdDo2Mzc5PiBrZXlzICoKMSkgInJhdGluZy1hdmVyYWdlcy1zdHJlYW0iCmBgYAoKVG8gcXVlcnkgdGhlIHN0cmVhbSwgeW91IGNhbiB1c2UgdGhlIGBYUkFOR0VgIGNvbW1hbmQgd2hlcmUgZWFjaCBlbnRyeSByZXR1cm5lZCBpcyBhbiBhcnJheSBvZiB0aGUgSUQgYW5kIHRoZSBsaXN0IG9mIGZpZWxkLXZhbHVlIHBhaXJzLiBUaGUgYC1gIGFuZCBgK2AgcmVwcmVzZW50IHRoZSBzbWFsbGVzdCBhbmQgdGhlIGdyZWF0ZXN0IElEIHBvc3NpYmxlLiBJZiB5b3UgdXNlZCB0aGUgc2FtZSBpbnB1dCBkYXRhIGZyb20gYWJvdmUsIGl0IHNob3VsZCByZXR1cm4gc29tZXRoaW5nIHNpbWlsYXIgbGlrZSB0aGlzIGJlbG93OgoKYGBgenNoCmxvY2FsaG9zdDo2Mzc5PiB4cmFuZ2UgcmF0aW5nLWF2ZXJhZ2VzLXN0cmVhbSAtICsKMSkgMSkgIjE2MDUwNDM2MTQwMTEtMCIKICAgMikgMSkgIjM2MiIKICAgICAgMikgIjkuMCIKYGBgCgpGaW5hbGx5LCBuYXZpZ2F0ZSB0byBbaHR0cDovL2xvY2FsaG9zdDo3MDAxL3N3YWdnZXItdWkvaW5kZXguaHRtbD9jb25maWdVcmw9L2FwaS1kb2NzL3N3YWdnZXItY29uZmlnXShodHRwOi8vbG9jYWxob3N0OjcwMDEvc3dhZ2dlci11aS9pbmRleC5odG1sP2NvbmZpZ1VybD0vYXBpLWRvY3Mvc3dhZ2dlci1jb25maWcpIGluIHlvdXIgd2ViIGJyb3dzZXIgdG8gYWNjZXNzIHRoZSBTd2FnZ2VyIFVJLiBZb3UgY2FuIGVudGVyIGAzNjJgIGFzIHRoZSBgbW92aWVJZGAgYW5kIGl0IHNob3VsZCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgZnJvbSBhYm92ZS4KCmBgYGpzb24KewogICJtb3ZpZUlkIjogMzYyLAogICJyYXRpbmciOiA5Cn0KYGBgCgpZb3UnbGwgZmluZCB0aGF0IHRoZSBgc3RvcmUucmVhZCguLi4pYCBtZXRob2QgaW4gdGhlIGNvbnRyb2xsZXIgaXMgYWJsZSB0byBxdWVyeSBpbnRvIHRoaXMgUmVkaXMtYmFja2VkIHN0YXRlIHN0b3JlLgoKPiBOb3RlOiBrZWVwIGluIG1pbmQgdGhlIHZhcmlvdXMgW3N0YXRlc10oaHR0cHM6Ly9rYWZrYS5hcGFjaGUub3JnLzI2L2phdmFkb2Mvb3JnL2FwYWNoZS9rYWZrYS9zdHJlYW1zL0thZmthU3RyZWFtcy5TdGF0ZS5odG1sKSBvZiB0aGUgY2xpZW50LiBXaGVuIGEgS2Fma2EgU3RyZWFtcyBpbnN0YW5jZSBpcyBpbiBgUlVOTklOR2Agc3RhdGUsIGl0IGFsbG93cyBmb3IgaW5zcGVjdGlvbiBvZiB0aGUgc3RyZWFtJ3MgbWV0YWRhdGEgdXNpbmcgbWV0aG9kcyBsaWtlIGBxdWVyeU1ldGFkYXRhRm9yS2V5KClgLiBXaGlsZSBpdCBpcyBpbiBgUkVCQUxBTkNJTkdgIHN0YXRlLCB0aGUgUkVTVCBzZXJ2aWNlIGNhbm5vdCBpbW1lZGlhdGVseSBhbnN3ZXIgcmVxdWVzdHMgdW50aWwgdGhlIHN0YXRlIHN0b3JlcyBhcmUgZnVsbHkgcmVidWlsdC4KCiMjIFRyb3VibGVzaG9vdGluZwoKKiBJbiBjZXJ0YWluIGNvbmRpdGlvbnMsIHlvdSBtYXkgbmVlZCB0byBkbyBhIGNvbXBsZXRlIGFwcGxpY2F0aW9uIHJlc2V0LiBZb3UgY2FuIGRlbGV0ZSB0aGUgYXBwbGljYXRpb27igJlzIGxvY2FsIHN0YXRlIGRpcmVjdG9yeSB3aGVyZSB0aGUgYXBwbGljYXRpb24gaW5zdGFuY2Ugd2FzIHJ1bi4gSW4gdGhpcyBwcm9qZWN0LCBLYWZrYSBTdHJlYW1zIHBlcnNpc3RzIGxvY2FsIHN0YXRlcyB1bmRlciB0aGUgYH4vZGF0YWAgZm9sZGVyLgo=
- readmeEtag: '"ee740369c0ba2ffe584b7045371f503358c5048d"'
- readmeLastModified: Wed, 11 Nov 2020 18:21:16 GMT
- repositoryId: 289421697
- description: >-
- A demo project demonstrating how to read and write data into a
- Redis-backed state store using Kafka Streams.
- created: '2020-08-22T04:54:11Z'
- updated: '2024-09-08T18:44:30Z'
- language: Java
- archived: false
- stars: 21
- watchers: 1
- forks: 7
- owner: ben-jamin-chen
- logo: https://avatars.githubusercontent.com/u/41641688?v=4
- license: MIT
- repoEtag: '"d4bc6db5c26b79f6657d982d9e0f39847b632ea82a6b4c7070a947e2e4d47915"'
- repoLastModified: Sun, 08 Sep 2024 18:44:30 GMT
- category: Server Implementations
- foundInMaster: true
- oldLocations:
- - https://github.com/buzzingben/kafka-streams-redis-statestore
- - https://github.com/bchen04/kafka-streams-redis-statestore
- source: openapi3 tags
repository: https://github.com/technocreatives/openapi-eller
v3: true
@@ -14207,7 +14177,7 @@
owner: mnahkies
logo: https://avatars.githubusercontent.com/u/2555533?v=4
license: MIT
- repoEtag: '"f240856b0d84b7079711427796fce547b296e6fc3034da003d2cb9588e702bca"'
+ repoEtag: '"e46d48b72a4da840f6be94d190e88da7cc17dd9ef55c8fbcb8abfb336f4a241b"'
repoLastModified: Sun, 29 Sep 2024 12:49:06 GMT
foundInMaster: true
category: Parsers
@@ -14326,7 +14296,7 @@
repositoryId: 98350934
description: Mockoon application official website repository and documentation
created: '2017-07-25T21:19:22Z'
- updated: '2024-09-28T09:34:53Z'
+ updated: '2024-09-30T18:45:50Z'
language: TypeScript
archived: false
stars: 20
@@ -14335,8 +14305,8 @@
owner: mockoon
logo: https://avatars.githubusercontent.com/u/49429147?v=4
license: NOASSERTION
- repoEtag: '"058aca64cfb1115ca522868447a5af3bf6f05a4ffafc3eed38bb0e0a3eb3f09a"'
- repoLastModified: Sat, 28 Sep 2024 09:34:53 GMT
+ repoEtag: '"d0f10076a912974aa7bb6c12655070117f8e279b6d7e0f6f6657eba0e69f343d"'
+ repoLastModified: Mon, 30 Sep 2024 18:45:50 GMT
foundInMaster: true
category: Testing
id: 84d3391fa9deedcd6398666ba504eb78
@@ -14989,36 +14959,6 @@
repoLastModified: Mon, 02 Sep 2024 19:00:01 GMT
category: Server Implementations
foundInMaster: true
-- source: openapi3 tags
- repository: https://github.com/ben-jamin-chen/springboot-kafka-streams-rest-api
- v3: true
- id: 0c2d44cef1118bbebe90119d0b6e9879
- repositoryMetadata:
- base64Readme: >-
- IyBTcHJpbmcgQm9vdCAoMi4zLjMpIFJFU1RmdWwgQVBJIHdpdGggS2Fma2EgU3RyZWFtcyAoMi42LjApCgpXaGlsZSBsb29raW5nIHRocm91Z2ggdGhlIEthZmthIFR1dG9yaWFscyB0byBzZWUgaG93IEkgY291bGQgc2V0dXAgYSBTcHJpbmcgQm9vdCBBUEkgcHJvamVjdCB3aXRoIEthZmthIFN0cmVhbXMsIEkgZm91bmQgaXQgc3RyYW5nZSB0aGF0IHRoZXJlIHdhc24ndCBhIGNvbXBsZXRlIG9yIG1vcmUgaW5mb3JtYXRpdmUgZXhhbXBsZSBvbiBob3cgdGhpcyBjb3VsZCBiZSBhY2hpZXZlZC4gTW9zdCB1c2UgY2FzZXMgZGVtb25zdHJhdGVkIGhvdyB0byBjb21wdXRlIGFnZ3JlZ2F0aW9ucyBhbmQgaG93IHRvIGJ1aWxkIHNpbXBsZSB0b3BvbG9naWVzLCBidXQgaXQgd2FzIGRpZmZpY3VsdCB0byBmaW5kIGEgY29uY3JldGUgZXhhbXBsZSBvbiBob3cgdG8gYnVpbGQgYW4gQVBJIHNlcnZpY2UgdGhhdCBjb3VsZCBxdWVyeSBpbnRvIHRoZXNlIG1hdGVyaWFsaXplZCBuYW1lIHN0b3Jlcy4gQW55d2F5cywgSSB0aG91Z2h0IEnigJlkIGNyZWF0ZSBteSBvd24gdXNpbmcgYSBtb3JlIHJlY2VudCB2ZXJzaW9uIG9mIFNwcmluZyBCb290IHdpdGggSmF2YSAxNC4KCiMjIFdoYXQgWW91IE5lZWQKCiogSmF2YSAxNAoqIE1hdmVuIDMuNi4wKwoqIERvY2tlciAxOSsKCiMjIEdldHRpbmcgU3RhcnRlZApXZSBuZWVkIHRvIGZpcnN0IGxhdW5jaCB0aGUgQ29uZmx1ZW50IHNlcnZpY2VzIChpLmUuIFNjaGVtYSBSZWdpc3RyeSwgQnJva2VyLCBab29LZWVwZXIpIGxvY2FsbHkgYnkgcnVubmluZyB0aGUgYGRvY2tlci1jb21wb3NlIHVwIC1kYCBDTEkgY29tbWFuZCB3aGVyZSB0aGUgW2RvY2tlci1jb21wb3NlLnltbF0oaHR0cHM6Ly9naXRodWIuY29tL2JjaGVuMDQvc3ByaW5nYm9vdC1rYWZrYS1zdHJlYW1zLXJlc3QtYXBpL2Jsb2IvbWFzdGVyL2RvY2tlci1jb21wb3NlLnltbCkgZmlsZSBpcy4gVHlwaWNhbGx5LCB5b3UgY2FuIGNyZWF0ZSBhIHN0YWNrIGZpbGUgKGluIHRoZSBmb3JtIG9mIGEgWUFNTCBmaWxlKSB0byBkZWZpbmUgeW91ciBhcHBsaWNhdGlvbnMuIFlvdSBjYW4gYWxzbyBydW4gYGRvY2tlci1jb21wb3NlIHBzYCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzdGFjay4gTm90aWNlLCB0aGUgZW5kcG9pbnRzIGZyb20gd2l0aGluIHRoZSBjb250YWluZXJzIG9uIHlvdXIgaG9zdCBtYWNoaW5lLgoKfCBOYW1lIHwgRnJvbSB3aXRoaW4gY29udGFpbmVycyB8IEZyb20gaG9zdCBtYWNoaW5lIHwKfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0gfAp8IEthZmthIEJyb2tlciB8IGJyb2tlcjo5MDkyIHwgbG9jYWxob3N0OjkwOTIgfAp8IFNjaGVtYSBSZWdpc3RyeSAgfCBodHRwOi8vc2NoZW1hLXJlZ2lzdHJ5OjgwODEgfCBodHRwOi8vbG9jYWxob3N0OjgwODEgfAp8IFpvb0tlZXBlciB8IHpvb2tlZXBlcjoyMTgxIHwgbG9jYWxob3N0OjIxODEgfAoKPiBOb3RlOiB5b3UgY2FuIHJ1biBgZG9ja2VyLWNvbXBvc2UgZG93bmAgdG8gc3RvcCBhbGwgc2VydmljZXMgYW5kIGNvbnRhaW5lcnMuCgpBcyBwYXJ0IG9mIHRoaXMgc2FtcGxlLCBJJ3ZlIHJldHJvZml0dGVkIHRoZSBhdmVyYWdlIGFnZ3JlZ2F0ZSBleGFtcGxlIGZyb20gW0NvbmZsdWVudCdzIEthZmthIFR1dG9yaWFsc10oaHR0cHM6Ly9rYWZrYS10dXRvcmlhbHMuY29uZmx1ZW50LmlvL2FnZ3JlZ2F0aW5nLWF2ZXJhZ2Uva3N0cmVhbXMuaHRtbCkgaW50byB0aGlzIHByb2plY3QuIFRoZSBBUEkgd2lsbCBjYWxjdWxhdGUgYW5kIHJldHVybiBhIHJ1bm5pbmcgYXZlcmFnZSByYXRpbmcgZm9yIGEgZ2l2ZW4gbW92aWUgaWRlbnRpZmllci4gVGhpcyBzaG91bGQgZGVtb25zdHJhdGUgaG93IHRvIGJ1aWxkIGEgYmFzaWMgQVBJIHNlcnZpY2Ugb24gdG9wIG9mIGFuIGFnZ3JlZ2F0aW9uIHJlc3VsdC4KCk5vdGljZSBpbiB0aGUgYH4vc3JjL21haW4vYXZyb2AgZGlyZWN0b3J5LCB3ZSBoYXZlIGFsbCBvdXIgQXZybyBzY2hlbWEgZmlsZXMgZm9yIHRoZSBzdHJlYW0gb2YgYHJhdGluZ3NgIGFuZCBgY291bnRzdW1gLiBGb3IgeW91ciBjb252ZW5pZW5jZSwgdGhlIGNsYXNzZXMgd2VyZSBhbHJlYWR5IGdlbmVyYXRlZCB1bmRlciB0aGUgYH4vc3JjL21haW4vamF2YS9pby9jb25mbHVlbnQvZGVtb2AgZGlyZWN0b3J5LCBidXQgZmVlbCBmcmVlIHRvIHRpbmtlciB3aXRoIHRoZW0gYW5kIHJlY29tcGlsZSB0aGUgc2NoZW1hcyBpZiBuZWVkZWQuIFRoZSBBdnJvIGNsYXNzZXMgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZ2VuZXJhdGVkIHVzaW5nIGBNYXZlbmAgb3IgYnkgbWFudWFsbHkgaW52b2tpbmcgdGhlIFtzY2hlbWEgY29tcGlsZXJdKGh0dHBzOi8vYXZyby5hcGFjaGUub3JnL2RvY3MvMS4xMC4wL2dldHRpbmdzdGFydGVkamF2YS5odG1sI0NvbXBpbGluZyt0aGUrc2NoZW1hKS4gCgpTbyBiZWZvcmUgYnVpbGRpbmcgYW5kIHJ1bm5pbmcgdGhlIHByb2plY3QsIG9wZW4gYSBuZXcgdGVybWluYWwgYW5kIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIHRvIGdlbmVyYXRlIHlvdXIgaW5wdXQgYW5kIG91dHB1dCB0b3BpY3MuCgpgYGB6c2gKJCAgZG9ja2VyLWNvbXBvc2UgZXhlYyBicm9rZXIga2Fma2EtdG9waWNzIC0tY3JlYXRlIC0tYm9vdHN0cmFwLXNlcnZlciBcCiAgIGxvY2FsaG9zdDo5MDkyIC0tcmVwbGljYXRpb24tZmFjdG9yIDEgLS1wYXJ0aXRpb25zIDEgLS10b3BpYyByYXRpbmdzCgokICBkb2NrZXItY29tcG9zZSBleGVjIGJyb2tlciBrYWZrYS10b3BpY3MgLS1jcmVhdGUgLS1ib290c3RyYXAtc2VydmVyIFwKICAgbG9jYWxob3N0OjkwOTIgLS1yZXBsaWNhdGlvbi1mYWN0b3IgMSAtLXBhcnRpdGlvbnMgMSAtLXRvcGljIHJhdGluZy1hdmVyYWdlcwpgYGAKCk5leHQsIHdlIHdpbGwgbmVlZCB0byBwcm9kdWNlIHNvbWUgZGF0YSBvbnRvIHRoZSBpbnB1dCB0b3BpYy4KCmBgYHpzaAokICBkb2NrZXIgZXhlYyAtaSBzY2hlbWEtcmVnaXN0cnkgL3Vzci9iaW4va2Fma2EtYXZyby1jb25zb2xlLXByb2R1Y2VyIC0tdG9waWMgcmF0aW5ncyAtLWJyb2tlci1saXN0IGJyb2tlcjo5MDkyXAogICAgLS1wcm9wZXJ0eSAicGFyc2Uua2V5PWZhbHNlIlwKICAgIC0tcHJvcGVydHkgImtleS5zZXBhcmF0b3I9OiJcCiAgICAtLXByb3BlcnR5IHZhbHVlLnNjaGVtYT0iJCg8IHNyYy9tYWluL2F2cm8vcmF0aW5nLmF2c2MpIgogYGBgCiAKUGFzdGUgaW4gdGhlIGZvbGxvd2luZyBganNvbmAgZGF0YSB3aGVuIHByb21wdGVkIGFuZCBiZSBzdXJlIHRvIHByZXNzIGVudGVyIHR3aWNlIHRvIGFjdHVhbGx5IHN1Ym1pdCBpdC4KCmBgYGpzb24KeyJtb3ZpZV9pZCI6MzYyLCJyYXRpbmciOjEwfQp7Im1vdmllX2lkIjozNjIsInJhdGluZyI6OH0KIGBgYAoKT3B0aW9uYWxseSwgeW91IGNhbiBhbHNvIHNlZSB0aGUgY29uc3VtZXIgcmVzdWx0cyBvbiB0aGUgb3V0cHV0IHRvcGljIGJ5IHJ1bm5pbmcgdGhpcyBjb21tYW5kIG9uIGEgbmV3IHRlcm1pbmFsIHdpbmRvdzoKCmBgYHpzaAokICBkb2NrZXIgZXhlYyAtaXQgYnJva2VyIC91c3IvYmluL2thZmthLWNvbnNvbGUtY29uc3VtZXIgLS10b3BpYyByYXRpbmctYXZlcmFnZXMgLS1ib290c3RyYXAtc2VydmVyIGJyb2tlcjo5MDkyIFwKICAgIC0tcHJvcGVydHkgInByaW50LmtleT10cnVlIlwKICAgIC0tcHJvcGVydHkgImtleS5kZXNlcmlhbGl6ZXI9b3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VyaWFsaXphdGlvbi5Mb25nRGVzZXJpYWxpemVyIiBcCiAgICAtLXByb3BlcnR5ICJ2YWx1ZS5kZXNlcmlhbGl6ZXI9b3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VyaWFsaXphdGlvbi5Eb3VibGVEZXNlcmlhbGl6ZXIiIFwKICAgIC0tZnJvbS1iZWdpbm5pbmcKYGBgCgojIyBCdWlsZCBhbmQgUnVuIHRoZSBTYW1wbGUKCllvdSBjYW4gaW1wb3J0IHRoZSBjb2RlIHN0cmFpZ2h0IGludG8geW91ciBwcmVmZXJyZWQgSURFIG9yIHJ1biB0aGUgc2FtcGxlIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCAoaW4gdGhlIHJvb3QgcHJvamVjdCBmb2xkZXIpLgoKYGBgenNoCiQgIG12biBzcHJpbmctYm9vdDpydW4KYGBgCkFmdGVyIHRoZSBhcHBsaWNhdGlvbiBydW5zLCBuYXZpZ2F0ZSB0byBbaHR0cDovL2xvY2FsaG9zdDo3MDAxL3N3YWdnZXItdWkvaW5kZXguaHRtbD9jb25maWdVcmw9L2FwaS1kb2NzL3N3YWdnZXItY29uZmlnXShodHRwOi8vbG9jYWxob3N0OjcwMDEvc3dhZ2dlci11aS9pbmRleC5odG1sP2NvbmZpZ1VybD0vYXBpLWRvY3Mvc3dhZ2dlci1jb25maWcpIGluIHlvdXIgd2ViIGJyb3dzZXIgdG8gYWNjZXNzIHRoZSBTd2FnZ2VyIFVJLiBJZiB5b3UgdXNlZCB0aGUgc2FtZSBzYW1wbGUgZGF0YSBmcm9tIGFib3ZlLCB5b3UgY2FuIGVudGVyIGAzNjJgIGFzIHRoZSBgbW92aWVJZGAgYW5kIGl0IHNob3VsZCByZXR1cm4gc29tZXRoaW5nIHNpbWlsYXIgbGlrZSB0aGlzIGJlbG93OgoKYGBganNvbgp7CiAgIm1vdmllSWQiOiAzNjIsCiAgInJhdGluZyI6IDkKfQpgYGAKCj4gTm90ZToga2VlcCBpbiBtaW5kIHRoZSB2YXJpb3VzIFtzdGF0ZXNdKGh0dHBzOi8va2Fma2EuYXBhY2hlLm9yZy8yNS9qYXZhZG9jL29yZy9hcGFjaGUva2Fma2Evc3RyZWFtcy9LYWZrYVN0cmVhbXMuU3RhdGUuaHRtbCkgb2YgdGhlIGNsaWVudC4gV2hlbiBhIEthZmthIFN0cmVhbXMgaW5zdGFuY2UgaXMgaW4gYFJVTk5JTkdgIHN0YXRlLCBpdCBhbGxvd3MgZm9yIGluc3BlY3Rpb24gb2YgdGhlIHN0cmVhbSdzIG1ldGFkYXRhIHVzaW5nIG1ldGhvZHMgbGlrZSBgcXVlcnlNZXRhZGF0YUZvcktleSgpYC4gV2hpbGUgaXQgaXMgaW4gYFJFQkFMQU5DSU5HYCBzdGF0ZSwgdGhlIFJFU1Qgc2VydmljZSBjYW5ub3QgaW1tZWRpYXRlbHkgYW5zd2VyIHJlcXVlc3RzIHVudGlsIHRoZSBzdGF0ZSBzdG9yZXMgYXJlIGZ1bGx5IHJlYnVpbHQuCgojIyBUcm91Ymxlc2hvb3RpbmcKCiogSW4gY2VydGFpbiBjb25kaXRpb25zLCB5b3UgbWF5IG5lZWQgdG8gZG8gYSBjb21wbGV0ZSBhcHBsaWNhdGlvbiByZXNldC4gWW91IGNhbiBkZWxldGUgdGhlIGFwcGxpY2F0aW9u4oCZcyBsb2NhbCBzdGF0ZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlIHdhcyBydW4uIEluIHRoaXMgcHJvamVjdCwgS2Fma2EgU3RyZWFtcyBwZXJzaXN0cyBsb2NhbCBzdGF0ZXMgdW5kZXIgdGhlIGB+L2RhdGFgIGZvbGRlci4K
- readmeEtag: '"8c67934d12533f0829b86012ce9b09bb6fc938d6"'
- readmeLastModified: Sat, 15 Aug 2020 18:19:50 GMT
- repositoryId: 281567320
- description: >-
- A sample RESTful API with Kafka Streams (2.6.0) using Spring Boot (2.3.3)
- and Java 14.
- created: '2020-07-22T03:43:45Z'
- updated: '2024-09-08T15:02:38Z'
- language: Java
- archived: false
- stars: 16
- watchers: 3
- forks: 9
- owner: ben-jamin-chen
- logo: https://avatars.githubusercontent.com/u/41641688?v=4
- license: MIT
- repoEtag: '"ce3bcef2b1907d97b660be8f5a8d1bf802c7e867206f19fc1b5d69670b9cfba8"'
- repoLastModified: Sun, 08 Sep 2024 15:02:38 GMT
- category: Server Implementations
- foundInMaster: true
- oldLocations:
- - https://github.com/buzzingben/springboot-kafka-streams-rest-api
- - https://github.com/bchen04/springboot-kafka-streams-rest-api
- source: openapi3 tags
repository: https://github.com/dgouyette/play-api-refiner
v3: true
@@ -15206,7 +15146,7 @@
owner: commonism
logo: https://avatars.githubusercontent.com/u/164513?v=4
license: BSD-3-Clause
- repoEtag: '"9b8c37adadc611003665c0cf007df5b6c0e82f387265f09859028cbdccfa8d15"'
+ repoEtag: '"da2f9302dd25c6a2130a55e3bf82f20d5e988d74f850d20ad3f5d6cca30ec51b"'
repoLastModified: Fri, 13 Sep 2024 23:35:57 GMT
foundInMaster: true
id: f7fe65d08545a563279e1526fe797380
@@ -15692,7 +15632,7 @@
Yapily’s OpenAPI Specification. Use this complete definition of our API
to generate client libraries in the language of your choice.
created: '2022-01-11T16:20:08Z'
- updated: '2024-09-26T12:50:35Z'
+ updated: '2024-09-30T16:13:44Z'
language: null
archived: false
stars: 13
@@ -15700,8 +15640,8 @@
forks: 2
owner: yapily
logo: https://avatars.githubusercontent.com/u/36482918?v=4
- repoEtag: '"6cae888c87951543b4d9fae91a2353b9c493c5ad8e81263e04690526136b1be3"'
- repoLastModified: Thu, 26 Sep 2024 12:50:35 GMT
+ repoEtag: '"bfcb5fc1a57538d037ef2f0642b3b37a75a69c3f0519e019fe6fdd50f60a8f90"'
+ repoLastModified: Mon, 30 Sep 2024 16:13:44 GMT
foundInMaster: true
category:
- SDK
@@ -15785,7 +15725,7 @@
owner: Jnig
logo: https://avatars.githubusercontent.com/u/3729585?v=4
license: MIT
- repoEtag: '"81d553279e227bd1306edb07966630ec3d7f323071d68924ac8d278856f52066"'
+ repoEtag: '"7fe3a7ee5a68f2117af747898e5381de2a9034fad855e954650767ac41f7693c"'
repoLastModified: Fri, 27 Sep 2024 22:56:25 GMT
category:
- Data Validators
@@ -16673,7 +16613,7 @@
owner: lrstanley
logo: https://avatars.githubusercontent.com/u/1847365?v=4
license: MIT
- repoEtag: '"fc3bf4ed7a7e307d933c2abb3b8fd9e077e540a3a7e1a862d152916f6efd351c"'
+ repoEtag: '"48422fed71d3c747ec38870f20b14cb597d0e51bdf7b42c4773465daf50b1214"'
repoLastModified: Sat, 28 Sep 2024 19:37:01 GMT
category: Documentation
foundInMaster: true
@@ -16812,13 +16752,13 @@
id: 9930662c3938ea0a73abd4e4169f027f
repositoryMetadata:
base64Readme: >-
- WyFbUHlQSSAtIFB5dGhvbiBWZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvcHl2ZXJzaW9ucy9haW9odHRwLWRlcHM/c3R5bGU9Zm9yLXRoZS1iYWRnZSldKGh0dHBzOi8vcHlwaS5vcmcvcHJvamVjdC9haW9odHRwLWRlcHMvKQpbIVtQeVBJXShodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvdi9haW9odHRwLWRlcHM/c3R5bGU9Zm9yLXRoZS1iYWRnZSldKGh0dHBzOi8vcHlwaS5vcmcvcHJvamVjdC9haW9odHRwLWRlcHMvKQpbIVtQeVBJIC0gRG93bmxvYWRzXShodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvZG0vYWlvaHR0cC1kZXBzP3N0eWxlPWZvci10aGUtYmFkZ2UpXShodHRwczovL3B5cGlzdGF0cy5vcmcvcGFja2FnZXMvYWlvaHR0cC1kZXBzKQoKIyBBaW9IVFRQIGRlcHMKCgpUaGlzIHByb2plY3Qgd2FzIGluaXRpYWxseSBjcmVhdGVkIHRvIHNob3cgdGhlIGFiaWxsaXRpZXMgb2YgW3Rhc2tpcS1kZXBlbmRlbmNpZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS90YXNraXEtcHl0aG9uL3Rhc2tpcS1kZXBlbmRlbmNpZXMpIHByb2plY3QsIHdoaWNoIGlzIHVzZWQgYnkgW3Rhc2tpcV0oaHR0cHM6Ly9naXRodWIuY29tL3Rhc2tpcS1weXRob24vdGFza2lxKSB0byBwcm92aWRlIHlvdSB3aXRoIHRoZSBiZXN0IGV4cGVyaWVuY2Ugb2Ygc2VuZGluZyBkaXN0cmlidXRlZCB0YXNrcy4KClRoaXMgcHJvamVjdCBhZGRzIFtGYXN0QVBJXShodHRwczovL2dpdGh1Yi5jb20vdGlhbmdvbG8vZmFzdGFwaSktbGlrZSBkZXBlbmRlbmN5IGluamVjdGlvbiB0byB5b3VyIFtBaW9IVFRQXShodHRwczovL2dpdGh1Yi5jb20vYWlvLWxpYnMvYWlvaHR0cCkgYXBwbGljYXRpb24gYW5kIHN3YWdnZXIgZG9jdW1lbnRhdGlvbiBiYXNlZCBvbiB0eXBlcy4KClRvIHN0YXJ0IHVzaW5nIGRlcGVuZGVuY3kgaW5qZWN0aW9uLCBqdXN0IGluaXRpYWxpemUgdGhlIGluamVjdG9yLgoKYGBgcHl0aG9uCmZyb20gYWlvaHR0cCBpbXBvcnQgd2ViCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBpbml0IGFzIGRlcHNfaW5pdAoKCmFwcCA9IHdlYi5BcHBsaWNhdGlvbigpCgoKYXBwLm9uX3N0YXJ0dXAuYXBwZW5kKGRlcHNfaW5pdCkKCndlYi5ydW5fYXBwKGFwcCkKCmBgYAoKCklmIHlvdSB1c2UgbXlweSwgdGhlbiB3ZSBoYXZlIGEgY3VzdG9tIHJvdXRlciB3aXRoIHByb3BwZXIgdHlwZXMuCgoKYGBgcHl0aG9uCmZyb20gYWlvaHR0cCBpbXBvcnQgd2ViCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBpbml0IGFzIGRlcHNfaW5pdApmcm9tIGFpb2h0dHBfZGVwcyBpbXBvcnQgUm91dGVyCgpyb3V0ZXIgPSBSb3V0ZXIoKQoKCkByb3V0ZXIuZ2V0KCIvIikKYXN5bmMgZGVmIGhhbmRsZXIoKToKICAgIHJldHVybiB3ZWIuanNvbl9yZXNwb25zZSh7fSkKCgphcHAgPSB3ZWIuQXBwbGljYXRpb24oKQoKYXBwLnJvdXRlci5hZGRfcm91dGVzKHJvdXRlcikKCmFwcC5vbl9zdGFydHVwLmFwcGVuZChkZXBzX2luaXQpCgp3ZWIucnVuX2FwcChhcHApCgpgYGAKCkFsc28sIHlvdSBjYW4gbmVzdCByb3V0ZXJzIHdpdGggcHJlZml4ZXMsCgpgYGBweXRob24KYXBpX3JvdXRlciA9IFJvdXRlcigpCgptZW1lc19yb3V0ZXIgPSBSb3V0ZXIoKQoKbWFpbl9yb3V0ZXIgPSBSb3V0ZXIoKQoKbWFpbl9yb3V0ZXIuYWRkX3JvdXRlcyhhcGlfcm91dGVyLCBwcmVmaXg9Ii9hcGkiKQptYWluX3JvdXRlci5hZGRfcm91dGVzKG1lbWVzX3JvdXRlciwgcHJlZml4PSIvbWVtZXMiKQpgYGAKCiMjIFN3YWdnZXIKCklmIHlvdSB1c2UgZGVwZW5kZW5jaWVzIGluIHlvdSBoYW5kbGVycywgd2UgY2FuIGVhc2lseSBnZW5lcmF0ZSBzd2FnZ2VyIGZvciB5b3UuCldlIGhhdmUgc29tZSBsaW1pdGF0aW9uczoKMS4gV2UgZG9uJ3Qgc3VwcG9ydCByZXNvbHZpbmcgdHlwZSBhbGlhc2VzIGlmIGhpbnQgaXMgYSBzdHJpbmcuCiAgICBJZiB5b3UgZGVmaW5lIHZhcmlhYmxlIGxpa2UgdGhpczogYG15dmFyID0gaW50IHwgTm9uZWAgYW5kIHRoZW4gaW4gaGFuZGxlcgogICAgeW91J2QgY3JlYXRlIGFubm90YXRpb24gbGlrZSB0aGlzOiBgcGFyYW06ICJzdHIgfCBteXZhciJgIGl0IHdpbGwgZmFpbC4KICAgIFlvdSBuZWVkIHRvIHVucXVvdGUgdHlwZSBoaW50IGluIG9yZGVyIHRvIGdldCBpdCB3b3JrLgoKV2Ugd2lsbCB0cnkgdG8gZml4IHRoZXNlIGxpbWl0YXRpb25zIGxhdGVyLgoKVG8gZW5hYmxlIHN3YWdnZXIsIGp1c3QgYWRkIGl0IHRvIHlvdXIgc3RhcnR1cC4KCmBgYHB5dGhvbgpmcm9tIGFpb2h0dHBfZGVwcyBpbXBvcnQgaW5pdCwgc2V0dXBfc3dhZ2dlcgoKYXBwID0gd2ViLkFwcGxpY2F0aW9uKCkKCmFwcC5vbl9zdGFydHVwLmV4dGVuZChbaW5pdCwgc2V0dXBfc3dhZ2dlcigpXSkKYGBgCgojIyMgUmVzcG9uc2VzCgpZb3UgY2FuIGRlZmluZSBzY2hlbWEgZm9yIHJlc3BvbnNlcyB1c2luZyBkYXRhY2xhc3NlcyBvcgpweWRhbnRpYyBtb2RlbHMuIFRoaXMgd291bGQgbm90IGFmZmVjdCBoYW5kbGVycyBpbiBhbnkgd2F5LAppdCdzIG9ubHkgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMsIGlmIHlvdSB3YW50IHRvIGFjdHVhbGx5CnZhbGlkYXRlIHZhbHVlcyB5b3VyIGhhbmRsZXIgcmV0dXJucywgcGxlYXNlIHdyaXRlIHlvdXIgb3duIHdyYXBwZXIuCgpgYGBweXRob24KZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCgpmcm9tIGFpb2h0dHAgaW1wb3J0IHdlYgpmcm9tIHB5ZGFudGljIGltcG9ydCBCYXNlTW9kZWwKCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBSb3V0ZXIsIG9wZW5hcGlfcmVzcG9uc2UKCnJvdXRlciA9IFJvdXRlcigpCgoKQGRhdGFjbGFzcwpjbGFzcyBTdWNjZXNzOgogICAgZGF0YTogc3RyCgoKY2xhc3MgVW5hdXRob3JpemVkKEJhc2VNb2RlbCk6CiAgICB3aHk6IHN0cgoKCkByb3V0ZXIuZ2V0KCIvIikKQG9wZW5hcGlfcmVzcG9uc2UoMjAwLCBTdWNjZXNzLCBjb250ZW50X3R5cGU9ImFwcGxpY2F0aW9uL3htbCIpCkBvcGVuYXBpX3Jlc3BvbnNlKDIwMCwgU3VjY2VzcykKQG9wZW5hcGlfcmVzcG9uc2UoNDAxLCBVbmF1dGhvcml6ZWQsIGRlc2NyaXB0aW9uPSJXaGVuIHRva2VuIGlzIG5vdCBjb3JyZWN0IikKYXN5bmMgZGVmIGhhbmRsZXIoKSAtPiB3ZWIuUmVzcG9uc2U6CiAgICAuLi4KYGBgCgpUaGlzIGV4YW1wbGUgaWxsdXN0cmF0ZXMgaG93IG11Y2ggeW91IGNhbiBkbyB3aXRoIHRoaXMgZGVjb3JhdG9yLiBZb3UKY2FuIGhhdmUgbXVsdGlwbGUgY29udGVudC10eXBlcyBmb3IgYSBzaW5nbGUgc3RhdHVzLCBvciB5b3UgY2FuIGhhdmUgZGlmZmVyZW50CnBvc3NibGUgc3RhdHVzZXMuIFRoaXMgZnVuY3Rpb24gaXMgcHJldHR5IHNpbXBsZSBhbmQgaWYgeW91IHdhbnQgdG8gbWFrZQp5b3VyIG93biBkZWNvcmF0b3IgZm9yIHlvdXIgcmVzcG9uc2VzLCBpdCB3b24ndCBiZSBoYXJkLgoKCiMjIERlZmF1bHQgZGVwZW5kZW5jaWVzCgpCeSBkZWZhdWx0IHRoaXMgbGlicmFyeSBwcm92aWRlcyBvbmx5IHR3byBpbmplY3RhYmxlcy4gYHdlYi5SZXF1ZXN0YCBhbmQgYHdlYi5BcHBsaWNhdGlvbmAuCgpgYGBweXRob24KCmFzeW5jIGRlZiBoYW5kbGVyKGFwcDogd2ViLkFwcGxpY2F0aW9uID0gRGVwZW5kcygpKTogLi4uCgphc3luYyBkZWYgaGFuZGxlcjIocmVxdWVzdDogd2ViLlJlcXVlc3QgPSBEZXBlbmRzKCkpOiAuLi4KCmBgYAoKSXQncyBzdXBlciB1c2VmdWwsIGJlY2F1c2UgeW91IGNhbiB1c2UgdGhlc2UgZGVwZW5kZW5jaWVzIGluCmFueSBvdGhlciBkZXBlbmRlbmN5LiBIZXJlJ3MgYSBtb3JlIGNvbXBsZXggZXhhbXBsZSBvZiBob3cgeW91IGNhbiB1c2UgdGhpcyBsaWJyYXJ5LgoKCmBgYHB5dGhvbgpmcm9tIGFpb2h0dHBfZGVwcyBpbXBvcnQgUm91dGVyLCBEZXBlbmRzCmZyb20gYWlvaHR0cCBpbXBvcnQgd2ViCgpyb3V0ZXIgPSBSb3V0ZXIoKQoKCmFzeW5jIGRlZiBnZXRfZGJfc2Vzc2lvbihhcHA6IHdlYi5BcHBsaWNhdGlvbiA9IERlcGVuZHMoKSk6CiAgICBhc3luYyB3aXRoIGFwcFt3ZWIuQXBwS2V5KCJkYiIpXSBhcyBzZXNzOgogICAgICAgIHlpZWxkIHNlc3MKCgpjbGFzcyBNeURBTzoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXNzaW9uPURlcGVuZHMoZ2V0X2RiX3Nlc3Npb24pKToKICAgICAgICBzZWxmLnNlc3Npb24gPSBzZXNzaW9uCgogICAgYXN5bmMgZGVmIGdldF9vYmplY3RzKHNlbGYpIC0+IGxpc3Rbb2JqZWN0XToKICAgICAgICByZXR1cm4gYXdhaXQgc2VsZi5zZXNzaW9uLmV4ZWN1dGUoIlNFTEVDVCAxIikKCgpAcm91dGVyLmdldCgiLyIpCmFzeW5jIGRlZiBoYW5kbGVyKGRiX3Nlc3Npb246IE15REFPID0gRGVwZW5kcygpKToKICAgIG9ianMgPSBhd2FpdCBkYl9zZXNzaW9uLmdldF9vYmplY3RzKCkKICAgIHJldHVybiB3ZWIuanNvbl9yZXNwb25zZSh7Im9iamVjdHMiOiBvYmpzfSkKCmBgYAoKSWYgeW91IGRvIHNvbWV0aGluZyBsaWtlIHRoaXMsIHlvdSB3b3VsZCBuZXZlciB0aGluayBhYm91dCBpbml0aWFsaXppbmcgeW91ciBEQU8uIFlvdSBjYW4ganVzdCBpbmplY3QgaXQgYW5kIHRoYXQncyBpdC4KCgojIEJ1aWx0LWluIGRlcGVuZGVuY2llcwoKVGhpcyBsaWJyYXJ5IGFsc28gcHJvdmlkZXMgeW91IHdpdGggc29tZSBkZWZhdWx0IGRlcGVuZGVuY2llcyB0aGF0IGNhbiBoZWxwIHlvdSBpbiBidWlsZGluZyB0aGUgYmVzdCB3ZWItc2VydmljZS4KCiMjIEpzb24KClRvIHBhcnNlIGpzb24sIGNyZWF0ZSBhIHB5ZGFudGljIG1vZGVsIGFuZCBhZGQgYSBkZXBlbmRlbmN5IHRvIHlvdXIgaGFuZGxlci4KCgpgYGBweXRob24KZnJvbSBhaW9odHRwIGltcG9ydCB3ZWIKZnJvbSBweWRhbnRpYyBpbXBvcnQgQmFzZU1vZGVsCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBSb3V0ZXIsIEpzb24sIERlcGVuZHMKCnJvdXRlciA9IFJvdXRlcigpCgoKY2xhc3MgVXNlckluZm8oQmFzZU1vZGVsKToKICAgIG5hbWU6IHN0cgoKCkByb3V0ZXIucG9zdCgiL3VzZXJzIikKYXN5bmMgZGVmIG5ld19kYXRhKHVzZXI6IFVzZXJJbmZvID0gRGVwZW5kcyhKc29uKCkpKToKICAgIHJldHVybiB3ZWIuanNvbl9yZXNwb25zZSh7InVzZXIiOiB1c2VyLm1vZGVsX2R1bXAoKX0pCgpgYGAKClRoaXMgZGVwZW5kZW5jeSBhdXRvbWF0aWNhbGx5IHZhbGlkYXRlcyBkYXRhIGFuZCBzZW5kCmVycm9ycyBpZiB0aGUgZGF0YSBkb2Vzbid0IG9ycmVsYXRlIHdpdGggc2NoZW1hIG9yIGJvZHkgaXMgbm90IGEgdmFsaWQganNvbi4KCklmIHlvdSB3YW50IHRvIG1ha2UgdGhpcyBkYXRhIG9wdGlvbmFsLCBqdXN0IG1hcmsgaXQgYXMgb3B0aW9uYWwuCgpgYGBweXRob24KQHJvdXRlci5wb3N0KCIvdXNlcnMiKQphc3luYyBkZWYgbmV3X2RhdGEodXNlcjogT3B0aW9uYWxbVXNlckluZm9dID0gRGVwZW5kcyhKc29uKCkpKToKICAgIGlmIHVzZXIgaXMgTm9uZToKICAgICAgICByZXR1cm4gd2ViLmpzb25fcmVzcG9uc2UoeyJ1c2VyIjogTm9uZX0pCiAgICByZXR1cm4gd2ViLmpzb25fcmVzcG9uc2UoeyJ1c2VyIjogdXNlci5tb2RlbF9kdW1wKCl9KQoKYGBgCgojIyBIZWFkZXJzCgpZb3UgY2FuIGdldCBhbmQgdmFsaWRhdGUgaGVhZGVycyB1c2luZyBgSGVhZGVyYCBkZXBlbmRlbmN5LgoKTGV0J3MgdHJ5IHRvIGJ1aWxkIHNpbXBsZSBleGFtcGxlIGZvciBhdXRob3JpemF0aW9uLgoKYGBgcHl0aG9uCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBSb3V0ZXIsIEhlYWRlciwgRGVwZW5kcwpmcm9tIGFpb2h0dHAgaW1wb3J0IHdlYgoKcm91dGVyID0gUm91dGVyKCkKCgpkZWYgZGVjb2RlX3Rva2VuKGF1dGhvcml6YXRpb246IHN0ciA9IERlcGVuZHMoSGVhZGVyKCkpKSAtPiBzdHI6CiAgICBpZiBhdXRob3JpemF0aW9uID09ICJzZWNyZXQiOgogICAgICAgICMgTGV0J3MgcHJldGVuZCB0aGF0IGhlcmUgd2UKICAgICAgICAjIGRlY29kZSBvdXIgdG9rZW4uCiAgICAgICAgcmV0dXJuIGF1dGhvcml6YXRpb24KICAgIHJhaXNlIHdlYi5IVFRQVW5hdXRob3JpemVkKCkKCgpAcm91dGVyLmdldCgiL3NlY3JldF9kYXRhIikKYXN5bmMgZGVmIG5ld19kYXRhKHRva2VuOiBzdHIgPSBEZXBlbmRzKGRlY29kZV90b2tlbikpIC0+IHdlYi5SZXNwb25zZToKICAgIHJldHVybiB3ZWIuanNvbl9yZXNwb25zZSh7InNlY3JldCI6ICJub3QgYSBzZWNyZXQifSkKCmBgYAoKQXMgeW91IGNhbiBzZWUsIGhlYWRlciBuYW1lIHRvIHBhcnNlIGlzIGVxdWFsIHRvIHRoZQpuYW1lIG9mIGEgcGFyYW1ldGVyIHRoYXQgaW50cm9kdWNlcyBIZWFkZXIgZGVwZW5kZW5jeS4KCklmIHlvdSB3YW50IHRvIHVzZSBzb21lIG5hbWUgdGhhdCBpcyBub3QgYWxsb3dlZCBpbiBweXRob24sIG9yIGp1c3Qgd2FudCB0byBoYXZlIGRpZmZlcmVudCBuYW1lcywgeW91IGNhbiB1c2UgYWxpYXMuIExpa2UgdGhpczoKCmBgYHB5dGhvbgpkZWYgZGVjb2RlX3Rva2VuKGF1dGg6IHN0ciA9IERlcGVuZHMoSGVhZGVyKGFsaWFzPSJBdXRob3JpemF0aW9uIikpKSAtPiBzdHI6CmBgYAoKSGVhZGVycyBjYW4gYWxzbyBiZSBwYXJzZWQgdG8gdHlwZXMuIElmIHlvdSB3YW50IGEgaGVhZGVyIHRvIGJlIHBhcnNlZCBhcyBpbnQsIGp1c3QgYWRkIHRoZSB0eXBlaGludC4KCmBgYHB5dGhvbgpkZWYgZGVjb2RlX3Rva2VuKG1lbWVfaWQ6IGludCA9IERlcGVuZHMoSGVhZGVyKCkpKSAtPiBzdHI6CmBgYAoKSWYgeW91IHdhbnQgdG8gZ2V0IGxpc3Qgb2YgdmFsdWVzIG9mIG9uZSBoZWFkZXIsIHVzZSBwYXJhbWV0ZXIgYG11bHRpcGxlPVRydWVgLgoKYGBgcHl0aG9uCmRlZiBkZWNvZGVfdG9rZW4obWVtZV9pZDogbGlzdFtpbnRdID0gRGVwZW5kcyhIZWFkZXIobXVsdGlwbGU9VHJ1ZSkpKSAtPiBzdHI6CgpgYGAKCkFuZCwgb2YgY291cnNlLCB5b3UgY2FuIHByb3ZpZGUgdGhpcyBkZXBlbmRlbmN5IHdpdGggZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdmFsdWUgZnJvbSB1c2VyIGNhbm5vdCBiZSBwYXJzZWQgZm9yIHNvbWUgcmVhc29uLgoKYGBgcHl0aG9uCmRlZiBkZWNvZGVfdG9rZW4obWVtZV9pZDogc3RyID0gRGVwZW5kcyhIZWFkZXIoZGVmYXVsdD0ibm90LWEtc2VjcmV0IikpKSAtPiBzdHI6CmBgYAoKCiMjIFF1ZXJpZXMKCllvdSBjYW4gZGVwZW5kIG9uIGBRdWVyeWAgdG8gZ2V0IGFuZCBwYXJzZSBxdWVyeSBwYXJhbWV0ZXJzLgoKYGBgcHl0aG9uCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBSb3V0ZXIsIFF1ZXJ5LCBEZXBlbmRzCmZyb20gYWlvaHR0cCBpbXBvcnQgd2ViCgpyb3V0ZXIgPSBSb3V0ZXIoKQoKCkByb3V0ZXIuZ2V0KCIvc2hvcCIpCmFzeW5jIGRlZiBzaG9wKGl0ZW1faWQ6IHN0ciA9IERlcGVuZHMoUXVlcnkoKSkpIC0+IHdlYi5SZXNwb25zZToKICAgIHJldHVybiB3ZWIuanNvbl9yZXNwb25zZSh7ImlkIjogaXRlbV9pZH0pCgpgYGAKCnRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgZnVuY3Rpb24gcGFyYW1ldGVyLgoKVGhlIFF1ZXJ5IGRlcGVuZGVuY3kgaXMgYWN1YWxseSB0aGUgc2FtZSBhcyB0aGUgSGVhZGVyIGRlcGVuZGVuY3ksIHNvIGV2ZXJ5dGhpbmcgYWJvdXQgdGhlIGBIZWFkZXJgIGRlcGVuZGVuY3kgYWxzbyBhcHBsaWVzIHRvIGBRdWVyeWAuCgojIyBWaWV3cwoKSWYgeW91IHVzZSB2aWV3cyBhcyBoYW5kbGVycywgcGxlYXNlIHVzZSBWaWV3IGNsYXNzIGZyb20gYGFpb2h0dHBfZGVwc2AsIG90aGVyd2lzZSB0aGUgbWFnaWMgd29uJ3Qgd29yay4KCmBgYHB5dGhvbgpmcm9tIGFpb2h0dHBfZGVwcyBpbXBvcnQgUm91dGVyLCBWaWV3LCBEZXBlbmRzCmZyb20gYWlvaHR0cCBpbXBvcnQgd2ViCgpyb3V0ZXIgPSBSb3V0ZXIoKQoKCkByb3V0ZXIudmlldygiL3ZpZXciKQpjbGFzcyBNeVZpZXcoVmlldyk6CiAgICBhc3luYyBkZWYgZ2V0KHNlbGYsIGFwcDogd2ViLkFwcGxpY2F0aW9uID0gRGVwZW5kcygpKToKICAgICAgICByZXR1cm4gd2ViLmpzb25fcmVzcG9uc2UoeyJhcHAiOiBzdHIoYXBwKX0pCgpgYGAKCgojIyBGb3JtcwoKTm93IHlvdSBjYW4gZWFzaXkgZ2V0IGFuZCB2YWxpZGF0ZSBmb3JtIGRhdGEgZnJvbSB5b3VyIHJlcXVlc3QuClRvIG1ha2UgdGhlIG1hZ2ljIGhhcHBlbiwgcGxlYXNlIGFkZCBgYXJiaXRyYXJ5X3R5cGVzX2FsbG93ZWRgIHRvIHRoZSBjb25maWcgb2YgeW91ciBtb2RlbC4KCgpgYGBweXRob24KaW1wb3J0IHB5ZGFudGljCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBSb3V0ZXIsIERlcGVuZHMsIEZvcm0KZnJvbSBhaW9odHRwIGltcG9ydCB3ZWIKCnJvdXRlciA9IFJvdXRlcigpCgoKY2xhc3MgTXlGb3JtKHB5ZGFudGljLkJhc2VNb2RlbCk6CiAgICBpZDogaW50CiAgICBmaWxlOiB3ZWIuRmlsZUZpZWxkCgogICAgbW9kZWxfY29uZmlnID0gcHlkYW50aWMuQ29uZmlnRGljdChhcmJpdHJhcnlfdHlwZXNfYWxsb3dlZD1UcnVlKQoKCkByb3V0ZXIucG9zdCgiLyIpCmFzeW5jIGRlZiBoYW5kbGVyKG15X2Zvcm06IE15Rm9ybSA9IERlcGVuZHMoRm9ybSgpKSk6CiAgICB3aXRoIG9wZW4oIm15X2ZpbGUiLCAid2IiKSBhcyBmOgogICAgICAgIGYud3JpdGUobXlfZm9ybS5maWxlLmZpbGUucmVhZCgpKQogICAgcmV0dXJuIHdlYi5qc29uX3Jlc3BvbnNlKHsiaWQiOiBteV9mb3JtLmlkfSkKCmBgYAoKIyMgUGF0aAoKSWYgeW91IGhhdmUgcGF0aCB2YXJpYWJsZXMsIHlvdSBjYW4gYWxzbyBpbmplY3QgdGhlbSBpbiB5b3VyIGhhbmRsZXIuCgpgYGBweXRob24KZnJvbSBhaW9odHRwX2RlcHMgaW1wb3J0IFJvdXRlciwgUGF0aCwgRGVwZW5kcwpmcm9tIGFpb2h0dHAgaW1wb3J0IHdlYgoKcm91dGVyID0gUm91dGVyKCkKCgpAcm91dGVyLmdldCgiL3ZpZXcve3Zhcn0iKQphc3luYyBkZWYgbXlfaGFuZGxlcih2YXI6IHN0ciA9IERlcGVuZHMoUGF0aCgpKSk6CiAgICByZXR1cm4gd2ViLmpzb25fcmVzcG9uc2UoeyJ2YXIiOiB2YXJ9KQoKYGBgCgoKIyMgT3ZlcnJpZGlpbmcgZGVwZW5kZW5jaWVzCgpTb21ldGltZXMgZm9yIHRlc3RzIHlvdSBkb24ndCB3YW50IHRvIGNhbGN1bGF0ZSBhY3R1YWwgZnVuY3Rpb25zCmFuZCB5b3Ugd2FudCB0byBwYXNzIGFub3RoZXIgZnVuY3Rpb25zIGluc3RlYWQuCgpUbyBkbyBzbywgeW91IGNhbiBhZGQgImRlcGVuZGVuY3lfb3ZlcnJpZGVzIiBvciAidmFsdWVzX292ZXJyaWRlcyIgdG8gdGhlIGFwbGljYXRpb24ncyBzdGF0ZS4KVGhlc2UgdmFsdWVzIHNob3VsZCBiZSBkaWN0cy4gVGhlIGtleXMgZm9yIHRoZXNlIHZhbHVlcyBjYW4gYmUgZm91bmQgaW4gYGFpb2h0dHBfZGVwcy5rZXlzYCBtb2R1bGUuCgpIZXJlJ3MgYW4gZXhhbXBsZS4KCmBgYHB5dGhvbgpkZWYgb3JpZ2luYWxfZGVwKCkgLT4gaW50OgogICAgcmV0dXJuIDEKCmNsYXNzIE15VmlldyhWaWV3KToKICAgIGFzeW5jIGRlZiBnZXQoc2VsZiwgbnVtOiBpbnQgPSBEZXBlbmRzKG9yaWdpbmFsX2RlcCkpOgogICAgICAgICIiIk5vdGhpbmcuIiIiCiAgICAgICAgcmV0dXJuIHdlYi5qc29uX3Jlc3BvbnNlKHsicmVxdWVzdCI6IG51bX0pCmBgYAoKSW1hZ2luZSB5b3UgaGF2ZSBhIGhhbmRsZXIgdGhhdCBkZXBlbmRzIG9uIHNvbWUgZnVuY3Rpb24sCmJ1dCBpbnN0ZWFkIG9mIGAxYCB5b3Ugd2FudCB0byBoYXZlIGAyYCBpbiB5b3VyIHRlc3RzLgoKVG8gZG8gaXQsIGpzdXQgYWRkIGBkZXBlbmRlbmN5X292ZXJyaWRlc2Agc29tZXdoZXJlLAp3aGVyZSB5b3UgY3JlYXRlIHlvdXIgYXBwbGljYXRpb24uIEFuZCBtYWtlIHN1cmUgdGhhdCBrZXlzCm9mIHRoYXQgZGljdCBhcmUgYWN0dWFsIGZ1bmN0aW9uIHRoYXQgYXJlIGJlaW5nIHJlcGxhY2VkLgoKYGBgcHl0aG9uCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBWQUxVRVNfT1ZFUlJJREVTX0tFWQoKbXlfYXBwW1ZBTFVFU19PVkVSUklERVNfS0VZXSA9IHtvcmlnaW5hbF9kZXA6IDJ9CmBgYAoKQnV0IGB2YWx1ZXNfb3ZlcnJpZGVzYCBvbmx5IG92ZXJyaWRlcyByZXR1cm5lZCB2YWx1ZXMuIElmIHlvdSB3YW50IHRvCm92ZXJyaWRlIGZ1bmN0aW9ucywgeW91IGhhdmUgdG8gdXNlIGBkZXBlbmRlbmN5X292ZXJyaWRlc2AuIEhlcmUncyBhbiBleGFtcGxlOgoKYGBgcHl0aG9uCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBERVBFTkRFTkNZX09WRVJSSURFU19LRVkKCmRlZiByZXBsYWNpbmdfZnVuY3Rpb24oKSAtPiBpbnQ6CiAgICByZXR1cm4gMgoKCm15X2FwcFtERVBFTkRFTkNZX09WRVJSSURFU19LRVldID0ge29yaWdpbmFsX2RlcDogcmVwbGFjaW5nX2Z1bmN0aW9ufQpgYGAKClRoZSBjb29sIHBvaW50IGFib3V0IGBkZXBlbmRlbmN5X292ZXJyaWRlc2AsIGlzIHRoYXQgaXQgcmVjYWxjdWxhdGVzIGdyYXBoIGFuZAp5b3UgY2FuIHVzZSBkZXBlbmRlbmNpZXMgaW4gZnVuY3Rpb24gdGhhdCByZXBsYWNlcyB0aGUgb3JpZ2luYWwuCg==
- readmeEtag: '"a3c366fa9677f7597e342485c14bf2272ee200b0"'
- readmeLastModified: Mon, 05 Feb 2024 20:25:30 GMT
+ WyFbUHlQSSAtIFB5dGhvbiBWZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvcHl2ZXJzaW9ucy9haW9odHRwLWRlcHM/c3R5bGU9Zm9yLXRoZS1iYWRnZSldKGh0dHBzOi8vcHlwaS5vcmcvcHJvamVjdC9haW9odHRwLWRlcHMvKQpbIVtQeVBJXShodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvdi9haW9odHRwLWRlcHM/c3R5bGU9Zm9yLXRoZS1iYWRnZSldKGh0dHBzOi8vcHlwaS5vcmcvcHJvamVjdC9haW9odHRwLWRlcHMvKQpbIVtQeVBJIC0gRG93bmxvYWRzXShodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvZG0vYWlvaHR0cC1kZXBzP3N0eWxlPWZvci10aGUtYmFkZ2UpXShodHRwczovL3B5cGlzdGF0cy5vcmcvcGFja2FnZXMvYWlvaHR0cC1kZXBzKQoKIyBBaW9IVFRQIGRlcHMKCgpUaGlzIHByb2plY3Qgd2FzIGluaXRpYWxseSBjcmVhdGVkIHRvIHNob3cgdGhlIGFiaWxsaXRpZXMgb2YgW3Rhc2tpcS1kZXBlbmRlbmNpZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS90YXNraXEtcHl0aG9uL3Rhc2tpcS1kZXBlbmRlbmNpZXMpIHByb2plY3QsIHdoaWNoIGlzIHVzZWQgYnkgW3Rhc2tpcV0oaHR0cHM6Ly9naXRodWIuY29tL3Rhc2tpcS1weXRob24vdGFza2lxKSB0byBwcm92aWRlIHlvdSB3aXRoIHRoZSBiZXN0IGV4cGVyaWVuY2Ugb2Ygc2VuZGluZyBkaXN0cmlidXRlZCB0YXNrcy4KClRoaXMgcHJvamVjdCBhZGRzIFtGYXN0QVBJXShodHRwczovL2dpdGh1Yi5jb20vdGlhbmdvbG8vZmFzdGFwaSktbGlrZSBkZXBlbmRlbmN5IGluamVjdGlvbiB0byB5b3VyIFtBaW9IVFRQXShodHRwczovL2dpdGh1Yi5jb20vYWlvLWxpYnMvYWlvaHR0cCkgYXBwbGljYXRpb24gYW5kIHN3YWdnZXIgZG9jdW1lbnRhdGlvbiBiYXNlZCBvbiB0eXBlcy4KClRvIHN0YXJ0IHVzaW5nIGRlcGVuZGVuY3kgaW5qZWN0aW9uLCBqdXN0IGluaXRpYWxpemUgdGhlIGluamVjdG9yLgoKYGBgcHl0aG9uCmZyb20gYWlvaHR0cCBpbXBvcnQgd2ViCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBpbml0IGFzIGRlcHNfaW5pdAoKCmFwcCA9IHdlYi5BcHBsaWNhdGlvbigpCgoKYXBwLm9uX3N0YXJ0dXAuYXBwZW5kKGRlcHNfaW5pdCkKCndlYi5ydW5fYXBwKGFwcCkKCmBgYAoKCklmIHlvdSB1c2UgbXlweSwgdGhlbiB3ZSBoYXZlIGEgY3VzdG9tIHJvdXRlciB3aXRoIHByb3BwZXIgdHlwZXMuCgoKYGBgcHl0aG9uCmZyb20gYWlvaHR0cCBpbXBvcnQgd2ViCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBpbml0IGFzIGRlcHNfaW5pdApmcm9tIGFpb2h0dHBfZGVwcyBpbXBvcnQgUm91dGVyCgpyb3V0ZXIgPSBSb3V0ZXIoKQoKCkByb3V0ZXIuZ2V0KCIvIikKYXN5bmMgZGVmIGhhbmRsZXIoKToKICAgIHJldHVybiB3ZWIuanNvbl9yZXNwb25zZSh7fSkKCgphcHAgPSB3ZWIuQXBwbGljYXRpb24oKQoKYXBwLnJvdXRlci5hZGRfcm91dGVzKHJvdXRlcikKCmFwcC5vbl9zdGFydHVwLmFwcGVuZChkZXBzX2luaXQpCgp3ZWIucnVuX2FwcChhcHApCgpgYGAKCkFsc28sIHlvdSBjYW4gbmVzdCByb3V0ZXJzIHdpdGggcHJlZml4ZXMsCgpgYGBweXRob24KYXBpX3JvdXRlciA9IFJvdXRlcigpCgptZW1lc19yb3V0ZXIgPSBSb3V0ZXIoKQoKbWFpbl9yb3V0ZXIgPSBSb3V0ZXIoKQoKbWFpbl9yb3V0ZXIuYWRkX3JvdXRlcyhhcGlfcm91dGVyLCBwcmVmaXg9Ii9hcGkiKQptYWluX3JvdXRlci5hZGRfcm91dGVzKG1lbWVzX3JvdXRlciwgcHJlZml4PSIvbWVtZXMiKQpgYGAKCiMjIFN3YWdnZXIKCklmIHlvdSB1c2UgZGVwZW5kZW5jaWVzIGluIHlvdSBoYW5kbGVycywgd2UgY2FuIGVhc2lseSBnZW5lcmF0ZSBzd2FnZ2VyIGZvciB5b3UuCldlIGhhdmUgc29tZSBsaW1pdGF0aW9uczoKMS4gV2UgZG9uJ3Qgc3VwcG9ydCByZXNvbHZpbmcgdHlwZSBhbGlhc2VzIGlmIGhpbnQgaXMgYSBzdHJpbmcuCiAgICBJZiB5b3UgZGVmaW5lIHZhcmlhYmxlIGxpa2UgdGhpczogYG15dmFyID0gaW50IHwgTm9uZWAgYW5kIHRoZW4gaW4gaGFuZGxlcgogICAgeW91J2QgY3JlYXRlIGFubm90YXRpb24gbGlrZSB0aGlzOiBgcGFyYW06ICJzdHIgfCBteXZhciJgIGl0IHdpbGwgZmFpbC4KICAgIFlvdSBuZWVkIHRvIHVucXVvdGUgdHlwZSBoaW50IGluIG9yZGVyIHRvIGdldCBpdCB3b3JrLgoKV2Ugd2lsbCB0cnkgdG8gZml4IHRoZXNlIGxpbWl0YXRpb25zIGxhdGVyLgoKVG8gZW5hYmxlIHN3YWdnZXIsIGp1c3QgYWRkIGl0IHRvIHlvdXIgc3RhcnR1cC4KCmBgYHB5dGhvbgpmcm9tIGFpb2h0dHBfZGVwcyBpbXBvcnQgaW5pdCwgc2V0dXBfc3dhZ2dlcgoKYXBwID0gd2ViLkFwcGxpY2F0aW9uKCkKCmFwcC5vbl9zdGFydHVwLmV4dGVuZChbaW5pdCwgc2V0dXBfc3dhZ2dlcigpXSkKYGBgCgojIyMgUmVzcG9uc2VzCgpZb3UgY2FuIGRlZmluZSBzY2hlbWEgZm9yIHJlc3BvbnNlcyB1c2luZyBkYXRhY2xhc3NlcyBvcgpweWRhbnRpYyBtb2RlbHMuIFRoaXMgd291bGQgbm90IGFmZmVjdCBoYW5kbGVycyBpbiBhbnkgd2F5LAppdCdzIG9ubHkgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMsIGlmIHlvdSB3YW50IHRvIGFjdHVhbGx5CnZhbGlkYXRlIHZhbHVlcyB5b3VyIGhhbmRsZXIgcmV0dXJucywgcGxlYXNlIHdyaXRlIHlvdXIgb3duIHdyYXBwZXIuCgpgYGBweXRob24KZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCgpmcm9tIGFpb2h0dHAgaW1wb3J0IHdlYgpmcm9tIHB5ZGFudGljIGltcG9ydCBCYXNlTW9kZWwKCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBSb3V0ZXIsIG9wZW5hcGlfcmVzcG9uc2UKCnJvdXRlciA9IFJvdXRlcigpCgoKQGRhdGFjbGFzcwpjbGFzcyBTdWNjZXNzOgogICAgZGF0YTogc3RyCgoKY2xhc3MgVW5hdXRob3JpemVkKEJhc2VNb2RlbCk6CiAgICB3aHk6IHN0cgoKCkByb3V0ZXIuZ2V0KCIvIikKQG9wZW5hcGlfcmVzcG9uc2UoMjAwLCBTdWNjZXNzLCBjb250ZW50X3R5cGU9ImFwcGxpY2F0aW9uL3htbCIpCkBvcGVuYXBpX3Jlc3BvbnNlKDIwMCwgU3VjY2VzcykKQG9wZW5hcGlfcmVzcG9uc2UoNDAxLCBVbmF1dGhvcml6ZWQsIGRlc2NyaXB0aW9uPSJXaGVuIHRva2VuIGlzIG5vdCBjb3JyZWN0IikKYXN5bmMgZGVmIGhhbmRsZXIoKSAtPiB3ZWIuUmVzcG9uc2U6CiAgICAuLi4KYGBgCgpUaGlzIGV4YW1wbGUgaWxsdXN0cmF0ZXMgaG93IG11Y2ggeW91IGNhbiBkbyB3aXRoIHRoaXMgZGVjb3JhdG9yLiBZb3UKY2FuIGhhdmUgbXVsdGlwbGUgY29udGVudC10eXBlcyBmb3IgYSBzaW5nbGUgc3RhdHVzLCBvciB5b3UgY2FuIGhhdmUgZGlmZmVyZW50CnBvc3NibGUgc3RhdHVzZXMuIFRoaXMgZnVuY3Rpb24gaXMgcHJldHR5IHNpbXBsZSBhbmQgaWYgeW91IHdhbnQgdG8gbWFrZQp5b3VyIG93biBkZWNvcmF0b3IgZm9yIHlvdXIgcmVzcG9uc2VzLCBpdCB3b24ndCBiZSBoYXJkLgoKCiMjIERlZmF1bHQgZGVwZW5kZW5jaWVzCgpCeSBkZWZhdWx0IHRoaXMgbGlicmFyeSBwcm92aWRlcyBvbmx5IHR3byBpbmplY3RhYmxlcy4gYHdlYi5SZXF1ZXN0YCBhbmQgYHdlYi5BcHBsaWNhdGlvbmAuCgpgYGBweXRob24KCmFzeW5jIGRlZiBoYW5kbGVyKGFwcDogd2ViLkFwcGxpY2F0aW9uID0gRGVwZW5kcygpKTogLi4uCgphc3luYyBkZWYgaGFuZGxlcjIocmVxdWVzdDogd2ViLlJlcXVlc3QgPSBEZXBlbmRzKCkpOiAuLi4KCmBgYAoKSXQncyBzdXBlciB1c2VmdWwsIGJlY2F1c2UgeW91IGNhbiB1c2UgdGhlc2UgZGVwZW5kZW5jaWVzIGluCmFueSBvdGhlciBkZXBlbmRlbmN5LiBIZXJlJ3MgYSBtb3JlIGNvbXBsZXggZXhhbXBsZSBvZiBob3cgeW91IGNhbiB1c2UgdGhpcyBsaWJyYXJ5LgoKCmBgYHB5dGhvbgpmcm9tIGFpb2h0dHBfZGVwcyBpbXBvcnQgUm91dGVyLCBEZXBlbmRzCmZyb20gYWlvaHR0cCBpbXBvcnQgd2ViCgpyb3V0ZXIgPSBSb3V0ZXIoKQoKCmFzeW5jIGRlZiBnZXRfZGJfc2Vzc2lvbihhcHA6IHdlYi5BcHBsaWNhdGlvbiA9IERlcGVuZHMoKSk6CiAgICBhc3luYyB3aXRoIGFwcFt3ZWIuQXBwS2V5KCJkYiIpXSBhcyBzZXNzOgogICAgICAgIHlpZWxkIHNlc3MKCgpjbGFzcyBNeURBTzoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXNzaW9uPURlcGVuZHMoZ2V0X2RiX3Nlc3Npb24pKToKICAgICAgICBzZWxmLnNlc3Npb24gPSBzZXNzaW9uCgogICAgYXN5bmMgZGVmIGdldF9vYmplY3RzKHNlbGYpIC0+IGxpc3Rbb2JqZWN0XToKICAgICAgICByZXR1cm4gYXdhaXQgc2VsZi5zZXNzaW9uLmV4ZWN1dGUoIlNFTEVDVCAxIikKCgpAcm91dGVyLmdldCgiLyIpCmFzeW5jIGRlZiBoYW5kbGVyKGRiX3Nlc3Npb246IE15REFPID0gRGVwZW5kcygpKToKICAgIG9ianMgPSBhd2FpdCBkYl9zZXNzaW9uLmdldF9vYmplY3RzKCkKICAgIHJldHVybiB3ZWIuanNvbl9yZXNwb25zZSh7Im9iamVjdHMiOiBvYmpzfSkKCmBgYAoKSWYgeW91IGRvIHNvbWV0aGluZyBsaWtlIHRoaXMsIHlvdSB3b3VsZCBuZXZlciB0aGluayBhYm91dCBpbml0aWFsaXppbmcgeW91ciBEQU8uIFlvdSBjYW4ganVzdCBpbmplY3QgaXQgYW5kIHRoYXQncyBpdC4KCgojIEJ1aWx0LWluIGRlcGVuZGVuY2llcwoKVGhpcyBsaWJyYXJ5IGFsc28gcHJvdmlkZXMgeW91IHdpdGggc29tZSBkZWZhdWx0IGRlcGVuZGVuY2llcyB0aGF0IGNhbiBoZWxwIHlvdSBpbiBidWlsZGluZyB0aGUgYmVzdCB3ZWItc2VydmljZS4KCiMjIEpzb24KClRvIHBhcnNlIGpzb24sIGNyZWF0ZSBhIHB5ZGFudGljIG1vZGVsIGFuZCBhZGQgYSBkZXBlbmRlbmN5IHRvIHlvdXIgaGFuZGxlci4KCgpgYGBweXRob24KZnJvbSBhaW9odHRwIGltcG9ydCB3ZWIKZnJvbSBweWRhbnRpYyBpbXBvcnQgQmFzZU1vZGVsCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBSb3V0ZXIsIEpzb24sIERlcGVuZHMKCnJvdXRlciA9IFJvdXRlcigpCgoKY2xhc3MgVXNlckluZm8oQmFzZU1vZGVsKToKICAgIG5hbWU6IHN0cgoKCkByb3V0ZXIucG9zdCgiL3VzZXJzIikKYXN5bmMgZGVmIG5ld19kYXRhKHVzZXI6IFVzZXJJbmZvID0gRGVwZW5kcyhKc29uKCkpKToKICAgIHJldHVybiB3ZWIuanNvbl9yZXNwb25zZSh7InVzZXIiOiB1c2VyLm1vZGVsX2R1bXAoKX0pCgpgYGAKClRoaXMgZGVwZW5kZW5jeSBhdXRvbWF0aWNhbGx5IHZhbGlkYXRlcyBkYXRhIGFuZCBzZW5kCmVycm9ycyBpZiB0aGUgZGF0YSBkb2Vzbid0IG9ycmVsYXRlIHdpdGggc2NoZW1hIG9yIGJvZHkgaXMgbm90IGEgdmFsaWQganNvbi4KCklmIHlvdSB3YW50IHRvIG1ha2UgdGhpcyBkYXRhIG9wdGlvbmFsLCBqdXN0IG1hcmsgaXQgYXMgb3B0aW9uYWwuCgpgYGBweXRob24KQHJvdXRlci5wb3N0KCIvdXNlcnMiKQphc3luYyBkZWYgbmV3X2RhdGEodXNlcjogT3B0aW9uYWxbVXNlckluZm9dID0gRGVwZW5kcyhKc29uKCkpKToKICAgIGlmIHVzZXIgaXMgTm9uZToKICAgICAgICByZXR1cm4gd2ViLmpzb25fcmVzcG9uc2UoeyJ1c2VyIjogTm9uZX0pCiAgICByZXR1cm4gd2ViLmpzb25fcmVzcG9uc2UoeyJ1c2VyIjogdXNlci5tb2RlbF9kdW1wKCl9KQoKYGBgCgojIyBIZWFkZXJzCgpZb3UgY2FuIGdldCBhbmQgdmFsaWRhdGUgaGVhZGVycyB1c2luZyBgSGVhZGVyYCBkZXBlbmRlbmN5LgoKTGV0J3MgdHJ5IHRvIGJ1aWxkIHNpbXBsZSBleGFtcGxlIGZvciBhdXRob3JpemF0aW9uLgoKYGBgcHl0aG9uCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBSb3V0ZXIsIEhlYWRlciwgRGVwZW5kcwpmcm9tIGFpb2h0dHAgaW1wb3J0IHdlYgoKcm91dGVyID0gUm91dGVyKCkKCgpkZWYgZGVjb2RlX3Rva2VuKGF1dGhvcml6YXRpb246IHN0ciA9IERlcGVuZHMoSGVhZGVyKCkpKSAtPiBzdHI6CiAgICBpZiBhdXRob3JpemF0aW9uID09ICJzZWNyZXQiOgogICAgICAgICMgTGV0J3MgcHJldGVuZCB0aGF0IGhlcmUgd2UKICAgICAgICAjIGRlY29kZSBvdXIgdG9rZW4uCiAgICAgICAgcmV0dXJuIGF1dGhvcml6YXRpb24KICAgIHJhaXNlIHdlYi5IVFRQVW5hdXRob3JpemVkKCkKCgpAcm91dGVyLmdldCgiL3NlY3JldF9kYXRhIikKYXN5bmMgZGVmIG5ld19kYXRhKHRva2VuOiBzdHIgPSBEZXBlbmRzKGRlY29kZV90b2tlbikpIC0+IHdlYi5SZXNwb25zZToKICAgIHJldHVybiB3ZWIuanNvbl9yZXNwb25zZSh7InNlY3JldCI6ICJub3QgYSBzZWNyZXQifSkKCmBgYAoKQXMgeW91IGNhbiBzZWUsIGhlYWRlciBuYW1lIHRvIHBhcnNlIGlzIGVxdWFsIHRvIHRoZQpuYW1lIG9mIGEgcGFyYW1ldGVyIHRoYXQgaW50cm9kdWNlcyBIZWFkZXIgZGVwZW5kZW5jeS4KCklmIHlvdSB3YW50IHRvIHVzZSBzb21lIG5hbWUgdGhhdCBpcyBub3QgYWxsb3dlZCBpbiBweXRob24sIG9yIGp1c3Qgd2FudCB0byBoYXZlIGRpZmZlcmVudCBuYW1lcywgeW91IGNhbiB1c2UgYWxpYXMuIExpa2UgdGhpczoKCmBgYHB5dGhvbgpkZWYgZGVjb2RlX3Rva2VuKGF1dGg6IHN0ciA9IERlcGVuZHMoSGVhZGVyKGFsaWFzPSJBdXRob3JpemF0aW9uIikpKSAtPiBzdHI6CmBgYAoKSGVhZGVycyBjYW4gYWxzbyBiZSBwYXJzZWQgdG8gdHlwZXMuIElmIHlvdSB3YW50IGEgaGVhZGVyIHRvIGJlIHBhcnNlZCBhcyBpbnQsIGp1c3QgYWRkIHRoZSB0eXBlaGludC4KCmBgYHB5dGhvbgpkZWYgZGVjb2RlX3Rva2VuKG1lbWVfaWQ6IGludCA9IERlcGVuZHMoSGVhZGVyKCkpKSAtPiBzdHI6CmBgYAoKSWYgeW91IHdhbnQgdG8gZ2V0IGxpc3Qgb2YgdmFsdWVzIG9mIG9uZSBoZWFkZXIsIHVzZSBwYXJhbWV0ZXIgYG11bHRpcGxlPVRydWVgLgoKYGBgcHl0aG9uCmRlZiBkZWNvZGVfdG9rZW4obWVtZV9pZDogbGlzdFtpbnRdID0gRGVwZW5kcyhIZWFkZXIobXVsdGlwbGU9VHJ1ZSkpKSAtPiBzdHI6CgpgYGAKCkFuZCwgb2YgY291cnNlLCB5b3UgY2FuIHByb3ZpZGUgdGhpcyBkZXBlbmRlbmN5IHdpdGggZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdmFsdWUgZnJvbSB1c2VyIGNhbm5vdCBiZSBwYXJzZWQgZm9yIHNvbWUgcmVhc29uLgoKYGBgcHl0aG9uCmRlZiBkZWNvZGVfdG9rZW4obWVtZV9pZDogc3RyID0gRGVwZW5kcyhIZWFkZXIoZGVmYXVsdD0ibm90LWEtc2VjcmV0IikpKSAtPiBzdHI6CmBgYAoKCiMjIFF1ZXJpZXMKCllvdSBjYW4gZGVwZW5kIG9uIGBRdWVyeWAgdG8gZ2V0IGFuZCBwYXJzZSBxdWVyeSBwYXJhbWV0ZXJzLgoKYGBgcHl0aG9uCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBSb3V0ZXIsIFF1ZXJ5LCBEZXBlbmRzCmZyb20gYWlvaHR0cCBpbXBvcnQgd2ViCgpyb3V0ZXIgPSBSb3V0ZXIoKQoKCkByb3V0ZXIuZ2V0KCIvc2hvcCIpCmFzeW5jIGRlZiBzaG9wKGl0ZW1faWQ6IHN0ciA9IERlcGVuZHMoUXVlcnkoKSkpIC0+IHdlYi5SZXNwb25zZToKICAgIHJldHVybiB3ZWIuanNvbl9yZXNwb25zZSh7ImlkIjogaXRlbV9pZH0pCgpgYGAKCnRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgZnVuY3Rpb24gcGFyYW1ldGVyLgoKVGhlIFF1ZXJ5IGRlcGVuZGVuY3kgaXMgYWN1YWxseSB0aGUgc2FtZSBhcyB0aGUgSGVhZGVyIGRlcGVuZGVuY3ksIHNvIGV2ZXJ5dGhpbmcgYWJvdXQgdGhlIGBIZWFkZXJgIGRlcGVuZGVuY3kgYWxzbyBhcHBsaWVzIHRvIGBRdWVyeWAuCgojIyBWaWV3cwoKSWYgeW91IHVzZSB2aWV3cyBhcyBoYW5kbGVycywgcGxlYXNlIHVzZSBWaWV3IGNsYXNzIGZyb20gYGFpb2h0dHBfZGVwc2AsIG90aGVyd2lzZSB0aGUgbWFnaWMgd29uJ3Qgd29yay4KCmBgYHB5dGhvbgpmcm9tIGFpb2h0dHBfZGVwcyBpbXBvcnQgUm91dGVyLCBWaWV3LCBEZXBlbmRzCmZyb20gYWlvaHR0cCBpbXBvcnQgd2ViCgpyb3V0ZXIgPSBSb3V0ZXIoKQoKCkByb3V0ZXIudmlldygiL3ZpZXciKQpjbGFzcyBNeVZpZXcoVmlldyk6CiAgICBhc3luYyBkZWYgZ2V0KHNlbGYsIGFwcDogd2ViLkFwcGxpY2F0aW9uID0gRGVwZW5kcygpKToKICAgICAgICByZXR1cm4gd2ViLmpzb25fcmVzcG9uc2UoeyJhcHAiOiBzdHIoYXBwKX0pCgpgYGAKCgojIyBGb3JtcwoKTm93IHlvdSBjYW4gZWFzaXkgZ2V0IGFuZCB2YWxpZGF0ZSBmb3JtIGRhdGEgZnJvbSB5b3VyIHJlcXVlc3QuClRvIG1ha2UgdGhlIG1hZ2ljIGhhcHBlbiwgcGxlYXNlIGFkZCBgYXJiaXRyYXJ5X3R5cGVzX2FsbG93ZWRgIHRvIHRoZSBjb25maWcgb2YgeW91ciBtb2RlbC4KCgpgYGBweXRob24KaW1wb3J0IHB5ZGFudGljCmZyb20gYWlvaHR0cF9kZXBzIGltcG9ydCBSb3V0ZXIsIERlcGVuZHMsIEZvcm0KZnJvbSBhaW9odHRwIGltcG9ydCB3ZWIKCnJvdXRlciA9IFJvdXRlcigpCgoKY2xhc3MgTXlGb3JtKHB5ZGFudGljLkJhc2VNb2RlbCk6CiAgICBpZDogaW50CiAgICBmaWxlOiB3ZWIuRmlsZUZpZWxkCgogICAgbW9kZWxfY29uZmlnID0gcHlkYW50aWMuQ29uZmlnRGljdChhcmJpdHJhcnlfdHlwZXNfYWxsb3dlZD1UcnVlKQoKCkByb3V0ZXIucG9zdCgiLyIpCmFzeW5jIGRlZiBoYW5kbGVyKG15X2Zvcm06IE15Rm9ybSA9IERlcGVuZHMoRm9ybSgpKSk6CiAgICB3aXRoIG9wZW4oIm15X2ZpbGUiLCAid2IiKSBhcyBmOgogICAgICAgIGYud3JpdGUobXlfZm9ybS5maWxlLmZpbGUucmVhZCgpKQogICAgcmV0dXJuIHdlYi5qc29uX3Jlc3BvbnNlKHsiaWQiOiBteV9mb3JtLmlkfSkKCmBgYAoKIyMgUGF0aAoKSWYgeW91IGhhdmUgcGF0aCB2YXJpYWJsZXMsIHlvdSBjYW4gYWxzbyBpbmplY3QgdGhlbSBpbiB5b3VyIGhhbmRsZXIuCgpgYGBweXRob24KZnJvbSBhaW9odHRwX2RlcHMgaW1wb3J0IFJvdXRlciwgUGF0aCwgRGVwZW5kcwpmcm9tIGFpb2h0dHAgaW1wb3J0IHdlYgoKcm91dGVyID0gUm91dGVyKCkKCgpAcm91dGVyLmdldCgiL3ZpZXcve3Zhcn0iKQphc3luYyBkZWYgbXlfaGFuZGxlcih2YXI6IHN0ciA9IERlcGVuZHMoUGF0aCgpKSk6CiAgICByZXR1cm4gd2ViLmpzb25fcmVzcG9uc2UoeyJ2YXIiOiB2YXJ9KQoKYGBgCgoKIyMgRXh0cmFPcGVuQVBJCgpUaGlzIGRlcGVuZGVuY3kgaXMgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBzd2FnZ2VyIGZpZWxkcyB0byB0aGUgZW5kcG9pbnQncyBzd2FnZ2VyCnRoYXQgaXMgdXNpbmcgdGhpcyBkZXBlbmRlbmN5LiBJdCBtaWdodCBiZSBldmVuIGluZGlyZWN0IGRlcGVuZGVuY3kuCgpZb3UgY2FuIGNoZWNrIGhvdyB0aGlzIHRoaW5nIGNhbiBiZSB1c2VkIGluIG91ciBbZXhhbXBsZXMvc3dhZ2dlcl9hdXRoLnB5XShodHRwczovL2dpdGh1Yi5jb20vdGFza2lxLXB5dGhvbi9haW9odHRwLWRlcHMvdHJlZS9tYXN0ZXIvZXhhbXBsZXMvc3dhZ2dlcl9hdXRoLnB5KS4KCgojIyBPdmVycmlkaW5nIGRlcGVuZGVuY2llcwoKU29tZXRpbWVzIGZvciB0ZXN0cyB5b3UgZG9uJ3Qgd2FudCB0byBjYWxjdWxhdGUgYWN0dWFsIGZ1bmN0aW9ucwphbmQgeW91IHdhbnQgdG8gcGFzcyBhbm90aGVyIGZ1bmN0aW9ucyBpbnN0ZWFkLgoKVG8gZG8gc28sIHlvdSBjYW4gYWRkICJkZXBlbmRlbmN5X292ZXJyaWRlcyIgb3IgInZhbHVlc19vdmVycmlkZXMiIHRvIHRoZSBhcGxpY2F0aW9uJ3Mgc3RhdGUuClRoZXNlIHZhbHVlcyBzaG91bGQgYmUgZGljdHMuIFRoZSBrZXlzIGZvciB0aGVzZSB2YWx1ZXMgY2FuIGJlIGZvdW5kIGluIGBhaW9odHRwX2RlcHMua2V5c2AgbW9kdWxlLgoKSGVyZSdzIGFuIGV4YW1wbGUuCgpgYGBweXRob24KZGVmIG9yaWdpbmFsX2RlcCgpIC0+IGludDoKICAgIHJldHVybiAxCgpjbGFzcyBNeVZpZXcoVmlldyk6CiAgICBhc3luYyBkZWYgZ2V0KHNlbGYsIG51bTogaW50ID0gRGVwZW5kcyhvcmlnaW5hbF9kZXApKToKICAgICAgICAiIiJOb3RoaW5nLiIiIgogICAgICAgIHJldHVybiB3ZWIuanNvbl9yZXNwb25zZSh7InJlcXVlc3QiOiBudW19KQpgYGAKCkltYWdpbmUgeW91IGhhdmUgYSBoYW5kbGVyIHRoYXQgZGVwZW5kcyBvbiBzb21lIGZ1bmN0aW9uLApidXQgaW5zdGVhZCBvZiBgMWAgeW91IHdhbnQgdG8gaGF2ZSBgMmAgaW4geW91ciB0ZXN0cy4KClRvIGRvIGl0LCBqc3V0IGFkZCBgZGVwZW5kZW5jeV9vdmVycmlkZXNgIHNvbWV3aGVyZSwKd2hlcmUgeW91IGNyZWF0ZSB5b3VyIGFwcGxpY2F0aW9uLiBBbmQgbWFrZSBzdXJlIHRoYXQga2V5cwpvZiB0aGF0IGRpY3QgYXJlIGFjdHVhbCBmdW5jdGlvbiB0aGF0IGFyZSBiZWluZyByZXBsYWNlZC4KCmBgYHB5dGhvbgpmcm9tIGFpb2h0dHBfZGVwcyBpbXBvcnQgVkFMVUVTX09WRVJSSURFU19LRVkKCm15X2FwcFtWQUxVRVNfT1ZFUlJJREVTX0tFWV0gPSB7b3JpZ2luYWxfZGVwOiAyfQpgYGAKCkJ1dCBgdmFsdWVzX292ZXJyaWRlc2Agb25seSBvdmVycmlkZXMgcmV0dXJuZWQgdmFsdWVzLiBJZiB5b3Ugd2FudCB0bwpvdmVycmlkZSBmdW5jdGlvbnMsIHlvdSBoYXZlIHRvIHVzZSBgZGVwZW5kZW5jeV9vdmVycmlkZXNgLiBIZXJlJ3MgYW4gZXhhbXBsZToKCmBgYHB5dGhvbgpmcm9tIGFpb2h0dHBfZGVwcyBpbXBvcnQgREVQRU5ERU5DWV9PVkVSUklERVNfS0VZCgpkZWYgcmVwbGFjaW5nX2Z1bmN0aW9uKCkgLT4gaW50OgogICAgcmV0dXJuIDIKCgpteV9hcHBbREVQRU5ERU5DWV9PVkVSUklERVNfS0VZXSA9IHtvcmlnaW5hbF9kZXA6IHJlcGxhY2luZ19mdW5jdGlvbn0KYGBgCgpUaGUgY29vbCBwb2ludCBhYm91dCBgZGVwZW5kZW5jeV9vdmVycmlkZXNgLCBpcyB0aGF0IGl0IHJlY2FsY3VsYXRlcyBncmFwaCBhbmQKeW91IGNhbiB1c2UgZGVwZW5kZW5jaWVzIGluIGZ1bmN0aW9uIHRoYXQgcmVwbGFjZXMgdGhlIG9yaWdpbmFsLgo=
+ readmeEtag: '"d2a9fc86a3baf1bb870a15fa102ef06a0c0e3399"'
+ readmeLastModified: Mon, 30 Sep 2024 23:19:15 GMT
repositoryId: 630692437
description: Dependency injection for AioHTTP
created: '2023-04-21T00:08:54Z'
- updated: '2024-09-29T23:57:26Z'
+ updated: '2024-09-30T23:19:19Z'
language: Python
archived: false
stars: 9
@@ -16827,8 +16767,8 @@
owner: taskiq-python
logo: https://avatars.githubusercontent.com/u/109470701?v=4
license: MIT
- repoEtag: '"892f792716bfa8f8452707ecdc5c48dcddc006d689f48708b064e115e6d07cfd"'
- repoLastModified: Sun, 29 Sep 2024 23:57:26 GMT
+ repoEtag: '"ee0d7913d0372f603ec31beb53300ab021ce96c86bfa2d64ec7efa1016cd0b64"'
+ repoLastModified: Mon, 30 Sep 2024 23:19:19 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -16912,36 +16852,6 @@
- Low-level Tooling
- Parsers
id: 326240eecd7b3028ddf9a6cfb4273a0d
-- source: openapi3 tags
- repository: https://github.com/ben-jamin-chen/springboot-swagger-rest-api
- v3: true
- id: a9df75197b7dc50eefc61eead6539c2b
- repositoryMetadata:
- base64Readme: >-
- IyBTYW1wbGUgU3ByaW5nIEJvb3QgKDIuMy4yKSBSRVNUZnVsIEFQSSB3aXRoIFN3YWdnZXIgKE9wZW5BUEkgMykKCldoaWxlIHNlYXJjaGluZyB0aHJvdWdoIEdpdEh1YiBmb3Igc29tZSBib2lsZXJwbGF0ZSBjb2RlIG9uIGhvdyB0byBzZXR1cCBhIFNwcmluZyBCb290IHByb2plY3Qgd2l0aCBTd2FnZ2VyLCBJIGZvdW5kIGl0IHF1aXRlIGRpZmZpY3VsdCB0byBmaW5kIGEgd29ya2luZyBleGFtcGxlIHdpdGggYSBtb3JlIHJlY2VudCB2ZXJzaW9uIG9mIFNwcmluZyBCb290IGFuZCBKYXZhIChpLmUuIDE0KS4gQW55d2F5cywgSSB0aG91Z2h0IEnigJlkIGNyZWF0ZSBteSBvd24gYW5kIHNoYXJlIHdpdGggZXZlcnlvbmUuIFRoaXMgaXMgZm9yIGFueW9uZSB0aGF0IG5lZWRzIHNvbWUgcXVpY2sgYm9pbGVycGxhdGUgY29kZSB0byBzZXR1cCB0aGVpciBuZXcgQVBJIHByb2plY3QuCgojIyBXaGF0IFlvdSBOZWVkCgoqIEphdmEgMTQKKiBNYXZlbiAzLjYuMCsKCiMjIEJ1aWxkIGFuZCBSdW4gdGhlIFNhbXBsZQoKWW91IGNhbiBpbXBvcnQgdGhlIGNvZGUgc3RyYWlnaHQgaW50byB5b3VyIHByZWZlcnJlZCBJREUgb3IgcnVuIHRoZSBzYW1wbGUgdXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kIChpbiB0aGUgcm9vdCBwcm9qZWN0IGZvbGRlcikuCgpgYGB6c2gKJCAgbXZuIHNwcmluZy1ib290OnJ1bgpgYGAKQWZ0ZXIgdGhlIGFwcGxpY2F0aW9uIHJ1bnMsIG5hdmlnYXRlIHRvIGBodHRwOi8vbG9jYWxob3N0OjcwMDEvc3dhZ2dlci11aS9pbmRleC5odG1sP2NvbmZpZ1VybD0vYXBpLWRvY3Mvc3dhZ2dlci1jb25maWdgIGluIHlvdXIgd2ViIGJyb3dzZXIgdG8gYWNjZXNzIHRoZSBTd2FnZ2VyIFVJIHBvcnRhbC4K
- readmeEtag: '"9a2b56a24abaa949af685f5503ecdcc4da8a4654"'
- readmeLastModified: Tue, 28 Jul 2020 00:13:07 GMT
- repositoryId: 281525992
- description: >-
- A sample RESTful API using Spring Boot (2.3.2) and Java 14 with Swagger
- enabled.
- created: '2020-07-21T23:28:43Z'
- updated: '2024-08-29T06:57:42Z'
- language: Java
- archived: false
- stars: 9
- watchers: 1
- forks: 7
- owner: ben-jamin-chen
- logo: https://avatars.githubusercontent.com/u/41641688?v=4
- license: MIT
- repoEtag: '"b730f86b0f565a1ce56a86d15349c18a34dec7ac530a7f97ec72da4d9f33c0fb"'
- repoLastModified: Thu, 29 Aug 2024 06:57:42 GMT
- category: Server Implementations
- foundInMaster: true
- oldLocations:
- - https://github.com/buzzingben/springboot-swagger-rest-api
- - https://github.com/bchen04/springboot-swagger-rest-api
- source: openapi3 tags
repository: https://github.com/brreg/openapi
v3: true
@@ -17424,7 +17334,7 @@
repositoryId: 740729887
description: The easiest way to share OpenAPI files
created: '2024-01-09T00:11:59Z'
- updated: '2024-09-27T15:10:22Z'
+ updated: '2024-09-30T15:35:21Z'
language: Vue
archived: false
stars: 8
@@ -17432,8 +17342,8 @@
forks: 4
owner: scalar
logo: https://avatars.githubusercontent.com/u/301879?v=4
- repoEtag: '"e874e962fe8c995c97e8526d046a4b9df4161cd1c54b61745284626ac5da7549"'
- repoLastModified: Fri, 27 Sep 2024 15:10:22 GMT
+ repoEtag: '"dd162b90e73fd705cfe8457adec1070a28f744f3cff3fdeef6789110abbff46e"'
+ repoLastModified: Mon, 30 Sep 2024 15:35:21 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -18080,7 +17990,7 @@
owner: meabed
logo: https://avatars.githubusercontent.com/u/45731?v=4
license: MIT
- repoEtag: '"ad0c643a4cbdce731bde43ad24fcde5a2e0802e06bb8c63b9e957e8054fd9add"'
+ repoEtag: '"a9fca255995a1ec7982bf5af73acf9024aa757d321947a2075ae50b8f38a771e"'
repoLastModified: Fri, 12 Jan 2024 18:23:08 GMT
foundInMaster: true
category:
@@ -18098,7 +18008,7 @@
repositoryId: 318430456
description: The OpenAPI specifications for the Apideck APIs.
created: '2020-12-04T06:55:12Z'
- updated: '2024-09-25T08:31:06Z'
+ updated: '2024-09-30T13:56:21Z'
language: null
archived: false
stars: 7
@@ -18107,8 +18017,8 @@
owner: apideck-libraries
logo: https://avatars.githubusercontent.com/u/73573473?v=4
license: MIT
- repoEtag: '"e9127bae624d3eeb16e458a5d1969d1b535d7e71f0b784ab0f530af5a6b3b37e"'
- repoLastModified: Wed, 25 Sep 2024 08:31:06 GMT
+ repoEtag: '"bf1cb221a272e4f6d6335f5c56f0d1b6e0b0fda54f6c58082055a63e3a92778a"'
+ repoLastModified: Mon, 30 Sep 2024 13:56:21 GMT
foundInMaster: true
category: Testing
id: c977303d84eebe1aa3c23e0a1f6d548d
@@ -19340,7 +19250,7 @@
repositoryId: 736890548
description: coss-im-server
created: '2023-12-29T07:07:13Z'
- updated: '2024-09-15T12:49:50Z'
+ updated: '2024-09-30T19:23:59Z'
language: Go
archived: false
stars: 5
@@ -19348,8 +19258,8 @@
forks: 4
owner: cossteam
logo: https://avatars.githubusercontent.com/u/171768939?v=4
- repoEtag: '"0dcb6abd06ce71287f141c071a933c49d824d8427c133c80129ad74a0b423e72"'
- repoLastModified: Sun, 15 Sep 2024 12:49:50 GMT
+ repoEtag: '"83d772b5d64b57cdeddde324a2b827e1736818fdb8604a2adddb5fe97328c7a5"'
+ repoLastModified: Mon, 30 Sep 2024 19:23:59 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -20478,17 +20388,17 @@
repositoryId: 360806446
description: NestJS RESTful API starter for minimalists
created: '2021-04-23T07:53:38Z'
- updated: '2024-09-03T16:13:15Z'
+ updated: '2024-09-30T17:45:12Z'
language: TypeScript
archived: false
- stars: 4
+ stars: 5
watchers: 2
forks: 5
owner: crazyoptimist
logo: https://avatars.githubusercontent.com/u/55074937?v=4
license: MIT
- repoEtag: '"ab3a0d02655edd2e7eae5465ce91098637763a8ea56cc2b93581bca0c6032a86"'
- repoLastModified: Tue, 03 Sep 2024 16:13:15 GMT
+ repoEtag: '"0ad7b902ee8ce2a1f5a968188774d8d7715a7de18c8ca1f3df7c7713b125f218"'
+ repoLastModified: Mon, 30 Sep 2024 17:45:12 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -21479,7 +21389,7 @@
owner: ideal-postcodes
logo: https://avatars.githubusercontent.com/u/4996310?v=4
license: MIT
- repoEtag: '"1d15ea1c47f23da752b5dc435ab411e85797c1ce7f2f3ca8d9e7bada259f5723"'
+ repoEtag: '"9cea8736fdbf761b6ac36380f71f19a103b4e4e160b739fd64744c8496cd8a34"'
repoLastModified: Thu, 12 Sep 2024 07:20:24 GMT
foundInMaster: true
category: SDK
@@ -22160,7 +22070,7 @@
owner: sergeyklay
logo: https://avatars.githubusercontent.com/u/1256298?v=4
license: MIT
- repoEtag: '"eb5d21841b07cc592a46038c75b2a3cffe52685d1cecf494e531b7f48dca2e9f"'
+ repoEtag: '"34962d960534a5f9a36d980f3654a1262921d29abedf3879871d558432311747"'
repoLastModified: Mon, 05 Aug 2024 12:03:47 GMT
category: Server Implementations
foundInMaster: true
@@ -22188,7 +22098,7 @@
owner: hiroyoshii
logo: https://avatars.githubusercontent.com/u/40140638?v=4
license: Apache-2.0
- repoEtag: '"258619d60dbed572271dfd98af207227cdcd589c5bc6aad71cf56c89ddfd0278"'
+ repoEtag: '"984fe2ff7bc4b6c89bcab7d1a812e2a5395768f51c38209045fa012255e1f49f"'
repoLastModified: Mon, 09 Sep 2024 14:21:56 GMT
category: Server Implementations
foundInMaster: true
@@ -22966,7 +22876,7 @@
Clone of ePages-de/restdocs-api-spec with class field type and constraint
inference.
created: '2022-02-22T03:33:26Z'
- updated: '2024-09-24T01:28:11Z'
+ updated: '2024-10-01T01:28:30Z'
language: Kotlin
archived: false
stars: 2
@@ -22975,8 +22885,8 @@
owner: keecon
logo: https://avatars.githubusercontent.com/u/19371343?v=4
license: MIT
- repoEtag: '"47b9c598bcfc321d5da41f443ff379ee9882dd21b54ada6b59909590bdbf75b3"'
- repoLastModified: Tue, 24 Sep 2024 01:28:11 GMT
+ repoEtag: '"e44f0945e696cb46af9e34d3967d685ef099e2007d7e81928879766a4b21f105"'
+ repoLastModified: Tue, 01 Oct 2024 01:28:30 GMT
foundInMaster: true
category: Server
id: 07a8059ee6961dc1e46442f5582d1501
@@ -24427,7 +24337,7 @@
owner: tada5hi
logo: https://avatars.githubusercontent.com/u/13162758?v=4
license: MIT
- repoEtag: '"2b3b70b8b4ec2b76e1a4f296ee7d5aa8c83a22aba6d680bb7d569689e19e297e"'
+ repoEtag: '"0b978a5be781584d0a37f0e39ce7cf82145272ab7b7161ace2fbd3f0db317731"'
repoLastModified: Sun, 29 Sep 2024 09:26:36 GMT
category: Parsers
foundInMaster: true
@@ -24920,7 +24830,7 @@
owner: protung
logo: https://avatars.githubusercontent.com/u/81255167?v=4
license: MIT
- repoEtag: '"48b5c0b4de20574bd7379321b29e8e7388c5721d497a06cfb16b698060dc6513"'
+ repoEtag: '"9d09143f64d27d654a07c384c46062125d7a5034bb6e1dfd55be8369e8623afa"'
repoLastModified: Sat, 28 Sep 2024 14:25:45 GMT
category:
- Server
@@ -25718,7 +25628,7 @@
Models for the analysis requests to listen.dev and the consequent verdicts
responses
created: '2023-07-11T11:39:58Z'
- updated: '2024-09-25T13:09:45Z'
+ updated: '2024-09-30T21:24:11Z'
language: Go
archived: false
stars: 1
@@ -25727,8 +25637,8 @@
owner: listendev
logo: https://avatars.githubusercontent.com/u/103680976?v=4
license: Apache-2.0
- repoEtag: '"b4a0299d62d24587fba0690757312ebffc390226b813dc7d03c98e5706ad259c"'
- repoLastModified: Wed, 25 Sep 2024 13:09:45 GMT
+ repoEtag: '"ebbe47b16be300b7d490f13750e8e27727cf9175a526256fb7e7612e99da3b3d"'
+ repoLastModified: Mon, 30 Sep 2024 21:24:11 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -26136,7 +26046,7 @@
repositoryId: 853046067
description: Generate Java Records from OpenAPI Specifications
created: '2024-09-05T22:21:02Z'
- updated: '2024-09-27T20:52:48Z'
+ updated: '2024-09-30T17:00:55Z'
language: Java
archived: false
stars: 1
@@ -26145,8 +26055,8 @@
owner: Chrimle
logo: https://avatars.githubusercontent.com/u/28791817?v=4
license: MIT
- repoEtag: '"13bdb35c28a0b7b4c93727a684b3be0d3321eebeb2ef2b0434b095a53ed2994f"'
- repoLastModified: Fri, 27 Sep 2024 20:52:48 GMT
+ repoEtag: '"9cbe8d381537dea0890a714609e67dcee0ac4c67d853f38533191113a18a654a"'
+ repoLastModified: Mon, 30 Sep 2024 17:00:55 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -27337,24 +27247,24 @@
id: 6221a7dad056965aa69ad16ff0132577
repositoryMetadata:
base64Readme: >-
- IyBTeXN0ZW1zIFNwYWNlCgoxLiBbKipUaGUgU2hpZnQgZnJvbSBNb2RlbHMgdG8gQ29tcG91bmQgQUkgU3lzdGVtcyoqXShodHRwczovL2JhaXIuYmVya2VsZXkuZWR1L2Jsb2cvMjAyNC8wMi8xOC9jb21wb3VuZC1haS1zeXN0ZW1zLykgLSBUaGlzIGFydGljbGUgZnJvbSBCZXJrZWxleSBBSSBSZXNlYXJjaCAoQkFJUikgaGlnaGxpZ2h0cyBhIGdyb3dpbmcgdHJlbmQgd2hlcmUgQUkgYWR2YW5jZW1lbnRzIGluY3JlYXNpbmdseSByZWx5IG9uICoqY29tcG91bmQgQUkgc3lzdGVtcyoq4oCUY29tYmluYXRpb25zIG9mIG11bHRpcGxlIG1vZGVscyBhbmQgY29tcG9uZW50c+KAlHJhdGhlciB0aGFuIHRyYWRpdGlvbmFsIG1vbm9saXRoaWMgbW9kZWxzLiBDb21wb3VuZCBzeXN0ZW1zIG9mZmVyIG1vcmUgZmxleGliaWxpdHkgYW5kIGFkYXB0YWJpbGl0eSwgYXMgZWFjaCBjb21wb25lbnQgY2FuIHNwZWNpYWxpemUgaW4gYSBkaWZmZXJlbnQgdGFzayBvciBwaGFzZSBvZiB0aGUgcGlwZWxpbmUuICAKCktleSBwb2ludHM6Ci0gKipEZXNpZ24sIG9wdGltaXphdGlvbiwgYW5kIG9wZXJhdGlvbjoqKiBBcHByb2FjaGVzIGFyZSBzdGlsbCBlbWVyZ2luZywgYnV0IGNvbXBvdW5kIEFJIHN5c3RlbXMgYXJlIHByb3ZpbmcgbW9yZSBlZmZpY2llbnQgZm9yIGNvbXBsZXggdGFza3MuCi0gKipNYXhpbWl6aW5nIHJlbGlhYmlsaXR5IGFuZCBxdWFsaXR5OioqIFRoZXNlIHN5c3RlbXMgcHJvbWlzZSBoaWdoZXIgcmVsaWFiaWxpdHksIHBhcnRpY3VsYXJseSBmb3IgbGFyZ2Utc2NhbGUgYXBwbGljYXRpb25zLCBieSBicmVha2luZyBkb3duIHRhc2tzIGludG8gc21hbGxlciwgbW9yZSBtYW5hZ2VhYmxlIHVuaXRzLiAKLSAqKlRyZW5kIGZvciAyMDI0OioqIEJBSVIgc2VlcyB0aGlzIGFzIG9uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgdHJlbmRzLCB3aGVyZSBkZXZlbG9wZXJzIHdpbGwgZm9jdXMgb24gaG93IHRvIGFzc2VtYmxlIHRoZXNlIGNvbXBvbmVudHMgaW4gZWZmZWN0aXZlIHdheXMuCiAgIAohW2ltYWdlXShodHRwczovL2dpdGh1Yi5jb20vdXNlci1hdHRhY2htZW50cy9hc3NldHMvZDg3NGU4MmYtOWI4OS00ODdlLTg5NGMtMWVkM2IyNDcyOTRkKQo8cCBhbGlnbj0iY2VudGVyIj5JbmNyZWFzaW5nbHkgbWFueSBuZXcgQUkgcmVzdWx0cyBhcmUgZnJvbSBjb21wb3VuZCBzeXN0ZW1zLjwvcD4KCiJfRmlndXJpbmcgb3V0IHRoZSBiZXN0IHByYWN0aWNlcyBmb3IgZGV2ZWxvcGluZyBjb21wb3VuZCBBSSBzeXN0ZW1zIGlzIHN0aWxsIGFuIG9wZW4gcXVlc3Rpb24sIGJ1dCB0aGVyZSBhcmUgYWxyZWFkeSBleGNpdGluZyBhcHByb2FjaGVzIHRvIGFpZCB3aXRoIGRlc2lnbiwgZW5kLXRvLWVuZCBvcHRpbWl6YXRpb24sIGFuZCBvcGVyYXRpb24uIFdlIGJlbGlldmUgdGhhdCBjb21wb3VuZCBBSSBzeXN0ZW1zIHdpbGwgcmVtYWluIHRoZSBiZXN0IHdheSB0byBtYXhpbWl6ZSB0aGUgcXVhbGl0eSBhbmQgcmVsaWFiaWxpdHkgb2YgQUkgYXBwbGljYXRpb25zIGdvaW5nIGZvcndhcmQsIGFuZCBtYXkgYmUgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCB0cmVuZHMgaW4gQUkgaW4gMjAyNC5fIgoKMi4gWyoqQnVpbGRpbmcgQSBHZW5lcmF0aXZlIEFJIFBsYXRmb3JtKipdKGh0dHBzOi8vaHV5ZW5jaGlwLmNvbS8yMDI0LzA3LzI1L2dlbmFpLXBsYXRmb3JtLmh0bWwpIC0gVGhpcyBhcnRpY2xlIGV4cGxvcmVzIHRoZSBhcmNoaXRlY3R1cmUgYW5kIGRldmVsb3BtZW50IG9mIGEgZ2VuZXJhdGl2ZSBBSSBwbGF0Zm9ybSwgZm9jdXNpbmcgb24gdGhlIGNoYWxsZW5nZXMgb2YgaW50ZWdyYXRpbmcgdmFyaW91cyBBSSBjb21wb25lbnRzLiBJdCBlbXBoYXNpemVzOgotICoqT3BlbiBTb3VyY2UgTExNIFRvb2xzOioqIFRoZSBhcnRpY2xlIHJlZmVyZW5jZXMgc2V2ZXJhbCB0b29scyBhbmQgdGVjaG5pcXVlcyBmb3IgYnVpbGRpbmcgZ2VuZXJhdGl2ZSBBSSwgZXNwZWNpYWxseSBmb2N1c2luZyBvbiBtb2RlbCBhbGlnbm1lbnQsIG9wdGltaXphdGlvbiwgYW5kIGFkYXB0YWJpbGl0eS4gVGhlIHJlZmVyZW5jZWQgW09wZW4gU291cmNlIExMTSBUb29sc10oaHR0cHM6Ly9odXllbmNoaXAuY29tL2xsYW1hLXBvbGljZSkgYXJlIGNydWNpYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGVjb3N5c3RlbSBzdXJyb3VuZGluZyBnZW5lcmF0aXZlIEFJIG1vZGVscyBsaWtlIE1ldGHigJlzIExMYU1BLgotICoqQ2hhbGxlbmdlcyBpbiBwbGF0Zm9ybSBidWlsZGluZzoqKiBGcm9tIG1vZGVsIGludGVncmF0aW9uIHRvIGVuc3VyaW5nIHRoZSBhbGlnbm1lbnQgb2YgZ2VuZXJhdGl2ZSBBSSBvdXRwdXQgd2l0aCBpbnRlbmRlZCB1c2UgY2FzZXMsIHRoZXJlIGFyZSBtYW55IGh1cmRsZXMgaW4gYWNoaWV2aW5nIGFuIG9wZXJhdGlvbmFsIHBsYXRmb3JtLgoKQm90aCBhcnRpY2xlcyBzdHJlc3MgdGhhdCB0aGUgZnV0dXJlIG9mIEFJIHdpbGwgaW52b2x2ZSAqKm1vcmUgc29waGlzdGljYXRlZCBzeXN0ZW1zKiosIHJlbHlpbmcgb24gdGhlIGNvb3BlcmF0aW9uIG9mIHZhcmlvdXMgc3BlY2lhbGl6ZWQgbW9kZWxzIChjb21wb3VuZCBBSSkgYW5kIHRoZSBpbnRlZ3JhdGlvbiBvZiBkaXZlcnNlIHRvb2xzIGZvciBnZW5lcmF0aXZlIEFJIHBsYXRmb3JtIGRldmVsb3BtZW50LiBUaGlzIGFsaWducyB3aXRoIG9uZ29pbmcgZXhwbG9yYXRpb24gb2YgKipjb21wb3VuZCBBSSBzeXN0ZW1zKiogYW5kICoqZ2VuZXJhdGl2ZSBBSSBwbGF0Zm9ybSBhcmNoaXRlY3R1cmUqKi4KICAgCiMjIE9wZW5BUEkKc3RhcnRlZCB3aXRoIHRoaXMgb25lIGVuZHBvaW50IENvbXBsZXRpb25zICoqL2NvbXBsZXRpb25zKiogd2l0aCBUZXh0IElucHV0L091dHB1dCAobm93IExlZ2FjeSkKClRoZW4gQ2hhdEdQVCwgQ2hhdCBjb21wbGV0aW9ucyAqKi9jaGF0L2NvbXBsZXRpb25zKiogIHdpdGggTWVzc2FnZXMgSW5wdXQvT3V0cHV0CiAgCjMuIEVtYmVkZGluZ3MJCQkqKi9lbWJlZGRpbmdzKioKNC4gSW1hZ2UgZ2VuZXJhdGlvbgkJKiovaW1hZ2VzL2dlbmVyYXRpb25zKioKNS4gVGV4dCB0byBzcGVlY2gJCQkqKi9hdWRpby9zcGVlY2gqKgo2LiBTcGVlY2ggdG8gdGV4dAkJCSoqL2F1ZGlvL3RyYW5zY3JpcHRpb25zKioKNy4gTW9kZXJhdGlvbgkJCSoqL21vZGVyYXRpb25zKioKOC4gRmluZS10dW5pbmcgICoqL2ZpbmVfdHVuaW5nL2pvYnMqKgo5LiBCYXRjaAkJCQkqKi9maWxlcyAvYmF0Y2hlcyoqCgotIEZ1bmN0aW9uIENhbGxpbmcgLSBRdWVyeSBEYXRhYmFzZSwgU2VuZCBFbWFpbHMgZXRjLgotIFJlc3BvbnNlIEZvcm1hdHMgLSBbQnVpbGRpbmcgQUdJIHdpdGggT3BlbkFJJ3MgU3RydWN0dXJlZCBPdXRwdXRzIEFQSV0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1Oak9mSDlEOGFKbykKClJFU1QgQVBJOiAgCi0gT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgW09wZW5BSSBBUEldKGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuYWkvb3BlbmFpLW9wZW5hcGkvYmxvYi9tYXN0ZXIvb3BlbmFwaS55YW1sKSAgCi0gU3BlY2lmaWNhdGlvbiBmb3IgdGhlIFtBenVyZSBPcGVuQUkgQVBJXShodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvYWktc2VydmljZXMvb3BlbmFpL3JlZmVyZW5jZSNhcGktc3BlY3MpCgpQeXRob24gU0RLOiAgCi0gT3BlbkFJIFB5dGhvbiBbQVBJXShodHRwczovL2dpdGh1Yi5jb20vb3BlbmFpL29wZW5haS1weXRob24vYmxvYi9tYWluL2FwaS5tZCkgbGlicmFyeSBpbiB0aGUgVGhlIG9mZmljaWFsIFB5dGhvbiBsaWJyYXJ5IGZvciB0aGUgW09wZW5BSSBBUEldKGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuYWkvb3BlbmFpLXB5dGhvbikKCi0gW0Ryb3AgaW4gcmVwbGFjZW1lbnRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhc3RheC9hc3RyYS1hc3Npc3RhbnRzLWFwaSkgZm9yIHRoZSBPcGVuQUkgQXNzaXN0YW50cyBBUEkKICAtIEZ1bGwgY292ZXJhZ2Ugb2YgT3BlbkFJIGVuZHBvaW50cyBpbiB0aGUgcmVwbyBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGFzdGF4L2FzdHJhLWFzc2lzdGFudHMtYXBpL2Jsb2IvbWFpbi9jb3ZlcmFnZS5tZCkKIAotIFtMbGFtYSBTdGFjayBSRkNdKGh0dHBzOi8vZ2l0aHViLmNvbS9tZXRhLWxsYW1hL2xsYW1hLXN0YWNrL2Jsb2IvbWFpbi9yZmNzL1JGQy0wMDAxLWxsYW1hLXN0YWNrLm1kKQogIC0gaHR0cHM6Ly9naXRodWIuY29tL21ldGEtbGxhbWEvbGxhbWEtc3RhY2stYXBwcwogIC0gaHR0cHM6Ly9naXRodWIuY29tL21ldGEtbGxhbWEvbGxhbWEtc3RhY2sKCioqTW9yZSBTcGVjaWZpY2F0aW9uczoqKgotIGZvciB0aGUgQmVkcm9jayBBUEkgLSA/Ci0gZm9yIHRoZSBHZW1pbmkgQVBJIC0gPwotIGZvciB0aGUgTGxhbWEgQVBJIC0gPwoKKipNb3JlIExhbmd1YWdlczoqKgotIFRoZSBvZmZpY2lhbCBbR29dKGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuYWkvb3BlbmFpLWdvKSBsaWJyYXJ5IGZvciB0aGUgT3BlbkFJIEFQSQogICAgCiMjIEF1dGgoZW50aWNhdGlvbiAmIG9yaXphdGlvbikKCiMjIyAxLiBBUEkgS2V5CkFuIEFQSSBrZXkgaXMgYSBzaW1wbGUgc3RyaW5nIChvZnRlbiBhbHBoYW51bWVyaWMpIHVzZWQgdG8gYXV0aGVudGljYXRlIHJlcXVlc3RzLiBJdCBjYW4gYmUgaW5jbHVkZWQgYXM6Ci0gKipVUkwgUGFyYW1ldGVyKio6ICAKICBgaHR0cHM6Ly9leGFtcGxlLmNvbS9hcGkvcmVzb3VyY2U/YXBpX2tleT1ZT1VSX0FQSV9LRVlgCi0gKipIZWFkZXIqKjogIAogIGBBdXRob3JpemF0aW9uOiBBcGlLZXkgWU9VUl9BUElfS0VZYAoKQVBJIGtleXMgYXJlIHR5cGljYWxseSB1c2VkIGZvciBzaW1wbGUgYXV0aGVudGljYXRpb24gYW5kIGFyZSBzdWl0ZWQgZm9yIHNlcnZlci10by1zZXJ2ZXIgY29tbXVuaWNhdGlvbiBidXQgYXJlIGxlc3Mgc2VjdXJlIGlmIGV4cG9zZWQgaW4gVVJMcy4KCi0tLQoKIyMjIDIuIEJlYXJlciBUb2tlbgpBICoqQmVhcmVyIFRva2VuKiogaXMgYSBzZWN1cml0eSB0b2tlbiB0aGF0IGlzIGlzc3VlZCBhcyBwYXJ0IG9mIE9BdXRoIDIuMC4gVGhpcyB0b2tlbiBncmFudHMgdGhlIGJlYXJlciBhY2Nlc3MgdG8gcmVzb3VyY2VzLiBJdCdzIHVzdWFsbHkgcGFzc2VkIGluIHRoZSByZXF1ZXN0IGhlYWRlcjoKLSAqKkhlYWRlcioqOiAgCiAgYEF1dGhvcml6YXRpb246IEJlYXJlciBZT1VSX1RPS0VOYAoKQmVhcmVyIHRva2VucyBvZmZlciBtb3JlIHNlY3VyaXR5IGNvbXBhcmVkIHRvIEFQSSBrZXlzLCBlc3BlY2lhbGx5IHdoZW4gY29tYmluZWQgd2l0aCB0b2tlbiBleHBpcmF0aW9uIGFuZCByZWZyZXNoIG1lY2hhbmlzbXMuCgotLS0KCiMjIyAzLiBNaWNyb3NvZnQgRW50cmEgSUQgKGZvcm1lcmx5IEF6dXJlIEFEKQpFbnRyYSBJRCBwcm92aWRlcyAqKk9BdXRoIDIuMCoqIG9yICoqT3BlbklEIENvbm5lY3QgKE9JREMpKiogYmFzZWQgYXV0aGVudGljYXRpb24gYW5kIGF1dGhvcml6YXRpb24sIG1vc3RseSB1c2VkIGZvciBzZWN1cmluZyBlbnRlcnByaXNlIGFwcHMuIFRoZSBmbG93IHR5cGljYWxseSBpbnZvbHZlczoKLSAqKkFjY2VzcyBUb2tlbioqOiBPYnRhaW5lZCBhZnRlciBhIHVzZXIgb3Igc2VydmljZSBhdXRoZW50aWNhdGVzIHdpdGggRW50cmEgSUQuCi0gKipIZWFkZXIqKjogIAogIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgWU9VUl9BQ0NFU1NfVE9LRU5gCgpFbnRyYSBJRCBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggTWljcm9zb2Z0IHNlcnZpY2VzIG9yIGVudGVycHJpc2UgZW52aXJvbm1lbnRzIGZvciB1c2VyLWJhc2VkIG9yIHNlcnZpY2UtYmFzZWQgYXV0aGVudGljYXRpb24uCgotLS0KCiMjIyA0LiBBV1MgU2lnbmF0dXJlCioqQVdTIFNpZ25hdHVyZSBWZXJzaW9uIDQqKiBpcyB1c2VkIHRvIHNlY3VyZWx5IHNpZ24gQVBJIHJlcXVlc3RzIHRvIEFXUyBzZXJ2aWNlcy4gVGhpcyBtZXRob2QgY2FsY3VsYXRlcyBhIHNpZ25hdHVyZSBiYXNlZCBvbiB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzLCBoZWFkZXJzLCBhbmQgdGhlIHVzZXIncyBzZWNyZXQgYWNjZXNzIGtleS4gVGhlIHNpZ25hdHVyZSBpcyBhZGRlZCB0byB0aGUgcmVxdWVzdCBhczoKLSAqKkF1dGhvcml6YXRpb24gSGVhZGVyKio6ICAKICBgQXV0aG9yaXphdGlvbjogQVdTNC1ITUFDLVNIQTI1NiBDcmVkZW50aWFsPUFDQ0VTU19LRVkvLi4uLCBTaWduZWRIZWFkZXJzPS4uLiwgU2lnbmF0dXJlPVNJR05BVFVSRWAKCkl0IGlzIHR5cGljYWxseSBtb3JlIHNlY3VyZSBiZWNhdXNlIHRoZSBzaWduYXR1cmUgaXMgZGVyaXZlZCBkeW5hbWljYWxseSBhbmQgaXMgdGltZS1saW1pdGVkLgoKCiMjIEd1YXJkcmFpbHMKLSBTZW5zaXRpdmUgaW5mb3JtYXRpb24gZmlsdGVycyAtIFBJSSB0eXBlcywgUmVnZXggcGF0dGVybnMgZXRjLgotIENvbnRlbnQgZmlsdGVycyAtIENvbmZpZ3VyZSBjb250ZW50IGZpbHRlcnMgdG8gZGV0ZWN0ICYgYmxvY2sgaGFybWZ1bCB1c2VyIGlucHV0cyBhbmQgbW9kZWwgcmVzcG9uc2VzCi0gRGVuaWVkIHRvcGljcwotIFdvcmQgZmlsdGVycwotIENvbnRleHR1YWwgZ3JvdW5kaW5nIGNoZWNrCgojIyBBc3Npc3RhbnRzCi0gVHVuZSBQZXJzb25hbGl0eSAmIENhcGFiaWxpdGllcwotIENhbGwgTW9kZWxzCi0gQWNjZXNzIFRvb2xzIGluIHBhcmFsbGVsCiAgICAtIEJ1aWx0LWluIGNvZGVfaW50ZXJwcmV0ZXIsIGZpbGVfc2VhcmNoIGV0Yy4KICAgIC0gRnVuY3Rpb24gQ2FsbGluZwotIFBlcnNpc3RlbnQgVGhyZWFkcwotIEZpbGUgRm9ybWF0cwoKIyMgQWdlbnRzCi0g4oCcQWdlbnQgaXMgYSBtb3JlIG92ZXJsb2FkZWQgdGVybSBhdCB0aGlzIHBvaW50IHRoYW4gbm9kZSwgc2VydmljZSwgYW5kIGluc3RhbmNlLuKAnQogIAotPiBodHRwczovL3guY29tL3Jha3lsbC9zdGF0dXMvMTgzNzE2NDc2MTM2MjEzMzA1NwoKLSDigJxJJ20gd29uZGVyaW5nIHdoYXQgd291bGQgYmUgdGhlIGJhc2UgcmVxdWlyZW1lbnRzIG9mICJ0cnVlIGFnZW50IiAoaS5lLiBub3QganVzdCBvdmVyLWh5cGVkIG1hcmtldGluZykuIApGb3IgbWU6IApDYW4gdXNlIEFQSXMgcmVsaWFibHkuIApBUElzIGJ5IG90aGVyIGNvbXBhbmllcywgbm90IGp1c3Qgb25lcyBzcGVjaWZpY2FsbHkgd3JpdHRlbiBmb3IgdGhlIGFnZW50LgpUaGUgQVBJIHVzYWdlIHNob3VsZCBjb3ZlciBhIGxhcmdlIHN1YnNldCBvZiB0aGUgc2VydmljZXMgdGhhdCB0aGUgYWdlbnQgaXMgYWltaW5nIHRvIGNvdmVyLiAKCkkuZS4gaWYgeW91ciBhZ2VudCBpcyBzdXBwb3NlZCB0byBvcmRlciBmb29kLCBpdCBzaG91bGQgYmUgYWJsZSB0byBmaW5kIGFuIG9wZW4gcmVzdGF1cmFudCB3aXRoIHRha2UgYXdheSwgZmlndXJlIG91dCBob3cgdG8gZG8gdGhlIGRlbGl2ZXJ5IGFuZCBhdCBsZWFzdCBzdXBwb3J0IHRoZSAzIGxhcmdlIGRlbGl2ZXJ5IGNvbXBhbmllcy7igJ0KCi0+IGh0dHBzOi8veC5jb20vZ3dlbnNoYXAvc3RhdHVzLzE4MzcxNjc2NTMzMzg2ODE4MTkKCiMjIFRlbGVtZXRyeQotIFtPcGVuVGVsZW1ldHJ5XShodHRwczovL29wZW50ZWxlbWV0cnkuaW8vKQogIC0gW1NlbWFudGljIENvbnZlbnRpb25zIGZvciBHZW5lcmF0aXZlIEFJIHN5c3RlbXMgfCBPcGVuVGVsZW1ldHJ5XShodHRwczovL29wZW50ZWxlbWV0cnkuaW8vZG9jcy9zcGVjcy9zZW1jb252L2dlbi1haS8pCiAgICAtIFtJbnRyb2R1Y2Ugc2VtYW50aWMgY29udmVudGlvbnMgZm9yIG1vZGVybiBBSSAoTExNcywgdmVjdG9yIGRhdGFiYXNlcywgZXRjLildKGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy9pc3N1ZXMvMzI3KQoKIyBNb3JlIFNwYWNlcy4uLgoKIVtpbWFnZV0oaHR0cHM6Ly9naXRodWIuY29tL3VzZXItYXR0YWNobWVudHMvYXNzZXRzLzY4MzBjMzA3LTYyYWQtNDI1NS1hYjNhLTVkNzAzNzE3NmUyYikKPHAgYWxpZ249ImNlbnRlciI+U291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vcmFzYnQvTExNcy1mcm9tLXNjcmF0Y2g8L3A+CgoKKipGb3VuZGF0aW9uIE1vZGVsczoqKiBFbXBoYXNpemUgdGhlIGNyZWF0aW9uIGFuZCBhcHBsaWNhdGlvbiBvZiBsYXJnZS1zY2FsZSBtb2RlbHMgdGhhdCBjYW4gYmUgYWRhcHRlZCB0byBhIHdpZGUgcmFuZ2Ugb2YgdGFza3Mgd2l0aCBtaW5pbWFsIHRhc2stc3BlY2lmaWMgdHVuaW5nLiAgCgoqKlByZWRpY3RpdmUgSHVtYW4gUHJlZmVyZW5jZSAoUEhQKToqKiBMZXZlcmFnaW5nIGh1bWFuIGZlZWRiYWNrIGluIHRoZSBsb29wIG9mIG1vZGVsIHRyYWluaW5nIHRvIHJlZmluZSBvdXRwdXRzIG9yIHByZWRpY3Rpb25zIGJhc2VkIG9uIHdoYXQgaXMgcHJlZmVycmVkIG9yIGRlc2lyZWQgYnkgaHVtYW5zLiAgIAoKLSBQcmVkaWN0aXZlIEh1bWFuIFByZWZlcmVuY2UgLSBbcGhwXShwaHApCgoqKkZpbmUgVHVuaW5nOioqIFRoZSBwcm9jZXNzIG9mIHRyYWluaW5nIGFuIGV4aXN0aW5nIHByZS10cmFpbmVkIG1vZGVsIG9uIGEgc3BlY2lmaWMgdGFzayBvciBkYXRhc2V0IHRvIGltcHJvdmUgaXRzIHBlcmZvcm1hbmNlIG9uIHRoYXQgdGFzay4gIAoKLSBodHRwczovL2xsYW1hLm1ldGEuY29tL2RvY3MvaG93LXRvLWd1aWRlcy9maW5lLXR1bmluZwotIGh0dHBzOi8vZ2l0aHViLmNvbS9oaXlvdWdhL0xMYU1BLUZhY3RvcnkKCioqQ3Jvc3MtY3V0dGluZyBUaGVtZXM6KioKCiJPdXIgcmVzdWx0cyBzaG93IGNvbmRpdGlvbmluZyBhd2F5IHJpc2sgb2YgYXR0YWNrIHJlbWFpbnMgYW4gdW5zb2x2ZWQgcHJvYmxlbTsgZm9yIGV4YW1wbGUsIGFsbCB0ZXN0ZWQgbW9kZWxzIHNob3dlZCBiZXR3ZWVuIDI1JSBhbmQgNTAlIHN1Y2Nlc3NmdWwgcHJvbXB0IGluamVjdGlvbiB0ZXN0cy4iCgpodHRwczovL2FpLm1ldGEuY29tL3Jlc2VhcmNoL3B1YmxpY2F0aW9ucy9jeWJlcnNlY2V2YWwtMi1hLXdpZGUtcmFuZ2luZy1jeWJlcnNlY3VyaXR5LWV2YWx1YXRpb24tc3VpdGUtZm9yLWxhcmdlLWxhbmd1YWdlLW1vZGVscy8KCioqUGVyc29uYWwgSWRlbnRpZmlhYmxlIEluZm9ybWF0aW9uIChQSUkpIGFuZCBTZWN1cml0eToqKiBUaGVzZSBjb25zaWRlcmF0aW9ucyBhcmUgY3J1Y2lhbCBmb3IgZW5zdXJpbmcgdGhhdCBNTCBtb2RlbHMgcmVzcGVjdCBwcml2YWN5IGFuZCBhcmUgc2VjdXJlIGFnYWluc3QgcG90ZW50aWFsIHRocmVhdHMuICAKCi0gUGVyc29uYWwgSWRlbnRpZmlhYmxlIEluZm9ybWF0aW9uIC0gW3BpaV0ocGlpKSAgCgoqKkNvZGUsIFNRTCwgR2Vub21pY3MsIGFuZCBNb3JlOioqIFRoZXNlIGFyZWFzIGhpZ2hsaWdodCB0aGUgaW50ZXJkaXNjaXBsaW5hcnkgbmF0dXJlIG9mIE1MLCB3aGVyZSBrbm93bGVkZ2UgaW4gcHJvZ3JhbW1pbmcsIGRhdGFiYXNlcywgYmlvbG9neSwgYW5kIG90aGVyIGZpZWxkcyBjb252ZXJnZSB0byBhZHZhbmNlIE1MIGFwcGxpY2F0aW9ucy4gIAoKKipOZXVyYWwgQXJjaGl0ZWN0dXJlIFNlYXJjaCAoTkFTKToqKiBIaWdobGlnaHRzIHRoZSBhdXRvbWF0aW9uIG9mIHRoZSBkZXNpZ24gb2YgbmV1cmFsIG5ldHdvcmsgYXJjaGl0ZWN0dXJlcyB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZSBmb3Igc3BlY2lmaWMgdGFza3MuICAKCi0gQmlvbG9neSAoQ29sbGFiIHcvIFtBc2hpc2ggUGhhbF0oaHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL2FzaGlzaC1waGFsLTU0OGIzNzEyNS8pKSAtIFtnZW5vbWljc10oZG9jcy9nZW5vbWljcy5tZCkgIAoKKipGZXctU2hvdCBhbmQgWmVyby1TaG90IExlYXJuaW5nOioqIFBvaW50cyB0byBsZWFybmluZyBwYXJhZGlnbXMgdGhhdCBhaW0gdG8gcmVkdWNlIHRoZSBkZXBlbmRlbmN5IG9uIGxhcmdlIGxhYmVsZWQgZGF0YXNldHMgZm9yIHRyYWluaW5nIG1vZGVscy4gIAoKKipGZWRlcmF0ZWQgTGVhcm5pbmc6KiogRm9jdXNlcyBvbiBwcml2YWN5LXByZXNlcnZpbmcgdGVjaG5pcXVlcyB0aGF0IGVuYWJsZSBtb2RlbCB0cmFpbmluZyBhY3Jvc3MgbXVsdGlwbGUgZGVjZW50cmFsaXplZCBkZXZpY2VzIG9yIHNlcnZlcnMgaG9sZGluZyBsb2NhbCBkYXRhIHNhbXBsZXMuICAKIAoqKlRyYW5zZm9ybWVycyBpbiBWaXNpb24gYW5kIEJleW9uZDoqKiBEaXNjdXNzZXMgdGhlIGFwcGxpY2F0aW9uIG9mIHRyYW5zZm9ybWVyIG1vZGVscywgb3JpZ2luYWxseSBkZXNpZ25lZCBmb3IgTkxQIHRhc2tzLCBpbiBvdGhlciBkb21haW5zIGxpa2UgdmlzaW9uIGFuZCBhdWRpbyBwcm9jZXNzaW5nLiAgCgoqKlJlaW5mb3JjZW1lbnQgTGVhcm5pbmcgRW5oYW5jZW1lbnRzOioqIExvb2tzIGF0IGFkdmFuY2VtZW50cyBpbiBSTCB0ZWNobmlxdWVzIHRoYXQgaW1wcm92ZSBlZmZpY2llbmN5IGFuZCBhcHBsaWNhYmlsaXR5IGluIHZhcmlvdXMgZGVjaXNpb24tbWFraW5nIGNvbnRleHRzLiAgIAoKKipNTE9wcyBhbmQgQXV0b01MOioqIENvbmNlbnRyYXRlcyBvbiB0aGUgb3BlcmF0aW9uYWxpemF0aW9uIG9mIE1MIG1vZGVscyBhbmQgdGhlIGF1dG9tYXRpb24gb2YgdGhlIE1MIHBpcGVsaW5lIHRvIHN0cmVhbWxpbmUgZGV2ZWxvcG1lbnQgYW5kIGRlcGxveW1lbnQgcHJvY2Vzc2VzLiAgCgoqKkh5YnJpZCBNb2RlbHM6KiogRXhwbG9yZXMgdGhlIGludGVncmF0aW9uIG9mIGRpZmZlcmVudCBtb2RlbCB0eXBlcyBvciBBSSBhcHByb2FjaGVzIHRvIGxldmVyYWdlIHRoZWlyIHJlc3BlY3RpdmUgc3RyZW5ndGhzIGluIHNvbHZpbmcgY29tcGxleCBwcm9ibGVtcy4gIAoKKipBSSBFdGhpY3MgYW5kIEJpYXMgTWl0aWdhdGlvbjoqKiBVbmRlcmxpbmVzIHRoZSBpbXBvcnRhbmNlIG9mIGRldmVsb3BpbmcgZmFpciBhbmQgZXRoaWNhbCBBSSBzeXN0ZW1zIGJ5IGFkZHJlc3NpbmcgYW5kIG1pdGlnYXRpbmcgYmlhc2VzIGluIE1MIG1vZGVscy4gIAoKKipFbmVyZ3ktRWZmaWNpZW50IE1MOioqIFJlZmxlY3RzIHRoZSBncm93aW5nIGNvbmNlcm4gYW5kIG5lZWQgZm9yIGVudmlyb25tZW50YWxseSBzdXN0YWluYWJsZSBBSSBieSBkZXZlbG9waW5nIG1vZGVscyB0aGF0IHJlcXVpcmUgbGVzcyBjb21wdXRhdGlvbmFsIHBvd2VyIGFuZCBlbmVyZ3kuIAoKKipIYXJkd2FyZToqKiBQb2ludHMgdG8gdGhlIGltcG9ydGFuY2Ugb2YgZGV2ZWxvcGluZyBhbmQgdXRpbGl6aW5nIGhhcmR3YXJlIG9wdGltaXplZCBmb3IgTUwgdGFza3MgdG8gaW1wcm92ZSBlZmZpY2llbmN5IGFuZCBwZXJmb3JtYW5jZS4gIAoKCgoKCgoKCgoK
- readmeEtag: '"1ee63a9c9d3b86649dcf2e3286fe589d09689047"'
- readmeLastModified: Thu, 26 Sep 2024 18:32:58 GMT
+ W05vdGVib29rTE0gRGVlcCBEaXZlXShodHRwczovL25vdGVib29rbG0uZ29vZ2xlLmNvbS9ub3RlYm9vay8yYzVkMzQwOS0wOGRiLTQ2MjctODMzNS1hODcxYWNiOGQ2YWIvYXVkaW8pCgojIFN5c3RlbXMgU3BhY2UKCjEuIFsqKlRoZSBTaGlmdCBmcm9tIE1vZGVscyB0byBDb21wb3VuZCBBSSBTeXN0ZW1zKipdKGh0dHBzOi8vYmFpci5iZXJrZWxleS5lZHUvYmxvZy8yMDI0LzAyLzE4L2NvbXBvdW5kLWFpLXN5c3RlbXMvKSAtIFRoaXMgYXJ0aWNsZSBmcm9tIEJlcmtlbGV5IEFJIFJlc2VhcmNoIChCQUlSKSBoaWdobGlnaHRzIGEgZ3Jvd2luZyB0cmVuZCB3aGVyZSBBSSBhZHZhbmNlbWVudHMgaW5jcmVhc2luZ2x5IHJlbHkgb24gKipjb21wb3VuZCBBSSBzeXN0ZW1zKirigJRjb21iaW5hdGlvbnMgb2YgbXVsdGlwbGUgbW9kZWxzIGFuZCBjb21wb25lbnRz4oCUcmF0aGVyIHRoYW4gdHJhZGl0aW9uYWwgbW9ub2xpdGhpYyBtb2RlbHMuIENvbXBvdW5kIHN5c3RlbXMgb2ZmZXIgbW9yZSBmbGV4aWJpbGl0eSBhbmQgYWRhcHRhYmlsaXR5LCBhcyBlYWNoIGNvbXBvbmVudCBjYW4gc3BlY2lhbGl6ZSBpbiBhIGRpZmZlcmVudCB0YXNrIG9yIHBoYXNlIG9mIHRoZSBwaXBlbGluZS4gIAoKS2V5IHBvaW50czoKLSAqKkRlc2lnbiwgb3B0aW1pemF0aW9uLCBhbmQgb3BlcmF0aW9uOioqIEFwcHJvYWNoZXMgYXJlIHN0aWxsIGVtZXJnaW5nLCBidXQgY29tcG91bmQgQUkgc3lzdGVtcyBhcmUgcHJvdmluZyBtb3JlIGVmZmljaWVudCBmb3IgY29tcGxleCB0YXNrcy4KLSAqKk1heGltaXppbmcgcmVsaWFiaWxpdHkgYW5kIHF1YWxpdHk6KiogVGhlc2Ugc3lzdGVtcyBwcm9taXNlIGhpZ2hlciByZWxpYWJpbGl0eSwgcGFydGljdWxhcmx5IGZvciBsYXJnZS1zY2FsZSBhcHBsaWNhdGlvbnMsIGJ5IGJyZWFraW5nIGRvd24gdGFza3MgaW50byBzbWFsbGVyLCBtb3JlIG1hbmFnZWFibGUgdW5pdHMuIAotICoqVHJlbmQgZm9yIDIwMjQ6KiogQkFJUiBzZWVzIHRoaXMgYXMgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCB0cmVuZHMsIHdoZXJlIGRldmVsb3BlcnMgd2lsbCBmb2N1cyBvbiBob3cgdG8gYXNzZW1ibGUgdGhlc2UgY29tcG9uZW50cyBpbiBlZmZlY3RpdmUgd2F5cy4KICAgCiFbaW1hZ2VdKGh0dHBzOi8vZ2l0aHViLmNvbS91c2VyLWF0dGFjaG1lbnRzL2Fzc2V0cy9kODc0ZTgyZi05Yjg5LTQ4N2UtODk0Yy0xZWQzYjI0NzI5NGQpCjxwIGFsaWduPSJjZW50ZXIiPkluY3JlYXNpbmdseSBtYW55IG5ldyBBSSByZXN1bHRzIGFyZSBmcm9tIGNvbXBvdW5kIHN5c3RlbXMuPC9wPgoKIl9GaWd1cmluZyBvdXQgdGhlIGJlc3QgcHJhY3RpY2VzIGZvciBkZXZlbG9waW5nIGNvbXBvdW5kIEFJIHN5c3RlbXMgaXMgc3RpbGwgYW4gb3BlbiBxdWVzdGlvbiwgYnV0IHRoZXJlIGFyZSBhbHJlYWR5IGV4Y2l0aW5nIGFwcHJvYWNoZXMgdG8gYWlkIHdpdGggZGVzaWduLCBlbmQtdG8tZW5kIG9wdGltaXphdGlvbiwgYW5kIG9wZXJhdGlvbi4gV2UgYmVsaWV2ZSB0aGF0IGNvbXBvdW5kIEFJIHN5c3RlbXMgd2lsbCByZW1haW4gdGhlIGJlc3Qgd2F5IHRvIG1heGltaXplIHRoZSBxdWFsaXR5IGFuZCByZWxpYWJpbGl0eSBvZiBBSSBhcHBsaWNhdGlvbnMgZ29pbmcgZm9yd2FyZCwgYW5kIG1heSBiZSBvbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IHRyZW5kcyBpbiBBSSBpbiAyMDI0Ll8iCgoyLiBbKipCdWlsZGluZyBBIEdlbmVyYXRpdmUgQUkgUGxhdGZvcm0qKl0oaHR0cHM6Ly9odXllbmNoaXAuY29tLzIwMjQvMDcvMjUvZ2VuYWktcGxhdGZvcm0uaHRtbCkgLSBUaGlzIGFydGljbGUgZXhwbG9yZXMgdGhlIGFyY2hpdGVjdHVyZSBhbmQgZGV2ZWxvcG1lbnQgb2YgYSBnZW5lcmF0aXZlIEFJIHBsYXRmb3JtLCBmb2N1c2luZyBvbiB0aGUgY2hhbGxlbmdlcyBvZiBpbnRlZ3JhdGluZyB2YXJpb3VzIEFJIGNvbXBvbmVudHMuIEl0IGVtcGhhc2l6ZXM6Ci0gKipPcGVuIFNvdXJjZSBMTE0gVG9vbHM6KiogVGhlIGFydGljbGUgcmVmZXJlbmNlcyBzZXZlcmFsIHRvb2xzIGFuZCB0ZWNobmlxdWVzIGZvciBidWlsZGluZyBnZW5lcmF0aXZlIEFJLCBlc3BlY2lhbGx5IGZvY3VzaW5nIG9uIG1vZGVsIGFsaWdubWVudCwgb3B0aW1pemF0aW9uLCBhbmQgYWRhcHRhYmlsaXR5LiBUaGUgcmVmZXJlbmNlZCBbT3BlbiBTb3VyY2UgTExNIFRvb2xzXShodHRwczovL2h1eWVuY2hpcC5jb20vbGxhbWEtcG9saWNlKSBhcmUgY3J1Y2lhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgZWNvc3lzdGVtIHN1cnJvdW5kaW5nIGdlbmVyYXRpdmUgQUkgbW9kZWxzIGxpa2UgTWV0YeKAmXMgTExhTUEuCi0gKipDaGFsbGVuZ2VzIGluIHBsYXRmb3JtIGJ1aWxkaW5nOioqIEZyb20gbW9kZWwgaW50ZWdyYXRpb24gdG8gZW5zdXJpbmcgdGhlIGFsaWdubWVudCBvZiBnZW5lcmF0aXZlIEFJIG91dHB1dCB3aXRoIGludGVuZGVkIHVzZSBjYXNlcywgdGhlcmUgYXJlIG1hbnkgaHVyZGxlcyBpbiBhY2hpZXZpbmcgYW4gb3BlcmF0aW9uYWwgcGxhdGZvcm0uCgpCb3RoIGFydGljbGVzIHN0cmVzcyB0aGF0IHRoZSBmdXR1cmUgb2YgQUkgd2lsbCBpbnZvbHZlICoqbW9yZSBzb3BoaXN0aWNhdGVkIHN5c3RlbXMqKiwgcmVseWluZyBvbiB0aGUgY29vcGVyYXRpb24gb2YgdmFyaW91cyBzcGVjaWFsaXplZCBtb2RlbHMgKGNvbXBvdW5kIEFJKSBhbmQgdGhlIGludGVncmF0aW9uIG9mIGRpdmVyc2UgdG9vbHMgZm9yIGdlbmVyYXRpdmUgQUkgcGxhdGZvcm0gZGV2ZWxvcG1lbnQuIFRoaXMgYWxpZ25zIHdpdGggb25nb2luZyBleHBsb3JhdGlvbiBvZiAqKmNvbXBvdW5kIEFJIHN5c3RlbXMqKiBhbmQgKipnZW5lcmF0aXZlIEFJIHBsYXRmb3JtIGFyY2hpdGVjdHVyZSoqLgogICAKIyMgT3BlbkFQSQpzdGFydGVkIHdpdGggdGhpcyBvbmUgZW5kcG9pbnQgQ29tcGxldGlvbnMgKiovY29tcGxldGlvbnMqKiB3aXRoIFRleHQgSW5wdXQvT3V0cHV0IChub3cgTGVnYWN5KQoKVGhlbiBDaGF0R1BULCBDaGF0IGNvbXBsZXRpb25zICoqL2NoYXQvY29tcGxldGlvbnMqKiAgd2l0aCBNZXNzYWdlcyBJbnB1dC9PdXRwdXQKICAKMy4gRW1iZWRkaW5ncwkJCSoqL2VtYmVkZGluZ3MqKgo0LiBJbWFnZSBnZW5lcmF0aW9uCQkqKi9pbWFnZXMvZ2VuZXJhdGlvbnMqKgo1LiBUZXh0IHRvIHNwZWVjaAkJCSoqL2F1ZGlvL3NwZWVjaCoqCjYuIFNwZWVjaCB0byB0ZXh0CQkJKiovYXVkaW8vdHJhbnNjcmlwdGlvbnMqKgo3LiBNb2RlcmF0aW9uCQkJKiovbW9kZXJhdGlvbnMqKgo4LiBGaW5lLXR1bmluZyAgKiovZmluZV90dW5pbmcvam9icyoqCjkuIEJhdGNoCQkJCSoqL2ZpbGVzIC9iYXRjaGVzKioKCi0gRnVuY3Rpb24gQ2FsbGluZyAtIFF1ZXJ5IERhdGFiYXNlLCBTZW5kIEVtYWlscyBldGMuCi0gUmVzcG9uc2UgRm9ybWF0cyAtIFtCdWlsZGluZyBBR0kgd2l0aCBPcGVuQUkncyBTdHJ1Y3R1cmVkIE91dHB1dHMgQVBJXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PU5qT2ZIOUQ4YUpvKQoKUkVTVCBBUEk6ICAKLSBPcGVuQVBJIHNwZWNpZmljYXRpb24gZm9yIHRoZSBbT3BlbkFJIEFQSV0oaHR0cHM6Ly9naXRodWIuY29tL29wZW5haS9vcGVuYWktb3BlbmFwaS9ibG9iL21hc3Rlci9vcGVuYXBpLnlhbWwpICAKLSBTcGVjaWZpY2F0aW9uIGZvciB0aGUgW0F6dXJlIE9wZW5BSSBBUEldKGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9haS1zZXJ2aWNlcy9vcGVuYWkvcmVmZXJlbmNlI2FwaS1zcGVjcykKClB5dGhvbiBTREs6ICAKLSBPcGVuQUkgUHl0aG9uIFtBUEldKGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuYWkvb3BlbmFpLXB5dGhvbi9ibG9iL21haW4vYXBpLm1kKSBsaWJyYXJ5IGluIHRoZSBUaGUgb2ZmaWNpYWwgUHl0aG9uIGxpYnJhcnkgZm9yIHRoZSBbT3BlbkFJIEFQSV0oaHR0cHM6Ly9naXRodWIuY29tL29wZW5haS9vcGVuYWktcHl0aG9uKQoKLSBbRHJvcCBpbiByZXBsYWNlbWVudF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGFzdGF4L2FzdHJhLWFzc2lzdGFudHMtYXBpKSBmb3IgdGhlIE9wZW5BSSBBc3Npc3RhbnRzIEFQSQogIC0gRnVsbCBjb3ZlcmFnZSBvZiBPcGVuQUkgZW5kcG9pbnRzIGluIHRoZSByZXBvIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vZGF0YXN0YXgvYXN0cmEtYXNzaXN0YW50cy1hcGkvYmxvYi9tYWluL2NvdmVyYWdlLm1kKQogCi0gW0xsYW1hIFN0YWNrIFJGQ10oaHR0cHM6Ly9naXRodWIuY29tL21ldGEtbGxhbWEvbGxhbWEtc3RhY2svYmxvYi9tYWluL3JmY3MvUkZDLTAwMDEtbGxhbWEtc3RhY2subWQpCiAgLSBodHRwczovL2dpdGh1Yi5jb20vbWV0YS1sbGFtYS9sbGFtYS1zdGFjay1hcHBzCiAgLSBodHRwczovL2dpdGh1Yi5jb20vbWV0YS1sbGFtYS9sbGFtYS1zdGFjawoKKipNb3JlIFNwZWNpZmljYXRpb25zOioqCi0gZm9yIHRoZSBCZWRyb2NrIEFQSSAtID8KLSBmb3IgdGhlIEdlbWluaSBBUEkgLSA/Ci0gZm9yIHRoZSBMbGFtYSBBUEkgLSA/CgoqKk1vcmUgTGFuZ3VhZ2VzOioqCi0gVGhlIG9mZmljaWFsIFtHb10oaHR0cHM6Ly9naXRodWIuY29tL29wZW5haS9vcGVuYWktZ28pIGxpYnJhcnkgZm9yIHRoZSBPcGVuQUkgQVBJCiAgICAKIyMgQXV0aChlbnRpY2F0aW9uICYgb3JpemF0aW9uKQoKIyMjIDEuIEFQSSBLZXkKQW4gQVBJIGtleSBpcyBhIHNpbXBsZSBzdHJpbmcgKG9mdGVuIGFscGhhbnVtZXJpYykgdXNlZCB0byBhdXRoZW50aWNhdGUgcmVxdWVzdHMuIEl0IGNhbiBiZSBpbmNsdWRlZCBhczoKLSAqKlVSTCBQYXJhbWV0ZXIqKjogIAogIGBodHRwczovL2V4YW1wbGUuY29tL2FwaS9yZXNvdXJjZT9hcGlfa2V5PVlPVVJfQVBJX0tFWWAKLSAqKkhlYWRlcioqOiAgCiAgYEF1dGhvcml6YXRpb246IEFwaUtleSBZT1VSX0FQSV9LRVlgCgpBUEkga2V5cyBhcmUgdHlwaWNhbGx5IHVzZWQgZm9yIHNpbXBsZSBhdXRoZW50aWNhdGlvbiBhbmQgYXJlIHN1aXRlZCBmb3Igc2VydmVyLXRvLXNlcnZlciBjb21tdW5pY2F0aW9uIGJ1dCBhcmUgbGVzcyBzZWN1cmUgaWYgZXhwb3NlZCBpbiBVUkxzLgoKLS0tCgojIyMgMi4gQmVhcmVyIFRva2VuCkEgKipCZWFyZXIgVG9rZW4qKiBpcyBhIHNlY3VyaXR5IHRva2VuIHRoYXQgaXMgaXNzdWVkIGFzIHBhcnQgb2YgT0F1dGggMi4wLiBUaGlzIHRva2VuIGdyYW50cyB0aGUgYmVhcmVyIGFjY2VzcyB0byByZXNvdXJjZXMuIEl0J3MgdXN1YWxseSBwYXNzZWQgaW4gdGhlIHJlcXVlc3QgaGVhZGVyOgotICoqSGVhZGVyKio6ICAKICBgQXV0aG9yaXphdGlvbjogQmVhcmVyIFlPVVJfVE9LRU5gCgpCZWFyZXIgdG9rZW5zIG9mZmVyIG1vcmUgc2VjdXJpdHkgY29tcGFyZWQgdG8gQVBJIGtleXMsIGVzcGVjaWFsbHkgd2hlbiBjb21iaW5lZCB3aXRoIHRva2VuIGV4cGlyYXRpb24gYW5kIHJlZnJlc2ggbWVjaGFuaXNtcy4KCi0tLQoKIyMjIDMuIE1pY3Jvc29mdCBFbnRyYSBJRCAoZm9ybWVybHkgQXp1cmUgQUQpCkVudHJhIElEIHByb3ZpZGVzICoqT0F1dGggMi4wKiogb3IgKipPcGVuSUQgQ29ubmVjdCAoT0lEQykqKiBiYXNlZCBhdXRoZW50aWNhdGlvbiBhbmQgYXV0aG9yaXphdGlvbiwgbW9zdGx5IHVzZWQgZm9yIHNlY3VyaW5nIGVudGVycHJpc2UgYXBwcy4gVGhlIGZsb3cgdHlwaWNhbGx5IGludm9sdmVzOgotICoqQWNjZXNzIFRva2VuKio6IE9idGFpbmVkIGFmdGVyIGEgdXNlciBvciBzZXJ2aWNlIGF1dGhlbnRpY2F0ZXMgd2l0aCBFbnRyYSBJRC4KLSAqKkhlYWRlcioqOiAgCiAgYEF1dGhvcml6YXRpb246IEJlYXJlciBZT1VSX0FDQ0VTU19UT0tFTmAKCkVudHJhIElEIGlzIG9mdGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBNaWNyb3NvZnQgc2VydmljZXMgb3IgZW50ZXJwcmlzZSBlbnZpcm9ubWVudHMgZm9yIHVzZXItYmFzZWQgb3Igc2VydmljZS1iYXNlZCBhdXRoZW50aWNhdGlvbi4KCi0tLQoKIyMjIDQuIEFXUyBTaWduYXR1cmUKKipBV1MgU2lnbmF0dXJlIFZlcnNpb24gNCoqIGlzIHVzZWQgdG8gc2VjdXJlbHkgc2lnbiBBUEkgcmVxdWVzdHMgdG8gQVdTIHNlcnZpY2VzLiBUaGlzIG1ldGhvZCBjYWxjdWxhdGVzIGEgc2lnbmF0dXJlIGJhc2VkIG9uIHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMsIGhlYWRlcnMsIGFuZCB0aGUgdXNlcidzIHNlY3JldCBhY2Nlc3Mga2V5LiBUaGUgc2lnbmF0dXJlIGlzIGFkZGVkIHRvIHRoZSByZXF1ZXN0IGFzOgotICoqQXV0aG9yaXphdGlvbiBIZWFkZXIqKjogIAogIGBBdXRob3JpemF0aW9uOiBBV1M0LUhNQUMtU0hBMjU2IENyZWRlbnRpYWw9QUNDRVNTX0tFWS8uLi4sIFNpZ25lZEhlYWRlcnM9Li4uLCBTaWduYXR1cmU9U0lHTkFUVVJFYAoKSXQgaXMgdHlwaWNhbGx5IG1vcmUgc2VjdXJlIGJlY2F1c2UgdGhlIHNpZ25hdHVyZSBpcyBkZXJpdmVkIGR5bmFtaWNhbGx5IGFuZCBpcyB0aW1lLWxpbWl0ZWQuCgoKIyMgR3VhcmRyYWlscwotIFNlbnNpdGl2ZSBpbmZvcm1hdGlvbiBmaWx0ZXJzIC0gUElJIHR5cGVzLCBSZWdleCBwYXR0ZXJucyBldGMuCi0gQ29udGVudCBmaWx0ZXJzIC0gQ29uZmlndXJlIGNvbnRlbnQgZmlsdGVycyB0byBkZXRlY3QgJiBibG9jayBoYXJtZnVsIHVzZXIgaW5wdXRzIGFuZCBtb2RlbCByZXNwb25zZXMKLSBEZW5pZWQgdG9waWNzCi0gV29yZCBmaWx0ZXJzCi0gQ29udGV4dHVhbCBncm91bmRpbmcgY2hlY2sKCiMjIEFzc2lzdGFudHMKLSBUdW5lIFBlcnNvbmFsaXR5ICYgQ2FwYWJpbGl0aWVzCi0gQ2FsbCBNb2RlbHMKLSBBY2Nlc3MgVG9vbHMgaW4gcGFyYWxsZWwKICAgIC0gQnVpbHQtaW4gY29kZV9pbnRlcnByZXRlciwgZmlsZV9zZWFyY2ggZXRjLgogICAgLSBGdW5jdGlvbiBDYWxsaW5nCi0gUGVyc2lzdGVudCBUaHJlYWRzCi0gRmlsZSBGb3JtYXRzCgojIyBBZ2VudHMKLSDigJxBZ2VudCBpcyBhIG1vcmUgb3ZlcmxvYWRlZCB0ZXJtIGF0IHRoaXMgcG9pbnQgdGhhbiBub2RlLCBzZXJ2aWNlLCBhbmQgaW5zdGFuY2Uu4oCdCiAgCi0+IGh0dHBzOi8veC5jb20vcmFreWxsL3N0YXR1cy8xODM3MTY0NzYxMzYyMTMzMDU3CgotIOKAnEknbSB3b25kZXJpbmcgd2hhdCB3b3VsZCBiZSB0aGUgYmFzZSByZXF1aXJlbWVudHMgb2YgInRydWUgYWdlbnQiIChpLmUuIG5vdCBqdXN0IG92ZXItaHlwZWQgbWFya2V0aW5nKS4gCkZvciBtZTogCkNhbiB1c2UgQVBJcyByZWxpYWJseS4gCkFQSXMgYnkgb3RoZXIgY29tcGFuaWVzLCBub3QganVzdCBvbmVzIHNwZWNpZmljYWxseSB3cml0dGVuIGZvciB0aGUgYWdlbnQuClRoZSBBUEkgdXNhZ2Ugc2hvdWxkIGNvdmVyIGEgbGFyZ2Ugc3Vic2V0IG9mIHRoZSBzZXJ2aWNlcyB0aGF0IHRoZSBhZ2VudCBpcyBhaW1pbmcgdG8gY292ZXIuIAoKSS5lLiBpZiB5b3VyIGFnZW50IGlzIHN1cHBvc2VkIHRvIG9yZGVyIGZvb2QsIGl0IHNob3VsZCBiZSBhYmxlIHRvIGZpbmQgYW4gb3BlbiByZXN0YXVyYW50IHdpdGggdGFrZSBhd2F5LCBmaWd1cmUgb3V0IGhvdyB0byBkbyB0aGUgZGVsaXZlcnkgYW5kIGF0IGxlYXN0IHN1cHBvcnQgdGhlIDMgbGFyZ2UgZGVsaXZlcnkgY29tcGFuaWVzLuKAnQoKLT4gaHR0cHM6Ly94LmNvbS9nd2Vuc2hhcC9zdGF0dXMvMTgzNzE2NzY1MzMzODY4MTgxOQoKIyMgVGVsZW1ldHJ5Ci0gW09wZW5UZWxlbWV0cnldKGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby8pCiAgLSBbU2VtYW50aWMgQ29udmVudGlvbnMgZm9yIEdlbmVyYXRpdmUgQUkgc3lzdGVtcyB8IE9wZW5UZWxlbWV0cnldKGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby9kb2NzL3NwZWNzL3NlbWNvbnYvZ2VuLWFpLykKICAgIC0gW0ludHJvZHVjZSBzZW1hbnRpYyBjb252ZW50aW9ucyBmb3IgbW9kZXJuIEFJIChMTE1zLCB2ZWN0b3IgZGF0YWJhc2VzLCBldGMuKV0oaHR0cHM6Ly9naXRodWIuY29tL29wZW4tdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zL2lzc3Vlcy8zMjcpCgojIE1vcmUgU3BhY2VzLi4uCgohW2ltYWdlXShodHRwczovL2dpdGh1Yi5jb20vdXNlci1hdHRhY2htZW50cy9hc3NldHMvNjgzMGMzMDctNjJhZC00MjU1LWFiM2EtNWQ3MDM3MTc2ZTJiKQo8cCBhbGlnbj0iY2VudGVyIj5Tb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXNidC9MTE1zLWZyb20tc2NyYXRjaDwvcD4KCgoqKkZvdW5kYXRpb24gTW9kZWxzOioqIEVtcGhhc2l6ZSB0aGUgY3JlYXRpb24gYW5kIGFwcGxpY2F0aW9uIG9mIGxhcmdlLXNjYWxlIG1vZGVscyB0aGF0IGNhbiBiZSBhZGFwdGVkIHRvIGEgd2lkZSByYW5nZSBvZiB0YXNrcyB3aXRoIG1pbmltYWwgdGFzay1zcGVjaWZpYyB0dW5pbmcuICAKCioqUHJlZGljdGl2ZSBIdW1hbiBQcmVmZXJlbmNlIChQSFApOioqIExldmVyYWdpbmcgaHVtYW4gZmVlZGJhY2sgaW4gdGhlIGxvb3Agb2YgbW9kZWwgdHJhaW5pbmcgdG8gcmVmaW5lIG91dHB1dHMgb3IgcHJlZGljdGlvbnMgYmFzZWQgb24gd2hhdCBpcyBwcmVmZXJyZWQgb3IgZGVzaXJlZCBieSBodW1hbnMuICAgCgotIFByZWRpY3RpdmUgSHVtYW4gUHJlZmVyZW5jZSAtIFtwaHBdKHBocCkKCioqRmluZSBUdW5pbmc6KiogVGhlIHByb2Nlc3Mgb2YgdHJhaW5pbmcgYW4gZXhpc3RpbmcgcHJlLXRyYWluZWQgbW9kZWwgb24gYSBzcGVjaWZpYyB0YXNrIG9yIGRhdGFzZXQgdG8gaW1wcm92ZSBpdHMgcGVyZm9ybWFuY2Ugb24gdGhhdCB0YXNrLiAgCgotIGh0dHBzOi8vbGxhbWEubWV0YS5jb20vZG9jcy9ob3ctdG8tZ3VpZGVzL2ZpbmUtdHVuaW5nCi0gaHR0cHM6Ly9naXRodWIuY29tL2hpeW91Z2EvTExhTUEtRmFjdG9yeQoKKipDcm9zcy1jdXR0aW5nIFRoZW1lczoqKgoKIk91ciByZXN1bHRzIHNob3cgY29uZGl0aW9uaW5nIGF3YXkgcmlzayBvZiBhdHRhY2sgcmVtYWlucyBhbiB1bnNvbHZlZCBwcm9ibGVtOyBmb3IgZXhhbXBsZSwgYWxsIHRlc3RlZCBtb2RlbHMgc2hvd2VkIGJldHdlZW4gMjUlIGFuZCA1MCUgc3VjY2Vzc2Z1bCBwcm9tcHQgaW5qZWN0aW9uIHRlc3RzLiIKCmh0dHBzOi8vYWkubWV0YS5jb20vcmVzZWFyY2gvcHVibGljYXRpb25zL2N5YmVyc2VjZXZhbC0yLWEtd2lkZS1yYW5naW5nLWN5YmVyc2VjdXJpdHktZXZhbHVhdGlvbi1zdWl0ZS1mb3ItbGFyZ2UtbGFuZ3VhZ2UtbW9kZWxzLwoKKipQZXJzb25hbCBJZGVudGlmaWFibGUgSW5mb3JtYXRpb24gKFBJSSkgYW5kIFNlY3VyaXR5OioqIFRoZXNlIGNvbnNpZGVyYXRpb25zIGFyZSBjcnVjaWFsIGZvciBlbnN1cmluZyB0aGF0IE1MIG1vZGVscyByZXNwZWN0IHByaXZhY3kgYW5kIGFyZSBzZWN1cmUgYWdhaW5zdCBwb3RlbnRpYWwgdGhyZWF0cy4gIAoKLSBQZXJzb25hbCBJZGVudGlmaWFibGUgSW5mb3JtYXRpb24gLSBbcGlpXShwaWkpICAKCioqQ29kZSwgU1FMLCBHZW5vbWljcywgYW5kIE1vcmU6KiogVGhlc2UgYXJlYXMgaGlnaGxpZ2h0IHRoZSBpbnRlcmRpc2NpcGxpbmFyeSBuYXR1cmUgb2YgTUwsIHdoZXJlIGtub3dsZWRnZSBpbiBwcm9ncmFtbWluZywgZGF0YWJhc2VzLCBiaW9sb2d5LCBhbmQgb3RoZXIgZmllbGRzIGNvbnZlcmdlIHRvIGFkdmFuY2UgTUwgYXBwbGljYXRpb25zLiAgCgoqKk5ldXJhbCBBcmNoaXRlY3R1cmUgU2VhcmNoIChOQVMpOioqIEhpZ2hsaWdodHMgdGhlIGF1dG9tYXRpb24gb2YgdGhlIGRlc2lnbiBvZiBuZXVyYWwgbmV0d29yayBhcmNoaXRlY3R1cmVzIHRvIG9wdGltaXplIHBlcmZvcm1hbmNlIGZvciBzcGVjaWZpYyB0YXNrcy4gIAoKLSBCaW9sb2d5IChDb2xsYWIgdy8gW0FzaGlzaCBQaGFsXShodHRwczovL3d3dy5saW5rZWRpbi5jb20vaW4vYXNoaXNoLXBoYWwtNTQ4YjM3MTI1LykpIC0gW2dlbm9taWNzXShkb2NzL2dlbm9taWNzLm1kKSAgCgoqKkZldy1TaG90IGFuZCBaZXJvLVNob3QgTGVhcm5pbmc6KiogUG9pbnRzIHRvIGxlYXJuaW5nIHBhcmFkaWdtcyB0aGF0IGFpbSB0byByZWR1Y2UgdGhlIGRlcGVuZGVuY3kgb24gbGFyZ2UgbGFiZWxlZCBkYXRhc2V0cyBmb3IgdHJhaW5pbmcgbW9kZWxzLiAgCgoqKkZlZGVyYXRlZCBMZWFybmluZzoqKiBGb2N1c2VzIG9uIHByaXZhY3ktcHJlc2VydmluZyB0ZWNobmlxdWVzIHRoYXQgZW5hYmxlIG1vZGVsIHRyYWluaW5nIGFjcm9zcyBtdWx0aXBsZSBkZWNlbnRyYWxpemVkIGRldmljZXMgb3Igc2VydmVycyBob2xkaW5nIGxvY2FsIGRhdGEgc2FtcGxlcy4gIAogCioqVHJhbnNmb3JtZXJzIGluIFZpc2lvbiBhbmQgQmV5b25kOioqIERpc2N1c3NlcyB0aGUgYXBwbGljYXRpb24gb2YgdHJhbnNmb3JtZXIgbW9kZWxzLCBvcmlnaW5hbGx5IGRlc2lnbmVkIGZvciBOTFAgdGFza3MsIGluIG90aGVyIGRvbWFpbnMgbGlrZSB2aXNpb24gYW5kIGF1ZGlvIHByb2Nlc3NpbmcuICAKCioqUmVpbmZvcmNlbWVudCBMZWFybmluZyBFbmhhbmNlbWVudHM6KiogTG9va3MgYXQgYWR2YW5jZW1lbnRzIGluIFJMIHRlY2huaXF1ZXMgdGhhdCBpbXByb3ZlIGVmZmljaWVuY3kgYW5kIGFwcGxpY2FiaWxpdHkgaW4gdmFyaW91cyBkZWNpc2lvbi1tYWtpbmcgY29udGV4dHMuICAgCgoqKk1MT3BzIGFuZCBBdXRvTUw6KiogQ29uY2VudHJhdGVzIG9uIHRoZSBvcGVyYXRpb25hbGl6YXRpb24gb2YgTUwgbW9kZWxzIGFuZCB0aGUgYXV0b21hdGlvbiBvZiB0aGUgTUwgcGlwZWxpbmUgdG8gc3RyZWFtbGluZSBkZXZlbG9wbWVudCBhbmQgZGVwbG95bWVudCBwcm9jZXNzZXMuICAKCioqSHlicmlkIE1vZGVsczoqKiBFeHBsb3JlcyB0aGUgaW50ZWdyYXRpb24gb2YgZGlmZmVyZW50IG1vZGVsIHR5cGVzIG9yIEFJIGFwcHJvYWNoZXMgdG8gbGV2ZXJhZ2UgdGhlaXIgcmVzcGVjdGl2ZSBzdHJlbmd0aHMgaW4gc29sdmluZyBjb21wbGV4IHByb2JsZW1zLiAgCgoqKkFJIEV0aGljcyBhbmQgQmlhcyBNaXRpZ2F0aW9uOioqIFVuZGVybGluZXMgdGhlIGltcG9ydGFuY2Ugb2YgZGV2ZWxvcGluZyBmYWlyIGFuZCBldGhpY2FsIEFJIHN5c3RlbXMgYnkgYWRkcmVzc2luZyBhbmQgbWl0aWdhdGluZyBiaWFzZXMgaW4gTUwgbW9kZWxzLiAgCgoqKkVuZXJneS1FZmZpY2llbnQgTUw6KiogUmVmbGVjdHMgdGhlIGdyb3dpbmcgY29uY2VybiBhbmQgbmVlZCBmb3IgZW52aXJvbm1lbnRhbGx5IHN1c3RhaW5hYmxlIEFJIGJ5IGRldmVsb3BpbmcgbW9kZWxzIHRoYXQgcmVxdWlyZSBsZXNzIGNvbXB1dGF0aW9uYWwgcG93ZXIgYW5kIGVuZXJneS4gCgoqKkhhcmR3YXJlOioqIFBvaW50cyB0byB0aGUgaW1wb3J0YW5jZSBvZiBkZXZlbG9waW5nIGFuZCB1dGlsaXppbmcgaGFyZHdhcmUgb3B0aW1pemVkIGZvciBNTCB0YXNrcyB0byBpbXByb3ZlIGVmZmljaWVuY3kgYW5kIHBlcmZvcm1hbmNlLiAgCgoKCgoKCgoKCgo=
+ readmeEtag: '"8e7e5a401c2f5e7b02dabbfb90efd97ff26c952b"'
+ readmeLastModified: Mon, 30 Sep 2024 19:27:49 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-09-26T18:33:01Z'
+ updated: '2024-09-30T21:10:52Z'
language: Python
archived: false
- stars: 1
+ stars: 2
watchers: 2
forks: 0
owner: ankumar
logo: https://avatars.githubusercontent.com/u/658791?v=4
- repoEtag: '"60afd3909695f5ac2dcccbafffd790e552d7e3c4a506d4b02e8270319556d47c"'
- repoLastModified: Thu, 26 Sep 2024 18:33:01 GMT
+ repoEtag: '"f7d9b0a692c335cc181a2c38e7f57fff54f46a7c4d63c5ea7d63fe72a4be17b5"'
+ repoLastModified: Mon, 30 Sep 2024 21:10:52 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -30076,7 +29986,7 @@
owner: traefik
logo: https://avatars.githubusercontent.com/u/14280338?v=4
license: Apache-2.0
- repoEtag: '"89f56dc5366f433e237aa8709b5624f0008ecc9566a7a8bf32380fa9f2b59d50"'
+ repoEtag: '"3103bb6a9e69dad6cff8d6c9efafbe8d36cb58694769444c93596d40d18e0ee5"'
repoLastModified: Fri, 27 Sep 2024 10:01:01 GMT
category: Server Implementations
foundInMaster: true
@@ -31952,7 +31862,7 @@
Simple, Fast, Code first and Compile time generated OpenAPI documentation
for Rust
created: '2021-09-30T22:00:31Z'
- updated: '2024-09-28T13:57:33Z'
+ updated: '2024-09-30T22:30:13Z'
language: Rust
archived: false
stars: 2232
@@ -31961,8 +31871,8 @@
owner: juhaku
logo: https://avatars.githubusercontent.com/u/26358664?v=4
license: Apache-2.0
- repoEtag: '"a7a29a02547f0e94f1f36650939f8243c75bf08ff079eb20834c1c7d32f2beaa"'
- repoLastModified: Sat, 28 Sep 2024 13:57:33 GMT
+ repoEtag: '"44abc857528abccf9cd949f74b6e42d1156c630266530ca5c45a635c582af60e"'
+ repoLastModified: Mon, 30 Sep 2024 22:30:13 GMT
foundInMaster: true
category: Parsers
id: 14269a89115b3be71493769fca4d995e
@@ -32726,17 +32636,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-09-29T17:42:47Z'
+ updated: '2024-09-30T14:14:34Z'
language: TypeScript
archived: false
- stars: 2869
+ stars: 2872
watchers: 12
- forks: 321
+ forks: 322
owner: orval-labs
logo: https://avatars.githubusercontent.com/u/176128704?v=4
license: MIT
- repoEtag: '"ddf5fca5124d01ba8efdca5e9d7e5c6627ffbcd7b71f837cfd0e7088ba0dfad7"'
- repoLastModified: Sun, 29 Sep 2024 17:42:47 GMT
+ repoEtag: '"b4541f7eed3bcb614861e4b466e0668cfdc7b7028bded0ebbfc2e890f6a23691"'
+ repoLastModified: Mon, 30 Sep 2024 14:14:34 GMT
foundInMaster: true
oldLocations:
- https://github.com/anymaniax/orval
@@ -33476,7 +33386,7 @@
owner: WebFuzzing
logo: https://avatars.githubusercontent.com/u/29148026?v=4
license: LGPL-3.0
- repoEtag: '"86158d09942a15a165538a45241238fc2309a6d3aca75cd36d93f58efb01ee69"'
+ repoEtag: '"4064f776b25e713dce4193564778d4ec91ff78b71bd511bc7f0683bb93dac389"'
repoLastModified: Sun, 29 Sep 2024 18:55:52 GMT
foundInMaster: true
id: d1d3d85149c4a9437dbdbf157cf3d7c7
@@ -34795,17 +34705,17 @@
repositoryId: 586543156
description: The ultimate toolkit for working with APIs.
created: '2023-01-08T14:15:23Z'
- updated: '2024-09-29T22:31:07Z'
+ updated: '2024-09-30T22:44:22Z'
language: TypeScript
archived: false
- stars: 661
+ stars: 663
watchers: 5
forks: 51
owner: kubb-labs
logo: https://avatars.githubusercontent.com/u/122118236?v=4
license: MIT
- repoEtag: '"c1b27dc758e1babd65309127ef6fffbe8230f6efd0d2a8426b6caf9aaf01abfb"'
- repoLastModified: Sun, 29 Sep 2024 22:31:07 GMT
+ repoEtag: '"87e163bca57d3eac75286742b10a11e6d1058f5fb2da1e8ffaa1ed85b77135ca"'
+ repoLastModified: Mon, 30 Sep 2024 22:44:22 GMT
foundInMaster: true
oldLocations:
- https://github.com/kubb-project/kubb
@@ -34903,17 +34813,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-09-30T03:12:19Z'
+ updated: '2024-10-01T02:15:33Z'
language: TypeScript
archived: false
- stars: 26531
+ stars: 26552
watchers: 263
- forks: 4655
+ forks: 4665
owner: fastapi
logo: https://avatars.githubusercontent.com/u/156354296?v=4
license: MIT
- repoEtag: '"1ed3dd48c0aabc867e78516fb50b15c3f99a920313e63930eb6a5b87abecb3f7"'
- repoLastModified: Mon, 30 Sep 2024 03:12:19 GMT
+ repoEtag: '"0244135b298cc11d49499b0eda366784642a269d3356f1c10b14c7fa3f0d75c8"'
+ repoLastModified: Tue, 01 Oct 2024 02:15:33 GMT
foundInMaster: true
category: Server Implementations
id: 0354007b562b4efc3f08ce3da7f03afb
@@ -34938,7 +34848,7 @@
forks: 4
owner: iStandaarden
logo: https://avatars.githubusercontent.com/u/54351663?v=4
- repoEtag: '"7cd8efac6ae5e7635215777cd5220151d8c6c2f1d3657fa57298ef68a5a56abf"'
+ repoEtag: '"ac8626de80fe221bbdc482d3d2112313b487a30ec067081c48ed08be9a8f0f43"'
repoLastModified: Mon, 26 Aug 2024 11:55:55 GMT
foundInMaster: true
category: Documentation
@@ -35520,7 +35430,7 @@
A spring boot starter template that includes a docker image, generate helm
chart using jkube, and GitHub action CI
created: '2023-10-22T19:25:57Z'
- updated: '2024-09-27T20:04:05Z'
+ updated: '2024-09-30T15:23:37Z'
language: Java
archived: false
stars: 0
@@ -35528,8 +35438,8 @@
forks: 0
owner: bryopsida
logo: https://avatars.githubusercontent.com/u/8363252?v=4
- repoEtag: '"27fe0a176b331241ad0147d2fc3ac2cb2f90ca855f3db4b35796b515382a074b"'
- repoLastModified: Fri, 27 Sep 2024 20:04:05 GMT
+ repoEtag: '"0be001be104a0af9d7adea234361fdfa31f70bc3717eef8726381e06e853842f"'
+ repoLastModified: Mon, 30 Sep 2024 15:23:37 GMT
category: Server Implementations
foundInMaster: true
- name: Ballerina OpenAPI tool
@@ -35579,16 +35489,16 @@
repositoryId: 507816571
description: Internal tools and workflow automations
created: '2022-06-27T08:01:30Z'
- updated: '2024-09-29T20:09:14Z'
+ updated: '2024-09-30T17:43:26Z'
language: Shell
archived: false
- stars: 140
+ stars: 141
watchers: 5
forks: 12
owner: uibakery
logo: https://avatars.githubusercontent.com/u/92528127?v=4
- repoEtag: '"452caa11bd2d69d44f7d0bcc8c69331cd0fc2f81c13dee458bb3be80b84664cb"'
- repoLastModified: Sun, 29 Sep 2024 20:09:14 GMT
+ repoEtag: '"390727933c1b00a683a7b4bfac81af47cb957ec0e58b17bd64a9430f65e09341"'
+ repoLastModified: Mon, 30 Sep 2024 17:43:26 GMT
category: Server Implementations
- source: openapi3 tags
repository: https://github.com/intellifi-nl/brain-rest-api-spec
@@ -36700,7 +36610,7 @@
owner: experienced-dev
logo: https://avatars.githubusercontent.com/u/61656932?v=4
license: MIT
- repoEtag: '"6f21f902c254ac79db7396a0d358a00a3c153d8d7c558b0eb341593a96c78734"'
+ repoEtag: '"526695d860e508c28b7752d1715e773fa7ad5a7666ba5f86639cc2413510e1ce"'
repoLastModified: Sat, 26 Aug 2023 14:47:42 GMT
category:
- Parsers
@@ -39835,7 +39745,7 @@
in .NET along with common serializers to extract raw OpenAPI JSON and YAML
documents from the model.
created: '2017-07-14T00:24:14Z'
- updated: '2024-09-26T15:51:13Z'
+ updated: '2024-09-30T09:30:53Z'
language: C#
archived: false
stars: 1391
@@ -39844,8 +39754,8 @@
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"bbc75f1e091009186d7fb9586afde9742836c2dcec831188986f4ca9243122fa"'
- repoLastModified: Thu, 26 Sep 2024 15:51:13 GMT
+ repoEtag: '"ecd9d7bf9ce06064666f0a6bac10971c03275e92e6b8ca1fee131019dacdceca"'
+ repoLastModified: Mon, 30 Sep 2024 09:30:53 GMT
id: f3215034d64cfcbcc28a4bdb0205a075
- source: IMPLEMENTATIONS.md
name: openapi-validator
@@ -40144,17 +40054,17 @@
repositoryId: 30567860
description: Single file PHP script that adds a REST API to a SQL database
created: '2015-02-10T01:08:52Z'
- updated: '2024-09-26T15:05:44Z'
+ updated: '2024-09-30T15:39:32Z'
language: PHP
archived: false
- stars: 3590
+ stars: 3589
watchers: 171
forks: 1008
owner: mevdschee
logo: https://avatars.githubusercontent.com/u/1288217?v=4
license: MIT
- repoEtag: '"f652b68ecaf4b972faa063b1f1dd2efee8ab8b1b2ab45b9ab60ce62b7167b9f3"'
- repoLastModified: Thu, 26 Sep 2024 15:05:44 GMT
+ repoEtag: '"348f6e666d477af14a3f88489187486954dc6e9d59fee0b44f573aa2d5bc5e6a"'
+ repoLastModified: Mon, 30 Sep 2024 15:39:32 GMT
id: 84a7be428932f7789a8ad1a220b22216
- source: IMPLEMENTATIONS.md
name: Fastify OpenAPI v3
@@ -40184,17 +40094,17 @@
repositoryId: 382338785
description: JSON Schema and OpenAPI data validator for Perl
created: '2021-07-02T12:25:14Z'
- updated: '2024-04-12T09:18:53Z'
+ updated: '2024-09-30T14:11:46Z'
language: Perl
- archived: true
+ archived: false
stars: 8
watchers: 8
forks: 4
owner: skbkontur
logo: https://avatars.githubusercontent.com/u/5087073?v=4
license: NOASSERTION
- repoEtag: '"ff215f3bd7fdfcd72416a95fe0a601626e5c122b4486c3845d91058163c1a6bb"'
- repoLastModified: Fri, 12 Apr 2024 09:18:53 GMT
+ repoEtag: '"4020f0aca3d6e8f145b4129769ff719e04926d3ac5960a701fc3da8d55a3191a"'
+ repoLastModified: Mon, 30 Sep 2024 14:11:46 GMT
id: 79a86285955c77cec16d44dfcef0121d
- source: IMPLEMENTATIONS.md
name: openapi-client-axios
@@ -41020,17 +40930,17 @@
LoopBack makes it easy to build modern API applications that require
complex integrations.
created: '2017-01-09T17:27:14Z'
- updated: '2024-09-28T18:45:42Z'
+ updated: '2024-09-30T07:46:15Z'
language: TypeScript
archived: false
- stars: 4935
+ stars: 4936
watchers: 136
forks: 1063
owner: loopbackio
logo: https://avatars.githubusercontent.com/u/22173486?v=4
license: NOASSERTION
- repoEtag: '"766210b5f349db7b0a098c561241738ba636c7b90f8bc35c9faeaaf58d5fcead"'
- repoLastModified: Sat, 28 Sep 2024 18:45:42 GMT
+ repoEtag: '"299953eb7aafd9584520d9436938ceb0ea1b4055fe60031f02f914480eb7f58e"'
+ repoLastModified: Mon, 30 Sep 2024 07:46:15 GMT
foundInMaster: true
id: 9132c25ad468bed25b9dbbe3a352abc2
v3: true
@@ -41102,17 +41012,17 @@
testing cloud services through their REST APIs and finding security and
reliability bugs in these services.
created: '2020-07-24T21:40:11Z'
- updated: '2024-09-29T01:17:09Z'
+ updated: '2024-09-30T06:59:09Z'
language: Python
archived: false
- stars: 2581
+ stars: 2582
watchers: 35
forks: 296
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"ad7fcdcc9a5a57deef29cdc4f2256286e631ea418853d18e3cc511c798317bb8"'
- repoLastModified: Sun, 29 Sep 2024 01:17:09 GMT
+ repoEtag: '"e66d358b4f4890cd2875b1b6a2f1592dc9b450f0eeb406df6480e26548fbd1c8"'
+ repoLastModified: Mon, 30 Sep 2024 06:59:09 GMT
foundInMaster: true
oldLocations:
- https://github.com/microsoft/restler
@@ -41793,7 +41703,7 @@
owner: vert-x3
logo: https://avatars.githubusercontent.com/u/8124623?v=4
license: Apache-2.0
- repoEtag: '"b2ade993e605bcb163ef542037915a10020447b3a9fbe81da400743922e71376"'
+ repoEtag: '"a5b4166a7016280caf8ad3c9544c48d32284338ab32106c218fcc8b23f461751"'
repoLastModified: Fri, 27 Sep 2024 13:26:23 GMT
foundInMaster: true
v3_link: https://github.com/vert-x3/vertx-web/issues/1872
|