diff --git a/docs/categories/all.html b/docs/categories/all.html
index d908cdef..d91cdb86 100644
--- a/docs/categories/all.html
+++ b/docs/categories/all.html
@@ -357,7 +357,7 @@
Yes
Yes |
Yes |
- 8344 |
+ 8371 |
@@ -380,7 +380,7 @@ Yes |
No |
No |
- 1362 |
+ 1363 |
@@ -403,7 +403,7 @@ No |
Yes |
No |
- 1843 |
+ 1844 |
@@ -466,7 +466,7 @@ Yes |
Yes |
Yes |
- 23862 |
+ 23867 |
@@ -529,7 +529,7 @@ Yes |
Yes |
Yes |
- 671 |
+ 672 |
@@ -552,7 +552,7 @@ No |
Yes |
No |
- 786 |
+ 787 |
@@ -575,7 +575,7 @@ Yes |
Yes |
No |
- 1399 |
+ 1402 |
@@ -887,7 +887,7 @@ No |
Yes |
Yes |
- 22443 |
+ 22456 |
@@ -933,7 +933,7 @@ No |
Yes |
Yes |
- 3112 |
+ 3115 |
@@ -1091,7 +1091,7 @@ Yes |
Yes |
Yes |
- 8986 |
+ 8988 |
@@ -1220,7 +1220,7 @@ No |
Yes |
Yes |
- 999 |
+ 1002 |
@@ -1410,7 +1410,7 @@ Yes |
Yes |
Yes |
- 4400 |
+ 4403 |
@@ -1433,7 +1433,7 @@ Yes |
Yes |
Yes |
- 1477 |
+ 1478 |
@@ -1564,7 +1564,7 @@ No |
Yes |
Yes |
- 3646 |
+ 3650 |
@@ -1587,7 +1587,7 @@ Yes |
Yes |
Yes |
- 1645 |
+ 1659 |
@@ -1702,7 +1702,7 @@ No |
Yes |
Yes |
- 8766 |
+ 8768 |
@@ -1834,7 +1834,7 @@ No |
Yes |
No |
- 1724 |
+ 1726 |
@@ -1880,7 +1880,7 @@ No |
Yes |
Yes |
- 4196 |
+ 4195 |
@@ -2033,7 +2033,7 @@ Yes |
Yes |
Yes |
- 2584 |
+ 2586 |
@@ -2075,7 +2075,7 @@ Yes |
Yes |
Yes |
- 514 |
+ 515 |
@@ -2163,7 +2163,7 @@ Yes |
Yes |
No |
- 132 |
+ 133 |
@@ -2341,7 +2341,7 @@ No |
Yes |
Yes |
- 2701 |
+ 2702 |
@@ -2557,7 +2557,7 @@ No |
Yes |
No |
- 93 |
+ 94 |
@@ -2756,7 +2756,7 @@ No |
Yes |
Yes |
- 17156 |
+ 17157 |
@@ -2777,7 +2777,7 @@ No |
Yes |
Yes |
- 4665 |
+ 4666 |
@@ -3077,7 +3077,7 @@ No |
Yes |
No |
- 547 |
+ 548 |
@@ -3100,7 +3100,7 @@ Yes |
Yes |
Yes |
- 1218 |
+ 1219 |
@@ -3279,7 +3279,7 @@ No |
Yes |
No |
- 8454 |
+ 8464 |
@@ -3302,7 +3302,7 @@ No |
Yes |
No |
- 565 |
+ 566 |
@@ -3415,7 +3415,7 @@ Yes |
Yes |
No |
- 3991 |
+ 3994 |
@@ -3593,7 +3593,7 @@ No |
Yes |
Yes |
- 5933 |
+ 5932 |
@@ -3855,7 +3855,7 @@ No |
Yes |
Yes |
- 434 |
+ 435 |
@@ -3878,7 +3878,7 @@ No |
Yes |
No |
- 28663 |
+ 28664 |
@@ -4030,7 +4030,7 @@ Yes |
Yes |
No |
- 1407 |
+ 1409 |
@@ -4053,7 +4053,7 @@ Yes |
Yes |
Yes |
- 1882 |
+ 1883 |
@@ -4256,7 +4256,7 @@ Yes |
Yes |
No |
- 838 |
+ 841 |
@@ -4392,7 +4392,7 @@ Yes |
Yes |
Yes |
- 670 |
+ 671 |
@@ -4415,7 +4415,7 @@ Yes |
Yes |
Yes |
- 30 |
+ 31 |
@@ -4570,7 +4570,7 @@ No |
Yes |
Yes |
- 270 |
+ 271 |
@@ -4897,7 +4897,7 @@ No |
Yes |
No |
- 2028 |
+ 2029 |
@@ -4920,7 +4920,7 @@ Yes |
Yes |
Yes |
- 2759 |
+ 2765 |
@@ -4987,7 +4987,7 @@ Yes |
Yes |
No |
- 1491 |
+ 1493 |
@@ -5010,7 +5010,7 @@ Yes |
Yes |
Yes |
- 129 |
+ 130 |
@@ -5144,7 +5144,7 @@ No |
Yes |
No |
- 1099 |
+ 1111 |
@@ -5167,7 +5167,7 @@ Yes |
Yes |
No |
- 2513 |
+ 2516 |
@@ -5236,7 +5236,7 @@ Yes |
Yes |
No |
- 44 |
+ 45 |
@@ -5305,7 +5305,7 @@ Yes |
Yes |
No |
- 123 |
+ 124 |
@@ -5328,7 +5328,7 @@ No |
Yes |
No |
- 79498 |
+ 79538 |
@@ -5351,7 +5351,7 @@ Yes |
Yes |
No |
- 26797 |
+ 26799 |
@@ -5374,7 +5374,7 @@ Yes |
Yes |
No |
- 23862 |
+ 23867 |
@@ -5416,7 +5416,7 @@ No |
Yes |
No |
- 6750 |
+ 6754 |
@@ -5439,7 +5439,7 @@ No |
Yes |
No |
- 6534 |
+ 6538 |
@@ -5462,7 +5462,7 @@ Yes |
Yes |
Yes |
- 6220 |
+ 6224 |
@@ -5483,7 +5483,7 @@ No |
Yes |
No |
- 4193 |
+ 4194 |
@@ -5504,7 +5504,7 @@ No |
Yes |
No |
- 3932 |
+ 3936 |
@@ -5527,7 +5527,7 @@ No |
Yes |
No |
- 3335 |
+ 3333 |
@@ -5548,7 +5548,7 @@ No |
Yes |
No |
- 2729 |
+ 2730 |
@@ -5590,7 +5590,7 @@ No |
Yes |
No |
- 2530 |
+ 2532 |
@@ -5634,7 +5634,7 @@ No |
Yes |
No |
- 2354 |
+ 2358 |
@@ -5676,7 +5676,7 @@ No |
Yes |
No |
- 1733 |
+ 1736 |
@@ -5697,7 +5697,7 @@ No |
Yes |
No |
- 1549 |
+ 1550 |
@@ -5718,7 +5718,7 @@ No |
Yes |
No |
- 1505 |
+ 1509 |
@@ -5783,7 +5783,7 @@ No |
Yes |
No |
- 1057 |
+ 1060 |
@@ -5846,7 +5846,7 @@ No |
Yes |
No |
- 854 |
+ 855 |
@@ -5909,7 +5909,7 @@ Yes |
Yes |
No |
- 714 |
+ 713 |
@@ -5974,7 +5974,7 @@ Yes |
Yes |
No |
- 678 |
+ 677 |
@@ -5995,7 +5995,7 @@ No |
Yes |
No |
- 669 |
+ 679 |
@@ -6079,7 +6079,7 @@ No |
Yes |
No |
- 528 |
+ 529 |
@@ -6100,7 +6100,7 @@ No |
Yes |
No |
- 514 |
+ 515 |
@@ -6184,7 +6184,7 @@ No |
Yes |
No |
- 453 |
+ 452 |
@@ -6268,7 +6268,7 @@ No |
Yes |
No |
- 411 |
+ 412 |
@@ -6375,7 +6375,7 @@ No |
Yes |
No |
- 387 |
+ 388 |
@@ -6417,7 +6417,7 @@ No |
Yes |
No |
- 360 |
+ 361 |
@@ -6522,7 +6522,7 @@ No |
Yes |
No |
- 334 |
+ 335 |
@@ -6585,7 +6585,7 @@ Yes |
Yes |
No |
- 311 |
+ 312 |
@@ -6902,7 +6902,7 @@ No |
Yes |
No |
- 222 |
+ 223 |
@@ -7049,7 +7049,7 @@ No |
Yes |
No |
- 206 |
+ 207 |
@@ -7725,7 +7725,7 @@ No |
Yes |
No |
- 114 |
+ 115 |
@@ -8082,7 +8082,7 @@ No |
Yes |
No |
- 84 |
+ 85 |
@@ -8292,7 +8292,7 @@ No |
Yes |
No |
- 67 |
+ 68 |
@@ -8376,7 +8376,7 @@ Yes |
Yes |
No |
- 65 |
+ 66 |
@@ -8523,7 +8523,7 @@ No |
Yes |
No |
- 59 |
+ 60 |
@@ -8928,7 +8928,7 @@ No |
Yes |
No |
- 46 |
+ 47 |
@@ -9751,7 +9751,7 @@ Yes |
Yes |
No |
- 30 |
+ 31 |
@@ -9814,7 +9814,7 @@ No |
Yes |
No |
- 28 |
+ 29 |
@@ -10864,7 +10864,7 @@ No |
Yes |
No |
- 20 |
+ 22 |
@@ -11076,7 +11076,7 @@ No |
Yes |
No |
- 17 |
+ 18 |
@@ -13980,7 +13980,7 @@ No |
Yes |
No |
- 6 |
+ 5 |
@@ -14799,7 +14799,7 @@ Yes |
Yes |
No |
- 5 |
+ 6 |
@@ -17004,7 +17004,7 @@ No |
Yes |
No |
- 3 |
+ 4 |
@@ -24732,7 +24732,7 @@ Yes |
Yes |
No |
- 2691 |
+ 2695 |
@@ -26097,7 +26097,7 @@ No |
Yes |
Yes |
- 3387 |
+ 3391 |
@@ -26643,7 +26643,7 @@ No |
Yes |
Yes |
- 536 |
+ 537 |
@@ -27189,7 +27189,7 @@ No |
Yes |
No |
- 4 |
+ 5 |
@@ -27676,7 +27676,7 @@ Yes |
Yes |
Yes |
- 838 |
+ 839 |
@@ -27760,7 +27760,7 @@ No |
Yes |
No |
- 29010 |
+ 29046 |
@@ -32789,7 +32789,7 @@ No |
Yes |
Yes |
- 2642 |
+ 2644 |
@@ -34218,7 +34218,7 @@ Scalar (link)
|
Stars |
- 8344 |
+ 8371 |
Watchers |
@@ -34234,7 +34234,7 @@ Scalar (link)
Last Updated |
- 2025-01-14T02:57:18Z |
+ 2025-01-15T01:11:11Z |
Archived |
@@ -34269,7 +34269,7 @@ Scramble (link)
Stars |
- 1362 |
+ 1363 |
Watchers |
@@ -34285,7 +34285,7 @@ Scramble (link)
Last Updated |
- 2025-01-13T16:56:43Z |
+ 2025-01-14T08:28:00Z |
Archived |
@@ -34320,7 +34320,7 @@ Scribe (link)
Stars |
- 1843 |
+ 1844 |
Watchers |
@@ -34336,7 +34336,7 @@ Scribe (link)
Last Updated |
- 2025-01-13T21:27:55Z |
+ 2025-01-14T11:27:15Z |
Archived |
@@ -34473,7 +34473,7 @@ ReDoc (link)
Stars |
- 23862 |
+ 23867 |
Watchers |
@@ -34489,7 +34489,7 @@ ReDoc (link)
Last Updated |
- 2025-01-13T23:57:58Z |
+ 2025-01-15T02:59:39Z |
Archived |
@@ -34626,7 +34626,7 @@ OpenAPI-UI (link)
Stars |
- 671 |
+ 672 |
Watchers |
@@ -34634,7 +34634,7 @@ OpenAPI-UI (link)
Forks |
- 61 |
+ 62 |
Created |
@@ -34642,7 +34642,7 @@ OpenAPI-UI (link)
Last Updated |
- 2025-01-13T09:07:02Z |
+ 2025-01-14T06:31:39Z |
Archived |
@@ -34677,7 +34677,7 @@ oasdiff (link)
Stars |
- 786 |
+ 787 |
Watchers |
@@ -34693,7 +34693,7 @@ oasdiff (link)
Last Updated |
- 2025-01-11T18:30:19Z |
+ 2025-01-14T16:55:44Z |
Archived |
@@ -34728,7 +34728,7 @@ optic diff (link)
Stars |
- 1399 |
+ 1402 |
Watchers |
@@ -34744,7 +34744,7 @@ optic diff (link)
Last Updated |
- 2025-01-13T16:52:58Z |
+ 2025-01-14T16:55:19Z |
Archived |
@@ -35407,7 +35407,7 @@ OpenAPI Client Generators (link)
Last Updated |
- 2024-12-11T23:24:23Z |
+ 2025-01-14T12:34:04Z |
Archived |
@@ -35442,7 +35442,7 @@ OpenAPI Generator (link)
Stars |
- 22443 |
+ 22456 |
Watchers |
@@ -35450,7 +35450,7 @@ OpenAPI Generator (link)
Forks |
- 6674 |
+ 6678 |
Created |
@@ -35458,7 +35458,7 @@ OpenAPI Generator (link)
Last Updated |
- 2025-01-14T01:43:22Z |
+ 2025-01-15T02:42:27Z |
Archived |
@@ -35544,7 +35544,7 @@ Kiota Api Client Generator (link)
Stars |
- 3112 |
+ 3115 |
Watchers |
@@ -35552,7 +35552,7 @@ Kiota Api Client Generator (link)
Forks |
- 218 |
+ 219 |
Created |
@@ -35560,7 +35560,7 @@ Kiota Api Client Generator (link)
Last Updated |
- 2025-01-13T18:53:55Z |
+ 2025-01-15T03:02:40Z |
Archived |
@@ -35611,7 +35611,7 @@ FabriKt (link)
Last Updated |
- 2025-01-12T15:52:33Z |
+ 2025-01-14T21:00:03Z |
Archived |
@@ -35901,7 +35901,7 @@ Swagger Editor (link)
Stars |
- 8986 |
+ 8988 |
Watchers |
@@ -35917,7 +35917,7 @@ Swagger Editor (link)
Last Updated |
- 2025-01-13T15:27:33Z |
+ 2025-01-14T21:30:10Z |
Archived |
@@ -36207,7 +36207,7 @@ Apicurio Studio (link)
Stars |
- 999 |
+ 1002 |
Watchers |
@@ -36223,7 +36223,7 @@ Apicurio Studio (link)
Last Updated |
- 2025-01-13T19:12:22Z |
+ 2025-01-14T15:38:45Z |
Archived |
@@ -36666,7 +36666,7 @@ Prism (link)
Stars |
- 4400 |
+ 4403 |
Watchers |
@@ -36682,7 +36682,7 @@ Prism (link)
Last Updated |
- 2025-01-13T14:48:36Z |
+ 2025-01-15T00:46:21Z |
Archived |
@@ -36717,7 +36717,7 @@ Microcks (link)
Stars |
- 1477 |
+ 1478 |
Watchers |
@@ -36733,7 +36733,7 @@ Microcks (link)
Last Updated |
- 2025-01-13T03:32:50Z |
+ 2025-01-14T21:37:07Z |
Archived |
@@ -37023,7 +37023,7 @@ tsoa (link)
Stars |
- 3646 |
+ 3650 |
Watchers |
@@ -37039,7 +37039,7 @@ tsoa (link)
Last Updated |
- 2025-01-13T10:03:52Z |
+ 2025-01-14T21:45:27Z |
Archived |
@@ -37074,7 +37074,7 @@ @hey-api/openapi-ts (link)
Stars |
- 1645 |
+ 1659 |
Watchers |
@@ -37090,7 +37090,7 @@ @hey-api/openapi-ts (link)
Last Updated |
- 2025-01-14T02:31:19Z |
+ 2025-01-15T03:18:49Z |
Archived |
@@ -37184,7 +37184,7 @@ express-openapi (link)
Forks |
- 236 |
+ 237 |
Created |
@@ -37329,7 +37329,7 @@ API Platform (link)
Stars |
- 8766 |
+ 8768 |
Watchers |
@@ -37345,7 +37345,7 @@ API Platform (link)
Last Updated |
- 2025-01-14T02:22:10Z |
+ 2025-01-14T15:06:12Z |
Archived |
@@ -37635,7 +37635,7 @@ @nestjs/swagger (link)
Stars |
- 1724 |
+ 1726 |
Watchers |
@@ -37643,7 +37643,7 @@ @nestjs/swagger (link)
Forks |
- 485 |
+ 486 |
Created |
@@ -37651,7 +37651,7 @@ @nestjs/swagger (link)
Last Updated |
- 2025-01-14T01:12:09Z |
+ 2025-01-14T22:38:09Z |
Archived |
@@ -37737,7 +37737,7 @@ Dredd (link)
Stars |
- 4196 |
+ 4195 |
Watchers |
@@ -37753,7 +37753,7 @@ Dredd (link)
Last Updated |
- 2025-01-09T15:07:26Z |
+ 2025-01-14T21:04:01Z |
Archived |
@@ -38094,7 +38094,7 @@ Spectral (link)
Stars |
- 2584 |
+ 2586 |
Watchers |
@@ -38110,7 +38110,7 @@ Spectral (link)
Last Updated |
- 2025-01-13T16:28:20Z |
+ 2025-01-14T16:38:34Z |
Archived |
@@ -38196,7 +38196,7 @@ OpenAPI Validator (link)
Stars |
- 514 |
+ 515 |
Watchers |
@@ -38212,7 +38212,7 @@ OpenAPI Validator (link)
Last Updated |
- 2025-01-10T22:00:37Z |
+ 2025-01-15T02:40:18Z |
Archived |
@@ -38263,7 +38263,7 @@ Redocly CLI (link)
Last Updated |
- 2025-01-13T16:47:37Z |
+ 2025-01-14T15:19:46Z |
Archived |
@@ -38353,7 +38353,7 @@ committee (link)
Watchers |
- 17 |
+ 16 |
Forks |
@@ -38400,7 +38400,7 @@ openapi_first (link)
Stars |
- 132 |
+ 133 |
Watchers |
@@ -38416,7 +38416,7 @@ openapi_first (link)
Last Updated |
- 2025-01-11T22:18:12Z |
+ 2025-01-14T03:41:18Z |
Archived |
@@ -38714,7 +38714,7 @@ KaiZen OpenAPI Parser (link)
Forks |
- 30 |
+ 31 |
Created |
@@ -38808,7 +38808,7 @@ kin-openapi (link)
Stars |
- 2701 |
+ 2702 |
Watchers |
@@ -38824,7 +38824,7 @@ kin-openapi (link)
Last Updated |
- 2025-01-13T20:11:47Z |
+ 2025-01-14T23:11:44Z |
Archived |
@@ -39181,7 +39181,7 @@ Microsoft/OpenAPI.NET (link)
Last Updated |
- 2025-01-13T23:16:30Z |
+ 2025-01-14T21:35:07Z |
Archived |
@@ -39318,7 +39318,7 @@ openapi3_parser (link)
Stars |
- 93 |
+ 94 |
Watchers |
@@ -39334,7 +39334,7 @@ openapi3_parser (link)
Last Updated |
- 2025-01-10T03:15:52Z |
+ 2025-01-14T22:24:16Z |
Archived |
@@ -39424,7 +39424,7 @@ docler-labs/api-client-generator (link)
Watchers |
- 15 |
+ 16 |
Forks |
@@ -39436,7 +39436,7 @@ docler-labs/api-client-generator (link)
Last Updated |
- 2024-12-17T00:24:48Z |
+ 2025-01-14T11:11:59Z |
Archived |
@@ -39538,7 +39538,7 @@ go-swagger (link)
Last Updated |
- 2025-01-14T03:13:44Z |
+ 2025-01-14T20:44:57Z |
Archived |
@@ -39683,7 +39683,7 @@ NSwag (link)
Forks |
- 1301 |
+ 1299 |
Created |
@@ -39691,7 +39691,7 @@ NSwag (link)
Last Updated |
- 2025-01-13T14:08:04Z |
+ 2025-01-14T14:23:04Z |
Archived |
@@ -39777,7 +39777,7 @@ Swagger-Codegen (link)
Stars |
- 17156 |
+ 17157 |
Watchers |
@@ -39793,7 +39793,7 @@ Swagger-Codegen (link)
Last Updated |
- 2025-01-13T15:05:14Z |
+ 2025-01-14T23:09:42Z |
Archived |
@@ -39828,7 +39828,7 @@ Azure AutoRest (link)
Stars |
- 4665 |
+ 4666 |
Watchers |
@@ -39836,7 +39836,7 @@ Azure AutoRest (link)
Forks |
- 743 |
+ 742 |
Created |
@@ -39844,7 +39844,7 @@ Azure AutoRest (link)
Last Updated |
- 2025-01-13T20:52:07Z |
+ 2025-01-15T02:42:17Z |
Archived |
@@ -40542,7 +40542,7 @@ openapi-fuzzer (link)
Stars |
- 547 |
+ 548 |
Watchers |
@@ -40558,7 +40558,7 @@ openapi-fuzzer (link)
Last Updated |
- 2025-01-12T17:02:10Z |
+ 2025-01-14T21:19:35Z |
Archived |
@@ -40593,7 +40593,7 @@ cats (link)
Stars |
- 1218 |
+ 1219 |
Watchers |
@@ -40609,7 +40609,7 @@ cats (link)
Last Updated |
- 2025-01-13T05:27:34Z |
+ 2025-01-14T18:23:48Z |
Archived |
@@ -41001,7 +41001,7 @@ mitmproxy2swagger (link)
Stars |
- 8454 |
+ 8464 |
Watchers |
@@ -41017,7 +41017,7 @@ mitmproxy2swagger (link)
Last Updated |
- 2025-01-14T02:49:22Z |
+ 2025-01-15T02:44:27Z |
Archived |
@@ -41052,7 +41052,7 @@ OpenApiSpecGeneratorPlugin (link)
Stars |
- 565 |
+ 566 |
Watchers |
@@ -41068,7 +41068,7 @@ OpenApiSpecGeneratorPlugin (link)
Last Updated |
- 2025-01-13T14:42:25Z |
+ 2025-01-14T06:50:17Z |
Archived |
@@ -41307,7 +41307,7 @@ OpenAPI DevTools (link)
Stars |
- 3991 |
+ 3994 |
Watchers |
@@ -41323,7 +41323,7 @@ OpenAPI DevTools (link)
Last Updated |
- 2025-01-14T00:58:36Z |
+ 2025-01-15T02:55:24Z |
Archived |
@@ -41374,7 +41374,7 @@ TypeSpec (link)
Last Updated |
- 2025-01-14T02:10:50Z |
+ 2025-01-15T02:13:01Z |
Archived |
@@ -41715,7 +41715,7 @@ SpringFox (link)
Stars |
- 5933 |
+ 5932 |
Watchers |
@@ -41731,7 +41731,7 @@ SpringFox (link)
Last Updated |
- 2025-01-13T09:33:18Z |
+ 2025-01-14T21:04:10Z |
Archived |
@@ -41833,7 +41833,7 @@ OWASP ZAP (link)
Last Updated |
- 2025-01-13T17:49:03Z |
+ 2025-01-14T13:34:18Z |
Archived |
@@ -42327,7 +42327,7 @@ APIFuzzer (link)
Stars |
- 434 |
+ 435 |
Watchers |
@@ -42343,7 +42343,7 @@ APIFuzzer (link)
Last Updated |
- 2025-01-06T07:29:18Z |
+ 2025-01-14T21:19:29Z |
Archived |
@@ -42378,7 +42378,7 @@ Django REST Framework (link)
Stars |
- 28663 |
+ 28664 |
Watchers |
@@ -42386,7 +42386,7 @@ Django REST Framework (link)
Forks |
- 6868 |
+ 6867 |
Created |
@@ -42394,7 +42394,7 @@ Django REST Framework (link)
Last Updated |
- 2025-01-13T22:39:14Z |
+ 2025-01-15T00:57:07Z |
Archived |
@@ -42735,7 +42735,7 @@ openapi-python-client (link)
Stars |
- 1407 |
+ 1409 |
Watchers |
@@ -42751,7 +42751,7 @@ openapi-python-client (link)
Last Updated |
- 2025-01-13T23:30:02Z |
+ 2025-01-14T18:23:01Z |
Archived |
@@ -42786,7 +42786,7 @@ Elements (link)
Stars |
- 1882 |
+ 1883 |
Watchers |
@@ -42802,7 +42802,7 @@ Elements (link)
Last Updated |
- 2025-01-11T22:43:41Z |
+ 2025-01-14T14:34:58Z |
Archived |
@@ -43245,7 +43245,7 @@ Mintlify (link)
Stars |
- 838 |
+ 841 |
Watchers |
@@ -43253,7 +43253,7 @@ Mintlify (link)
Forks |
- 202 |
+ 204 |
Created |
@@ -43261,7 +43261,7 @@ Mintlify (link)
Last Updated |
- 2025-01-13T21:55:46Z |
+ 2025-01-15T03:10:19Z |
Archived |
@@ -43465,7 +43465,7 @@ Counterfact (link)
Last Updated |
- 2025-01-12T06:18:06Z |
+ 2025-01-15T02:40:16Z |
Archived |
@@ -43551,7 +43551,7 @@ vacuum (link)
Stars |
- 670 |
+ 671 |
Watchers |
@@ -43567,7 +43567,7 @@ vacuum (link)
Last Updated |
- 2025-01-12T23:34:52Z |
+ 2025-01-14T16:39:32Z |
Archived |
@@ -43602,7 +43602,7 @@ apigen-ts (link)
Stars |
- 30 |
+ 31 |
Watchers |
@@ -43618,7 +43618,7 @@ apigen-ts (link)
Last Updated |
- 2024-11-24T23:14:16Z |
+ 2025-01-14T20:51:54Z |
Archived |
@@ -43959,7 +43959,7 @@ Kusk Gateway (link)
Stars |
- 270 |
+ 271 |
Watchers |
@@ -43975,7 +43975,7 @@ Kusk Gateway (link)
Last Updated |
- 2024-12-21T00:42:51Z |
+ 2025-01-14T07:32:49Z |
Archived |
@@ -44179,7 +44179,7 @@ Specmatic (link)
Last Updated |
- 2025-01-13T14:03:34Z |
+ 2025-01-14T15:51:40Z |
Archived |
@@ -44724,7 +44724,7 @@ rswag (link)
Stars |
- 2028 |
+ 2029 |
Watchers |
@@ -44740,7 +44740,7 @@ rswag (link)
Last Updated |
- 2025-01-14T02:38:49Z |
+ 2025-01-14T20:43:54Z |
Archived |
@@ -44775,7 +44775,7 @@ 🌿 Fern (link)
Stars |
- 2759 |
+ 2765 |
Watchers |
@@ -44783,7 +44783,7 @@ 🌿 Fern (link)
Forks |
- 162 |
+ 163 |
Created |
@@ -44791,7 +44791,7 @@ 🌿 Fern (link)
Last Updated |
- 2025-01-14T01:27:31Z |
+ 2025-01-15T00:20:27Z |
Archived |
@@ -44928,7 +44928,7 @@ Swift OpenAPI Generator (link)
Stars |
- 1491 |
+ 1493 |
Watchers |
@@ -44944,7 +44944,7 @@ Swift OpenAPI Generator (link)
Last Updated |
- 2025-01-11T21:14:08Z |
+ 2025-01-15T02:13:17Z |
Archived |
@@ -44979,7 +44979,7 @@ wiretap (link)
Stars |
- 129 |
+ 130 |
Watchers |
@@ -44995,7 +44995,7 @@ wiretap (link)
Last Updated |
- 2025-01-14T00:46:11Z |
+ 2025-01-14T03:56:49Z |
Archived |
@@ -45285,7 +45285,7 @@ Fuego (link)
Stars |
- 1099 |
+ 1111 |
Watchers |
@@ -45301,7 +45301,7 @@ Fuego (link)
Last Updated |
- 2025-01-14T03:13:25Z |
+ 2025-01-15T01:28:15Z |
Archived |
@@ -45336,7 +45336,7 @@ Huma (link)
Stars |
- 2513 |
+ 2516 |
Watchers |
@@ -45352,7 +45352,7 @@ Huma (link)
Last Updated |
- 2025-01-14T00:58:37Z |
+ 2025-01-15T00:36:31Z |
Archived |
@@ -45489,7 +45489,7 @@ OpenAPI Qraft (link)
Stars |
- 44 |
+ 45 |
Watchers |
@@ -45505,7 +45505,7 @@ OpenAPI Qraft (link)
Last Updated |
- 2025-01-08T22:57:22Z |
+ 2025-01-14T19:29:04Z |
Archived |
@@ -45642,7 +45642,7 @@ Zudoku (link)
Stars |
- 123 |
+ 124 |
Watchers |
@@ -45658,7 +45658,7 @@ Zudoku (link)
Last Updated |
- 2025-01-13T16:18:42Z |
+ 2025-01-14T10:43:44Z |
Archived |
@@ -45693,7 +45693,7 @@ FastAPI (link)
Stars |
- 79498 |
+ 79538 |
Watchers |
@@ -45701,7 +45701,7 @@ FastAPI (link)
Forks |
- 6808 |
+ 6811 |
Created |
@@ -45709,7 +45709,7 @@ FastAPI (link)
Last Updated |
- 2025-01-14T02:48:39Z |
+ 2025-01-15T02:52:34Z |
Archived |
@@ -45744,7 +45744,7 @@ swagger-ui (link)
Stars |
- 26797 |
+ 26799 |
Watchers |
@@ -45760,7 +45760,7 @@ swagger-ui (link)
Last Updated |
- 2025-01-13T22:04:46Z |
+ 2025-01-14T21:04:08Z |
Archived |
@@ -45795,7 +45795,7 @@ Redoc (link)
Stars |
- 23862 |
+ 23867 |
Watchers |
@@ -45811,7 +45811,7 @@ Redoc (link)
Last Updated |
- 2025-01-13T23:57:58Z |
+ 2025-01-15T02:59:39Z |
Archived |
@@ -45862,7 +45862,7 @@ swagger-core (link)
Last Updated |
- 2025-01-13T08:14:11Z |
+ 2025-01-14T21:04:07Z |
Archived |
@@ -45897,7 +45897,7 @@ mockoon (link)
Stars |
- 6750 |
+ 6754 |
Watchers |
@@ -45913,7 +45913,7 @@ mockoon (link)
Last Updated |
- 2025-01-13T20:01:55Z |
+ 2025-01-14T21:53:02Z |
Archived |
@@ -45948,7 +45948,7 @@ OpenAPI Server Code Generator (oapi-cod
Stars |
- 6534 |
+ 6538 |
Watchers |
@@ -45964,7 +45964,7 @@ OpenAPI Server Code Generator (oapi-cod
Last Updated |
- 2025-01-13T16:06:18Z |
+ 2025-01-15T02:22:56Z |
Archived |
@@ -45999,11 +45999,11 @@ OpenAPI TypeScript (link)
Stars |
- 6220 |
+ 6224 |
Watchers |
- 24 |
+ 23 |
Forks |
@@ -46015,7 +46015,7 @@ OpenAPI TypeScript (link)
Last Updated |
- 2025-01-13T23:23:42Z |
+ 2025-01-14T15:53:37Z |
Archived |
@@ -46050,7 +46050,7 @@ knife4j (link)
Stars |
- 4193 |
+ 4194 |
Watchers |
@@ -46066,7 +46066,7 @@ knife4j (link)
Last Updated |
- 2025-01-14T02:48:33Z |
+ 2025-01-14T08:30:02Z |
Archived |
@@ -46101,7 +46101,7 @@ openapi-directory (link)
Stars |
- 3932 |
+ 3936 |
Watchers |
@@ -46117,7 +46117,7 @@ openapi-directory (link)
Last Updated |
- 2025-01-12T08:19:01Z |
+ 2025-01-14T18:00:30Z |
Archived |
@@ -46152,7 +46152,7 @@ springdoc-openapi (link)
Stars |
- 3335 |
+ 3333 |
Watchers |
@@ -46168,7 +46168,7 @@ springdoc-openapi (link)
Last Updated |
- 2025-01-13T11:47:22Z |
+ 2025-01-15T00:20:17Z |
Archived |
@@ -46203,7 +46203,7 @@ uvicorn-gunicorn-fastapi-docker (link)<
Stars |
- 2729 |
+ 2730 |
Watchers |
@@ -46219,7 +46219,7 @@ uvicorn-gunicorn-fastapi-docker (link)<
Last Updated |
- 2025-01-13T00:58:39Z |
+ 2025-01-14T11:59:05Z |
Archived |
@@ -46305,7 +46305,7 @@ msgspec (link)
Stars |
- 2530 |
+ 2532 |
Watchers |
@@ -46321,7 +46321,7 @@ msgspec (link)
Last Updated |
- 2025-01-14T00:05:57Z |
+ 2025-01-14T23:40:40Z |
Archived |
@@ -46407,7 +46407,7 @@ Schemathesis (link)
Stars |
- 2354 |
+ 2358 |
Watchers |
@@ -46423,7 +46423,7 @@ Schemathesis (link)
Last Updated |
- 2025-01-13T23:09:08Z |
+ 2025-01-15T03:21:41Z |
Archived |
@@ -46509,7 +46509,7 @@ rapidoc (link)
Stars |
- 1733 |
+ 1736 |
Watchers |
@@ -46525,7 +46525,7 @@ rapidoc (link)
Last Updated |
- 2025-01-12T10:33:08Z |
+ 2025-01-14T19:42:28Z |
Archived |
@@ -46560,7 +46560,7 @@ ogen (link)
Stars |
- 1549 |
+ 1550 |
Watchers |
@@ -46576,7 +46576,7 @@ ogen (link)
Last Updated |
- 2025-01-13T20:31:28Z |
+ 2025-01-14T22:47:00Z |
Archived |
@@ -46611,7 +46611,7 @@ openapi-generator-cli (link)
Stars |
- 1505 |
+ 1509 |
Watchers |
@@ -46627,7 +46627,7 @@ openapi-generator-cli (link)
Last Updated |
- 2025-01-13T17:02:14Z |
+ 2025-01-14T23:03:48Z |
Archived |
@@ -46764,7 +46764,7 @@ apiflask (link)
Stars |
- 1057 |
+ 1060 |
Watchers |
@@ -46780,7 +46780,7 @@ apiflask (link)
Last Updated |
- 2025-01-13T18:35:23Z |
+ 2025-01-14T10:53:32Z |
Archived |
@@ -46882,7 +46882,7 @@ json-schema-validator (link)
Last Updated |
- 2025-01-14T00:08:54Z |
+ 2025-01-15T02:29:45Z |
Archived |
@@ -46917,7 +46917,7 @@ openapi-diff (link)
Stars |
- 854 |
+ 855 |
Watchers |
@@ -46933,7 +46933,7 @@ openapi-diff (link)
Last Updated |
- 2025-01-12T07:00:56Z |
+ 2025-01-14T16:55:24Z |
Archived |
@@ -47070,7 +47070,7 @@ openapi.tools (link)
Stars |
- 714 |
+ 713 |
Watchers |
@@ -47086,7 +47086,7 @@ openapi.tools (link)
Last Updated |
- 2025-01-08T08:24:42Z |
+ 2025-01-14T06:32:11Z |
Archived |
@@ -47223,7 +47223,7 @@ create-openapi-repo (link)
Stars |
- 678 |
+ 677 |
Watchers |
@@ -47239,7 +47239,7 @@ create-openapi-repo (link)
Last Updated |
- 2025-01-11T00:38:02Z |
+ 2025-01-14T03:32:06Z |
Archived |
@@ -47274,7 +47274,7 @@ stackql (link)
Stars |
- 669 |
+ 679 |
Watchers |
@@ -47290,7 +47290,7 @@ stackql (link)
Last Updated |
- 2025-01-13T18:25:34Z |
+ 2025-01-14T15:25:52Z |
Archived |
@@ -47341,7 +47341,7 @@ awesome-openapi3 (link)
Last Updated |
- 2025-01-13T15:06:28Z |
+ 2025-01-15T00:02:53Z |
Archived |
@@ -47478,7 +47478,7 @@ openapi-codegen (link)
Stars |
- 528 |
+ 529 |
Watchers |
@@ -47494,7 +47494,7 @@ openapi-codegen (link)
Last Updated |
- 2025-01-14T03:22:19Z |
+ 2025-01-15T01:56:16Z |
Archived |
@@ -47529,7 +47529,7 @@ docusaurus-openapi (link)
Stars |
- 514 |
+ 515 |
Watchers |
@@ -47545,7 +47545,7 @@ docusaurus-openapi (link)
Last Updated |
- 2025-01-07T22:50:08Z |
+ 2025-01-14T12:48:16Z |
Archived |
@@ -47733,7 +47733,7 @@ ghlocalapi (link)
Stars |
- 453 |
+ 452 |
Watchers |
@@ -47749,7 +47749,7 @@ ghlocalapi (link)
Last Updated |
- 2025-01-10T06:28:14Z |
+ 2025-01-14T09:44:40Z |
Archived |
@@ -47937,7 +47937,7 @@ fastapi-clean-example (link)
Stars |
- 411 |
+ 412 |
Watchers |
@@ -47953,7 +47953,7 @@ fastapi-clean-example (link)
Last Updated |
- 2025-01-11T06:44:38Z |
+ 2025-01-14T23:06:00Z |
Archived |
@@ -48192,7 +48192,7 @@ chanfana (link)
Stars |
- 387 |
+ 388 |
Watchers |
@@ -48208,7 +48208,7 @@ chanfana (link)
Last Updated |
- 2025-01-13T22:52:36Z |
+ 2025-01-15T01:06:33Z |
Archived |
@@ -48294,7 +48294,7 @@ generator-express-no-stress-typescript
Stars |
- 360 |
+ 361 |
Watchers |
@@ -48310,7 +48310,7 @@ generator-express-no-stress-typescript
Last Updated |
- 2024-11-10T18:27:22Z |
+ 2025-01-14T16:45:18Z |
Archived |
@@ -48549,7 +48549,7 @@ modelina (link)
Stars |
- 334 |
+ 335 |
Watchers |
@@ -48565,7 +48565,7 @@ modelina (link)
Last Updated |
- 2025-01-07T12:23:09Z |
+ 2025-01-14T19:33:25Z |
Archived |
@@ -48702,7 +48702,7 @@ openapi-core (link)
Stars |
- 311 |
+ 312 |
Watchers |
@@ -48718,7 +48718,7 @@ openapi-core (link)
Last Updated |
- 2025-01-13T23:38:29Z |
+ 2025-01-14T09:08:18Z |
Archived |
@@ -49016,7 +49016,7 @@ swaggerprovider (link)
Forks |
- 58 |
+ 59 |
Created |
@@ -49467,7 +49467,7 @@ speakeasy (link)
Stars |
- 222 |
+ 223 |
Watchers |
@@ -49483,7 +49483,7 @@ speakeasy (link)
Last Updated |
- 2025-01-14T01:19:19Z |
+ 2025-01-14T21:21:29Z |
Archived |
@@ -49585,7 +49585,7 @@ refitter (link)
Last Updated |
- 2025-01-13T22:37:55Z |
+ 2025-01-14T15:52:18Z |
Archived |
@@ -49824,7 +49824,7 @@ fastify-openapi-glue (link)
Stars |
- 206 |
+ 207 |
Watchers |
@@ -49840,7 +49840,7 @@ fastify-openapi-glue (link)
Last Updated |
- 2025-01-07T15:49:52Z |
+ 2025-01-14T22:27:19Z |
Archived |
@@ -51217,7 +51217,7 @@ tools.openapis.org (link)
Last Updated |
- 2025-01-13T03:39:06Z |
+ 2025-01-14T14:53:09Z |
Archived |
@@ -51456,7 +51456,7 @@ openapi (link)
Stars |
- 114 |
+ 115 |
Watchers |
@@ -51472,7 +51472,7 @@ openapi (link)
Last Updated |
- 2025-01-10T00:08:26Z |
+ 2025-01-14T20:34:53Z |
Archived |
@@ -52323,7 +52323,7 @@ pyramid_openapi3 (link)
Stars |
- 84 |
+ 85 |
Watchers |
@@ -52339,7 +52339,7 @@ pyramid_openapi3 (link)
Last Updated |
- 2025-01-13T18:10:02Z |
+ 2025-01-14T09:51:20Z |
Archived |
@@ -52594,7 +52594,7 @@ apidom (link)
Last Updated |
- 2025-01-10T17:12:31Z |
+ 2025-01-14T23:42:15Z |
Archived |
@@ -52833,7 +52833,7 @@ openapi3-parser (link)
Stars |
- 67 |
+ 68 |
Watchers |
@@ -52849,7 +52849,7 @@ openapi3-parser (link)
Last Updated |
- 2024-12-13T11:37:40Z |
+ 2025-01-14T07:51:03Z |
Archived |
@@ -53037,7 +53037,7 @@ vitepress-openapi (link)
Stars |
- 65 |
+ 66 |
Watchers |
@@ -53053,7 +53053,7 @@ vitepress-openapi (link)
Last Updated |
- 2025-01-11T21:48:05Z |
+ 2025-01-14T10:29:48Z |
Archived |
@@ -53249,7 +53249,7 @@ rest (link)
Forks |
- 23 |
+ 24 |
Created |
@@ -53394,7 +53394,7 @@ openapi-python-generator (link)
Stars |
- 59 |
+ 60 |
Watchers |
@@ -53410,7 +53410,7 @@ openapi-python-generator (link)
Last Updated |
- 2025-01-13T07:33:01Z |
+ 2025-01-14T06:12:17Z |
Archived |
@@ -54124,7 +54124,7 @@ swagger-editor-validate (link)
Last Updated |
- 2025-01-13T04:19:04Z |
+ 2025-01-14T09:48:26Z |
Archived |
@@ -54269,7 +54269,7 @@ javalin-openapi (link)
Forks |
- 17 |
+ 18 |
Created |
@@ -54363,7 +54363,7 @@ spring-boot-3-security-6-jwt (link)
Stars |
- 46 |
+ 47 |
Watchers |
@@ -54379,7 +54379,7 @@ spring-boot-3-security-6-jwt (link)
Last Updated |
- 2025-01-13T07:54:34Z |
+ 2025-01-14T04:40:46Z |
Archived |
@@ -55246,7 +55246,7 @@ openapi_dart (link)
Last Updated |
- 2024-11-20T17:43:20Z |
+ 2025-01-14T15:53:44Z |
Archived |
@@ -55756,7 +55756,7 @@ data-fair (link)
Last Updated |
- 2025-01-13T18:14:39Z |
+ 2025-01-14T16:56:49Z |
Archived |
@@ -56352,7 +56352,7 @@ redocly-cli-cookbook (link)
Stars |
- 30 |
+ 31 |
Watchers |
@@ -56360,7 +56360,7 @@ redocly-cli-cookbook (link)
Forks |
- 7 |
+ 6 |
Created |
@@ -56368,7 +56368,7 @@ redocly-cli-cookbook (link)
Last Updated |
- 2025-01-12T15:43:02Z |
+ 2025-01-14T06:58:15Z |
Archived |
@@ -56505,7 +56505,7 @@ hei-admin-api (link)
Stars |
- 28 |
+ 29 |
Watchers |
@@ -56521,7 +56521,7 @@ hei-admin-api (link)
Last Updated |
- 2025-01-13T15:08:19Z |
+ 2025-01-14T12:10:26Z |
Archived |
@@ -57388,7 +57388,7 @@ sbt-openapi-schema (link)
Last Updated |
- 2025-01-13T06:18:58Z |
+ 2025-01-14T06:18:39Z |
Archived |
@@ -57890,7 +57890,7 @@ openapi (link)
Forks |
- 6 |
+ 7 |
Created |
@@ -59055,7 +59055,7 @@ flapi (link)
Stars |
- 20 |
+ 22 |
Watchers |
@@ -59071,7 +59071,7 @@ flapi (link)
Last Updated |
- 2025-01-12T13:36:56Z |
+ 2025-01-14T20:26:31Z |
Archived |
@@ -59565,7 +59565,7 @@ campsite-booking (link)
Stars |
- 17 |
+ 18 |
Watchers |
@@ -59581,7 +59581,7 @@ campsite-booking (link)
Last Updated |
- 2024-11-26T18:30:39Z |
+ 2025-01-14T21:51:29Z |
Archived |
@@ -66211,7 +66211,7 @@ openapi-specs (link)
Last Updated |
- 2025-01-13T10:19:13Z |
+ 2025-01-14T14:34:44Z |
Archived |
@@ -66603,7 +66603,7 @@ swaggerboy (link)
Stars |
- 6 |
+ 5 |
Watchers |
@@ -66619,7 +66619,7 @@ swaggerboy (link)
Last Updated |
- 2025-01-13T01:23:07Z |
+ 2025-01-14T18:01:17Z |
Archived |
@@ -68592,7 +68592,7 @@ openapi-starter (link)
Stars |
- 5 |
+ 6 |
Watchers |
@@ -68608,7 +68608,7 @@ openapi-starter (link)
Last Updated |
- 2025-01-06T07:35:05Z |
+ 2025-01-14T13:41:46Z |
Archived |
@@ -69263,7 +69263,7 @@ e-procure (link)
Forks |
- 3 |
+ 4 |
Created |
@@ -71821,7 +71821,7 @@ membrane-core (link)
Last Updated |
- 2025-01-10T15:36:39Z |
+ 2025-01-14T12:57:30Z |
Archived |
@@ -72178,7 +72178,7 @@ openapi-to-java-records-mustache-templa
Last Updated |
- 2025-01-09T21:49:37Z |
+ 2025-01-14T22:30:34Z |
Archived |
@@ -73947,7 +73947,7 @@ oas-tszod-gen (link)
Stars |
- 3 |
+ 4 |
Watchers |
@@ -73963,7 +73963,7 @@ oas-tszod-gen (link)
Last Updated |
- 2024-12-18T05:35:33Z |
+ 2025-01-14T16:23:30Z |
Archived |
@@ -77788,7 +77788,7 @@ api-spec (link)
Last Updated |
- 2025-01-13T16:30:06Z |
+ 2025-01-15T00:38:36Z |
Archived |
@@ -81358,7 +81358,7 @@ pkg (link)
Last Updated |
- 2025-01-09T15:56:18Z |
+ 2025-01-14T21:57:20Z |
Archived |
@@ -90181,7 +90181,7 @@ data-model-openapi30 (link)
Last Updated |
- 2025-01-13T01:54:11Z |
+ 2025-01-14T13:50:02Z |
Archived |
@@ -90232,7 +90232,7 @@ vicx-applications (link)
Last Updated |
- 2025-01-13T19:07:31Z |
+ 2025-01-14T20:22:09Z |
Archived |
@@ -92715,7 +92715,7 @@ utoipa (link)
Stars |
- 2691 |
+ 2695 |
Watchers |
@@ -92731,7 +92731,7 @@ utoipa (link)
Last Updated |
- 2025-01-13T10:11:07Z |
+ 2025-01-14T20:39:31Z |
Archived |
@@ -96030,7 +96030,7 @@ orval (link)
Stars |
- 3387 |
+ 3391 |
Watchers |
@@ -96046,7 +96046,7 @@ orval (link)
Last Updated |
- 2025-01-14T03:16:34Z |
+ 2025-01-15T00:10:49Z |
Archived |
@@ -97356,7 +97356,7 @@ EvoMaster (link)
Stars |
- 536 |
+ 537 |
Watchers |
@@ -97372,7 +97372,7 @@ EvoMaster (link)
Last Updated |
- 2025-01-09T13:29:18Z |
+ 2025-01-14T04:07:17Z |
Archived |
@@ -98682,7 +98682,7 @@ beff (link)
Stars |
- 4 |
+ 5 |
Watchers |
@@ -98698,7 +98698,7 @@ beff (link)
Last Updated |
- 2024-12-18T14:29:35Z |
+ 2025-01-14T13:36:34Z |
Archived |
@@ -99855,7 +99855,7 @@ kubb (link)
Stars |
- 838 |
+ 839 |
Watchers |
@@ -99871,7 +99871,7 @@ kubb (link)
Last Updated |
- 2025-01-09T23:06:29Z |
+ 2025-01-14T21:29:12Z |
Archived |
@@ -100059,15 +100059,15 @@ full-stack-fastapi-template (link)
Stars |
- 29010 |
+ 29046 |
Watchers |
- 276 |
+ 277 |
Forks |
- 5239 |
+ 5240 |
Created |
@@ -100075,7 +100075,7 @@ full-stack-fastapi-template (link)
Last Updated |
- 2025-01-14T02:33:13Z |
+ 2025-01-15T03:03:25Z |
Archived |
@@ -101299,7 +101299,7 @@ spring-boot-starter-tomcat (link)
Last Updated |
- 2025-01-09T12:52:27Z |
+ 2025-01-15T03:11:09Z |
Archived |
@@ -109816,7 +109816,7 @@ swagger-models (link)
Last Updated |
- 2025-01-13T08:14:11Z |
+ 2025-01-14T21:04:07Z |
Archived |
@@ -109867,7 +109867,7 @@ Microsoft.OpenApi.net (link)
Last Updated |
- 2025-01-13T23:16:30Z |
+ 2025-01-14T21:35:07Z |
Archived |
@@ -112162,7 +112162,7 @@ LoopBack 4 (link)
Last Updated |
- 2025-01-13T22:42:40Z |
+ 2025-01-15T00:54:42Z |
Archived |
@@ -112248,7 +112248,7 @@ RESTler (link)
Stars |
- 2642 |
+ 2644 |
Watchers |
@@ -112256,7 +112256,7 @@ RESTler (link)
Forks |
- 307 |
+ 308 |
Created |
@@ -112264,7 +112264,7 @@ RESTler (link)
Last Updated |
- 2025-01-13T19:30:43Z |
+ 2025-01-14T21:30:44Z |
Archived |
diff --git a/docs/categories/auto-generators.html b/docs/categories/auto-generators.html
index 98ed524d..f32daae4 100644
--- a/docs/categories/auto-generators.html
+++ b/docs/categories/auto-generators.html
@@ -91,7 +91,7 @@ Yes
No |
No |
- 1362 |
+ 1363 |
@@ -114,7 +114,7 @@ No |
Yes |
No |
- 8454 |
+ 8464 |
@@ -137,7 +137,7 @@ No |
Yes |
No |
- 565 |
+ 566 |
@@ -250,7 +250,7 @@ Yes |
Yes |
No |
- 3991 |
+ 3994 |
@@ -296,7 +296,7 @@ No |
Yes |
No |
- 1099 |
+ 1111 |
@@ -319,7 +319,7 @@ Yes |
Yes |
No |
- 2513 |
+ 2516 |
@@ -373,7 +373,7 @@ Scramble (link)
|
Stars |
- 1362 |
+ 1363 |
Watchers |
@@ -389,7 +389,7 @@ Scramble (link)
Last Updated |
- 2025-01-13T16:56:43Z |
+ 2025-01-14T08:28:00Z |
Archived |
@@ -424,7 +424,7 @@ mitmproxy2swagger (link)
Stars |
- 8454 |
+ 8464 |
Watchers |
@@ -440,7 +440,7 @@ mitmproxy2swagger (link)
Last Updated |
- 2025-01-14T02:49:22Z |
+ 2025-01-15T02:44:27Z |
Archived |
@@ -475,7 +475,7 @@ OpenApiSpecGeneratorPlugin (link)
Stars |
- 565 |
+ 566 |
Watchers |
@@ -491,7 +491,7 @@ OpenApiSpecGeneratorPlugin (link)
Last Updated |
- 2025-01-13T14:42:25Z |
+ 2025-01-14T06:50:17Z |
Archived |
@@ -730,7 +730,7 @@ OpenAPI DevTools (link)
Stars |
- 3991 |
+ 3994 |
Watchers |
@@ -746,7 +746,7 @@ OpenAPI DevTools (link)
Last Updated |
- 2025-01-14T00:58:36Z |
+ 2025-01-15T02:55:24Z |
Archived |
@@ -797,7 +797,7 @@ TypeSpec (link)
Last Updated |
- 2025-01-14T02:10:50Z |
+ 2025-01-15T02:13:01Z |
Archived |
@@ -832,7 +832,7 @@ Fuego (link)
Stars |
- 1099 |
+ 1111 |
Watchers |
@@ -848,7 +848,7 @@ Fuego (link)
Last Updated |
- 2025-01-14T03:13:25Z |
+ 2025-01-15T01:28:15Z |
Archived |
@@ -883,7 +883,7 @@ Huma (link)
Stars |
- 2513 |
+ 2516 |
Watchers |
@@ -899,7 +899,7 @@ Huma (link)
Last Updated |
- 2025-01-14T00:58:37Z |
+ 2025-01-15T00:36:31Z |
Archived |
diff --git a/docs/categories/code-generators.html b/docs/categories/code-generators.html
index 21725659..5a9cb7e7 100644
--- a/docs/categories/code-generators.html
+++ b/docs/categories/code-generators.html
@@ -114,7 +114,7 @@ No
Yes |
Yes |
- 22443 |
+ 22456 |
@@ -160,7 +160,7 @@ No |
Yes |
Yes |
- 3112 |
+ 3115 |
@@ -248,7 +248,7 @@ No |
Yes |
Yes |
- 17156 |
+ 17157 |
@@ -340,7 +340,7 @@ Yes |
Yes |
Yes |
- 2759 |
+ 2765 |
@@ -363,7 +363,7 @@ Yes |
Yes |
No |
- 44 |
+ 45 |
@@ -386,7 +386,7 @@ Yes |
Yes |
No |
- 26797 |
+ 26799 |
@@ -430,7 +430,7 @@ No |
Yes |
No |
- 6534 |
+ 6538 |
@@ -472,7 +472,7 @@ No |
Yes |
No |
- 1505 |
+ 1509 |
@@ -493,7 +493,7 @@ Yes |
Yes |
No |
- 678 |
+ 677 |
@@ -707,7 +707,7 @@ No |
Yes |
No |
- 28 |
+ 29 |
@@ -1423,7 +1423,7 @@ No |
Yes |
Yes |
- 3387 |
+ 3391 |
@@ -1591,7 +1591,7 @@ Yes |
Yes |
Yes |
- 838 |
+ 839 |
@@ -2133,7 +2133,7 @@ OpenAPI Client Generators (link)
|
Last Updated |
- 2024-12-11T23:24:23Z |
+ 2025-01-14T12:34:04Z |
Archived |
@@ -2168,7 +2168,7 @@ OpenAPI Generator (link)
Stars |
- 22443 |
+ 22456 |
Watchers |
@@ -2176,7 +2176,7 @@ OpenAPI Generator (link)
Forks |
- 6674 |
+ 6678 |
Created |
@@ -2184,7 +2184,7 @@ OpenAPI Generator (link)
Last Updated |
- 2025-01-14T01:43:22Z |
+ 2025-01-15T02:42:27Z |
Archived |
@@ -2270,7 +2270,7 @@ Kiota Api Client Generator (link)
Stars |
- 3112 |
+ 3115 |
Watchers |
@@ -2278,7 +2278,7 @@ Kiota Api Client Generator (link)
Forks |
- 218 |
+ 219 |
Created |
@@ -2286,7 +2286,7 @@ Kiota Api Client Generator (link)
Last Updated |
- 2025-01-13T18:53:55Z |
+ 2025-01-15T03:02:40Z |
Archived |
@@ -2337,7 +2337,7 @@ FabriKt (link)
Last Updated |
- 2025-01-12T15:52:33Z |
+ 2025-01-14T21:00:03Z |
Archived |
@@ -2474,7 +2474,7 @@ Swagger-Codegen (link)
Stars |
- 17156 |
+ 17157 |
Watchers |
@@ -2490,7 +2490,7 @@ Swagger-Codegen (link)
Last Updated |
- 2025-01-13T15:05:14Z |
+ 2025-01-14T23:09:42Z |
Archived |
@@ -2678,7 +2678,7 @@ 🌿 Fern (link)
Stars |
- 2759 |
+ 2765 |
Watchers |
@@ -2686,7 +2686,7 @@ 🌿 Fern (link)
Forks |
- 162 |
+ 163 |
Created |
@@ -2694,7 +2694,7 @@ 🌿 Fern (link)
Last Updated |
- 2025-01-14T01:27:31Z |
+ 2025-01-15T00:20:27Z |
Archived |
@@ -2729,7 +2729,7 @@ OpenAPI Qraft (link)
Stars |
- 44 |
+ 45 |
Watchers |
@@ -2745,7 +2745,7 @@ OpenAPI Qraft (link)
Last Updated |
- 2025-01-08T22:57:22Z |
+ 2025-01-14T19:29:04Z |
Archived |
@@ -2780,7 +2780,7 @@ swagger-ui (link)
Stars |
- 26797 |
+ 26799 |
Watchers |
@@ -2796,7 +2796,7 @@ swagger-ui (link)
Last Updated |
- 2025-01-13T22:04:46Z |
+ 2025-01-14T21:04:08Z |
Archived |
@@ -2847,7 +2847,7 @@ swagger-core (link)
Last Updated |
- 2025-01-13T08:14:11Z |
+ 2025-01-14T21:04:07Z |
Archived |
@@ -2882,7 +2882,7 @@ OpenAPI Server Code Generator (oapi-cod
Stars |
- 6534 |
+ 6538 |
Watchers |
@@ -2898,7 +2898,7 @@ OpenAPI Server Code Generator (oapi-cod
Last Updated |
- 2025-01-13T16:06:18Z |
+ 2025-01-15T02:22:56Z |
Archived |
@@ -2984,7 +2984,7 @@ openapi-generator-cli (link)
Stars |
- 1505 |
+ 1509 |
Watchers |
@@ -3000,7 +3000,7 @@ openapi-generator-cli (link)
Last Updated |
- 2025-01-13T17:02:14Z |
+ 2025-01-14T23:03:48Z |
Archived |
@@ -3035,7 +3035,7 @@ create-openapi-repo (link)
Stars |
- 678 |
+ 677 |
Watchers |
@@ -3051,7 +3051,7 @@ create-openapi-repo (link)
Last Updated |
- 2025-01-11T00:38:02Z |
+ 2025-01-14T03:32:06Z |
Archived |
@@ -3510,7 +3510,7 @@ openapi_dart (link)
Last Updated |
- 2024-11-20T17:43:20Z |
+ 2025-01-14T15:53:44Z |
Archived |
@@ -3545,7 +3545,7 @@ hei-admin-api (link)
Stars |
- 28 |
+ 29 |
Watchers |
@@ -3561,7 +3561,7 @@ hei-admin-api (link)
Last Updated |
- 2025-01-13T15:08:19Z |
+ 2025-01-14T12:10:26Z |
Archived |
@@ -5279,7 +5279,7 @@ orval (link)
Stars |
- 3387 |
+ 3391 |
Watchers |
@@ -5295,7 +5295,7 @@ orval (link)
Last Updated |
- 2025-01-14T03:16:34Z |
+ 2025-01-15T00:10:49Z |
Archived |
@@ -5687,7 +5687,7 @@ kubb (link)
Stars |
- 838 |
+ 839 |
Watchers |
@@ -5703,7 +5703,7 @@ kubb (link)
Last Updated |
- 2025-01-09T23:06:29Z |
+ 2025-01-14T21:29:12Z |
Archived |
@@ -6366,7 +6366,7 @@ swagger-models (link)
Last Updated |
- 2025-01-13T08:14:11Z |
+ 2025-01-14T21:04:07Z |
Archived |
diff --git a/docs/categories/converters.html b/docs/categories/converters.html
index 8e8e492e..7b399140 100644
--- a/docs/categories/converters.html
+++ b/docs/categories/converters.html
@@ -221,7 +221,7 @@ Yes
Yes |
Yes |
- 1645 |
+ 1659 |
@@ -493,7 +493,7 @@ Yes |
Yes |
No |
- 1407 |
+ 1409 |
@@ -604,7 +604,7 @@ Yes |
Yes |
Yes |
- 6220 |
+ 6224 |
@@ -709,7 +709,7 @@ No |
Yes |
No |
- 114 |
+ 115 |
@@ -1470,7 +1470,7 @@ @hey-api/openapi-ts (link)
|
Stars |
- 1645 |
+ 1659 |
Watchers |
@@ -1486,7 +1486,7 @@ @hey-api/openapi-ts (link)
Last Updated |
- 2025-01-14T02:31:19Z |
+ 2025-01-15T03:18:49Z |
Archived |
@@ -1639,7 +1639,7 @@ go-swagger (link)
Last Updated |
- 2025-01-14T03:13:44Z |
+ 2025-01-14T20:44:57Z |
Archived |
@@ -2082,7 +2082,7 @@ openapi-python-client (link)
Stars |
- 1407 |
+ 1409 |
Watchers |
@@ -2098,7 +2098,7 @@ openapi-python-client (link)
Last Updated |
- 2025-01-13T23:30:02Z |
+ 2025-01-14T18:23:01Z |
Archived |
@@ -2337,11 +2337,11 @@ OpenAPI TypeScript (link)
Stars |
- 6220 |
+ 6224 |
Watchers |
- 24 |
+ 23 |
Forks |
@@ -2353,7 +2353,7 @@ OpenAPI TypeScript (link)
Last Updated |
- 2025-01-13T23:23:42Z |
+ 2025-01-14T15:53:37Z |
Archived |
@@ -2592,7 +2592,7 @@ openapi (link)
Stars |
- 114 |
+ 115 |
Watchers |
@@ -2608,7 +2608,7 @@ openapi (link)
Last Updated |
- 2025-01-10T00:08:26Z |
+ 2025-01-14T20:34:53Z |
Archived |
diff --git a/docs/categories/data-validators.html b/docs/categories/data-validators.html
index 115341db..6b09a42f 100644
--- a/docs/categories/data-validators.html
+++ b/docs/categories/data-validators.html
@@ -112,7 +112,7 @@ No
Yes |
Yes |
- 3646 |
+ 3650 |
@@ -263,7 +263,7 @@ Yes |
Yes |
No |
- 132 |
+ 133 |
@@ -309,7 +309,7 @@ No |
Yes |
Yes |
- 2701 |
+ 2702 |
@@ -458,7 +458,7 @@ No |
Yes |
Yes |
- 434 |
+ 435 |
@@ -527,7 +527,7 @@ Yes |
Yes |
Yes |
- 670 |
+ 671 |
@@ -640,7 +640,7 @@ Yes |
Yes |
Yes |
- 129 |
+ 130 |
@@ -663,7 +663,7 @@ No |
Yes |
No |
- 1099 |
+ 1111 |
@@ -686,7 +686,7 @@ Yes |
Yes |
No |
- 2513 |
+ 2516 |
@@ -730,7 +730,7 @@ Yes |
Yes |
No |
- 311 |
+ 312 |
@@ -772,7 +772,7 @@ No |
Yes |
No |
- 206 |
+ 207 |
@@ -2019,7 +2019,7 @@ tsoa (link)
|
Stars |
- 3646 |
+ 3650 |
Watchers |
@@ -2035,7 +2035,7 @@ tsoa (link)
Last Updated |
- 2025-01-13T10:03:52Z |
+ 2025-01-14T21:45:27Z |
Archived |
@@ -2329,7 +2329,7 @@ committee (link)
Watchers |
- 17 |
+ 16 |
Forks |
@@ -2376,7 +2376,7 @@ openapi_first (link)
Stars |
- 132 |
+ 133 |
Watchers |
@@ -2392,7 +2392,7 @@ openapi_first (link)
Last Updated |
- 2025-01-11T22:18:12Z |
+ 2025-01-14T03:41:18Z |
Archived |
@@ -2478,7 +2478,7 @@ kin-openapi (link)
Stars |
- 2701 |
+ 2702 |
Watchers |
@@ -2494,7 +2494,7 @@ kin-openapi (link)
Last Updated |
- 2025-01-13T20:11:47Z |
+ 2025-01-14T23:11:44Z |
Archived |
@@ -2835,7 +2835,7 @@ APIFuzzer (link)
Stars |
- 434 |
+ 435 |
Watchers |
@@ -2851,7 +2851,7 @@ APIFuzzer (link)
Last Updated |
- 2025-01-06T07:29:18Z |
+ 2025-01-14T21:19:29Z |
Archived |
@@ -2988,7 +2988,7 @@ vacuum (link)
Stars |
- 670 |
+ 671 |
Watchers |
@@ -3004,7 +3004,7 @@ vacuum (link)
Last Updated |
- 2025-01-12T23:34:52Z |
+ 2025-01-14T16:39:32Z |
Archived |
@@ -3243,7 +3243,7 @@ wiretap (link)
Stars |
- 129 |
+ 130 |
Watchers |
@@ -3259,7 +3259,7 @@ wiretap (link)
Last Updated |
- 2025-01-14T00:46:11Z |
+ 2025-01-14T03:56:49Z |
Archived |
@@ -3294,7 +3294,7 @@ Fuego (link)
Stars |
- 1099 |
+ 1111 |
Watchers |
@@ -3310,7 +3310,7 @@ Fuego (link)
Last Updated |
- 2025-01-14T03:13:25Z |
+ 2025-01-15T01:28:15Z |
Archived |
@@ -3345,7 +3345,7 @@ Huma (link)
Stars |
- 2513 |
+ 2516 |
Watchers |
@@ -3361,7 +3361,7 @@ Huma (link)
Last Updated |
- 2025-01-14T00:58:37Z |
+ 2025-01-15T00:36:31Z |
Archived |
@@ -3447,7 +3447,7 @@ openapi-core (link)
Stars |
- 311 |
+ 312 |
Watchers |
@@ -3463,7 +3463,7 @@ openapi-core (link)
Last Updated |
- 2025-01-13T23:38:29Z |
+ 2025-01-14T09:08:18Z |
Archived |
@@ -3549,7 +3549,7 @@ fastify-openapi-glue (link)
Stars |
- 206 |
+ 207 |
Watchers |
@@ -3565,7 +3565,7 @@ fastify-openapi-glue (link)
Last Updated |
- 2025-01-07T15:49:52Z |
+ 2025-01-14T22:27:19Z |
Archived |
diff --git a/docs/categories/description-validators.html b/docs/categories/description-validators.html
index 2ff6849a..73d4ea40 100644
--- a/docs/categories/description-validators.html
+++ b/docs/categories/description-validators.html
@@ -197,7 +197,7 @@ Yes
Yes |
Yes |
- 2584 |
+ 2586 |
@@ -239,7 +239,7 @@ Yes |
Yes |
Yes |
- 514 |
+ 515 |
@@ -440,7 +440,7 @@ Yes |
Yes |
Yes |
- 670 |
+ 671 |
@@ -574,7 +574,7 @@ Yes |
Yes |
No |
- 714 |
+ 713 |
@@ -658,7 +658,7 @@ No |
Yes |
No |
- 360 |
+ 361 |
@@ -1912,7 +1912,7 @@ Spectral (link)
|
Stars |
- 2584 |
+ 2586 |
Watchers |
@@ -1928,7 +1928,7 @@ Spectral (link)
Last Updated |
- 2025-01-13T16:28:20Z |
+ 2025-01-14T16:38:34Z |
Archived |
@@ -2014,7 +2014,7 @@ OpenAPI Validator (link)
Stars |
- 514 |
+ 515 |
Watchers |
@@ -2030,7 +2030,7 @@ OpenAPI Validator (link)
Last Updated |
- 2025-01-10T22:00:37Z |
+ 2025-01-15T02:40:18Z |
Archived |
@@ -2081,7 +2081,7 @@ Redocly CLI (link)
Last Updated |
- 2025-01-13T16:47:37Z |
+ 2025-01-14T15:19:46Z |
Archived |
@@ -2473,7 +2473,7 @@ vacuum (link)
Stars |
- 670 |
+ 671 |
Watchers |
@@ -2489,7 +2489,7 @@ vacuum (link)
Last Updated |
- 2025-01-12T23:34:52Z |
+ 2025-01-14T16:39:32Z |
Archived |
@@ -2779,7 +2779,7 @@ openapi.tools (link)
Stars |
- 714 |
+ 713 |
Watchers |
@@ -2795,7 +2795,7 @@ openapi.tools (link)
Last Updated |
- 2025-01-08T08:24:42Z |
+ 2025-01-14T06:32:11Z |
Archived |
@@ -2983,7 +2983,7 @@ generator-express-no-stress-typescript
Stars |
- 360 |
+ 361 |
Watchers |
@@ -2999,7 +2999,7 @@ generator-express-no-stress-typescript
Last Updated |
- 2024-11-10T18:27:22Z |
+ 2025-01-14T16:45:18Z |
Archived |
@@ -4325,7 +4325,7 @@ api-spec (link)
Last Updated |
- 2025-01-13T16:30:06Z |
+ 2025-01-15T00:38:36Z |
Archived |
diff --git a/docs/categories/documentation.html b/docs/categories/documentation.html
index 813139b2..b8af320f 100644
--- a/docs/categories/documentation.html
+++ b/docs/categories/documentation.html
@@ -169,7 +169,7 @@ Yes
Yes |
Yes |
- 8344 |
+ 8371 |
@@ -192,7 +192,7 @@ Yes |
No |
No |
- 1362 |
+ 1363 |
@@ -215,7 +215,7 @@ No |
Yes |
No |
- 1843 |
+ 1844 |
@@ -259,7 +259,7 @@ Yes |
Yes |
Yes |
- 23862 |
+ 23867 |
@@ -322,7 +322,7 @@ Yes |
Yes |
Yes |
- 671 |
+ 672 |
@@ -634,7 +634,7 @@ Yes |
Yes |
No |
- 3991 |
+ 3994 |
@@ -722,7 +722,7 @@ Yes |
Yes |
Yes |
- 1882 |
+ 1883 |
@@ -787,7 +787,7 @@ Yes |
Yes |
No |
- 838 |
+ 841 |
@@ -877,7 +877,7 @@ No |
Yes |
Yes |
- 270 |
+ 271 |
@@ -982,7 +982,7 @@ Yes |
Yes |
Yes |
- 2759 |
+ 2765 |
@@ -1095,7 +1095,7 @@ Yes |
Yes |
No |
- 123 |
+ 124 |
@@ -1116,7 +1116,7 @@ No |
Yes |
No |
- 1733 |
+ 1736 |
@@ -2604,7 +2604,7 @@ Scalar (link)
|
Stars |
- 8344 |
+ 8371 |
Watchers |
@@ -2620,7 +2620,7 @@ Scalar (link)
Last Updated |
- 2025-01-14T02:57:18Z |
+ 2025-01-15T01:11:11Z |
Archived |
@@ -2655,7 +2655,7 @@ Scramble (link)
Stars |
- 1362 |
+ 1363 |
Watchers |
@@ -2671,7 +2671,7 @@ Scramble (link)
Last Updated |
- 2025-01-13T16:56:43Z |
+ 2025-01-14T08:28:00Z |
Archived |
@@ -2706,7 +2706,7 @@ Scribe (link)
Stars |
- 1843 |
+ 1844 |
Watchers |
@@ -2722,7 +2722,7 @@ Scribe (link)
Last Updated |
- 2025-01-13T21:27:55Z |
+ 2025-01-14T11:27:15Z |
Archived |
@@ -2808,7 +2808,7 @@ ReDoc (link)
Stars |
- 23862 |
+ 23867 |
Watchers |
@@ -2824,7 +2824,7 @@ ReDoc (link)
Last Updated |
- 2025-01-13T23:57:58Z |
+ 2025-01-15T02:59:39Z |
Archived |
@@ -2961,7 +2961,7 @@ OpenAPI-UI (link)
Stars |
- 671 |
+ 672 |
Watchers |
@@ -2969,7 +2969,7 @@ OpenAPI-UI (link)
Forks |
- 61 |
+ 62 |
Created |
@@ -2977,7 +2977,7 @@ OpenAPI-UI (link)
Last Updated |
- 2025-01-13T09:07:02Z |
+ 2025-01-14T06:31:39Z |
Archived |
@@ -3487,7 +3487,7 @@ Redocly CLI (link)
Last Updated |
- 2025-01-13T16:47:37Z |
+ 2025-01-14T15:19:46Z |
Archived |
@@ -3675,7 +3675,7 @@ OpenAPI DevTools (link)
Stars |
- 3991 |
+ 3994 |
Watchers |
@@ -3691,7 +3691,7 @@ OpenAPI DevTools (link)
Last Updated |
- 2025-01-14T00:58:36Z |
+ 2025-01-15T02:55:24Z |
Archived |
@@ -3879,7 +3879,7 @@ Elements (link)
Stars |
- 1882 |
+ 1883 |
Watchers |
@@ -3895,7 +3895,7 @@ Elements (link)
Last Updated |
- 2025-01-11T22:43:41Z |
+ 2025-01-14T14:34:58Z |
Archived |
@@ -4032,7 +4032,7 @@ Mintlify (link)
Stars |
- 838 |
+ 841 |
Watchers |
@@ -4040,7 +4040,7 @@ Mintlify (link)
Forks |
- 202 |
+ 204 |
Created |
@@ -4048,7 +4048,7 @@ Mintlify (link)
Last Updated |
- 2025-01-13T21:55:46Z |
+ 2025-01-15T03:10:19Z |
Archived |
@@ -4236,7 +4236,7 @@ Kusk Gateway (link)
Stars |
- 270 |
+ 271 |
Watchers |
@@ -4252,7 +4252,7 @@ Kusk Gateway (link)
Last Updated |
- 2024-12-21T00:42:51Z |
+ 2025-01-14T07:32:49Z |
Archived |
@@ -4491,7 +4491,7 @@ 🌿 Fern (link)
Stars |
- 2759 |
+ 2765 |
Watchers |
@@ -4499,7 +4499,7 @@ 🌿 Fern (link)
Forks |
- 162 |
+ 163 |
Created |
@@ -4507,7 +4507,7 @@ 🌿 Fern (link)
Last Updated |
- 2025-01-14T01:27:31Z |
+ 2025-01-15T00:20:27Z |
Archived |
@@ -4746,7 +4746,7 @@ Zudoku (link)
Stars |
- 123 |
+ 124 |
Watchers |
@@ -4762,7 +4762,7 @@ Zudoku (link)
Last Updated |
- 2025-01-13T16:18:42Z |
+ 2025-01-14T10:43:44Z |
Archived |
@@ -4797,7 +4797,7 @@ rapidoc (link)
Stars |
- 1733 |
+ 1736 |
Watchers |
@@ -4813,7 +4813,7 @@ rapidoc (link)
Last Updated |
- 2025-01-12T10:33:08Z |
+ 2025-01-14T19:42:28Z |
Archived |
@@ -5272,7 +5272,7 @@ data-fair (link)
Last Updated |
- 2025-01-13T18:14:39Z |
+ 2025-01-14T16:56:49Z |
Archived |
diff --git a/docs/categories/dsl.html b/docs/categories/dsl.html
index 815dc5e2..ba0f4280 100644
--- a/docs/categories/dsl.html
+++ b/docs/categories/dsl.html
@@ -215,7 +215,7 @@ No
Yes |
No |
- 2028 |
+ 2029 |
@@ -619,7 +619,7 @@ rswag (link)
|
Stars |
- 2028 |
+ 2029 |
Watchers |
@@ -635,7 +635,7 @@ rswag (link)
Last Updated |
- 2025-01-14T02:38:49Z |
+ 2025-01-14T20:43:54Z |
Archived |
diff --git a/docs/categories/gateway.html b/docs/categories/gateway.html
index 3c598bbe..50d6aded 100644
--- a/docs/categories/gateway.html
+++ b/docs/categories/gateway.html
@@ -152,7 +152,7 @@ No
Yes |
Yes |
- 270 |
+ 271 |
@@ -217,7 +217,7 @@ Yes |
Yes |
Yes |
- 129 |
+ 130 |
@@ -447,7 +447,7 @@ Kusk Gateway (link)
|
Stars |
- 270 |
+ 271 |
Watchers |
@@ -463,7 +463,7 @@ Kusk Gateway (link)
Last Updated |
- 2024-12-21T00:42:51Z |
+ 2025-01-14T07:32:49Z |
Archived |
@@ -600,7 +600,7 @@ wiretap (link)
Stars |
- 129 |
+ 130 |
Watchers |
@@ -616,7 +616,7 @@ wiretap (link)
Last Updated |
- 2025-01-14T00:46:11Z |
+ 2025-01-14T03:56:49Z |
Archived |
diff --git a/docs/categories/gui-editors.html b/docs/categories/gui-editors.html
index a10ab65e..ffa240ba 100644
--- a/docs/categories/gui-editors.html
+++ b/docs/categories/gui-editors.html
@@ -174,7 +174,7 @@ No
Yes |
Yes |
- 999 |
+ 1002 |
@@ -672,7 +672,7 @@ Apicurio Studio (link)
|
Stars |
- 999 |
+ 1002 |
Watchers |
@@ -688,7 +688,7 @@ Apicurio Studio (link)
Last Updated |
- 2025-01-13T19:12:22Z |
+ 2025-01-14T15:38:45Z |
Archived |
diff --git a/docs/categories/learning.html b/docs/categories/learning.html
index bd2b0758..b5a2d6da 100644
--- a/docs/categories/learning.html
+++ b/docs/categories/learning.html
@@ -91,7 +91,7 @@ Yes
Yes |
No |
- 1399 |
+ 1402 |
@@ -346,7 +346,7 @@ optic diff (link)
|
Stars |
- 1399 |
+ 1402 |
Watchers |
@@ -362,7 +362,7 @@ optic diff (link)
Last Updated |
- 2025-01-13T16:52:58Z |
+ 2025-01-14T16:55:19Z |
Archived |
diff --git a/docs/categories/low-level-tooling.html b/docs/categories/low-level-tooling.html
index 3716a533..6a1d3366 100644
--- a/docs/categories/low-level-tooling.html
+++ b/docs/categories/low-level-tooling.html
@@ -91,7 +91,7 @@ No
Yes |
No |
- 3335 |
+ 3333 |
@@ -1440,7 +1440,7 @@ springdoc-openapi (link)
|
Stars |
- 3335 |
+ 3333 |
Watchers |
@@ -1456,7 +1456,7 @@ springdoc-openapi (link)
Last Updated |
- 2025-01-13T11:47:22Z |
+ 2025-01-15T00:20:17Z |
Archived |
@@ -2060,7 +2060,7 @@ openapi (link)
Forks |
- 6 |
+ 7 |
Created |
@@ -4312,7 +4312,7 @@ swagger-models (link)
Last Updated |
- 2025-01-13T08:14:11Z |
+ 2025-01-14T21:04:07Z |
Archived |
@@ -4363,7 +4363,7 @@ Microsoft.OpenApi.net (link)
Last Updated |
- 2025-01-13T23:16:30Z |
+ 2025-01-14T21:35:07Z |
Archived |
diff --git a/docs/categories/mock-testing.html b/docs/categories/mock-testing.html
index d63b50f3..e08a652b 100644
--- a/docs/categories/mock-testing.html
+++ b/docs/categories/mock-testing.html
@@ -91,7 +91,7 @@ Yes
Yes |
Yes |
- 1477 |
+ 1478 |
@@ -145,7 +145,7 @@ Microcks (link)
|
Stars |
- 1477 |
+ 1478 |
Watchers |
@@ -161,7 +161,7 @@ Microcks (link)
Last Updated |
- 2025-01-13T03:32:50Z |
+ 2025-01-14T21:37:07Z |
Archived |
diff --git a/docs/categories/mock.html b/docs/categories/mock.html
index 4d24e475..025e1719 100644
--- a/docs/categories/mock.html
+++ b/docs/categories/mock.html
@@ -110,7 +110,7 @@ Yes
Yes |
Yes |
- 4400 |
+ 4403 |
@@ -348,7 +348,7 @@ No |
Yes |
Yes |
- 270 |
+ 271 |
@@ -543,7 +543,7 @@ No |
Yes |
Yes |
- 3387 |
+ 3391 |
@@ -821,7 +821,7 @@ Prism (link)
|
Stars |
- 4400 |
+ 4403 |
Watchers |
@@ -837,7 +837,7 @@ Prism (link)
Last Updated |
- 2025-01-13T14:48:36Z |
+ 2025-01-15T00:46:21Z |
Archived |
@@ -1296,7 +1296,7 @@ Counterfact (link)
Last Updated |
- 2025-01-12T06:18:06Z |
+ 2025-01-15T02:40:16Z |
Archived |
@@ -1382,7 +1382,7 @@ Kusk Gateway (link)
Stars |
- 270 |
+ 271 |
Watchers |
@@ -1398,7 +1398,7 @@ Kusk Gateway (link)
Last Updated |
- 2024-12-21T00:42:51Z |
+ 2025-01-14T07:32:49Z |
Archived |
@@ -1449,7 +1449,7 @@ Specmatic (link)
Last Updated |
- 2025-01-13T14:03:34Z |
+ 2025-01-14T15:51:40Z |
Archived |
@@ -1841,7 +1841,7 @@ orval (link)
Stars |
- 3387 |
+ 3391 |
Watchers |
@@ -1857,7 +1857,7 @@ orval (link)
Last Updated |
- 2025-01-14T03:16:34Z |
+ 2025-01-15T00:10:49Z |
Archived |
diff --git a/docs/categories/parsers.html b/docs/categories/parsers.html
index d04935a7..d21588e9 100644
--- a/docs/categories/parsers.html
+++ b/docs/categories/parsers.html
@@ -91,7 +91,7 @@ Yes
Yes |
Yes |
- 23862 |
+ 23867 |
@@ -114,7 +114,7 @@ No |
Yes |
No |
- 786 |
+ 787 |
@@ -474,7 +474,7 @@ No |
Yes |
Yes |
- 3646 |
+ 3650 |
@@ -719,7 +719,7 @@ No |
Yes |
Yes |
- 2701 |
+ 2702 |
@@ -895,7 +895,7 @@ No |
Yes |
No |
- 93 |
+ 94 |
@@ -1056,7 +1056,7 @@ No |
Yes |
No |
- 547 |
+ 548 |
@@ -1414,7 +1414,7 @@ Yes |
Yes |
No |
- 1407 |
+ 1409 |
@@ -1709,7 +1709,7 @@ No |
Yes |
No |
- 2028 |
+ 2029 |
@@ -1801,7 +1801,7 @@ Yes |
Yes |
No |
- 23862 |
+ 23867 |
@@ -1822,7 +1822,7 @@ No |
Yes |
No |
- 1549 |
+ 1550 |
@@ -1843,7 +1843,7 @@ No |
Yes |
No |
- 1505 |
+ 1509 |
@@ -1927,7 +1927,7 @@ No |
Yes |
No |
- 854 |
+ 855 |
@@ -1990,7 +1990,7 @@ Yes |
Yes |
No |
- 678 |
+ 677 |
@@ -2200,7 +2200,7 @@ Yes |
Yes |
No |
- 311 |
+ 312 |
@@ -2286,7 +2286,7 @@ No |
Yes |
No |
- 222 |
+ 223 |
@@ -2391,7 +2391,7 @@ No |
Yes |
No |
- 206 |
+ 207 |
@@ -2731,7 +2731,7 @@ No |
Yes |
No |
- 114 |
+ 115 |
@@ -3046,7 +3046,7 @@ No |
Yes |
No |
- 67 |
+ 68 |
@@ -3130,7 +3130,7 @@ Yes |
Yes |
No |
- 65 |
+ 66 |
@@ -6523,7 +6523,7 @@ No |
Yes |
No |
- 3 |
+ 4 |
@@ -9001,7 +9001,7 @@ Yes |
Yes |
No |
- 2691 |
+ 2695 |
@@ -9673,7 +9673,7 @@ No |
Yes |
No |
- 4 |
+ 5 |
@@ -11425,7 +11425,7 @@ ReDoc (link)
|
Stars |
- 23862 |
+ 23867 |
Watchers |
@@ -11441,7 +11441,7 @@ ReDoc (link)
Last Updated |
- 2025-01-13T23:57:58Z |
+ 2025-01-15T02:59:39Z |
Archived |
@@ -11476,7 +11476,7 @@ oasdiff (link)
Stars |
- 786 |
+ 787 |
Watchers |
@@ -11492,7 +11492,7 @@ oasdiff (link)
Last Updated |
- 2025-01-11T18:30:19Z |
+ 2025-01-14T16:55:44Z |
Archived |
@@ -12292,7 +12292,7 @@ tsoa (link)
Stars |
- 3646 |
+ 3650 |
Watchers |
@@ -12308,7 +12308,7 @@ tsoa (link)
Last Updated |
- 2025-01-13T10:03:52Z |
+ 2025-01-14T21:45:27Z |
Archived |
@@ -12759,7 +12759,7 @@ KaiZen OpenAPI Parser (link)
Forks |
- 30 |
+ 31 |
Created |
@@ -12853,7 +12853,7 @@ kin-openapi (link)
Stars |
- 2701 |
+ 2702 |
Watchers |
@@ -12869,7 +12869,7 @@ kin-openapi (link)
Last Updated |
- 2025-01-13T20:11:47Z |
+ 2025-01-14T23:11:44Z |
Archived |
@@ -13124,7 +13124,7 @@ Microsoft/OpenAPI.NET (link)
Last Updated |
- 2025-01-13T23:16:30Z |
+ 2025-01-14T21:35:07Z |
Archived |
@@ -13261,7 +13261,7 @@ openapi3_parser (link)
Stars |
- 93 |
+ 94 |
Watchers |
@@ -13277,7 +13277,7 @@ openapi3_parser (link)
Last Updated |
- 2025-01-10T03:15:52Z |
+ 2025-01-14T22:24:16Z |
Archived |
@@ -13328,7 +13328,7 @@ go-swagger (link)
Last Updated |
- 2025-01-14T03:13:44Z |
+ 2025-01-14T20:44:57Z |
Archived |
@@ -13618,7 +13618,7 @@ openapi-fuzzer (link)
Stars |
- 547 |
+ 548 |
Watchers |
@@ -13634,7 +13634,7 @@ openapi-fuzzer (link)
Last Updated |
- 2025-01-12T17:02:10Z |
+ 2025-01-14T21:19:35Z |
Archived |
@@ -14434,7 +14434,7 @@ openapi-python-client (link)
Stars |
- 1407 |
+ 1409 |
Watchers |
@@ -14450,7 +14450,7 @@ openapi-python-client (link)
Last Updated |
- 2025-01-13T23:30:02Z |
+ 2025-01-14T18:23:01Z |
Archived |
@@ -15097,7 +15097,7 @@ rswag (link)
Stars |
- 2028 |
+ 2029 |
Watchers |
@@ -15113,7 +15113,7 @@ rswag (link)
Last Updated |
- 2025-01-14T02:38:49Z |
+ 2025-01-14T20:43:54Z |
Archived |
@@ -15301,7 +15301,7 @@ Redoc (link)
Stars |
- 23862 |
+ 23867 |
Watchers |
@@ -15317,7 +15317,7 @@ Redoc (link)
Last Updated |
- 2025-01-13T23:57:58Z |
+ 2025-01-15T02:59:39Z |
Archived |
@@ -15352,7 +15352,7 @@ ogen (link)
Stars |
- 1549 |
+ 1550 |
Watchers |
@@ -15368,7 +15368,7 @@ ogen (link)
Last Updated |
- 2025-01-13T20:31:28Z |
+ 2025-01-14T22:47:00Z |
Archived |
@@ -15403,7 +15403,7 @@ openapi-generator-cli (link)
Stars |
- 1505 |
+ 1509 |
Watchers |
@@ -15419,7 +15419,7 @@ openapi-generator-cli (link)
Last Updated |
- 2025-01-13T17:02:14Z |
+ 2025-01-14T23:03:48Z |
Archived |
@@ -15572,7 +15572,7 @@ json-schema-validator (link)
Last Updated |
- 2025-01-14T00:08:54Z |
+ 2025-01-15T02:29:45Z |
Archived |
@@ -15607,7 +15607,7 @@ openapi-diff (link)
Stars |
- 854 |
+ 855 |
Watchers |
@@ -15623,7 +15623,7 @@ openapi-diff (link)
Last Updated |
- 2025-01-12T07:00:56Z |
+ 2025-01-14T16:55:24Z |
Archived |
@@ -15760,7 +15760,7 @@ create-openapi-repo (link)
Stars |
- 678 |
+ 677 |
Watchers |
@@ -15776,7 +15776,7 @@ create-openapi-repo (link)
Last Updated |
- 2025-01-11T00:38:02Z |
+ 2025-01-14T03:32:06Z |
Archived |
@@ -15827,7 +15827,7 @@ awesome-openapi3 (link)
Last Updated |
- 2025-01-13T15:06:28Z |
+ 2025-01-15T00:02:53Z |
Archived |
@@ -16270,7 +16270,7 @@ openapi-core (link)
Stars |
- 311 |
+ 312 |
Watchers |
@@ -16286,7 +16286,7 @@ openapi-core (link)
Last Updated |
- 2025-01-13T23:38:29Z |
+ 2025-01-14T09:08:18Z |
Archived |
@@ -16474,7 +16474,7 @@ speakeasy (link)
Stars |
- 222 |
+ 223 |
Watchers |
@@ -16490,7 +16490,7 @@ speakeasy (link)
Last Updated |
- 2025-01-14T01:19:19Z |
+ 2025-01-14T21:21:29Z |
Archived |
@@ -16541,7 +16541,7 @@ refitter (link)
Last Updated |
- 2025-01-13T22:37:55Z |
+ 2025-01-14T15:52:18Z |
Archived |
@@ -16729,7 +16729,7 @@ fastify-openapi-glue (link)
Stars |
- 206 |
+ 207 |
Watchers |
@@ -16745,7 +16745,7 @@ fastify-openapi-glue (link)
Last Updated |
- 2025-01-07T15:49:52Z |
+ 2025-01-14T22:27:19Z |
Archived |
@@ -17545,7 +17545,7 @@ openapi (link)
Stars |
- 114 |
+ 115 |
Watchers |
@@ -17561,7 +17561,7 @@ openapi (link)
Last Updated |
- 2025-01-10T00:08:26Z |
+ 2025-01-14T20:34:53Z |
Archived |
@@ -18224,7 +18224,7 @@ apidom (link)
Last Updated |
- 2025-01-10T17:12:31Z |
+ 2025-01-14T23:42:15Z |
Archived |
@@ -18310,7 +18310,7 @@ openapi3-parser (link)
Stars |
- 67 |
+ 68 |
Watchers |
@@ -18326,7 +18326,7 @@ openapi3-parser (link)
Last Updated |
- 2024-12-13T11:37:40Z |
+ 2025-01-14T07:51:03Z |
Archived |
@@ -18514,7 +18514,7 @@ vitepress-openapi (link)
Stars |
- 65 |
+ 66 |
Watchers |
@@ -18530,7 +18530,7 @@ vitepress-openapi (link)
Last Updated |
- 2025-01-11T21:48:05Z |
+ 2025-01-14T10:29:48Z |
Archived |
@@ -18675,7 +18675,7 @@ rest (link)
Forks |
- 23 |
+ 24 |
Created |
@@ -20315,7 +20315,7 @@ sbt-openapi-schema (link)
Last Updated |
- 2025-01-13T06:18:58Z |
+ 2025-01-14T06:18:39Z |
Archived |
@@ -20562,7 +20562,7 @@ openapi (link)
Forks |
- 6 |
+ 7 |
Created |
@@ -24038,7 +24038,7 @@ openapi-specs (link)
Last Updated |
- 2025-01-13T10:19:13Z |
+ 2025-01-14T14:34:44Z |
Archived |
@@ -26078,7 +26078,7 @@ openapi-to-java-records-mustache-templa
Last Updated |
- 2025-01-09T21:49:37Z |
+ 2025-01-14T22:30:34Z |
Archived |
@@ -26725,7 +26725,7 @@ oas-tszod-gen (link)
Stars |
- 3 |
+ 4 |
Watchers |
@@ -26741,7 +26741,7 @@ oas-tszod-gen (link)
Last Updated |
- 2024-12-18T05:35:33Z |
+ 2025-01-14T16:23:30Z |
Archived |
@@ -28169,7 +28169,7 @@ api-spec (link)
Last Updated |
- 2025-01-13T16:30:06Z |
+ 2025-01-15T00:38:36Z |
Archived |
@@ -29189,7 +29189,7 @@ pkg (link)
Last Updated |
- 2025-01-09T15:56:18Z |
+ 2025-01-14T21:57:20Z |
Archived |
@@ -31790,7 +31790,7 @@ data-model-openapi30 (link)
Last Updated |
- 2025-01-13T01:54:11Z |
+ 2025-01-14T13:50:02Z |
Archived |
@@ -32743,7 +32743,7 @@ utoipa (link)
Stars |
- 2691 |
+ 2695 |
Watchers |
@@ -32759,7 +32759,7 @@ utoipa (link)
Last Updated |
- 2025-01-13T10:11:07Z |
+ 2025-01-14T20:39:31Z |
Archived |
@@ -34375,7 +34375,7 @@ beff (link)
Stars |
- 4 |
+ 5 |
Watchers |
@@ -34391,7 +34391,7 @@ beff (link)
Last Updated |
- 2024-12-18T14:29:35Z |
+ 2025-01-14T13:36:34Z |
Archived |
@@ -37400,7 +37400,7 @@ Microsoft.OpenApi.net (link)
Last Updated |
- 2025-01-13T23:16:30Z |
+ 2025-01-14T21:35:07Z |
Archived |
diff --git a/docs/categories/sdk.html b/docs/categories/sdk.html
index ef2d2734..d9bd920b 100644
--- a/docs/categories/sdk.html
+++ b/docs/categories/sdk.html
@@ -114,7 +114,7 @@ No
Yes |
Yes |
- 22443 |
+ 22456 |
@@ -160,7 +160,7 @@ No |
Yes |
Yes |
- 3112 |
+ 3115 |
@@ -206,7 +206,7 @@ Yes |
Yes |
Yes |
- 1477 |
+ 1478 |
@@ -229,7 +229,7 @@ Yes |
Yes |
Yes |
- 1645 |
+ 1659 |
@@ -426,7 +426,7 @@ No |
Yes |
Yes |
- 4665 |
+ 4666 |
@@ -698,7 +698,7 @@ Yes |
Yes |
Yes |
- 30 |
+ 31 |
@@ -765,7 +765,7 @@ Yes |
Yes |
Yes |
- 2759 |
+ 2765 |
@@ -832,7 +832,7 @@ Yes |
Yes |
No |
- 1491 |
+ 1493 |
@@ -855,7 +855,7 @@ Yes |
Yes |
No |
- 44 |
+ 45 |
@@ -878,7 +878,7 @@ Yes |
Yes |
Yes |
- 6220 |
+ 6224 |
@@ -899,7 +899,7 @@ No |
Yes |
No |
- 4193 |
+ 4194 |
@@ -920,7 +920,7 @@ No |
Yes |
No |
- 3932 |
+ 3936 |
@@ -941,7 +941,7 @@ No |
Yes |
No |
- 514 |
+ 515 |
@@ -962,7 +962,7 @@ No |
Yes |
No |
- 453 |
+ 452 |
@@ -3155,7 +3155,7 @@ OpenAPI Client Generators (link)
|
Last Updated |
- 2024-12-11T23:24:23Z |
+ 2025-01-14T12:34:04Z |
Archived |
@@ -3190,7 +3190,7 @@ OpenAPI Generator (link)
Stars |
- 22443 |
+ 22456 |
Watchers |
@@ -3198,7 +3198,7 @@ OpenAPI Generator (link)
Forks |
- 6674 |
+ 6678 |
Created |
@@ -3206,7 +3206,7 @@ OpenAPI Generator (link)
Last Updated |
- 2025-01-14T01:43:22Z |
+ 2025-01-15T02:42:27Z |
Archived |
@@ -3292,7 +3292,7 @@ Kiota Api Client Generator (link)
Stars |
- 3112 |
+ 3115 |
Watchers |
@@ -3300,7 +3300,7 @@ Kiota Api Client Generator (link)
Forks |
- 218 |
+ 219 |
Created |
@@ -3308,7 +3308,7 @@ Kiota Api Client Generator (link)
Last Updated |
- 2025-01-13T18:53:55Z |
+ 2025-01-15T03:02:40Z |
Archived |
@@ -3359,7 +3359,7 @@ FabriKt (link)
Last Updated |
- 2025-01-12T15:52:33Z |
+ 2025-01-14T21:00:03Z |
Archived |
@@ -3394,7 +3394,7 @@ Microcks (link)
Stars |
- 1477 |
+ 1478 |
Watchers |
@@ -3410,7 +3410,7 @@ Microcks (link)
Last Updated |
- 2025-01-13T03:32:50Z |
+ 2025-01-14T21:37:07Z |
Archived |
@@ -3445,7 +3445,7 @@ @hey-api/openapi-ts (link)
Stars |
- 1645 |
+ 1659 |
Watchers |
@@ -3461,7 +3461,7 @@ @hey-api/openapi-ts (link)
Last Updated |
- 2025-01-14T02:31:19Z |
+ 2025-01-15T03:18:49Z |
Archived |
@@ -3551,7 +3551,7 @@ docler-labs/api-client-generator (link)
Watchers |
- 15 |
+ 16 |
Forks |
@@ -3563,7 +3563,7 @@ docler-labs/api-client-generator (link)
Last Updated |
- 2024-12-17T00:24:48Z |
+ 2025-01-14T11:11:59Z |
Archived |
@@ -3665,7 +3665,7 @@ go-swagger (link)
Last Updated |
- 2025-01-14T03:13:44Z |
+ 2025-01-14T20:44:57Z |
Archived |
@@ -3810,7 +3810,7 @@ NSwag (link)
Forks |
- 1301 |
+ 1299 |
Created |
@@ -3818,7 +3818,7 @@ NSwag (link)
Last Updated |
- 2025-01-13T14:08:04Z |
+ 2025-01-14T14:23:04Z |
Archived |
@@ -3904,7 +3904,7 @@ Azure AutoRest (link)
Stars |
- 4665 |
+ 4666 |
Watchers |
@@ -3912,7 +3912,7 @@ Azure AutoRest (link)
Forks |
- 743 |
+ 742 |
Created |
@@ -3920,7 +3920,7 @@ Azure AutoRest (link)
Last Updated |
- 2025-01-13T20:52:07Z |
+ 2025-01-15T02:42:17Z |
Archived |
@@ -4175,7 +4175,7 @@ OWASP ZAP (link)
Last Updated |
- 2025-01-13T17:49:03Z |
+ 2025-01-14T13:34:18Z |
Archived |
@@ -4481,7 +4481,7 @@ Counterfact (link)
Last Updated |
- 2025-01-12T06:18:06Z |
+ 2025-01-15T02:40:16Z |
Archived |
@@ -4516,7 +4516,7 @@ apigen-ts (link)
Stars |
- 30 |
+ 31 |
Watchers |
@@ -4532,7 +4532,7 @@ apigen-ts (link)
Last Updated |
- 2024-11-24T23:14:16Z |
+ 2025-01-14T20:51:54Z |
Archived |
@@ -4669,7 +4669,7 @@ 🌿 Fern (link)
Stars |
- 2759 |
+ 2765 |
Watchers |
@@ -4677,7 +4677,7 @@ 🌿 Fern (link)
Forks |
- 162 |
+ 163 |
Created |
@@ -4685,7 +4685,7 @@ 🌿 Fern (link)
Last Updated |
- 2025-01-14T01:27:31Z |
+ 2025-01-15T00:20:27Z |
Archived |
@@ -4822,7 +4822,7 @@ Swift OpenAPI Generator (link)
Stars |
- 1491 |
+ 1493 |
Watchers |
@@ -4838,7 +4838,7 @@ Swift OpenAPI Generator (link)
Last Updated |
- 2025-01-11T21:14:08Z |
+ 2025-01-15T02:13:17Z |
Archived |
@@ -4873,7 +4873,7 @@ OpenAPI Qraft (link)
Stars |
- 44 |
+ 45 |
Watchers |
@@ -4889,7 +4889,7 @@ OpenAPI Qraft (link)
Last Updated |
- 2025-01-08T22:57:22Z |
+ 2025-01-14T19:29:04Z |
Archived |
@@ -4924,11 +4924,11 @@ OpenAPI TypeScript (link)
Stars |
- 6220 |
+ 6224 |
Watchers |
- 24 |
+ 23 |
Forks |
@@ -4940,7 +4940,7 @@ OpenAPI TypeScript (link)
Last Updated |
- 2025-01-13T23:23:42Z |
+ 2025-01-14T15:53:37Z |
Archived |
@@ -4975,7 +4975,7 @@ knife4j (link)
Stars |
- 4193 |
+ 4194 |
Watchers |
@@ -4991,7 +4991,7 @@ knife4j (link)
Last Updated |
- 2025-01-14T02:48:33Z |
+ 2025-01-14T08:30:02Z |
Archived |
@@ -5026,7 +5026,7 @@ openapi-directory (link)
Stars |
- 3932 |
+ 3936 |
Watchers |
@@ -5042,7 +5042,7 @@ openapi-directory (link)
Last Updated |
- 2025-01-12T08:19:01Z |
+ 2025-01-14T18:00:30Z |
Archived |
@@ -5077,7 +5077,7 @@ docusaurus-openapi (link)
Stars |
- 514 |
+ 515 |
Watchers |
@@ -5093,7 +5093,7 @@ docusaurus-openapi (link)
Last Updated |
- 2025-01-07T22:50:08Z |
+ 2025-01-14T12:48:16Z |
Archived |
@@ -5128,7 +5128,7 @@ ghlocalapi (link)
Stars |
- 453 |
+ 452 |
Watchers |
@@ -5144,7 +5144,7 @@ ghlocalapi (link)
Last Updated |
- 2025-01-10T06:28:14Z |
+ 2025-01-14T09:44:40Z |
Archived |
@@ -5289,7 +5289,7 @@ swaggerprovider (link)
Forks |
- 58 |
+ 59 |
Created |
@@ -5799,7 +5799,7 @@ javalin-openapi (link)
Forks |
- 17 |
+ 18 |
Created |
diff --git a/docs/categories/security.html b/docs/categories/security.html
index f5860b8a..14fbd87d 100644
--- a/docs/categories/security.html
+++ b/docs/categories/security.html
@@ -175,7 +175,7 @@ No
Yes |
No |
- 547 |
+ 548 |
@@ -198,7 +198,7 @@ Yes |
Yes |
Yes |
- 1218 |
+ 1219 |
@@ -326,7 +326,7 @@ No |
Yes |
Yes |
- 2642 |
+ 2644 |
@@ -584,7 +584,7 @@ openapi-fuzzer (link)
|
Stars |
- 547 |
+ 548 |
Watchers |
@@ -600,7 +600,7 @@ openapi-fuzzer (link)
Last Updated |
- 2025-01-12T17:02:10Z |
+ 2025-01-14T21:19:35Z |
Archived |
@@ -635,7 +635,7 @@ cats (link)
Stars |
- 1218 |
+ 1219 |
Watchers |
@@ -651,7 +651,7 @@ cats (link)
Last Updated |
- 2025-01-13T05:27:34Z |
+ 2025-01-14T18:23:48Z |
Archived |
@@ -753,7 +753,7 @@ OWASP ZAP (link)
Last Updated |
- 2025-01-13T17:49:03Z |
+ 2025-01-14T13:34:18Z |
Archived |
@@ -941,7 +941,7 @@ RESTler (link)
Stars |
- 2642 |
+ 2644 |
Watchers |
@@ -949,7 +949,7 @@ RESTler (link)
Forks |
- 307 |
+ 308 |
Created |
@@ -957,7 +957,7 @@ RESTler (link)
Last Updated |
- 2025-01-13T19:30:43Z |
+ 2025-01-14T21:30:44Z |
Archived |
diff --git a/docs/categories/server-implementations.html b/docs/categories/server-implementations.html
index 27e1f7c7..687fdb12 100644
--- a/docs/categories/server-implementations.html
+++ b/docs/categories/server-implementations.html
@@ -137,7 +137,7 @@ Yes
No |
No |
- 1362 |
+ 1363 |
@@ -160,7 +160,7 @@ Yes |
Yes |
Yes |
- 671 |
+ 672 |
@@ -183,7 +183,7 @@ Yes |
Yes |
No |
- 1399 |
+ 1402 |
@@ -321,7 +321,7 @@ Yes |
Yes |
Yes |
- 8986 |
+ 8988 |
@@ -344,7 +344,7 @@ No |
Yes |
Yes |
- 999 |
+ 1002 |
@@ -367,7 +367,7 @@ Yes |
Yes |
Yes |
- 4400 |
+ 4403 |
@@ -390,7 +390,7 @@ No |
Yes |
Yes |
- 8766 |
+ 8768 |
@@ -480,7 +480,7 @@ Yes |
Yes |
Yes |
- 1218 |
+ 1219 |
@@ -503,7 +503,7 @@ No |
Yes |
No |
- 8454 |
+ 8464 |
@@ -526,7 +526,7 @@ No |
Yes |
No |
- 565 |
+ 566 |
@@ -616,7 +616,7 @@ No |
Yes |
No |
- 28663 |
+ 28664 |
@@ -708,7 +708,7 @@ Yes |
Yes |
No |
- 838 |
+ 841 |
@@ -754,7 +754,7 @@ No |
Yes |
Yes |
- 270 |
+ 271 |
@@ -846,7 +846,7 @@ No |
Yes |
No |
- 79498 |
+ 79538 |
@@ -869,7 +869,7 @@ No |
Yes |
No |
- 3335 |
+ 3333 |
@@ -890,7 +890,7 @@ No |
Yes |
No |
- 2729 |
+ 2730 |
@@ -911,7 +911,7 @@ No |
Yes |
No |
- 2530 |
+ 2532 |
@@ -955,7 +955,7 @@ No |
Yes |
No |
- 2354 |
+ 2358 |
@@ -976,7 +976,7 @@ No |
Yes |
No |
- 1733 |
+ 1736 |
@@ -1020,7 +1020,7 @@ No |
Yes |
No |
- 1057 |
+ 1060 |
@@ -1085,7 +1085,7 @@ No |
Yes |
No |
- 669 |
+ 679 |
@@ -1148,7 +1148,7 @@ No |
Yes |
No |
- 411 |
+ 412 |
@@ -1234,7 +1234,7 @@ No |
Yes |
No |
- 387 |
+ 388 |
@@ -1675,7 +1675,7 @@ No |
Yes |
No |
- 59 |
+ 60 |
@@ -1822,7 +1822,7 @@ No |
Yes |
No |
- 46 |
+ 47 |
@@ -2179,7 +2179,7 @@ Yes |
Yes |
No |
- 30 |
+ 31 |
@@ -2473,7 +2473,7 @@ No |
Yes |
No |
- 20 |
+ 22 |
@@ -2536,7 +2536,7 @@ No |
Yes |
No |
- 17 |
+ 18 |
@@ -3609,7 +3609,7 @@ No |
Yes |
No |
- 6 |
+ 5 |
@@ -3987,7 +3987,7 @@ Yes |
Yes |
No |
- 5 |
+ 6 |
@@ -9283,7 +9283,7 @@ No |
Yes |
No |
- 4 |
+ 5 |
@@ -9619,7 +9619,7 @@ No |
Yes |
No |
- 29010 |
+ 29046 |
@@ -12120,7 +12120,7 @@ Scramble (link)
|
Stars |
- 1362 |
+ 1363 |
Watchers |
@@ -12136,7 +12136,7 @@ Scramble (link)
Last Updated |
- 2025-01-13T16:56:43Z |
+ 2025-01-14T08:28:00Z |
Archived |
@@ -12171,7 +12171,7 @@ OpenAPI-UI (link)
Stars |
- 671 |
+ 672 |
Watchers |
@@ -12179,7 +12179,7 @@ OpenAPI-UI (link)
Forks |
- 61 |
+ 62 |
Created |
@@ -12187,7 +12187,7 @@ OpenAPI-UI (link)
Last Updated |
- 2025-01-13T09:07:02Z |
+ 2025-01-14T06:31:39Z |
Archived |
@@ -12222,7 +12222,7 @@ optic diff (link)
Stars |
- 1399 |
+ 1402 |
Watchers |
@@ -12238,7 +12238,7 @@ optic diff (link)
Last Updated |
- 2025-01-13T16:52:58Z |
+ 2025-01-14T16:55:19Z |
Archived |
@@ -12528,7 +12528,7 @@ Swagger Editor (link)
Stars |
- 8986 |
+ 8988 |
Watchers |
@@ -12544,7 +12544,7 @@ Swagger Editor (link)
Last Updated |
- 2025-01-13T15:27:33Z |
+ 2025-01-14T21:30:10Z |
Archived |
@@ -12579,7 +12579,7 @@ Apicurio Studio (link)
Stars |
- 999 |
+ 1002 |
Watchers |
@@ -12595,7 +12595,7 @@ Apicurio Studio (link)
Last Updated |
- 2025-01-13T19:12:22Z |
+ 2025-01-14T15:38:45Z |
Archived |
@@ -12630,7 +12630,7 @@ Prism (link)
Stars |
- 4400 |
+ 4403 |
Watchers |
@@ -12646,7 +12646,7 @@ Prism (link)
Last Updated |
- 2025-01-13T14:48:36Z |
+ 2025-01-15T00:46:21Z |
Archived |
@@ -12681,7 +12681,7 @@ API Platform (link)
Stars |
- 8766 |
+ 8768 |
Watchers |
@@ -12697,7 +12697,7 @@ API Platform (link)
Last Updated |
- 2025-01-14T02:22:10Z |
+ 2025-01-14T15:06:12Z |
Archived |
@@ -12850,7 +12850,7 @@ Redocly CLI (link)
Last Updated |
- 2025-01-13T16:47:37Z |
+ 2025-01-14T15:19:46Z |
Archived |
@@ -12885,7 +12885,7 @@ cats (link)
Stars |
- 1218 |
+ 1219 |
Watchers |
@@ -12901,7 +12901,7 @@ cats (link)
Last Updated |
- 2025-01-13T05:27:34Z |
+ 2025-01-14T18:23:48Z |
Archived |
@@ -12936,7 +12936,7 @@ mitmproxy2swagger (link)
Stars |
- 8454 |
+ 8464 |
Watchers |
@@ -12952,7 +12952,7 @@ mitmproxy2swagger (link)
Last Updated |
- 2025-01-14T02:49:22Z |
+ 2025-01-15T02:44:27Z |
Archived |
@@ -12987,7 +12987,7 @@ OpenApiSpecGeneratorPlugin (link)
Stars |
- 565 |
+ 566 |
Watchers |
@@ -13003,7 +13003,7 @@ OpenApiSpecGeneratorPlugin (link)
Last Updated |
- 2025-01-13T14:42:25Z |
+ 2025-01-14T06:50:17Z |
Archived |
@@ -13105,7 +13105,7 @@ TypeSpec (link)
Last Updated |
- 2025-01-14T02:10:50Z |
+ 2025-01-15T02:13:01Z |
Archived |
@@ -13191,7 +13191,7 @@ Django REST Framework (link)
Stars |
- 28663 |
+ 28664 |
Watchers |
@@ -13199,7 +13199,7 @@ Django REST Framework (link)
Forks |
- 6868 |
+ 6867 |
Created |
@@ -13207,7 +13207,7 @@ Django REST Framework (link)
Last Updated |
- 2025-01-13T22:39:14Z |
+ 2025-01-15T00:57:07Z |
Archived |
@@ -13395,7 +13395,7 @@ Mintlify (link)
Stars |
- 838 |
+ 841 |
Watchers |
@@ -13403,7 +13403,7 @@ Mintlify (link)
Forks |
- 202 |
+ 204 |
Created |
@@ -13411,7 +13411,7 @@ Mintlify (link)
Last Updated |
- 2025-01-13T21:55:46Z |
+ 2025-01-15T03:10:19Z |
Archived |
@@ -13462,7 +13462,7 @@ Counterfact (link)
Last Updated |
- 2025-01-12T06:18:06Z |
+ 2025-01-15T02:40:16Z |
Archived |
@@ -13497,7 +13497,7 @@ Kusk Gateway (link)
Stars |
- 270 |
+ 271 |
Watchers |
@@ -13513,7 +13513,7 @@ Kusk Gateway (link)
Last Updated |
- 2024-12-21T00:42:51Z |
+ 2025-01-14T07:32:49Z |
Archived |
@@ -13701,7 +13701,7 @@ FastAPI (link)
Stars |
- 79498 |
+ 79538 |
Watchers |
@@ -13709,7 +13709,7 @@ FastAPI (link)
Forks |
- 6808 |
+ 6811 |
Created |
@@ -13717,7 +13717,7 @@ FastAPI (link)
Last Updated |
- 2025-01-14T02:48:39Z |
+ 2025-01-15T02:52:34Z |
Archived |
@@ -13752,7 +13752,7 @@ springdoc-openapi (link)
Stars |
- 3335 |
+ 3333 |
Watchers |
@@ -13768,7 +13768,7 @@ springdoc-openapi (link)
Last Updated |
- 2025-01-13T11:47:22Z |
+ 2025-01-15T00:20:17Z |
Archived |
@@ -13803,7 +13803,7 @@ uvicorn-gunicorn-fastapi-docker (link)<
Stars |
- 2729 |
+ 2730 |
Watchers |
@@ -13819,7 +13819,7 @@ uvicorn-gunicorn-fastapi-docker (link)<
Last Updated |
- 2025-01-13T00:58:39Z |
+ 2025-01-14T11:59:05Z |
Archived |
@@ -13854,7 +13854,7 @@ msgspec (link)
Stars |
- 2530 |
+ 2532 |
Watchers |
@@ -13870,7 +13870,7 @@ msgspec (link)
Last Updated |
- 2025-01-14T00:05:57Z |
+ 2025-01-14T23:40:40Z |
Archived |
@@ -13956,7 +13956,7 @@ Schemathesis (link)
Stars |
- 2354 |
+ 2358 |
Watchers |
@@ -13972,7 +13972,7 @@ Schemathesis (link)
Last Updated |
- 2025-01-13T23:09:08Z |
+ 2025-01-15T03:21:41Z |
Archived |
@@ -14007,7 +14007,7 @@ rapidoc (link)
Stars |
- 1733 |
+ 1736 |
Watchers |
@@ -14023,7 +14023,7 @@ rapidoc (link)
Last Updated |
- 2025-01-12T10:33:08Z |
+ 2025-01-14T19:42:28Z |
Archived |
@@ -14109,7 +14109,7 @@ apiflask (link)
Stars |
- 1057 |
+ 1060 |
Watchers |
@@ -14125,7 +14125,7 @@ apiflask (link)
Last Updated |
- 2025-01-13T18:35:23Z |
+ 2025-01-14T10:53:32Z |
Archived |
@@ -14262,7 +14262,7 @@ stackql (link)
Stars |
- 669 |
+ 679 |
Watchers |
@@ -14278,7 +14278,7 @@ stackql (link)
Last Updated |
- 2025-01-13T18:25:34Z |
+ 2025-01-14T15:25:52Z |
Archived |
@@ -14415,7 +14415,7 @@ fastapi-clean-example (link)
Stars |
- 411 |
+ 412 |
Watchers |
@@ -14431,7 +14431,7 @@ fastapi-clean-example (link)
Last Updated |
- 2025-01-11T06:44:38Z |
+ 2025-01-14T23:06:00Z |
Archived |
@@ -14619,7 +14619,7 @@ chanfana (link)
Stars |
- 387 |
+ 388 |
Watchers |
@@ -14635,7 +14635,7 @@ chanfana (link)
Last Updated |
- 2025-01-13T22:52:36Z |
+ 2025-01-15T01:06:33Z |
Archived |
@@ -15349,7 +15349,7 @@ tools.openapis.org (link)
Last Updated |
- 2025-01-13T03:39:06Z |
+ 2025-01-14T14:53:09Z |
Archived |
@@ -15690,7 +15690,7 @@ openapi-python-generator (link)
Stars |
- 59 |
+ 60 |
Watchers |
@@ -15706,7 +15706,7 @@ openapi-python-generator (link)
Last Updated |
- 2025-01-13T07:33:01Z |
+ 2025-01-14T06:12:17Z |
Archived |
@@ -16012,7 +16012,7 @@ swagger-editor-validate (link)
Last Updated |
- 2025-01-13T04:19:04Z |
+ 2025-01-14T09:48:26Z |
Archived |
@@ -16047,7 +16047,7 @@ spring-boot-3-security-6-jwt (link)
Stars |
- 46 |
+ 47 |
Watchers |
@@ -16063,7 +16063,7 @@ spring-boot-3-security-6-jwt (link)
Last Updated |
- 2025-01-13T07:54:34Z |
+ 2025-01-14T04:40:46Z |
Archived |
@@ -16573,7 +16573,7 @@ data-fair (link)
Last Updated |
- 2025-01-13T18:14:39Z |
+ 2025-01-14T16:56:49Z |
Archived |
@@ -16914,7 +16914,7 @@ redocly-cli-cookbook (link)
Stars |
- 30 |
+ 31 |
Watchers |
@@ -16922,7 +16922,7 @@ redocly-cli-cookbook (link)
Forks |
- 7 |
+ 6 |
Created |
@@ -16930,7 +16930,7 @@ redocly-cli-cookbook (link)
Last Updated |
- 2025-01-12T15:43:02Z |
+ 2025-01-14T06:58:15Z |
Archived |
@@ -17628,7 +17628,7 @@ flapi (link)
Stars |
- 20 |
+ 22 |
Watchers |
@@ -17644,7 +17644,7 @@ flapi (link)
Last Updated |
- 2025-01-12T13:36:56Z |
+ 2025-01-14T20:26:31Z |
Archived |
@@ -17781,7 +17781,7 @@ campsite-booking (link)
Stars |
- 17 |
+ 18 |
Watchers |
@@ -17797,7 +17797,7 @@ campsite-booking (link)
Last Updated |
- 2024-11-26T18:30:39Z |
+ 2025-01-14T21:51:29Z |
Archived |
@@ -20382,7 +20382,7 @@ swaggerboy (link)
Stars |
- 6 |
+ 5 |
Watchers |
@@ -20398,7 +20398,7 @@ swaggerboy (link)
Last Updated |
- 2025-01-13T01:23:07Z |
+ 2025-01-14T18:01:17Z |
Archived |
@@ -21300,7 +21300,7 @@ openapi-starter (link)
Stars |
- 5 |
+ 6 |
Watchers |
@@ -21316,7 +21316,7 @@ openapi-starter (link)
Last Updated |
- 2025-01-06T07:35:05Z |
+ 2025-01-14T13:41:46Z |
Archived |
@@ -21512,7 +21512,7 @@ e-procure (link)
Forks |
- 3 |
+ 4 |
Created |
@@ -22591,7 +22591,7 @@ membrane-core (link)
Last Updated |
- 2025-01-10T15:36:39Z |
+ 2025-01-14T12:57:30Z |
Archived |
@@ -30292,7 +30292,7 @@ vicx-applications (link)
Last Updated |
- 2025-01-13T19:07:31Z |
+ 2025-01-14T20:22:09Z |
Archived |
@@ -34152,7 +34152,7 @@ beff (link)
Stars |
- 4 |
+ 5 |
Watchers |
@@ -34168,7 +34168,7 @@ beff (link)
Last Updated |
- 2024-12-18T14:29:35Z |
+ 2025-01-14T13:36:34Z |
Archived |
@@ -34968,15 +34968,15 @@ full-stack-fastapi-template (link)
Stars |
- 29010 |
+ 29046 |
Watchers |
- 276 |
+ 277 |
Forks |
- 5239 |
+ 5240 |
Created |
@@ -34984,7 +34984,7 @@ full-stack-fastapi-template (link)
Last Updated |
- 2025-01-14T02:33:13Z |
+ 2025-01-15T03:03:25Z |
Archived |
@@ -35596,7 +35596,7 @@ spring-boot-starter-tomcat (link)
Last Updated |
- 2025-01-09T12:52:27Z |
+ 2025-01-15T03:11:09Z |
Archived |
diff --git a/docs/categories/server.html b/docs/categories/server.html
index c83235a8..845b347b 100644
--- a/docs/categories/server.html
+++ b/docs/categories/server.html
@@ -114,7 +114,7 @@ No
Yes |
Yes |
- 3646 |
+ 3650 |
@@ -229,7 +229,7 @@ No |
Yes |
Yes |
- 8766 |
+ 8768 |
@@ -342,7 +342,7 @@ No |
Yes |
No |
- 1724 |
+ 1726 |
@@ -433,7 +433,7 @@ No |
Yes |
Yes |
- 5933 |
+ 5932 |
@@ -546,7 +546,7 @@ Yes |
Yes |
Yes |
- 2759 |
+ 2765 |
@@ -569,7 +569,7 @@ Yes |
Yes |
No |
- 1491 |
+ 1493 |
@@ -592,7 +592,7 @@ No |
Yes |
No |
- 1099 |
+ 1111 |
@@ -615,7 +615,7 @@ Yes |
Yes |
No |
- 2513 |
+ 2516 |
@@ -2922,7 +2922,7 @@ tsoa (link)
|
Stars |
- 3646 |
+ 3650 |
Watchers |
@@ -2938,7 +2938,7 @@ tsoa (link)
Last Updated |
- 2025-01-13T10:03:52Z |
+ 2025-01-14T21:45:27Z |
Archived |
@@ -3032,7 +3032,7 @@ express-openapi (link)
Forks |
- 236 |
+ 237 |
Created |
@@ -3177,7 +3177,7 @@ API Platform (link)
Stars |
- 8766 |
+ 8768 |
Watchers |
@@ -3193,7 +3193,7 @@ API Platform (link)
Last Updated |
- 2025-01-14T02:22:10Z |
+ 2025-01-14T15:06:12Z |
Archived |
@@ -3432,7 +3432,7 @@ @nestjs/swagger (link)
Stars |
- 1724 |
+ 1726 |
Watchers |
@@ -3440,7 +3440,7 @@ @nestjs/swagger (link)
Forks |
- 485 |
+ 486 |
Created |
@@ -3448,7 +3448,7 @@ @nestjs/swagger (link)
Last Updated |
- 2025-01-14T01:12:09Z |
+ 2025-01-14T22:38:09Z |
Archived |
@@ -3636,7 +3636,7 @@ SpringFox (link)
Stars |
- 5933 |
+ 5932 |
Watchers |
@@ -3652,7 +3652,7 @@ SpringFox (link)
Last Updated |
- 2025-01-13T09:33:18Z |
+ 2025-01-14T21:04:10Z |
Archived |
@@ -3891,7 +3891,7 @@ 🌿 Fern (link)
Stars |
- 2759 |
+ 2765 |
Watchers |
@@ -3899,7 +3899,7 @@ 🌿 Fern (link)
Forks |
- 162 |
+ 163 |
Created |
@@ -3907,7 +3907,7 @@ 🌿 Fern (link)
Last Updated |
- 2025-01-14T01:27:31Z |
+ 2025-01-15T00:20:27Z |
Archived |
@@ -3942,7 +3942,7 @@ Swift OpenAPI Generator (link)
Stars |
- 1491 |
+ 1493 |
Watchers |
@@ -3958,7 +3958,7 @@ Swift OpenAPI Generator (link)
Last Updated |
- 2025-01-11T21:14:08Z |
+ 2025-01-15T02:13:17Z |
Archived |
@@ -3993,7 +3993,7 @@ Fuego (link)
Stars |
- 1099 |
+ 1111 |
Watchers |
@@ -4009,7 +4009,7 @@ Fuego (link)
Last Updated |
- 2025-01-14T03:13:25Z |
+ 2025-01-15T01:28:15Z |
Archived |
@@ -4044,7 +4044,7 @@ Huma (link)
Stars |
- 2513 |
+ 2516 |
Watchers |
@@ -4060,7 +4060,7 @@ Huma (link)
Last Updated |
- 2025-01-14T00:58:37Z |
+ 2025-01-15T00:36:31Z |
Archived |
@@ -9211,7 +9211,7 @@ LoopBack 4 (link)
Last Updated |
- 2025-01-13T22:42:40Z |
+ 2025-01-15T00:54:42Z |
Archived |
diff --git a/docs/categories/testing-tools.html b/docs/categories/testing-tools.html
index 6b7971f7..28b4699d 100644
--- a/docs/categories/testing-tools.html
+++ b/docs/categories/testing-tools.html
@@ -91,7 +91,7 @@ Yes
Yes |
Yes |
- 129 |
+ 130 |
@@ -114,7 +114,7 @@ No |
Yes |
No |
- 2354 |
+ 2358 |
@@ -191,7 +191,7 @@ wiretap (link)
|
Stars |
- 129 |
+ 130 |
Watchers |
@@ -207,7 +207,7 @@ wiretap (link)
Last Updated |
- 2025-01-14T00:46:11Z |
+ 2025-01-14T03:56:49Z |
Archived |
@@ -242,7 +242,7 @@ Schemathesis (link)
Stars |
- 2354 |
+ 2358 |
Watchers |
@@ -258,7 +258,7 @@ Schemathesis (link)
Last Updated |
- 2025-01-13T23:09:08Z |
+ 2025-01-15T03:21:41Z |
Archived |
diff --git a/docs/categories/testing.html b/docs/categories/testing.html
index 4f24fa76..e56c199b 100644
--- a/docs/categories/testing.html
+++ b/docs/categories/testing.html
@@ -173,7 +173,7 @@ No
Yes |
Yes |
- 4196 |
+ 4195 |
@@ -677,7 +677,7 @@ Yes |
Yes |
Yes |
- 129 |
+ 130 |
@@ -717,7 +717,7 @@ No |
Yes |
No |
- 6750 |
+ 6754 |
@@ -759,7 +759,7 @@ No |
Yes |
No |
- 528 |
+ 529 |
@@ -948,7 +948,7 @@ No |
Yes |
No |
- 84 |
+ 85 |
@@ -2019,7 +2019,7 @@ No |
Yes |
Yes |
- 536 |
+ 537 |
@@ -2619,7 +2619,7 @@ No |
Yes |
Yes |
- 2642 |
+ 2644 |
@@ -2917,7 +2917,7 @@ Dredd (link)
|
Stars |
- 4196 |
+ 4195 |
Watchers |
@@ -2933,7 +2933,7 @@ Dredd (link)
Last Updated |
- 2025-01-09T15:07:26Z |
+ 2025-01-14T21:04:01Z |
Archived |
@@ -3953,7 +3953,7 @@ Specmatic (link)
Last Updated |
- 2025-01-13T14:03:34Z |
+ 2025-01-14T15:51:40Z |
Archived |
@@ -4090,7 +4090,7 @@ wiretap (link)
Stars |
- 129 |
+ 130 |
Watchers |
@@ -4106,7 +4106,7 @@ wiretap (link)
Last Updated |
- 2025-01-14T00:46:11Z |
+ 2025-01-14T03:56:49Z |
Archived |
@@ -4192,7 +4192,7 @@ mockoon (link)
Stars |
- 6750 |
+ 6754 |
Watchers |
@@ -4208,7 +4208,7 @@ mockoon (link)
Last Updated |
- 2025-01-13T20:01:55Z |
+ 2025-01-14T21:53:02Z |
Archived |
@@ -4294,7 +4294,7 @@ openapi-codegen (link)
Stars |
- 528 |
+ 529 |
Watchers |
@@ -4310,7 +4310,7 @@ openapi-codegen (link)
Last Updated |
- 2025-01-14T03:22:19Z |
+ 2025-01-15T01:56:16Z |
Archived |
@@ -4753,7 +4753,7 @@ pyramid_openapi3 (link)
Stars |
- 84 |
+ 85 |
Watchers |
@@ -4769,7 +4769,7 @@ pyramid_openapi3 (link)
Last Updated |
- 2025-01-13T18:10:02Z |
+ 2025-01-14T09:51:20Z |
Archived |
@@ -5483,7 +5483,7 @@ openapi-specs (link)
Last Updated |
- 2025-01-13T10:19:13Z |
+ 2025-01-14T14:34:44Z |
Archived |
@@ -7354,7 +7354,7 @@ EvoMaster (link)
Stars |
- 536 |
+ 537 |
Watchers |
@@ -7370,7 +7370,7 @@ EvoMaster (link)
Last Updated |
- 2025-01-09T13:29:18Z |
+ 2025-01-14T04:07:17Z |
Archived |
@@ -8782,7 +8782,7 @@ RESTler (link)
Stars |
- 2642 |
+ 2644 |
Watchers |
@@ -8790,7 +8790,7 @@ RESTler (link)
Forks |
- 307 |
+ 308 |
Created |
@@ -8798,7 +8798,7 @@ RESTler (link)
Last Updated |
- 2025-01-13T19:30:43Z |
+ 2025-01-14T21:30:44Z |
Archived |
diff --git a/docs/categories/text-editors.html b/docs/categories/text-editors.html
index 97405a4d..6906a22e 100644
--- a/docs/categories/text-editors.html
+++ b/docs/categories/text-editors.html
@@ -157,7 +157,7 @@ Yes
Yes |
Yes |
- 8986 |
+ 8988 |
@@ -594,7 +594,7 @@ Swagger Editor (link)
|
Stars |
- 8986 |
+ 8988 |
Watchers |
@@ -610,7 +610,7 @@ Swagger Editor (link)
Last Updated |
- 2025-01-13T15:27:33Z |
+ 2025-01-14T21:30:10Z |
Archived |
diff --git a/docs/categories/unclassified.html b/docs/categories/unclassified.html
index fbf04915..c56318c6 100644
--- a/docs/categories/unclassified.html
+++ b/docs/categories/unclassified.html
@@ -89,7 +89,7 @@ No
Yes |
No |
- 334 |
+ 335 |
@@ -1200,7 +1200,7 @@ modelina (link)
|
Stars |
- 334 |
+ 335 |
Watchers |
@@ -1216,7 +1216,7 @@ modelina (link)
Last Updated |
- 2025-01-07T12:23:09Z |
+ 2025-01-14T19:33:25Z |
Archived |
diff --git a/docs/categories/user-interfaces.html b/docs/categories/user-interfaces.html
index b79f52ea..5f5082c4 100644
--- a/docs/categories/user-interfaces.html
+++ b/docs/categories/user-interfaces.html
@@ -91,7 +91,7 @@ Yes
Yes |
No |
- 26797 |
+ 26799 |
@@ -114,7 +114,7 @@ Yes |
Yes |
No |
- 23862 |
+ 23867 |
@@ -275,7 +275,7 @@ swagger-ui (link)
|
Stars |
- 26797 |
+ 26799 |
Watchers |
@@ -291,7 +291,7 @@ swagger-ui (link)
Last Updated |
- 2025-01-13T22:04:46Z |
+ 2025-01-14T21:04:08Z |
Archived |
@@ -326,7 +326,7 @@ Redoc (link)
Stars |
- 23862 |
+ 23867 |
Watchers |
@@ -342,7 +342,7 @@ Redoc (link)
Last Updated |
- 2025-01-13T23:57:58Z |
+ 2025-01-15T02:59:39Z |
Archived |
diff --git a/src/_data/tools.yaml b/src/_data/tools.yaml
index a9ea7fb4..41d10da7 100644
--- a/src/_data/tools.yaml
+++ b/src/_data/tools.yaml
@@ -281,17 +281,17 @@
References ✨ 1st-Class
OpenAPI/Swagger Support
created: '2023-08-16T13:42:32Z'
- updated: '2025-01-14T02:57:18Z'
+ updated: '2025-01-15T01:11:11Z'
language: TypeScript
archived: false
- stars: 8344
+ stars: 8371
watchers: 24
forks: 269
owner: scalar
logo: https://avatars.githubusercontent.com/u/301879?v=4
license: MIT
- repoEtag: '"2c5ca0e65040f035459ed2532baeca9c55fe962e68253a2465bddaefe57a4de6"'
- repoLastModified: Tue, 14 Jan 2025 02:57:18 GMT
+ repoEtag: '"0dac9365cf9ec707f416ad252cfe02040f0d41b8f9d0d9035457e0038138f9c3"'
+ repoLastModified: Wed, 15 Jan 2025 01:11:11 GMT
foundInMaster: true
- source: https://openapi.tools/
name: Scramble
@@ -319,17 +319,17 @@
Modern Laravel OpenAPI (Swagger) documentation generator. No PHPDoc
annotations required.
created: '2022-08-05T17:16:20Z'
- updated: '2025-01-13T16:56:43Z'
+ updated: '2025-01-14T08:28:00Z'
language: PHP
archived: false
- stars: 1362
+ stars: 1363
watchers: 17
forks: 131
owner: dedoc
logo: https://avatars.githubusercontent.com/u/93313138?v=4
license: MIT
- repoEtag: '"122b952e3f1bc82a9ec8ffc0abaddcf447350de7f21840ac83375f23316b58e0"'
- repoLastModified: Mon, 13 Jan 2025 16:56:43 GMT
+ repoEtag: '"bc5bfc6c236cf3c970367e926e97bdb9c186d280b8170bc86ce4550f95bfe5f5"'
+ repoLastModified: Tue, 14 Jan 2025 08:28:00 GMT
foundInMaster: true
- source: https://openapi.tools/
name: Scribe
@@ -350,17 +350,17 @@
repositoryId: 260729799
description: Generate API documentation for humans from your Laravel codebase.✍
created: '2020-05-02T16:36:45Z'
- updated: '2025-01-13T21:27:55Z'
+ updated: '2025-01-14T11:27:15Z'
language: PHP
archived: false
- stars: 1843
+ stars: 1844
watchers: 17
forks: 327
owner: knuckleswtf
logo: https://avatars.githubusercontent.com/u/63367037?v=4
license: MIT
- repoEtag: '"5ea30736891697b96ef805fe215a5c1916e55ed5c1a949ba17574660511dfb52"'
- repoLastModified: Mon, 13 Jan 2025 21:27:55 GMT
+ repoEtag: '"7f5e7d157c982b7e09f7b2db624849764c5ee617dd7c9ecb9aecb2de3d0202f1"'
+ repoLastModified: Tue, 14 Jan 2025 11:27:15 GMT
foundInMaster: true
- source: https://openapi.tools/
name: Supermodel
@@ -407,17 +407,17 @@
repositoryId: 45250726
description: 📘 OpenAPI/Swagger-generated API Reference Documentation
created: '2015-10-30T12:53:02Z'
- updated: '2025-01-13T23:57:58Z'
+ updated: '2025-01-15T02:59:39Z'
language: TypeScript
archived: false
- stars: 23862
+ stars: 23867
watchers: 298
forks: 2316
owner: Redocly
logo: https://avatars.githubusercontent.com/u/32099856?v=4
license: MIT
- repoEtag: '"53e8f485a95ead11856e4e0060717aedee83b049d4789b8460236d1ddd1d6462"'
- repoLastModified: Mon, 13 Jan 2025 23:57:58 GMT
+ repoEtag: '"e8295df8f1ecd443b6a497434357837282fc04ce749ae47ab1f7f4dfe9713a25"'
+ repoLastModified: Wed, 15 Jan 2025 02:59:39 GMT
foundInMaster: true
- source: https://openapi.tools/
name: RestCase Docs
@@ -479,17 +479,17 @@
also simplified postman tool. 基于 OpenAPI/Swagger
规范的接口文档,快速模拟请求参数并调用接口,也是简化版 postman 工具,欢迎提功能请求、bug
created: '2023-12-20T14:51:12Z'
- updated: '2025-01-13T09:07:02Z'
+ updated: '2025-01-14T06:31:39Z'
language: TypeScript
archived: false
- stars: 671
+ stars: 672
watchers: 3
- forks: 61
+ forks: 62
owner: rookie-luochao
logo: https://avatars.githubusercontent.com/u/22948077?v=4
license: MIT
- repoEtag: '"1f7572d578e5a89314b4de2c8cc13056257d3d4e34ead3db891e31ad9691eb37"'
- repoLastModified: Mon, 13 Jan 2025 09:07:02 GMT
+ repoEtag: '"f6c53da23a7643c4490b1efc3ff1392fced9e818973809ffe7f9b4b07bd2d848"'
+ repoLastModified: Tue, 14 Jan 2025 06:31:39 GMT
category:
- Documentation
- Server Implementations
@@ -516,17 +516,17 @@
repositoryId: 337689065
description: OpenAPI Diff and Breaking Changes
created: '2021-02-10T10:28:36Z'
- updated: '2025-01-11T18:30:19Z'
+ updated: '2025-01-14T16:55:44Z'
language: Go
archived: false
- stars: 786
+ stars: 787
watchers: 10
forks: 67
owner: Tufin
logo: https://avatars.githubusercontent.com/u/5352131?v=4
license: Apache-2.0
- repoEtag: '"4622c26b7a524909b73ab92714c940035129097be0a613597802b9c640ff6e3c"'
- repoLastModified: Sat, 11 Jan 2025 18:30:19 GMT
+ repoEtag: '"a6cfa240dcce88d78e31ef582d856eb3dc2da1e93a2df51a3966cfcf129acb0c"'
+ repoLastModified: Tue, 14 Jan 2025 16:55:44 GMT
foundInMaster: true
name: oasdiff
language: Go
@@ -574,17 +574,17 @@
changes, publish accurate documentation and improve the design of your
APIs.
created: '2018-03-02T17:02:50Z'
- updated: '2025-01-13T16:52:58Z'
+ updated: '2025-01-14T16:55:19Z'
language: TypeScript
archived: false
- stars: 1399
+ stars: 1402
watchers: 11
forks: 86
owner: opticdev
logo: https://avatars.githubusercontent.com/u/34556970?v=4
license: MIT
- repoEtag: '"36a2ccc4b0115628d86afb2954765dd1fb5c86e1d08c9a0cb12a5964ed6ef6d0"'
- repoLastModified: Mon, 13 Jan 2025 16:52:58 GMT
+ repoEtag: '"0b1f38e773543dbc7e848f69dfc4b1cb3083731584a19afc61f761c1b2bf9853"'
+ repoLastModified: Tue, 14 Jan 2025 16:55:19 GMT
foundInMaster: true
id: 8c3d08406ca659662808d51ddc10b4e4
v3_1: true
@@ -999,7 +999,7 @@
Swagger definitions supporting jQuery, Angular, AXIOS, Fetch API, Aurelia
and Angular Strictly Typed Forms
created: '2020-03-14T00:15:16Z'
- updated: '2024-12-11T23:24:23Z'
+ updated: '2025-01-14T12:34:04Z'
language: TypeScript
archived: false
stars: 71
@@ -1008,8 +1008,8 @@
owner: zijianhuang
logo: https://avatars.githubusercontent.com/u/8484970?v=4
license: MIT
- repoEtag: '"8c60d526f4a476832a10cb967133ab0d2632d12547618204ae7d17da8628e235"'
- repoLastModified: Wed, 11 Dec 2024 23:24:23 GMT
+ repoEtag: '"0c5a574e45f858ea6b72dd9f039f7e0aa07ee3f9dff286acb2f0d14141bdc6a4"'
+ repoLastModified: Tue, 14 Jan 2025 12:34:04 GMT
foundInMaster: true
id: 7db93864fa7fbbeccc6ada53c6f9cc62
- source:
@@ -1039,17 +1039,17 @@
generation), server stubs, documentation and configuration automatically
given an OpenAPI Spec (v2, v3)
created: '2018-05-12T09:57:56Z'
- updated: '2025-01-14T01:43:22Z'
+ updated: '2025-01-15T02:42:27Z'
language: Java
archived: false
- stars: 22443
+ stars: 22456
watchers: 224
- forks: 6674
+ forks: 6678
owner: OpenAPITools
logo: https://avatars.githubusercontent.com/u/37325267?v=4
license: Apache-2.0
- repoEtag: '"90a5bfafb6f52383a39bdf104e6701d7ebc80650c8cb5a599f6300902481f20a"'
- repoLastModified: Tue, 14 Jan 2025 01:43:22 GMT
+ repoEtag: '"f362e6a995aa22d9bfc1654ce716f5482e440b63e80345684a310553162cc118"'
+ repoLastModified: Wed, 15 Jan 2025 02:42:27 GMT
foundInMaster: true
id: 0418f8afcd0196c648d1a46c0c5c20d1
v3_1_link: https://github.com/OpenAPITools/openapi-generator/issues/9083
@@ -1123,17 +1123,17 @@
repositoryId: 323665366
description: OpenAPI based HTTP Client code generator
created: '2020-12-22T15:35:49Z'
- updated: '2025-01-13T18:53:55Z'
+ updated: '2025-01-15T03:02:40Z'
language: C#
archived: false
- stars: 3112
+ stars: 3115
watchers: 45
- forks: 218
+ forks: 219
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"efbde8e2bf212679ebe07472a847a95b9b9fe3100a937ab14b064255d30116f8"'
- repoLastModified: Mon, 13 Jan 2025 18:53:55 GMT
+ repoEtag: '"dc7093a699b5facc32b743b83e3747e8a9569241c7a124418922e99750bca9d3"'
+ repoLastModified: Wed, 15 Jan 2025 03:02:40 GMT
foundInMaster: true
- source: https://openapi.tools/
name: FabriKt
@@ -1155,13 +1155,13 @@
id: d604cd88daaabccb12202f2d3d4429d5
repositoryMetadata:
base64Readme: >-
- IyBGYWJyaWt0IGAvy4hmYS1icmlrdC9gIC0gS290bGluIGNvZGUgZnJvbSBPcGVuQVBJIDMKCi0tLQoKKiBbSW50cm9kdWN0aW9uXSgjaW50cm9kdWN0aW9uKQoqIFtGZWF0dXJlc10oI2ZlYXR1cmVzKQoqIFtFeGFtcGxlc10oI2V4YW1wbGVzKQoqIFtVc2FnZSBJbnN0cnVjdGlvbnNdKCN1c2FnZS1pbnN0cnVjdGlvbnMpCiAgKiBbQ29tbWFuZCBMaW5lXSgjY29tbWFuZC1saW5lKQogICogW0dyYWRsZSB3LyBjdXN0b20gdGFza10oI2dyYWRsZS13LWN1c3RvbS10YXNrKQogICogW0dyYWRsZSB3LyBwbHVnaW5dKCNncmFkbGUtdy1wbHVnaW4pCiAgKiBbTWF2ZW5dKCNtYXZlbikKKiBbR2V0dGluZyB0aGUgTW9zdCBmcm9tIEZhYnJpa3RdKCNnZXR0aW5nLXRoZS1tb3N0LWZyb20tZmFicmlrdCkKKiBbQ29uZmlndXJhdGlvbiBPcHRpb25zXSgjY29uZmlndXJhdGlvbi1vcHRpb25zKQoqIFtCdWlsZGluZyBMb2NhbGx5XSgjYnVpbGRpbmctbG9jYWxseSkKKiBbUHVibGlzaGluZ10oI3B1Ymxpc2hpbmcpCiogW1NwZWNpZmljIEZlYXR1cmVzXSgjc3BlY2lmaWMtZmVhdHVyZXMpCgotLS0KCiMjIEludHJvZHVjdGlvbgoKVGhpcyBsaWJyYXJ5IHdhcyBidWlsdCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgY29tcGxleCBtb2RlbGluZyBmZWF0dXJlcyBhdmFpbGFibGUgaW4gT3BlbkFQSSAzLiBJdCBnZW5lcmF0ZXMgS290bGluIGRhdGEgY2xhc3NlcyB3aXRoIGFkdmFuY2VkIHN1cHBvcnQgZm9yIGZlYXR1cmVzIHN1Y2ggYXM6IAogLSBOdWxsIFNhZmV0eQogLSBJbmxpbmVkIHNjaGVtYSBkZWZpbml0aW9ucwogLSBFbnVtZXJhdGlvbnMgCiAtIFNlYWxlZCBDbGFzc2VzCiAtIFBvbHltb3JwaGlzbSAoYEBKc29uU3ViVHlwZXNgKQogLSBNYXBzIG9mIE1hcHMgb2YgTWFwcwogLSBHcmFhbFZNIE5hdGl2ZSBSZWZsZWN0aW9uIFJlZ2lzdHJhdGlvbgogLSBKc29uIE1lcmdlIFBhdGNoICh2aWEgYEpzb25OdWxsYWJsZWApIChhZGQgYHgtanNvbi1tZXJnZS1wYXRjaDogdHJ1ZWAgdG8gc2NoZW1hcykKIC0gT3ZlcnJpZGUgSmFja3NvbiBJbmNsdWRlIE5vbk51bGwgKHZpYSBgSnNvbkluY2x1ZGVgKSAoYWRkIGB4LWphY2tzb24taW5jbHVkZS1ub24tbnVsbDogdHJ1ZWAgdG8gc2NoZW1hcykKIAphcyB3ZWxsIGFzIEhUVFAgY2xpZW50cyBhbmQgY29udHJvbGxlcnMgZm9yIGEgbnVtYmVyIG9mIHBvcHVsYXIgZnJhbWV3b3JrcyAoc2VlIFtGZWF0dXJlc10oI2ZlYXR1cmVzKSkuCgpNb3JlIHRoYW4ganVzdCBib290c3RyYXBwaW5nLCB0aGlzIGxpYnJhcnkgY2FuIGJlIHBlcm1hbmVudGx5IGludGVncmF0ZWQgaW50byBhIGdyYWRsZSBvciBtYXZlbiBidWlsZCBhbmQgd2lsbCBlbnN1cmUgY29udHJhY3QgYW5kIGNvZGUgYWx3YXlzIG1hdGNoLCBldmVuIGFzIEFQSXMgZXZvbHZlIGluIGNvbXBsZXhpdHkuIAoKVGhlIHRlYW0gdGhhdCBidWlsdCB0aGlzIHRvb2wgaW5pdGlhbGx5IGNvbnRyaWJ1dGVkIHRvIHRoZSBLb3RsaW4gY29kZSBnZW5lcmF0aW9uIGFiaWxpdHkgaW4gW09wZW5BcGlUb29sc10oaHR0cHM6Ly9naXRodWIuY29tL09wZW5BUElUb29scy9vcGVuYXBpLWdlbmVyYXRvciksIGJ1dCByZWFjaGVkIHRoZSBsaW1pdHMgb2Ygd2hhdCBjb3VsZCBiZSBhY2hpZXZlZCB3aXRoIHRlbXBsYXRlLWJhc2VkIGdlbmVyYXRpb24uIFRoaXMgbGlicmFyeSBsZXZlcmFnZXMgdGhlIHJpY2ggT3BlbkFQSSAzIG1vZGVsIHByb3ZpZGVkIGJ5IFtLYWlaZW4tT3BlbkFwaS1QYXJzZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9SZXByZVplbi9LYWlaZW4tT3BlbkFwaS1QYXJzZXIpIGFuZCB1c2VzIFtLb3RsaW4gUG9ldF0oaHR0cHM6Ly9zcXVhcmUuZ2l0aHViLmlvL2tvdGxpbnBvZXQvKSB0byBwcm9ncmFtbWF0aWNhbGx5IGNvbnN0cnVjdCBLb3RsaW4gY2xhc3NlcyBmb3IgbWF4aW11bSBmbGV4aWJpbGl0eS4gCgpJdCB3YXMgYnVpbHQgYXQgW1phbGFuZG8gVGVjaF0oaHR0cHM6Ly9vcGVuc291cmNlLnphbGFuZG8uY29tLykgYW5kIGlzIGJhdHRsZS10ZXN0ZWQgaW4gcHJvZHVjdGlvbiB0aGVyZS4gSXQgaXMgcGFydGljdWxhcmx5IHdlbGwtc3VpdGVkIHRvIEFQSSdzIGJ1aWx0IGFjY29yZGluZyB0byBaYWxhbmRvJ3MgW1JFU1QgQVBJIGd1aWRlbGluZXNdKGh0dHBzOi8vb3BlbnNvdXJjZS56YWxhbmRvLmNvbS9yZXN0ZnVsLWFwaS1ndWlkZWxpbmVzLykuCgpUaGUgbGlicmFyeSBpcyBbYXZhaWxhYmxlIG9uIE1hdmVuIENlbnRyYWxdKGh0dHBzOi8vc2VhcmNoLm1hdmVuLm9yZy9hcnRpZmFjdC9jb20uY2pib29tcy9mYWJyaWt0KSBhdCB0aGUgZm9sbG93aW5nIGNvb3JkaW5hdGVzOgoKYGBgeG1sCjxkZXBlbmRlbmN5PgogIDxncm91cElkPmNvbS5jamJvb21zPC9ncm91cElkPgogIDxhcnRpZmFjdElkPmZhYnJpa3Q8L2FydGlmYWN0SWQ+CjwvZGVwZW5kZW5jeT4KYGBgCgojIyBGZWF0dXJlcwoKVGhlIGxpYnJhcnkgY3VycmVudGx5IGhhcyBzdXBwb3J0IGZvciBnZW5lcmF0aW5nOgoKKiBNb2RlbHMKICAqICoqSmFja3NvbioqIGFubm90YXRlZCAqKmRhdGEgY2xhc3NlcyoqCiAgKiAqKktvdGxpbnguc2VyaWFsaXphdGlvbioqIGFubm90YXRlZCAqKmRhdGEgY2xhc3NlcyoqCiogQ2xpZW50cwogICogKipPa0h0dHAgQ2xpZW50ICh3LyBKYWNrc29uIE1vZGVscykqKiAtIHdpdGggdGhlIG9wdGlvbiBmb3IgYSByZXNpbGllbmNlNGogZmF1bHQtdG9sZXJhbmNlIHdyYXBwZXIKICAqICoqT3BlbkZlaWduKiogYW5ub3RhdGVkIGNsaWVudCBpbnRlcmZhY2VzCiogQ29udHJvbGxlcnMKICAqICoqU3ByaW5nIE1WQyoqIGFubm90YXRlZCBjb250cm9sbGVyIGludGVyZmFjZXMKICAqICoqTWljcm9uYXV0KiogSFRUUCBhbm5vdGF0ZWQgY29udHJvbGxlciBpbnRlcmZhY2VzCiAgKiAqKkt0b3Igc2VydmVyKiogcm91dGVzIGFuZCBjb250cm9sbGVyIGludGVyZmFjZXMKCiMjIEV4YW1wbGVzCgpDb25zdWx0IHRlc3QgZGlyZWN0b3J5IGZvciBPcGVuQVBJIGNvZGUgZ2VuZXJhdGlvbiBleGFtcGxlcy4gCgpJdCBmb3JtcyBhIGxpdmluZyBkb2N1bWVudGF0aW9uIGZ1bGwgb2YgW2NvZGUgZXhhbXBsZXNdKHNyYy90ZXN0L3Jlc291cmNlcy9leGFtcGxlcykgZ2VuZXJhdGVkIGZyb20gZGlmZmVyZW50IE9wZW5BUEkgMyBwZXJtdXRhdGlvbnMuCgpGdXJ0aGVybW9yZSwgdGhlIFtlbmQtdG8tZW5kIHRlc3RzXSgvZW5kMmVuZC10ZXN0cykgZGVtb25zdHJhdGUgaG93IHRvIGludGVncmF0ZSB0aGUgbGlicmFyeSB1c2luZyBHcmFkbGUuCgojIyBVc2FnZSBJbnN0cnVjdGlvbnMKClRoZSBsaWJyYXJ5IGNhbiBiZSB1c2VkIGluIGEgdmFyaWV0eSBvZiB3YXlzLCBpbmNsdWRpbmcgYXMgYSBjb21tYW5kIGxpbmUgdG9vbCwgYSBHcmFkbGUgdGFzaywgb3IgYSBNYXZlbiBwbHVnaW4uCgpQbGVhc2UgcmVmZXIgdG8gW0NvbmZpZ3VyYXRpb24gT3B0aW9uc10oI2NvbmZpZ3VyYXRpb24tb3B0aW9ucykgc2VjdGlvbiBmb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLgoKIyMjIENvbW1hbmQgTGluZQoKRmFicmlrdCBpcyBwYWNrYWdlZCBhcyBhbiBleGVjdXRhYmxlIGphciwgYWxsb3dpbmcgaXQgdG8gYmUgaW50ZWdyYXRlZCBpbnRvIGFueSBidWlsZCB0b29sLiAKClRoZSBDTEkgY2FuIGJlIGludm9rZWQgYXMgZm9sbG93czoKCmBgYApqYXZhIC1qYXIgZmFicmlrdC5qYXIgXAogICAgLS1vdXRwdXQtZGlyZWN0b3J5ICcvdG1wJyBcCiAgICAtLWJhc2UtcGFja2FnZSAnY29tLmV4YW1wbGUnIFwKICAgIC0tYXBpLWZpbGUgJy9wYXRoLXRvLWFwaS9vcGVuLWFwaS55YW1sJyBcCiAgICAtLXRhcmdldHMgJ2NsaWVudCcgXAogICAgLS10YXJnZXRzICdodHRwX21vZGVscycgXAogICAgLS1odHRwLWNsaWVudC1vcHRzIHJlc2lsaWVuY2U0agpgYGAKCiMjIyBHcmFkbGUgdy8gY3VzdG9tIHRhc2sKCkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIEdyYWRsZSB0YXNrIHdpdGggY29kZSBnZW5lcmF0ZWQgdG8gdGhlIGBidWlsZC9nZW5lcmF0ZWRgIGRpcmVjdG9yeSwgYW5kIGV4ZWN1dGlvbiBsaW5rZWQgdG8gdGhlIGNvbXBpbGUgdGFzay4gCgpgYGBrb3RsaW4KdmFsIGZhYnJpa3Q6IENvbmZpZ3VyYXRpb24gYnkgY29uZmlndXJhdGlvbnMuY3JlYXRpbmcKCnZhbCBnZW5lcmF0aW9uRGlyID0gIiRidWlsZERpci9nZW5lcmF0ZWQiCnZhbCBhcGlGaWxlID0gIiRidWlsZERpci9wYXRoLXRvLWFwaS9vcGVuLWFwaS55YW1sIgoKc291cmNlU2V0cyB7CiAgICBtYWluIHsgamF2YS5zcmNEaXJzKCIkZ2VuZXJhdGlvbkRpci9zcmMvbWFpbi9rb3RsaW4iKSB9CiAgICB0ZXN0IHsgamF2YS5zcmNEaXJzKCIkZ2VuZXJhdGlvbkRpci9zcmMvdGVzdC9rb3RsaW4iKSB9CiAgICAuLi4KfQoKdGFza3MgeyAgIAogICAgLi4uCiAgICB2YWwgZ2VuZXJhdGVDb2RlIGJ5IGNyZWF0aW5nKEphdmFFeGVjOjpjbGFzcykgewogICAgICAgIGlucHV0cy5maWxlcyhhcGlGaWxlKQogICAgICAgIG91dHB1dHMuZGlyKGdlbmVyYXRpb25EaXIpCiAgICAgICAgb3V0cHV0cy5jYWNoZUlmIHsgdHJ1ZSB9CiAgICAgICAgY2xhc3NwYXRoKGZhYnJpa3QpCiAgICAgICAgbWFpbkNsYXNzLnNldCgiY29tLmNqYm9vbXMuZmFicmlrdC5jbGkuQ29kZUdlbiIpCiAgICAgICAgYXJncyA9IGxpc3RPZigKICAgICAgICAgICAgIi0tb3V0cHV0LWRpcmVjdG9yeSIsIGdlbmVyYXRpb25EaXIsCiAgICAgICAgICAgICItLWJhc2UtcGFja2FnZSIsICJjb20uZXhhbXBsZSIsCiAgICAgICAgICAgICItLWFwaS1maWxlIiwgYXBpRmlsZSwKICAgICAgICAgICAgIi0tdGFyZ2V0cyIsICJodHRwX21vZGVscyIsCiAgICAgICAgICAgICItLXRhcmdldHMiLCAiY2xpZW50IiwKICAgICAgICAgICAgIi0taHR0cC1jbGllbnQtb3B0cyIsICJyZXNpbGllbmNlNGoiCiAgICAgICAgKQogICAgfQogICAgd2l0aFR5cGU8b3JnLmpldGJyYWlucy5rb3RsaW4uZ3JhZGxlLnRhc2tzLktvdGxpbkNvbXBpbGU+IHsKICAgICAgICBrb3RsaW5PcHRpb25zLmp2bVRhcmdldCA9ICIxNyIKICAgICAgICBkZXBlbmRzT24oZ2VuZXJhdGVDb2RlKQogICAgfQp9CgpkZXBlbmRlbmNpZXMgewogICAgIGZhYnJpa3QoImNvbS5jamJvb21zOmZhYnJpa3Q6KyIpIC8vIFRoaXMgc2hvdWxkIGJlIHBpbm5lZCAgCiAgICAgLi4uCn0KYGBgCgojIyMgR3JhZGxlIHcvIHBsdWdpbgoKVGhlIFtGYWJyaWt0IEdyYWRsZSBwbHVnaW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9hY2FuZGEvZmFicmlrdC1ncmFkbGUtcGx1Z2luKSBzZXJ2ZXMgYXMgYSBjb252ZW5pZW50IHdyYXBwZXIgZm9yIEZhYnJpa3QsIAphbGxvd2luZyBzZWFtbGVzcyBpbnRlZ3JhdGlvbiBvZiBjb2RlIGdlbmVyYXRpb24gaW50byBhIEdyYWRsZSBidWlsZC4KCioqTm90ZToqKiBTaW5jZSB0aGUgcGx1Z2luIGlzIG1haW50YWluZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBGYWJyaWt0IGxpYnJhcnksIHBsZWFzZSByZWZlciB0byB0aGUKW0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9hY2FuZGEvZmFicmlrdC1ncmFkbGUtcGx1Z2luP3RhYj1yZWFkbWUtb3YtZmlsZSNjb25maWd1cmF0aW9uKSBzZWN0aW9uIG9mIHRoZSAKcGx1Z2luJ3MgUkVBRE1FIGZvciB0aGUgbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgaXQuCgpMYXRlc3QgdmVyc2lvbiBvZiB0aGUgcGx1Z2luOiBbIVtHcmFkbGUgUGx1Z2luIFBvcnRhbCBWZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dyYWRsZS1wbHVnaW4tcG9ydGFsL3YvY2guYWNhbmRhLmdyYWRsZS5mYWJyaWt0P3N0eWxlPWZsYXQpXShodHRwczovL3BsdWdpbnMuZ3JhZGxlLm9yZy9wbHVnaW4vY2guYWNhbmRhLmdyYWRsZS5mYWJyaWt0KQoKYGBga290bGluCnBsdWdpbnMgewogICAgLy8gZmluZCBsYXRlc3QgdmVyc2lvbjogaHR0cHM6Ly9naXRodWIuY29tL2FjYW5kYS9mYWJyaWt0LWdyYWRsZS1wbHVnaW4vcmVsZWFzZXMKICAgIGlkKCJjaC5hY2FuZGEuZ3JhZGxlLmZhYnJpa3QiKSB2ZXJzaW9uICIxLjkuMCIKfQoKZmFicmlrdCB7CiAgICBnZW5lcmF0ZSgiZG9nIikgewogICAgICAgIGFwaUZpbGUgPSBmaWxlKCJzcmMvbWFpbi9vcGVuYXBpL2RvZy55YW1sIikKICAgICAgICBiYXNlUGFja2FnZSA9ICJjb20uZXhhbXBsZS5hcGkiCiAgICB9Cn0KYGBgCgojIyMgTWF2ZW4KClRoZSBbZXhlYy1tYXZlbi1wbHVnaW5dKGh0dHA6Ly93d3cubW9qb2hhdXMub3JnL2V4ZWMtbWF2ZW4tcGx1Z2luL2V4YW1wbGVzL2V4YW1wbGUtZXhlYy11c2luZy1wbHVnaW4tZGVwZW5kZW5jaWVzLmh0bWwpIGlzIGNhcGFibGUgb2YgZG93bmxvYWRpbmcgdGhlIEZhYnJpa3QgbGlicmFyeSBmcm9tIE1hdmVuIENlbnRyYWwgYW5kIGV4ZWN1dGluZyBpdHMgbWFpbiBtZXRob2Qgd2l0aCBkZWZpbmVkIGFyZ3VtZW50cy4KCiMjIEdldHRpbmcgdGhlIE1vc3QgZnJvbSBGYWJyaWt0CgojIyMgMS4gUHJlZmVyIGNvbXBvbmVudHMgdG8gaW5saW5lIHNjaGVtYXMKV2hpbGUgaW5saW5lIHNjaGVtYXMgYXJlIHBlcmZlY3RseSB2YWxpZCB0aGV5IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IEZhYnJpa3QgaW4gYWxsIGNpcmN1bXN0YW5jZXMuClRoaXMgaXMgZXNwZWNpYWxseSB0cnVlIGZvciByZXF1ZXN0IGJvZGllcyBhbmQgbm9uLXRyaXZpYWwgcGFyYW1ldGVycy4gSW5zdGVhZCwgZGVmaW5lIHlvdXIgc2NoZW1hcyBpbiB0aGUKY29tcG9uZW50cyBzZWN0aW9uIG9mIHRoZSBPcGVuQVBJIHNwZWMgKGBjb21wb25lbnRzLnBhcmFtZXRlcnNgICYgYGNvbXBvbmVudHMucmVxdWVzdEJvZGllc2ApLiBbIzIwXShodHRwczovL2dpdGh1Yi5jb20vY2pib29tcy9mYWJyaWt0L2lzc3Vlcy8yMCksIFsjMTg3XShodHRwczovL2dpdGh1Yi5jb20vY2pib29tcy9mYWJyaWt0L2lzc3Vlcy8xODcpCgojIyMgMi4gVXNlIGBvbmVPZmAgd2l0aCBkaXNjcmltaW5hdG9yIGZvciBwb2x5bW9ycGhpc20KYG9uZU9mYCBhbG9uZyB3aXRoIHRoZSBmbGFnIGBTRUFMRURfSU5URVJGQUNFU19GT1JfT05FX09GYCB3aWxsIGdlbmVyYXRlIHBvbHltb3JwaGljIG1vZGVscyB3aXRoIHNlYWxlZCBpbnRlcmZhY2VzLgpUaGUgYGRpc2NyaW1pbmF0b3JgIHByb3BlcnR5IGlzIHVzZWQgYnkgRmFicmlrdCB0byBkZXRlcm1pbmUgdGhlIHN1YnR5cGVzIHRvIGJlIGdlbmVyYXRlZC4KCiMjIENvbmZpZ3VyYXRpb24gT3B0aW9ucwoKVGhpcyBzZWN0aW9uIGRvY3VtZW50cyB0aGUgYXZhaWxhYmxlIENMSSBwYXJhbWV0ZXJzIGZvciBjb250cm9sbGluZyB3aGF0IGdldHMgZ2VuZXJhdGVkLiBUaGlzIGRvY3VtZW50YXRpb24gaXMgZ2VuZXJhdGVkIHVzaW5nOiBgLi9ncmFkbGV3IHByaW50Q29kZUdlblVzYWdlYAoKfCBQYXJhbWV0ZXIgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uIHwKfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKfCAgIGAtLWFwaS1maWxlYCAgICAgICAgICAgICAgICB8IFRoaXMgbXVzdCBiZSBhIHZhbGlkIE9wZW4gQVBJIHYzIHNwZWMuIEFsbCBjb2RlIGdlbmVyYXRpb24gd2lsbCBiZSBiYXNlZCBvZmYgdGhpcyBpbnB1dC4gfAp8ICAgYC0tYXBpLWZyYWdtZW50YCAgICAgICAgICAgIHwgQSBwYXJ0aWFsIE9wZW4gQVBJIHYzIGZyYWdtZW50LCB0byBiZSBjb21iaW5lZCB3aXRoIHRoZSBwcmltYXJ5IEFQSSBmb3IgY29kZSBnZW5lcmF0aW9uIHB1cnBvc2VzLiB8CnwgKiBgLS1iYXNlLXBhY2thZ2VgICAgICAgICAgICAgfCBUaGUgYmFzZSBwYWNrYWdlIHdoaWNoIGFsbCBjb2RlIHdpbGwgYmUgZ2VuZXJhdGVkIHVuZGVyLiB8CnwgICBgLS1leHRlcm5hbC1yZWYtcmVzb2x1dGlvbmAgfCBTcGVjaWZ5IHRvIHdoaWNoIGRlZ3JlZSByZWZlcmVuY2VkIHNjaGVtYXMgZnJvbSBleHRlcm5hbCBmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbW9kZWwgZ2VuZXJhdGlvbi4gRGVmYXVsdDogVEFSR0VURUQgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ0hPT1NFIE9ORSBPRjogfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgVEFSR0VURURgIC0gR2VuZXJhdGUgbW9kZWxzIG9ubHkgZm9yIGRpcmVjdGx5IHJlZmVyZW5jZWQgc2NoZW1hcyBpbiBleHRlcm5hbCBBUEkgZmlsZXMuIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYEFHR1JFU1NJVkVgIC0gUmVmZXJlbmNpbmcgYW55IHNjaGVtYSBpbiBhbiBleHRlcm5hbCBBUEkgZmlsZSB0cmlnZ2VycyBnZW5lcmF0aW9uIG9mIGV2ZXJ5IGV4dGVybmFsIHNjaGVtYSBpbiB0aGF0IGZpbGUuIHwKfCAgIGAtLWh0dHAtY2xpZW50LW9wdHNgICAgICAgICB8IFNlbGVjdCB0aGUgb3B0aW9ucyBmb3IgdGhlIGh0dHAgY2xpZW50IGNvZGUgdGhhdCB5b3Ugd2FudCB0byBiZSBnZW5lcmF0ZWQuIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENIT09TRSBBTlkgT0Y6IHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYFJFU0lMSUVOQ0U0SmAgLSBHZW5lcmF0ZXMgYSBmYXVsdCB0b2xlcmFuY2Ugc2VydmljZSBmb3IgdGhlIGNsaWVudCB1c2luZyB0aGUgZm9sbG93aW5nIGxpYnJhcnkgImlvLmdpdGh1Yi5yZXNpbGllbmNlNGo6cmVzaWxpZW5jZTRqLWFsbDorIiAob25seSBmb3IgT2tIdHRwIGNsaWVudHMpIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYFNVU1BFTkRfTU9ESUZJRVJgIC0gVGhpcyBvcHRpb24gYWRkcyB0aGUgc3VzcGVuZCBtb2RpZmllciB0byB0aGUgZ2VuZXJhdGVkIGNsaWVudCBmdW5jdGlvbnMgKG9ubHkgZm9yIE9wZW5GZWlnbiBjbGllbnRzKSB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBTUFJJTkdfUkVTUE9OU0VfRU5USVRZX1dSQVBQRVJgIC0gVGhpcyBvcHRpb24gYWRkcyB0aGUgU3ByaW5nLVJlc3BvbnNlRW50aXR5IGdlbmVyaWMgYXJvdW5kIHRoZSByZXNwb25zZSB0byBiZSBhYmxlIHRvIGdldCByZXNwb25zZSBoZWFkZXJzIGFuZCBzdGF0dXMgKG9ubHkgZm9yIE9wZW5GZWlnbiBjbGllbnRzKS4gfAp8ICAgYC0taHR0cC1jbGllbnQtdGFyZ2V0YCAgICAgIHwgT3B0aW9uYWxseSBzZWxlY3QgdGhlIHRhcmdldCBjbGllbnQgdGhhdCB5b3Ugd2FudCB0byBiZSBnZW5lcmF0ZWQuIERlZmF1bHRzIHRvIE9LX0hUVFAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ0hPT1NFIE9ORSBPRjogfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgT0tfSFRUUGAgLSBHZW5lcmF0ZSBPa0h0dHAgY2xpZW50LiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBPUEVOX0ZFSUdOYCAtIEdlbmVyYXRlIE9wZW5GZWlnbiBjbGllbnQuIHwKfCAgIGAtLWh0dHAtY29udHJvbGxlci1vcHRzYCAgICB8IFNlbGVjdCB0aGUgb3B0aW9ucyBmb3IgdGhlIGNvbnRyb2xsZXJzIHRoYXQgeW91IHdhbnQgdG8gYmUgZ2VuZXJhdGVkLiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDSE9PU0UgQU5ZIE9GOiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBTVVNQRU5EX01PRElGSUVSYCAtIFRoaXMgb3B0aW9uIGFkZHMgdGhlIHN1c3BlbmQgbW9kaWZpZXIgdG8gdGhlIGdlbmVyYXRlZCBjb250cm9sbGVyIGZ1bmN0aW9ucyB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBBVVRIRU5USUNBVElPTmAgLSBUaGlzIG9wdGlvbiBhZGRzIHRoZSBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXIgdG8gdGhlIGdlbmVyYXRlZCBjb250cm9sbGVyIGZ1bmN0aW9ucyB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBDT01QTEVUSU9OX1NUQUdFYCAtIFRoaXMgb3B0aW9uIG1ha2VzIGdlbmVyYXRlZCBjb250cm9sbGVyIGZ1bmN0aW9ucyBoYXZlIFR5cGUgQ29tcGxldGlvblN0YWdlPFQ+ICh3b3JrcyBvbmx5IHdpdGggU3ByaW5nIENvbnRyb2xsZXIgZ2VuZXJhdG9yKSB8CnwgICBgLS1odHRwLWNvbnRyb2xsZXItdGFyZ2V0YCAgfCBPcHRpb25hbGx5IHNlbGVjdCB0aGUgdGFyZ2V0IGZyYW1ld29yayBmb3IgdGhlIGNvbnRyb2xsZXJzIHRoYXQgeW91IHdhbnQgdG8gYmUgZ2VuZXJhdGVkLiBEZWZhdWx0cyB0byBTcHJpbmcgQ29udHJvbGxlcnMgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ0hPT1NFIE9ORSBPRjogfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgU1BSSU5HYCAtIEdlbmVyYXRlIGZvciBTcHJpbmcgZnJhbWV3b3JrLiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBNSUNST05BVVRgIC0gR2VuZXJhdGUgZm9yIE1pY3JvbmF1dCBmcmFtZXdvcmsuIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYEtUT1JgIC0gR2VuZXJhdGUgZm9yIEt0b3Igc2VydmVyLiB8CnwgICBgLS1odHRwLW1vZGVsLW9wdHNgICAgICAgICAgfCBTZWxlY3QgdGhlIG9wdGlvbnMgZm9yIHRoZSBodHRwIG1vZGVscyB0aGF0IHlvdSB3YW50IHRvIGJlIGdlbmVyYXRlZC4gfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ0hPT1NFIEFOWSBPRjogfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgWF9FWFRFTlNJQkxFX0VOVU1TYCAtIFRoaXMgb3B0aW9uIHRyZWF0cyB4LWV4dGVuc2libGUtZW51bXMgYXMgZW51bXMgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgSkFWQV9TRVJJQUxJWkFUSU9OYCAtIFRoaXMgb3B0aW9uIGFkZHMgSmF2YSBTZXJpYWxpemFibGUgaW50ZXJmYWNlIHRvIHRoZSBnZW5lcmF0ZWQgbW9kZWxzIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYFFVQVJLVVNfUkVGTEVDVElPTmAgLSBUaGlzIG9wdGlvbiBhZGRzIEBSZWdpc3RlckZvclJlZmxlY3Rpb24gdG8gdGhlIGdlbmVyYXRlZCBtb2RlbHMuIFJlcXVpcmVzIGRlcGVuZGVuY3kgIidpby5xdWFya3VzOnF1YXJrdXMtY29yZTorIiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBNSUNST05BVVRfSU5UUk9TUEVDVElPTmAgLSBUaGlzIG9wdGlvbiBhZGRzIEBJbnRyb3NwZWN0ZWQgdG8gdGhlIGdlbmVyYXRlZCBtb2RlbHMuIFJlcXVpcmVzIGRlcGVuZGVuY3kgIidpby5taWNyb25hdXQ6bWljcm9uYXV0LWNvcmU6KyIgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgTUlDUk9OQVVUX1JFRkxFQ1RJT05gIC0gVGhpcyBvcHRpb24gYWRkcyBAUmVmbGVjdGl2ZUFjY2VzcyB0byB0aGUgZ2VuZXJhdGVkIG1vZGVscy4gUmVxdWlyZXMgZGVwZW5kZW5jeSAiJ2lvLm1pY3JvbmF1dDptaWNyb25hdXQtY29yZTorIiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBJTkNMVURFX0NPTVBBTklPTl9PQkpFQ1RgIC0gVGhpcyBvcHRpb24gYWRkcyBhIGNvbXBhbmlvbiBvYmplY3QgdG8gdGhlIGdlbmVyYXRlZCBtb2RlbHMuIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYFNFQUxFRF9JTlRFUkZBQ0VTX0ZPUl9PTkVfT0ZgIC0gVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgZ2VuZXJhdGlvbiBvZiBpbnRlcmZhY2VzIGZvciBkaXNjcmltaW5hdGVkIG9uZU9mIHR5cGVzIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYE5PTl9OVUxMX01BUF9WQUxVRVNgIC0gVGhpcyBvcHRpb24gbWFrZXMgbWFwIHZhbHVlcyBub24tbnVsbC4gVGhlIGRlZmF1bHQgKHNpbmNlIHYxNSkgYW5kIG1vc3Qgc3BlYyBjb21wbGlhbnQgaXMgbWFrZSBtYXAgdmFsdWVzIG51bGxhYmxlIHwKfCAgIGAtLWh0dHAtbW9kZWwtc3VmZml4YCAgICAgICB8IFNwZWNpZnkgY3VzdG9tIHN1ZmZpeCBmb3IgYWxsIGdlbmVyYXRlZCBtb2RlbCBjbGFzc2VzLiBEZWZhdWx0cyB0byBubyBzdWZmaXguIHwKfCAgIGAtLW91dHB1dC1kaXJlY3RvcnlgICAgICAgICB8IEFsbG93cyB0aGUgZ2VuZXJhdGlvbiBkaXIgdG8gYmUgb3ZlcnJpZGRlbi4gRGVmYXVsdHMgdG8gY3VycmVudCBkaXIgfAp8ICAgYC0tcmVzb3VyY2VzLXBhdGhgICAgICAgICAgIHwgQWxsb3dzIHRoZSBwYXRoIGZvciBnZW5lcmF0ZWQgcmVzb3VyY2VzIHRvIGJlIG92ZXJyaWRkZW4uIERlZmF1bHRzIHRvIGBzcmMvbWFpbi9yZXNvdXJjZXNgIHwKfCAgIGAtLXNlcmlhbGl6YXRpb24tbGlicmFyeWAgICB8IFNwZWNpZnkgd2hpY2ggc2VyaWFsaXphdGlvbiBsaWJyYXJ5IHRvIHVzZSBmb3IgYW5ub3RhdGlvbnMgaW4gZ2VuZXJhdGVkIG1vZGVsIGNsYXNzZXMuIERlZmF1bHQ6IEpBQ0tTT04gfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ0hPT1NFIE9ORSBPRjogfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgSkFDS1NPTmAgLSBVc2UgSmFja3NvbiBmb3Igc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYEtPVExJTlhfU0VSSUFMSVpBVElPTmAgLSBVc2Uga290bGlueC5zZXJpYWxpemF0aW9uIGZvciBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24gfAp8ICAgYC0tc3JjLXBhdGhgICAgICAgICAgICAgICAgIHwgQWxsb3dzIHRoZSBwYXRoIGZvciBnZW5lcmF0ZWQgc291cmNlIGZpbGVzIHRvIGJlIG92ZXJyaWRkZW4uIERlZmF1bHRzIHRvIGBzcmMvbWFpbi9rb3RsaW5gIHwKfCAgIGAtLXRhcmdldHNgICAgICAgICAgICAgICAgICB8IFRhcmdldHMgYXJlIHRoZSBwYXJ0cyBvZiB0aGUgYXBwbGljYXRpb24gdGhhdCB5b3Ugd2FudCB0byBiZSBnZW5lcmF0ZWQuIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENIT09TRSBBTlkgT0Y6IHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYEhUVFBfTU9ERUxTYCAtIEphY2tzb24gYW5ub3RhdGVkIGRhdGEgY2xhc3NlcyB0byByZXByZXNlbnQgdGhlIHNjaGVtYSBvYmplY3RzIGRlZmluZWQgaW4gdGhlIGlucHV0LiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBDT05UUk9MTEVSU2AgLSBTcHJpbmcgLyBNaWNyb25hdXQgLyBLdG9yIEhUVFAgY29udHJvbGxlcnMgZm9yIGVhY2ggb2YgdGhlIGVuZHBvaW50cyBkZWZpbmVkIGluIHRoZSBpbnB1dC4gfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgQ0xJRU5UYCAtIFNpbXBsZSBodHRwIHJlc3QgY2xpZW50LiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBRVUFSS1VTX1JFRkxFQ1RJT05fQ09ORklHYCAtIFRoaXMgb3B0aW9ucyBnZW5lcmF0ZXMgdGhlIHJlZmxlY3Rpb24tY29uZmlnLmpzb24gZmlsZSBmb3IgcXVhcmt1cyBpbnRlZ3JhdGlvbiBwcm9qZWN0cyB8CnwgICBgLS10eXBlLW92ZXJyaWRlc2AgICAgICAgICAgfCBTcGVjaWZ5IG5vbi1kZWZhdWx0IGtvdGxpbiB0eXBlcyBmb3IgY2VydGFpbiBPQVMgdHlwZXMuIEZvciBleGFtcGxlLCBnZW5lcmF0ZSBgSW5zdGFudGAgaW5zdGVhZCBvZiBgT2Zmc2V0RGF0ZVRpbWVgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENIT09TRSBBTlkgT0Y6IHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYERBVEVUSU1FX0FTX0lOU1RBTlRgIC0gVXNlIGBJbnN0YW50YCBhcyB0aGUgZGF0ZXRpbWUgdHlwZS4gRGVmYXVsdHMgdG8gYE9mZnNldERhdGVUaW1lYCB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBEQVRFVElNRV9BU19MT0NBTERBVEVUSU1FYCAtIFVzZSBgTG9jYWxEYXRlVGltZWAgYXMgdGhlIGRhdGV0aW1lIHR5cGUuIERlZmF1bHRzIHRvIGBPZmZzZXREYXRlVGltZWAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgQllURUFSUkFZX0FTX0lOUFVUU1RSRUFNYCAtIFVzZSBgSW5wdXRTdHJlYW1gIGFzIEJ5dGVBcnJheSB0eXBlLiBEZWZhdWx0cyB0byBgQnl0ZUFycmF5YCB8CnwgICBgLS12YWxpZGF0aW9uLWxpYnJhcnlgICAgICAgfCBTcGVjaWZ5IHdoaWNoIHZhbGlkYXRpb24gbGlicmFyeSB0byB1c2UgZm9yIGFubm90YXRpb25zIGluIGdlbmVyYXRlZCBtb2RlbCBjbGFzc2VzLiBEZWZhdWx0OiBKQVZBWF9WQUxJREFUSU9OIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENIT09TRSBPTkUgT0Y6IHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYEpBVkFYX1ZBTElEQVRJT05gIC0gVXNlIGBqYXZheC52YWxpZGF0aW9uYCBhbm5vdGF0aW9ucyBpbiBnZW5lcmF0ZWQgbW9kZWwgY2xhc3NlcyAoZGVmYXVsdCkgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgSkFLQVJUQV9WQUxJREFUSU9OYCAtIFVzZSBgamFrYXJ0YS52YWxpZGF0aW9uYCBhbm5vdGF0aW9ucyBpbiBnZW5lcmF0ZWQgbW9kZWwgY2xhc3NlcyB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBOT19WQUxJREFUSU9OYCAtIFVzZSBubyB2YWxpZGF0aW9uIGFubm90YXRpb25zIGluIGdlbmVyYXRlZCBtb2RlbCBjbGFzc2VzIHwKCiMjIEJ1aWxkaW5nIExvY2FsbHkKCkZhYnJpa3QgaXMgYnVpbHQgd2l0aCBHcmFkbGUgYW5kIHJlcXVpcmVzIGFuIGluaXRpYWxpc2VkIGdpdCByZXBvc2l0b3J5LiBUaGUgZWFzaWVzdCB3YXkgdG8gYnVpbGQgaXQgaXMgdG8gY2xvbmUgdGhlIHJlcG8gbG9jYWxseSBiZWZvcmUgZXhlY3V0aW5nIHRoZSBidWlsZCBjb21tYW5kOgpgYGAKZ2l0IGNsb25lIGdpdEBnaXRodWIuY29tOmNqYm9vbXMvZmFicmlrdC5naXQKY2QgZmFicmlrdC8KLi9ncmFkbGV3IGNsZWFuIGJ1aWxkCmBgYAoKIyMgUHVibGlzaGluZwpUaGlzIGxpYnJhcnkgaXMgcHVibGlzaGVkIHRvIFtTb25hdHlwZSdzIE9TU10oaHR0cHM6Ly9zMDEub3NzLnNvbmF0eXBlLm9yZy8jd2VsY29tZSkgc3RhZ2luZyByZXBvc2l0b3J5IHVzaW5nIEdpdGh1YiBhY3Rpb25zIHdoZW4gYSByZWxlYXNlIGlzIGRyYWZ0ZWQuIEl0IGNhbiBiZSBtYW51YWxseSBwcm9tb3RlZCBmcm9tIHRoZXJlIHRvIHRoZSByZWxlYXNlIHJlcG9zaXRvcnkgd2hpY2ggaXMgaW5kZXhlZCBieSBNYXZlbiBDZW50cmFsLgoKIyMgU3BlY2lmaWMgRmVhdHVyZXMKCiMjIyBQb2x5bW9ycGhpc20gdmlhIGBhbGxPZmAKClRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgYGFsbE9mYCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBwb2x5bW9ycGhpYyBLb3RsaW4gZGF0YSBjbGFzc2VzLiBJdCBkb2VzIHRoZSBmb2xsb3dpbmc6Ci0gQSBgQ2hpbGREZWZpbml0aW9uYCBzY2hlbWEgZGVmaW5lcyBib3RoIHRoZSBkaXNjcmltaW5hdG9yIG1hcHBpbmcgZGV0YWlscyBhbmQgdGhlIHNjaGVtYSBmb3IgdGhlIGRpc2NyaW1pbmF0b3IgcHJvcGVydHkuIEluIHRoaXMgY2FzZSB0aGUgZGlzY3JpbWluYXRvciBwcm9wZXJ0eSBpcyBhbiBlbnVtZXJhdGlvbgotIEluIGVhY2ggY2hpbGQgc2NoZW1hLCBgYWxsT2ZgIGlzIHVzZWQgdG8gbWVyZ2UgdGhlIGBDaGlsZERlZmluaXRpb25gIHdpdGggdGhlIGNoaWxkJ3MgY3VzdG9tIHNjaGVtYS4gVGhpcyBndWFyYW50ZWVzIHRoYXQgZWFjaCBjaGlsZCBzY2hlbWEgaW5oZXJpdHMgdGhlIGNvcnJlY3QgZGlzY3JpbWluYXRvciBwcm9wZXJ0eS4KLSBJbiB0aGUgYFJlc3BvbnNlc2Agc2NoZW1hIGEgYG9uZU9mYCBsaXN0cyBvbmx5IGNoaWxkIHNjaGVtYXMuIFRoaXMgd2lsbCBiZSBkZXRlY3RlZCBieSBGYWJyaWt0IGFuZCBpdCB3aWxsIGdlbmVyYXRlIHRoZSBsaXN0IG9mIHBhcmVudCB0eXBlczogYExpc3Q8Q2hpbGREZWZpbml0aW9uPmAKCl9OT1RFOiBBIG5ldyBmZWF0dXJlIGhhcyBiZWVuIGFkZGVkIHRoYXQgYWxsb3dzIFBvbHltb3JwaGlzbSB0byBiZSBhY2hpZXZlZCB1c2luZyBvbmx5IGEgW2Rpc2NyaW1pbmF0ZWQgb25lT2ZdKHNyYy90ZXN0L3Jlc291cmNlcy9leGFtcGxlcy9kaXNjcmltaW5hdGVkT25lT2YpLiBUaGlzIGZlYXR1cmUgbWFrZXMgdXNlIG9mIEtvdGxpbiBgc2VhbGVkIGludGVyZmFjZWAgYW5kIG11c3QgYmUgZXhwbGljaXRseSBlbmFibGVkIHZpYSBgLS1odHRwLW1vZGVsLW9wdHMsIFNFQUxFRF9JTlRFUkZBQ0VTX0ZPUl9PTkVfT0ZgXwoKYGBgeW1sCm9wZW5hcGk6IDMuMC4wCmNvbXBvbmVudHM6CiAgc2NoZW1hczoKICAgIENoaWxkRGVmaW5pdGlvbjoKICAgICAgdHlwZTogb2JqZWN0CiAgICAgIGRpc2NyaW1pbmF0b3I6CiAgICAgICAgcHJvcGVydHlOYW1lOiBzb21lX2VudW0KICAgICAgICBtYXBwaW5nOgogICAgICAgICAgb2JqX29uZV9vbmx5OiAnIy9jb21wb25lbnRzL3NjaGVtYXMvRGlzY3JpbWluYXRlZENoaWxkMScKICAgICAgICAgIG9ial90d29fZmlyc3Q6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9EaXNjcmltaW5hdGVkQ2hpbGQyJwogICAgICAgICAgb2JqX3R3b19zZWNvbmQ6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9EaXNjcmltaW5hdGVkQ2hpbGQyJwogICAgICAgICAgb2JqX3RocmVlOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvZGlzY3JpbWluYXRlZF9jaGlsZF8zJwogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIGRpc2NyaW1pbmF0aW5nX3Byb3BlcnR5OgogICAgICAgICAgJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL0NoaWxkRGlzY3JpbWluYXRvcicKCiAgICBDaGlsZERpc2NyaW1pbmF0b3I6CiAgICAgIHR5cGU6IHN0cmluZwogICAgICBlbnVtOgogICAgICAgIC0gb2JqX29uZV9vbmx5CiAgICAgICAgLSBvYmpfdHdvX2ZpcnN0CiAgICAgICAgLSBvYmpfdHdvX3NlY29uZAogICAgICAgIC0gb2JqX3RocmVlCgogICAgRGlzY3JpbWluYXRlZENoaWxkMToKICAgICAgYWxsT2Y6CiAgICAgICAgLSAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvQ2hpbGREZWZpbml0aW9uJwogICAgICAgIC0gdHlwZTogb2JqZWN0CiAgICAgICAgICBwcm9wZXJ0aWVzOgogICAgICAgICAgICBzb21lX3Byb3A6CiAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCgogICAgRGlzY3JpbWluYXRlZENoaWxkMjoKICAgICAgYWxsT2Y6CiAgICAgICAgLSAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvQ2hpbGREZWZpbml0aW9uJwogICAgICAgIC0gdHlwZTogb2JqZWN0CiAgICAgICAgICBwcm9wZXJ0aWVzOgogICAgICAgICAgICBzb21lX3Byb3A6CiAgICAgICAgICAgICAgdHlwZTogc3RyaW5nCgogICAgZGlzY3JpbWluYXRlZF9jaGlsZF8zOgogICAgICBhbGxPZjoKICAgICAgICAtICRyZWY6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9DaGlsZERlZmluaXRpb24nCgogICAgUmVzcG9uc2VzOgogICAgICB0eXBlOiAib2JqZWN0IgogICAgICBwcm9wZXJ0aWVzOgogICAgICAgIGVudHJpZXM6CiAgICAgICAgICB0eXBlOiAiYXJyYXkiCiAgICAgICAgICBpdGVtczoKICAgICAgICAgICAgb25lT2Y6CiAgICAgICAgICAgICAgLSAkcmVmOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvRGlzY3JpbWluYXRlZENoaWxkMiIKICAgICAgICAgICAgICAtICRyZWY6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9EaXNjcmltaW5hdGVkQ2hpbGQyIgogICAgICAgICAgICAgIC0gJHJlZjogIiMvY29tcG9uZW50cy9zY2hlbWFzL2Rpc2NyaW1pbmF0ZWRfY2hpbGRfMyIKYGBgCmBgYGtvdGxpbgpASnNvblR5cGVJbmZvKAogICAgdXNlID0gSnNvblR5cGVJbmZvLklkLk5BTUUsCiAgICBpbmNsdWRlID0gSnNvblR5cGVJbmZvLkFzLkVYSVNUSU5HX1BST1BFUlRZLAogICAgcHJvcGVydHkgPSAic29tZV9lbnVtIiwKICAgIHZpc2libGUgPSB0cnVlCikKQEpzb25TdWJUeXBlcygKICAgIEpzb25TdWJUeXBlcy5UeXBlKAogICAgICAgIHZhbHVlID0gRGlzY3JpbWluYXRlZENoaWxkMTo6Y2xhc3MsCiAgICAgICAgbmFtZSA9CiAgICAgICAgIm9ial9vbmVfb25seSIKICAgICksCiAgICBKc29uU3ViVHlwZXMuVHlwZSgKICAgICAgICB2YWx1ZSA9IERpc2NyaW1pbmF0ZWRDaGlsZDI6OmNsYXNzLAogICAgICAgIG5hbWUgPQogICAgICAgICJvYmpfdHdvX2ZpcnN0IgogICAgKSwKICAgIEpzb25TdWJUeXBlcy5UeXBlKAogICAgICAgIHZhbHVlID0gRGlzY3JpbWluYXRlZENoaWxkMjo6Y2xhc3MsCiAgICAgICAgbmFtZSA9CiAgICAgICAgIm9ial90d29fc2Vjb25kIgogICAgKSwKICAgIEpzb25TdWJUeXBlcy5UeXBlKHZhbHVlID0gRGlzY3JpbWluYXRlZENoaWxkMzo6Y2xhc3MsIG5hbWUgPSAib2JqX3RocmVlIikKKQpzZWFsZWQgY2xhc3MgQ2hpbGREZWZpbml0aW9uKCkgewogICAgYWJzdHJhY3QgdmFsIHNvbWVFbnVtOiBDaGlsZERpc2NyaW1pbmF0b3IKfQoKZW51bSBjbGFzcyBDaGlsZERpc2NyaW1pbmF0b3IoCiAgICBASnNvblZhbHVlCiAgICB2YWwgdmFsdWU6IFN0cmluZwopIHsKICAgIE9CSl9PTkVfT05MWSgib2JqX29uZV9vbmx5IiksCgogICAgT0JKX1RXT19GSVJTVCgib2JqX3R3b19maXJzdCIpLAoKICAgIE9CSl9UV09fU0VDT05EKCJvYmpfdHdvX3NlY29uZCIpLAoKICAgIE9CSl9USFJFRSgib2JqX3RocmVlIik7CgogICAgY29tcGFuaW9uIG9iamVjdCB7CiAgICAgICAgcHJpdmF0ZSB2YWwgbWFwcGluZzogTWFwPFN0cmluZywgQ2hpbGREaXNjcmltaW5hdG9yPiA9CiAgICAgICAgICAgIHZhbHVlcygpLmFzc29jaWF0ZUJ5KENoaWxkRGlzY3JpbWluYXRvcjo6dmFsdWUpCgogICAgICAgIGZ1biBmcm9tVmFsdWUodmFsdWU6IFN0cmluZyk6IENoaWxkRGlzY3JpbWluYXRvcj8gPSBtYXBwaW5nW3ZhbHVlXQogICAgfQp9CgpkYXRhIGNsYXNzIERpc2NyaW1pbmF0ZWRDaGlsZDEoCiAgICBAcGFyYW06SnNvblByb3BlcnR5KCJzb21lX3Byb3AiKQogICAgQGdldDpKc29uUHJvcGVydHkoInNvbWVfcHJvcCIpCiAgICB2YWwgc29tZVByb3A6IFN0cmluZz8gPSBudWxsLAogICAgQGdldDpKc29uUHJvcGVydHkoInNvbWVfZW51bSIpCiAgICBAZ2V0Ok5vdE51bGwKICAgIG92ZXJyaWRlIHZhbCBzb21lRW51bTogQ2hpbGREaXNjcmltaW5hdG9yID0gQ2hpbGREaXNjcmltaW5hdG9yLk9CSl9PTkVfT05MWQopIDogQ2hpbGREZWZpbml0aW9uKCkKCmRhdGEgY2xhc3MgRGlzY3JpbWluYXRlZENoaWxkMigKICAgIEBnZXQ6SnNvblByb3BlcnR5KCJzb21lX2VudW0iKQogICAgQGdldDpOb3ROdWxsCiAgICBvdmVycmlkZSB2YWwgc29tZUVudW06IENoaWxkRGlzY3JpbWluYXRvciwKICAgIEBwYXJhbTpKc29uUHJvcGVydHkoInNvbWVfcHJvcCIpCiAgICBAZ2V0Okpzb25Qcm9wZXJ0eSgic29tZV9wcm9wIikKICAgIHZhbCBzb21lUHJvcDogU3RyaW5nPyA9IG51bGwKKSA6IENoaWxkRGVmaW5pdGlvbigpCgpkYXRhIGNsYXNzIERpc2NyaW1pbmF0ZWRDaGlsZDMoCiAgICBAZ2V0Okpzb25Qcm9wZXJ0eSgic29tZV9lbnVtIikKICAgIEBnZXQ6Tm90TnVsbAogICAgb3ZlcnJpZGUgdmFsIHNvbWVFbnVtOiBDaGlsZERpc2NyaW1pbmF0b3IgPSBDaGlsZERpc2NyaW1pbmF0b3IuT0JKX1RIUkVFCikgOiBDaGlsZERlZmluaXRpb24oKQoKZGF0YSBjbGFzcyBSZXNwb25zZXMoCiAgICBAcGFyYW06SnNvblByb3BlcnR5KCJlbnRyaWVzIikKICAgIEBnZXQ6SnNvblByb3BlcnR5KCJlbnRyaWVzIikKICAgIEBnZXQ6VmFsaWQKICAgIHZhbCBlbnRyaWVzOiBMaXN0PENoaWxkRGVmaW5pdGlvbj4/ID0gbnVsbAopCmBgYAo=
- readmeEtag: '"196f359df95fe6b7cc4dc53c53ba32442cd5a7a7"'
- readmeLastModified: Sat, 21 Dec 2024 15:03:00 GMT
+ IyBGYWJyaWt0IGAvy4hmYS1icmlrdC9gIC0gS290bGluIGNvZGUgZnJvbSBPcGVuQVBJIDMKCiogW0ludHJvZHVjdGlvbl0oI2ludHJvZHVjdGlvbikKKiBbRmVhdHVyZXNdKCNmZWF0dXJlcykKKiBbRXhhbXBsZXNdKCNleGFtcGxlcykKKiBbVXNhZ2UgSW5zdHJ1Y3Rpb25zXSgjdXNhZ2UtaW5zdHJ1Y3Rpb25zKQogICogW0NvbW1hbmQgTGluZV0oI2NvbW1hbmQtbGluZSkKICAqIFtHcmFkbGUgdy8gY3VzdG9tIHRhc2tdKCNncmFkbGUtdy1jdXN0b20tdGFzaykKICAqIFtHcmFkbGUgdy8gcGx1Z2luXSgjZ3JhZGxlLXctcGx1Z2luKQogICogW01hdmVuXSgjbWF2ZW4pCiogW0dldHRpbmcgdGhlIE1vc3QgZnJvbSBGYWJyaWt0XSgjZ2V0dGluZy10aGUtbW9zdC1mcm9tLWZhYnJpa3QpCiogW0NvbmZpZ3VyYXRpb24gT3B0aW9uc10oI2NvbmZpZ3VyYXRpb24tb3B0aW9ucykKKiBbT3JpZ2luYWwgTW90aXZhdGlvbl0oI29yaWdpbmFsLW1vdGl2YXRpb24pCiogW0J1aWxkaW5nIExvY2FsbHldKCNidWlsZGluZy1sb2NhbGx5KQoqIFtQdWJsaXNoaW5nXSgjcHVibGlzaGluZykKKiBbU3BlY2lmaWMgRmVhdHVyZXNdKCNzcGVjaWZpYy1mZWF0dXJlcykKCiMjIEludHJvZHVjdGlvbgoKVGhpcyBsaWJyYXJ5IHdhcyBidWlsdCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgY29tcGxleCBtb2RlbGluZyBmZWF0dXJlcyBhdmFpbGFibGUgaW4gT3BlbkFQSSAzLiBJdCBnZW5lcmF0ZXMgS290bGluIGRhdGEgY2xhc3NlcyB3aXRoIGFkdmFuY2VkIHN1cHBvcnQgZm9yIGZlYXR1cmVzIHN1Y2ggYXM6IAogLSBOdWxsIFNhZmV0eQogLSBJbmxpbmVkIHNjaGVtYSBkZWZpbml0aW9ucwogLSBFbnVtZXJhdGlvbnMgCiAtIFNlYWxlZCBDbGFzc2VzCiAtIFBvbHltb3JwaGlzbSAoYEBKc29uU3ViVHlwZXNgKQogLSBNYXBzIG9mIE1hcHMgb2YgTWFwcwogLSBHcmFhbFZNIE5hdGl2ZSBSZWZsZWN0aW9uIFJlZ2lzdHJhdGlvbgogLSBKc29uIE1lcmdlIFBhdGNoICh2aWEgYEpzb25OdWxsYWJsZWApIChhZGQgYHgtanNvbi1tZXJnZS1wYXRjaDogdHJ1ZWAgdG8gc2NoZW1hcykKIC0gT3ZlcnJpZGUgSmFja3NvbiBJbmNsdWRlIE5vbk51bGwgKHZpYSBgSnNvbkluY2x1ZGVgKSAoYWRkIGB4LWphY2tzb24taW5jbHVkZS1ub24tbnVsbDogdHJ1ZWAgdG8gc2NoZW1hcykKIAphcyB3ZWxsIGFzIEhUVFAgY2xpZW50cyBhbmQgY29udHJvbGxlcnMgZm9yIGEgbnVtYmVyIG9mIHBvcHVsYXIgZnJhbWV3b3JrcyAoc2VlIFtGZWF0dXJlc10oI2ZlYXR1cmVzKSkuCgpNb3JlIHRoYW4ganVzdCBib290c3RyYXBwaW5nLCB0aGlzIGxpYnJhcnkgY2FuIGJlIHBlcm1hbmVudGx5IGludGVncmF0ZWQgaW50byB5b3VyIGJ1aWxkIHRvb2wgYW5kIHdpbGwgZW5zdXJlIGNvbnRyYWN0IGFuZCBjb2RlIGFsd2F5cyBtYXRjaCwgZXZlbiBhcyBBUElzIGV2b2x2ZSBpbiBjb21wbGV4aXR5LgoKIyMjIFRyeSBGYWJyaWt0IE9ubGluZQoKVHJ5IEZhYnJpa3Qgd2l0aCB5b3VyIG93biBBUEkgc3BlYyBpbiB0aGUgW0ZhYnJpa3QgUGxheWdyb3VuZF0oaHR0cHM6Ly9mYWJyaWt0LmZseS5kZXYpIGFuZCBzZWUgaG93IGl0IGNhbiBoZWxwIHlvdSBnZW5lcmF0ZSBjb2RlIGZvciB5b3VyIEFQSSBjbGllbnRzIGFuZCBzZXJ2ZXJzLgoKWyFbU2NyZWVuc2hvdCBvZiBGYWJyaWt0IFBsYXlncm91bmRdKGh0dHBzOi8vZ2l0aHViLmNvbS91c2VyLWF0dGFjaG1lbnRzL2Fzc2V0cy8zNGFjNmFmZi1mMjdlLTRmNDgtYmM1My1jYmIyYTAwZTNlNzgpXShodHRwczovL2ZhYnJpa3QuZmx5LmRldikKCiMjIyBDb29yZGluYXRlcwoKYGBgeG1sCjxkZXBlbmRlbmN5PgogIDxncm91cElkPmNvbS5jamJvb21zPC9ncm91cElkPgogIDxhcnRpZmFjdElkPmZhYnJpa3Q8L2FydGlmYWN0SWQ+CjwvZGVwZW5kZW5jeT4KYGBgCgojIyBGZWF0dXJlcwoKVGhlIGxpYnJhcnkgY3VycmVudGx5IGhhcyBzdXBwb3J0IGZvciBnZW5lcmF0aW5nOgoKKiBNb2RlbHMKICAqICoqSmFja3NvbioqIGFubm90YXRlZCAqKmRhdGEgY2xhc3NlcyoqCiAgKiAqKktvdGxpbnguc2VyaWFsaXphdGlvbioqIGFubm90YXRlZCAqKmRhdGEgY2xhc3NlcyoqCiogQ2xpZW50cwogICogKipPa0h0dHAgQ2xpZW50ICh3LyBKYWNrc29uIE1vZGVscykqKiAtIHdpdGggdGhlIG9wdGlvbiBmb3IgYSByZXNpbGllbmNlNGogZmF1bHQtdG9sZXJhbmNlIHdyYXBwZXIKICAqICoqT3BlbkZlaWduKiogYW5ub3RhdGVkIGNsaWVudCBpbnRlcmZhY2VzCiogQ29udHJvbGxlcnMKICAqICoqU3ByaW5nIE1WQyoqIGFubm90YXRlZCBjb250cm9sbGVyIGludGVyZmFjZXMKICAqICoqTWljcm9uYXV0KiogSFRUUCBhbm5vdGF0ZWQgY29udHJvbGxlciBpbnRlcmZhY2VzCiAgKiAqKkt0b3Igc2VydmVyKiogcm91dGVzIGFuZCBjb250cm9sbGVyIGludGVyZmFjZXMKCiMjIEV4YW1wbGVzCgpDb25zdWx0IHRlc3QgZGlyZWN0b3J5IGZvciBPcGVuQVBJIGNvZGUgZ2VuZXJhdGlvbiBleGFtcGxlcy4gCgpJdCBmb3JtcyBhIGxpdmluZyBkb2N1bWVudGF0aW9uIGZ1bGwgb2YgW2NvZGUgZXhhbXBsZXNdKHNyYy90ZXN0L3Jlc291cmNlcy9leGFtcGxlcykgZ2VuZXJhdGVkIGZyb20gZGlmZmVyZW50IE9wZW5BUEkgMyBwZXJtdXRhdGlvbnMuCgpGdXJ0aGVybW9yZSwgdGhlIFtlbmQtdG8tZW5kIHRlc3RzXSgvZW5kMmVuZC10ZXN0cykgZGVtb25zdHJhdGUgaG93IHRvIGludGVncmF0ZSB0aGUgbGlicmFyeSB1c2luZyBHcmFkbGUuCgojIyBVc2FnZSBJbnN0cnVjdGlvbnMKClRoZSBsaWJyYXJ5IGNhbiBiZSB1c2VkIGluIGEgdmFyaWV0eSBvZiB3YXlzLCBpbmNsdWRpbmcgYXMgYSBjb21tYW5kIGxpbmUgdG9vbCwgYSBHcmFkbGUgdGFzaywgb3IgYSBNYXZlbiBwbHVnaW4uCgpQbGVhc2UgcmVmZXIgdG8gW0NvbmZpZ3VyYXRpb24gT3B0aW9uc10oI2NvbmZpZ3VyYXRpb24tb3B0aW9ucykgc2VjdGlvbiBmb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLgoKIyMjIENvbW1hbmQgTGluZQoKRmFicmlrdCBpcyBwYWNrYWdlZCBhcyBhbiBleGVjdXRhYmxlIGphciwgYWxsb3dpbmcgaXQgdG8gYmUgaW50ZWdyYXRlZCBpbnRvIGFueSBidWlsZCB0b29sLiAKClRoZSBDTEkgY2FuIGJlIGludm9rZWQgYXMgZm9sbG93czoKCmBgYApqYXZhIC1qYXIgZmFicmlrdC5qYXIgXAogICAgLS1vdXRwdXQtZGlyZWN0b3J5ICcvdG1wJyBcCiAgICAtLWJhc2UtcGFja2FnZSAnY29tLmV4YW1wbGUnIFwKICAgIC0tYXBpLWZpbGUgJy9wYXRoLXRvLWFwaS9vcGVuLWFwaS55YW1sJyBcCiAgICAtLXRhcmdldHMgJ2NsaWVudCcgXAogICAgLS10YXJnZXRzICdodHRwX21vZGVscycgXAogICAgLS1odHRwLWNsaWVudC1vcHRzIHJlc2lsaWVuY2U0agpgYGAKCiMjIyBHcmFkbGUgdy8gY3VzdG9tIHRhc2sKCkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIEdyYWRsZSB0YXNrIHdpdGggY29kZSBnZW5lcmF0ZWQgdG8gdGhlIGBidWlsZC9nZW5lcmF0ZWRgIGRpcmVjdG9yeSwgYW5kIGV4ZWN1dGlvbiBsaW5rZWQgdG8gdGhlIGNvbXBpbGUgdGFzay4gCgpgYGBrb3RsaW4KdmFsIGZhYnJpa3Q6IENvbmZpZ3VyYXRpb24gYnkgY29uZmlndXJhdGlvbnMuY3JlYXRpbmcKCnZhbCBnZW5lcmF0aW9uRGlyID0gIiRidWlsZERpci9nZW5lcmF0ZWQiCnZhbCBhcGlGaWxlID0gIiRidWlsZERpci9wYXRoLXRvLWFwaS9vcGVuLWFwaS55YW1sIgoKc291cmNlU2V0cyB7CiAgICBtYWluIHsgamF2YS5zcmNEaXJzKCIkZ2VuZXJhdGlvbkRpci9zcmMvbWFpbi9rb3RsaW4iKSB9CiAgICB0ZXN0IHsgamF2YS5zcmNEaXJzKCIkZ2VuZXJhdGlvbkRpci9zcmMvdGVzdC9rb3RsaW4iKSB9CiAgICAuLi4KfQoKdGFza3MgeyAgIAogICAgLi4uCiAgICB2YWwgZ2VuZXJhdGVDb2RlIGJ5IGNyZWF0aW5nKEphdmFFeGVjOjpjbGFzcykgewogICAgICAgIGlucHV0cy5maWxlcyhhcGlGaWxlKQogICAgICAgIG91dHB1dHMuZGlyKGdlbmVyYXRpb25EaXIpCiAgICAgICAgb3V0cHV0cy5jYWNoZUlmIHsgdHJ1ZSB9CiAgICAgICAgY2xhc3NwYXRoKGZhYnJpa3QpCiAgICAgICAgbWFpbkNsYXNzLnNldCgiY29tLmNqYm9vbXMuZmFicmlrdC5jbGkuQ29kZUdlbiIpCiAgICAgICAgYXJncyA9IGxpc3RPZigKICAgICAgICAgICAgIi0tb3V0cHV0LWRpcmVjdG9yeSIsIGdlbmVyYXRpb25EaXIsCiAgICAgICAgICAgICItLWJhc2UtcGFja2FnZSIsICJjb20uZXhhbXBsZSIsCiAgICAgICAgICAgICItLWFwaS1maWxlIiwgYXBpRmlsZSwKICAgICAgICAgICAgIi0tdGFyZ2V0cyIsICJodHRwX21vZGVscyIsCiAgICAgICAgICAgICItLXRhcmdldHMiLCAiY2xpZW50IiwKICAgICAgICAgICAgIi0taHR0cC1jbGllbnQtb3B0cyIsICJyZXNpbGllbmNlNGoiCiAgICAgICAgKQogICAgfQogICAgd2l0aFR5cGU8b3JnLmpldGJyYWlucy5rb3RsaW4uZ3JhZGxlLnRhc2tzLktvdGxpbkNvbXBpbGU+IHsKICAgICAgICBrb3RsaW5PcHRpb25zLmp2bVRhcmdldCA9ICIxNyIKICAgICAgICBkZXBlbmRzT24oZ2VuZXJhdGVDb2RlKQogICAgfQp9CgpkZXBlbmRlbmNpZXMgewogICAgIGZhYnJpa3QoImNvbS5jamJvb21zOmZhYnJpa3Q6KyIpIC8vIFRoaXMgc2hvdWxkIGJlIHBpbm5lZCAgCiAgICAgLi4uCn0KYGBgCgojIyMgR3JhZGxlIHcvIHBsdWdpbgoKVGhlIFtGYWJyaWt0IEdyYWRsZSBwbHVnaW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9hY2FuZGEvZmFicmlrdC1ncmFkbGUtcGx1Z2luKSBzZXJ2ZXMgYXMgYSBjb252ZW5pZW50IHdyYXBwZXIgZm9yIEZhYnJpa3QsIAphbGxvd2luZyBzZWFtbGVzcyBpbnRlZ3JhdGlvbiBvZiBjb2RlIGdlbmVyYXRpb24gaW50byBhIEdyYWRsZSBidWlsZC4KCioqTm90ZToqKiBTaW5jZSB0aGUgcGx1Z2luIGlzIG1haW50YWluZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBGYWJyaWt0IGxpYnJhcnksIHBsZWFzZSByZWZlciB0byB0aGUKW0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9hY2FuZGEvZmFicmlrdC1ncmFkbGUtcGx1Z2luP3RhYj1yZWFkbWUtb3YtZmlsZSNjb25maWd1cmF0aW9uKSBzZWN0aW9uIG9mIHRoZSAKcGx1Z2luJ3MgUkVBRE1FIGZvciB0aGUgbW9zdCB1cC10by1kYXRlIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgaXQuCgpMYXRlc3QgdmVyc2lvbiBvZiB0aGUgcGx1Z2luOiBbIVtHcmFkbGUgUGx1Z2luIFBvcnRhbCBWZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dyYWRsZS1wbHVnaW4tcG9ydGFsL3YvY2guYWNhbmRhLmdyYWRsZS5mYWJyaWt0P3N0eWxlPWZsYXQpXShodHRwczovL3BsdWdpbnMuZ3JhZGxlLm9yZy9wbHVnaW4vY2guYWNhbmRhLmdyYWRsZS5mYWJyaWt0KQoKYGBga290bGluCnBsdWdpbnMgewogICAgLy8gZmluZCBsYXRlc3QgdmVyc2lvbjogaHR0cHM6Ly9naXRodWIuY29tL2FjYW5kYS9mYWJyaWt0LWdyYWRsZS1wbHVnaW4vcmVsZWFzZXMKICAgIGlkKCJjaC5hY2FuZGEuZ3JhZGxlLmZhYnJpa3QiKSB2ZXJzaW9uICIxLjkuMCIKfQoKZmFicmlrdCB7CiAgICBnZW5lcmF0ZSgiZG9nIikgewogICAgICAgIGFwaUZpbGUgPSBmaWxlKCJzcmMvbWFpbi9vcGVuYXBpL2RvZy55YW1sIikKICAgICAgICBiYXNlUGFja2FnZSA9ICJjb20uZXhhbXBsZS5hcGkiCiAgICB9Cn0KYGBgCgojIyMgTWF2ZW4KClRoZSBbZXhlYy1tYXZlbi1wbHVnaW5dKGh0dHA6Ly93d3cubW9qb2hhdXMub3JnL2V4ZWMtbWF2ZW4tcGx1Z2luL2V4YW1wbGVzL2V4YW1wbGUtZXhlYy11c2luZy1wbHVnaW4tZGVwZW5kZW5jaWVzLmh0bWwpIGlzIGNhcGFibGUgb2YgZG93bmxvYWRpbmcgdGhlIEZhYnJpa3QgbGlicmFyeSBmcm9tIE1hdmVuIENlbnRyYWwgYW5kIGV4ZWN1dGluZyBpdHMgbWFpbiBtZXRob2Qgd2l0aCBkZWZpbmVkIGFyZ3VtZW50cy4KCiMjIEdldHRpbmcgdGhlIE1vc3QgZnJvbSBGYWJyaWt0CgojIyMgMS4gUHJlZmVyIGNvbXBvbmVudHMgdG8gaW5saW5lIHNjaGVtYXMKV2hpbGUgaW5saW5lIHNjaGVtYXMgYXJlIHBlcmZlY3RseSB2YWxpZCB0aGV5IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IEZhYnJpa3QgaW4gYWxsIGNpcmN1bXN0YW5jZXMuClRoaXMgaXMgZXNwZWNpYWxseSB0cnVlIGZvciByZXF1ZXN0IGJvZGllcyBhbmQgbm9uLXRyaXZpYWwgcGFyYW1ldGVycy4gSW5zdGVhZCwgZGVmaW5lIHlvdXIgc2NoZW1hcyBpbiB0aGUKY29tcG9uZW50cyBzZWN0aW9uIG9mIHRoZSBPcGVuQVBJIHNwZWMgKGBjb21wb25lbnRzLnBhcmFtZXRlcnNgICYgYGNvbXBvbmVudHMucmVxdWVzdEJvZGllc2ApLiBbIzIwXShodHRwczovL2dpdGh1Yi5jb20vY2pib29tcy9mYWJyaWt0L2lzc3Vlcy8yMCksIFsjMTg3XShodHRwczovL2dpdGh1Yi5jb20vY2pib29tcy9mYWJyaWt0L2lzc3Vlcy8xODcpCgojIyMgMi4gVXNlIGBvbmVPZmAgd2l0aCBkaXNjcmltaW5hdG9yIGZvciBwb2x5bW9ycGhpc20KYG9uZU9mYCBhbG9uZyB3aXRoIHRoZSBmbGFnIGBTRUFMRURfSU5URVJGQUNFU19GT1JfT05FX09GYCB3aWxsIGdlbmVyYXRlIHBvbHltb3JwaGljIG1vZGVscyB3aXRoIHNlYWxlZCBpbnRlcmZhY2VzLgpUaGUgYGRpc2NyaW1pbmF0b3JgIHByb3BlcnR5IGlzIHVzZWQgYnkgRmFicmlrdCB0byBkZXRlcm1pbmUgdGhlIHN1YnR5cGVzIHRvIGJlIGdlbmVyYXRlZC4KCiMjIENvbmZpZ3VyYXRpb24gT3B0aW9ucwoKVGhpcyBzZWN0aW9uIGRvY3VtZW50cyB0aGUgYXZhaWxhYmxlIENMSSBwYXJhbWV0ZXJzIGZvciBjb250cm9sbGluZyB3aGF0IGdldHMgZ2VuZXJhdGVkLiBUaGlzIGRvY3VtZW50YXRpb24gaXMgZ2VuZXJhdGVkIHVzaW5nOiBgLi9ncmFkbGV3IHByaW50Q29kZUdlblVzYWdlYAoKfCBQYXJhbWV0ZXIgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uIHwKfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKfCAgIGAtLWFwaS1maWxlYCAgICAgICAgICAgICAgICB8IFRoaXMgbXVzdCBiZSBhIHZhbGlkIE9wZW4gQVBJIHYzIHNwZWMuIEFsbCBjb2RlIGdlbmVyYXRpb24gd2lsbCBiZSBiYXNlZCBvZmYgdGhpcyBpbnB1dC4gfAp8ICAgYC0tYXBpLWZyYWdtZW50YCAgICAgICAgICAgIHwgQSBwYXJ0aWFsIE9wZW4gQVBJIHYzIGZyYWdtZW50LCB0byBiZSBjb21iaW5lZCB3aXRoIHRoZSBwcmltYXJ5IEFQSSBmb3IgY29kZSBnZW5lcmF0aW9uIHB1cnBvc2VzLiB8CnwgKiBgLS1iYXNlLXBhY2thZ2VgICAgICAgICAgICAgfCBUaGUgYmFzZSBwYWNrYWdlIHdoaWNoIGFsbCBjb2RlIHdpbGwgYmUgZ2VuZXJhdGVkIHVuZGVyLiB8CnwgICBgLS1leHRlcm5hbC1yZWYtcmVzb2x1dGlvbmAgfCBTcGVjaWZ5IHRvIHdoaWNoIGRlZ3JlZSByZWZlcmVuY2VkIHNjaGVtYXMgZnJvbSBleHRlcm5hbCBmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbW9kZWwgZ2VuZXJhdGlvbi4gRGVmYXVsdDogVEFSR0VURUQgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ0hPT1NFIE9ORSBPRjogfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgVEFSR0VURURgIC0gR2VuZXJhdGUgbW9kZWxzIG9ubHkgZm9yIGRpcmVjdGx5IHJlZmVyZW5jZWQgc2NoZW1hcyBpbiBleHRlcm5hbCBBUEkgZmlsZXMuIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYEFHR1JFU1NJVkVgIC0gUmVmZXJlbmNpbmcgYW55IHNjaGVtYSBpbiBhbiBleHRlcm5hbCBBUEkgZmlsZSB0cmlnZ2VycyBnZW5lcmF0aW9uIG9mIGV2ZXJ5IGV4dGVybmFsIHNjaGVtYSBpbiB0aGF0IGZpbGUuIHwKfCAgIGAtLWh0dHAtY2xpZW50LW9wdHNgICAgICAgICB8IFNlbGVjdCB0aGUgb3B0aW9ucyBmb3IgdGhlIGh0dHAgY2xpZW50IGNvZGUgdGhhdCB5b3Ugd2FudCB0byBiZSBnZW5lcmF0ZWQuIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENIT09TRSBBTlkgT0Y6IHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYFJFU0lMSUVOQ0U0SmAgLSBHZW5lcmF0ZXMgYSBmYXVsdCB0b2xlcmFuY2Ugc2VydmljZSBmb3IgdGhlIGNsaWVudCB1c2luZyB0aGUgZm9sbG93aW5nIGxpYnJhcnkgImlvLmdpdGh1Yi5yZXNpbGllbmNlNGo6cmVzaWxpZW5jZTRqLWFsbDorIiAob25seSBmb3IgT2tIdHRwIGNsaWVudHMpIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYFNVU1BFTkRfTU9ESUZJRVJgIC0gVGhpcyBvcHRpb24gYWRkcyB0aGUgc3VzcGVuZCBtb2RpZmllciB0byB0aGUgZ2VuZXJhdGVkIGNsaWVudCBmdW5jdGlvbnMgKG9ubHkgZm9yIE9wZW5GZWlnbiBjbGllbnRzKSB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBTUFJJTkdfUkVTUE9OU0VfRU5USVRZX1dSQVBQRVJgIC0gVGhpcyBvcHRpb24gYWRkcyB0aGUgU3ByaW5nLVJlc3BvbnNlRW50aXR5IGdlbmVyaWMgYXJvdW5kIHRoZSByZXNwb25zZSB0byBiZSBhYmxlIHRvIGdldCByZXNwb25zZSBoZWFkZXJzIGFuZCBzdGF0dXMgKG9ubHkgZm9yIE9wZW5GZWlnbiBjbGllbnRzKS4gfAp8ICAgYC0taHR0cC1jbGllbnQtdGFyZ2V0YCAgICAgIHwgT3B0aW9uYWxseSBzZWxlY3QgdGhlIHRhcmdldCBjbGllbnQgdGhhdCB5b3Ugd2FudCB0byBiZSBnZW5lcmF0ZWQuIERlZmF1bHRzIHRvIE9LX0hUVFAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ0hPT1NFIE9ORSBPRjogfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgT0tfSFRUUGAgLSBHZW5lcmF0ZSBPa0h0dHAgY2xpZW50LiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBPUEVOX0ZFSUdOYCAtIEdlbmVyYXRlIE9wZW5GZWlnbiBjbGllbnQuIHwKfCAgIGAtLWh0dHAtY29udHJvbGxlci1vcHRzYCAgICB8IFNlbGVjdCB0aGUgb3B0aW9ucyBmb3IgdGhlIGNvbnRyb2xsZXJzIHRoYXQgeW91IHdhbnQgdG8gYmUgZ2VuZXJhdGVkLiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDSE9PU0UgQU5ZIE9GOiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBTVVNQRU5EX01PRElGSUVSYCAtIFRoaXMgb3B0aW9uIGFkZHMgdGhlIHN1c3BlbmQgbW9kaWZpZXIgdG8gdGhlIGdlbmVyYXRlZCBjb250cm9sbGVyIGZ1bmN0aW9ucyB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBBVVRIRU5USUNBVElPTmAgLSBUaGlzIG9wdGlvbiBhZGRzIHRoZSBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXIgdG8gdGhlIGdlbmVyYXRlZCBjb250cm9sbGVyIGZ1bmN0aW9ucyB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBDT01QTEVUSU9OX1NUQUdFYCAtIFRoaXMgb3B0aW9uIG1ha2VzIGdlbmVyYXRlZCBjb250cm9sbGVyIGZ1bmN0aW9ucyBoYXZlIFR5cGUgQ29tcGxldGlvblN0YWdlPFQ+ICh3b3JrcyBvbmx5IHdpdGggU3ByaW5nIENvbnRyb2xsZXIgZ2VuZXJhdG9yKSB8CnwgICBgLS1odHRwLWNvbnRyb2xsZXItdGFyZ2V0YCAgfCBPcHRpb25hbGx5IHNlbGVjdCB0aGUgdGFyZ2V0IGZyYW1ld29yayBmb3IgdGhlIGNvbnRyb2xsZXJzIHRoYXQgeW91IHdhbnQgdG8gYmUgZ2VuZXJhdGVkLiBEZWZhdWx0cyB0byBTcHJpbmcgQ29udHJvbGxlcnMgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ0hPT1NFIE9ORSBPRjogfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgU1BSSU5HYCAtIEdlbmVyYXRlIGZvciBTcHJpbmcgZnJhbWV3b3JrLiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBNSUNST05BVVRgIC0gR2VuZXJhdGUgZm9yIE1pY3JvbmF1dCBmcmFtZXdvcmsuIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYEtUT1JgIC0gR2VuZXJhdGUgZm9yIEt0b3Igc2VydmVyLiB8CnwgICBgLS1odHRwLW1vZGVsLW9wdHNgICAgICAgICAgfCBTZWxlY3QgdGhlIG9wdGlvbnMgZm9yIHRoZSBodHRwIG1vZGVscyB0aGF0IHlvdSB3YW50IHRvIGJlIGdlbmVyYXRlZC4gfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ0hPT1NFIEFOWSBPRjogfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgWF9FWFRFTlNJQkxFX0VOVU1TYCAtIFRoaXMgb3B0aW9uIHRyZWF0cyB4LWV4dGVuc2libGUtZW51bXMgYXMgZW51bXMgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgSkFWQV9TRVJJQUxJWkFUSU9OYCAtIFRoaXMgb3B0aW9uIGFkZHMgSmF2YSBTZXJpYWxpemFibGUgaW50ZXJmYWNlIHRvIHRoZSBnZW5lcmF0ZWQgbW9kZWxzIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYFFVQVJLVVNfUkVGTEVDVElPTmAgLSBUaGlzIG9wdGlvbiBhZGRzIEBSZWdpc3RlckZvclJlZmxlY3Rpb24gdG8gdGhlIGdlbmVyYXRlZCBtb2RlbHMuIFJlcXVpcmVzIGRlcGVuZGVuY3kgIidpby5xdWFya3VzOnF1YXJrdXMtY29yZTorIiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBNSUNST05BVVRfSU5UUk9TUEVDVElPTmAgLSBUaGlzIG9wdGlvbiBhZGRzIEBJbnRyb3NwZWN0ZWQgdG8gdGhlIGdlbmVyYXRlZCBtb2RlbHMuIFJlcXVpcmVzIGRlcGVuZGVuY3kgIidpby5taWNyb25hdXQ6bWljcm9uYXV0LWNvcmU6KyIgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgTUlDUk9OQVVUX1JFRkxFQ1RJT05gIC0gVGhpcyBvcHRpb24gYWRkcyBAUmVmbGVjdGl2ZUFjY2VzcyB0byB0aGUgZ2VuZXJhdGVkIG1vZGVscy4gUmVxdWlyZXMgZGVwZW5kZW5jeSAiJ2lvLm1pY3JvbmF1dDptaWNyb25hdXQtY29yZTorIiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBJTkNMVURFX0NPTVBBTklPTl9PQkpFQ1RgIC0gVGhpcyBvcHRpb24gYWRkcyBhIGNvbXBhbmlvbiBvYmplY3QgdG8gdGhlIGdlbmVyYXRlZCBtb2RlbHMuIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYFNFQUxFRF9JTlRFUkZBQ0VTX0ZPUl9PTkVfT0ZgIC0gVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgZ2VuZXJhdGlvbiBvZiBpbnRlcmZhY2VzIGZvciBkaXNjcmltaW5hdGVkIG9uZU9mIHR5cGVzIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYE5PTl9OVUxMX01BUF9WQUxVRVNgIC0gVGhpcyBvcHRpb24gbWFrZXMgbWFwIHZhbHVlcyBub24tbnVsbC4gVGhlIGRlZmF1bHQgKHNpbmNlIHYxNSkgYW5kIG1vc3Qgc3BlYyBjb21wbGlhbnQgaXMgbWFrZSBtYXAgdmFsdWVzIG51bGxhYmxlIHwKfCAgIGAtLWh0dHAtbW9kZWwtc3VmZml4YCAgICAgICB8IFNwZWNpZnkgY3VzdG9tIHN1ZmZpeCBmb3IgYWxsIGdlbmVyYXRlZCBtb2RlbCBjbGFzc2VzLiBEZWZhdWx0cyB0byBubyBzdWZmaXguIHwKfCAgIGAtLW91dHB1dC1kaXJlY3RvcnlgICAgICAgICB8IEFsbG93cyB0aGUgZ2VuZXJhdGlvbiBkaXIgdG8gYmUgb3ZlcnJpZGRlbi4gRGVmYXVsdHMgdG8gY3VycmVudCBkaXIgfAp8ICAgYC0tcmVzb3VyY2VzLXBhdGhgICAgICAgICAgIHwgQWxsb3dzIHRoZSBwYXRoIGZvciBnZW5lcmF0ZWQgcmVzb3VyY2VzIHRvIGJlIG92ZXJyaWRkZW4uIERlZmF1bHRzIHRvIGBzcmMvbWFpbi9yZXNvdXJjZXNgIHwKfCAgIGAtLXNlcmlhbGl6YXRpb24tbGlicmFyeWAgICB8IFNwZWNpZnkgd2hpY2ggc2VyaWFsaXphdGlvbiBsaWJyYXJ5IHRvIHVzZSBmb3IgYW5ub3RhdGlvbnMgaW4gZ2VuZXJhdGVkIG1vZGVsIGNsYXNzZXMuIERlZmF1bHQ6IEpBQ0tTT04gfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ0hPT1NFIE9ORSBPRjogfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgSkFDS1NPTmAgLSBVc2UgSmFja3NvbiBmb3Igc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYEtPVExJTlhfU0VSSUFMSVpBVElPTmAgLSBVc2Uga290bGlueC5zZXJpYWxpemF0aW9uIGZvciBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24gfAp8ICAgYC0tc3JjLXBhdGhgICAgICAgICAgICAgICAgIHwgQWxsb3dzIHRoZSBwYXRoIGZvciBnZW5lcmF0ZWQgc291cmNlIGZpbGVzIHRvIGJlIG92ZXJyaWRkZW4uIERlZmF1bHRzIHRvIGBzcmMvbWFpbi9rb3RsaW5gIHwKfCAgIGAtLXRhcmdldHNgICAgICAgICAgICAgICAgICB8IFRhcmdldHMgYXJlIHRoZSBwYXJ0cyBvZiB0aGUgYXBwbGljYXRpb24gdGhhdCB5b3Ugd2FudCB0byBiZSBnZW5lcmF0ZWQuIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENIT09TRSBBTlkgT0Y6IHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYEhUVFBfTU9ERUxTYCAtIEphY2tzb24gYW5ub3RhdGVkIGRhdGEgY2xhc3NlcyB0byByZXByZXNlbnQgdGhlIHNjaGVtYSBvYmplY3RzIGRlZmluZWQgaW4gdGhlIGlucHV0LiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBDT05UUk9MTEVSU2AgLSBTcHJpbmcgLyBNaWNyb25hdXQgLyBLdG9yIEhUVFAgY29udHJvbGxlcnMgZm9yIGVhY2ggb2YgdGhlIGVuZHBvaW50cyBkZWZpbmVkIGluIHRoZSBpbnB1dC4gfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgQ0xJRU5UYCAtIFNpbXBsZSBodHRwIHJlc3QgY2xpZW50LiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBRVUFSS1VTX1JFRkxFQ1RJT05fQ09ORklHYCAtIFRoaXMgb3B0aW9ucyBnZW5lcmF0ZXMgdGhlIHJlZmxlY3Rpb24tY29uZmlnLmpzb24gZmlsZSBmb3IgcXVhcmt1cyBpbnRlZ3JhdGlvbiBwcm9qZWN0cyB8CnwgICBgLS10eXBlLW92ZXJyaWRlc2AgICAgICAgICAgfCBTcGVjaWZ5IG5vbi1kZWZhdWx0IGtvdGxpbiB0eXBlcyBmb3IgY2VydGFpbiBPQVMgdHlwZXMuIEZvciBleGFtcGxlLCBnZW5lcmF0ZSBgSW5zdGFudGAgaW5zdGVhZCBvZiBgT2Zmc2V0RGF0ZVRpbWVgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENIT09TRSBBTlkgT0Y6IHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYERBVEVUSU1FX0FTX0lOU1RBTlRgIC0gVXNlIGBJbnN0YW50YCBhcyB0aGUgZGF0ZXRpbWUgdHlwZS4gRGVmYXVsdHMgdG8gYE9mZnNldERhdGVUaW1lYCB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBEQVRFVElNRV9BU19MT0NBTERBVEVUSU1FYCAtIFVzZSBgTG9jYWxEYXRlVGltZWAgYXMgdGhlIGRhdGV0aW1lIHR5cGUuIERlZmF1bHRzIHRvIGBPZmZzZXREYXRlVGltZWAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgQllURUFSUkFZX0FTX0lOUFVUU1RSRUFNYCAtIFVzZSBgSW5wdXRTdHJlYW1gIGFzIEJ5dGVBcnJheSB0eXBlLiBEZWZhdWx0cyB0byBgQnl0ZUFycmF5YCB8CnwgICBgLS12YWxpZGF0aW9uLWxpYnJhcnlgICAgICAgfCBTcGVjaWZ5IHdoaWNoIHZhbGlkYXRpb24gbGlicmFyeSB0byB1c2UgZm9yIGFubm90YXRpb25zIGluIGdlbmVyYXRlZCBtb2RlbCBjbGFzc2VzLiBEZWZhdWx0OiBKQVZBWF9WQUxJREFUSU9OIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENIT09TRSBPTkUgT0Y6IHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgYEpBVkFYX1ZBTElEQVRJT05gIC0gVXNlIGBqYXZheC52YWxpZGF0aW9uYCBhbm5vdGF0aW9ucyBpbiBnZW5lcmF0ZWQgbW9kZWwgY2xhc3NlcyAoZGVmYXVsdCkgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBgSkFLQVJUQV9WQUxJREFUSU9OYCAtIFVzZSBgamFrYXJ0YS52YWxpZGF0aW9uYCBhbm5vdGF0aW9ucyBpbiBnZW5lcmF0ZWQgbW9kZWwgY2xhc3NlcyB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGBOT19WQUxJREFUSU9OYCAtIFVzZSBubyB2YWxpZGF0aW9uIGFubm90YXRpb25zIGluIGdlbmVyYXRlZCBtb2RlbCBjbGFzc2VzIHwKCiMjIE9yaWdpbmFsIE1vdGl2YXRpb24KClRoZSB0ZWFtIHRoYXQgYnVpbHQgdGhlIGZpcnN0IHZlcnNpb24gb2YgdGhpcyB0b29sIGluaXRpYWxseSBjb250cmlidXRlZCB0byB0aGUgS290bGluIGNvZGUgZ2VuZXJhdGlvbiBhYmlsaXR5IGluCltPcGVuQXBpVG9vbHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9PcGVuQVBJVG9vbHMvb3BlbmFwaS1nZW5lcmF0b3IpLCBidXQgcmVhY2hlZCB0aGUgbGltaXRzIG9mIHdoYXQgY291bGQgYmUgYWNoaWV2ZWQgd2l0aAp0ZW1wbGF0ZS1iYXNlZCBnZW5lcmF0aW9uLiBUaGlzIGxpYnJhcnkgbGV2ZXJhZ2VzIHRoZSByaWNoIE9wZW5BUEkgMyBtb2RlbCBwcm92aWRlZCBieQpbS2FpWmVuLU9wZW5BcGktUGFyc2VyXShodHRwczovL2dpdGh1Yi5jb20vUmVwcmVaZW4vS2FpWmVuLU9wZW5BcGktUGFyc2VyKSBhbmQgdXNlcyBbS290bGluIFBvZXRdKGh0dHBzOi8vc3F1YXJlLmdpdGh1Yi5pby9rb3RsaW5wb2V0LykgdG8KcHJvZ3JhbW1hdGljYWxseSBjb25zdHJ1Y3QgS290bGluIGNsYXNzZXMgZm9yIG1heGltdW0gZmxleGliaWxpdHkuCgpUaGlzIHByb2plY3Qgd2FzIHN0YXJ0ZWQgYnkgZW5naW5lZXJzIGZyb20gW1phbGFuZG8gVGVjaF0oaHR0cHM6Ly9vcGVuc291cmNlLnphbGFuZG8uY29tLykgYW5kIGlzIGJhdHRsZS10ZXN0ZWQgaGVhdmlseSBpbiBwcm9kdWN0aW9uIHRoZXJlLgoKIyMgQnVpbGRpbmcgTG9jYWxseQoKRmFicmlrdCBpcyBidWlsdCB3aXRoIEdyYWRsZSBhbmQgcmVxdWlyZXMgYW4gaW5pdGlhbGlzZWQgZ2l0IHJlcG9zaXRvcnkuIFRoZSBlYXNpZXN0IHdheSB0byBidWlsZCBpdCBpcyB0byBjbG9uZSB0aGUgcmVwbyBsb2NhbGx5IGJlZm9yZSBleGVjdXRpbmcgdGhlIGJ1aWxkIGNvbW1hbmQ6CmBgYApnaXQgY2xvbmUgZ2l0QGdpdGh1Yi5jb206Y2pib29tcy9mYWJyaWt0LmdpdApjZCBmYWJyaWt0LwouL2dyYWRsZXcgY2xlYW4gYnVpbGQKYGBgCgojIyBQdWJsaXNoaW5nClRoaXMgbGlicmFyeSBpcyBwdWJsaXNoZWQgdG8gW1NvbmF0eXBlJ3MgT1NTXShodHRwczovL3MwMS5vc3Muc29uYXR5cGUub3JnLyN3ZWxjb21lKSBzdGFnaW5nIHJlcG9zaXRvcnkgdXNpbmcgR2l0aHViIGFjdGlvbnMgd2hlbiBhIHJlbGVhc2UgaXMgZHJhZnRlZC4gSXQgY2FuIGJlIG1hbnVhbGx5IHByb21vdGVkIGZyb20gdGhlcmUgdG8gdGhlIHJlbGVhc2UgcmVwb3NpdG9yeSB3aGljaCBpcyBpbmRleGVkIGJ5IE1hdmVuIENlbnRyYWwuCgojIyBTcGVjaWZpYyBGZWF0dXJlcwoKIyMjIFBvbHltb3JwaGlzbSB2aWEgYGFsbE9mYAoKVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyBgYWxsT2ZgIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHBvbHltb3JwaGljIEtvdGxpbiBkYXRhIGNsYXNzZXMuIEl0IGRvZXMgdGhlIGZvbGxvd2luZzoKLSBBIGBDaGlsZERlZmluaXRpb25gIHNjaGVtYSBkZWZpbmVzIGJvdGggdGhlIGRpc2NyaW1pbmF0b3IgbWFwcGluZyBkZXRhaWxzIGFuZCB0aGUgc2NoZW1hIGZvciB0aGUgZGlzY3JpbWluYXRvciBwcm9wZXJ0eS4gSW4gdGhpcyBjYXNlIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5IGlzIGFuIGVudW1lcmF0aW9uCi0gSW4gZWFjaCBjaGlsZCBzY2hlbWEsIGBhbGxPZmAgaXMgdXNlZCB0byBtZXJnZSB0aGUgYENoaWxkRGVmaW5pdGlvbmAgd2l0aCB0aGUgY2hpbGQncyBjdXN0b20gc2NoZW1hLiBUaGlzIGd1YXJhbnRlZXMgdGhhdCBlYWNoIGNoaWxkIHNjaGVtYSBpbmhlcml0cyB0aGUgY29ycmVjdCBkaXNjcmltaW5hdG9yIHByb3BlcnR5LgotIEluIHRoZSBgUmVzcG9uc2VzYCBzY2hlbWEgYSBgb25lT2ZgIGxpc3RzIG9ubHkgY2hpbGQgc2NoZW1hcy4gVGhpcyB3aWxsIGJlIGRldGVjdGVkIGJ5IEZhYnJpa3QgYW5kIGl0IHdpbGwgZ2VuZXJhdGUgdGhlIGxpc3Qgb2YgcGFyZW50IHR5cGVzOiBgTGlzdDxDaGlsZERlZmluaXRpb24+YAoKX05PVEU6IEEgbmV3IGZlYXR1cmUgaGFzIGJlZW4gYWRkZWQgdGhhdCBhbGxvd3MgUG9seW1vcnBoaXNtIHRvIGJlIGFjaGlldmVkIHVzaW5nIG9ubHkgYSBbZGlzY3JpbWluYXRlZCBvbmVPZl0oc3JjL3Rlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2Rpc2NyaW1pbmF0ZWRPbmVPZikuIFRoaXMgZmVhdHVyZSBtYWtlcyB1c2Ugb2YgS290bGluIGBzZWFsZWQgaW50ZXJmYWNlYCBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQgdmlhIGAtLWh0dHAtbW9kZWwtb3B0cywgU0VBTEVEX0lOVEVSRkFDRVNfRk9SX09ORV9PRmBfCgpgYGB5bWwKb3BlbmFwaTogMy4wLjAKY29tcG9uZW50czoKICBzY2hlbWFzOgogICAgQ2hpbGREZWZpbml0aW9uOgogICAgICB0eXBlOiBvYmplY3QKICAgICAgZGlzY3JpbWluYXRvcjoKICAgICAgICBwcm9wZXJ0eU5hbWU6IHNvbWVfZW51bQogICAgICAgIG1hcHBpbmc6CiAgICAgICAgICBvYmpfb25lX29ubHk6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9EaXNjcmltaW5hdGVkQ2hpbGQxJwogICAgICAgICAgb2JqX3R3b19maXJzdDogJyMvY29tcG9uZW50cy9zY2hlbWFzL0Rpc2NyaW1pbmF0ZWRDaGlsZDInCiAgICAgICAgICBvYmpfdHdvX3NlY29uZDogJyMvY29tcG9uZW50cy9zY2hlbWFzL0Rpc2NyaW1pbmF0ZWRDaGlsZDInCiAgICAgICAgICBvYmpfdGhyZWU6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9kaXNjcmltaW5hdGVkX2NoaWxkXzMnCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgZGlzY3JpbWluYXRpbmdfcHJvcGVydHk6CiAgICAgICAgICAkcmVmOiAnIy9jb21wb25lbnRzL3NjaGVtYXMvQ2hpbGREaXNjcmltaW5hdG9yJwoKICAgIENoaWxkRGlzY3JpbWluYXRvcjoKICAgICAgdHlwZTogc3RyaW5nCiAgICAgIGVudW06CiAgICAgICAgLSBvYmpfb25lX29ubHkKICAgICAgICAtIG9ial90d29fZmlyc3QKICAgICAgICAtIG9ial90d29fc2Vjb25kCiAgICAgICAgLSBvYmpfdGhyZWUKCiAgICBEaXNjcmltaW5hdGVkQ2hpbGQxOgogICAgICBhbGxPZjoKICAgICAgICAtICRyZWY6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9DaGlsZERlZmluaXRpb24nCiAgICAgICAgLSB0eXBlOiBvYmplY3QKICAgICAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgICAgIHNvbWVfcHJvcDoKICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcKCiAgICBEaXNjcmltaW5hdGVkQ2hpbGQyOgogICAgICBhbGxPZjoKICAgICAgICAtICRyZWY6ICcjL2NvbXBvbmVudHMvc2NoZW1hcy9DaGlsZERlZmluaXRpb24nCiAgICAgICAgLSB0eXBlOiBvYmplY3QKICAgICAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgICAgIHNvbWVfcHJvcDoKICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcKCiAgICBkaXNjcmltaW5hdGVkX2NoaWxkXzM6CiAgICAgIGFsbE9mOgogICAgICAgIC0gJHJlZjogJyMvY29tcG9uZW50cy9zY2hlbWFzL0NoaWxkRGVmaW5pdGlvbicKCiAgICBSZXNwb25zZXM6CiAgICAgIHR5cGU6ICJvYmplY3QiCiAgICAgIHByb3BlcnRpZXM6CiAgICAgICAgZW50cmllczoKICAgICAgICAgIHR5cGU6ICJhcnJheSIKICAgICAgICAgIGl0ZW1zOgogICAgICAgICAgICBvbmVPZjoKICAgICAgICAgICAgICAtICRyZWY6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9EaXNjcmltaW5hdGVkQ2hpbGQyIgogICAgICAgICAgICAgIC0gJHJlZjogIiMvY29tcG9uZW50cy9zY2hlbWFzL0Rpc2NyaW1pbmF0ZWRDaGlsZDIiCiAgICAgICAgICAgICAgLSAkcmVmOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvZGlzY3JpbWluYXRlZF9jaGlsZF8zIgpgYGAKYGBga290bGluCkBKc29uVHlwZUluZm8oCiAgICB1c2UgPSBKc29uVHlwZUluZm8uSWQuTkFNRSwKICAgIGluY2x1ZGUgPSBKc29uVHlwZUluZm8uQXMuRVhJU1RJTkdfUFJPUEVSVFksCiAgICBwcm9wZXJ0eSA9ICJzb21lX2VudW0iLAogICAgdmlzaWJsZSA9IHRydWUKKQpASnNvblN1YlR5cGVzKAogICAgSnNvblN1YlR5cGVzLlR5cGUoCiAgICAgICAgdmFsdWUgPSBEaXNjcmltaW5hdGVkQ2hpbGQxOjpjbGFzcywKICAgICAgICBuYW1lID0KICAgICAgICAib2JqX29uZV9vbmx5IgogICAgKSwKICAgIEpzb25TdWJUeXBlcy5UeXBlKAogICAgICAgIHZhbHVlID0gRGlzY3JpbWluYXRlZENoaWxkMjo6Y2xhc3MsCiAgICAgICAgbmFtZSA9CiAgICAgICAgIm9ial90d29fZmlyc3QiCiAgICApLAogICAgSnNvblN1YlR5cGVzLlR5cGUoCiAgICAgICAgdmFsdWUgPSBEaXNjcmltaW5hdGVkQ2hpbGQyOjpjbGFzcywKICAgICAgICBuYW1lID0KICAgICAgICAib2JqX3R3b19zZWNvbmQiCiAgICApLAogICAgSnNvblN1YlR5cGVzLlR5cGUodmFsdWUgPSBEaXNjcmltaW5hdGVkQ2hpbGQzOjpjbGFzcywgbmFtZSA9ICJvYmpfdGhyZWUiKQopCnNlYWxlZCBjbGFzcyBDaGlsZERlZmluaXRpb24oKSB7CiAgICBhYnN0cmFjdCB2YWwgc29tZUVudW06IENoaWxkRGlzY3JpbWluYXRvcgp9CgplbnVtIGNsYXNzIENoaWxkRGlzY3JpbWluYXRvcigKICAgIEBKc29uVmFsdWUKICAgIHZhbCB2YWx1ZTogU3RyaW5nCikgewogICAgT0JKX09ORV9PTkxZKCJvYmpfb25lX29ubHkiKSwKCiAgICBPQkpfVFdPX0ZJUlNUKCJvYmpfdHdvX2ZpcnN0IiksCgogICAgT0JKX1RXT19TRUNPTkQoIm9ial90d29fc2Vjb25kIiksCgogICAgT0JKX1RIUkVFKCJvYmpfdGhyZWUiKTsKCiAgICBjb21wYW5pb24gb2JqZWN0IHsKICAgICAgICBwcml2YXRlIHZhbCBtYXBwaW5nOiBNYXA8U3RyaW5nLCBDaGlsZERpc2NyaW1pbmF0b3I+ID0KICAgICAgICAgICAgdmFsdWVzKCkuYXNzb2NpYXRlQnkoQ2hpbGREaXNjcmltaW5hdG9yOjp2YWx1ZSkKCiAgICAgICAgZnVuIGZyb21WYWx1ZSh2YWx1ZTogU3RyaW5nKTogQ2hpbGREaXNjcmltaW5hdG9yPyA9IG1hcHBpbmdbdmFsdWVdCiAgICB9Cn0KCmRhdGEgY2xhc3MgRGlzY3JpbWluYXRlZENoaWxkMSgKICAgIEBwYXJhbTpKc29uUHJvcGVydHkoInNvbWVfcHJvcCIpCiAgICBAZ2V0Okpzb25Qcm9wZXJ0eSgic29tZV9wcm9wIikKICAgIHZhbCBzb21lUHJvcDogU3RyaW5nPyA9IG51bGwsCiAgICBAZ2V0Okpzb25Qcm9wZXJ0eSgic29tZV9lbnVtIikKICAgIEBnZXQ6Tm90TnVsbAogICAgb3ZlcnJpZGUgdmFsIHNvbWVFbnVtOiBDaGlsZERpc2NyaW1pbmF0b3IgPSBDaGlsZERpc2NyaW1pbmF0b3IuT0JKX09ORV9PTkxZCikgOiBDaGlsZERlZmluaXRpb24oKQoKZGF0YSBjbGFzcyBEaXNjcmltaW5hdGVkQ2hpbGQyKAogICAgQGdldDpKc29uUHJvcGVydHkoInNvbWVfZW51bSIpCiAgICBAZ2V0Ok5vdE51bGwKICAgIG92ZXJyaWRlIHZhbCBzb21lRW51bTogQ2hpbGREaXNjcmltaW5hdG9yLAogICAgQHBhcmFtOkpzb25Qcm9wZXJ0eSgic29tZV9wcm9wIikKICAgIEBnZXQ6SnNvblByb3BlcnR5KCJzb21lX3Byb3AiKQogICAgdmFsIHNvbWVQcm9wOiBTdHJpbmc/ID0gbnVsbAopIDogQ2hpbGREZWZpbml0aW9uKCkKCmRhdGEgY2xhc3MgRGlzY3JpbWluYXRlZENoaWxkMygKICAgIEBnZXQ6SnNvblByb3BlcnR5KCJzb21lX2VudW0iKQogICAgQGdldDpOb3ROdWxsCiAgICBvdmVycmlkZSB2YWwgc29tZUVudW06IENoaWxkRGlzY3JpbWluYXRvciA9IENoaWxkRGlzY3JpbWluYXRvci5PQkpfVEhSRUUKKSA6IENoaWxkRGVmaW5pdGlvbigpCgpkYXRhIGNsYXNzIFJlc3BvbnNlcygKICAgIEBwYXJhbTpKc29uUHJvcGVydHkoImVudHJpZXMiKQogICAgQGdldDpKc29uUHJvcGVydHkoImVudHJpZXMiKQogICAgQGdldDpWYWxpZAogICAgdmFsIGVudHJpZXM6IExpc3Q8Q2hpbGREZWZpbml0aW9uPj8gPSBudWxsCikKYGBgCg==
+ readmeEtag: '"db3898698f2c69601202a96d5e090701f55e6ebf"'
+ readmeLastModified: Tue, 14 Jan 2025 20:59:59 GMT
repositoryId: 229844927
description: Generates Kotlin Code from OpenApi3 Specifications
created: '2019-12-24T00:56:42Z'
- updated: '2025-01-12T15:52:33Z'
+ updated: '2025-01-14T21:00:03Z'
language: Kotlin
archived: false
stars: 162
@@ -1170,8 +1170,8 @@
owner: cjbooms
logo: https://avatars.githubusercontent.com/u/868640?v=4
license: Apache-2.0
- repoEtag: '"bf517c804ee497bc96f2baaba0fe99f0c7d30e57424c314efd0faa1f759a05db"'
- repoLastModified: Sun, 12 Jan 2025 15:52:33 GMT
+ repoEtag: '"447b5d366d23ae6d06142980f2df22dba5ebb50effe959c4f0e906768b17b132"'
+ repoLastModified: Tue, 14 Jan 2025 21:00:03 GMT
foundInMaster: true
- source:
- https://openapi.tools/
@@ -1195,7 +1195,7 @@
owner: bump-sh
logo: https://avatars.githubusercontent.com/u/33217836?v=4
license: MIT
- repoEtag: '"1d56c95e2a1d15428e438c8a5aa9e9d1dd4dacaf23a48ee9970f02fb052fa551"'
+ repoEtag: '"131766751c19b4a111b5aff2ce92f8de47ad9ae2e4a9d483f8af05ed9b552de1"'
repoLastModified: Mon, 13 Jan 2025 17:06:28 GMT
foundInMaster: true
category:
@@ -1297,7 +1297,7 @@
owner: 42Crunch
logo: https://avatars.githubusercontent.com/u/25365245?v=4
license: AGPL-3.0
- repoEtag: '"ca9cab5460fb3ad7d6a8d909fbc22c2b2681da8a4323d50a136562da67684479"'
+ repoEtag: '"d54c6763ac18f28a5f011dc4bf71cf4e41604c76344aaf4226decf08490bf205"'
repoLastModified: Fri, 10 Jan 2025 09:34:59 GMT
foundInMaster: true
id: 782ecbb10f1ff8ac9685e0ed24e52e58
@@ -1363,17 +1363,17 @@
repositoryId: 19390712
description: Swagger Editor
created: '2014-05-02T22:47:10Z'
- updated: '2025-01-13T15:27:33Z'
+ updated: '2025-01-14T21:30:10Z'
language: JavaScript
archived: false
- stars: 8986
+ stars: 8988
watchers: 261
forks: 2267
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"7b2d81631ad608034c0a6f789b60286297adb0b55124f6754968abc68345be18"'
- repoLastModified: Mon, 13 Jan 2025 15:27:33 GMT
+ repoEtag: '"d301924be5801107a7d16a42ec608d2ef1d2c8b41ce3154bf40189bb9eeb8075"'
+ repoLastModified: Tue, 14 Jan 2025 21:30:10 GMT
foundInMaster: true
id: 951cf61d12c812ef9b201ad76b5d278d
v3_1: true
@@ -1517,17 +1517,17 @@
repositoryId: 69595482
description: Open Source API Design
created: '2016-09-29T18:22:33Z'
- updated: '2025-01-13T19:12:22Z'
+ updated: '2025-01-14T15:38:45Z'
language: TypeScript
archived: false
- stars: 999
+ stars: 1002
watchers: 42
forks: 503
owner: Apicurio
logo: https://avatars.githubusercontent.com/u/28107283?v=4
license: Apache-2.0
- repoEtag: '"223c9ae2fe665052e50515a0af418a5748a9a822800ef83b8cae8c02cac6946d"'
- repoLastModified: Mon, 13 Jan 2025 19:12:22 GMT
+ repoEtag: '"a5c05d7e7aa17dca43c85b07a146f4fe72a54e52faa21961474549a02d684b20"'
+ repoLastModified: Tue, 14 Jan 2025 15:38:45 GMT
foundInMaster: true
homepage: https://github.com/Apicurio/apicurio-studio
id: efe9656e80c1bf6304903ca5a60fe5a6
@@ -1733,17 +1733,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: '2025-01-13T14:48:36Z'
+ updated: '2025-01-15T00:46:21Z'
language: TypeScript
archived: false
- stars: 4400
+ stars: 4403
watchers: 55
forks: 352
owner: stoplightio
logo: https://avatars.githubusercontent.com/u/10767217?v=4
license: Apache-2.0
- repoEtag: '"ac531c590b6109489fa04743a2aec35357491bcefc5769a062c8dabb1341a472"'
- repoLastModified: Mon, 13 Jan 2025 14:48:36 GMT
+ repoEtag: '"f3559bc56a713721b01bb85ebd3548d7a7c188b589ac7f319cc850e7182bc4e8"'
+ repoLastModified: Wed, 15 Jan 2025 00:46:21 GMT
foundInMaster: true
useMasterProperties: true
id: 15aad8cd322242e03733b07f2a37890a
@@ -1776,17 +1776,17 @@
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: '2025-01-13T03:32:50Z'
+ updated: '2025-01-14T21:37:07Z'
language: Java
archived: false
- stars: 1477
+ stars: 1478
watchers: 20
forks: 231
owner: microcks
logo: https://avatars.githubusercontent.com/u/11051048?v=4
license: Apache-2.0
- repoEtag: '"2debf95ddc162ac265bff67fc676c9f81ec4be140da7b4929cf45a6fe564f39c"'
- repoLastModified: Mon, 13 Jan 2025 03:32:50 GMT
+ repoEtag: '"2c7555872638b30e4511b892ac8a859e5e886e3d3201b2954c1da74e7491262f"'
+ repoLastModified: Tue, 14 Jan 2025 21:37:07 GMT
foundInMaster: true
id: 1c0e918b5a733b0f1726199e3ea101d6
- source: https://openapi.tools/
@@ -1955,17 +1955,17 @@
repositoryId: 61366800
description: Build OpenAPI-compliant REST APIs using TypeScript and Node
created: '2016-06-17T10:42:50Z'
- updated: '2025-01-13T10:03:52Z'
+ updated: '2025-01-14T21:45:27Z'
language: TypeScript
archived: false
- stars: 3646
+ stars: 3650
watchers: 27
forks: 507
owner: lukeautry
logo: https://avatars.githubusercontent.com/u/8770560?v=4
license: MIT
- repoEtag: '"c23e8495de4211fea3d9665da9da3d0a58c6d44a52dda0a274673321119792f9"'
- repoLastModified: Mon, 13 Jan 2025 10:03:52 GMT
+ repoEtag: '"57cf082418d399a06ae76b054977c6e10921654954818ac2f0d43169a30203f4"'
+ repoLastModified: Tue, 14 Jan 2025 21:45:27 GMT
foundInMaster: true
id: 2529db76d3d9f042b0c624f65b13fc41
- source:
@@ -1977,25 +1977,25 @@
id: 2f6d5164db429943c445c5647745a9be
repositoryMetadata:
base64Readme: >-
- PGRpdiBhbGlnbj0iY2VudGVyIj4KICA8aW1nIGFsdD0iSGV5IEFQSSBsb2dvIiBoZWlnaHQ9IjE1MCIgc3JjPSJodHRwczovL2hleWFwaS5kZXYvaW1hZ2VzL2xvZ28tMzAwdy5wbmciIHdpZHRoPSIxNTAiPgogIDxoMSBhbGlnbj0iY2VudGVyIj48Yj5PcGVuQVBJIFR5cGVTY3JpcHQ8L2I+PC9oMT4KICA8cCBhbGlnbj0iY2VudGVyIj7wn5qAIFRoZSBPcGVuQVBJIHRvIFR5cGVTY3JpcHQgY29kZWdlbi4gR2VuZXJhdGUgY2xpZW50cywgU0RLcywgdmFsaWRhdG9ycywgYW5kIG1vcmUuPC9wPgo8L2Rpdj4KCjxici8+Cgo8cCBhbGlnbj0iY2VudGVyIj4KICA8YSBocmVmPSJodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2UvbWl0IiByZWw9Im5vZm9sbG93Ij48aW1nIHNyYz0iaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9naXRodWIvbGljZW5zZS9oZXktYXBpL29wZW5hcGktdHMiIGFsdD0iTUlUIExpY2Vuc2UiPjwvYT4KICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vaGV5LWFwaS9vcGVuYXBpLXRzL2FjdGlvbnM/cXVlcnk9YnJhbmNoJTNBbWFpbiI+PGltZyBzcmM9Imh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZ2l0aHViL2xhc3QtY29tbWl0L2hleS1hcGkvb3BlbmFwaS10cyIgYWx0PSJMYXN0IGNvbW1pdCIgLz48L2E+CiAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2hleS1hcGkvb3BlbmFwaS10cy9hY3Rpb25zP3F1ZXJ5PWJyYW5jaCUzQW1haW4iPjxpbWcgc3JjPSJodHRwczovL2dpdGh1Yi5jb20vaGV5LWFwaS9vcGVuYXBpLXRzL2FjdGlvbnMvd29ya2Zsb3dzL2NpLnltbC9iYWRnZS5zdmc/ZXZlbnQ9cHVzaCZicmFuY2g9bWFpbiIgYWx0PSJDSSBzdGF0dXMiIC8+PC9hPgogIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9oZXktYXBpL29wZW5hcGktdHMvaXNzdWVzIiByZWw9Im5vZm9sbG93Ij48aW1nIHNyYz0iaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9naXRodWIvaXNzdWVzL2hleS1hcGkvb3BlbmFwaS10cyIgYWx0PSJOdW1iZXIgb2Ygb3BlbiBpc3N1ZXMiPjwvYT4KICA8YSBocmVmPSJodHRwczovL2FwcC5jb2RlY292LmlvL2doL2hleS1hcGkvb3BlbmFwaS10cy90cmVlL21haW4iPjxpbWcgc3JjPSJodHRwczovL2NvZGVjb3YuaW8vZ2gvaGV5LWFwaS9vcGVuYXBpLXRzL2JyYW5jaC9tYWluL2dyYXBoL2JhZGdlLnN2ZyIgYWx0PSJUZXN0IGNvdmVyYWdlIiAvPjwvYT4KPC9wPgoKPHAgYWxpZ249ImNlbnRlciI+CiAgPGEgaHJlZj0iaHR0cHM6Ly9zdGFja2JsaXR6LmNvbS9lZGl0L2hleS1hcGktZXhhbXBsZT9maWxlPW9wZW5hcGktdHMuY29uZmlnLnRzLHNyYyUyRmNsaWVudCUyRnNjaGVtYXMuZ2VuLnRzLHNyYyUyRmNsaWVudCUyRnNkay5nZW4udHMsc3JjJTJGY2xpZW50JTJGdHlwZXMuZ2VuLnRzIj5EZW1vPC9hPgogIDxzcGFuPiZuYnNwO+KAoiZuYnNwOzwvc3Bhbj4KICA8YSBocmVmPSJodHRwczovL2hleWFwaS5kZXYiPkRvY3VtZW50YXRpb248L2E+CiAgPHNwYW4+Jm5ic3A74oCiJm5ic3A7PC9zcGFuPgogIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9oZXktYXBpL29wZW5hcGktdHMvaXNzdWVzIj5Jc3N1ZXM8L2E+CiAgPHNwYW4+Jm5ic3A74oCiJm5ic3A7PC9zcGFuPgogIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vcmdzL2hleS1hcGkvZGlzY3Vzc2lvbnMvMTQ5NSI+Um9hZG1hcDwvYT4KICA8c3Bhbj4mbmJzcDvigKImbmJzcDs8L3NwYW4+CiAgPGEgaHJlZj0iaHR0cHM6Ly9ucG1qcy5jb20vcGFja2FnZS9AaGV5LWFwaS9vcGVuYXBpLXRzIj5ucG08L2E+CjwvcD4KCjxici8+CgojIyBGZWF0dXJlcwoKLSB3b3JrcyB3aXRoIENMSSwgTm9kZS5qcyAxOCssIG9yIG5weAotIHN1cHBvcnRzIE9wZW5BUEkgMi4wLCAzLjAsIGFuZCAzLjEgc3BlY2lmaWNhdGlvbnMKLSBzdXBwb3J0cyBKU09OIGFuZCBZQU1MIGlucHV0IGZpbGVzCi0gZ2VuZXJhdGVzIFR5cGVTY3JpcHQgaW50ZXJmYWNlcyBhbmQgU0RLcwotIEZldGNoIEFQSSwgQXhpb3MsIEFuZ3VsYXIsIE5vZGUuanMsIGFuZCBYSFIgY2xpZW50cyBhdmFpbGFibGUKLSBwbHVnaW4gZWNvc3lzdGVtIHRvIHJlZHVjZSB0aGlyZC1wYXJ0eSBib2lsZXJwbGF0ZQoKIyMgU3BvbnNvcnMKCkxvdmUgSGV5IEFQST8gQmVjb21lIG91ciBbc3BvbnNvcl0oaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL2hleS1hcGkpLgoKPHA+CiAgPGEgaHJlZj0iaHR0cHM6Ly9rdXR0Lml0L3BrRVp5YyIgdGFyZ2V0PSJfYmxhbmsiPgogICAgPGltZyBhbHQ9IlN0YWlubGVzcyBsb2dvIiBoZWlnaHQ9IjUwIiBzcmM9Imh0dHBzOi8vaGV5YXBpLmRldi9pbWFnZXMvc3RhaW5sZXNzLWxvZ28td29yZG1hcmstNDgwdy5qcGVnIiAvPgogIDwvYT4KPC9wPgoKIyMgR2l0SHViIEludGVncmF0aW9uIChjb21pbmcgMjAyNSkKCkF1dG9tYXRpY2FsbHkgdXBkYXRlIHlvdXIgY29kZSB3aGVuIHRoZSBBUElzIGl0IGRlcGVuZHMgb24gY2hhbmdlLiBbRmluZCBvdXQgbW9yZV0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvaW50ZWdyYXRpb25zLmh0bWwpLgoKIyMgUXVpY2sgU3RhcnQKClRoZSBmYXN0ZXN0IHdheSB0byB1c2UgYEBoZXktYXBpL29wZW5hcGktdHNgIGlzIHZpYSBucHgKCmBgYHNoCm5weCBAaGV5LWFwaS9vcGVuYXBpLXRzIFwKICAtYyBAaGV5LWFwaS9jbGllbnQtZmV0Y2ggXAogIC1pIHBhdGgvdG8vb3BlbmFwaS5qc29uIFwKICAtbyBzcmMvY2xpZW50IFwKYGBgCgpDb25ncmF0dWxhdGlvbnMgb24gY3JlYXRpbmcgeW91ciBmaXJzdCBjbGllbnQhIPCfjokgWW91IGNhbiBsZWFybiBtb3JlIGFib3V0IHRoZSBnZW5lcmF0ZWQgZmlsZXMgb24gdGhlIFtPdXRwdXRdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL291dHB1dCkgcGFnZS4KCkJlZm9yZSB5b3UgY2FuIG1ha2UgQVBJIHJlcXVlc3RzIHdpdGggdGhlIGNsaWVudCB5b3UndmUganVzdCBjcmVhdGVkLCB5b3UgbmVlZCB0byBpbnN0YWxsIGBAaGV5LWFwaS9jbGllbnQtZmV0Y2hgIGFuZCBjb25maWd1cmUgaXQuCgojIyBJbnN0YWxsYXRpb24KCiMjIyMgbnBtCgpgYGBzaApucG0gaW5zdGFsbCBAaGV5LWFwaS9jbGllbnQtZmV0Y2ggJiYgbnBtIGluc3RhbGwgQGhleS1hcGkvb3BlbmFwaS10cyAtRApgYGAKCiMjIyMgcG5wbQoKYGBgc2gKcG5wbSBhZGQgQGhleS1hcGkvY2xpZW50LWZldGNoICYmIHBucG0gYWRkIEBoZXktYXBpL29wZW5hcGktdHMgLUQKYGBgCgojIyMjIHlhcm4KCmBgYHNoCnlhcm4gYWRkIEBoZXktYXBpL2NsaWVudC1mZXRjaCAmJiB5YXJuIGFkZCBAaGV5LWFwaS9vcGVuYXBpLXRzIC1ECmBgYAoKIyMjIyBidW4KCmBgYHNoCmJ1biBhZGQgQGhleS1hcGkvY2xpZW50LWZldGNoICYmIGJ1biBhZGQgQGhleS1hcGkvb3BlbmFwaS10cyAtRApgYGAKCldlIHJlY29tbWVuZCBwaW5uaW5nIGFuIGV4YWN0IHZlcnNpb24gc28geW91IGNhbiBzYWZlbHkgdXBncmFkZSB3aGVuIHlvdSdyZSByZWFkeS4gVGhpcyBwYWNrYWdlIGlzIGluIFtpbml0aWFsIGRldmVsb3BtZW50XShodHRwczovL3NlbXZlci5vcmcvc3BlYy92MC4xLjAuaHRtbCNzcGVjLWl0ZW0tNSkgYW5kIGl0cyBBUEkgbWlnaHQgY2hhbmdlIGJlZm9yZSB2MS4KCiMjIyBDTEkKCk1vc3QgcGVvcGxlIHJ1biBgQGhleS1hcGkvb3BlbmFwaS10c2AgdmlhIENMSS4gVG8gZG8gdGhhdCwgYWRkIGEgc2NyaXB0IHRvIHlvdXIgYHBhY2thZ2UuanNvbmAgZmlsZSB3aGljaCB3aWxsIG1ha2UgYG9wZW5hcGktdHNgIGV4ZWN1dGFibGUgdGhyb3VnaCBzY3JpcHQuCgpgYGBqc29uCiJzY3JpcHRzIjogewogICJvcGVuYXBpLXRzIjogIm9wZW5hcGktdHMiCn0KYGBgCgpUaGUgYWJvdmUgc2NyaXB0IGNhbiBiZSBleGVjdXRlZCBieSBydW5uaW5nIGBucG0gcnVuIG9wZW5hcGktdHNgIG9yIGVxdWl2YWxlbnQgY29tbWFuZCBpbiBvdGhlciBwYWNrYWdlIG1hbmFnZXJzLiBOZXh0LCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIFtjb25maWd1cmF0aW9uXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9jb25maWd1cmF0aW9uKSBmaWxlIGFuZCBtb3ZlIG91ciBvcHRpb25zIGZyb20gUXVpY2sgU3RhcnQgdG8gaXQuCgojIyMgTm9kZS5qcwoKWW91IGNhbiBhbHNvIGdlbmVyYXRlIGNsaWVudHMgcHJvZ3JhbW1hdGljYWxseSBieSBpbXBvcnRpbmcgYEBoZXktYXBpL29wZW5hcGktdHNgIGluIGEgVHlwZVNjcmlwdCBmaWxlLgoKYGBgdHMKaW1wb3J0IHsgY3JlYXRlQ2xpZW50IH0gZnJvbSAnQGhleS1hcGkvb3BlbmFwaS10cyc7CgpjcmVhdGVDbGllbnQoewogIGNsaWVudDogJ0BoZXktYXBpL2NsaWVudC1mZXRjaCcsCiAgaW5wdXQ6ICdwYXRoL3RvL29wZW5hcGkuanNvbicsCiAgb3V0cHV0OiAnc3JjL2NsaWVudCcsCn0pOwpgYGAKCiMjIENvbmZpZ3VyYXRpb24KCmBAaGV5LWFwaS9vcGVuYXBpLXRzYCBzdXBwb3J0cyBsb2FkaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSBhbnkgZmlsZSBpbnNpZGUgeW91ciBwcm9qZWN0IHJvb3QgZm9sZGVyIHN1cHBvcnRlZCBieSBbaml0aSBsb2FkZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS91bmpzL2MxMj90YWI9cmVhZG1lLW92LWZpbGUjLWZlYXR1cmVzKS4gQmVsb3cgYXJlIHRoZSBtb3N0IGNvbW1vbiBmaWxlIGZvcm1hdHMuCgojIyMjIGBvcGVuYXBpLXRzLmNvbmZpZy50c2AKCmBgYGpzCmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ0BoZXktYXBpL29wZW5hcGktdHMnOwoKZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsKICBjbGllbnQ6ICdAaGV5LWFwaS9jbGllbnQtZmV0Y2gnLAogIGlucHV0OiAncGF0aC90by9vcGVuYXBpLmpzb24nLAogIG91dHB1dDogJ3NyYy9jbGllbnQnLAp9KTsKYGBgCgojIyMjIGBvcGVuYXBpLXRzLmNvbmZpZy5janNgCgpgYGBqcwovKiogQHR5cGUge2ltcG9ydCgnQGhleS1hcGkvb3BlbmFwaS10cycpLlVzZXJDb25maWd9ICovCm1vZHVsZS5leHBvcnRzID0gewogIGNsaWVudDogJ0BoZXktYXBpL2NsaWVudC1mZXRjaCcsCiAgaW5wdXQ6ICdwYXRoL3RvL29wZW5hcGkuanNvbicsCiAgb3V0cHV0OiAnc3JjL2NsaWVudCcsCn07CmBgYAoKIyMjIyBgb3BlbmFwaS10cy5jb25maWcubWpzYAoKYGBganMKLyoqIEB0eXBlIHtpbXBvcnQoJ0BoZXktYXBpL29wZW5hcGktdHMnKS5Vc2VyQ29uZmlnfSAqLwpleHBvcnQgZGVmYXVsdCB7CiAgY2xpZW50OiAnQGhleS1hcGkvY2xpZW50LWZldGNoJywKICBpbnB1dDogJ3BhdGgvdG8vb3BlbmFwaS5qc29uJywKICBvdXRwdXQ6ICdzcmMvY2xpZW50JywKfTsKYGBgCgpBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSBgb3BlbmFwaS10cy5jb25maWcuanNgIGFuZCBjb25maWd1cmUgdGhlIGV4cG9ydCBzdGF0ZW1lbnQgZGVwZW5kaW5nIG9uIHlvdXIgcHJvamVjdCBzZXR1cC4KCiMjIyBJbnB1dAoKSW5wdXQgaXMgdGhlIGZpcnN0IHRoaW5nIHlvdSBtdXN0IGRlZmluZS4gSXQgY2FuIGJlIGEgcGF0aCwgVVJMLCBvciBhIHN0cmluZyBjb250ZW50IHJlc29sdmluZyB0byBhbiBPcGVuQVBJIHNwZWNpZmljYXRpb24uIEhleSBBUEkgc3VwcG9ydHMgYWxsIHZhbGlkIE9wZW5BUEkgdmVyc2lvbnMgYW5kIGZpbGUgZm9ybWF0cy4KCj4gSWYgeW91IHVzZSBhbiBIVFRQUyBVUkwgd2l0aCBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGluIGRldmVsb3BtZW50LCB5b3Ugd2lsbCBuZWVkIHRvIHNldCBbYE5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQ9MGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9oZXktYXBpL29wZW5hcGktdHMvaXNzdWVzLzI3NiNpc3N1ZWNvbW1lbnQtMjA0MzE0MzUwMSkgaW4geW91ciBlbnZpcm9ubWVudC4KCiMjIyBPdXRwdXQKCk91dHB1dCBpcyB0aGUgbmV4dCB0aGluZyB0byBkZWZpbmUuIEl0IGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgcG9pbnRpbmcgdG8gdGhlIGRlc3RpbmF0aW9uIGZvbGRlciBvciBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlc3RpbmF0aW9uIGZvbGRlciBwYXRoIGFuZCBvcHRpb25hbCBzZXR0aW5ncyAodGhlc2UgYXJlIGRlc2NyaWJlZCBiZWxvdykuCgo+IFlvdSBzaG91bGQgdHJlYXQgdGhlIG91dHB1dCBmb2xkZXIgYXMgYSBkZXBlbmRlbmN5LiBEbyBub3QgZGlyZWN0bHkgbW9kaWZ5IGl0cyBjb250ZW50cyBhcyB5b3VyIGNoYW5nZXMgbWlnaHQgYmUgZXJhc2VkIHdoZW4geW91IHJ1biBgQGhleS1hcGkvb3BlbmFwaS10c2AgYWdhaW4uCgojIyMgQ2xpZW50CgpDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3Igc2VuZGluZyB0aGUgYWN0dWFsIEhUVFAgcmVxdWVzdHMuIFRoZSBgY2xpZW50YCB2YWx1ZSBpcyBub3QgcmVxdWlyZWQsIGJ1dCB5b3UgbXVzdCBkZWZpbmUgaXQgaWYgeW91J3JlIGdlbmVyYXRpbmcgU0RLcyAoZW5hYmxlZCBieSBkZWZhdWx0KS4KCllvdSBjYW4gbGVhcm4gbW9yZSBvbiB0aGUgW0NsaWVudHNdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL2NsaWVudHMpIHBhZ2UuCgojIyMgUGFyc2VyCgpJZiB5b3UncmUgTk9UIHVzaW5nIGEgbGVnYWN5IGNsaWVudCwgd2UgZW5jb3VyYWdlIHlvdSB0byB0cnkgb3V0IHRoZSBleHBlcmltZW50YWwgcGFyc2VyLiBTb29uLCBpdCB3aWxsIGJlY29tZSB0aGUgZGVmYXVsdCBwYXJzZXIsIGJ1dCB1bnRpbCBpdCdzIGJlZW4gdGVzdGVkIGl0J3MgYW4gb3B0LWluIGZlYXR1cmUuIFRvIHRyeSBpdCBvdXQsIHNldCB0aGUgYGV4cGVyaW1lbnRhbFBhcnNlcmAgZmxhZyBpbiB5b3VyIGNvbmZpZ3VyYXRpb24gdG8gYHRydWVgLgoKIyMjIyBjb25maWcKCmBgYGpzCmV4cG9ydCBkZWZhdWx0IHsKICBjbGllbnQ6ICdAaGV5LWFwaS9jbGllbnQtZmV0Y2gnLAogIGV4cGVyaW1lbnRhbFBhcnNlcjogdHJ1ZSwKICBpbnB1dDogJ3BhdGgvdG8vb3BlbmFwaS5qc29uJywKICBvdXRwdXQ6ICdzcmMvY2xpZW50JywKfTsKYGBgCgojIyMjIGNsaQoKYGBgc2gKbnB4IEBoZXktYXBpL29wZW5hcGktdHMgXAogIC1jIEBoZXktYXBpL2NsaWVudC1mZXRjaCBcCiAgLWUgXAogIC1pIHBhdGgvdG8vb3BlbmFwaS5qc29uIFwKICAtbyBzcmMvY2xpZW50CmBgYAoKVGhlIGV4cGVyaW1lbnRhbCBwYXJzZXIgcHJvZHVjZXMgYSBjbGVhbmVyIG91dHB1dCB3aGlsZSBiZWluZyBmYXN0ZXIgdGhhbiB0aGUgbGVnYWN5IHBhcnNlci4gSXQgYWxzbyBzdXBwb3J0cyBmZWF0dXJlcyBzdWNoIGFzIFtGaWx0ZXJzXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9jb25maWd1cmF0aW9uI2ZpbHRlcnMpIGFuZCBtb3JlIGFyZSBiZWluZyBhZGRlZC4KClRoZSBsZWdhY3kgcGFyc2VyIHdpbGwgYmUgdXNlZCB3aXRoIHRoZSBbbGVnYWN5IGNsaWVudHNdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL2NsaWVudHMvbGVnYWN5KSByZWdhcmRsZXNzIG9mIHRoZSBgZXhwZXJpbWVudGFsUGFyc2VyYCBmbGFnIHZhbHVlLiBIb3dldmVyLCBpdCdzIHVubGlrZWx5IHRvIHJlY2VpdmUgYW55IGZ1cnRoZXIgdXBkYXRlcy4KCiMjIFBsdWdpbnMKClBsdWdpbnMgYXJlIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIGFydGlmYWN0cyBmcm9tIHlvdXIgaW5wdXQuIEJ5IGRlZmF1bHQsIEhleSBBUEkgd2lsbCBnZW5lcmF0ZSBUeXBlU2NyaXB0IGludGVyZmFjZXMgYW5kIFNESyBmcm9tIHlvdXIgT3BlbkFQSSBzcGVjaWZpY2F0aW9uLiBZb3UgY2FuIGFkZCwgcmVtb3ZlLCBvciBjdXN0b21pemUgYW55IG9mIHRoZSBwbHVnaW5zLiBJbiBmYWN0LCB3ZSBoaWdobHkgZW5jb3VyYWdlIHlvdSB0byBkbyBzbyEKCiMjIyBOYXRpdmUgUGx1Z2lucwoKVGhlc2UgcGx1Z2lucyBoZWxwIHJlZHVjZSBib2lsZXJwbGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhpcmQtcGFydHkgZGVwZW5kZW5jaWVzLiBIZXkgQVBJIG5hdGl2ZWx5IHN1cHBvcnRzIHRoZSBtb3N0IHBvcHVsYXIgcGFja2FnZXMuIFBsZWFzZSBvcGVuIGFuIGlzc3VlIG9uIFtHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9oZXktYXBpL29wZW5hcGktdHMvaXNzdWVzKSBpZiB5b3UnZCBsaWtlIHVzIHRvIHN1cHBvcnQgeW91ciBmYXZvcml0ZSBwYWNrYWdlLgoKLSBbYEBoZXktYXBpL3NjaGVtYXNgXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9vdXRwdXQvanNvbi1zY2hlbWEpCi0gW2BAaGV5LWFwaS9zZGtgXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9vdXRwdXQvc2RrKQotIFtgQGhleS1hcGkvdHJhbnNmb3JtZXJzYF0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvdHJhbnNmb3JtZXJzKQotIFtgQGhleS1hcGkvdHlwZXNjcmlwdGBdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL291dHB1dC90eXBlc2NyaXB0KQotIFtgQHRhbnN0YWNrL2FuZ3VsYXItcXVlcnktZXhwZXJpbWVudGFsYF0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy90YW5zdGFjay1xdWVyeSkKLSBbYEB0YW5zdGFjay9yZWFjdC1xdWVyeWBdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL3BsdWdpbnMvdGFuc3RhY2stcXVlcnkpCi0gW2BAdGFuc3RhY2svc29saWQtcXVlcnlgXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL3RhbnN0YWNrLXF1ZXJ5KQotIFtgQHRhbnN0YWNrL3N2ZWx0ZS1xdWVyeWBdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL3BsdWdpbnMvdGFuc3RhY2stcXVlcnkpCi0gW2BAdGFuc3RhY2svdnVlLXF1ZXJ5YF0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy90YW5zdGFjay1xdWVyeSkKLSBbYGZhc3RpZnlgXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL2Zhc3RpZnkpCi0gW2B6b2RgXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL3pvZCkKCiMjIyBQbGFubmVkIFBsdWdpbnMKClRoZSBmb2xsb3dpbmcgcGx1Z2lucyBhcmUgcGxhbm5lZCBidXQgbm90IGluIGRldmVsb3BtZW50IHlldC4gWW91IGNhbiBoZWxwIHVzIHByaW9yaXRpemUgdGhlbSBieSB2b3Rpbmcgb24gW0dpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL2hleS1hcGkvb3BlbmFwaS10cy9sYWJlbHMvUlNWUCUyMCVGMCU5RiU5MSU4RCVGMCU5RiU5MSU4RSkuCgotIFtBanZdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL3BsdWdpbnMvYWp2KQotIFtBcmt0eXBlXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL2Fya3R5cGUpCi0gW0V4cHJlc3NdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL3BsdWdpbnMvZXhwcmVzcykKLSBbRmFrZXJdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL3BsdWdpbnMvZmFrZXIpCi0gW0hvbm9dKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL3BsdWdpbnMvaG9ubykKLSBbSm9pXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL2pvaSkKLSBbS29hXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL2tvYSkKLSBbTVNXXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL21zdykKLSBbTmVzdF0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy9uZXN0KQotIFtOb2NrXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL25vY2spCi0gW1BpbmlhIENvbGFkYV0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy9waW5pYS1jb2xhZGEpCi0gW1N1cGVyc3RydWN0XShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL3N1cGVyc3RydWN0KQotIFtTdXBlcnRlc3RdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL3BsdWdpbnMvc3VwZXJ0ZXN0KQotIFtTV1JdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL3BsdWdpbnMvc3dyKQotIFtUeXBlQm94XShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL3R5cGVib3gpCi0gW1ZhbGlib3RdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL3BsdWdpbnMvdmFsaWJvdCkKLSBbWXVwXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL3l1cCkKLSBbWnVzdGFuZF0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy96dXN0YW5kKQoKIyMgTWlncmF0aW9uIEd1aWRlcwoKW09wZW5BUEkgVHlwZXNjcmlwdCBDb2RlZ2VuXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9taWdyYXRpbmcjb3BlbmFwaS10eXBlc2NyaXB0LWNvZGVnZW4pCgojIyBMaWNlbnNlCgpSZWxlYXNlZCB1bmRlciB0aGUgW01JVCBMaWNlbnNlXShodHRwczovL2dpdGh1Yi5jb20vaGV5LWFwaS9vcGVuYXBpLXRzL2Jsb2IvbWFpbi9MSUNFTlNFLm1kKS4K
- readmeEtag: '"4d387a2d7e0a00469b8b1a36a0e3da210db450cc"'
- readmeLastModified: Wed, 08 Jan 2025 10:42:34 GMT
+ PGRpdiBhbGlnbj0iY2VudGVyIj4KICA8aW1nIGFsdD0iSGV5IEFQSSBsb2dvIiBoZWlnaHQ9IjE1MCIgc3JjPSJodHRwczovL2hleWFwaS5kZXYvaW1hZ2VzL2xvZ28tMzAwdy5wbmciIHdpZHRoPSIxNTAiPgogIDxoMSBhbGlnbj0iY2VudGVyIj48Yj5PcGVuQVBJIFR5cGVTY3JpcHQ8L2I+PC9oMT4KICA8cCBhbGlnbj0iY2VudGVyIj7wn5qAIFRoZSBPcGVuQVBJIHRvIFR5cGVTY3JpcHQgY29kZWdlbi4gR2VuZXJhdGUgY2xpZW50cywgU0RLcywgdmFsaWRhdG9ycywgYW5kIG1vcmUuPC9wPgo8L2Rpdj4KCjxici8+Cgo8cCBhbGlnbj0iY2VudGVyIj4KICA8YSBocmVmPSJodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2UvbWl0IiByZWw9Im5vZm9sbG93Ij48aW1nIHNyYz0iaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9naXRodWIvbGljZW5zZS9oZXktYXBpL29wZW5hcGktdHMiIGFsdD0iTUlUIExpY2Vuc2UiPjwvYT4KICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vaGV5LWFwaS9vcGVuYXBpLXRzL2FjdGlvbnM/cXVlcnk9YnJhbmNoJTNBbWFpbiI+PGltZyBzcmM9Imh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZ2l0aHViL2xhc3QtY29tbWl0L2hleS1hcGkvb3BlbmFwaS10cyIgYWx0PSJMYXN0IGNvbW1pdCIgLz48L2E+CiAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2hleS1hcGkvb3BlbmFwaS10cy9hY3Rpb25zP3F1ZXJ5PWJyYW5jaCUzQW1haW4iPjxpbWcgc3JjPSJodHRwczovL2dpdGh1Yi5jb20vaGV5LWFwaS9vcGVuYXBpLXRzL2FjdGlvbnMvd29ya2Zsb3dzL2NpLnltbC9iYWRnZS5zdmc/ZXZlbnQ9cHVzaCZicmFuY2g9bWFpbiIgYWx0PSJDSSBzdGF0dXMiIC8+PC9hPgogIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9oZXktYXBpL29wZW5hcGktdHMvaXNzdWVzIiByZWw9Im5vZm9sbG93Ij48aW1nIHNyYz0iaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9naXRodWIvaXNzdWVzL2hleS1hcGkvb3BlbmFwaS10cyIgYWx0PSJOdW1iZXIgb2Ygb3BlbiBpc3N1ZXMiPjwvYT4KICA8YSBocmVmPSJodHRwczovL2FwcC5jb2RlY292LmlvL2doL2hleS1hcGkvb3BlbmFwaS10cy90cmVlL21haW4iPjxpbWcgc3JjPSJodHRwczovL2NvZGVjb3YuaW8vZ2gvaGV5LWFwaS9vcGVuYXBpLXRzL2JyYW5jaC9tYWluL2dyYXBoL2JhZGdlLnN2ZyIgYWx0PSJUZXN0IGNvdmVyYWdlIiAvPjwvYT4KPC9wPgoKPHAgYWxpZ249ImNlbnRlciI+CiAgPGEgaHJlZj0iaHR0cHM6Ly9zdGFja2JsaXR6LmNvbS9lZGl0L2hleS1hcGktZXhhbXBsZT9maWxlPW9wZW5hcGktdHMuY29uZmlnLnRzLHNyYyUyRmNsaWVudCUyRnNjaGVtYXMuZ2VuLnRzLHNyYyUyRmNsaWVudCUyRnNkay5nZW4udHMsc3JjJTJGY2xpZW50JTJGdHlwZXMuZ2VuLnRzIj5EZW1vPC9hPgogIDxzcGFuPiZuYnNwO+KAoiZuYnNwOzwvc3Bhbj4KICA8YSBocmVmPSJodHRwczovL2hleWFwaS5kZXYiPkRvY3VtZW50YXRpb248L2E+CiAgPHNwYW4+Jm5ic3A74oCiJm5ic3A7PC9zcGFuPgogIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9oZXktYXBpL29wZW5hcGktdHMvaXNzdWVzIj5Jc3N1ZXM8L2E+CiAgPHNwYW4+Jm5ic3A74oCiJm5ic3A7PC9zcGFuPgogIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vcmdzL2hleS1hcGkvZGlzY3Vzc2lvbnMvMTQ5NSI+Um9hZG1hcDwvYT4KICA8c3Bhbj4mbmJzcDvigKImbmJzcDs8L3NwYW4+CiAgPGEgaHJlZj0iaHR0cHM6Ly9ucG1qcy5jb20vcGFja2FnZS9AaGV5LWFwaS9vcGVuYXBpLXRzIj5ucG08L2E+CjwvcD4KCjxici8+CgojIyBGZWF0dXJlcwoKLSB3b3JrcyB3aXRoIENMSSwgTm9kZS5qcyAxOCssIG9yIG5weAotIHN1cHBvcnRzIE9wZW5BUEkgMi4wLCAzLjAsIGFuZCAzLjEgc3BlY2lmaWNhdGlvbnMKLSBzdXBwb3J0cyBKU09OIGFuZCBZQU1MIGlucHV0IGZpbGVzCi0gZ2VuZXJhdGVzIFR5cGVTY3JpcHQgaW50ZXJmYWNlcyBhbmQgU0RLcwotIEZldGNoIEFQSSwgQXhpb3MsIEFuZ3VsYXIsIE5vZGUuanMsIGFuZCBYSFIgY2xpZW50cyBhdmFpbGFibGUKLSBwbHVnaW4gZWNvc3lzdGVtIHRvIHJlZHVjZSB0aGlyZC1wYXJ0eSBib2lsZXJwbGF0ZQoKIyMgU3BvbnNvcnMKCkxvdmUgSGV5IEFQST8gQmVjb21lIG91ciBbc3BvbnNvcl0oaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL2hleS1hcGkpLgoKPHA+CiAgPGEgaHJlZj0iaHR0cHM6Ly9rdXR0Lml0L3BrRVp5YyIgdGFyZ2V0PSJfYmxhbmsiPgogICAgPGltZyBhbHQ9IlN0YWlubGVzcyBsb2dvIiBoZWlnaHQ9IjUwIiBzcmM9Imh0dHBzOi8vaGV5YXBpLmRldi9pbWFnZXMvc3RhaW5sZXNzLWxvZ28td29yZG1hcmstNDgwdy5qcGVnIiAvPgogIDwvYT4KPC9wPgoKIyMgR2l0SHViIEludGVncmF0aW9uIChjb21pbmcgMjAyNSkKCkF1dG9tYXRpY2FsbHkgdXBkYXRlIHlvdXIgY29kZSB3aGVuIHRoZSBBUElzIGl0IGRlcGVuZHMgb24gY2hhbmdlLiBbRmluZCBvdXQgbW9yZV0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvaW50ZWdyYXRpb25zLmh0bWwpLgoKIyMgUXVpY2sgU3RhcnQKClRoZSBmYXN0ZXN0IHdheSB0byB1c2UgYEBoZXktYXBpL29wZW5hcGktdHNgIGlzIHZpYSBucHgKCmBgYHNoCm5weCBAaGV5LWFwaS9vcGVuYXBpLXRzIFwKICAtYyBAaGV5LWFwaS9jbGllbnQtZmV0Y2ggXAogIC1pIHBhdGgvdG8vb3BlbmFwaS5qc29uIFwKICAtbyBzcmMvY2xpZW50IFwKYGBgCgpDb25ncmF0dWxhdGlvbnMgb24gY3JlYXRpbmcgeW91ciBmaXJzdCBjbGllbnQhIPCfjokgWW91IGNhbiBsZWFybiBtb3JlIGFib3V0IHRoZSBnZW5lcmF0ZWQgZmlsZXMgb24gdGhlIFtPdXRwdXRdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL291dHB1dCkgcGFnZS4KCkJlZm9yZSB5b3UgY2FuIG1ha2UgQVBJIHJlcXVlc3RzIHdpdGggdGhlIGNsaWVudCB5b3UndmUganVzdCBjcmVhdGVkLCB5b3UgbmVlZCB0byBpbnN0YWxsIGBAaGV5LWFwaS9jbGllbnQtZmV0Y2hgIGFuZCBjb25maWd1cmUgaXQuCgojIyBJbnN0YWxsYXRpb24KCiMjIyMgbnBtCgpgYGBzaApucG0gaW5zdGFsbCBAaGV5LWFwaS9jbGllbnQtZmV0Y2ggJiYgbnBtIGluc3RhbGwgQGhleS1hcGkvb3BlbmFwaS10cyAtRApgYGAKCiMjIyMgcG5wbQoKYGBgc2gKcG5wbSBhZGQgQGhleS1hcGkvY2xpZW50LWZldGNoICYmIHBucG0gYWRkIEBoZXktYXBpL29wZW5hcGktdHMgLUQKYGBgCgojIyMjIHlhcm4KCmBgYHNoCnlhcm4gYWRkIEBoZXktYXBpL2NsaWVudC1mZXRjaCAmJiB5YXJuIGFkZCBAaGV5LWFwaS9vcGVuYXBpLXRzIC1ECmBgYAoKIyMjIyBidW4KCmBgYHNoCmJ1biBhZGQgQGhleS1hcGkvY2xpZW50LWZldGNoICYmIGJ1biBhZGQgQGhleS1hcGkvb3BlbmFwaS10cyAtRApgYGAKCldlIHJlY29tbWVuZCBwaW5uaW5nIGFuIGV4YWN0IHZlcnNpb24gc28geW91IGNhbiBzYWZlbHkgdXBncmFkZSB3aGVuIHlvdSdyZSByZWFkeS4gVGhpcyBwYWNrYWdlIGlzIGluIFtpbml0aWFsIGRldmVsb3BtZW50XShodHRwczovL3NlbXZlci5vcmcvc3BlYy92MC4xLjAuaHRtbCNzcGVjLWl0ZW0tNSkgYW5kIGl0cyBBUEkgbWlnaHQgY2hhbmdlIGJlZm9yZSB2MS4KCiMjIyBDTEkKCk1vc3QgcGVvcGxlIHJ1biBgQGhleS1hcGkvb3BlbmFwaS10c2AgdmlhIENMSS4gVG8gZG8gdGhhdCwgYWRkIGEgc2NyaXB0IHRvIHlvdXIgYHBhY2thZ2UuanNvbmAgZmlsZSB3aGljaCB3aWxsIG1ha2UgYG9wZW5hcGktdHNgIGV4ZWN1dGFibGUgdGhyb3VnaCBzY3JpcHQuCgpgYGBqc29uCiJzY3JpcHRzIjogewogICJvcGVuYXBpLXRzIjogIm9wZW5hcGktdHMiCn0KYGBgCgpUaGUgYWJvdmUgc2NyaXB0IGNhbiBiZSBleGVjdXRlZCBieSBydW5uaW5nIGBucG0gcnVuIG9wZW5hcGktdHNgIG9yIGVxdWl2YWxlbnQgY29tbWFuZCBpbiBvdGhlciBwYWNrYWdlIG1hbmFnZXJzLiBOZXh0LCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIFtjb25maWd1cmF0aW9uXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9jb25maWd1cmF0aW9uKSBmaWxlIGFuZCBtb3ZlIG91ciBvcHRpb25zIGZyb20gUXVpY2sgU3RhcnQgdG8gaXQuCgojIyMgTm9kZS5qcwoKWW91IGNhbiBhbHNvIGdlbmVyYXRlIGNsaWVudHMgcHJvZ3JhbW1hdGljYWxseSBieSBpbXBvcnRpbmcgYEBoZXktYXBpL29wZW5hcGktdHNgIGluIGEgVHlwZVNjcmlwdCBmaWxlLgoKYGBgdHMKaW1wb3J0IHsgY3JlYXRlQ2xpZW50IH0gZnJvbSAnQGhleS1hcGkvb3BlbmFwaS10cyc7CgpjcmVhdGVDbGllbnQoewogIGNsaWVudDogJ0BoZXktYXBpL2NsaWVudC1mZXRjaCcsCiAgaW5wdXQ6ICdwYXRoL3RvL29wZW5hcGkuanNvbicsCiAgb3V0cHV0OiAnc3JjL2NsaWVudCcsCn0pOwpgYGAKCiMjIENvbmZpZ3VyYXRpb24KCmBAaGV5LWFwaS9vcGVuYXBpLXRzYCBzdXBwb3J0cyBsb2FkaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSBhbnkgZmlsZSBpbnNpZGUgeW91ciBwcm9qZWN0IHJvb3QgZm9sZGVyIHN1cHBvcnRlZCBieSBbaml0aSBsb2FkZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS91bmpzL2MxMj90YWI9cmVhZG1lLW92LWZpbGUjLWZlYXR1cmVzKS4gQmVsb3cgYXJlIHRoZSBtb3N0IGNvbW1vbiBmaWxlIGZvcm1hdHMuCgojIyMjIGBvcGVuYXBpLXRzLmNvbmZpZy50c2AKCmBgYGpzCmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ0BoZXktYXBpL29wZW5hcGktdHMnOwoKZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHsKICBjbGllbnQ6ICdAaGV5LWFwaS9jbGllbnQtZmV0Y2gnLAogIGlucHV0OiAncGF0aC90by9vcGVuYXBpLmpzb24nLAogIG91dHB1dDogJ3NyYy9jbGllbnQnLAp9KTsKYGBgCgojIyMjIGBvcGVuYXBpLXRzLmNvbmZpZy5janNgCgpgYGBqcwovKiogQHR5cGUge2ltcG9ydCgnQGhleS1hcGkvb3BlbmFwaS10cycpLlVzZXJDb25maWd9ICovCm1vZHVsZS5leHBvcnRzID0gewogIGNsaWVudDogJ0BoZXktYXBpL2NsaWVudC1mZXRjaCcsCiAgaW5wdXQ6ICdwYXRoL3RvL29wZW5hcGkuanNvbicsCiAgb3V0cHV0OiAnc3JjL2NsaWVudCcsCn07CmBgYAoKIyMjIyBgb3BlbmFwaS10cy5jb25maWcubWpzYAoKYGBganMKLyoqIEB0eXBlIHtpbXBvcnQoJ0BoZXktYXBpL29wZW5hcGktdHMnKS5Vc2VyQ29uZmlnfSAqLwpleHBvcnQgZGVmYXVsdCB7CiAgY2xpZW50OiAnQGhleS1hcGkvY2xpZW50LWZldGNoJywKICBpbnB1dDogJ3BhdGgvdG8vb3BlbmFwaS5qc29uJywKICBvdXRwdXQ6ICdzcmMvY2xpZW50JywKfTsKYGBgCgpBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSBgb3BlbmFwaS10cy5jb25maWcuanNgIGFuZCBjb25maWd1cmUgdGhlIGV4cG9ydCBzdGF0ZW1lbnQgZGVwZW5kaW5nIG9uIHlvdXIgcHJvamVjdCBzZXR1cC4KCiMjIyBJbnB1dAoKSW5wdXQgaXMgdGhlIGZpcnN0IHRoaW5nIHlvdSBtdXN0IGRlZmluZS4gSXQgY2FuIGJlIGEgcGF0aCwgVVJMLCBvciBhIHN0cmluZyBjb250ZW50IHJlc29sdmluZyB0byBhbiBPcGVuQVBJIHNwZWNpZmljYXRpb24uIEhleSBBUEkgc3VwcG9ydHMgYWxsIHZhbGlkIE9wZW5BUEkgdmVyc2lvbnMgYW5kIGZpbGUgZm9ybWF0cy4KCj4gSWYgeW91IHVzZSBhbiBIVFRQUyBVUkwgd2l0aCBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGluIGRldmVsb3BtZW50LCB5b3Ugd2lsbCBuZWVkIHRvIHNldCBbYE5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQ9MGBdKGh0dHBzOi8vZ2l0aHViLmNvbS9oZXktYXBpL29wZW5hcGktdHMvaXNzdWVzLzI3NiNpc3N1ZWNvbW1lbnQtMjA0MzE0MzUwMSkgaW4geW91ciBlbnZpcm9ubWVudC4KCiMjIyBPdXRwdXQKCk91dHB1dCBpcyB0aGUgbmV4dCB0aGluZyB0byBkZWZpbmUuIEl0IGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgcG9pbnRpbmcgdG8gdGhlIGRlc3RpbmF0aW9uIGZvbGRlciBvciBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlc3RpbmF0aW9uIGZvbGRlciBwYXRoIGFuZCBvcHRpb25hbCBzZXR0aW5ncyAodGhlc2UgYXJlIGRlc2NyaWJlZCBiZWxvdykuCgo+IFlvdSBzaG91bGQgdHJlYXQgdGhlIG91dHB1dCBmb2xkZXIgYXMgYSBkZXBlbmRlbmN5LiBEbyBub3QgZGlyZWN0bHkgbW9kaWZ5IGl0cyBjb250ZW50cyBhcyB5b3VyIGNoYW5nZXMgbWlnaHQgYmUgZXJhc2VkIHdoZW4geW91IHJ1biBgQGhleS1hcGkvb3BlbmFwaS10c2AgYWdhaW4uCgojIyMgQ2xpZW50CgpDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3Igc2VuZGluZyB0aGUgYWN0dWFsIEhUVFAgcmVxdWVzdHMuIFRoZSBgY2xpZW50YCB2YWx1ZSBpcyBub3QgcmVxdWlyZWQsIGJ1dCB5b3UgbXVzdCBkZWZpbmUgaXQgaWYgeW91J3JlIGdlbmVyYXRpbmcgU0RLcyAoZW5hYmxlZCBieSBkZWZhdWx0KS4KCllvdSBjYW4gbGVhcm4gbW9yZSBvbiB0aGUgW0NsaWVudHNdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL2NsaWVudHMpIHBhZ2UuCgojIyBQbHVnaW5zCgpQbHVnaW5zIGFyZSByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyBhcnRpZmFjdHMgZnJvbSB5b3VyIGlucHV0LiBCeSBkZWZhdWx0LCBIZXkgQVBJIHdpbGwgZ2VuZXJhdGUgVHlwZVNjcmlwdCBpbnRlcmZhY2VzIGFuZCBTREsgZnJvbSB5b3VyIE9wZW5BUEkgc3BlY2lmaWNhdGlvbi4gWW91IGNhbiBhZGQsIHJlbW92ZSwgb3IgY3VzdG9taXplIGFueSBvZiB0aGUgcGx1Z2lucy4gSW4gZmFjdCwgd2UgaGlnaGx5IGVuY291cmFnZSB5b3UgdG8gZG8gc28hCgojIyMgTmF0aXZlIFBsdWdpbnMKClRoZXNlIHBsdWdpbnMgaGVscCByZWR1Y2UgYm9pbGVycGxhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXJkLXBhcnR5IGRlcGVuZGVuY2llcy4gSGV5IEFQSSBuYXRpdmVseSBzdXBwb3J0cyB0aGUgbW9zdCBwb3B1bGFyIHBhY2thZ2VzLiBQbGVhc2Ugb3BlbiBhbiBpc3N1ZSBvbiBbR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vaGV5LWFwaS9vcGVuYXBpLXRzL2lzc3VlcykgaWYgeW91J2QgbGlrZSB1cyB0byBzdXBwb3J0IHlvdXIgZmF2b3JpdGUgcGFja2FnZS4KCi0gW2BAaGV5LWFwaS9zY2hlbWFzYF0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvb3V0cHV0L2pzb24tc2NoZW1hKQotIFtgQGhleS1hcGkvc2RrYF0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvb3V0cHV0L3NkaykKLSBbYEBoZXktYXBpL3RyYW5zZm9ybWVyc2BdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL3RyYW5zZm9ybWVycykKLSBbYEBoZXktYXBpL3R5cGVzY3JpcHRgXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9vdXRwdXQvdHlwZXNjcmlwdCkKLSBbYEB0YW5zdGFjay9hbmd1bGFyLXF1ZXJ5LWV4cGVyaW1lbnRhbGBdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL3BsdWdpbnMvdGFuc3RhY2stcXVlcnkpCi0gW2BAdGFuc3RhY2svcmVhY3QtcXVlcnlgXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL3RhbnN0YWNrLXF1ZXJ5KQotIFtgQHRhbnN0YWNrL3NvbGlkLXF1ZXJ5YF0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy90YW5zdGFjay1xdWVyeSkKLSBbYEB0YW5zdGFjay9zdmVsdGUtcXVlcnlgXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL3RhbnN0YWNrLXF1ZXJ5KQotIFtgQHRhbnN0YWNrL3Z1ZS1xdWVyeWBdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL3BsdWdpbnMvdGFuc3RhY2stcXVlcnkpCi0gW2BmYXN0aWZ5YF0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy9mYXN0aWZ5KQotIFtgem9kYF0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy96b2QpCgojIyMgUGxhbm5lZCBQbHVnaW5zCgpUaGUgZm9sbG93aW5nIHBsdWdpbnMgYXJlIHBsYW5uZWQgYnV0IG5vdCBpbiBkZXZlbG9wbWVudCB5ZXQuIFlvdSBjYW4gaGVscCB1cyBwcmlvcml0aXplIHRoZW0gYnkgdm90aW5nIG9uIFtHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9oZXktYXBpL29wZW5hcGktdHMvbGFiZWxzL1JTVlAlMjAlRjAlOUYlOTElOEQlRjAlOUYlOTElOEUpLgoKLSBbQWp2XShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL2FqdikKLSBbQXJrdHlwZV0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy9hcmt0eXBlKQotIFtFeHByZXNzXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL2V4cHJlc3MpCi0gW0Zha2VyXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL2Zha2VyKQotIFtIb25vXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL2hvbm8pCi0gW0pvaV0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy9qb2kpCi0gW0tvYV0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy9rb2EpCi0gW01TV10oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy9tc3cpCi0gW05lc3RdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL3BsdWdpbnMvbmVzdCkKLSBbTm9ja10oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy9ub2NrKQotIFtQaW5pYSBDb2xhZGFdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL3BsdWdpbnMvcGluaWEtY29sYWRhKQotIFtTdXBlcnN0cnVjdF0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy9zdXBlcnN0cnVjdCkKLSBbU3VwZXJ0ZXN0XShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL3N1cGVydGVzdCkKLSBbU1dSXShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL3N3cikKLSBbVHlwZUJveF0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy90eXBlYm94KQotIFtWYWxpYm90XShodHRwczovL2hleWFwaS5kZXYvb3BlbmFwaS10cy9wbHVnaW5zL3ZhbGlib3QpCi0gW1l1cF0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvcGx1Z2lucy95dXApCi0gW1p1c3RhbmRdKGh0dHBzOi8vaGV5YXBpLmRldi9vcGVuYXBpLXRzL3BsdWdpbnMvenVzdGFuZCkKCiMjIE1pZ3JhdGlvbiBHdWlkZXMKCltPcGVuQVBJIFR5cGVzY3JpcHQgQ29kZWdlbl0oaHR0cHM6Ly9oZXlhcGkuZGV2L29wZW5hcGktdHMvbWlncmF0aW5nI29wZW5hcGktdHlwZXNjcmlwdC1jb2RlZ2VuKQoKIyMgTGljZW5zZQoKUmVsZWFzZWQgdW5kZXIgdGhlIFtNSVQgTGljZW5zZV0oaHR0cHM6Ly9naXRodWIuY29tL2hleS1hcGkvb3BlbmFwaS10cy9ibG9iL21haW4vTElDRU5TRS5tZCkuCg==
+ readmeEtag: '"821300fa9f4dec10d49d669ddb5a5b773e1449cf"'
+ readmeLastModified: Tue, 14 Jan 2025 19:46:58 GMT
repositoryId: 741524414
description: >-
🚀 The OpenAPI to TypeScript codegen. Generate clients, SDKs, validators,
and more. Support: @mrlubos
created: '2024-01-10T15:19:25Z'
- updated: '2025-01-14T02:31:19Z'
+ updated: '2025-01-15T03:18:49Z'
language: TypeScript
archived: false
- stars: 1645
+ stars: 1659
watchers: 7
forks: 115
owner: hey-api
logo: https://avatars.githubusercontent.com/u/164436240?v=4
license: MIT
- repoEtag: '"9bd728a400766efb9cb37f54ddc5b2552feeda8c94a9028f203c0bce29b85767"'
- repoLastModified: Tue, 14 Jan 2025 02:31:19 GMT
+ repoEtag: '"f1bf251336f5a7519c7fb20865bd87723b5286603c991b216224ddb9f999ca32"'
+ repoLastModified: Wed, 15 Jan 2025 03:18:49 GMT
category:
- Converters
- SDK
@@ -2074,11 +2074,11 @@
archived: false
stars: 899
watchers: 13
- forks: 236
+ forks: 237
owner: kogosoftwarellc
logo: https://avatars.githubusercontent.com/u/15419153?v=4
license: MIT
- repoEtag: '"7fcfd2d6c0f58b5618ab3703bb382b2d22c3b6c84bedb61fb43e3509ad762e47"'
+ repoEtag: '"545c76ad46123684968f8d71ef82abc597313dbf8cdecfab11f70c02942563dc"'
repoLastModified: Mon, 13 Jan 2025 08:36:33 GMT
foundInMaster: true
- source: https://openapi.tools/
@@ -2172,17 +2172,17 @@
🕸️ Create REST and GraphQL APIs, scaffold Jamstack webapps, stream
changes in real-time.
created: '2015-03-06T21:46:05Z'
- updated: '2025-01-14T02:22:10Z'
+ updated: '2025-01-14T15:06:12Z'
language: TypeScript
archived: false
- stars: 8766
+ stars: 8768
watchers: 213
forks: 963
owner: api-platform
logo: https://avatars.githubusercontent.com/u/13420081?v=4
license: MIT
- repoEtag: '"09ac161034799e876188b7cb69608b8e76a86f2401547f25ba20a058e41330c9"'
- repoLastModified: Tue, 14 Jan 2025 02:22:10 GMT
+ repoEtag: '"f8d7bd52a3d8a0f8ab64099f67d8fc114811e062216ca4d0be51e8e56eb79a49"'
+ repoLastModified: Tue, 14 Jan 2025 15:06:12 GMT
foundInMaster: true
id: d14f5904300aabf1ceef4660a6b3d57e
- source: https://openapi.tools/
@@ -2354,17 +2354,17 @@
repositoryId: 105440153
description: 'OpenAPI (Swagger) module for Nest framework (node.js) :earth_americas:'
created: '2017-10-01T12:20:24Z'
- updated: '2025-01-14T01:12:09Z'
+ updated: '2025-01-14T22:38:09Z'
language: TypeScript
archived: false
- stars: 1724
+ stars: 1726
watchers: 31
- forks: 485
+ forks: 486
owner: nestjs
logo: https://avatars.githubusercontent.com/u/28507035?v=4
license: MIT
- repoEtag: '"74d483e71adff6f644ade1638972669987f1417894e01b479799541fe4eaa0a4"'
- repoLastModified: Tue, 14 Jan 2025 01:12:09 GMT
+ repoEtag: '"7d243e559e54a736c5ee421e978bef17a845cb13065f465da53b0fd0a74605d6"'
+ repoLastModified: Tue, 14 Jan 2025 22:38:09 GMT
foundInMaster: true
id: 7071babd9853fc901c5decfa9b465b67
- source:
@@ -2427,17 +2427,17 @@
repositoryId: 12590052
description: Language-agnostic HTTP API Testing Tool
created: '2013-09-04T12:21:35Z'
- updated: '2025-01-09T15:07:26Z'
+ updated: '2025-01-14T21:04:01Z'
language: JavaScript
archived: true
- stars: 4196
+ stars: 4195
watchers: 74
forks: 280
owner: apiaryio
logo: https://avatars.githubusercontent.com/u/765943?v=4
license: MIT
- repoEtag: '"d6c8eda43ee9e2890c32f87fa7b6a7417243770abc10de4e8ac804cfbf639acc"'
- repoLastModified: Thu, 09 Jan 2025 15:07:26 GMT
+ repoEtag: '"5bc1d44d4599249f773dfc2d348571c265c950be03a5d3ca968498e576368711"'
+ repoLastModified: Tue, 14 Jan 2025 21:04:01 GMT
foundInMaster: true
id: bb2e4b0879fce0d8706dcebfd2c10a4c
- source: https://openapi.tools/
@@ -2505,7 +2505,7 @@
owner: cdimascio
logo: https://avatars.githubusercontent.com/u/4706618?v=4
license: MIT
- repoEtag: '"450047e654f7a0e534f0cc4235db4ed17db4b901cab4de74ca4724026c1e50ad"'
+ repoEtag: '"38afc94bc364f2105022bf1412641bdf4feccf690d5f625073e85a91ac9a9069"'
repoLastModified: Mon, 13 Jan 2025 22:07:51 GMT
foundInMaster: true
id: 3a27bc1a71642e0c1c020c41dc66e206
@@ -2688,17 +2688,17 @@
baked in support for OpenAPI (v3.1, v3.0, and v2.0), Arazzo v1.0, as well
as AsyncAPI v2.x.
created: '2018-08-15T18:43:18Z'
- updated: '2025-01-13T16:28:20Z'
+ updated: '2025-01-14T16:38:34Z'
language: TypeScript
archived: false
- stars: 2584
+ stars: 2586
watchers: 34
forks: 240
owner: stoplightio
logo: https://avatars.githubusercontent.com/u/10767217?v=4
license: Apache-2.0
- repoEtag: '"edce0a71f7443730f181ca620158061ca1cded43e6b4f34ade9e74cffca55545"'
- repoLastModified: Mon, 13 Jan 2025 16:28:20 GMT
+ repoEtag: '"b5cfa74dcfc3a22a05e0eb4a3be0a90401a7c5225259c171e075d00ca34d4365"'
+ repoLastModified: Tue, 14 Jan 2025 16:38:34 GMT
foundInMaster: true
id: fab3cc58898cd8953a30e43cc622e0fe
- source: https://openapi.tools/
@@ -2752,17 +2752,17 @@
repositoryId: 153173690
description: Configurable and extensible validator/linter for OpenAPI documents
created: '2018-10-15T19:59:22Z'
- updated: '2025-01-10T22:00:37Z'
+ updated: '2025-01-15T02:40:18Z'
language: JavaScript
archived: false
- stars: 514
+ stars: 515
watchers: 23
forks: 91
owner: IBM
logo: https://avatars.githubusercontent.com/u/1459110?v=4
license: Apache-2.0
- repoEtag: '"41df5695d50edceb772f2a8e2e51a97bbe6b8f64ec5bb3224293198497715ae6"'
- repoLastModified: Fri, 10 Jan 2025 22:00:37 GMT
+ repoEtag: '"482cc4438e1a954e76699e21754ff3725659116f48d346310425d100a5c6c216"'
+ repoLastModified: Wed, 15 Jan 2025 02:40:18 GMT
foundInMaster: true
id: 0bf7dd29a9d07232135bb00764928296
v3_1: true
@@ -2784,7 +2784,7 @@
⚒️ Redocly CLI makes OpenAPI easy. Lint/validate to any standard, generate
beautiful docs, and more.
created: '2019-09-10T14:56:25Z'
- updated: '2025-01-13T16:47:37Z'
+ updated: '2025-01-14T15:19:46Z'
language: TypeScript
archived: false
stars: 983
@@ -2793,8 +2793,8 @@
owner: Redocly
logo: https://avatars.githubusercontent.com/u/32099856?v=4
license: MIT
- repoEtag: '"74a53f12238440bbca9737e0cc6955428e8cba3b5525f5d4a20aac1f60b5a1fd"'
- repoLastModified: Mon, 13 Jan 2025 16:47:37 GMT
+ repoEtag: '"df8ec99834b1ff20e85e4e0adc86493d0b180a0e12c14d805a5bfd5784c7d907"'
+ repoLastModified: Tue, 14 Jan 2025 15:19:46 GMT
category:
- Description Validators
- Documentation
@@ -2877,12 +2877,12 @@
language: Ruby
archived: false
stars: 887
- watchers: 17
+ watchers: 16
forks: 137
owner: interagent
logo: https://avatars.githubusercontent.com/u/7388387?v=4
license: MIT
- repoEtag: '"71695ed608562f725edd05b5f31d7e075e798f53595840b24f0c25934a66efbc"'
+ repoEtag: '"71cd25e5041758c4041196934106396268d759e935e13c8cadecf40295523b4f"'
repoLastModified: Fri, 10 Jan 2025 15:56:43 GMT
foundInMaster: true
id: 64f8f7a816e2d8825abd1a213d9e3fb5
@@ -2902,17 +2902,17 @@
contract-testing against an OpenAPI API description. It makes APIFirst
easy and reliable.
created: '2019-02-20T09:11:47Z'
- updated: '2025-01-11T22:18:12Z'
+ updated: '2025-01-14T03:41:18Z'
language: Ruby
archived: false
- stars: 132
+ stars: 133
watchers: 6
forks: 15
owner: ahx
logo: https://avatars.githubusercontent.com/u/8669?v=4
license: MIT
- repoEtag: '"53981f9d505d37ad5b1d2bb33edec7c23a7cfb7cf251a042abe3078d77390f24"'
- repoLastModified: Sat, 11 Jan 2025 22:18:12 GMT
+ repoEtag: '"53b2c34f3496cacb5c2b20f3b239ad03b6ae788a7d5f7d1998c335401e5733db"'
+ repoLastModified: Tue, 14 Jan 2025 03:41:18 GMT
foundInMaster: true
category: Data Validators
id: d8781910209a542c2f846aa8c740baf2
@@ -3115,10 +3115,10 @@
archived: false
stars: 130
watchers: 9
- forks: 30
+ forks: 31
owner: RepreZen
logo: https://avatars.githubusercontent.com/u/15205934?v=4
- repoEtag: '"cc8e043a99152b4b95181d8fc7bba0976c76942cdc4cba5cc12ad3cf15063ae1"'
+ repoEtag: '"a88588d140f2b517f2344efe8f22a6dce1d781bd7397c31d2c1621e188bbae84"'
repoLastModified: Fri, 19 Jul 2024 11:55:42 GMT
foundInMaster: true
homepage: https://github.com/RepreZen/KaiZen-OpenAPI-Parser
@@ -3176,17 +3176,17 @@
OpenAPI 3.0 (and Swagger v2) implementation for Go (parsing, converting,
validation, and more)
created: '2017-06-11T20:12:06Z'
- updated: '2025-01-13T20:11:47Z'
+ updated: '2025-01-14T23:11:44Z'
language: Go
archived: false
- stars: 2701
+ stars: 2702
watchers: 23
forks: 437
owner: getkin
logo: https://avatars.githubusercontent.com/u/40365715?v=4
license: MIT
- repoEtag: '"1afaa8a15e5284830d3497a1650fc7d7a3023f3c6d6631eefe7fd07b9c655d10"'
- repoLastModified: Mon, 13 Jan 2025 20:11:47 GMT
+ repoEtag: '"588d2024b0b139ca194a1033317ba1f91d950cd00bb015905365946d9283f87b"'
+ repoLastModified: Tue, 14 Jan 2025 23:11:44 GMT
foundInMaster: true
v2: true
id: f6838ce08e87fa4c3dc813c97193ece3
@@ -3232,7 +3232,7 @@
owner: thephpleague
logo: https://avatars.githubusercontent.com/u/527621?v=4
license: MIT
- repoEtag: '"0b0c6852d236b2f8e981af158dd865dcbc218785faf9ec21c8f08140c65bf1e1"'
+ repoEtag: '"0a1ec3c5cbbb5c9443b55939b54bd80b338ef6ec114507f6cdfe471b50dab8fd"'
repoLastModified: Sat, 11 Jan 2025 16:39:56 GMT
foundInMaster: true
v3_1_link: https://github.com/thephpleague/openapi-psr7-validator/issues/163
@@ -3385,7 +3385,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: '2025-01-13T23:16:30Z'
+ updated: '2025-01-14T21:35:07Z'
language: C#
archived: false
stars: 1435
@@ -3394,8 +3394,8 @@
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"3ffd7ef16308694a780e9dbad72b3edd3d45adaa5153a413705b1bd2e525c6fe"'
- repoLastModified: Mon, 13 Jan 2025 23:16:30 GMT
+ repoEtag: '"0a6b6c1055057d8efeeba5f221e1d6e40ecb4761d60fe6f64730dbaa361373cb"'
+ repoLastModified: Tue, 14 Jan 2025 21:35:07 GMT
foundInMaster: true
id: 1066748bb5b1f114a70856a29fee4aa7
- source:
@@ -3480,17 +3480,17 @@
repositoryId: 107609542
description: Open API 3 Parser/Validator for Ruby
created: '2017-10-19T23:33:52Z'
- updated: '2025-01-10T03:15:52Z'
+ updated: '2025-01-14T22:24:16Z'
language: Ruby
archived: false
- stars: 93
+ stars: 94
watchers: 8
forks: 12
owner: kevindew
logo: https://avatars.githubusercontent.com/u/282717?v=4
license: MIT
- repoEtag: '"6c479d83c88a823e27f9ca46e385d07ad57c97d64393d6cd8c2ed22238a56686"'
- repoLastModified: Fri, 10 Jan 2025 03:15:52 GMT
+ repoEtag: '"2432e7fb8a4c44e276a16f8be5b1ae2f722fb653dd80e74f3c9fa1392ff57039"'
+ repoLastModified: Tue, 14 Jan 2025 22:24:16 GMT
foundInMaster: true
id: 609fe191ac5d7b1b89c772e47fd2deb8
- source: https://openapi.tools/
@@ -3521,25 +3521,25 @@
id: 0c78f909fbd7707b739560ebfa258b81
repositoryMetadata:
base64Readme: >-
- IyBPcGVuQVBJIFNESyBnZW5lcmF0b3IgLSBBUEkgY2xpZW50IGdlbmVyYXRvcgoKQVBJIGNsaWVudCBnZW5lcmF0b3IgaXMgYSBjb25zb2xlIGFwcGxpY2F0aW9uIGNhcGFibGUgb2YgYXV0by1nZW5lcmF0aW5nIGEgW1BTUjE4XShodHRwczovL3d3dy5waHAtZmlnLm9yZy9wc3IvcHNyLTE4LykvW1BTUjddKGh0dHBzOi8vd3d3LnBocC1maWcub3JnL3Bzci9wc3ItNy8pIGNvbXBsaWFudCBBUEkgY2xpZW50IGJhc2VkIG9uIFtPcGVuQVBJIHYzXShodHRwczovL3N3YWdnZXIuaW8vc3BlY2lmaWNhdGlvbi8pIHNwZWNpZmljYXRpb24gYWNjb3JkaW5nIHRvIFBIUCBiZXN0IHByYWN0aWNlcyBhbmQgeW91ciBjb2RlIHN0eWxlIHN0YW5kYXJkcy4KClshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL0RvY2xlckxhYnMvYXBpLWNsaWVudC1nZW5lcmF0b3Iuc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL3RyYXZpcy1jaS5vcmcvRG9jbGVyTGFicy9hcGktY2xpZW50LWdlbmVyYXRvcikKWyFbQ292ZXJhZ2UgU3RhdHVzXShodHRwczovL2NvdmVyYWxscy5pby9yZXBvcy9naXRodWIvRG9jbGVyTGFicy9hcGktY2xpZW50LWdlbmVyYXRvci9iYWRnZS5zdmc/YnJhbmNoPW1hc3RlcildKGh0dHBzOi8vY292ZXJhbGxzLmlvL2dpdGh1Yi9Eb2NsZXJMYWJzL2FwaS1jbGllbnQtZ2VuZXJhdG9yP2JyYW5jaD1tYXN0ZXIpClshW1BIUFN0YW4gTGV2ZWxdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvUEhQU3Rhbi1sZXZlbCUyMDgtYnJpZ2h0Z3JlZW4uc3ZnP3N0eWxlPWZsYXQpXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL1BIUFN0YW4tbGV2ZWwlMjA4LWJyaWdodGdyZWVuLnN2Zz9zdHlsZT1mbGF0KQoKIyMgUmVxdWlyZW1lbnRzCi0gT3BlbkFQSSA+PSAzLjAKLSBQSFAgPj0gNy4wCgojIyBXaHkgdXNpbmcgaXQ/Ci0gV2l0aCBnZW5lcmF0ZWQgY2xpZW50IHlvdSBhcmUgYWx3YXlzIHN1cmUgdGhhdCB5b3VyIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpcyB1cC10by1kYXRlLgotIFdvcmsgd2l0aCBvYmplY3RzIGluc3RlYWQgb2YgcmF3IGRhdGEsIGl0IGlzIE9PUCBmcmllbmRseS4KLSBTYXZlcyB5b3VyIHRpbWUuIFlvdSBkb24ndCBuZWVkIHRvIHdyaXRlIGRhdGEgbWFwcGVycyB5b3Vyc2VsZiB0byBwb3B1bGF0ZSB0aG9zZSBvYmplY3RzIHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgcmVzcG9uc2UuCi0gQWxsIHRoZSBiYXNpYyB0eXBlIHZhbGlkYXRpb25zIGluIHRoZSByZXF1ZXN0IGFuZCB0aGUgcmVzcG9uc2UgZG9uZSBhdXRvbWF0aWNhbGx5LgotIERlc3BpdGUgdGhlIGZhY3QgdGhlIGNvZGUgaXMgZ2VuZXJhdGVkIGl0J3MgY2xlYXIgYW5kIHJlYWRhYmxlLCBzaW1wbGUgdG8gZGVidWcgYW5kIHRvIHJlYXNvbiBhYm91dC4KLSBIaWdobHkgY29uZmlndXJhYmxlIGFuZCBleHRlbnNpYmxlLgotIFJlbGlhYmxlIGFuZCB3ZWxsIHRlc3RlZC4KLSBTaW1wbHksICoqaWYgc29tZXRoaW5nIGNhbiBiZSBhdXRvbWF0ZWQgaXQgc2hvdWxkIGJlIGF1dG9tYXRlZC4qKiAgRm9jdXMgb24gaW1wb3J0YW50IHN0dWZmLgoKIyMgRmVhdHVyZXMKLSBTdXBwb3J0cyB5YW1sIG9yIGpzb24gc3BlY2lmaWNhdGlvbiBmaWxlIGZvcm1hdHMuCi0gVmFsaWRhdGVzIHlvdXIgT3BlbkFQSSBzcGVjaWZpY2F0aW9uLgotIFN1cHBvcnRzIG11bHRpcGxlIGNvbnRlbnQgdHlwZXM6CiAgICAqIGFwcGxpY2F0aW9uL2pzb24KICAgICogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkCiAgICAqIGFwcGxpY2F0aW9uL3htbAotIFN1cHBvcnRzIG5ldyBQSFAgdmVyc2lvbnMgc3ludGF4IGZlYXR1cmVzLgotIEl0IGlzIGJhc2UgY2xpZW50IGluZGVwZW5kZW50LCB5b3UgYXJlIGZyZWUgdG8gY2hvb3NlIGFueSBbZXhpc3RpbmcgUFNSLTE4IGNvbXBsaWFudCBjbGllbnRdKGh0dHBzOi8vcGFja2FnaXN0Lm9yZy9wcm92aWRlcnMvcHNyL2h0dHAtY2xpZW50LWltcGxlbWVudGF0aW9uKS4gSnVzdCBjaG9vc2UgdGhlIG9uZSB3aGljaCB5b3UgYWxyZWFkeSB1c2UsIHNvIGdlbmVyYXRlZCBjbGllbnQgd291bGQgbm90IGNhdXNlIGFueSBjb25mbGljdHMgd2l0aCB5b3VyIGRlcGVuZGVuY2llcy4gQWx0aG91Z2ggbm90IHJlY29tbWVuZGVkLCB5b3UgY2FuIGFsc28gdXNlIG9yIGJ1aWxkIHlvdXIgb3duIFBTUi0xOCBpbXBsZW1lbnRhdGlvbiwgYXMgdGhlIGdlbmVyYXRlZCBjbGllbnQgZGVwZW5kcyBvbiBQU1IgaW50ZXJmYWNlcyBvbmx5LgotIEFwcGxpZXMgY29kZSBzdHlsZSBydWxlcyB0byBnZW5lcmF0ZWQgY29kZSwgeW91IGNhbiBzcGVjaWZ5IHlvdXIgb3duLgotIEdlbmVyYXRlcyBSRUFETUUgYW5kIGNvbXBvc2VyLmpzb24gZmlsZXMgd2l0aCBwb3NzaWJpbGl0eSB0byB1c2UgeW91ciBvd24gdGVtcGxhdGUuCi0gU3VwcG9ydHMgYGFsbE9mYCwgYG9uZU9mYCwgYGFueU9mYCBPcGVuQVBJIHBhcmFtZXRlcnMuCi0gU3VwcG9ydHMgbnVsbGFibGUgb3B0aW9uYWwgc2NoZW1lIHByb3BlcnR5LgoKIyMgRXhhbXBsZQpDaGVjayBvdXQgW2V4YW1wbGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2NsZXJMYWJzL2FwaS1jbGllbnQtZ2VuZXJhdG9yL3RyZWUvbWFzdGVyL2V4YW1wbGUpIGRpcmVjdG9yeSB0byBzZWUgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IGFwaS1jbGllbnQtZ2VuZXJhdG9yLgoKVHJ5IGl0IG91dDoKYGBgYmFzaApjZCBleGFtcGxlICYmIFwKY29tcG9zZXIgaW5zdGFsbCAmJiBcCnBocCB0ZXN0LWV4YW1wbGUucGhwCmBgYAoKIyMgVXNhZ2UKIyMjIFdpdGggRG9ja2VyCmBgYGJhc2gKJCBkb2NrZXIgcnVuIC1pdCBcCi12IHtwYXRoLXRvLXNwZWNpZmljYXRpb259L29wZW5hcGkueWFtbDovb3BlbmFwaS55YW1sOnJvIFwKLXYge3BhdGgtdG8tY2xpZW50fS9zb21lLWFwaS1jbGllbnQ6L2NsaWVudCBcCi1lIE5BTUVTUEFDRT1Hcm91cFxcU29tZUFwaUNsaWVudCBcCi1lIE9QRU5BUEk9L29wZW5hcGkueWFtbCBcCi1lIE9VVFBVVF9ESVI9L2NsaWVudCBcCi1lIFBBQ0tBR0U9Z3JvdXAvc29tZS1hcGktY2xpZW50IFwKZGhsYWJzL2FwaS1jbGllbnQtZ2VuZXJhdG9yCmBgYAoKIyMjIFdpdGhvdXQgRG9ja2VyClByZWNvbmRpdGlvbnM6IFBIUCA3LjQKCkNsb25lIHRoZSByZXBvc2l0b3J5IGFuZCBydW46CmBgYGJhc2ggCk9QRU5BUEk9e3BhdGgtdG8tc3BlY2lmaWNhdGlvbn0vb3BlbmFwaS55YW1sIE5BTUVTUEFDRT1Hcm91cFxTb21lQXBpQ2xpZW50IFBBQ0tBR0U9Z3JvdXAvc29tZS1hcGktY2xpZW50IE9VVFBVVF9ESVI9e3BhdGgtdG8tY2xpZW50fS9nZW5lcmF0ZWQgLi9iaW4vYXBpLWNsaWVudC1nZW5lcmF0b3IgZ2VuZXJhdGUKYGBgIAoKIyMgQ29uZmlndXJhdGlvbgpUaGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgYXZhaWxhYmxlOgoKfCBWYXJpYWJsZSB8IFJlcXVpcmVkIHwgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFbnVtIHwgRXhhbXBsZSAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiB8CnwtLS0tLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgYE5BTUVTUEFDRWAgfCB5ZXMgfCB8IHwgR3JvdXBcXFNvbWVBcGlDbGllbnQgfAp8IGBQQUNLQUdFYCB8IHllcyB8IHwgfCBncm91cC9zb21lLWFwaS1jbGllbnQgfAp8IGBPUEVOQVBJIGAgfCB5ZXMgfCB8IHwgL2FwaS9vcGVuYXBpLnlhbWwgfAp8IGBPVVRQVVRfRElSYCB8IHllcyB8IHwgfCAvY2xpZW50IHwKfCBgQ09ERV9TVFlMRWAgfCBubyB8IHtwYXRoLXRvLXJlcG9zaXRvcnl9Ly5waHAtY3MtZml4ZXIucGhwLmRpc3QgfCB8IC9jbGllbnQvbXlDb2RlU3R5bGUucGhwIHwKfCBgU09VUkNFX0RJUmAgfCBubyB8IHNyYyB8IHwgc3JjIHwKfCBgQ0xJRU5UX1BIUF9WRVJTSU9OYCB8IG5vIHwgNy40IHwgNy4wLCA3LjEsIDcuMiwgNy4zLCA3LjQsIDguMCwgOC4xLCA4LjIsIDguMyB8IDcuNCB8CnwgYENPTVBPU0VSX0pTT05fVEVNUExBVEVfRElSYCB8IG5vIHwge3BhdGgtdG8tcmVwb3NpdG9yeX0vdGVtcGxhdGUvY29tcG9zZXIuanNvbi50d2lnIHwgfCAvcGF0aC9jb21wb3Nlci5qc29uLnR3aWcgfAp8IGBSRUFETUVfTURfVEVNUExBVEVfRElSYCB8IG5vIHwge3BhdGgtdG8tcmVwb3NpdG9yeX0vdGVtcGxhdGUvUkVBRE1FLm1kLnR3aWcgfCB8IC9wYXRoL1JFQURNRS5tZC50d2lnIHwKfCBgSFRUUF9NRVNTQUdFYCB8IG5vIHwgZ3V6emxlIHwgZ3V6emxlLCBueWhvbG0gfCBueWhvbG0gfAp8IGBDT05UQUlORVJgIHwgbm8gfCBwaW1wbGUgfCBwaW1wbGUgfCBwaW1wbGUgfAp8IGBJTkNMVURFX1RBR1NgIHwgbm8gfCB8IHwgdGFnMSx0YWcyLHRhZzMgfCB0YWcgd2hpdGVsaXN0IHRvIHNlbGVjdCBnZW5lcmF0ZWQgb3BlcmF0aW9ucyB8CnwgYEVYQ0xVREVfVEFHU2AgfCBubyB8IHwgfCB0YWcxLHRhZzIsdGFnMyB8IHRhZyBibGFja2xpc3QgdG8gc2VsZWN0IGdlbmVyYXRlZCBvcGVyYXRpb25zIHwKCiMjIFJ1bm5pbmcgdGVzdHMKCmBgYGJhc2gKJCBjb21wb3NlciBpbnN0YWxsCiQgbWFrZSB0ZXN0CmBgYAoKKGNoZWNrIGBtYWtlYCBmb3IgYWxsIGF2YWlsYWJsZSByb3V0aW5lcykuCg==
- readmeEtag: '"13048ced3d20d0bd15746eb60aadfcc1175c8dda"'
- readmeLastModified: Thu, 22 Aug 2024 09:46:52 GMT
+ IyBPcGVuQVBJIFNESyBnZW5lcmF0b3IgLSBBUEkgY2xpZW50IGdlbmVyYXRvcgoKQVBJIGNsaWVudCBnZW5lcmF0b3IgaXMgYSBjb25zb2xlIGFwcGxpY2F0aW9uIGNhcGFibGUgb2YgYXV0by1nZW5lcmF0aW5nIGEgW1BTUjE4XShodHRwczovL3d3dy5waHAtZmlnLm9yZy9wc3IvcHNyLTE4LykvW1BTUjddKGh0dHBzOi8vd3d3LnBocC1maWcub3JnL3Bzci9wc3ItNy8pIGNvbXBsaWFudCBBUEkgY2xpZW50IGJhc2VkIG9uIFtPcGVuQVBJIHYzXShodHRwczovL3N3YWdnZXIuaW8vc3BlY2lmaWNhdGlvbi8pIHNwZWNpZmljYXRpb24gYWNjb3JkaW5nIHRvIFBIUCBiZXN0IHByYWN0aWNlcyBhbmQgeW91ciBjb2RlIHN0eWxlIHN0YW5kYXJkcy4KClshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL0RvY2xlckxhYnMvYXBpLWNsaWVudC1nZW5lcmF0b3Iuc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL3RyYXZpcy1jaS5vcmcvRG9jbGVyTGFicy9hcGktY2xpZW50LWdlbmVyYXRvcikKWyFbQ292ZXJhZ2UgU3RhdHVzXShodHRwczovL2NvdmVyYWxscy5pby9yZXBvcy9naXRodWIvRG9jbGVyTGFicy9hcGktY2xpZW50LWdlbmVyYXRvci9iYWRnZS5zdmc/YnJhbmNoPW1hc3RlcildKGh0dHBzOi8vY292ZXJhbGxzLmlvL2dpdGh1Yi9Eb2NsZXJMYWJzL2FwaS1jbGllbnQtZ2VuZXJhdG9yP2JyYW5jaD1tYXN0ZXIpClshW1BIUFN0YW4gTGV2ZWxdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvUEhQU3Rhbi1sZXZlbCUyMDgtYnJpZ2h0Z3JlZW4uc3ZnP3N0eWxlPWZsYXQpXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL1BIUFN0YW4tbGV2ZWwlMjA4LWJyaWdodGdyZWVuLnN2Zz9zdHlsZT1mbGF0KQoKIyMgUmVxdWlyZW1lbnRzCi0gT3BlbkFQSSA+PSAzLjAKLSBQSFAgPj0gNy4wCgojIyBXaHkgdXNpbmcgaXQ/Ci0gV2l0aCBnZW5lcmF0ZWQgY2xpZW50IHlvdSBhcmUgYWx3YXlzIHN1cmUgdGhhdCB5b3VyIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpcyB1cC10by1kYXRlLgotIFdvcmsgd2l0aCBvYmplY3RzIGluc3RlYWQgb2YgcmF3IGRhdGEsIGl0IGlzIE9PUCBmcmllbmRseS4KLSBTYXZlcyB5b3VyIHRpbWUuIFlvdSBkb24ndCBuZWVkIHRvIHdyaXRlIGRhdGEgbWFwcGVycyB5b3Vyc2VsZiB0byBwb3B1bGF0ZSB0aG9zZSBvYmplY3RzIHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgcmVzcG9uc2UuCi0gQWxsIHRoZSBiYXNpYyB0eXBlIHZhbGlkYXRpb25zIGluIHRoZSByZXF1ZXN0IGFuZCB0aGUgcmVzcG9uc2UgZG9uZSBhdXRvbWF0aWNhbGx5LgotIERlc3BpdGUgdGhlIGZhY3QgdGhlIGNvZGUgaXMgZ2VuZXJhdGVkIGl0J3MgY2xlYXIgYW5kIHJlYWRhYmxlLCBzaW1wbGUgdG8gZGVidWcgYW5kIHRvIHJlYXNvbiBhYm91dC4KLSBIaWdobHkgY29uZmlndXJhYmxlIGFuZCBleHRlbnNpYmxlLgotIFJlbGlhYmxlIGFuZCB3ZWxsIHRlc3RlZC4KLSBTaW1wbHksICoqaWYgc29tZXRoaW5nIGNhbiBiZSBhdXRvbWF0ZWQgaXQgc2hvdWxkIGJlIGF1dG9tYXRlZC4qKiAgRm9jdXMgb24gaW1wb3J0YW50IHN0dWZmLgoKIyMgRmVhdHVyZXMKLSBTdXBwb3J0cyB5YW1sIG9yIGpzb24gc3BlY2lmaWNhdGlvbiBmaWxlIGZvcm1hdHMuCi0gVmFsaWRhdGVzIHlvdXIgT3BlbkFQSSBzcGVjaWZpY2F0aW9uLgotIFN1cHBvcnRzIG11bHRpcGxlIGNvbnRlbnQgdHlwZXM6CiAgICAqIGFwcGxpY2F0aW9uL2pzb24KICAgICogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkCiAgICAqIGFwcGxpY2F0aW9uL3htbAotIFN1cHBvcnRzIG5ldyBQSFAgdmVyc2lvbnMgc3ludGF4IGZlYXR1cmVzLgotIEl0IGlzIGJhc2UgY2xpZW50IGluZGVwZW5kZW50LCB5b3UgYXJlIGZyZWUgdG8gY2hvb3NlIGFueSBbZXhpc3RpbmcgUFNSLTE4IGNvbXBsaWFudCBjbGllbnRdKGh0dHBzOi8vcGFja2FnaXN0Lm9yZy9wcm92aWRlcnMvcHNyL2h0dHAtY2xpZW50LWltcGxlbWVudGF0aW9uKS4gSnVzdCBjaG9vc2UgdGhlIG9uZSB3aGljaCB5b3UgYWxyZWFkeSB1c2UsIHNvIGdlbmVyYXRlZCBjbGllbnQgd291bGQgbm90IGNhdXNlIGFueSBjb25mbGljdHMgd2l0aCB5b3VyIGRlcGVuZGVuY2llcy4gQWx0aG91Z2ggbm90IHJlY29tbWVuZGVkLCB5b3UgY2FuIGFsc28gdXNlIG9yIGJ1aWxkIHlvdXIgb3duIFBTUi0xOCBpbXBsZW1lbnRhdGlvbiwgYXMgdGhlIGdlbmVyYXRlZCBjbGllbnQgZGVwZW5kcyBvbiBQU1IgaW50ZXJmYWNlcyBvbmx5LgotIEFwcGxpZXMgY29kZSBzdHlsZSBydWxlcyB0byBnZW5lcmF0ZWQgY29kZSwgeW91IGNhbiBzcGVjaWZ5IHlvdXIgb3duLgotIEdlbmVyYXRlcyBSRUFETUUgYW5kIGNvbXBvc2VyLmpzb24gZmlsZXMgd2l0aCBwb3NzaWJpbGl0eSB0byB1c2UgeW91ciBvd24gdGVtcGxhdGUuCi0gU3VwcG9ydHMgYGFsbE9mYCwgYG9uZU9mYCwgYGFueU9mYCBPcGVuQVBJIHBhcmFtZXRlcnMuCi0gU3VwcG9ydHMgbnVsbGFibGUgb3B0aW9uYWwgc2NoZW1lIHByb3BlcnR5LgoKIyMgRXhhbXBsZQpDaGVjayBvdXQgW2V4YW1wbGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9Eb2NsZXJMYWJzL2FwaS1jbGllbnQtZ2VuZXJhdG9yL3RyZWUvbWFzdGVyL2V4YW1wbGUpIGRpcmVjdG9yeSB0byBzZWUgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IGFwaS1jbGllbnQtZ2VuZXJhdG9yLgoKVHJ5IGl0IG91dDoKYGBgYmFzaApjZCBleGFtcGxlICYmIFwKY29tcG9zZXIgaW5zdGFsbCAmJiBcCnBocCB0ZXN0LWV4YW1wbGUucGhwCmBgYAoKIyMgVXNhZ2UKIyMjIFdpdGggRG9ja2VyCmBgYGJhc2gKJCBkb2NrZXIgcnVuIC1pdCBcCi12IHtwYXRoLXRvLXNwZWNpZmljYXRpb259L29wZW5hcGkueWFtbDovb3BlbmFwaS55YW1sOnJvIFwKLXYge3BhdGgtdG8tY2xpZW50fS9zb21lLWFwaS1jbGllbnQ6L2NsaWVudCBcCi1lIE5BTUVTUEFDRT1Hcm91cFxcU29tZUFwaUNsaWVudCBcCi1lIE9QRU5BUEk9L29wZW5hcGkueWFtbCBcCi1lIE9VVFBVVF9ESVI9L2NsaWVudCBcCi1lIFBBQ0tBR0U9Z3JvdXAvc29tZS1hcGktY2xpZW50IFwKZGhsYWJzL2FwaS1jbGllbnQtZ2VuZXJhdG9yCmBgYAoKPiBpZiB5b3UncmUgcnVubmluZyB0aGlzIGNvbW1hbmQgb24gV2luZG93cyB5b3UgbWlnaHQgbmVlZCB0byB1c2Ugc2luZ2xlIGJhY2tzbGFzaCBpbnN0ZWFkIGluIC1lIE5BTUVTUEFDRQoKIyMjIFdpdGhvdXQgRG9ja2VyClByZWNvbmRpdGlvbnM6IFBIUCA3LjQKCkNsb25lIHRoZSByZXBvc2l0b3J5IGFuZCBydW46CmBgYGJhc2ggCk9QRU5BUEk9e3BhdGgtdG8tc3BlY2lmaWNhdGlvbn0vb3BlbmFwaS55YW1sIE5BTUVTUEFDRT1Hcm91cFxTb21lQXBpQ2xpZW50IFBBQ0tBR0U9Z3JvdXAvc29tZS1hcGktY2xpZW50IE9VVFBVVF9ESVI9e3BhdGgtdG8tY2xpZW50fS9nZW5lcmF0ZWQgLi9iaW4vYXBpLWNsaWVudC1nZW5lcmF0b3IgZ2VuZXJhdGUKYGBgIAoKIyMgQ29uZmlndXJhdGlvbgpUaGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgYXZhaWxhYmxlOgoKfCBWYXJpYWJsZSB8IFJlcXVpcmVkIHwgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFbnVtIHwgRXhhbXBsZSAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiB8CnwtLS0tLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgYE5BTUVTUEFDRWAgfCB5ZXMgfCB8IHwgR3JvdXBcXFNvbWVBcGlDbGllbnQgfAp8IGBQQUNLQUdFYCB8IHllcyB8IHwgfCBncm91cC9zb21lLWFwaS1jbGllbnQgfAp8IGBPUEVOQVBJIGAgfCB5ZXMgfCB8IHwgL2FwaS9vcGVuYXBpLnlhbWwgfAp8IGBPVVRQVVRfRElSYCB8IHllcyB8IHwgfCAvY2xpZW50IHwKfCBgQ09ERV9TVFlMRWAgfCBubyB8IHtwYXRoLXRvLXJlcG9zaXRvcnl9Ly5waHAtY3MtZml4ZXIucGhwLmRpc3QgfCB8IC9jbGllbnQvbXlDb2RlU3R5bGUucGhwIHwKfCBgU09VUkNFX0RJUmAgfCBubyB8IHNyYyB8IHwgc3JjIHwKfCBgQ0xJRU5UX1BIUF9WRVJTSU9OYCB8IG5vIHwgNy40IHwgNy4wLCA3LjEsIDcuMiwgNy4zLCA3LjQsIDguMCwgOC4xLCA4LjIsIDguMyB8IDcuNCB8CnwgYENPTVBPU0VSX0pTT05fVEVNUExBVEVfRElSYCB8IG5vIHwge3BhdGgtdG8tcmVwb3NpdG9yeX0vdGVtcGxhdGUvY29tcG9zZXIuanNvbi50d2lnIHwgfCAvcGF0aC9jb21wb3Nlci5qc29uLnR3aWcgfAp8IGBSRUFETUVfTURfVEVNUExBVEVfRElSYCB8IG5vIHwge3BhdGgtdG8tcmVwb3NpdG9yeX0vdGVtcGxhdGUvUkVBRE1FLm1kLnR3aWcgfCB8IC9wYXRoL1JFQURNRS5tZC50d2lnIHwKfCBgSFRUUF9NRVNTQUdFYCB8IG5vIHwgZ3V6emxlIHwgZ3V6emxlLCBueWhvbG0gfCBueWhvbG0gfAp8IGBDT05UQUlORVJgIHwgbm8gfCBwaW1wbGUgfCBwaW1wbGUgfCBwaW1wbGUgfAp8IGBJTkNMVURFX1RBR1NgIHwgbm8gfCB8IHwgdGFnMSx0YWcyLHRhZzMgfCB0YWcgd2hpdGVsaXN0IHRvIHNlbGVjdCBnZW5lcmF0ZWQgb3BlcmF0aW9ucyB8CnwgYEVYQ0xVREVfVEFHU2AgfCBubyB8IHwgfCB0YWcxLHRhZzIsdGFnMyB8IHRhZyBibGFja2xpc3QgdG8gc2VsZWN0IGdlbmVyYXRlZCBvcGVyYXRpb25zIHwKCiMjIFJ1bm5pbmcgdGVzdHMKCmBgYGJhc2gKJCBjb21wb3NlciBpbnN0YWxsCiQgbWFrZSB0ZXN0CmBgYAoKKGNoZWNrIGBtYWtlYCBmb3IgYWxsIGF2YWlsYWJsZSByb3V0aW5lcykuCg==
+ readmeEtag: '"8c1ca279271af3a1c6567ccf856aaafbb88b6cb5"'
+ readmeLastModified: Tue, 14 Jan 2025 11:11:53 GMT
repositoryId: 267043092
description: >-
API client generator is a console application capable of generating an API
client based on OpenAPI(Swagger) specification.
created: '2020-05-26T12:57:31Z'
- updated: '2024-12-17T00:24:48Z'
+ updated: '2025-01-14T11:11:59Z'
language: PHP
archived: false
stars: 35
- watchers: 15
+ watchers: 16
forks: 19
owner: DoclerLabs
logo: https://avatars.githubusercontent.com/u/12913135?v=4
license: MIT
- repoEtag: '"e56ea092e619f8abc27ffbaae97acaa689711c9e67b1a154f3fd92e6feff0fb1"'
- repoLastModified: Tue, 17 Dec 2024 00:24:48 GMT
+ repoEtag: '"329bdb9ba26122e5cb246bed7dec435cbf09e938e983905ffc504551b7d1dc0c"'
+ repoLastModified: Tue, 14 Jan 2025 11:11:59 GMT
foundInMaster: true
- source: https://openapi.tools/
name: janephp/open-api
@@ -3592,7 +3592,7 @@
repositoryId: 26726495
description: Swagger 2.0 implementation for go
created: '2014-11-16T20:13:15Z'
- updated: '2025-01-14T03:13:44Z'
+ updated: '2025-01-14T20:44:57Z'
language: Go
archived: false
stars: 9611
@@ -3601,8 +3601,8 @@
owner: go-swagger
logo: https://avatars.githubusercontent.com/u/10362650?v=4
license: Apache-2.0
- repoEtag: '"69eb571e7afe90fed06c3bf8569a7c37805c59d7061717cc4db029f5d06be03b"'
- repoLastModified: Tue, 14 Jan 2025 03:13:44 GMT
+ repoEtag: '"19b9b8863a74fb80391ba2952a3e6fdd0b4d57d3b220516020ad28d33124d031"'
+ repoLastModified: Tue, 14 Jan 2025 20:44:57 GMT
foundInMaster: true
id: ef136df9ffb40bb33ccbd76665d8f5b4
- source: https://openapi.tools/
@@ -3695,17 +3695,17 @@
repositoryId: 41822320
description: 'The Swagger/OpenAPI toolchain for .NET, ASP.NET Core and TypeScript. '
created: '2015-09-02T19:11:57Z'
- updated: '2025-01-13T14:08:04Z'
+ updated: '2025-01-14T14:23:04Z'
language: C#
archived: false
stars: 6864
watchers: 166
- forks: 1301
+ forks: 1299
owner: RicoSuter
logo: https://avatars.githubusercontent.com/u/2603405?v=4
license: MIT
- repoEtag: '"98e175370edc135d663ef6f15f94808036630bed1aa98850a021239a465cd371"'
- repoLastModified: Mon, 13 Jan 2025 14:08:04 GMT
+ repoEtag: '"605a2dbc8e6bd130784a230c95ba3883ebb5e7643518f829380e555cb4c34dc6"'
+ repoLastModified: Tue, 14 Jan 2025 14:23:04 GMT
foundInMaster: true
id: 93636e95435e95198d7d15c9d507f0d3
- source: https://openapi.tools/
@@ -3768,17 +3768,17 @@
documentation, API clients and server stubs in different languages by
parsing your OpenAPI / Swagger definition.
created: '2011-07-06T14:26:48Z'
- updated: '2025-01-13T15:05:14Z'
+ updated: '2025-01-14T23:09:42Z'
language: Mustache
archived: false
- stars: 17156
+ stars: 17157
watchers: 413
forks: 6024
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"700245c0545acf81a07231025ef2891f3abf361751aeafe673ddf408feb07958"'
- repoLastModified: Mon, 13 Jan 2025 15:05:14 GMT
+ repoEtag: '"e818abafde174b2ac4a0ef8028ceb8bf6e612228def0e6c46b60dc9fecb24075"'
+ repoLastModified: Tue, 14 Jan 2025 23:09:42 GMT
foundInMaster: true
id: eda1e66e1b7805496e42f57851791a32
- source: https://openapi.tools/
@@ -3802,17 +3802,17 @@
OpenAPI (f.k.a Swagger) Specification code generator. Supports C#,
PowerShell, Go, Java, Node.js, TypeScript, Python
created: '2015-02-20T23:02:54Z'
- updated: '2025-01-13T20:52:07Z'
+ updated: '2025-01-15T02:42:17Z'
language: TypeSpec
archived: false
- stars: 4665
+ stars: 4666
watchers: 927
- forks: 743
+ forks: 742
owner: Azure
logo: https://avatars.githubusercontent.com/u/6844498?v=4
license: MIT
- repoEtag: '"c5e4038a74988657c33bd13ffc5a66b960248679724348b954c4079bbe2d55fb"'
- repoLastModified: Mon, 13 Jan 2025 20:52:07 GMT
+ repoEtag: '"9625bceac1e234ca7ea026be3b4e60b05264ec0b0ff0a32b403fbda08858c66b"'
+ repoLastModified: Wed, 15 Jan 2025 02:42:17 GMT
foundInMaster: true
id: 648d92bca90bf58cd74407e0bcad2936
- source: https://openapi.tools/
@@ -4127,7 +4127,7 @@
owner: Cornutum
logo: https://avatars.githubusercontent.com/u/11477145?v=4
license: MIT
- repoEtag: '"07e404bf722d46427f14a4db9458559bf5f57833c347006eb3288c1422ba6f87"'
+ repoEtag: '"23c657adc404317491f4ba1128f1277e205d157e75756eb43ca6d20d1095cbf3"'
repoLastModified: Sun, 12 Jan 2025 14:11:02 GMT
foundInMaster: true
id: 64dc602f01798a9a39aba18c09d655ae
@@ -4196,17 +4196,17 @@
Black-box fuzzer that fuzzes APIs based on OpenAPI specification. Find
bugs for free!
created: '2020-12-23T22:33:38Z'
- updated: '2025-01-12T17:02:10Z'
+ updated: '2025-01-14T21:19:35Z'
language: Rust
archived: false
- stars: 547
+ stars: 548
watchers: 8
forks: 25
owner: matusf
logo: https://avatars.githubusercontent.com/u/18228995?v=4
license: AGPL-3.0
- repoEtag: '"33f5b5f637a1f6199ff1fb77b4c2c34283077c369839dcc79eb045179628e59d"'
- repoLastModified: Sun, 12 Jan 2025 17:02:10 GMT
+ repoEtag: '"7c207de559acc553aeeef0f1091498306d46271fb11e3697c4bd4033dadbdacb"'
+ repoLastModified: Tue, 14 Jan 2025 21:19:35 GMT
id: 9e0191ba47403298459b30242dbfe9ad
- source: https://openapi.tools/
name: cats
@@ -4237,17 +4237,17 @@
configuration and no coding effort. Tests are self-healing and do not
require maintenance.
created: '2020-04-02T13:14:39Z'
- updated: '2025-01-13T05:27:34Z'
+ updated: '2025-01-14T18:23:48Z'
language: Java
archived: false
- stars: 1218
+ stars: 1219
watchers: 14
forks: 76
owner: Endava
logo: https://avatars.githubusercontent.com/u/19396140?v=4
license: Apache-2.0
- repoEtag: '"8fbe6becd6ca695830512bd05ee15241671f481d039bbfd89c5c769acbbdfc5a"'
- repoLastModified: Mon, 13 Jan 2025 05:27:34 GMT
+ repoEtag: '"f3947476d1a8c007e8231a84fb746fdde9769da70d56475579cc8867e34f21e1"'
+ repoLastModified: Tue, 14 Jan 2025 18:23:48 GMT
foundInMaster: true
- source: https://openapi.tools/
name: API Insights
@@ -4478,16 +4478,16 @@
repositoryId: 491304964
description: Automagically reverse-engineer REST APIs via capturing traffic
created: '2022-05-11T23:48:49Z'
- updated: '2025-01-14T02:49:22Z'
+ updated: '2025-01-15T02:44:27Z'
language: HTML
archived: false
- stars: 8454
+ stars: 8464
watchers: 30
forks: 300
owner: alufers
logo: https://avatars.githubusercontent.com/u/5400940?v=4
- repoEtag: '"5080cec4e9c5ee80f4375ccc6eef4986d8868eefe10fa6cfa9118471fd2050d1"'
- repoLastModified: Tue, 14 Jan 2025 02:49:22 GMT
+ repoEtag: '"8861f65efff6da1e371bb522b923aa06a91db9663ddc54e279897421fbd3d0a4"'
+ repoLastModified: Wed, 15 Jan 2025 02:44:27 GMT
foundInMaster: true
- source: https://openapi.tools/
name: OpenApiSpecGeneratorPlugin
@@ -4513,17 +4513,17 @@
Dev Proxy is an API simulator that helps you effortlessly test your app
beyond the happy path.
created: '2022-09-09T18:11:29Z'
- updated: '2025-01-13T14:42:25Z'
+ updated: '2025-01-14T06:50:17Z'
language: C#
archived: false
- stars: 565
+ stars: 566
watchers: 16
forks: 64
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"0380d45d198caef0dfcdbd4ca5cc1dd6fbd93cbbe668b54982abb760cfc162bc"'
- repoLastModified: Mon, 13 Jan 2025 14:42:25 GMT
+ repoEtag: '"ea9d378c1d621cbf52a46bb30b7b28f6a404c2722e61389cce0fe61ce63d963c"'
+ repoLastModified: Tue, 14 Jan 2025 06:50:17 GMT
foundInMaster: true
- source: https://openapi.tools/
name: har2openapi
@@ -4657,17 +4657,17 @@
repositoryId: 709571808
description: Browser extension that generates API specs for any app or website
created: '2023-10-25T00:36:06Z'
- updated: '2025-01-14T00:58:36Z'
+ updated: '2025-01-15T02:55:24Z'
language: TypeScript
archived: false
- stars: 3991
+ stars: 3994
watchers: 22
forks: 75
owner: AndrewWalsh
logo: https://avatars.githubusercontent.com/u/15863952?v=4
license: MIT
- repoEtag: '"889aa480db512989a3462214c8f2213b6e737c76722ba1beab06575de7955f08"'
- repoLastModified: Tue, 14 Jan 2025 00:58:36 GMT
+ repoEtag: '"8f848a4836e47162595f979f8f3110e589a52199c4c052553eb564251ef007c2"'
+ repoLastModified: Wed, 15 Jan 2025 02:55:24 GMT
category:
- Auto Generators
- Documentation
@@ -4694,7 +4694,7 @@
repositoryId: 381857226
description: null
created: '2021-06-30T23:29:49Z'
- updated: '2025-01-14T02:10:50Z'
+ updated: '2025-01-15T02:13:01Z'
language: Java
archived: false
stars: 4679
@@ -4703,8 +4703,8 @@
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"0b01aca648e1ea1846093687dbcbc49d5f0efc6040a25fa023a41ccf731af49a"'
- repoLastModified: Tue, 14 Jan 2025 02:10:50 GMT
+ repoEtag: '"1a70bd9289eb1faa524bb2517345b7bc5721cdb292fe70f9b1632fc8245da972"'
+ repoLastModified: Wed, 15 Jan 2025 02:13:01 GMT
category:
- Auto Generators
- Server Implementations
@@ -4825,7 +4825,7 @@
owner: codekie
logo: https://avatars.githubusercontent.com/u/1512840?v=4
license: MIT
- repoEtag: '"f30fb52b7f5d251ec2589e69bbed18e3796b79cbe12e5796f5af24020d8dd52a"'
+ repoEtag: '"6b3ba2606f0f0b3af4513518301d659fb2574050851568ec5f998e6b212aba9f"'
repoLastModified: Wed, 11 Dec 2024 07:35:08 GMT
foundInMaster: true
id: 301e3f380f248daf345a88c8971d2a71
@@ -4934,7 +4934,7 @@
owner: github
logo: https://avatars.githubusercontent.com/u/9919?v=4
license: MIT
- repoEtag: '"f6acd3f2911b404b90e08e587bd32470c4d72f5ec7d37ce24cf26ccf856f9390"'
+ repoEtag: '"ebd434c552882d7c4cc7bcf94cafe80228dc013e10f177d5aa22ec53dff5615c"'
repoLastModified: Sat, 28 Dec 2024 04:41:15 GMT
foundInMaster: true
id: ec6a7a1e4a69a9beeb95bdebb88cb36d
@@ -4960,17 +4960,17 @@
repositoryId: 4238977
description: Automated JSON API documentation for API's built with Spring
created: '2012-05-06T06:38:57Z'
- updated: '2025-01-13T09:33:18Z'
+ updated: '2025-01-14T21:04:10Z'
language: Java
archived: false
- stars: 5933
+ stars: 5932
watchers: 263
forks: 1536
owner: springfox
logo: https://avatars.githubusercontent.com/u/11529357?v=4
license: Apache-2.0
- repoEtag: '"24e909a61709fabb91d53c98dc7a3fa999da72e9cc6cb401d5c909e479d0cbb8"'
- repoLastModified: Mon, 13 Jan 2025 09:33:18 GMT
+ repoEtag: '"dcdbe4cdb77625ed061a36debde64cc9ee38476663b8c0e0cf2505d2c0c8ae38"'
+ repoLastModified: Tue, 14 Jan 2025 21:04:10 GMT
foundInMaster: true
id: 2addde4c497bf582f20025ccac2cda86
- source:
@@ -5028,7 +5028,7 @@
repositoryId: 36817565
description: The ZAP by Checkmarx Core project
created: '2015-06-03T16:55:01Z'
- updated: '2025-01-13T17:49:03Z'
+ updated: '2025-01-14T13:34:18Z'
language: Java
archived: false
stars: 12932
@@ -5037,8 +5037,8 @@
owner: zaproxy
logo: https://avatars.githubusercontent.com/u/6716868?v=4
license: Apache-2.0
- repoEtag: '"eae49b03afa4e6025c853f8b0bc9ee0e97de82a8eb05c26b3d230fbaeecd6054"'
- repoLastModified: Mon, 13 Jan 2025 17:49:03 GMT
+ repoEtag: '"ac4cca441f72953884ecdcd44b57817b31efc5a62c00351709b460b8882b5d20"'
+ repoLastModified: Tue, 14 Jan 2025 13:34:18 GMT
foundInMaster: true
id: 9eedc1be44837a65f912bcf562844f39
- source:
@@ -5340,17 +5340,17 @@
Fuzz test your application using your OpenAPI or Swagger API definition
without coding
created: '2018-01-02T11:49:13Z'
- updated: '2025-01-06T07:29:18Z'
+ updated: '2025-01-14T21:19:29Z'
language: Python
archived: false
- stars: 434
+ stars: 435
watchers: 9
forks: 71
owner: KissPeter
logo: https://avatars.githubusercontent.com/u/19633417?v=4
license: GPL-3.0
- repoEtag: '"ba72c3f03b369d77badf2dbb54c3672d85dc884997fa99d913dd630b61a6de17"'
- repoLastModified: Mon, 06 Jan 2025 07:29:18 GMT
+ repoEtag: '"e2ebd550804d83f5dbc081b5e31cc170ada9fee42be885a7bff8a41739edc92a"'
+ repoLastModified: Tue, 14 Jan 2025 21:19:29 GMT
foundInMaster: true
id: bd38b4a53d7dcb21f05b494be14573e6
- source: https://openapi.tools/
@@ -5372,17 +5372,17 @@
repositoryId: 1431547
description: Web APIs for Django. 🎸
created: '2011-03-02T17:13:56Z'
- updated: '2025-01-13T22:39:14Z'
+ updated: '2025-01-15T00:57:07Z'
language: Python
archived: false
- stars: 28663
+ stars: 28664
watchers: 629
- forks: 6868
+ forks: 6867
owner: encode
logo: https://avatars.githubusercontent.com/u/19159390?v=4
license: NOASSERTION
- repoEtag: '"6b31a4a74203e285690b906b2040caf3f4b6f9554b4c61b618ae4dc10fe07c44"'
- repoLastModified: Mon, 13 Jan 2025 22:39:14 GMT
+ repoEtag: '"384cc720904ee7d901ebe9109887db779905d088851cbaf8a54c4f0c6a8b1db2"'
+ repoLastModified: Wed, 15 Jan 2025 00:57:07 GMT
foundInMaster: true
id: fb8994c078a380cc3510b024f6ed1202
category: Server Implementations
@@ -5567,17 +5567,17 @@
repositoryId: 240776275
description: Generate modern Python clients from OpenAPI
created: '2020-02-15T19:33:46Z'
- updated: '2025-01-13T23:30:02Z'
+ updated: '2025-01-14T18:23:01Z'
language: Python
archived: false
- stars: 1407
+ stars: 1409
watchers: 14
forks: 211
owner: openapi-generators
logo: https://avatars.githubusercontent.com/u/84925606?v=4
license: MIT
- repoEtag: '"529388f12532c97e55a8484c8ae5512c4dfd930dbd7972acdbf4bbebe2d9a04f"'
- repoLastModified: Mon, 13 Jan 2025 23:30:02 GMT
+ repoEtag: '"72a2705b5884286106eea6a1c447de332d3f28369e2acd8f955fd3f9f200c9c6"'
+ repoLastModified: Tue, 14 Jan 2025 18:23:01 GMT
foundInMaster: true
id: 784ec4adac4e47e4211ea74ef36dd5a5
v3_1: true
@@ -5607,17 +5607,17 @@
Build beautiful, interactive API Docs with embeddable React or Web
Components, powered by OpenAPI and Markdown.
created: '2019-05-03T01:05:01Z'
- updated: '2025-01-11T22:43:41Z'
+ updated: '2025-01-14T14:34:58Z'
language: TypeScript
archived: false
- stars: 1882
+ stars: 1883
watchers: 21
forks: 211
owner: stoplightio
logo: https://avatars.githubusercontent.com/u/10767217?v=4
license: Apache-2.0
- repoEtag: '"9fd219aa8da98546e1dc9def49a9e72cc5232db918d4036d53b9820f9b8834ce"'
- repoLastModified: Sat, 11 Jan 2025 22:43:41 GMT
+ repoEtag: '"bf2dc087b3d9385c137b6b825d6dca224ec14f2946bfea908401489a1f798d69"'
+ repoLastModified: Tue, 14 Jan 2025 14:34:58 GMT
foundInMaster: true
id: 2f94cc1fc980953b17a9979d4ff2e7ec
- source:
@@ -5926,16 +5926,16 @@
repositoryId: 581018208
description: 📖 The starter kit for your Mintlify docs
created: '2022-12-22T03:50:30Z'
- updated: '2025-01-13T21:55:46Z'
+ updated: '2025-01-15T03:10:19Z'
language: MDX
archived: false
- stars: 838
+ stars: 841
watchers: 6
- forks: 202
+ forks: 204
owner: mintlify
logo: https://avatars.githubusercontent.com/u/93011474?v=4
- repoEtag: '"0297275ce771523d40e9d0da519e04429c3776d9c3929bce4aba81a4fffc07e7"'
- repoLastModified: Mon, 13 Jan 2025 21:55:46 GMT
+ repoEtag: '"159c28000a7acd844b9e484457d90cdbd9375763a9048c5c95979b5629377c8a"'
+ repoLastModified: Wed, 15 Jan 2025 03:10:19 GMT
foundInMaster: true
- source:
- https://openapi.tools/
@@ -6057,7 +6057,7 @@
repositoryId: 479515560
description: OpenAPI / Swagger to TypeScript generator and mock server
created: '2022-04-08T19:32:15Z'
- updated: '2025-01-12T06:18:06Z'
+ updated: '2025-01-15T02:40:16Z'
language: TypeScript
archived: false
stars: 107
@@ -6066,8 +6066,8 @@
owner: pmcelhaney
logo: https://avatars.githubusercontent.com/u/51504?v=4
license: MIT
- repoEtag: '"c4feb37bdefbaaceda619affe2e4eaa83322d126ccf61957ea57c22de8bd9646"'
- repoLastModified: Sun, 12 Jan 2025 06:18:06 GMT
+ repoEtag: '"be01ab0217fd21e3960f92344ea8a4fe0b20722960784924b3dcf25cade9d5a0"'
+ repoLastModified: Wed, 15 Jan 2025 02:40:16 GMT
category:
- Mock
- SDK
@@ -6120,17 +6120,17 @@
you can think. vacuum is compatible with Spectral rulesets and generates
compatible reports.
created: '2021-10-10T18:24:19Z'
- updated: '2025-01-12T23:34:52Z'
+ updated: '2025-01-14T16:39:32Z'
language: Go
archived: false
- stars: 670
+ stars: 671
watchers: 9
forks: 50
owner: daveshanley
logo: https://avatars.githubusercontent.com/u/187345?v=4
license: MIT
- repoEtag: '"6bd268cdd0c91dfc8b5b4d4181391618c6f0b326eb582afa24efb401efc8748b"'
- repoLastModified: Sun, 12 Jan 2025 23:34:52 GMT
+ repoEtag: '"249c72406dbf53d0a1abff052991af36ca1fefef7e5caf387c1d15073d5feeb1"'
+ repoLastModified: Tue, 14 Jan 2025 16:39:32 GMT
foundInMaster: true
category:
- Description Validators
@@ -6162,17 +6162,17 @@
Typed HTTP client generator as single file without extra dependencies from
OpenAPI schema
created: '2023-11-30T22:25:17Z'
- updated: '2024-11-24T23:14:16Z'
+ updated: '2025-01-14T20:51:54Z'
language: TypeScript
archived: false
- stars: 30
+ stars: 31
watchers: 4
forks: 5
owner: vladkens
logo: https://avatars.githubusercontent.com/u/825754?v=4
license: MIT
- repoEtag: '"4b693a48437c033d7d467c67988d49c688d96a92cea1e3c95da73e485a67ea9a"'
- repoLastModified: Sun, 24 Nov 2024 23:14:16 GMT
+ repoEtag: '"e3f02d60f4c50061bb38166a2a6a0a841e223af64876c0bb0009a687be6bd9ed"'
+ repoLastModified: Tue, 14 Jan 2025 20:51:54 GMT
category: SDK
foundInMaster: true
name: apigen-ts
@@ -6360,17 +6360,17 @@
repositoryId: 408727871
description: Kusk-gateway is an OpenAPI-driven API Gateway for Kubernetes
created: '2021-09-21T07:33:29Z'
- updated: '2024-12-21T00:42:51Z'
+ updated: '2025-01-14T07:32:49Z'
language: Go
archived: false
- stars: 270
+ stars: 271
watchers: 16
forks: 21
owner: kubeshop
logo: https://avatars.githubusercontent.com/u/82541796?v=4
license: MIT
- repoEtag: '"e93fdb9f65bfff93f7b082332ef07550c80878efeef25ba6a0a9efd2f3359eb3"'
- repoLastModified: Sat, 21 Dec 2024 00:42:51 GMT
+ repoEtag: '"28b511f1e7fad05322c2862d9128a4354f4589bb396ac72438d53c41acfcbc29"'
+ repoLastModified: Tue, 14 Jan 2025 07:32:49 GMT
foundInMaster: true
category:
- Documentation
@@ -6521,7 +6521,7 @@
develop and independently deploy your Microservices and Microfrontends
faster
created: '2020-03-16T13:33:07Z'
- updated: '2025-01-13T14:03:34Z'
+ updated: '2025-01-14T15:51:40Z'
language: Kotlin
archived: false
stars: 288
@@ -6530,8 +6530,8 @@
owner: znsio
logo: https://avatars.githubusercontent.com/u/75619722?v=4
license: MIT
- repoEtag: '"325219cc93caab1039f0ee13808bde362d01dab93ef0b1306608a6da8db96db6"'
- repoLastModified: Mon, 13 Jan 2025 14:03:34 GMT
+ repoEtag: '"0608067214b0e7f744c40ecc023866eab09d393724936b9a124e707bbb8738d3"'
+ repoLastModified: Tue, 14 Jan 2025 15:51:40 GMT
foundInMaster: true
- source:
- https://openapi.tools/
@@ -6871,17 +6871,17 @@
repositoryId: 29151578
description: Seamlessly adds a Swagger to Rails-based API's
created: '2015-01-12T19:08:10Z'
- updated: '2025-01-14T02:38:49Z'
+ updated: '2025-01-14T20:43:54Z'
language: Ruby
archived: false
- stars: 2028
+ stars: 2029
watchers: 29
forks: 436
owner: rswag
logo: https://avatars.githubusercontent.com/u/55741034?v=4
license: MIT
- repoEtag: '"480765eb58b600dda2fc8ae4ea75156bd6f5f3c7c8f232a8eb4bdaf15d1f47d3"'
- repoLastModified: Tue, 14 Jan 2025 02:38:49 GMT
+ repoEtag: '"44459701dd0144f48ac0e6d035d03c8df2f627cf2c70f9bd37db00307a6dfcfa"'
+ repoLastModified: Tue, 14 Jan 2025 20:43:54 GMT
foundInMaster: true
v3_1_link: https://github.com/rswag/rswag/pull/714
- source: https://openapi.tools/
@@ -6925,17 +6925,17 @@
repositoryId: 476820102
description: Input OpenAPI. Output SDKs and Docs.
created: '2022-04-01T17:56:54Z'
- updated: '2025-01-14T01:27:31Z'
+ updated: '2025-01-15T00:20:27Z'
language: TypeScript
archived: false
- stars: 2759
+ stars: 2765
watchers: 21
- forks: 162
+ forks: 163
owner: fern-api
logo: https://avatars.githubusercontent.com/u/102944815?v=4
license: Apache-2.0
- repoEtag: '"4ada8cecf1433108c05e7d4b837c3fb1006c125f35f08dc2d44491427d8409fa"'
- repoLastModified: Tue, 14 Jan 2025 01:27:31 GMT
+ repoEtag: '"52a0da6ffeab6f0e1d80414fefc7f5bd9d913762d39a8eef9ae18c42d2407a56"'
+ repoLastModified: Wed, 15 Jan 2025 00:20:27 GMT
foundInMaster: true
sponsored: true
testimonial: >
@@ -7039,17 +7039,17 @@
repositoryId: 630566794
description: Generate Swift client and server code from an OpenAPI document.
created: '2023-04-20T16:50:53Z'
- updated: '2025-01-11T21:14:08Z'
+ updated: '2025-01-15T02:13:17Z'
language: Swift
archived: false
- stars: 1491
+ stars: 1493
watchers: 118
forks: 126
owner: apple
logo: https://avatars.githubusercontent.com/u/10639145?v=4
license: Apache-2.0
- repoEtag: '"4583625ffa2b8f4475fd0eec62d47bac9b785c9719f81796b668730ba8e59487"'
- repoLastModified: Sat, 11 Jan 2025 21:14:08 GMT
+ repoEtag: '"8eced309baeffda3a2296ec0c989cd9ad8576c026bd81849192fcb6d98d815e2"'
+ repoLastModified: Wed, 15 Jan 2025 02:13:17 GMT
foundInMaster: true
- source:
- https://openapi.tools/
@@ -7067,17 +7067,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: '2025-01-14T00:46:11Z'
+ updated: '2025-01-14T03:56:49Z'
language: Go
archived: false
- stars: 129
+ stars: 130
watchers: 2
forks: 18
owner: pb33f
logo: https://avatars.githubusercontent.com/u/104016643?v=4
license: NOASSERTION
- repoEtag: '"f63cd74273dbab57ae152165fad90e924749a6b59ab23b682d1eacb7a111dab2"'
- repoLastModified: Tue, 14 Jan 2025 00:46:11 GMT
+ repoEtag: '"6691bbbbc36a9d3a9cfb33b901de7cfc1d5e242664789946259f9879b517b391"'
+ repoLastModified: Tue, 14 Jan 2025 03:56:49 GMT
category:
- Testing Tools
- Testing
@@ -7278,17 +7278,17 @@
repositoryId: 706256859
description: Golang Fuego - web framework generating OpenAPI 3 spec from source code
created: '2023-10-17T15:36:43Z'
- updated: '2025-01-14T03:13:25Z'
+ updated: '2025-01-15T01:28:15Z'
language: Go
archived: false
- stars: 1099
+ stars: 1111
watchers: 7
forks: 61
owner: go-fuego
logo: https://avatars.githubusercontent.com/u/148255240?v=4
license: MIT
- repoEtag: '"eac821bd0795fee678cf9af9789f3644cf9a8582fb0a953bb445451cba60e6a1"'
- repoLastModified: Tue, 14 Jan 2025 03:13:25 GMT
+ repoEtag: '"d435326fc94fbe0229ac506d097753b0e5a56d37b26746269bac9e7122fae89b"'
+ repoLastModified: Wed, 15 Jan 2025 01:28:15 GMT
foundInMaster: true
- source:
- https://openapi.tools/
@@ -7304,17 +7304,17 @@
repositoryId: 245763170
description: Huma REST/HTTP API Framework for Golang with OpenAPI 3.1
created: '2020-03-08T06:19:51Z'
- updated: '2025-01-14T00:58:37Z'
+ updated: '2025-01-15T00:36:31Z'
language: Go
archived: false
- stars: 2513
+ stars: 2516
watchers: 28
forks: 167
owner: danielgtaylor
logo: https://avatars.githubusercontent.com/u/106826?v=4
license: MIT
- repoEtag: '"100742c2a40131d120ded97318f386ea89644258c940dc6a98800f20ee6a8534"'
- repoLastModified: Tue, 14 Jan 2025 00:58:37 GMT
+ repoEtag: '"8e36c1d94639c0f9f66a2b07f98b53c9115f1d45bddfe04c0bc5df10a9241e42"'
+ repoLastModified: Wed, 15 Jan 2025 00:36:31 GMT
foundInMaster: true
category:
- Auto Generators
@@ -7424,17 +7424,17 @@
Generate a type-safe TanStack Query React ✨ client from your OpenAPI
document
created: '2024-02-10T19:15:33Z'
- updated: '2025-01-08T22:57:22Z'
+ updated: '2025-01-14T19:29:04Z'
language: TypeScript
archived: false
- stars: 44
+ stars: 45
watchers: 1
forks: 3
owner: OpenAPI-Qraft
logo: https://avatars.githubusercontent.com/u/159651230?v=4
license: MIT
- repoEtag: '"4ba50c01efe1cf4f55974bd6c0611580849c02121ecce16cddb048da79612ee5"'
- repoLastModified: Wed, 08 Jan 2025 22:57:22 GMT
+ repoEtag: '"ea2079a36570cf7bf54a970f881694d07b8f4e4fc8180004abc47434453bd4e4"'
+ repoLastModified: Tue, 14 Jan 2025 19:29:04 GMT
foundInMaster: true
- source: https://openapi.tools/
name: Mojolicious::Plugin::OpenAPI::Modern
@@ -7523,17 +7523,17 @@
repositoryId: 843437350
description: Framework for building high quality, interactive API documentation.
created: '2024-08-16T14:09:50Z'
- updated: '2025-01-13T16:18:42Z'
+ updated: '2025-01-14T10:43:44Z'
language: TypeScript
archived: false
- stars: 123
+ stars: 124
watchers: 4
forks: 11
owner: zuplo
logo: https://avatars.githubusercontent.com/u/85497839?v=4
license: MIT
- repoEtag: '"a1c355b69c0f0fe757e46a65c957bb27750da2e17c34089590d2b06620dadc93"'
- repoLastModified: Mon, 13 Jan 2025 16:18:42 GMT
+ repoEtag: '"ba952e21a7329346b101581ef1c5d19a292ab319daeb1e1a6afad4fe56aa23c0"'
+ repoLastModified: Tue, 14 Jan 2025 10:43:44 GMT
foundInMaster: true
- source: openapi3 tags
name: FastAPI
@@ -7555,17 +7555,17 @@
FastAPI framework, high performance, easy to learn, fast to code, ready
for production
created: '2018-12-08T08:21:47Z'
- updated: '2025-01-14T02:48:39Z'
+ updated: '2025-01-15T02:52:34Z'
language: Python
archived: false
- stars: 79498
+ stars: 79538
watchers: 682
- forks: 6808
+ forks: 6811
owner: fastapi
logo: https://avatars.githubusercontent.com/u/156354296?v=4
license: MIT
- repoEtag: '"b8186c55db5c478171516b2f7b300e12259a693bdbc24eebe097373e174ee43e"'
- repoLastModified: Tue, 14 Jan 2025 02:48:39 GMT
+ repoEtag: '"68da0b2355d42a3d56847b7a534fa0e82c8c3417ba249a20fe7c2c4777d91ea4"'
+ repoLastModified: Wed, 15 Jan 2025 02:52:34 GMT
foundInMaster: true
id: 01f8d446752c39de698f67e8d2352229
oldLocations:
@@ -7585,17 +7585,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: '2025-01-13T22:04:46Z'
+ updated: '2025-01-14T21:04:08Z'
language: JavaScript
archived: false
- stars: 26797
+ stars: 26799
watchers: 645
forks: 8994
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"d457461d3815e04069862f37d782f5fe5b2d1d56dc7478beb4a2bb561b2b80cb"'
- repoLastModified: Mon, 13 Jan 2025 22:04:46 GMT
+ repoEtag: '"ec724fe06b9549f46c42bef5bde852e19b1d5a0bb77e5e1628ce05ce93ee9675"'
+ repoLastModified: Tue, 14 Jan 2025 21:04:08 GMT
foundInMaster: true
name: swagger-ui
homepage: https://github.com/swagger-api/swagger-UI
@@ -7628,17 +7628,17 @@
repositoryId: 45250726
description: 📘 OpenAPI/Swagger-generated API Reference Documentation
created: '2015-10-30T12:53:02Z'
- updated: '2025-01-13T23:57:58Z'
+ updated: '2025-01-15T02:59:39Z'
language: TypeScript
archived: false
- stars: 23862
+ stars: 23867
watchers: 298
forks: 2316
owner: Redocly
logo: https://avatars.githubusercontent.com/u/32099856?v=4
license: MIT
- repoEtag: '"53e8f485a95ead11856e4e0060717aedee83b049d4789b8460236d1ddd1d6462"'
- repoLastModified: Mon, 13 Jan 2025 23:57:58 GMT
+ repoEtag: '"e8295df8f1ecd443b6a497434357837282fc04ce749ae47ab1f7f4dfe9713a25"'
+ repoLastModified: Wed, 15 Jan 2025 02:59:39 GMT
foundInMaster: true
v3_1: true
id: 2725d6db6977c1dd12ceaf9701787e07
@@ -7657,7 +7657,7 @@
Examples and server integrations for generating the Swagger API
Specification, which enables easy access to your REST API
created: '2011-07-05T23:44:11Z'
- updated: '2025-01-13T08:14:11Z'
+ updated: '2025-01-14T21:04:07Z'
language: Java
archived: false
stars: 7401
@@ -7666,8 +7666,8 @@
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"9c572d5a64648ef71994084901a23ea4541723f062b89438cb8d25db9a3f26f5"'
- repoLastModified: Mon, 13 Jan 2025 08:14:11 GMT
+ repoEtag: '"936bfabb6971a121069ec5c90502423db6275ea662f07f7eb87dd65274b09d14"'
+ repoLastModified: Tue, 14 Jan 2025 21:04:07 GMT
foundInMaster: true
category: Code Generators
id: 2093f5c5f56617123b73ae823791176d
@@ -7684,17 +7684,17 @@
Mockoon is the easiest and quickest way to run mock APIs locally. No
remote deployment, no account required, open source.
created: '2017-07-17T13:19:16Z'
- updated: '2025-01-13T20:01:55Z'
+ updated: '2025-01-14T21:53:02Z'
language: TypeScript
archived: false
- stars: 6750
+ stars: 6754
watchers: 62
forks: 402
owner: mockoon
logo: https://avatars.githubusercontent.com/u/49429147?v=4
license: NOASSERTION
- repoEtag: '"925291bd11d78c917da6562ccf7084bdc8a3057a58869413b5bc1babbdabc3d9"'
- repoLastModified: Mon, 13 Jan 2025 20:01:55 GMT
+ repoEtag: '"9731f2fb67b74368d088c71693e4b0298b1774ecd81c565769efc2ddfa34c3c2"'
+ repoLastModified: Tue, 14 Jan 2025 21:53:02 GMT
foundInMaster: true
category: Testing
id: 8728dfca2c1908dbecdcddd31597fad4
@@ -7717,17 +7717,17 @@
repositoryId: 173009358
description: Generate Go client and server boilerplate from OpenAPI 3 specifications
created: '2019-02-27T23:59:59Z'
- updated: '2025-01-13T16:06:18Z'
+ updated: '2025-01-15T02:22:56Z'
language: Go
archived: false
- stars: 6534
+ stars: 6538
watchers: 38
forks: 887
owner: oapi-codegen
logo: https://avatars.githubusercontent.com/u/142752710?v=4
license: Apache-2.0
- repoEtag: '"35b3a18a8e7666abfe32df79ab36b35d5f9edd97258500f214c6bb46d95f51cb"'
- repoLastModified: Mon, 13 Jan 2025 16:06:18 GMT
+ repoEtag: '"95578cb64c43f8b4f6b721a2579ebd2108fdf684dff4e30a855b6f94869e4084"'
+ repoLastModified: Wed, 15 Jan 2025 02:22:56 GMT
foundInMaster: true
id: 770a221110cc4ef0e399089f5caf8694
oldLocations:
@@ -7756,17 +7756,17 @@
repositoryId: 161691324
description: Generate TypeScript types from OpenAPI 3 specs
created: '2018-12-13T20:28:01Z'
- updated: '2025-01-13T23:23:42Z'
+ updated: '2025-01-14T15:53:37Z'
language: TypeScript
archived: false
- stars: 6220
- watchers: 24
+ stars: 6224
+ watchers: 23
forks: 487
owner: openapi-ts
logo: https://avatars.githubusercontent.com/u/172838200?v=4
license: MIT
- repoEtag: '"f9147c8b01378592268b3ac8c899c03a5d5e743b9722cd6b7f982673d4c308b0"'
- repoLastModified: Mon, 13 Jan 2025 23:23:42 GMT
+ repoEtag: '"25ea9dd7bbbaaf5f10dcb4caaf76881cf310645eadf9c96942e07bdecc360276"'
+ repoLastModified: Tue, 14 Jan 2025 15:53:37 GMT
foundInMaster: true
oldLocations:
- https://github.com/drwpow/openapi-typescript
@@ -7782,17 +7782,17 @@
repositoryId: 88701696
description: Knife4j is a set of Swagger2 and OpenAPI3 All-in-one enhancement solution
created: '2017-04-19T04:44:28Z'
- updated: '2025-01-14T02:48:33Z'
+ updated: '2025-01-14T08:30:02Z'
language: HTML
archived: false
- stars: 4193
+ stars: 4194
watchers: 76
forks: 629
owner: xiaoymin
logo: https://avatars.githubusercontent.com/u/7894406?v=4
license: Apache-2.0
- repoEtag: '"cea3f564c87776efcc04e194c43f5f69ca2bb4a5b489424f7b6802ac32ac31c3"'
- repoLastModified: Tue, 14 Jan 2025 02:48:33 GMT
+ repoEtag: '"1e69e3d5ce7b492652cda4d1e3697f165a855ece93a882ea32076cbd90969be9"'
+ repoLastModified: Tue, 14 Jan 2025 08:30:02 GMT
category: SDK
foundInMaster: true
- source: openapi3 tags
@@ -7808,17 +7808,17 @@
🌐 Wikipedia for Web APIs. Directory of REST API definitions in OpenAPI
2.0/3.x format
created: '2015-02-22T19:58:12Z'
- updated: '2025-01-12T08:19:01Z'
+ updated: '2025-01-14T18:00:30Z'
language: null
archived: false
- stars: 3932
+ stars: 3936
watchers: 112
forks: 588
owner: APIs-guru
logo: https://avatars.githubusercontent.com/u/10975548?v=4
license: CC0-1.0
- repoEtag: '"b9aed5b088c7769d8e8b80ed57224402a88f44dbbaefb2165b6ada5c5f68a92a"'
- repoLastModified: Sun, 12 Jan 2025 08:19:01 GMT
+ repoEtag: '"90cc4c9a84682410ef246a6deadcaa72c7fb50a318a4c2c25dae64183a39e4ea"'
+ repoLastModified: Tue, 14 Jan 2025 18:00:30 GMT
foundInMaster: true
category: SDK
id: 667f2aef78d9d19418fbd6c0a7835abb
@@ -7842,17 +7842,17 @@
repositoryId: 196475719
description: Library for OpenAPI 3 with spring-boot
created: '2019-07-11T23:08:20Z'
- updated: '2025-01-13T11:47:22Z'
+ updated: '2025-01-15T00:20:17Z'
language: Java
archived: false
- stars: 3335
+ stars: 3333
watchers: 45
forks: 505
owner: springdoc
logo: https://avatars.githubusercontent.com/u/52804136?v=4
license: Apache-2.0
- repoEtag: '"4a8ea88ab3ddea4b745f7f08826a5e5d0b891f707ae07ed032701c6c3ee0aeb5"'
- repoLastModified: Mon, 13 Jan 2025 11:47:22 GMT
+ repoEtag: '"830554b369be9e3ca1547b1a2abb09758ab245b3ea12d2e32642fd328d1aba27"'
+ repoLastModified: Wed, 15 Jan 2025 00:20:17 GMT
foundInMaster: true
id: 901410cec129651fcf7374c79f824f27
- source: openapi3 tags
@@ -7868,17 +7868,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: '2025-01-13T00:58:39Z'
+ updated: '2025-01-14T11:59:05Z'
language: Python
archived: false
- stars: 2729
+ stars: 2730
watchers: 23
forks: 331
owner: tiangolo
logo: https://avatars.githubusercontent.com/u/1326112?v=4
license: MIT
- repoEtag: '"54dd14e1a853447696b6d5595d0485f60eb662d9f3842ecb37eae81e8a1fb177"'
- repoLastModified: Mon, 13 Jan 2025 00:58:39 GMT
+ repoEtag: '"69a1712756a6c16ccfe1c6c8e1a9235d6396a017f02333ad1c39ca725395dbc6"'
+ repoLastModified: Tue, 14 Jan 2025 11:59:05 GMT
foundInMaster: true
category: Server Implementations
id: d0f3fc0bd35fcadacc8ed2c531780739
@@ -7926,17 +7926,17 @@
A fast serialization and validation library, with builtin support for
JSON, MessagePack, YAML, and TOML
created: '2021-01-26T02:53:57Z'
- updated: '2025-01-14T00:05:57Z'
+ updated: '2025-01-14T23:40:40Z'
language: Python
archived: false
- stars: 2530
+ stars: 2532
watchers: 22
forks: 83
owner: jcrist
logo: https://avatars.githubusercontent.com/u/2783717?v=4
license: BSD-3-Clause
- repoEtag: '"3c8eeba3083b6992135935327694f662cd84c53c367e30946166cd3ac7fe3f05"'
- repoLastModified: Tue, 14 Jan 2025 00:05:57 GMT
+ repoEtag: '"c489b0386e3456892a90e223baf5d34405101bbc0100f21f67945a5a5e762d85"'
+ repoLastModified: Tue, 14 Jan 2025 23:40:40 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -7959,7 +7959,7 @@
owner: tfranzel
logo: https://avatars.githubusercontent.com/u/13507857?v=4
license: BSD-3-Clause
- repoEtag: '"96afdd441a723ccc0d2468b9c87dfc87ea3ca732e669484841ceea89937da2ce"'
+ repoEtag: '"c2c391168e9671ee0ec19feefd8a4fdb2aed53510cf34d9adf62cd1fb9743539"'
repoLastModified: Mon, 13 Jan 2025 11:14:51 GMT
foundInMaster: true
category: Server Implementations
@@ -7984,17 +7984,17 @@
repositoryId: 203157084
description: Supercharge your API testing, catch bugs, and ensure compliance
created: '2019-08-19T11:13:01Z'
- updated: '2025-01-13T23:09:08Z'
+ updated: '2025-01-15T03:21:41Z'
language: Python
archived: false
- stars: 2354
+ stars: 2358
watchers: 21
forks: 165
owner: schemathesis
logo: https://avatars.githubusercontent.com/u/70383271?v=4
license: MIT
- repoEtag: '"7c05f33ef47833bfacc9b19876b17d4e45a71468a3debf1090ff2c0e3b33f89b"'
- repoLastModified: Mon, 13 Jan 2025 23:09:08 GMT
+ repoEtag: '"2160f90767649db88cebfcba07d7b413a206ac7c435848d17e6924c8dbf954d7"'
+ repoLastModified: Wed, 15 Jan 2025 03:21:41 GMT
foundInMaster: true
id: f4032fb371a703acffa691c0f1239d45
oldLocations:
@@ -8039,17 +8039,17 @@
repositoryId: 165951750
description: RapiDoc -WebComponent for OpenAPI Spec
created: '2019-01-16T01:29:58Z'
- updated: '2025-01-12T10:33:08Z'
+ updated: '2025-01-14T19:42:28Z'
language: JavaScript
archived: false
- stars: 1733
+ stars: 1736
watchers: 15
forks: 292
owner: rapi-doc
logo: https://avatars.githubusercontent.com/u/104180085?v=4
license: MIT
- repoEtag: '"e51062e9aa777315b6ce96c4d520a5cedb9a8296ef915b58e8d5c3dd4012e5be"'
- repoLastModified: Sun, 12 Jan 2025 10:33:08 GMT
+ repoEtag: '"3d764395818501c8aa4aae58a0db49a19f398c3fdcaa576dc0b663929ca47bc2"'
+ repoLastModified: Tue, 14 Jan 2025 19:42:28 GMT
foundInMaster: true
category:
- Documentation
@@ -8069,17 +8069,17 @@
repositoryId: 372032505
description: OpenAPI v3 code generator for go
created: '2021-05-29T17:25:48Z'
- updated: '2025-01-13T20:31:28Z'
+ updated: '2025-01-14T22:47:00Z'
language: Go
archived: false
- stars: 1549
+ stars: 1550
watchers: 14
forks: 87
owner: ogen-go
logo: https://avatars.githubusercontent.com/u/85122432?v=4
license: Apache-2.0
- repoEtag: '"ac60ff2fbf59d5885f105c3d9b0f04abb3b92b7335a677dac4c6db89481973cb"'
- repoLastModified: Mon, 13 Jan 2025 20:31:28 GMT
+ repoEtag: '"094265381fe06a60115a279f8a307da6a66a3f6530acdb33d6e287e55a000919"'
+ repoLastModified: Tue, 14 Jan 2025 22:47:00 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -8095,17 +8095,17 @@
A node package wrapper for
https://github.com/OpenAPITools/openapi-generator
created: '2018-10-26T10:21:23Z'
- updated: '2025-01-13T17:02:14Z'
+ updated: '2025-01-14T23:03:48Z'
language: TypeScript
archived: false
- stars: 1505
+ stars: 1509
watchers: 19
forks: 157
owner: OpenAPITools
logo: https://avatars.githubusercontent.com/u/37325267?v=4
license: Apache-2.0
- repoEtag: '"68c6e93496747d8bba51952b512f67e0da41df54e4b1cb9f47e41dd1757cd9f1"'
- repoLastModified: Mon, 13 Jan 2025 17:02:14 GMT
+ repoEtag: '"ef8bedba4063062c2462214cdd4cd27c5455297e9e711905eb0a612f8142ff99"'
+ repoLastModified: Tue, 14 Jan 2025 23:03:48 GMT
foundInMaster: true
category:
- Code Generators
@@ -8181,17 +8181,17 @@
repositoryId: 329190167
description: A lightweight Python web API framework.
created: '2021-01-13T04:08:48Z'
- updated: '2025-01-13T18:35:23Z'
+ updated: '2025-01-14T10:53:32Z'
language: Python
archived: false
- stars: 1057
+ stars: 1060
watchers: 21
forks: 133
owner: apiflask
logo: https://avatars.githubusercontent.com/u/78075725?v=4
license: MIT
- repoEtag: '"04b109a81a84d423d2cf89260889bfcd03a500947dbf207f5057857059b87f49"'
- repoLastModified: Mon, 13 Jan 2025 18:35:23 GMT
+ repoEtag: '"4141fc7c46762a856e562960d72ce91c2a80fc90b6ecb713d27532c2e324b296"'
+ repoLastModified: Tue, 14 Jan 2025 10:53:32 GMT
category: Server Implementations
foundInMaster: true
oldLocations:
@@ -8226,15 +8226,15 @@
v3: true
repositoryMetadata:
base64Readme: >-
- W1N0YWNrIE92ZXJmbG93XShodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy90YWdnZWQvbGlnaHQtNGopIHwKW0dvb2dsZSBHcm91cF0oaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9mb3J1bS8jIWZvcnVtL2xpZ2h0LTRqKSB8CltHaXR0ZXIgQ2hhdF0oaHR0cHM6Ly9naXR0ZXIuaW0vbmV0d29ya250L2pzb24tc2NoZW1hLXZhbGlkYXRvcikgfApbU3VicmVkZGl0XShodHRwczovL3d3dy5yZWRkaXQuY29tL3IvbGlnaHRhcGkvKSB8CltZb3V0dWJlXShodHRwczovL3d3dy55b3V0dWJlLmNvbS9jaGFubmVsL1VDSENSTVdKVlh3OGlCN3pLeEY1NUJ5dykgfApbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2MubmV0d29ya250LmNvbS9saWJyYXJ5L2pzb24tc2NoZW1hLXZhbGlkYXRvci8pIHwKW0NvbnRyaWJ1dGlvbiBHdWlkZV0oaHR0cHM6Ly9kb2MubmV0d29ya250LmNvbS9jb250cmlidXRlLykgfAoKWyFbQ0ldKGh0dHBzOi8vZ2l0aHViLmNvbS9uZXR3b3JrbnQvanNvbi1zY2hlbWEtdmFsaWRhdG9yL2FjdGlvbnMvd29ya2Zsb3dzL2NpLnltbC9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vbmV0d29ya250L2pzb24tc2NoZW1hLXZhbGlkYXRvci9hY3Rpb25zL3dvcmtmbG93cy9jaS55bWwpClshW01hdmVuIENlbnRyYWxdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbWF2ZW4tY2VudHJhbC92L2NvbS5uZXR3b3JrbnQvanNvbi1zY2hlbWEtdmFsaWRhdG9yLnN2ZyldKGh0dHA6Ly9zZWFyY2gubWF2ZW4ub3JnLyNzZWFyY2glN0NnYSU3QzElN0NnJTNBY29tLm5ldHdvcmtudCUyMGElM0Fqc29uLXNjaGVtYS12YWxpZGF0b3IpClshW2NvZGVjb3YuaW9dKGh0dHBzOi8vY29kZWNvdi5pby9naXRodWIvbmV0d29ya250L2pzb24tc2NoZW1hLXZhbGlkYXRvci9jb3ZlcmFnZS5zdmc/YnJhbmNoPW1hc3RlcildKGh0dHBzOi8vY29kZWNvdi5pby9naXRodWIvbmV0d29ya250L2pzb24tc2NoZW1hLXZhbGlkYXRvcj9icmFuY2g9bWFzdGVyKQpbIVtKYXZhZG9jc10oaHR0cDovL3d3dy5qYXZhZG9jLmlvL2JhZGdlL2NvbS5uZXR3b3JrbnQvanNvbi1zY2hlbWEtdmFsaWRhdG9yLnN2ZyldKGh0dHBzOi8vd3d3LmphdmFkb2MuaW8vZG9jL2NvbS5uZXR3b3JrbnQvanNvbi1zY2hlbWEtdmFsaWRhdG9yKQoKVGhpcyBpcyBhIEphdmEgaW1wbGVtZW50YXRpb24gb2YgdGhlIFtKU09OIFNjaGVtYSBDb3JlIERyYWZ0IHY0LCB2NiwgdjcsIHYyMDE5LTA5IGFuZCB2MjAyMC0xMl0oaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvc3BlY2lmaWNhdGlvbikgc3BlY2lmaWNhdGlvbiBmb3IgSlNPTiBzY2hlbWEgdmFsaWRhdGlvbi4gVGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBbQ3VzdG9taXppbmcgTWV0YS1TY2hlbWFzLCBWb2NhYnVsYXJpZXMsIEtleXdvcmRzIGFuZCBGb3JtYXRzXShkb2MvY3VzdG9tLW1ldGEtc2NoZW1hLm1kKS4KCkluIGFkZGl0aW9uLCBbT3BlbkFQSV0oZG9jL29wZW5hcGkubWQpIDMgcmVxdWVzdC9yZXNwb25zZSB2YWxpZGF0aW9uIGlzIHN1cHBvcnRlZCB3aXRoIHRoZSB1c2Ugb2YgdGhlIGFwcHJvcHJpYXRlIG1ldGEtc2NoZW1hLiBGb3IgdXNlcnMgd2hvIHdhbnQgdG8gY29sbGVjdCBpbmZvcm1hdGlvbiBmcm9tIGEgSlNPTiBub2RlIGJhc2VkIG9uIHRoZSBzY2hlbWEsIHRoZSBbd2Fsa2Vyc10oZG9jL3dhbGtlcnMubWQpIGNhbiBoZWxwLiBUaGUgSlNPTiBwYXJzZXIgdXNlZCBpcyB0aGUgW0phY2tzb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9GYXN0ZXJYTUwvamFja3NvbikgcGFyc2VyLiBBcyBpdCBpcyBhIGtleSBjb21wb25lbnQgaW4gb3VyIFtsaWdodC00al0oaHR0cHM6Ly9naXRodWIuY29tL25ldHdvcmtudC9saWdodC00aikgbWljcm9zZXJ2aWNlcyBmcmFtZXdvcmsgdG8gdmFsaWRhdGUgcmVxdWVzdC9yZXNwb25zZSBhZ2FpbnN0IE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBmb3IgW2xpZ2h0LXJlc3QtNGpdKGh0dHA6Ly93d3cubmV0d29ya250LmNvbS9zdHlsZS9saWdodC1yZXN0LTRqLykgYW5kIFJQQyBzY2hlbWEgZm9yIFtsaWdodC1oeWJyaWQtNGpdKGh0dHA6Ly93d3cubmV0d29ya250LmNvbS9zdHlsZS9saWdodC1oeWJyaWQtNGovKSBhdCBydW50aW1lLCBwZXJmb3JtYW5jZSBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgYXNwZWN0IGluIHRoZSBkZXNpZ24uCgojIyBKU09OIFNjaGVtYSBTcGVjaWZpY2F0aW9uIGNvbXBhdGliaWxpdHkKClshW1N1cHBvcnRlZCBEaWFsZWN0c10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD91cmw9aHR0cHMlM0ElMkYlMkZib3d0aWUucmVwb3J0JTJGYmFkZ2VzJTJGamF2YS1jb20ubmV0d29ya250LWpzb24tc2NoZW1hLXZhbGlkYXRvciUyRnN1cHBvcnRlZF92ZXJzaW9ucy5qc29uKV0oaHR0cHM6Ly9ib3d0aWUucmVwb3J0LyMvaW1wbGVtZW50YXRpb25zL2phdmEtbmV0d29ya250LWpzb24tc2NoZW1hLXZhbGlkYXRvcikKWyFbRHJhZnQgMjAyMC0xMl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD91cmw9aHR0cHMlM0ElMkYlMkZib3d0aWUucmVwb3J0JTJGYmFkZ2VzJTJGamF2YS1jb20ubmV0d29ya250LWpzb24tc2NoZW1hLXZhbGlkYXRvciUyRmNvbXBsaWFuY2UlMkZkcmFmdDIwMjAtMTIuanNvbildKGh0dHBzOi8vYm93dGllLnJlcG9ydC8jL2RpYWxlY3RzL2RyYWZ0MjAyMC0xMikKWyFbRHJhZnQgMjAxOS0wOV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD91cmw9aHR0cHMlM0ElMkYlMkZib3d0aWUucmVwb3J0JTJGYmFkZ2VzJTJGamF2YS1jb20ubmV0d29ya250LWpzb24tc2NoZW1hLXZhbGlkYXRvciUyRmNvbXBsaWFuY2UlMkZkcmFmdDIwMTktMDkuanNvbildKGh0dHBzOi8vYm93dGllLnJlcG9ydC8jL2RpYWxlY3RzL2RyYWZ0MjAxOS0wOSkKWyFbRHJhZnQgN10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD91cmw9aHR0cHMlM0ElMkYlMkZib3d0aWUucmVwb3J0JTJGYmFkZ2VzJTJGamF2YS1jb20ubmV0d29ya250LWpzb24tc2NoZW1hLXZhbGlkYXRvciUyRmNvbXBsaWFuY2UlMkZkcmFmdDcuanNvbildKGh0dHBzOi8vYm93dGllLnJlcG9ydC8jL2RpYWxlY3RzL2RyYWZ0NykKWyFbRHJhZnQgNl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD91cmw9aHR0cHMlM0ElMkYlMkZib3d0aWUucmVwb3J0JTJGYmFkZ2VzJTJGamF2YS1jb20ubmV0d29ya250LWpzb24tc2NoZW1hLXZhbGlkYXRvciUyRmNvbXBsaWFuY2UlMkZkcmFmdDYuanNvbildKGh0dHBzOi8vYm93dGllLnJlcG9ydC8jL2RpYWxlY3RzL2RyYWZ0NikKWyFbRHJhZnQgNF0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD91cmw9aHR0cHMlM0ElMkYlMkZib3d0aWUucmVwb3J0JTJGYmFkZ2VzJTJGamF2YS1jb20ubmV0d29ya250LWpzb24tc2NoZW1hLXZhbGlkYXRvciUyRmNvbXBsaWFuY2UlMkZkcmFmdDQuanNvbildKGh0dHBzOi8vYm93dGllLnJlcG9ydC8jL2RpYWxlY3RzL2RyYWZ0NCkKCkluZm9ybWF0aW9uIG9uIHRoZSBjb21wYXRpYmlsaXR5IHN1cHBvcnQgZm9yIGVhY2ggdmVyc2lvbiwgaW5jbHVkaW5nIGtub3duIGlzc3VlcywgY2FuIGJlIGZvdW5kIGluIHRoZSBbQ29tcGF0aWJpbGl0eSB3aXRoIEpTT04gU2NoZW1hIHZlcnNpb25zXShkb2MvY29tcGF0aWJpbGl0eS5tZCkgZG9jdW1lbnQuCgpTaW5jZSBbRHJhZnQgMjAxOS0wOV0oaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQvMjAxOS0wOS9qc29uLXNjaGVtYS12YWxpZGF0aW9uI3JmYy5zZWN0aW9uLjcpIHRoZSBgZm9ybWF0YCBrZXl3b3JkIG9ubHkgZ2VuZXJhdGVzIGFubm90YXRpb25zIGJ5IGRlZmF1bHQgYW5kIGRvZXMgbm90IGdlbmVyYXRlIGFzc2VydGlvbnMuCgpUaGlzIGJlaGF2aW9yIGNhbiBiZSBvdmVycmlkZGVuIHRvIGdlbmVyYXRlIGFzc2VydGlvbnMgYnkgc2V0dGluZyB0aGUgYHNldEZvcm1hdEFzc2VydGlvbnNFbmFibGVkYCB0byBgdHJ1ZWAgaW4gYFNjaGVtYVZhbGlkYXRvcnNDb25maWdgIG9yIGBFeGVjdXRpb25Db25maWdgLgoKIyMgVXBncmFkaW5nIHRvIG5ldyB2ZXJzaW9ucwoKVGhpcyBsaWJyYXJ5IGNhbiBjb250YWluIGJyZWFraW5nIGNoYW5nZXMgaW4gYG1pbm9yYCB2ZXJzaW9uIHJlbGVhc2VzIHRoYXQgbWF5IHJlcXVpcmUgY29kZSBjaGFuZ2VzLgoKSW5mb3JtYXRpb24gb24gbm90YWJsZSBvciBicmVha2luZyBjaGFuZ2VzIHdoZW4gdXBncmFkaW5nIHRoZSBsaWJyYXJ5IGNhbiBiZSBmb3VuZCBpbiB0aGUgW1VwZ3JhZGluZyB0byBuZXcgdmVyc2lvbnNdKGRvYy91cGdyYWRpbmcubWQpIGRvY3VtZW50LgoKVGhlIFtSZWxlYXNlc10oaHR0cHM6Ly9naXRodWIuY29tL25ldHdvcmtudC9qc29uLXNjaGVtYS12YWxpZGF0b3IvcmVsZWFzZXMpIHBhZ2Ugd2lsbCBjb250YWluIGluZm9ybWF0aW9uIG9uIHRoZSBsYXRlc3QgdmVyc2lvbnMuCgojIyBDb21wYXJpbmcgYWdhaW5zdCBvdGhlciBpbXBsZW1lbnRhdGlvbnMKClRoZSBbSlNPTiBTY2hlbWEgVmFsaWRhdGlvbiBDb21wYXJpc29uXShodHRwczovL2dpdGh1Yi5jb20vY3JlZWstc2VydmljZS9qc29uLXNjaGVtYS12YWxpZGF0aW9uLWNvbXBhcmlzb24pIHByb2plY3QgZnJvbSBDcmVlayBoYXMgYW4gaW5mb3JtYXRpdmUgW0NvbXBhcmlzb24gb2YgSlZNIGJhc2VkIFNjaGVtYSBWYWxpZGF0aW9uIEltcGxlbWVudGF0aW9uc10oaHR0cHM6Ly93d3cuY3JlZWtzZXJ2aWNlLm9yZy9qc29uLXNjaGVtYS12YWxpZGF0aW9uLWNvbXBhcmlzb24vKSB3aGljaCBjb21wYXJlcyBib3RoIHRoZSBmdW5jdGlvbmFsIGFuZCBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBudW1iZXIgb2YgZGlmZmVyZW50IEphdmEgaW1wbGVtZW50YXRpb25zLiAKKiBbRnVuY3Rpb25hbCBjb21wYXJpc29uXShodHRwczovL3d3dy5jcmVla3NlcnZpY2Uub3JnL2pzb24tc2NoZW1hLXZhbGlkYXRpb24tY29tcGFyaXNvbi9mdW5jdGlvbmFsI3N1bW1hcnktcmVzdWx0cy10YWJsZSkKKiBbUGVyZm9ybWFuY2UgY29tcGFyaXNvbl0oaHR0cHM6Ly93d3cuY3JlZWtzZXJ2aWNlLm9yZy9qc29uLXNjaGVtYS12YWxpZGF0aW9uLWNvbXBhcmlzb24vcGVyZm9ybWFuY2UjanNvbi1zY2hlbWEtdGVzdC1zdWl0ZS1iZW5jaG1hcmspCgpUaGUgW0Jvd3RpZV0oaHR0cHM6Ly9naXRodWIuY29tL2Jvd3RpZS1qc29uLXNjaGVtYS9ib3d0aWUpIHByb2plY3QgaGFzIGEgW3JlcG9ydF0oaHR0cHM6Ly9ib3d0aWUucmVwb3J0LykgdGhhdCBjb21wYXJlcyBmdW5jdGlvbmFsIGNoYXJhY3RlcmlzdGljcyBvZiBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zLCBpbmNsdWRpbmcgbm9uLUphdmEgaW1wbGVtZW50YXRpb25zLCBidXQgZG9lcyBub3QgZG8gYW55IHBlcmZvcm1hbmNlIGJlbmNobWFya2luZy4KCiMjIFdoeSB0aGlzIGxpYnJhcnkKCiMjIyMgUGVyZm9ybWFuY2UKClRoaXMgc2hvdWxkIGJlIHRoZSBmYXN0ZXN0IEphdmEgSlNPTiBTY2hlbWEgVmFsaWRhdG9yIGltcGxlbWVudGF0aW9uLgoKVGhlIGZvbGxvd2luZyBpcyB0aGUgYmVuY2htYXJrIHJlc3VsdHMgZnJvbSB0aGUgW0pTT04gU2NoZW1hIFZhbGlkYXRvciBQZXJmdGVzdF0oaHR0cHM6Ly9naXRodWIuY29tL25ldHdvcmtudC9qc29uLXNjaGVtYS12YWxpZGF0b3ItcGVyZnRlc3QpIHByb2plY3QgdGhhdCB1c2VzIHRoZSBbSmF2YSBNaWNyb2JlbmNobWFyayBIYXJuZXNzXShodHRwczovL2dpdGh1Yi5jb20vb3Blbmpkay9qbWgpLgoKTm90ZSB0aGF0IHRoZSBiZW5jaG1hcmsgcmVzdWx0cyBhcmUgaGlnaGx5IGRlcGVuZGVudCBvbiB0aGUgaW5wdXQgZGF0YSB3b3JrbG9hZHMgYW5kIHNjaGVtYXMgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24uCgpJbiB0aGlzIGNhc2UgdGhpcyB3b3JrbG9hZCBpcyB1c2luZyB0aGUgRHJhZnQgNCBzcGVjaWZpY2F0aW9uIGFuZCBsYXJnZWx5IHRlc3RzIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgZXZhbHVhdGluZyB0aGUgYHByb3BlcnRpZXNgIGtleXdvcmQuIFlvdSBtYXkgcmVmZXIgdG8gW1Jlc3VsdHMgb2YgcGVyZm9ybWFuY2UgY29tcGFyaXNvbiBvZiBKVk0gYmFzZWQgSlNPTiBTY2hlbWEgVmFsaWRhdGlvbiBJbXBsZW1lbnRhdGlvbnNdKGh0dHBzOi8vd3d3LmNyZWVrc2VydmljZS5vcmcvanNvbi1zY2hlbWEtdmFsaWRhdGlvbi1jb21wYXJpc29uL3BlcmZvcm1hbmNlI2pzb24tc2NoZW1hLXRlc3Qtc3VpdGUtYmVuY2htYXJrKSBmb3IgYmVuY2htYXJrIHJlc3VsdHMgZm9yIG1vcmUgdHlwaWNhbCB3b3JrbG9hZHMKCklmIHBlcmZvcm1hbmNlIGlzIGFuIGltcG9ydGFudCBjb25zaWRlcmF0aW9uLCB0aGUgc3BlY2lmaWMgc2FtcGxlIHdvcmtsb2FkcyBzaG91bGQgYmUgYmVuY2htYXJrZWQsIGFzIHRoZXJlIGFyZSBkaWZmZXJlbnQgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIHdoZW4gY2VydGFpbiBrZXl3b3JkcyBhcmUgdXNlZC4gRm9yIGluc3RhbmNlIHRoZSB1c2Ugb2YgdGhlIGB1bmV2YWx1YXRlZFByb3BlcnRpZXNgIG9yIGB1bmV2YWx1YXRlZEl0ZW1zYCBrZXl3b3JkIHdpbGwgdHJpZ2dlciBhbm5vdGF0aW9uIGNvbGxlY3Rpb24gaW4gdGhlIHJlbGF0ZWQgdmFsaWRhdG9ycywgc3VjaCBhcyB0aGUgYHByb3BlcnRpZXNgIG9yIGBpdGVtc2AgdmFsaWRhdG9ycywgYW5kIGFubm90YXRpb24gY29sbGVjdGlvbiB3aWxsIGFkdmVyc2VseSBhZmZlY3QgcGVyZm9ybWFuY2UuCgojIyMjIyBOZXR3b3JrTlQgMS40LjEKCmBgYApCZW5jaG1hcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGUgIENudCAgICAgIFNjb3JlICAgIEVycm9yICAgVW5pdHMKTmV0d29ya250QmVuY2htYXJrLnRlc3RWYWxpZGF0ZSAgICAgICAgICAgICAgICAgICAgIHRocnB0ICAgMTAgICA4MzUyLjEyNiDCsSA2MS44NzAgICBvcHMvcwpOZXR3b3JrbnRCZW5jaG1hcmsudGVzdFZhbGlkYXRlOmdjLmFsbG9jLnJhdGUgICAgICAgdGhycHQgICAxMCAgICA3MjEuMjk2IMKxICA1LjM0MiAgTUIvc2VjCk5ldHdvcmtudEJlbmNobWFyay50ZXN0VmFsaWRhdGU6Z2MuYWxsb2MucmF0ZS5ub3JtICB0aHJwdCAgIDEwICA5MDU2MC4wMTMgwrEgIDAuMDAxICAgIEIvb3AKTmV0d29ya250QmVuY2htYXJrLnRlc3RWYWxpZGF0ZTpnYy5jb3VudCAgICAgICAgICAgIHRocnB0ICAgMTAgICAgIDYxLjAwMCAgICAgICAgICAgY291bnRzCk5ldHdvcmtudEJlbmNobWFyay50ZXN0VmFsaWRhdGU6Z2MudGltZSAgICAgICAgICAgICB0aHJwdCAgIDEwICAgICA2OC4wMDAgICAgICAgICAgICAgICBtcwpgYGAKCiMjIyMjIyBFdmVyaXQgMS4xNC4xCgpgYGAKQmVuY2htYXJrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlICBDbnQgICAgICAgU2NvcmUgICAgRXJyb3IgICBVbml0cwpFdmVyaXRCZW5jaG1hcmsudGVzdFZhbGlkYXRlICAgICAgICAgICAgICAgICAgICAgICAgdGhycHQgICAxMCAgICAzNzc1LjQ1MyDCsSA0NC4wMjMgICBvcHMvcwpFdmVyaXRCZW5jaG1hcmsudGVzdFZhbGlkYXRlOmdjLmFsbG9jLnJhdGUgICAgICAgICAgdGhycHQgICAxMCAgICAxNjY3LjM0NSDCsSAxOS40MzcgIE1CL3NlYwpFdmVyaXRCZW5jaG1hcmsudGVzdFZhbGlkYXRlOmdjLmFsbG9jLnJhdGUubm9ybSAgICAgdGhycHQgICAxMCAgNDYzMTA0LjAzMCDCsSAgMC4wMDMgICAgQi9vcApFdmVyaXRCZW5jaG1hcmsudGVzdFZhbGlkYXRlOmdjLmNvdW50ICAgICAgICAgICAgICAgdGhycHQgICAxMCAgICAgMTQwLjAwMCAgICAgICAgICAgY291bnRzCkV2ZXJpdEJlbmNobWFyay50ZXN0VmFsaWRhdGU6Z2MudGltZSAgICAgICAgICAgICAgICB0aHJwdCAgIDEwICAgICAxNTguMDAwICAgICAgICAgICAgICAgbXMKYGBgCgojIyMjIEZ1bmN0aW9uYWxpdHkKClRoaXMgaW1wbGVtZW50YXRpb24gaXMgdGVzdGVkIGFnYWluc3QgdGhlIFtKU09OIFNjaGVtYSBUZXN0IFN1aXRlXShodHRwczovL2dpdGh1Yi5jb20vanNvbi1zY2hlbWEtb3JnL0pTT04tU2NoZW1hLVRlc3QtU3VpdGUpLiBBcyB0ZXN0cyBhcmUgY29udGludWFsbHkgYWRkZWQgdG8gdGhlIHN1aXRlLCB0aGVzZSB0ZXN0IHJlc3VsdHMgbWF5IG5vdCBiZSBjdXJyZW50LgoKfCBJbXBsZW1lbnRhdGlvbnMgfCBPdmVyYWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERSQUZUXzAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRFJBRlRfMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERSQUZUXzA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERSQUZUXzA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEUkFGVF8yMDE5XzA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERSQUZUXzIwMjBfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgTmV0d29ya050ICAgICAgIHwgcGFzczogcjo0ODAzICgxMDAuMCUpIG86MjM3MiAoMTAwLjAlKTxicj5mYWlsOiByOjAgKDAuMCUpIG86MCAoMC4wJSkgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhc3M6IHI6NjEwICgxMDAuMCUpIG86MjUxICgxMDAuMCUpPGJyPmZhaWw6IHI6MCAoMC4wJSkgbzowICgwLjAlKSAgfCBwYXNzOiByOjgyMiAoMTAwLjAlKSBvOjMxOCAoMTAwLjAlKTxicj5mYWlsOiByOjAgKDAuMCUpIG86MCAoMC4wJSkgfCBwYXNzOiByOjkwNiAoMTAwLjAlKSBvOjU0MSAoMTAwLjAlKTxicj5mYWlsOiByOjAgKDAuMCUpIG86MCAoMC4wJSkgICAgIHwgcGFzczogcjoxMjIwICgxMDAuMCUpIG86NjI1ICgxMDAuMCUpPGJyPmZhaWw6IHI6MCAoMC4wJSkgbzowICgwLjAlKSAgfCBwYXNzOiByOjEyNDUgKDEwMC4wJSkgbzo2MzcgKDEwMC4wJSk8YnI+ZmFpbDogcjowICgwLjAlKSBvOjAgKDAuMCUpICAgIHwKCiogTm90ZSB0aGF0IHRoaXMgdXNlcyB0aGUgYEpvbmlSZWd1bGFyRXhwcmVzc2lvbkZhY3RvcnlgIGZvciB0aGUgYHBhdHRlcm5gIGFuZCBgZm9ybWF0YCBgcmVnZXhgIHRlc3RzLgoKIyMjIyBKYWNrc29uIFBhcnNlcgoKVGhpcyBsaWJyYXJ5IHVzZXMgW0phY2tzb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9GYXN0ZXJYTUwvamFja3Nvbikgd2hpY2ggaXMgYSBKYXZhIEpTT04gcGFyc2VyIHRoYXQgaXMgd2lkZWx5IHVzZWQgaW4gb3RoZXIgcHJvamVjdHMuIElmIHlvdSBhcmUgYWxyZWFkeSB1c2luZyB0aGUgSmFja3NvbiBwYXJzZXIgaW4geW91ciBwcm9qZWN0LCBpdCBpcyBuYXR1cmFsIHRvIGNob29zZSB0aGlzIGxpYnJhcnkgb3ZlciBvdGhlcnMgZm9yIHNjaGVtYSB2YWxpZGF0aW9uLiAKCiMjIyMgWUFNTCBTdXBwb3J0CgpUaGUgbGlicmFyeSB3b3JrcyB3aXRoIEpTT04gYW5kIFlBTUwgb24gYm90aCBzY2hlbWEgZGVmaW5pdGlvbnMgYW5kIGlucHV0IGRhdGEuIAoKIyMjIyBPcGVuQVBJIFN1cHBvcnQKClRoZSBPcGVuQVBJIDMuMCBzcGVjaWZpY2F0aW9uIGlzIHVzaW5nIEpTT04gc2NoZW1hIHRvIHZhbGlkYXRlIHRoZSByZXF1ZXN0L3Jlc3BvbnNlLCBidXQgdGhlcmUgYXJlIHNvbWUgZGlmZmVyZW5jZXMuIFdpdGggYSBjb25maWd1cmF0aW9uIGZpbGUsIHlvdSBjYW4gZW5hYmxlIHRoZSBsaWJyYXJ5IHRvIHdvcmsgd2l0aCBPcGVuQVBJIDMuMCB2YWxpZGF0aW9uLiAKCiMjIyMgTWluaW1hbCBEZXBlbmRlbmNpZXMKCkZvbGxvd2luZyB0aGUgZGVzaWduIHByaW5jaXBsZSBvZiB0aGUgTGlnaHQgUGxhdGZvcm0sIHRoaXMgbGlicmFyeSBoYXMgbWluaW1hbCBkZXBlbmRlbmNpZXMgdG8gZW5zdXJlIHRoZXJlIGFyZSBubyBkZXBlbmRlbmN5IGNvbmZsaWN0cyB3aGVuIHVzaW5nIGl0LiAKCiMjIyMjIFJlcXVpcmVkIERlcGVuZGVuY2llcwoKVGhlIGZvbGxvd2luZyBhcmUgdGhlIGRlcGVuZGVuY2llcyB0aGF0IHdpbGwgYXV0b21hdGljYWxseSBiZSBpbmNsdWRlZCB3aGVuIHRoaXMgbGlicmFyeSBpcyBpbmNsdWRlZC4KCmBgYHhtbAo8ZGVwZW5kZW5jeT4KICAgIDwhLS0gVXNlZCBmb3IgbG9nZ2luZyAtLT4KICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KICAgIDxhcnRpZmFjdElkPnNsZjRqLWFwaTwvYXJ0aWZhY3RJZD4KICAgIDx2ZXJzaW9uPiR7dmVyc2lvbi5zbGY0an08L3ZlcnNpb24+CjwvZGVwZW5kZW5jeT4KCjxkZXBlbmRlbmN5PgogICAgPCEtLSBVc2VkIHRvIHByb2Nlc3MgSlNPTiAtLT4KICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgogICAgPGFydGlmYWN0SWQ+amFja3Nvbi1kYXRhYmluZDwvYXJ0aWZhY3RJZD4KICAgIDx2ZXJzaW9uPiR7dmVyc2lvbi5qYWNrc29ufTwvdmVyc2lvbj4KPC9kZXBlbmRlbmN5PgoKPGRlcGVuZGVuY3k+CiAgICA8IS0tIFVzZWQgdG8gcHJvY2VzcyBZQU1MIC0tPgogICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFmb3JtYXQ8L2dyb3VwSWQ+CiAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFmb3JtYXQteWFtbDwvYXJ0aWZhY3RJZD4KICAgIDx2ZXJzaW9uPiR7dmVyc2lvbi5qYWNrc29ufTwvdmVyc2lvbj4KPC9kZXBlbmRlbmN5PgoKPGRlcGVuZGVuY3k+CiAgICA8IS0tIFVzZWQgdG8gdmFsaWRhdGUgUkZDIDMzMzkgZGF0ZSBhbmQgZGF0ZS10aW1lIC0tPgogICAgPGdyb3VwSWQ+Y29tLmV0aGxvLnRpbWU8L2dyb3VwSWQ+CiAgICA8YXJ0aWZhY3RJZD5pdHU8L2FydGlmYWN0SWQ+CiAgICA8dmVyc2lvbj4ke3ZlcnNpb24uaXR1fTwvdmVyc2lvbj4KPC9kZXBlbmRlbmN5PgpgYGAKCiMjIyMjIE9wdGlvbmFsIERlcGVuZGVuY2llcwoKVGhlIGZvbGxvd2luZyBhcmUgdGhlIG9wdGlvbmFsIGRlcGVuZGVuY2llcyB0aGF0IG1heSBiZSByZXF1aXJlZCBmb3IgY2VydGFpbiBvcHRpb25zLgoKVGhlc2UgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGFuZCBzZXR0aW5nIHRoZSByZWxldmFudCBvcHRpb24gd2l0aG91dCBhZGRpbmcgdGhlIGxpYnJhcnkgd2lsbCByZXN1bHQgaW4gYSBgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbmAuCgpgYGB4bWwKPGRlcGVuZGVuY3k+CiAgICA8IS0tIFVzZWQgdG8gdmFsaWRhdGUgRUNNQSAyNjIgcmVndWxhciBleHByZXNzaW9ucyAtLT4KICAgIDwhLS0gQXBwcm94aW1hdGVseSA1MCBNQiBpbiBkZXBlbmRlbmNpZXMgLS0+CiAgICA8IS0tIEdyYWFsSlNSZWd1bGFyRXhwcmVzc2lvbkZhY3RvcnkgLS0+CiAgICA8Z3JvdXBJZD5vcmcuZ3JhYWx2bS5qczwvZ3JvdXBJZD4KICAgIDxhcnRpZmFjdElkPmpzPC9hcnRpZmFjdElkPgogICAgPHZlcnNpb24+JHt2ZXJzaW9uLmdyYWFsanN9PC92ZXJzaW9uPgo8L2RlcGVuZGVuY3k+Cgo8ZGVwZW5kZW5jeT4KICAgIDwhLS0gVXNlZCB0byB2YWxpZGF0ZSBFQ01BIDI2MiByZWd1bGFyIGV4cHJlc3Npb25zIC0tPgogICAgPCEtLSBBcHByb3hpbWF0ZWx5IDIgTUIgaW4gZGVwZW5kZW5jaWVzIC0tPgogICAgPCEtLSBKb25pUmVndWxhckV4cHJlc3Npb25GYWN0b3J5IC0tPgogICAgPGdyb3VwSWQ+b3JnLmpydWJ5Lmpvbmk8L2dyb3VwSWQ+CiAgICA8YXJ0aWZhY3RJZD5qb25pPC9hcnRpZmFjdElkPgogICAgPHZlcnNpb24+JHt2ZXJzaW9uLmpvbml9PC92ZXJzaW9uPgo8L2RlcGVuZGVuY3k+CmBgYAoKIyMjIyMgRXhjbHVkYWJsZSBEZXBlbmRlbmNpZXMKClRoZSBmb2xsb3dpbmcgYXJlIHJlcXVpcmVkIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkLCBidXQgY2FuIGJlIGV4cGxpY2l0bHkgZXhjbHVkZWQgaWYgdGhleSBhcmUgbm90IHJlcXVpcmVkLgoKVGhlIFlBTUwgZGVwZW5kZW5jeSBjYW4gYmUgZXhjbHVkZWQgaWYgdGhpcyBpcyBub3QgcmVxdWlyZWQuIEF0dGVtcHRpbmcgdG8gcHJvY2VzcyBzY2hlbWFzIG9yIGlucHV0IHRoYXQgYXJlIFlBTUwgd2lsbCByZXN1bHQgaW4gYSBgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbmAuCgpgYGB4bWwKPGRlcGVuZGVuY3k+CiAgICA8Z3JvdXBJZD5jb20ubmV0d29ya250PC9ncm91cElkPgogICAgPGFydGlmYWN0SWQ+anNvbi1zY2hlbWEtdmFsaWRhdG9yPC9hcnRpZmFjdElkPgogICAgPGV4Y2x1c2lvbnM+CiAgICAgICAgPGV4Y2x1c2lvbj4KICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFmb3JtYXQ8L2dyb3VwSWQ+CiAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tZGF0YWZvcm1hdC15YW1sPC9hcnRpZmFjdElkPgogICAgICAgIDwvZXhjbHVzaW9uPgogICAgPC9leGNsdXNpb25zPgo8L2RlcGVuZGVuY3k+CmBgYAoKVGhlIEV0aGxvIFRpbWUgZGVwZW5kZW5jeSBjYW4gYmUgZXhjbHVkZWQgaWYgYWNjdXJhdGUgdmFsaWRhdGlvbiBvZiB0aGUgYGRhdGUtdGltZWAgZm9ybWF0IGlzIG5vdCByZXF1aXJlZC4gVGhlIGBkYXRlLXRpbWVgIGZvcm1hdCB3aWxsIHRoZW4gdXNlIGBqYXZhLnRpbWUuT2Zmc2V0RGF0ZVRpbWVgIHRvIGRldGVybWluZSBpZiB0aGUgYGRhdGUtdGltZWAgaXMgdmFsaWQgLgoKYGBgeG1sCjxkZXBlbmRlbmN5PgogICAgPGdyb3VwSWQ+Y29tLm5ldHdvcmtudDwvZ3JvdXBJZD4KICAgIDxhcnRpZmFjdElkPmpzb24tc2NoZW1hLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4KICAgIDxleGNsdXNpb25zPgogICAgICAgIDxleGNsdXNpb24+CiAgICAgICAgICAgIDxncm91cElkPmNvbS5ldGhsby50aW1lPC9ncm91cElkPgogICAgICAgICAgICA8YXJ0aWZhY3RJZD5pdHU8L2FydGlmYWN0SWQ+CiAgICAgICAgPC9leGNsdXNpb24+CiAgICA8L2V4Y2x1c2lvbnM+CjwvZGVwZW5kZW5jeT4KYGBgCgojIyMjIENvbW11bml0eQoKVGhpcyBsaWJyYXJ5IGlzIHZlcnkgYWN0aXZlIHdpdGggYSBsb3Qgb2YgY29udHJpYnV0b3JzLiBOZXcgZmVhdHVyZXMgYW5kIGJ1ZyBmaXhlcyBhcmUgaGFuZGxlZCBxdWlja2x5IGJ5IHRoZSB0ZWFtIG1lbWJlcnMuIEJlY2F1c2UgaXQgaXMgYW4gZXNzZW50aWFsIGRlcGVuZGVuY3kgb2YgdGhlIFtsaWdodC00al0oaHR0cHM6Ly9naXRodWIuY29tL25ldHdvcmtudC9saWdodC00aikgZnJhbWV3b3JrIGluIHRoZSBzYW1lIEdpdEh1YiBvcmdhbml6YXRpb24sIGl0IHdpbGwgYmUgZXZvbHZlZCBhbmQgbWFpbnRhaW5lZCBhbG9uZyB3aXRoIHRoZSBmcmFtZXdvcmsuIAoKIyMgUHJlcmVxdWlzaXRlCgpUaGUgbGlicmFyeSBzdXBwb3J0cyBKYXZhIDggYW5kIHVwLiBJZiB5b3Ugd2FudCB0byBidWlsZCBmcm9tIHRoZSBzb3VyY2UgY29kZSwgeW91IG5lZWQgdG8gaW5zdGFsbCBKREsgOCBsb2NhbGx5LiBUbyBzdXBwb3J0IG11bHRpcGxlIHZlcnNpb24gb2YgSkRLLCB5b3UgY2FuIHVzZSBbU0RLTUFOXShodHRwczovL3d3dy5uZXR3b3JrbnQuY29tL3Rvb2wvc2RrLykKCiMjIFVzYWdlCgojIyMgQWRkaW5nIHRoZSBkZXBlbmRlbmN5CgpUaGlzIHBhY2thZ2UgaXMgYXZhaWxhYmxlIG9uIE1hdmVuIGNlbnRyYWwuIAoKIyMjIyBNYXZlbjogCgpgYGB4bWwKPGRlcGVuZGVuY3k+CiAgICA8Z3JvdXBJZD5jb20ubmV0d29ya250PC9ncm91cElkPgogICAgPGFydGlmYWN0SWQ+anNvbi1zY2hlbWEtdmFsaWRhdG9yPC9hcnRpZmFjdElkPgogICAgPHZlcnNpb24+MS41LjQ8L3ZlcnNpb24+CjwvZGVwZW5kZW5jeT4KYGBgCgojIyMjIEdyYWRsZToKCmBgYGphdmEKZGVwZW5kZW5jaWVzIHsKICAgIGltcGxlbWVudGF0aW9uKGdyb3VwOiAnY29tLm5ldHdvcmtudCcsIG5hbWU6ICdqc29uLXNjaGVtYS12YWxpZGF0b3InLCB2ZXJzaW9uOiAnMS41LjQnKTsKfQpgYGAKCiMjIyBWYWxpZGF0aW5nIGlucHV0cyBhZ2FpbnN0IGEgc2NoZW1hCgpUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyBpbnB1dHMgYXJlIHZhbGlkYXRlZCBhZ2FpbnN0IGEgc2NoZW1hLiBJdCBjb21wcmlzZXMgdGhlIGZvbGxvd2luZyBzdGVwcy4KCiogQ3JlYXRpbmcgYSBzY2hlbWEgZmFjdG9yeSB3aXRoIHRoZSBkZWZhdWx0IHNjaGVtYSBkaWFsZWN0IGFuZCBob3cgdGhlIHNjaGVtYXMgY2FuIGJlIHJldHJpZXZlZC4gCiAgKiBDb25maWd1cmluZyBtYXBwaW5nIHRoZSBgJGlkYCB0byBhIHJldHJpZXZhbCBVUkkgdXNpbmcgYHNjaGVtYU1hcHBlcnNgLgogICogQ29uZmlndXJpbmcgaG93IHRoZSBzY2hlbWFzIGFyZSBsb2FkZWQgdXNpbmcgdGhlIHJldHJpZXZhbCBVUkkgdXNpbmcgYHNjaGVtYUxvYWRlcnNgLgogICAgRm9yIGluc3RhbmNlIGEgYE1hcDxTdHJpbmcsIFN0cmluZz4gc2NoZW1hc2AgY29udGFpbmluZyBhIG1hcHBpbmcgb2YgcmV0cmlldmFsIFVSSSB0byBzY2hlbWEgZGF0YSBhcyBhIGBTdHJpbmdgIGNhbiBieSBjb25maWd1cmVkIHVzaW5nIGBidWlsZGVyLnNjaGVtYUxvYWRlcnMoc2NoZW1hTG9hZGVycyAtPiBzY2hlbWFMb2FkZXJzLnNjaGVtYXMoc2NoZW1hcykpYC4gVGhpcyBhbHNvIGFjY2VwdHMgYSBgRnVuY3Rpb248U3RyaW5nLCBTdHJpbmc+IHNjaGVtYVJldHJpZXZhbEZ1bmN0aW9uYC4KKiBDcmVhdGluZyBhIGNvbmZpZ3VyYXRpb24gZm9yIGNvbnRyb2xsaW5nIHZhbGlkYXRvciBiZWhhdmlvci4KKiBMb2FkaW5nIGEgc2NoZW1hIGZyb20gYSBzY2hlbWEgbG9jYXRpb24gYWxvbmcgd2l0aCB0aGUgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24uCiogVXNpbmcgdGhlIHNjaGVtYSB0byB2YWxpZGF0ZSB0aGUgZGF0YSBhbG9uZyB3aXRoIHNldHRpbmcgYW55IGV4ZWN1dGlvbiBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGxpa2UgZm9yIGluc3RhbmNlIHRoZSBsb2NhbGUgb3Igd2hldGhlciBmb3JtYXQgYXNzZXJ0aW9ucyBhcmUgZW5hYmxlZC4KCmBgYGphdmEKLy8gVGhpcyBjcmVhdGVzIGEgc2NoZW1hIGZhY3RvcnkgdGhhdCB3aWxsIHVzZSBEcmFmdCAyMDIwLTEyIGFzIHRoZSBkZWZhdWx0IGlmICRzY2hlbWEgaXMgbm90IHNwZWNpZmllZAovLyBpbiB0aGUgc2NoZW1hIGRhdGEuIElmICRzY2hlbWEgaXMgc3BlY2lmaWVkIGluIHRoZSBzY2hlbWEgZGF0YSB0aGVuIHRoYXQgc2NoZW1hIGRpYWxlY3Qgd2lsbCBiZSB1c2VkCi8vIGluc3RlYWQgYW5kIHRoaXMgdmVyc2lvbiBpcyBpZ25vcmVkLgpKc29uU2NoZW1hRmFjdG9yeSBqc29uU2NoZW1hRmFjdG9yeSA9IEpzb25TY2hlbWFGYWN0b3J5LmdldEluc3RhbmNlKFZlcnNpb25GbGFnLlYyMDIwMTIsIGJ1aWxkZXIgLT4gCiAgICAvLyBUaGlzIGNyZWF0ZXMgYSBtYXBwaW5nIGZyb20gJGlkIHdoaWNoIHN0YXJ0cyB3aXRoIGh0dHBzOi8vd3d3LmV4YW1wbGUub3JnLyB0byB0aGUgcmV0cmlldmFsIFVSSSBjbGFzc3BhdGg6c2NoZW1hLwogICAgYnVpbGRlci5zY2hlbWFNYXBwZXJzKHNjaGVtYU1hcHBlcnMgLT4gc2NoZW1hTWFwcGVycy5tYXBQcmVmaXgoImh0dHBzOi8vd3d3LmV4YW1wbGUub3JnLyIsICJjbGFzc3BhdGg6c2NoZW1hLyIpKQopOwoKU2NoZW1hVmFsaWRhdG9yc0NvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBTY2hlbWFWYWxpZGF0b3JzQ29uZmlnLmJ1aWxkZXIoKTsKLy8gQnkgZGVmYXVsdCB0aGUgSkRLIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbXBsZW1lbnRhdGlvbiB3aGljaCBpcyBub3QgRUNNQSAyNjIgY29tcGxpYW50IGlzIHVzZWQKLy8gTm90ZSB0aGF0IHNldHRpbmcgdGhpcyByZXF1aXJlcyBpbmNsdWRpbmcgb3B0aW9uYWwgZGVwZW5kZW5jaWVzCi8vIGJ1aWxkZXIucmVndWxhckV4cHJlc3Npb25GYWN0b3J5KEdyYWFsSlNSZWd1bGFyRXhwcmVzc2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKSk7Ci8vIGJ1aWxkZXIucmVndWxhckV4cHJlc3Npb25GYWN0b3J5KEpvbmlSZWd1bGFyRXhwcmVzc2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKSk7ClNjaGVtYVZhbGlkYXRvcnNDb25maWcgY29uZmlnID0gYnVpbGRlci5idWlsZCgpOwoKLy8gRHVlIHRvIHRoZSBtYXBwaW5nIHRoZSBzY2hlbWEgd2lsbCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgY2xhc3NwYXRoIGF0IGNsYXNzcGF0aDpzY2hlbWEvZXhhbXBsZS1tYWluLmpzb24uCi8vIElmIHRoZSBzY2hlbWEgZGF0YSBkb2VzIG5vdCBzcGVjaWZ5IGFuICRpZCB0aGUgYWJzb2x1dGUgSVJJIG9mIHRoZSBzY2hlbWEgbG9jYXRpb24gd2lsbCBiZSB1c2VkIGFzIHRoZSAkaWQuCkpzb25TY2hlbWEgc2NoZW1hID0ganNvblNjaGVtYUZhY3RvcnkuZ2V0U2NoZW1hKFNjaGVtYUxvY2F0aW9uLm9mKCJodHRwczovL3d3dy5leGFtcGxlLm9yZy9leGFtcGxlLW1haW4uanNvbiIpLCBjb25maWcpOwpTdHJpbmcgaW5wdXQgPSAie1xyXG4iCiAgICArICIgIFwibWFpblwiOiB7XHJcbiIKICAgICsgIiAgICBcImNvbW1vblwiOiB7XHJcbiIKICAgICsgIiAgICAgIFwiZmllbGRcIjogXCJpbnZhbGlkZmllbGRcIlxyXG4iCiAgICArICIgICAgfVxyXG4iCiAgICArICIgIH1cclxuIgogICAgKyAifSI7CgpTZXQ8VmFsaWRhdGlvbk1lc3NhZ2U+IGFzc2VydGlvbnMgPSBzY2hlbWEudmFsaWRhdGUoaW5wdXQsIElucHV0Rm9ybWF0LkpTT04sIGV4ZWN1dGlvbkNvbnRleHQgLT4gewogICAgLy8gQnkgZGVmYXVsdCBzaW5jZSBEcmFmdCAyMDE5LTA5IHRoZSBmb3JtYXQga2V5d29yZCBvbmx5IGdlbmVyYXRlcyBhbm5vdGF0aW9ucyBhbmQgbm90IGFzc2VydGlvbnMKICAgIGV4ZWN1dGlvbkNvbnRleHQuZ2V0RXhlY3V0aW9uQ29uZmlnKCkuc2V0Rm9ybWF0QXNzZXJ0aW9uc0VuYWJsZWQodHJ1ZSk7Cn0pOwpgYGAKCiMjIyBWYWxpZGF0aW5nIGEgc2NoZW1hIGFnYWluc3QgYSBtZXRhLXNjaGVtYQoKVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgYSBzY2hlbWEgaXMgdmFsaWRhdGVkIGFnYWluc3QgYSBtZXRhLXNjaGVtYS4KClRoaXMgaXMgYWN0dWFsbHkgdGhlIHNhbWUgYXMgdmFsaWRhdGluZyBpbnB1dHMgYWdhaW5zdCBhIHNjaGVtYSBleGNlcHQgaW4gdGhpcyBjYXNlIHRoZSBpbnB1dCBpcyB0aGUgc2NoZW1hIGFuZCB0aGUgc2NoZW1hIHVzZWQgaXMgdGhlIG1ldGEtc2NoZW1hLgoKTm90ZSB0aGF0IHRoZSBtZXRhLXNjaGVtYXMgZm9yIERyYWZ0IDQsIERyYWZ0IDYsIERyYWZ0IDcsIERyYWZ0IDIwMTktMDkgYW5kIERyYWZ0IDIwMjAtMTIgYXJlIGJ1bmRsZWQgd2l0aCB0aGUgbGlicmFyeSBhbmQgdGhlc2UgY2xhc3NwYXRoIHJlc291cmNlcyB3aWxsIGJlIHVzZWQgYnkgZGVmYXVsdC4KCmBgYGphdmEKSnNvblNjaGVtYUZhY3RvcnkganNvblNjaGVtYUZhY3RvcnkgPSBKc29uU2NoZW1hRmFjdG9yeS5nZXRJbnN0YW5jZShWZXJzaW9uRmxhZy5WMjAyMDEyKTsKClNjaGVtYVZhbGlkYXRvcnNDb25maWcuQnVpbGRlciBidWlsZGVyID0gU2NoZW1hVmFsaWRhdG9yc0NvbmZpZy5idWlsZGVyKCk7Ci8vIEJ5IGRlZmF1bHQgdGhlIEpESyByZWd1bGFyIGV4cHJlc3Npb24gaW1wbGVtZW50YXRpb24gd2hpY2ggaXMgbm90IEVDTUEgMjYyIGNvbXBsaWFudCBpcyB1c2VkCi8vIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgcmVxdWlyZXMgaW5jbHVkaW5nIG9wdGlvbmFsIGRlcGVuZGVuY2llcwovLyBidWlsZGVyLnJlZ3VsYXJFeHByZXNzaW9uRmFjdG9yeShHcmFhbEpTUmVndWxhckV4cHJlc3Npb25GYWN0b3J5LmdldEluc3RhbmNlKCkpOwovLyBidWlsZGVyLnJlZ3VsYXJFeHByZXNzaW9uRmFjdG9yeShKb25pUmVndWxhckV4cHJlc3Npb25GYWN0b3J5LmdldEluc3RhbmNlKCkpOwpTY2hlbWFWYWxpZGF0b3JzQ29uZmlnIGNvbmZpZyA9IGJ1aWxkZXIuYnVpbGQoKTsKCi8vIER1ZSB0byB0aGUgbWFwcGluZyB0aGUgbWV0YS1zY2hlbWEgd2lsbCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgY2xhc3NwYXRoIGF0IGNsYXNzcGF0aDpkcmFmdC8yMDIwLTEyL3NjaGVtYS4KSnNvblNjaGVtYSBzY2hlbWEgPSBqc29uU2NoZW1hRmFjdG9yeS5nZXRTY2hlbWEoU2NoZW1hTG9jYXRpb24ub2YoU2NoZW1hSWQuVjIwMjAxMiksIGNvbmZpZyk7ClN0cmluZyBpbnB1dCA9ICJ7XHJcbiIKICAgICsgIiAgXCJ0eXBlXCI6IFwib2JqZWN0XCIsXHJcbiIKICAgICsgIiAgXCJwcm9wZXJ0aWVzXCI6IHtcclxuIgogICAgKyAiICAgIFwia2V5XCI6IHtcclxuIgogICAgKyAiICAgICAgXCJ0aXRsZVwiIDogXCJNeSBrZXlcIixcclxuIgogICAgKyAiICAgICAgXCJ0eXBlXCI6IFwiaW52YWxpZHR5cGVcIlxyXG4iCiAgICArICIgICAgfVxyXG4iCiAgICArICIgIH1cclxuIgogICAgKyAifSI7ClNldDxWYWxpZGF0aW9uTWVzc2FnZT4gYXNzZXJ0aW9ucyA9IHNjaGVtYS52YWxpZGF0ZShpbnB1dCwgSW5wdXRGb3JtYXQuSlNPTiwgZXhlY3V0aW9uQ29udGV4dCAtPiB7CiAgICAvLyBCeSBkZWZhdWx0IHNpbmNlIERyYWZ0IDIwMTktMDkgdGhlIGZvcm1hdCBrZXl3b3JkIG9ubHkgZ2VuZXJhdGVzIGFubm90YXRpb25zIGFuZCBub3QgYXNzZXJ0aW9ucwogICAgZXhlY3V0aW9uQ29udGV4dC5nZXRFeGVjdXRpb25Db25maWcoKS5zZXRGb3JtYXRBc3NlcnRpb25zRW5hYmxlZCh0cnVlKTsKfSk7CmBgYCAgICAgICAgCiMjIyBSZXN1bHRzIGFuZCBvdXRwdXQgZm9ybWF0cwoKIyMjIyBSZXN1bHRzCgpUaGUgZm9sbG93aW5nIHR5cGVzIG9mIHJlc3VsdHMgYXJlIGdlbmVyYXRlZCBieSB0aGUgbGlicmFyeS4KCnwgVHlwZSAgICAgICAgfCBEZXNjcmlwdGlvbiAKfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLQp8IEFzc2VydGlvbnMgIHwgVmFsaWRhdGlvbiBlcnJvcnMgZ2VuZXJhdGVkIGJ5IGEga2V5d29yZCBvbiBhIHBhcnRpY3VsYXIgaW5wdXQgZGF0YSBpbnN0YW5jZS4gVGhpcyBpcyBnZW5lcmFsbHkgZGVzY3JpYmVkIGluIGEgYFZhbGlkYXRpb25NZXNzYWdlYCBvciBpbiBhIGBPdXRwdXRVbml0YC4gTm90ZSB0aGF0IHNpbmNlIERyYWZ0IDIwMTktMDkgdGhlIGBmb3JtYXRgIGtleXdvcmQgbm8gbG9uZ2VyIGdlbmVyYXRlcyBhc3NlcnRpb25zIGJ5IGRlZmF1bHQgYW5kIGluc3RlYWQgZ2VuZXJhdGVzIG9ubHkgYW5ub3RhdGlvbnMgdW5sZXNzIGNvbmZpZ3VyZWQgb3RoZXJ3aXNlIHVzaW5nIGEgY29uZmlndXJhdGlvbiBvcHRpb24gb3IgYnkgdXNpbmcgYSBtZXRhLXNjaGVtYSB0aGF0IHVzZXMgdGhlIGFwcHJvcHJpYXRlIHZvY2FidWxhcnkuCnwgQW5ub3RhdGlvbnMgfCBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGdlbmVyYXRlZCBieSBhIGtleXdvcmQgZm9yIGEgcGFydGljdWxhciBpbnB1dCBkYXRhIGluc3RhbmNlLiBUaGlzIGlzIGdlbmVyYWxseSBkZXNjcmliZWQgaW4gYSBgT3V0cHV0VW5pdGAuIEFubm90YXRpb24gY29sbGVjdGlvbiBhbmQgcmVwb3J0aW5nIGlzIHR1cm5lZCBvZmYgYnkgZGVmYXVsdC4gQW5ub3RhdGlvbnMgcmVxdWlyZWQgYnkga2V5d29yZHMgc3VjaCBhcyBgdW5ldmFsdWF0ZWRQcm9wZXJ0aWVzYCBvciBgdW5ldmFsdWF0ZWRJdGVtc2AgYXJlIGFsd2F5cyBjb2xsZWN0ZWQgZm9yIGV2YWx1YXRpb24gcHVycG9zZXMgYW5kIGNhbm5vdCBiZSBkaXNhYmxlZCBidXQgd2lsbCBub3QgYmUgcmVwb3J0ZWQgdW5sZXNzIGNvbmZpZ3VyZWQgdG8gZG8gc28uCgpUaGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gZGVzY3JpYmUgYm90aCB0eXBlcyBvZiByZXN1bHRzLgoKfCBUeXBlICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uIAp8LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tCnwgRXZhbHVhdGlvbiBQYXRoICAgfCBUaGlzIGlzIHRoZSBzZXQgb2Yga2V5cyBmcm9tIHRoZSByb290IHRocm91Z2ggd2hpY2ggZXZhbHVhdGlvbiBwYXNzZXMgdG8gcmVhY2ggdGhlIHNjaGVtYSBmb3IgZXZhbHVhdGluZyB0aGUgaW5zdGFuY2UuIFRoaXMgaW5jbHVkZXMgYCRyZWZgIGFuZCBgJGR5bmFtaWNSZWZgLiBlZy4gYGBgL3Byb3BlcnRpZXMvYmFyLyRyZWYvcHJvcGVydGllcy9iYXItcHJvcGBgYAp8IFNjaGVtYSBMb2NhdGlvbiAgIHwgVGhpcyBpcyB0aGUgY2Fub25pY2FsIElSSSBvZiB0aGUgc2NoZW1hIHBsdXMgdGhlIEpTT04gcG9pbnRlciBmcmFnbWVudCB0byB0aGUgc2NoZW1hIHRoYXQgd2FzIHVzZWQgZm9yIGV2YWx1YXRpbmcgdGhlIGluc3RhbmNlLiBlZy4gYGBgaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvc2NoZW1hcy9leGFtcGxlIy8kZGVmcy9iYXIvcHJvcGVydGllcy9iYXItcHJvcGBgYAp8IEluc3RhbmNlIExvY2F0aW9uIHwgVGhpcyBpcyB0aGUgSlNPTiBwb2ludGVyIGZyYWdtZW50IHRvIHRoZSBpbnN0YW5jZSBkYXRhIHRoYXQgd2FzIGJlaW5nIGV2YWx1YXRlZC4gZWcuIGBgYC9iYXIvYmFyLXByb3BgYGAKCkFzc2VydGlvbnMgY29udGFpbnMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCgp8IFR5cGUgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gCnwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0KfCBNZXNzYWdlICAgICAgICAgICB8IFRoZSB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2UuCnwgQ29kZSAgICAgICAgICAgICAgfCBUaGUgZXJyb3IgY29kZS4KfCBNZXNzYWdlIEtleSAgICAgICB8IFRoZSBtZXNzYWdlIGtleSB1c2VkIGZvciBnZW5lcmF0aW5nIHRoZSBtZXNzYWdlIGZvciBsb2NhbGl6YXRpb24uCnwgQXJndW1lbnRzICAgICAgICAgfCBUaGUgYXJndW1lbnRzIHVzZWQgZm9yIGdlbmVyYXRpbmcgdGhlIG1lc3NhZ2UuCnwgVHlwZSAgICAgICAgICAgICAgfCBUaGUga2V5d29yZCB0aGF0IGdlbmVyYXRlZCB0aGUgbWVzc2FnZS4KfCBQcm9wZXJ0eSAgICAgICAgICB8IFRoZSBwcm9wZXJ0eSBuYW1lIHRoYXQgY2F1c2VkIHRoZSB2YWxpZGF0aW9uIGVycm9yIGZvciBleGFtcGxlIGZvciB0aGUgYHJlcXVpcmVkYCBrZXl3b3JkLiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcGFydCBvZiB0aGUgaW5zdGFuY2UgbG9jYXRpb24gYXMgdGhhdCBwb2ludHMgdG8gdGhlIGluc3RhbmNlIG5vZGUuCnwgU2NoZW1hIE5vZGUgICAgICAgfCBUaGUgYEpzb25Ob2RlYCBwb2ludGVkIHRvIGJ5IHRoZSBTY2hlbWEgTG9jYXRpb24uIFRoaXMgaXMgdGhlIHNjaGVtYSBkYXRhIHRoYXQgY2F1c2VkIHRoZSBpbnB1dCBkYXRhIHRvIGZhaWwuIEl0IGlzIHBvc3NpYmxlIHRvIGdldCB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gYnkgY29uZmlndXJpbmcgdGhlIGBKc29uU2NoZW1hRmFjdG9yeWAgd2l0aCBhIGBKc29uTm9kZVJlYWRlcmAgdGhhdCB1c2VzIHRoZSBgTG9jYXRpb25Kc29uTm9kZUZhY3RvcnlGYWN0b3J5YCBhbmQgdXNpbmcgYEpzb25Ob2Rlcy50b2tlbkxvY2F0aW9uT2Yoc2NoZW1hTm9kZSlgLgp8IEluc3RhbmNlIE5vZGUgICAgIHwgVGhlIGBKc29uTm9kZWAgcG9pbnRlZCB0byBieSB0aGUgSW5zdGFuY2UgTG9jYXRpb24uIFRoaXMgaXMgdGhlIGlucHV0IGRhdGEgdGhhdCBmYWlsZWQgdmFsaWRhdGlvbi4gSXQgaXMgcG9zc2libGUgdG8gZ2V0IHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBieSBjb25maWd1cmluZyB0aGUgYEpzb25TY2hlbWFGYWN0b3J5YCB3aXRoIGEgYEpzb25Ob2RlUmVhZGVyYCB0aGF0IHVzZXMgdGhlIGBMb2NhdGlvbkpzb25Ob2RlRmFjdG9yeUZhY3RvcnlgIGFuZCB1c2luZyBgSnNvbk5vZGVzLnRva2VuTG9jYXRpb25PZihpbnN0YW5jZU5vZGUpYC4KfCBFcnJvciAgICAgICAgICAgICB8IFRoZSBlcnJvci4KfCBEZXRhaWxzICAgICAgICAgICB8IEFkZGl0aW9uYWwgZGV0YWlscyB0aGF0IGNhbiBiZSBzZXQgYnkgY3VzdG9tIGtleXdvcmQgdmFsaWRhdG9yIGltcGxlbWVudGF0aW9ucy4gVGhpcyBpcyBub3QgdXNlZCBieSB0aGUgbGlicmFyeS4KCkFubm90YXRpb25zIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgoKfCBUeXBlICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uIAp8LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tCnwgVmFsdWUgICAgICAgICAgICAgfCBUaGUgYW5ub3RhdGlvbiB2YWx1ZSBnZW5lcmF0ZWQKCiMjIyMjIExpbmUgYW5kIENvbHVtbiBJbmZvcm1hdGlvbgoKVGhlIGxpYnJhcnkgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gc3RvcmUgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGluIHRoZSBgSnNvbk5vZGVgIGluc3RhbmNlcyBmb3IgdGhlIGluc3RhbmNlIGFuZCBzY2hlbWEgbm9kZXMuIFRoaXMgd2lsbCBhZHZlcnNlbHkgYWZmZWN0IHBlcmZvcm1hbmNlIGFuZCBpcyBub3QgY29uZmlndXJlZCBieSBkZWZhdWx0LgoKVGhpcyBpcyBkb25lIGJ5IGNvbmZpZ3VyaW5nIGEgYEpzb25Ob2RlUmVhZGVyYCB0aGF0IHVzZXMgdGhlIGBMb2NhdGlvbkpzb25Ob2RlRmFjdG9yeUZhY3Rvcnlgb24gdGhlIGBKc29uU2NoZW1hRmFjdG9yeWAuIFRoZSBgSnNvbkxvY2F0aW9uYCBpbmZvcm1hdGlvbiBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgdXNpbmcgYEpzb25Ob2Rlcy50b2tlbkxvY2F0aW9uT2YoanNvbk5vZGUpYC4KCmBgYGphdmEKU3RyaW5nIHNjaGVtYURhdGEgPSAie1xyXG4iCiAgICAgICAgICAgICAgICArICIgIFwiJGlkXCI6IFwiaHR0cHM6Ly9zY2hlbWEvbXlzY2hlbWFcIixcclxuIgogICAgICAgICAgICAgICAgKyAiICBcInByb3BlcnRpZXNcIjoge1xyXG4iCiAgICAgICAgICAgICAgICArICIgICAgXCJzdGFydERhdGVcIjoge1xyXG4iCiAgICAgICAgICAgICAgICArICIgICAgICBcImZvcm1hdFwiOiBcImRhdGVcIixcclxuIgogICAgICAgICAgICAgICAgKyAiICAgICAgXCJtaW5MZW5ndGhcIjogNlxyXG4iCiAgICAgICAgICAgICAgICArICIgICAgfVxyXG4iCiAgICAgICAgICAgICAgICArICIgIH1cclxuIgogICAgICAgICAgICAgICAgKyAifSI7ClN0cmluZyBpbnB1dERhdGEgPSAie1xyXG4iCiAgICAgICAgICAgICAgICArICIgIFwic3RhcnREYXRlXCI6IFwiMVwiXHJcbiIKICAgICAgICAgICAgICAgICsgIn0iOwpKc29uU2NoZW1hRmFjdG9yeSBmYWN0b3J5ID0gSnNvblNjaGVtYUZhY3RvcnkuZ2V0SW5zdGFuY2UoVmVyc2lvbkZsYWcuVjIwMjAxMiwKICAgICAgICBidWlsZGVyIC0+IGJ1aWxkZXIuanNvbk5vZGVSZWFkZXIoSnNvbk5vZGVSZWFkZXIuYnVpbGRlcigpLmxvY2F0aW9uQXdhcmUoKS5idWlsZCgpKSk7ClNjaGVtYVZhbGlkYXRvcnNDb25maWcgY29uZmlnID0gU2NoZW1hVmFsaWRhdG9yc0NvbmZpZy5idWlsZGVyKCkuYnVpbGQoKTsKSnNvblNjaGVtYSBzY2hlbWEgPSBmYWN0b3J5LmdldFNjaGVtYShzY2hlbWFEYXRhLCBJbnB1dEZvcm1hdC5KU09OLCBjb25maWcpOwpTZXQ8VmFsaWRhdGlvbk1lc3NhZ2U+IG1lc3NhZ2VzID0gc2NoZW1hLnZhbGlkYXRlKGlucHV0RGF0YSwgSW5wdXRGb3JtYXQuSlNPTiwgZXhlY3V0aW9uQ29udGV4dCAtPiB7CiAgICBleGVjdXRpb25Db250ZXh0LmdldEV4ZWN1dGlvbkNvbmZpZygpLnNldEZvcm1hdEFzc2VydGlvbnNFbmFibGVkKHRydWUpOwp9KTsKTGlzdDxWYWxpZGF0aW9uTWVzc2FnZT4gbGlzdCA9IG1lc3NhZ2VzLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7ClZhbGlkYXRpb25NZXNzYWdlIGZvcm1hdCA9IGxpc3QuZ2V0KDApOwpKc29uTG9jYXRpb24gZm9ybWF0SW5zdGFuY2VOb2RlVG9rZW5Mb2NhdGlvbiA9IEpzb25Ob2Rlcy50b2tlbkxvY2F0aW9uT2YoZm9ybWF0LmdldEluc3RhbmNlTm9kZSgpKTsKSnNvbkxvY2F0aW9uIGZvcm1hdFNjaGVtYU5vZGVUb2tlbkxvY2F0aW9uID0gSnNvbk5vZGVzLnRva2VuTG9jYXRpb25PZihmb3JtYXQuZ2V0U2NoZW1hTm9kZSgpKTsKVmFsaWRhdGlvbk1lc3NhZ2UgbWluTGVuZ3RoID0gbGlzdC5nZXQoMSk7Ckpzb25Mb2NhdGlvbiBtaW5MZW5ndGhJbnN0YW5jZU5vZGVUb2tlbkxvY2F0aW9uID0gSnNvbk5vZGVzLnRva2VuTG9jYXRpb25PZihtaW5MZW5ndGguZ2V0SW5zdGFuY2VOb2RlKCkpOwpKc29uTG9jYXRpb24gbWluTGVuZ3RoU2NoZW1hTm9kZVRva2VuTG9jYXRpb24gPSBKc29uTm9kZXMudG9rZW5Mb2NhdGlvbk9mKG1pbkxlbmd0aC5nZXRTY2hlbWFOb2RlKCkpOwoKYXNzZXJ0RXF1YWxzKCJmb3JtYXQiLCBmb3JtYXQuZ2V0VHlwZSgpKTsKYXNzZXJ0RXF1YWxzKCJkYXRlIiwgZm9ybWF0LmdldFNjaGVtYU5vZGUoKS5hc1RleHQoKSk7CmFzc2VydEVxdWFscyg1LCBmb3JtYXRTY2hlbWFOb2RlVG9rZW5Mb2NhdGlvbi5nZXRMaW5lTnIoKSk7CmFzc2VydEVxdWFscygxNywgZm9ybWF0U2NoZW1hTm9kZVRva2VuTG9jYXRpb24uZ2V0Q29sdW1uTnIoKSk7CmFzc2VydEVxdWFscygiMSIsIGZvcm1hdC5nZXRJbnN0YW5jZU5vZGUoKS5hc1RleHQoKSk7CmFzc2VydEVxdWFscygyLCBmb3JtYXRJbnN0YW5jZU5vZGVUb2tlbkxvY2F0aW9uLmdldExpbmVOcigpKTsKYXNzZXJ0RXF1YWxzKDE2LCBmb3JtYXRJbnN0YW5jZU5vZGVUb2tlbkxvY2F0aW9uLmdldENvbHVtbk5yKCkpOwphc3NlcnRFcXVhbHMoIm1pbkxlbmd0aCIsIG1pbkxlbmd0aC5nZXRUeXBlKCkpOwphc3NlcnRFcXVhbHMoIjYiLCBtaW5MZW5ndGguZ2V0U2NoZW1hTm9kZSgpLmFzVGV4dCgpKTsKYXNzZXJ0RXF1YWxzKDYsIG1pbkxlbmd0aFNjaGVtYU5vZGVUb2tlbkxvY2F0aW9uLmdldExpbmVOcigpKTsKYXNzZXJ0RXF1YWxzKDIwLCBtaW5MZW5ndGhTY2hlbWFOb2RlVG9rZW5Mb2NhdGlvbi5nZXRDb2x1bW5OcigpKTsKYXNzZXJ0RXF1YWxzKCIxIiwgbWluTGVuZ3RoLmdldEluc3RhbmNlTm9kZSgpLmFzVGV4dCgpKTsKYXNzZXJ0RXF1YWxzKDIsIG1pbkxlbmd0aEluc3RhbmNlTm9kZVRva2VuTG9jYXRpb24uZ2V0TGluZU5yKCkpOwphc3NlcnRFcXVhbHMoMTYsIG1pbkxlbmd0aEluc3RhbmNlTm9kZVRva2VuTG9jYXRpb24uZ2V0Q29sdW1uTnIoKSk7CmFzc2VydEVxdWFscygxNiwgbWluTGVuZ3RoSW5zdGFuY2VOb2RlVG9rZW5Mb2NhdGlvbi5nZXRDb2x1bW5OcigpKTsKYGBgCgoKIyMjIyBPdXRwdXQgZm9ybWF0cwoKVGhpcyBsaWJyYXJ5IGltcGxlbWVudHMgdGhlIEZsYWcsIExpc3QgYW5kIEhpZXJhcmNoaWNhbCBvdXRwdXQgZm9ybWF0cyBkZWZpbmVkIGluIHRoZSBbU3BlY2lmaWNhdGlvbiBmb3IgTWFjaGluZS1SZWFkYWJsZSBPdXRwdXQgZm9yIEpTT04gU2NoZW1hIFZhbGlkYXRpb24gYW5kIEFubm90YXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9qc29uLXNjaGVtYS1vcmcvanNvbi1zY2hlbWEtc3BlYy9ibG9iLzgyNzA2NTNhOWY1OWZhZGQyZGYwZDc4OWYyMmQ0ODYyNTQ1MDViYmUvanNvbnNjaGVtYS12YWxpZGF0aW9uLW91dHB1dC1tYWNoaW5lcy5tZCkuCgpUaGUgTGlzdCBhbmQgSGllcmFyY2hpY2FsIG91dHB1dCBmb3JtYXRzIGFyZSBwYXJ0aWN1bGFybHkgaGVscGZ1bCBmb3IgdW5kZXJzdGFuZGluZyBob3cgdGhlIHN5c3RlbSBhcnJpdmVkIGF0IGEgcGFydGljdWxhciByZXN1bHQuCgp8IE91dHB1dCBGb3JtYXQgICAgIHwgRGVzY3JpcHRpb24gCnwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0KfCBEZWZhdWx0ICAgICAgICAgICB8IEdlbmVyYXRlcyB0aGUgbGlzdCBvZiBhc3NlcnRpb25zLgp8IEJvb2xlYW4gICAgICAgICAgIHwgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbGlkYXRpb24gaXMgc3VjY2Vzc2Z1bC4gTm90ZSB0aGF0IHRoZSBmYWlsIGZhc3Qgb3B0aW9uIGlzIHR1cm5lZCBvbiBieSBkZWZhdWx0IGZvciB0aGlzIG91dHB1dCBmb3JtYXQuCnwgRmxhZyAgICAgICAgICAgICAgfCBSZXR1cm5zIGFuIGBPdXRwdXRGbGFnYCBvYmplY3Qgd2l0aCBgdmFsaWRgIGhhdmluZyBgdHJ1ZWAgaWYgdGhlIHZhbGlkYXRpb24gaXMgc3VjY2Vzc2Z1bC4gTm90ZSB0aGF0IHRoZSBmYWlsIGZhc3Qgb3B0aW9uIGlzIHR1cm5lZCBvbiBieSBkZWZhdWx0IGZvciB0aGlzIG91dHB1dCBmb3JtYXQuCnwgTGlzdCAgICAgICAgICAgICAgfCBSZXR1cm5zIGFuIGBPdXRwdXRVbml0YCBvYmplY3Qgd2l0aCBgZGV0YWlsc2Agd2l0aCBhIGxpc3Qgb2YgYE91dHB1dFVuaXRgIG9iamVjdHMgd2l0aCB0aGUgYXNzZXJ0aW9ucyBhbmQgYW5ub3RhdGlvbnMuIE5vdGUgdGhhdCBhbm5vdGF0aW9ucyBhcmUgbm90IGNvbGxlY3RlZCBieSBkZWZhdWx0IGFuZCBpdCBoYXMgdG8gYmUgZW5hYmxlZCBhcyBpdCB3aWxsIGltcGFjdCBwZXJmb3JtYW5jZS4KfCBIaWVyYXJjaGljYWwgICAgICB8IFJldHVybnMgYW4gYE91dHB1dFVuaXRgIG9iamVjdCB3aXRoIGEgaGllcmFyY2h5IG9mIGBPdXRwdXRVbml0YCBvYmplY3RzIGZvciB0aGUgZXZhbHVhdGlvbiBwYXRoIHdpdGggdGhlIGFzc2VydGlvbnMgYW5kIGFubm90YXRpb25zLiBOb3RlIHRoYXQgYW5ub3RhdGlvbnMgYXJlIG5vdCBjb2xsZWN0ZWQgYnkgZGVmYXVsdCBhbmQgaXQgaGFzIHRvIGJlIGVuYWJsZWQgYXMgaXQgd2lsbCBpbXBhY3QgcGVyZm9ybWFuY2UuCgpUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGdlbmVyYXRlIHRoZSBoaWVyYXJjaGljYWwgb3V0cHV0IGZvcm1hdCB3aXRoIGFubm90YXRpb24gY29sbGVjdGlvbiBhbmQgcmVwb3J0aW5nIHR1cm5lZCBvbiBhbmQgZm9ybWF0IGFzc2VydGlvbnMgdHVybmVkIG9uLgoKYGBgamF2YQpKc29uU2NoZW1hRmFjdG9yeSBmYWN0b3J5ID0gSnNvblNjaGVtYUZhY3RvcnkuZ2V0SW5zdGFuY2UoVmVyc2lvbkZsYWcuVjIwMjAxMik7ClNjaGVtYVZhbGlkYXRvcnNDb25maWcgY29uZmlnID0gU2NoZW1hVmFsaWRhdG9yc0NvbmZpZygpLmJ1aWxkZXIoKS5mb3JtYXRBc3NlcnRpb25zRW5hYmxlZCh0cnVlKS5idWlsZCgpOwpKc29uU2NoZW1hIHNjaGVtYSA9IGZhY3RvcnkuZ2V0U2NoZW1hKFNjaGVtYUxvY2F0aW9uLm9mKCJodHRwczovL2pzb24tc2NoZW1hLm9yZy9zY2hlbWFzL2V4YW1wbGUiKSwgY29uZmlnKTsKICAgICAgICAKT3V0cHV0VW5pdCBvdXRwdXRVbml0ID0gc2NoZW1hLnZhbGlkYXRlKGlucHV0RGF0YSwgSW5wdXRGb3JtYXQuSlNPTiwgT3V0cHV0Rm9ybWF0LkhJRVJBUkNISUNBTCwgZXhlY3V0aW9uQ29udGV4dCAtPiB7CiAgICBleGVjdXRpb25Db250ZXh0LmdldEV4ZWN1dGlvbkNvbmZpZygpLnNldEFubm90YXRpb25Db2xsZWN0aW9uRW5hYmxlZCh0cnVlKTsKICAgIGV4ZWN1dGlvbkNvbnRleHQuZ2V0RXhlY3V0aW9uQ29uZmlnKCkuc2V0QW5ub3RhdGlvbkNvbGxlY3Rpb25GaWx0ZXIoa2V5d29yZCAtPiB0cnVlKTsKfSk7CmBgYApUaGUgZm9sbG93aW5nIGlzIHNhbXBsZSBvdXRwdXQgZnJvbSB0aGUgSGllcmFyY2hpY2FsIGZvcm1hdC4KCmBgYGpzb24KewogICJ2YWxpZCIgOiBmYWxzZSwKICAiZXZhbHVhdGlvblBhdGgiIDogIiIsCiAgInNjaGVtYUxvY2F0aW9uIiA6ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9zY2hlbWFzL2V4YW1wbGUjIiwKICAiaW5zdGFuY2VMb2NhdGlvbiIgOiAiIiwKICAiZHJvcHBlZEFubm90YXRpb25zIiA6IHsKICAgICJwcm9wZXJ0aWVzIiA6IFsgImZvbyIsICJiYXIiIF0sCiAgICAidGl0bGUiIDogInJvb3QiCiAgfSwKICAiZGV0YWlscyIgOiBbIHsKICAgICJ2YWxpZCIgOiBmYWxzZSwKICAgICJldmFsdWF0aW9uUGF0aCIgOiAiL3Byb3BlcnRpZXMvZm9vL2FsbE9mLzAiLAogICAgInNjaGVtYUxvY2F0aW9uIiA6ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9zY2hlbWFzL2V4YW1wbGUjL3Byb3BlcnRpZXMvZm9vL2FsbE9mLzAiLAogICAgImluc3RhbmNlTG9jYXRpb24iIDogIi9mb28iLAogICAgImVycm9ycyIgOiB7CiAgICAgICJyZXF1aXJlZCIgOiAicmVxdWlyZWQgcHJvcGVydHkgJ3Vuc3BlY2lmaWVkLXByb3AnIG5vdCBmb3VuZCIKICAgIH0KICB9LCB7CiAgICAidmFsaWQiIDogZmFsc2UsCiAgICAiZXZhbHVhdGlvblBhdGgiIDogIi9wcm9wZXJ0aWVzL2Zvby9hbGxPZi8xIiwKICAgICJzY2hlbWFMb2NhdGlvbiIgOiAiaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvc2NoZW1hcy9leGFtcGxlIy9wcm9wZXJ0aWVzL2Zvby9hbGxPZi8xIiwKICAgICJpbnN0YW5jZUxvY2F0aW9uIiA6ICIvZm9vIiwKICAgICJkcm9wcGVkQW5ub3RhdGlvbnMiIDogewogICAgICAicHJvcGVydGllcyIgOiBbICJmb28tcHJvcCIgXSwKICAgICAgInRpdGxlIiA6ICJmb28tdGl0bGUiLAogICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogWyAiZm9vLXByb3AiLCAib3RoZXItcHJvcCIgXQogICAgfSwKICAgICJkZXRhaWxzIiA6IFsgewogICAgICAidmFsaWQiIDogZmFsc2UsCiAgICAgICJldmFsdWF0aW9uUGF0aCIgOiAiL3Byb3BlcnRpZXMvZm9vL2FsbE9mLzEvcHJvcGVydGllcy9mb28tcHJvcCIsCiAgICAgICJzY2hlbWFMb2NhdGlvbiIgOiAiaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvc2NoZW1hcy9leGFtcGxlIy9wcm9wZXJ0aWVzL2Zvby9hbGxPZi8xL3Byb3BlcnRpZXMvZm9vLXByb3AiLAogICAgICAiaW5zdGFuY2VMb2NhdGlvbiIgOiAiL2Zvby9mb28tcHJvcCIsCiAgICAgICJlcnJvcnMiIDogewogICAgICAgICJjb25zdCIgOiAibXVzdCBiZSBhIGNvbnN0YW50IHZhbHVlIDEiCiAgICAgIH0sCiAgICAgICJkcm9wcGVkQW5ub3RhdGlvbnMiIDogewogICAgICAgICJ0aXRsZSIgOiAiZm9vLXByb3AtdGl0bGUiCiAgICAgIH0KICAgIH0gXQogIH0sIHsKICAgICJ2YWxpZCIgOiBmYWxzZSwKICAgICJldmFsdWF0aW9uUGF0aCIgOiAiL3Byb3BlcnRpZXMvYmFyLyRyZWYiLAogICAgInNjaGVtYUxvY2F0aW9uIiA6ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9zY2hlbWFzL2V4YW1wbGUjLyRkZWZzL2JhciIsCiAgICAiaW5zdGFuY2VMb2NhdGlvbiIgOiAiL2JhciIsCiAgICAiZHJvcHBlZEFubm90YXRpb25zIiA6IHsKICAgICAgInByb3BlcnRpZXMiIDogWyAiYmFyLXByb3AiIF0sCiAgICAgICJ0aXRsZSIgOiAiYmFyLXRpdGxlIgogICAgfSwKICAgICJkZXRhaWxzIiA6IFsgewogICAgICAidmFsaWQiIDogZmFsc2UsCiAgICAgICJldmFsdWF0aW9uUGF0aCIgOiAiL3Byb3BlcnRpZXMvYmFyLyRyZWYvcHJvcGVydGllcy9iYXItcHJvcCIsCiAgICAgICJzY2hlbWFMb2NhdGlvbiIgOiAiaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvc2NoZW1hcy9leGFtcGxlIy8kZGVmcy9iYXIvcHJvcGVydGllcy9iYXItcHJvcCIsCiAgICAgICJpbnN0YW5jZUxvY2F0aW9uIiA6ICIvYmFyL2Jhci1wcm9wIiwKICAgICAgImVycm9ycyIgOiB7CiAgICAgICAgIm1pbmltdW0iIDogIm11c3QgaGF2ZSBhIG1pbmltdW0gdmFsdWUgb2YgMTAiCiAgICAgIH0sCiAgICAgICJkcm9wcGVkQW5ub3RhdGlvbnMiIDogewogICAgICAgICJ0aXRsZSIgOiAiYmFyLXByb3AtdGl0bGUiCiAgICAgIH0KICAgIH0gXQogIH0gXQp9CmBgYAoKIyMgQ29uZmlndXJhdGlvbgoKIyMjIEV4ZWN1dGlvbiBDb25maWd1cmF0aW9uCgp8IE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlZmF1bHQgVmFsdWUKfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnwgYGFubm90YXRpb25Db2xsZWN0aW9uRW5hYmxlZGAgIHwgQ29udHJvbHMgd2hldGhlciBhbm5vdGF0aW9ucyBhcmUgY29sbGVjdGVkIGR1cmluZyBwcm9jZXNzaW5nLiBOb3RlIHRoYXQgY29sbGVjdGluZyBhbm5vdGF0aW9ucyB3aWxsIGFkdmVyc2VseSBhZmZlY3QgcGVyZm9ybWFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGZhbHNlYAp8IGBhbm5vdGF0aW9uQ29sbGVjdGlvbkZpbHRlcmAgICB8IFRoZSBwcmVkaWNhdGUgdXNlZCB0byBjb250cm9sIHdoaWNoIGtleXdvcmQgdG8gY29sbGVjdCBhbmQgcmVwb3J0IGFubm90YXRpb25zIGZvci4gVGhpcyByZXF1aXJlcyBgYW5ub3RhdGlvbkNvbGxlY3Rpb25FbmFibGVkYCB0byBiZSBgdHJ1ZWAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBrZXl3b3JkIC0+IGZhbHNlYAp8IGBsb2NhbGVgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBsb2NhbGUgdG8gdXNlIGZvciBnZW5lcmF0aW5nIG1lc3NhZ2VzIGluIHRoZSBgVmFsaWRhdGlvbk1lc3NhZ2VgLiBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBpcyBjb3BpZWQgZnJvbSBgU2NoZW1hVmFsaWRhdG9yc0NvbmZpZ2AgZm9yIGVhY2ggZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBMb2NhbGUuZ2V0RGVmYXVsdCgpYAp8IGBmYWlsRmFzdGAgICAgICAgICAgICAgICAgICAgICB8IFdoZXRoZXIgdG8gcmV0dXJuIGZhaWx1cmUgaW1tZWRpYXRlbHkgd2hlbiBhbiBhc3NlcnRpb24gaXMgZ2VuZXJhdGVkLiBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBpcyBjb3BpZWQgZnJvbSBgU2NoZW1hVmFsaWRhdG9yc0NvbmZpZ2AgZm9yIGVhY2ggZXhlY3V0aW9uIGJ1dCBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byBgdHJ1ZWAgZm9yIHRoZSBCb29sZWFuIGFuZCBGbGFnIG91dHB1dCBmb3JtYXRzLiB8IGBmYWxzZWAKfCBgZm9ybWF0QXNzZXJ0aW9uc0VuYWJsZWRgICAgICAgfCBUaGUgZGVmYXVsdCBpcyB0byBnZW5lcmF0ZSBmb3JtYXQgYXNzZXJ0aW9ucyBmcm9tIERyYWZ0IDQgdG8gRHJhZnQgNyBhbmQgdG8gb25seSBnZW5lcmF0ZSBhbm5vdGF0aW9ucyBmcm9tIERyYWZ0IDIwMTktMDkuIFNldHRpbmcgdG8gYHRydWVgIG9yIGBmYWxzZWAgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgbnVsbGAKfCBgZGVidWdFbmFibGVkYCAgICAgICAgICAgICAgICAgfCBDb250cm9scyB3aGV0aGVyIGRlYnVnIGxvZ2dpbmcgaXMgZW5hYmxlZCBmb3IgbG9nZ2luZyB0aGUgbm9kZSBpbmZvcm1hdGlvbiB3aGVuIHByb2Nlc3NpbmcuIE5vdGUgdGhhdCB0aGlzIHdpbGwgZ2VuZXJhdGUgYSBsb3Qgb2YgbG9ncyB0aGF0IHdpbGwgYWZmZWN0IHBlcmZvcm1hbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgZmFsc2VgCgojIyMgU2NoZW1hIFZhbGlkYXRvcnMgQ29uZmlndXJhdGlvbgoKfCBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVmYXVsdCBWYWx1ZQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnwgYGFwcGx5RGVmYXVsdHNTdHJhdGVneWAgICAgICAgICAgICAgICB8IFRoZSBzdHJhdGVneSBmb3IgYXBwbHlpbmcgZGVmYXVsdHMgd2hlbiB3YWxraW5nIHdoZW4gbWlzc2luZyBvciBudWxsIG5vZGVzIGFyZSBlbmNvdW50ZXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBBcHBseURlZmF1bHRzU3RyYXRlZ3kuRU1QVFlfQVBQTFlfREVGQVVMVFNfU1RSQVRFR1lgCnwgYGNhY2hlUmVmc2AgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdoZXRoZXIgdGhlIHNjaGVtYXMgbG9hZGVkIGZyb20gcmVmcyB3aWxsIGJlIGNhY2hlZCBhbmQgcmV1c2VkIGZvciBzdWJzZXF1ZW50IHJ1bnMuIFNldHRpbmcgdGhpcyB0byBgZmFsc2VgIHdpbGwgYWZmZWN0IHBlcmZvcm1hbmNlIGJ1dCBtYXkgYmUgbmVjY2Vzc2FyeSB0byBwcmV2ZW50IGhpZ2ggbWVtb3J5IHVzYWdlIGZvciB0aGUgY2FjaGUgaWYgbXVsdGlwbGUgbmVzdGVkIGFwcGxpY2F0b3JzIGxpa2UgYGFueU9mYCwgYG9uZU9mYCBhbmQgYGFsbE9mYCBhcmUgdXNlZC4gIHwgYHRydWVgCnwgYGRpc2NyaW1pbmF0b3JLZXl3b3JkRW5hYmxlZGAgICAgICAgICB8IFdoZXRoZXIgdGhlIGBkaXNjcmltaW5hdG9yYCBrZXl3b3JkIGlzIGhhbmRsZWQgYWNjb3JkaW5nIHRvIE9wZW5BUEkgMy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBmYWxzZWAKfCBgZXJyb3JNZXNzYWdlS2V5d29yZGAgICAgICAgICAgICAgICAgIHwgVGhlIGtleXdvcmQgdG8gdXNlIGZvciBjdXN0b20gZXJyb3IgbWVzc2FnZXMgaW4gdGhlIHNjaGVtYS4gSWYgbm90IHNldCB0aGlzIGZlYXR1cmVzIGlzIGRpc2FibGVkLiBUaGlzIGlzIHR5cGljYWxseSBzZXQgdG8gYGVycm9yTWVzc2FnZWAgb3IgYG1lc3NhZ2VgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYG51bGxgCnwgYGV4ZWN1dGlvbkNvbnRleHRDdXN0b21pemVyYCAgICAgICAgICB8IFRoaXMgY2FuIGJlIHVzZWQgdG8gY3VzdG9taXplIHRoZSBgRXhlY3V0aW9uQ29udGV4dGAgZ2VuZXJhdGVkIGJ5IHRoZSBgSnNvblNjaGVtYWAgZm9yIGVhY2ggdmFsaWRhdGlvbiBydW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBudWxsYAp8IGBmYWlsRmFzdGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXaGV0aGVyIHRvIHJldHVybiBmYWlsdXJlIGltbWVkaWF0ZWx5IHdoZW4gYW4gYXNzZXJ0aW9uIGlzIGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgZmFsc2VgCnwgYGZvcm1hdEFzc2VydGlvbnNFbmFibGVkYCAgICAgICAgICAgICB8IFRoZSBkZWZhdWx0IGlzIHRvIGdlbmVyYXRlIGZvcm1hdCBhc3NlcnRpb25zIGZyb20gRHJhZnQgNCB0byBEcmFmdCA3IGFuZCB0byBvbmx5IGdlbmVyYXRlIGFubm90YXRpb25zIGZyb20gRHJhZnQgMjAxOS0wOS4gU2V0dGluZyB0byBgdHJ1ZWAgb3IgYGZhbHNlYCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBudWxsYAp8IGBqYXZhU2VtYW50aWNzYCAgICAgICAgICAgICAgICAgICAgICAgfCBXaGV0aGVyIGphdmEgc2VtYW50aWNzIGlzIHVzZWQgZm9yIHRoZSBgdHlwZWAga2V5d29yZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgZmFsc2VgCnwgYGxvY2FsZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBsb2NhbGUgdG8gdXNlIGZvciBnZW5lcmF0aW5nIG1lc3NhZ2VzIGluIHRoZSBgVmFsaWRhdGlvbk1lc3NhZ2VgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBMb2NhbGUuZ2V0RGVmYXVsdCgpYAp8IGBsb3NzbGVzc05hcnJvd2luZ2AgICAgICAgICAgICAgICAgICAgfCBXaGV0aGVyIGxvc3NsZXNzIG5hcnJvd2luZyBpcyB1c2VkIGZvciB0aGUgYHR5cGVgIGtleXdvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgZmFsc2VgCnwgYG1lc3NhZ2VTb3VyY2VgICAgICAgICAgICAgICAgICAgICAgICB8IFRoaXMgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgbG9jYWxlIHNwZWNpZmljIG1lc3NhZ2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBEZWZhdWx0TWVzc2FnZVNvdXJjZS5nZXRJbnN0YW5jZSgpYAp8IGBudWxsYWJsZUtleXdvcmRFbmFibGVkYCAgICAgICAgICAgICAgfCBXaGV0aGVyIHRoZSBgbnVsbGFibGVgIGtleXdvcmQgaXMgaGFuZGxlZCBhY2NvcmRpbmcgdG8gT3BlbkFQSSAzLjAuIFRoaXMgYWZmZWN0cyB0aGUgYGVudW1gIGFuZCBgdHlwZWAga2V5d29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgZmFsc2VgCnwgYHBhdGhUeXBlYCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBwYXRoIHR5cGUgdG8gdXNlIGZvciByZXBvcnRpbmcgdGhlIGluc3RhbmNlIGxvY2F0aW9uIGFuZCBldmFsdWF0aW9uIHBhdGguIFNldCB0byBgUGF0aFR5cGUuSlNPTl9QQVRIYCB0byB1c2UgSlNPTiBQYXRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBQYXRoVHlwZS5KU09OX1BPSU5URVJgCnwgYHByZWxvYWRKc29uU2NoZW1hYCAgICAgICAgICAgICAgICAgICB8IFdoZXRoZXIgdGhlIHNjaGVtYSB3aWxsIGJlIHByZWxvYWRlZCBiZWZvcmUgcHJvY2Vzc2luZyBhbnkgaW5wdXQuIFRoaXMgd2lsbCB1c2UgbWVtb3J5IGJ1dCB0aGUgZXhlY3V0aW9uIG9mIHRoZSB2YWxpZGF0aW9uIHdpbGwgYmUgZmFzdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGB0cnVlYAp8IGBwcmVsb2FkSnNvblNjaGVtYVJlZk1heE5lc3RpbmdEZXB0aGAgfCBUaGUgbWF4IGRlcHRoIG9mIHRoZSBldmFsdWF0aW9uIHBhdGggdG8gcHJlbG9hZCB3aGVuIHByZWxvYWRpbmcgcmVmcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgNDBgCnwgYHJlYWRPbmx5YCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdoZXRoZXIgc2NoZW1hIGlzIHJlYWQgb25seS4gVGhpcyBhZmZlY3RzIHRoZSBgcmVhZE9ubHlgIGtleXdvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBudWxsYAp8IGByZWd1bGFyRXhwcmVzc2lvbkZhY3RvcnlgICAgICAgICAgICAgfCBUaGUgZmFjdG9yeSB0byB1c2UgdG8gY3JlYXRlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGluc3RhbmNlIGBKb25pUmVndWxhckV4cHJlc3Npb25GYWN0b3J5YCBvciBgR3JhYWxKU1JlZ3VsYXJFeHByZXNzaW9uRmFjdG9yeWAuIFRoaXMgcmVxdWlyZXMgdGhlIGRlcGVuZGVuY3kgdG8gYmUgbWFudWFsbHkgYWRkZWQgdG8gdGhlIHByb2plY3Qgb3IgYSBgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbmAgd2lsbCBiZSB0aHJvd24uIHwgYEpES1JlZ3VsYXJFeHByZXNzaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpYAp8IGBzY2hlbWFJZFZhbGlkYXRvcmAgICAgICAgICAgICAgICAgICAgfCBUaGlzIGlzIHVzZWQgdG8gY3VzdG9taXplIGhvdyB0aGUgYCRpZGAgdmFsdWVzIGFyZSB2YWxpZGF0ZWQuIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbGxvd3Mgbm9uLWVtcHR5IGZyYWdtZW50cyB3aGVyZSBubyBiYXNlIElSSSBpcyBzcGVjaWZpZWQgYW5kIGFsc28gYWxsb3dzIG5vbi1hYnNvbHV0ZSBJUkkgYCRpZGAgdmFsdWVzIGluIHRoZSByb290IHNjaGVtYS4gICAgfCBgSnNvblNjaGVtYUlkVmFsaWRhdG9yLkRFRkFVTFRgCnwgYHN0cmljdGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoaXMgaXMgc2V0IHdoZXRoZXIga2V5d29yZHMgYXJlIHN0cmljdCBpbiB0aGVpciB2YWxpZGF0aW9uLiBXaGF0IHRoaXMgZG9lcyBkZXBlbmRzIG9uIHRoZSBpbmRpdmlkdWFsIHZhbGlkYXRvcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IAp8IGB0eXBlTG9vc2VgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXaGV0aGVyIHR5cGVzIGFyZSBpbnRlcnByZXRlZCBpbiBhIGxvb3NlIG1hbm5lci4gSWYgc2V0IHRvIHRydWUsIGEgc2luZ2xlIHZhbHVlIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIHNpemUgMSBhcnJheS4gU3RyaW5ncyBtYXkgYWxzbyBiZSBpbnRlcnByZXRlZCBhcyBudW1iZXIsIGludGVnZXIgb3IgYm9vbGVhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgZmFsc2VgCnwgYHdyaXRlT25seWAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdoZXRoZXIgc2NoZW1hIGlzIHdyaXRlIG9ubHkuIFRoaXMgYWZmZWN0cyB0aGUgYHdyaXRlT25seWAga2V5d29yZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBudWxsYAoKIyMgUGVyZm9ybWFuY2UgQ29uc2lkZXJhdGlvbnMKCldoZW4gdGhlIGxpYnJhcnkgY3JlYXRlcyBhIHNjaGVtYSBmcm9tIHRoZSBzY2hlbWEgZmFjdG9yeSwgaXQgY3JlYXRlcyBhIGRpc3RpbmN0IHZhbGlkYXRvciBpbnN0YW5jZSBmb3IgZWFjaCBsb2NhdGlvbiBvbiB0aGUgZXZhbHVhdGlvbiBwYXRoLiBUaGlzIG1lYW5zIGlmIHRoZXJlIGFyZSBkaWZmZXJlbnQgYCRyZWZgIHRoYXQgcmVmZXJlbmNlIHRoZSBzYW1lIHNjaGVtYSBsb2NhdGlvbiwgZGlmZmVyZW50IHZhbGlkYXRvciBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgZm9yIGVhY2ggZXZhbHVhdGlvbiBwYXRoLgoKV2hlbiB0aGUgc2NoZW1hIGlzIGNyZWF0ZWQsIHRoZSBsaWJyYXJ5IHdpbGwgYnkgZGVmYXVsdCBhdXRvbWF0aWNhbGx5IHByZWxvYWQgYWxsIHRoZSB2YWxpZGF0b3JzIG5lZWRlZCBhbmQgcmVzb2x2ZSByZWZlcmVuY2VzLiBUaGlzIGNhbiBiZSBkaXNhYmxlZCB3aXRoIHRoZSBgcHJlbG9hZEpzb25TY2hlbWFgIG9wdGlvbiBpbiB0aGUgYFNjaGVtYVZhbGlkYXRvcnNDb25maWdgLiBBdCB0aGlzIHBvaW50LCBubyBleGNlcHRpb25zIHdpbGwgYmUgdGhyb3duIGlmIGEgcmVmZXJlbmNlIGNhbm5vdCBiZSByZXNvbHZlZC4gSWYgdGhlcmUgYXJlIHJlZmVyZW5jZXMgdGhhdCBhcmUgY3ljbGljLCBvbmx5IHRoZSBmaXJzdCBjeWNsZSB3aWxsIGJlIHByZWxvYWRlZC4gSWYgeW91IHdpc2ggdG8gZW5zdXJlIHRoYXQgcmVtb3RlIHJlZmVyZW5jZXMgY2FuIGFsbCBiZSByZXNvbHZlZCwgdGhlIGBpbml0aWFsaXplVmFsaWRhdG9yc2AgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBvbiB0aGUgYEpzb25TY2hlbWFgIHdoaWNoIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZXJlIGFyZSByZWZlcmVuY2VzIHRoYXQgY2Fubm90IGJlIHJlc29sdmVkLgoKSW5zdGFuY2VzIGZvciBgSnNvblNjaGVtYUZhY3RvcnlgIGFuZCB0aGUgYEpzb25TY2hlbWFgIGNyZWF0ZWQgZnJvbSBpdCBhcmUgZGVzaWduZWQgdG8gYmUgdGhyZWFkLXNhZmUgcHJvdmlkZWQgaXRzIGNvbmZpZ3VyYXRpb24gaXMgbm90IG1vZGlmaWVkIGFuZCBzaG91bGQgYmUgY2FjaGVkIGFuZCByZXVzZWQuIE5vdCByZXVzaW5nIHRoZSBgSnNvblNjaGVtYWAgbWVhbnMgdGhhdCB0aGUgc2NoZW1hIGRhdGEgbmVlZHMgdG8gYmUgcmVwZWF0ZWQgcGFyc2VkIHdpdGggdmFsaWRhdG9yIGluc3RhbmNlcyBjcmVhdGVkIGFuZCByZWZlcmVuY2VzIHJlc29sdmVkLiBXaGVuIHJlZmVyZW5jZXMgYXJlIHJlc29sdmVkLCB0aGUgdmFsaWRhdG9ycyBjcmVhdGVkIHdpbGwgYmUgY2FjaGVkLiBGb3Igc2NoZW1hcyB0aGF0IGhhdmUgZGVlcGx5IG5lc3RlZCByZWZlcmVuY2VzLCB0aGUgbWVtb3J5IG5lZWRlZCBmb3IgdGhlIHZhbGlkYXRvcnMgbWF5IGJlIHZlcnkgaGlnaCwgaW4gd2hpY2ggY2FzZSB0aGUgY2FjaGluZyBtYXkgbmVlZCB0byBiZSBkaXNhYmxlZCB1c2luZyB0aGUgYGNhY2hlUmVmc2Agb3B0aW9uIGluIHRoZSBgU2NoZW1hVmFsaWRhdG9yc0NvbmZpZ2AuIERpc2FibGluZyB0aGlzIHdpbGwgbWVhbiB0aGUgdmFsaWRhdG9ycyBmcm9tIHRoZSByZWZlcmVuY2VzIG5lZWQgdG8gYmUgcmUtY3JlYXRlZCBmb3IgZWFjaCB2YWxpZGF0aW9uIHJ1biB3aGljaCB3aWxsIGltcGFjdCBwZXJmb3JtYW5jZS4KCkNvbGxlY3RpbmcgYW5ub3RhdGlvbnMgd2lsbCBhZHZlcnNlbHkgYWZmZWN0IHZhbGlkYXRpb24gcGVyZm9ybWFuY2UuCgpUaGUgZWFybGllciBkcmFmdCBzcGVjaWZpY2F0aW9ucyBjb250YWluIGxlc3Mga2V5d29yZHMgdGhhdCBjYW4gcG90ZW50aWFsbHkgaW1wYWN0IHBlcmZvcm1hbmNlLiBGb3IgaW5zdGFuY2UgdGhlIHVzZSBvZiB0aGUgYHVuZXZhbHVhdGVkUHJvcGVydGllc2Agb3IgYHVuZXZhbHVhdGVkSXRlbXNgIGtleXdvcmQgd2lsbCB0cmlnZ2VyIGFubm90YXRpb24gY29sbGVjdGlvbiBpbiB0aGUgcmVsYXRlZCB2YWxpZGF0b3JzLCBzdWNoIGFzIHRoZSBgcHJvcGVydGllc2Agb3IgYGl0ZW1zYCB2YWxpZGF0b3JzLgoKVGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdXNpbmcgYSBzY2hlbWEgd2l0aCBhIGxhdGVyIGRyYWZ0IHNwZWNpZmljYXRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGNhdXNlIGEgcGVyZm9ybWFuY2UgaW1wYWN0LiBGb3IgaW5zdGFuY2UsIHRoZSBgcHJvcGVydGllc2AgdmFsaWRhdG9yIHdpbGwgcGVyZm9ybSBjaGVja3MgdG8gZGV0ZXJtaW5lIGlmIGFubm90YXRpb25zIG5lZWQgdG8gYmUgY29sbGVjdGVkLCBhbmQgY2hlY2tzIGlmIHRoZSBtZXRhLXNjaGVtYSBjb250YWlucyB0aGUgYHVuZXZhbHVhdGVkUHJvcGVydGllc2Aga2V5d29yZCBhbmQgd2hldGhlciB0aGUgYHVuZXZhbHVhdGVkUHJvcGVydGllc2Aga2V5d29yZCBleGlzdHMgYWRqYWNlbnQgdGhlIGV2YWx1YXRpb24gcGF0aC4KCiMjIFNlY3VyaXR5IENvbnNpZGVyYXRpb25zCgpUaGUgbGlicmFyeSBhc3N1bWVzIHRoYXQgdGhlIHNjaGVtYXMgYmVpbmcgbG9hZGVkIGFyZSB0cnVzdGVkLiBUaGlzIHNlY3VyaXR5IG1vZGVsIGFzc3VtZXMgdGhlIHVzZSBjYXNlIHdoZXJlIHRoZSBzY2hlbWFzIGFyZSBidW5kbGVkIHdpdGggdGhlIGFwcGxpY2F0aW9uIG9uIHRoZSBjbGFzc3BhdGguCgp8IElzc3VlICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNaXRpZ2F0aW9uCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfCBTY2hlbWEgTG9hZGluZyAgICAgICAgfCBUaGUgbGlicmFyeSBieSBkZWZhdWx0IHdpbGwgbG9hZCBzY2hlbWFzIGZyb20gdGhlIGNsYXNzcGF0aCBhbmQgb3ZlciB0aGUgaW50ZXJuZXQgaWYgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQSBgRGlzYWxsb3dTY2hlbWFMb2FkZXJgIGNhbiBiZSBjb25maWd1cmVkIHRvIG5vdCBhbGxvdyBzY2hlbWEgcmV0cmlldmFsLiBBbHRlcm5hdGl2ZWx5IGFuIGBBbGxvd1NjaGVtYUxvYWRlcmAgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcmVzdHJpY3QgdGhlIHJldHJpZXZhbCBJUklzIHRoYXQgYXJlIGFsbG93ZWQuCnwgU2NoZW1hIENhY2hpbmcgICAgICAgIHwgVGhlIGxpYnJhcnkgYnkgZGVmYXVsdCBwcmVsb2FkcyBhbmQgY2FjaGVzIHJlZmVyZW5jZXMgd2hlbiBsb2FkaW5nIHNjaGVtYXMuIFdoaWxlIHRoZXJlIGlzIGEgbWF4IG5lc3RpbmcgZGVwdGggd2hlbiBwcmVsb2FkaW5nIHNjaGVtYXMgaXQgaXMgc3RpbGwgcG9zc2libGUgdG8gY29uc3RydWN0IGEgc2NoZW1hIHRoYXQgaGFzIGEgZmFuIG91dCB0aGF0IGNvbnN1bWVzIGEgbG90IG9mIG1lbW9yeSBmcm9tIHRoZSBzZXJ2ZXIuICB8IFNldCBgY2FjaGVSZWZzYCBvcHRpb24gaW4gYFNjaGVtYVZhbGlkYXRvcnNDb25maWdgIHRvIGZhbHNlLgp8IFJlZ3VsYXIgRXhwcmVzc2lvbnMgICB8IFRoZSBsaWJyYXJ5IGRvZXMgbm90IHZhbGlkYXRlIGlmIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIGlzIHN1c2NlcHRhYmxlIHRvIGRlbmlhbCBvZiBzZXJ2aWNlIChbUmVEb1NdKGh0dHBzOi8vb3dhc3Aub3JnL3d3dy1jb21tdW5pdHkvYXR0YWNrcy9SZWd1bGFyX2V4cHJlc3Npb25fRGVuaWFsX29mX1NlcnZpY2VfLV9SZURvUykpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBbiBgQWxsb3dSZWd1bGFyRXhwcmVzc2lvbkZhY3RvcnlgIGNhbiBiZSBjb25maWd1cmVkIHRvIHBlcmZvcm0gdmFsaWRhdGlvbiBvbiB0aGUgcmVndWxhciBleHByZXNzaW9ucyB0aGF0IGFyZSBhbGxvd2VkLgp8IFZhbGlkYXRpb24gRXJyb3JzICAgICB8IFRoZSBsaWJyYXJ5IGJ5IGRlZmF1bHQgYXR0ZW1wdHMgdG8gcmV0dXJuIGFsbCB2YWxpZGF0aW9uIGVycm9ycy4gVGhlIHVzZSBvZiBhcHBsaWNhdG9ycyBzdWNoIGFzIGBhbGxPZmAgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBzY2hlbWFzIG1heSByZXN1bHQgaW4gYSBsYXJnZSBudW1iZXIgb2YgdmFsaWRhdGlvbiBlcnJvcnMgdGFraW5nIHVwIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTZXQgYGZhaWxGYXN0YCBvcHRpb24gaW4gYFNjaGVtYVZhbGlkYXRvcnNDb25maWdgIHRvIGltbWVkaWF0ZWx5IHJldHVybiB3aGVuIHRoZSBmaXJzdCBlcnJvciBpcyBlbmNvdW50ZXJlZC4gVGhlIGBPdXRwdXRGb3JtYXQuQk9PTEVBTmAgb3IgYE91dHB1dEZvcm1hdC5GTEFHYCBhbHNvIGNhbiBiZSB1c2VkLgoKIyMgW1F1aWNrIFN0YXJ0XShkb2MvcXVpY2tzdGFydC5tZCkKCiMjIFtDdXN0b21pemluZyBTY2hlbWEgUmV0cmlldmFsXShkb2Mvc2NoZW1hLXJldHJpZXZhbC5tZCkKCiMjIFtDdXN0b21pemluZyBNZXRhLVNjaGVtYXMsIFZvY2FidWxhcmllcywgS2V5d29yZHMgYW5kIEZvcm1hdHNdKGRvYy9jdXN0b20tbWV0YS1zY2hlbWEubWQpCgojIyBbT3BlbkFQSSBTcGVjaWZpY2F0aW9uXShkb2Mvb3BlbmFwaS5tZCkKCiMjIFtWYWxpZGF0b3JzXShkb2MvdmFsaWRhdG9ycy5tZCkKCiMjIFtDb25maWd1cmF0aW9uXShkb2MvY29uZmlnLm1kKQoKIyMgW1NwZWNpZmljYXRpb24gVmVyc2lvbl0oZG9jL3NwZWN2ZXJzaW9uLm1kKQoKIyMgW1lBTUwgVmFsaWRhdGlvbl0oZG9jL3lhbWwubWQpCgojIyBbQ29sbGVjdG9yIENvbnRleHRdKGRvYy9jb2xsZWN0b3ItY29udGV4dC5tZCkKCiMjIFtKU09OIFNjaGVtYSBXYWxrZXJzIGFuZCBXYWxrTGlzdGVuZXJzXShkb2Mvd2Fsa2Vycy5tZCkKCiMjIFtSZWd1bGFyIEV4cHJlc3Npb25zXShkb2MvZWNtYS0yNjIubWQpCgojIyBbQ3VzdG9tIEVycm9yIE1lc3NhZ2VzXShkb2MvY3VzdC1tc2cubWQpCgojIyBbTXVsdGlwbGUgTGFuZ3VhZ2VdKGRvYy9tdWx0aXBsZS1sYW5ndWFnZS5tZCkKCiMjIFtNZXRhU2NoZW1hIFZhbGlkYXRpb25dKGRvYy9tZXRhc2NoZW1hLXZhbGlkYXRpb24ubWQpCgojIyBbVmFsaWRhdGluZyBSRkMgMzMzOSBkdXJhdGlvbnNdKGRvYy9kdXJhdGlvbi5tZCkKCiMjIFByb2plY3RzCgpUaGUgW2xpZ2h0LXJlc3QtNGpdKGh0dHBzOi8vZ2l0aHViLmNvbS9uZXR3b3JrbnQvbGlnaHQtcmVzdC00aiksIFtsaWdodC1ncmFwaHFsLTRqXShodHRwczovL2dpdGh1Yi5jb20vbmV0d29ya250L2xpZ2h0LWdyYXBocWwtNGopIGFuZCBbbGlnaHQtaHlicmlkLTRqXShodHRwczovL2dpdGh1Yi5jb20vbmV0d29ya250L2xpZ2h0LWh5YnJpZC00aikgdXNlIHRoaXMgbGlicmFyeSB0byB2YWxpZGF0ZSB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgYmFzZWQgb24gdGhlIHNwZWNpZmljYXRpb25zLiBJZiB5b3UgYXJlIHVzaW5nIG90aGVyIGZyYW1ld29ya3MgbGlrZSBTcHJpbmcgQm9vdCwgeW91IGNhbiB1c2UgdGhlIFtPcGVuQXBpVmFsaWRhdG9yXShodHRwczovL2dpdGh1Yi5jb20vbXNlcnZpY2V0ZWNoL29wZW5hcGktc2NoZW1hLXZhbGlkYXRpb24pLCBhIGdlbmVyaWMgT3BlbkFQSSAzLjAgdmFsaWRhdG9yIGJhc2VkIG9uIHRoZSBPcGVuQVBJIDMuMCBzcGVjaWZpY2F0aW9uLiAKCklmIHlvdSBoYXZlIGEgcHJvamVjdCB1c2luZyB0aGlzIGxpYnJhcnksIHBsZWFzZSBzdWJtaXQgYSBQUiB0byBhZGQgeW91ciBwcm9qZWN0IGJlbG93LgoKIyMgQ29udHJpYnV0b3JzCgpUaGFua3MgdG8gdGhlIGZvbGxvd2luZyBwZW9wbGUgd2hvIGhhdmUgY29udHJpYnV0ZWQgdG8gdGhpcyBwcm9qZWN0LiBJZiB5b3UgYXJlIHVzaW5nIHRoaXMgbGlicmFyeSwgcGxlYXNlIGNvbnNpZGVyIHRvIGJlIGEgc3BvbnNvciBmb3Igb25lIG9mIHRoZSBjb250cmlidXRvcnMuIAoKW0BzdGV2ZWh1XShodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvc3RldmVodSkKCltAcHJhc2hhbnRoLWNoYWl0YW55YV0oaHR0cHM6Ly9naXRodWIuY29tL3ByYXNoYW50aC1jaGFpdGFueWEpCgpbQGZkdXR0b25dKGh0dHBzOi8vZ2l0aHViLmNvbS9mZHV0dG9uKQoKW0B2YWxmaXJzdF0oaHR0cHM6Ly9naXRodWIuY29tL3ZhbGZpcnN0KQoKW0BCYWxsb29uV2VuXShodHRwczovL2dpdGh1Yi5jb20vQmFsbG9vbldlbikKCltAamlhY2hlbjExMjBdKGh0dHBzOi8vZ2l0aHViLmNvbS9qaWFjaGVuMTEyMCkKCltAZGRvYnJpbl0oaHR0cHM6Ly9naXRodWIuY29tL2Rkb2JyaW4pCgpbQGVza2FiZXR4ZV0oaHR0cHM6Ly9naXRodWIuY29tL2Vza2FiZXR4ZSkKCltAZWhybWFubl0oaHR0cHM6Ly9naXRodWIuY29tL2Vocm1hbm4pCgpbQHByYXNoYW50aGpvc10oaHR0cHM6Ly9naXRodWIuY29tL3ByYXNoYW50aGpvcykKCltAU3ViaGFqaXRkYXMyOThdKGh0dHBzOi8vZ2l0aHViLmNvbS9TdWJoYWppdGRhczI5OCkKCltARldpZXNuZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9GV2llc25lcikKCltAcmh3b29kXShodHRwczovL2dpdGh1Yi5jb20vcmh3b29kKQoKW0BqYXdhZmZdKGh0dHBzOi8vZ2l0aHViLmNvbS9qYXdhZmYpCgpbQG5pdGluMTg5MV0oaHR0cHM6Ly9naXRodWIuY29tL25pdGluMTg5MSkKCgpGb3IgYWxsIGNvbnRyaWJ1dG9ycywgcGxlYXNlIHZpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZXR3b3JrbnQvanNvbi1zY2hlbWEtdmFsaWRhdG9yL2dyYXBocy9jb250cmlidXRvcnMKCklmIHlvdSBhcmUgYSBjb250cmlidXRvciwgcGxlYXNlIGpvaW4gdGhlIFtHaXRIdWIgU3BvbnNvcnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycykgYW5kIHN3aXRjaCB0aGUgbGluayB0byB5b3VyIHNwb25zb3JzIGRhc2hib2FyZCB2aWEgYSBQUi4KCiMjIFNwb25zb3JzCgoKIyMjIEluZGl2aWR1YWwgU3BvbnNvcnMKCgojIyMgQ29ycG9yYXRpb24gU3BvbnNvcnMKCgoK
- readmeEtag: '"6c426ea201d32714416e42f09517df023f1b2b32"'
- readmeLastModified: Sun, 24 Nov 2024 23:32:35 GMT
+ W1N0YWNrIE92ZXJmbG93XShodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy90YWdnZWQvbGlnaHQtNGopIHwKW0dvb2dsZSBHcm91cF0oaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9mb3J1bS8jIWZvcnVtL2xpZ2h0LTRqKSB8CltHaXR0ZXIgQ2hhdF0oaHR0cHM6Ly9naXR0ZXIuaW0vbmV0d29ya250L2pzb24tc2NoZW1hLXZhbGlkYXRvcikgfApbU3VicmVkZGl0XShodHRwczovL3d3dy5yZWRkaXQuY29tL3IvbGlnaHRhcGkvKSB8CltZb3V0dWJlXShodHRwczovL3d3dy55b3V0dWJlLmNvbS9jaGFubmVsL1VDSENSTVdKVlh3OGlCN3pLeEY1NUJ5dykgfApbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2MubmV0d29ya250LmNvbS9saWJyYXJ5L2pzb24tc2NoZW1hLXZhbGlkYXRvci8pIHwKW0NvbnRyaWJ1dGlvbiBHdWlkZV0oaHR0cHM6Ly9kb2MubmV0d29ya250LmNvbS9jb250cmlidXRlLykgfAoKWyFbQ0ldKGh0dHBzOi8vZ2l0aHViLmNvbS9uZXR3b3JrbnQvanNvbi1zY2hlbWEtdmFsaWRhdG9yL2FjdGlvbnMvd29ya2Zsb3dzL2NpLnltbC9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vbmV0d29ya250L2pzb24tc2NoZW1hLXZhbGlkYXRvci9hY3Rpb25zL3dvcmtmbG93cy9jaS55bWwpClshW01hdmVuIENlbnRyYWxdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbWF2ZW4tY2VudHJhbC92L2NvbS5uZXR3b3JrbnQvanNvbi1zY2hlbWEtdmFsaWRhdG9yLnN2ZyldKGh0dHA6Ly9zZWFyY2gubWF2ZW4ub3JnLyNzZWFyY2glN0NnYSU3QzElN0NnJTNBY29tLm5ldHdvcmtudCUyMGElM0Fqc29uLXNjaGVtYS12YWxpZGF0b3IpClshW2NvZGVjb3YuaW9dKGh0dHBzOi8vY29kZWNvdi5pby9naXRodWIvbmV0d29ya250L2pzb24tc2NoZW1hLXZhbGlkYXRvci9jb3ZlcmFnZS5zdmc/YnJhbmNoPW1hc3RlcildKGh0dHBzOi8vY29kZWNvdi5pby9naXRodWIvbmV0d29ya250L2pzb24tc2NoZW1hLXZhbGlkYXRvcj9icmFuY2g9bWFzdGVyKQpbIVtKYXZhZG9jc10oaHR0cDovL3d3dy5qYXZhZG9jLmlvL2JhZGdlL2NvbS5uZXR3b3JrbnQvanNvbi1zY2hlbWEtdmFsaWRhdG9yLnN2ZyldKGh0dHBzOi8vd3d3LmphdmFkb2MuaW8vZG9jL2NvbS5uZXR3b3JrbnQvanNvbi1zY2hlbWEtdmFsaWRhdG9yKQoKVGhpcyBpcyBhIEphdmEgaW1wbGVtZW50YXRpb24gb2YgdGhlIFtKU09OIFNjaGVtYSBDb3JlIERyYWZ0IHY0LCB2NiwgdjcsIHYyMDE5LTA5IGFuZCB2MjAyMC0xMl0oaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvc3BlY2lmaWNhdGlvbikgc3BlY2lmaWNhdGlvbiBmb3IgSlNPTiBzY2hlbWEgdmFsaWRhdGlvbi4gVGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBbQ3VzdG9taXppbmcgTWV0YS1TY2hlbWFzLCBWb2NhYnVsYXJpZXMsIEtleXdvcmRzIGFuZCBGb3JtYXRzXShkb2MvY3VzdG9tLW1ldGEtc2NoZW1hLm1kKS4KCkluIGFkZGl0aW9uLCBbT3BlbkFQSV0oZG9jL29wZW5hcGkubWQpIDMgcmVxdWVzdC9yZXNwb25zZSB2YWxpZGF0aW9uIGlzIHN1cHBvcnRlZCB3aXRoIHRoZSB1c2Ugb2YgdGhlIGFwcHJvcHJpYXRlIG1ldGEtc2NoZW1hLiBGb3IgdXNlcnMgd2hvIHdhbnQgdG8gY29sbGVjdCBpbmZvcm1hdGlvbiBmcm9tIGEgSlNPTiBub2RlIGJhc2VkIG9uIHRoZSBzY2hlbWEsIHRoZSBbd2Fsa2Vyc10oZG9jL3dhbGtlcnMubWQpIGNhbiBoZWxwLiBUaGUgSlNPTiBwYXJzZXIgdXNlZCBpcyB0aGUgW0phY2tzb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9GYXN0ZXJYTUwvamFja3NvbikgcGFyc2VyLiBBcyBpdCBpcyBhIGtleSBjb21wb25lbnQgaW4gb3VyIFtsaWdodC00al0oaHR0cHM6Ly9naXRodWIuY29tL25ldHdvcmtudC9saWdodC00aikgbWljcm9zZXJ2aWNlcyBmcmFtZXdvcmsgdG8gdmFsaWRhdGUgcmVxdWVzdC9yZXNwb25zZSBhZ2FpbnN0IE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBmb3IgW2xpZ2h0LXJlc3QtNGpdKGh0dHA6Ly93d3cubmV0d29ya250LmNvbS9zdHlsZS9saWdodC1yZXN0LTRqLykgYW5kIFJQQyBzY2hlbWEgZm9yIFtsaWdodC1oeWJyaWQtNGpdKGh0dHA6Ly93d3cubmV0d29ya250LmNvbS9zdHlsZS9saWdodC1oeWJyaWQtNGovKSBhdCBydW50aW1lLCBwZXJmb3JtYW5jZSBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgYXNwZWN0IGluIHRoZSBkZXNpZ24uCgojIyBKU09OIFNjaGVtYSBTcGVjaWZpY2F0aW9uIGNvbXBhdGliaWxpdHkKClshW1N1cHBvcnRlZCBEaWFsZWN0c10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD91cmw9aHR0cHMlM0ElMkYlMkZib3d0aWUucmVwb3J0JTJGYmFkZ2VzJTJGamF2YS1jb20ubmV0d29ya250LWpzb24tc2NoZW1hLXZhbGlkYXRvciUyRnN1cHBvcnRlZF92ZXJzaW9ucy5qc29uKV0oaHR0cHM6Ly9ib3d0aWUucmVwb3J0LyMvaW1wbGVtZW50YXRpb25zL2phdmEtbmV0d29ya250LWpzb24tc2NoZW1hLXZhbGlkYXRvcikKWyFbRHJhZnQgMjAyMC0xMl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD91cmw9aHR0cHMlM0ElMkYlMkZib3d0aWUucmVwb3J0JTJGYmFkZ2VzJTJGamF2YS1jb20ubmV0d29ya250LWpzb24tc2NoZW1hLXZhbGlkYXRvciUyRmNvbXBsaWFuY2UlMkZkcmFmdDIwMjAtMTIuanNvbildKGh0dHBzOi8vYm93dGllLnJlcG9ydC8jL2RpYWxlY3RzL2RyYWZ0MjAyMC0xMikKWyFbRHJhZnQgMjAxOS0wOV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD91cmw9aHR0cHMlM0ElMkYlMkZib3d0aWUucmVwb3J0JTJGYmFkZ2VzJTJGamF2YS1jb20ubmV0d29ya250LWpzb24tc2NoZW1hLXZhbGlkYXRvciUyRmNvbXBsaWFuY2UlMkZkcmFmdDIwMTktMDkuanNvbildKGh0dHBzOi8vYm93dGllLnJlcG9ydC8jL2RpYWxlY3RzL2RyYWZ0MjAxOS0wOSkKWyFbRHJhZnQgN10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD91cmw9aHR0cHMlM0ElMkYlMkZib3d0aWUucmVwb3J0JTJGYmFkZ2VzJTJGamF2YS1jb20ubmV0d29ya250LWpzb24tc2NoZW1hLXZhbGlkYXRvciUyRmNvbXBsaWFuY2UlMkZkcmFmdDcuanNvbildKGh0dHBzOi8vYm93dGllLnJlcG9ydC8jL2RpYWxlY3RzL2RyYWZ0NykKWyFbRHJhZnQgNl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD91cmw9aHR0cHMlM0ElMkYlMkZib3d0aWUucmVwb3J0JTJGYmFkZ2VzJTJGamF2YS1jb20ubmV0d29ya250LWpzb24tc2NoZW1hLXZhbGlkYXRvciUyRmNvbXBsaWFuY2UlMkZkcmFmdDYuanNvbildKGh0dHBzOi8vYm93dGllLnJlcG9ydC8jL2RpYWxlY3RzL2RyYWZ0NikKWyFbRHJhZnQgNF0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD91cmw9aHR0cHMlM0ElMkYlMkZib3d0aWUucmVwb3J0JTJGYmFkZ2VzJTJGamF2YS1jb20ubmV0d29ya250LWpzb24tc2NoZW1hLXZhbGlkYXRvciUyRmNvbXBsaWFuY2UlMkZkcmFmdDQuanNvbildKGh0dHBzOi8vYm93dGllLnJlcG9ydC8jL2RpYWxlY3RzL2RyYWZ0NCkKCkluZm9ybWF0aW9uIG9uIHRoZSBjb21wYXRpYmlsaXR5IHN1cHBvcnQgZm9yIGVhY2ggdmVyc2lvbiwgaW5jbHVkaW5nIGtub3duIGlzc3VlcywgY2FuIGJlIGZvdW5kIGluIHRoZSBbQ29tcGF0aWJpbGl0eSB3aXRoIEpTT04gU2NoZW1hIHZlcnNpb25zXShkb2MvY29tcGF0aWJpbGl0eS5tZCkgZG9jdW1lbnQuCgpTaW5jZSBbRHJhZnQgMjAxOS0wOV0oaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQvMjAxOS0wOS9qc29uLXNjaGVtYS12YWxpZGF0aW9uI3JmYy5zZWN0aW9uLjcpIHRoZSBgZm9ybWF0YCBrZXl3b3JkIG9ubHkgZ2VuZXJhdGVzIGFubm90YXRpb25zIGJ5IGRlZmF1bHQgYW5kIGRvZXMgbm90IGdlbmVyYXRlIGFzc2VydGlvbnMuCgpUaGlzIGJlaGF2aW9yIGNhbiBiZSBvdmVycmlkZGVuIHRvIGdlbmVyYXRlIGFzc2VydGlvbnMgYnkgc2V0dGluZyB0aGUgYHNldEZvcm1hdEFzc2VydGlvbnNFbmFibGVkYCB0byBgdHJ1ZWAgaW4gYFNjaGVtYVZhbGlkYXRvcnNDb25maWdgIG9yIGBFeGVjdXRpb25Db25maWdgLgoKIyMgVXBncmFkaW5nIHRvIG5ldyB2ZXJzaW9ucwoKVGhpcyBsaWJyYXJ5IGNhbiBjb250YWluIGJyZWFraW5nIGNoYW5nZXMgaW4gYG1pbm9yYCB2ZXJzaW9uIHJlbGVhc2VzIHRoYXQgbWF5IHJlcXVpcmUgY29kZSBjaGFuZ2VzLgoKSW5mb3JtYXRpb24gb24gbm90YWJsZSBvciBicmVha2luZyBjaGFuZ2VzIHdoZW4gdXBncmFkaW5nIHRoZSBsaWJyYXJ5IGNhbiBiZSBmb3VuZCBpbiB0aGUgW1VwZ3JhZGluZyB0byBuZXcgdmVyc2lvbnNdKGRvYy91cGdyYWRpbmcubWQpIGRvY3VtZW50LgoKVGhlIFtSZWxlYXNlc10oaHR0cHM6Ly9naXRodWIuY29tL25ldHdvcmtudC9qc29uLXNjaGVtYS12YWxpZGF0b3IvcmVsZWFzZXMpIHBhZ2Ugd2lsbCBjb250YWluIGluZm9ybWF0aW9uIG9uIHRoZSBsYXRlc3QgdmVyc2lvbnMuCgojIyBDb21wYXJpbmcgYWdhaW5zdCBvdGhlciBpbXBsZW1lbnRhdGlvbnMKClRoZSBbSlNPTiBTY2hlbWEgVmFsaWRhdGlvbiBDb21wYXJpc29uXShodHRwczovL2dpdGh1Yi5jb20vY3JlZWstc2VydmljZS9qc29uLXNjaGVtYS12YWxpZGF0aW9uLWNvbXBhcmlzb24pIHByb2plY3QgZnJvbSBDcmVlayBoYXMgYW4gaW5mb3JtYXRpdmUgW0NvbXBhcmlzb24gb2YgSlZNIGJhc2VkIFNjaGVtYSBWYWxpZGF0aW9uIEltcGxlbWVudGF0aW9uc10oaHR0cHM6Ly93d3cuY3JlZWtzZXJ2aWNlLm9yZy9qc29uLXNjaGVtYS12YWxpZGF0aW9uLWNvbXBhcmlzb24vKSB3aGljaCBjb21wYXJlcyBib3RoIHRoZSBmdW5jdGlvbmFsIGFuZCBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBudW1iZXIgb2YgZGlmZmVyZW50IEphdmEgaW1wbGVtZW50YXRpb25zLgoqIFtGdW5jdGlvbmFsIGNvbXBhcmlzb25dKGh0dHBzOi8vd3d3LmNyZWVrc2VydmljZS5vcmcvanNvbi1zY2hlbWEtdmFsaWRhdGlvbi1jb21wYXJpc29uL2Z1bmN0aW9uYWwjc3VtbWFyeS1yZXN1bHRzLXRhYmxlKQoqIFtQZXJmb3JtYW5jZSBjb21wYXJpc29uXShodHRwczovL3d3dy5jcmVla3NlcnZpY2Uub3JnL2pzb24tc2NoZW1hLXZhbGlkYXRpb24tY29tcGFyaXNvbi9wZXJmb3JtYW5jZSNqc29uLXNjaGVtYS10ZXN0LXN1aXRlLWJlbmNobWFyaykKClRoZSBbQm93dGllXShodHRwczovL2dpdGh1Yi5jb20vYm93dGllLWpzb24tc2NoZW1hL2Jvd3RpZSkgcHJvamVjdCBoYXMgYSBbcmVwb3J0XShodHRwczovL2Jvd3RpZS5yZXBvcnQvKSB0aGF0IGNvbXBhcmVzIGZ1bmN0aW9uYWwgY2hhcmFjdGVyaXN0aWNzIG9mIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMsIGluY2x1ZGluZyBub24tSmF2YSBpbXBsZW1lbnRhdGlvbnMsIGJ1dCBkb2VzIG5vdCBkbyBhbnkgcGVyZm9ybWFuY2UgYmVuY2htYXJraW5nLgoKIyMgV2h5IHRoaXMgbGlicmFyeQoKIyMjIyBQZXJmb3JtYW5jZQoKVGhpcyBzaG91bGQgYmUgdGhlIGZhc3Rlc3QgSmF2YSBKU09OIFNjaGVtYSBWYWxpZGF0b3IgaW1wbGVtZW50YXRpb24uCgpUaGUgZm9sbG93aW5nIGlzIHRoZSBiZW5jaG1hcmsgcmVzdWx0cyBmcm9tIHRoZSBbSlNPTiBTY2hlbWEgVmFsaWRhdG9yIFBlcmZ0ZXN0XShodHRwczovL2dpdGh1Yi5jb20vbmV0d29ya250L2pzb24tc2NoZW1hLXZhbGlkYXRvci1wZXJmdGVzdCkgcHJvamVjdCB0aGF0IHVzZXMgdGhlIFtKYXZhIE1pY3JvYmVuY2htYXJrIEhhcm5lc3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuamRrL2ptaCkuCgpOb3RlIHRoYXQgdGhlIGJlbmNobWFyayByZXN1bHRzIGFyZSBoaWdobHkgZGVwZW5kZW50IG9uIHRoZSBpbnB1dCBkYXRhIHdvcmtsb2FkcyBhbmQgc2NoZW1hcyB1c2VkIGZvciB0aGUgdmFsaWRhdGlvbi4KCkluIHRoaXMgY2FzZSB0aGlzIHdvcmtsb2FkIGlzIHVzaW5nIHRoZSBEcmFmdCA0IHNwZWNpZmljYXRpb24gYW5kIGxhcmdlbHkgdGVzdHMgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBldmFsdWF0aW5nIHRoZSBgcHJvcGVydGllc2Aga2V5d29yZC4gWW91IG1heSByZWZlciB0byBbUmVzdWx0cyBvZiBwZXJmb3JtYW5jZSBjb21wYXJpc29uIG9mIEpWTSBiYXNlZCBKU09OIFNjaGVtYSBWYWxpZGF0aW9uIEltcGxlbWVudGF0aW9uc10oaHR0cHM6Ly93d3cuY3JlZWtzZXJ2aWNlLm9yZy9qc29uLXNjaGVtYS12YWxpZGF0aW9uLWNvbXBhcmlzb24vcGVyZm9ybWFuY2UjanNvbi1zY2hlbWEtdGVzdC1zdWl0ZS1iZW5jaG1hcmspIGZvciBiZW5jaG1hcmsgcmVzdWx0cyBmb3IgbW9yZSB0eXBpY2FsIHdvcmtsb2FkcwoKSWYgcGVyZm9ybWFuY2UgaXMgYW4gaW1wb3J0YW50IGNvbnNpZGVyYXRpb24sIHRoZSBzcGVjaWZpYyBzYW1wbGUgd29ya2xvYWRzIHNob3VsZCBiZSBiZW5jaG1hcmtlZCwgYXMgdGhlcmUgYXJlIGRpZmZlcmVudCBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgd2hlbiBjZXJ0YWluIGtleXdvcmRzIGFyZSB1c2VkLiBGb3IgaW5zdGFuY2UgdGhlIHVzZSBvZiB0aGUgYHVuZXZhbHVhdGVkUHJvcGVydGllc2Agb3IgYHVuZXZhbHVhdGVkSXRlbXNgIGtleXdvcmQgd2lsbCB0cmlnZ2VyIGFubm90YXRpb24gY29sbGVjdGlvbiBpbiB0aGUgcmVsYXRlZCB2YWxpZGF0b3JzLCBzdWNoIGFzIHRoZSBgcHJvcGVydGllc2Agb3IgYGl0ZW1zYCB2YWxpZGF0b3JzLCBhbmQgYW5ub3RhdGlvbiBjb2xsZWN0aW9uIHdpbGwgYWR2ZXJzZWx5IGFmZmVjdCBwZXJmb3JtYW5jZS4KCiMjIyMjIE5ldHdvcmtOVCAxLjQuMQoKYGBgCkJlbmNobWFyayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZSAgQ250ICAgICAgU2NvcmUgICAgRXJyb3IgICBVbml0cwpOZXR3b3JrbnRCZW5jaG1hcmsudGVzdFZhbGlkYXRlICAgICAgICAgICAgICAgICAgICAgdGhycHQgICAxMCAgIDgzNTIuMTI2IMKxIDYxLjg3MCAgIG9wcy9zCk5ldHdvcmtudEJlbmNobWFyay50ZXN0VmFsaWRhdGU6Z2MuYWxsb2MucmF0ZSAgICAgICB0aHJwdCAgIDEwICAgIDcyMS4yOTYgwrEgIDUuMzQyICBNQi9zZWMKTmV0d29ya250QmVuY2htYXJrLnRlc3RWYWxpZGF0ZTpnYy5hbGxvYy5yYXRlLm5vcm0gIHRocnB0ICAgMTAgIDkwNTYwLjAxMyDCsSAgMC4wMDEgICAgQi9vcApOZXR3b3JrbnRCZW5jaG1hcmsudGVzdFZhbGlkYXRlOmdjLmNvdW50ICAgICAgICAgICAgdGhycHQgICAxMCAgICAgNjEuMDAwICAgICAgICAgICBjb3VudHMKTmV0d29ya250QmVuY2htYXJrLnRlc3RWYWxpZGF0ZTpnYy50aW1lICAgICAgICAgICAgIHRocnB0ICAgMTAgICAgIDY4LjAwMCAgICAgICAgICAgICAgIG1zCmBgYAoKIyMjIyMjIEV2ZXJpdCAxLjE0LjEKCmBgYApCZW5jaG1hcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGUgIENudCAgICAgICBTY29yZSAgICBFcnJvciAgIFVuaXRzCkV2ZXJpdEJlbmNobWFyay50ZXN0VmFsaWRhdGUgICAgICAgICAgICAgICAgICAgICAgICB0aHJwdCAgIDEwICAgIDM3NzUuNDUzIMKxIDQ0LjAyMyAgIG9wcy9zCkV2ZXJpdEJlbmNobWFyay50ZXN0VmFsaWRhdGU6Z2MuYWxsb2MucmF0ZSAgICAgICAgICB0aHJwdCAgIDEwICAgIDE2NjcuMzQ1IMKxIDE5LjQzNyAgTUIvc2VjCkV2ZXJpdEJlbmNobWFyay50ZXN0VmFsaWRhdGU6Z2MuYWxsb2MucmF0ZS5ub3JtICAgICB0aHJwdCAgIDEwICA0NjMxMDQuMDMwIMKxICAwLjAwMyAgICBCL29wCkV2ZXJpdEJlbmNobWFyay50ZXN0VmFsaWRhdGU6Z2MuY291bnQgICAgICAgICAgICAgICB0aHJwdCAgIDEwICAgICAxNDAuMDAwICAgICAgICAgICBjb3VudHMKRXZlcml0QmVuY2htYXJrLnRlc3RWYWxpZGF0ZTpnYy50aW1lICAgICAgICAgICAgICAgIHRocnB0ICAgMTAgICAgIDE1OC4wMDAgICAgICAgICAgICAgICBtcwpgYGAKCiMjIyMgRnVuY3Rpb25hbGl0eQoKVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0ZXN0ZWQgYWdhaW5zdCB0aGUgW0pTT04gU2NoZW1hIFRlc3QgU3VpdGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9qc29uLXNjaGVtYS1vcmcvSlNPTi1TY2hlbWEtVGVzdC1TdWl0ZSkuIEFzIHRlc3RzIGFyZSBjb250aW51YWxseSBhZGRlZCB0byB0aGUgc3VpdGUsIHRoZXNlIHRlc3QgcmVzdWx0cyBtYXkgbm90IGJlIGN1cnJlbnQuCgp8IEltcGxlbWVudGF0aW9ucyB8IE92ZXJhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRFJBRlRfMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEUkFGVF8wNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRFJBRlRfMDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRFJBRlRfMDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERSQUZUXzIwMTlfMDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRFJBRlRfMjAyMF8xMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBOZXR3b3JrTnQgICAgICAgfCBwYXNzOiByOjQ4MDMgKDEwMC4wJSkgbzoyMzcyICgxMDAuMCUpPGJyPmZhaWw6IHI6MCAoMC4wJSkgbzowICgwLjAlKSAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFzczogcjo2MTAgKDEwMC4wJSkgbzoyNTEgKDEwMC4wJSk8YnI+ZmFpbDogcjowICgwLjAlKSBvOjAgKDAuMCUpICB8IHBhc3M6IHI6ODIyICgxMDAuMCUpIG86MzE4ICgxMDAuMCUpPGJyPmZhaWw6IHI6MCAoMC4wJSkgbzowICgwLjAlKSB8IHBhc3M6IHI6OTA2ICgxMDAuMCUpIG86NTQxICgxMDAuMCUpPGJyPmZhaWw6IHI6MCAoMC4wJSkgbzowICgwLjAlKSAgICAgfCBwYXNzOiByOjEyMjAgKDEwMC4wJSkgbzo2MjUgKDEwMC4wJSk8YnI+ZmFpbDogcjowICgwLjAlKSBvOjAgKDAuMCUpICB8IHBhc3M6IHI6MTI0NSAoMTAwLjAlKSBvOjYzNyAoMTAwLjAlKTxicj5mYWlsOiByOjAgKDAuMCUpIG86MCAoMC4wJSkgICAgfAoKKiBOb3RlIHRoYXQgdGhpcyB1c2VzIHRoZSBgSm9uaVJlZ3VsYXJFeHByZXNzaW9uRmFjdG9yeWAgZm9yIHRoZSBgcGF0dGVybmAgYW5kIGBmb3JtYXRgIGByZWdleGAgdGVzdHMuCgojIyMjIEphY2tzb24gUGFyc2VyCgpUaGlzIGxpYnJhcnkgdXNlcyBbSmFja3Nvbl0oaHR0cHM6Ly9naXRodWIuY29tL0Zhc3RlclhNTC9qYWNrc29uKSB3aGljaCBpcyBhIEphdmEgSlNPTiBwYXJzZXIgdGhhdCBpcyB3aWRlbHkgdXNlZCBpbiBvdGhlciBwcm9qZWN0cy4gSWYgeW91IGFyZSBhbHJlYWR5IHVzaW5nIHRoZSBKYWNrc29uIHBhcnNlciBpbiB5b3VyIHByb2plY3QsIGl0IGlzIG5hdHVyYWwgdG8gY2hvb3NlIHRoaXMgbGlicmFyeSBvdmVyIG90aGVycyBmb3Igc2NoZW1hIHZhbGlkYXRpb24uCgojIyMjIFlBTUwgU3VwcG9ydAoKVGhlIGxpYnJhcnkgd29ya3Mgd2l0aCBKU09OIGFuZCBZQU1MIG9uIGJvdGggc2NoZW1hIGRlZmluaXRpb25zIGFuZCBpbnB1dCBkYXRhLgoKIyMjIyBPcGVuQVBJIFN1cHBvcnQKClRoZSBPcGVuQVBJIDMuMCBzcGVjaWZpY2F0aW9uIGlzIHVzaW5nIEpTT04gc2NoZW1hIHRvIHZhbGlkYXRlIHRoZSByZXF1ZXN0L3Jlc3BvbnNlLCBidXQgdGhlcmUgYXJlIHNvbWUgZGlmZmVyZW5jZXMuIFdpdGggYSBjb25maWd1cmF0aW9uIGZpbGUsIHlvdSBjYW4gZW5hYmxlIHRoZSBsaWJyYXJ5IHRvIHdvcmsgd2l0aCBPcGVuQVBJIDMuMCB2YWxpZGF0aW9uLgoKIyMjIyBNaW5pbWFsIERlcGVuZGVuY2llcwoKRm9sbG93aW5nIHRoZSBkZXNpZ24gcHJpbmNpcGxlIG9mIHRoZSBMaWdodCBQbGF0Zm9ybSwgdGhpcyBsaWJyYXJ5IGhhcyBtaW5pbWFsIGRlcGVuZGVuY2llcyB0byBlbnN1cmUgdGhlcmUgYXJlIG5vIGRlcGVuZGVuY3kgY29uZmxpY3RzIHdoZW4gdXNpbmcgaXQuCgojIyMjIyBSZXF1aXJlZCBEZXBlbmRlbmNpZXMKClRoZSBmb2xsb3dpbmcgYXJlIHRoZSBkZXBlbmRlbmNpZXMgdGhhdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaW5jbHVkZWQgd2hlbiB0aGlzIGxpYnJhcnkgaXMgaW5jbHVkZWQuCgpgYGB4bWwKPGRlcGVuZGVuY3k+CiAgICA8IS0tIFVzZWQgZm9yIGxvZ2dpbmcgLS0+CiAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CiAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+CiAgICA8dmVyc2lvbj4ke3ZlcnNpb24uc2xmNGp9PC92ZXJzaW9uPgo8L2RlcGVuZGVuY3k+Cgo8ZGVwZW5kZW5jeT4KICAgIDwhLS0gVXNlZCB0byBwcm9jZXNzIEpTT04gLS0+CiAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KICAgIDxhcnRpZmFjdElkPmphY2tzb24tZGF0YWJpbmQ8L2FydGlmYWN0SWQ+CiAgICA8dmVyc2lvbj4ke3ZlcnNpb24uamFja3Nvbn08L3ZlcnNpb24+CjwvZGVwZW5kZW5jeT4KCjxkZXBlbmRlbmN5PgogICAgPCEtLSBVc2VkIHRvIHByb2Nlc3MgWUFNTCAtLT4KICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhZm9ybWF0PC9ncm91cElkPgogICAgPGFydGlmYWN0SWQ+amFja3Nvbi1kYXRhZm9ybWF0LXlhbWw8L2FydGlmYWN0SWQ+CiAgICA8dmVyc2lvbj4ke3ZlcnNpb24uamFja3Nvbn08L3ZlcnNpb24+CjwvZGVwZW5kZW5jeT4KCjxkZXBlbmRlbmN5PgogICAgPCEtLSBVc2VkIHRvIHZhbGlkYXRlIFJGQyAzMzM5IGRhdGUgYW5kIGRhdGUtdGltZSAtLT4KICAgIDxncm91cElkPmNvbS5ldGhsby50aW1lPC9ncm91cElkPgogICAgPGFydGlmYWN0SWQ+aXR1PC9hcnRpZmFjdElkPgogICAgPHZlcnNpb24+JHt2ZXJzaW9uLml0dX08L3ZlcnNpb24+CjwvZGVwZW5kZW5jeT4KYGBgCgojIyMjIyBPcHRpb25hbCBEZXBlbmRlbmNpZXMKClRoZSBmb2xsb3dpbmcgYXJlIHRoZSBvcHRpb25hbCBkZXBlbmRlbmNpZXMgdGhhdCBtYXkgYmUgcmVxdWlyZWQgZm9yIGNlcnRhaW4gb3B0aW9ucy4KClRoZXNlIGFyZSBub3QgYXV0b21hdGljYWxseSBpbmNsdWRlZCBhbmQgc2V0dGluZyB0aGUgcmVsZXZhbnQgb3B0aW9uIHdpdGhvdXQgYWRkaW5nIHRoZSBsaWJyYXJ5IHdpbGwgcmVzdWx0IGluIGEgYENsYXNzTm90Rm91bmRFeGNlcHRpb25gLgoKYGBgeG1sCjxkZXBlbmRlbmN5PgogICAgPCEtLSBVc2VkIHRvIHZhbGlkYXRlIEVDTUEgMjYyIHJlZ3VsYXIgZXhwcmVzc2lvbnMgLS0+CiAgICA8IS0tIEFwcHJveGltYXRlbHkgNTAgTUIgaW4gZGVwZW5kZW5jaWVzIC0tPgogICAgPCEtLSBHcmFhbEpTUmVndWxhckV4cHJlc3Npb25GYWN0b3J5IC0tPgogICAgPGdyb3VwSWQ+b3JnLmdyYWFsdm0uanM8L2dyb3VwSWQ+CiAgICA8YXJ0aWZhY3RJZD5qczwvYXJ0aWZhY3RJZD4KICAgIDx2ZXJzaW9uPiR7dmVyc2lvbi5ncmFhbGpzfTwvdmVyc2lvbj4KPC9kZXBlbmRlbmN5PgoKPGRlcGVuZGVuY3k+CiAgICA8IS0tIFVzZWQgdG8gdmFsaWRhdGUgRUNNQSAyNjIgcmVndWxhciBleHByZXNzaW9ucyAtLT4KICAgIDwhLS0gQXBwcm94aW1hdGVseSAyIE1CIGluIGRlcGVuZGVuY2llcyAtLT4KICAgIDwhLS0gSm9uaVJlZ3VsYXJFeHByZXNzaW9uRmFjdG9yeSAtLT4KICAgIDxncm91cElkPm9yZy5qcnVieS5qb25pPC9ncm91cElkPgogICAgPGFydGlmYWN0SWQ+am9uaTwvYXJ0aWZhY3RJZD4KICAgIDx2ZXJzaW9uPiR7dmVyc2lvbi5qb25pfTwvdmVyc2lvbj4KPC9kZXBlbmRlbmN5PgpgYGAKCiMjIyMjIEV4Y2x1ZGFibGUgRGVwZW5kZW5jaWVzCgpUaGUgZm9sbG93aW5nIGFyZSByZXF1aXJlZCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCwgYnV0IGNhbiBiZSBleHBsaWNpdGx5IGV4Y2x1ZGVkIGlmIHRoZXkgYXJlIG5vdCByZXF1aXJlZC4KClRoZSBZQU1MIGRlcGVuZGVuY3kgY2FuIGJlIGV4Y2x1ZGVkIGlmIHRoaXMgaXMgbm90IHJlcXVpcmVkLiBBdHRlbXB0aW5nIHRvIHByb2Nlc3Mgc2NoZW1hcyBvciBpbnB1dCB0aGF0IGFyZSBZQU1MIHdpbGwgcmVzdWx0IGluIGEgYENsYXNzTm90Rm91bmRFeGNlcHRpb25gLgoKYGBgeG1sCjxkZXBlbmRlbmN5PgogICAgPGdyb3VwSWQ+Y29tLm5ldHdvcmtudDwvZ3JvdXBJZD4KICAgIDxhcnRpZmFjdElkPmpzb24tc2NoZW1hLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4KICAgIDxleGNsdXNpb25zPgogICAgICAgIDxleGNsdXNpb24+CiAgICAgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhZm9ybWF0PC9ncm91cElkPgogICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFmb3JtYXQteWFtbDwvYXJ0aWZhY3RJZD4KICAgICAgICA8L2V4Y2x1c2lvbj4KICAgIDwvZXhjbHVzaW9ucz4KPC9kZXBlbmRlbmN5PgpgYGAKClRoZSBFdGhsbyBUaW1lIGRlcGVuZGVuY3kgY2FuIGJlIGV4Y2x1ZGVkIGlmIGFjY3VyYXRlIHZhbGlkYXRpb24gb2YgdGhlIGBkYXRlLXRpbWVgIGZvcm1hdCBpcyBub3QgcmVxdWlyZWQuIFRoZSBgZGF0ZS10aW1lYCBmb3JtYXQgd2lsbCB0aGVuIHVzZSBgamF2YS50aW1lLk9mZnNldERhdGVUaW1lYCB0byBkZXRlcm1pbmUgaWYgdGhlIGBkYXRlLXRpbWVgIGlzIHZhbGlkIC4KCmBgYHhtbAo8ZGVwZW5kZW5jeT4KICAgIDxncm91cElkPmNvbS5uZXR3b3JrbnQ8L2dyb3VwSWQ+CiAgICA8YXJ0aWZhY3RJZD5qc29uLXNjaGVtYS12YWxpZGF0b3I8L2FydGlmYWN0SWQ+CiAgICA8ZXhjbHVzaW9ucz4KICAgICAgICA8ZXhjbHVzaW9uPgogICAgICAgICAgICA8Z3JvdXBJZD5jb20uZXRobG8udGltZTwvZ3JvdXBJZD4KICAgICAgICAgICAgPGFydGlmYWN0SWQ+aXR1PC9hcnRpZmFjdElkPgogICAgICAgIDwvZXhjbHVzaW9uPgogICAgPC9leGNsdXNpb25zPgo8L2RlcGVuZGVuY3k+CmBgYAoKIyMjIyBDb21tdW5pdHkKClRoaXMgbGlicmFyeSBpcyB2ZXJ5IGFjdGl2ZSB3aXRoIGEgbG90IG9mIGNvbnRyaWJ1dG9ycy4gTmV3IGZlYXR1cmVzIGFuZCBidWcgZml4ZXMgYXJlIGhhbmRsZWQgcXVpY2tseSBieSB0aGUgdGVhbSBtZW1iZXJzLiBCZWNhdXNlIGl0IGlzIGFuIGVzc2VudGlhbCBkZXBlbmRlbmN5IG9mIHRoZSBbbGlnaHQtNGpdKGh0dHBzOi8vZ2l0aHViLmNvbS9uZXR3b3JrbnQvbGlnaHQtNGopIGZyYW1ld29yayBpbiB0aGUgc2FtZSBHaXRIdWIgb3JnYW5pemF0aW9uLCBpdCB3aWxsIGJlIGV2b2x2ZWQgYW5kIG1haW50YWluZWQgYWxvbmcgd2l0aCB0aGUgZnJhbWV3b3JrLgoKIyMgUHJlcmVxdWlzaXRlCgpUaGUgbGlicmFyeSBzdXBwb3J0cyBKYXZhIDggYW5kIHVwLiBJZiB5b3Ugd2FudCB0byBidWlsZCBmcm9tIHRoZSBzb3VyY2UgY29kZSwgeW91IG5lZWQgdG8gaW5zdGFsbCBKREsgOCBsb2NhbGx5LiBUbyBzdXBwb3J0IG11bHRpcGxlIHZlcnNpb24gb2YgSkRLLCB5b3UgY2FuIHVzZSBbU0RLTUFOXShodHRwczovL3d3dy5uZXR3b3JrbnQuY29tL3Rvb2wvc2RrLykKCiMjIFVzYWdlCgojIyMgQWRkaW5nIHRoZSBkZXBlbmRlbmN5CgpUaGlzIHBhY2thZ2UgaXMgYXZhaWxhYmxlIG9uIE1hdmVuIGNlbnRyYWwuCgojIyMjIE1hdmVuOgoKYGBgeG1sCjxkZXBlbmRlbmN5PgogICAgPGdyb3VwSWQ+Y29tLm5ldHdvcmtudDwvZ3JvdXBJZD4KICAgIDxhcnRpZmFjdElkPmpzb24tc2NoZW1hLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4KICAgIDx2ZXJzaW9uPjEuNS41PC92ZXJzaW9uPgo8L2RlcGVuZGVuY3k+CmBgYAoKIyMjIyBHcmFkbGU6CgpgYGBqYXZhCmRlcGVuZGVuY2llcyB7CiAgICBpbXBsZW1lbnRhdGlvbihncm91cDogJ2NvbS5uZXR3b3JrbnQnLCBuYW1lOiAnanNvbi1zY2hlbWEtdmFsaWRhdG9yJywgdmVyc2lvbjogJzEuNS41Jyk7Cn0KYGBgCgojIyMgVmFsaWRhdGluZyBpbnB1dHMgYWdhaW5zdCBhIHNjaGVtYQoKVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgaW5wdXRzIGFyZSB2YWxpZGF0ZWQgYWdhaW5zdCBhIHNjaGVtYS4gSXQgY29tcHJpc2VzIHRoZSBmb2xsb3dpbmcgc3RlcHMuCgoqIENyZWF0aW5nIGEgc2NoZW1hIGZhY3Rvcnkgd2l0aCB0aGUgZGVmYXVsdCBzY2hlbWEgZGlhbGVjdCBhbmQgaG93IHRoZSBzY2hlbWFzIGNhbiBiZSByZXRyaWV2ZWQuCiAgKiBDb25maWd1cmluZyBtYXBwaW5nIHRoZSBgJGlkYCB0byBhIHJldHJpZXZhbCBVUkkgdXNpbmcgYHNjaGVtYU1hcHBlcnNgLgogICogQ29uZmlndXJpbmcgaG93IHRoZSBzY2hlbWFzIGFyZSBsb2FkZWQgdXNpbmcgdGhlIHJldHJpZXZhbCBVUkkgdXNpbmcgYHNjaGVtYUxvYWRlcnNgLgogICAgRm9yIGluc3RhbmNlIGEgYE1hcDxTdHJpbmcsIFN0cmluZz4gc2NoZW1hc2AgY29udGFpbmluZyBhIG1hcHBpbmcgb2YgcmV0cmlldmFsIFVSSSB0byBzY2hlbWEgZGF0YSBhcyBhIGBTdHJpbmdgIGNhbiBieSBjb25maWd1cmVkIHVzaW5nIGBidWlsZGVyLnNjaGVtYUxvYWRlcnMoc2NoZW1hTG9hZGVycyAtPiBzY2hlbWFMb2FkZXJzLnNjaGVtYXMoc2NoZW1hcykpYC4gVGhpcyBhbHNvIGFjY2VwdHMgYSBgRnVuY3Rpb248U3RyaW5nLCBTdHJpbmc+IHNjaGVtYVJldHJpZXZhbEZ1bmN0aW9uYC4KKiBDcmVhdGluZyBhIGNvbmZpZ3VyYXRpb24gZm9yIGNvbnRyb2xsaW5nIHZhbGlkYXRvciBiZWhhdmlvci4KKiBMb2FkaW5nIGEgc2NoZW1hIGZyb20gYSBzY2hlbWEgbG9jYXRpb24gYWxvbmcgd2l0aCB0aGUgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24uCiogVXNpbmcgdGhlIHNjaGVtYSB0byB2YWxpZGF0ZSB0aGUgZGF0YSBhbG9uZyB3aXRoIHNldHRpbmcgYW55IGV4ZWN1dGlvbiBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGxpa2UgZm9yIGluc3RhbmNlIHRoZSBsb2NhbGUgb3Igd2hldGhlciBmb3JtYXQgYXNzZXJ0aW9ucyBhcmUgZW5hYmxlZC4KCmBgYGphdmEKLy8gVGhpcyBjcmVhdGVzIGEgc2NoZW1hIGZhY3RvcnkgdGhhdCB3aWxsIHVzZSBEcmFmdCAyMDIwLTEyIGFzIHRoZSBkZWZhdWx0IGlmICRzY2hlbWEgaXMgbm90IHNwZWNpZmllZAovLyBpbiB0aGUgc2NoZW1hIGRhdGEuIElmICRzY2hlbWEgaXMgc3BlY2lmaWVkIGluIHRoZSBzY2hlbWEgZGF0YSB0aGVuIHRoYXQgc2NoZW1hIGRpYWxlY3Qgd2lsbCBiZSB1c2VkCi8vIGluc3RlYWQgYW5kIHRoaXMgdmVyc2lvbiBpcyBpZ25vcmVkLgpKc29uU2NoZW1hRmFjdG9yeSBqc29uU2NoZW1hRmFjdG9yeSA9IEpzb25TY2hlbWFGYWN0b3J5LmdldEluc3RhbmNlKFZlcnNpb25GbGFnLlYyMDIwMTIsIGJ1aWxkZXIgLT4KICAgIC8vIFRoaXMgY3JlYXRlcyBhIG1hcHBpbmcgZnJvbSAkaWQgd2hpY2ggc3RhcnRzIHdpdGggaHR0cHM6Ly93d3cuZXhhbXBsZS5vcmcvIHRvIHRoZSByZXRyaWV2YWwgVVJJIGNsYXNzcGF0aDpzY2hlbWEvCiAgICBidWlsZGVyLnNjaGVtYU1hcHBlcnMoc2NoZW1hTWFwcGVycyAtPiBzY2hlbWFNYXBwZXJzLm1hcFByZWZpeCgiaHR0cHM6Ly93d3cuZXhhbXBsZS5vcmcvIiwgImNsYXNzcGF0aDpzY2hlbWEvIikpCik7CgpTY2hlbWFWYWxpZGF0b3JzQ29uZmlnLkJ1aWxkZXIgYnVpbGRlciA9IFNjaGVtYVZhbGlkYXRvcnNDb25maWcuYnVpbGRlcigpOwovLyBCeSBkZWZhdWx0IHRoZSBKREsgcmVndWxhciBleHByZXNzaW9uIGltcGxlbWVudGF0aW9uIHdoaWNoIGlzIG5vdCBFQ01BIDI2MiBjb21wbGlhbnQgaXMgdXNlZAovLyBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIHJlcXVpcmVzIGluY2x1ZGluZyBvcHRpb25hbCBkZXBlbmRlbmNpZXMKLy8gYnVpbGRlci5yZWd1bGFyRXhwcmVzc2lvbkZhY3RvcnkoR3JhYWxKU1JlZ3VsYXJFeHByZXNzaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpKTsKLy8gYnVpbGRlci5yZWd1bGFyRXhwcmVzc2lvbkZhY3RvcnkoSm9uaVJlZ3VsYXJFeHByZXNzaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpKTsKU2NoZW1hVmFsaWRhdG9yc0NvbmZpZyBjb25maWcgPSBidWlsZGVyLmJ1aWxkKCk7CgovLyBEdWUgdG8gdGhlIG1hcHBpbmcgdGhlIHNjaGVtYSB3aWxsIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBjbGFzc3BhdGggYXQgY2xhc3NwYXRoOnNjaGVtYS9leGFtcGxlLW1haW4uanNvbi4KLy8gSWYgdGhlIHNjaGVtYSBkYXRhIGRvZXMgbm90IHNwZWNpZnkgYW4gJGlkIHRoZSBhYnNvbHV0ZSBJUkkgb2YgdGhlIHNjaGVtYSBsb2NhdGlvbiB3aWxsIGJlIHVzZWQgYXMgdGhlICRpZC4KSnNvblNjaGVtYSBzY2hlbWEgPSBqc29uU2NoZW1hRmFjdG9yeS5nZXRTY2hlbWEoU2NoZW1hTG9jYXRpb24ub2YoImh0dHBzOi8vd3d3LmV4YW1wbGUub3JnL2V4YW1wbGUtbWFpbi5qc29uIiksIGNvbmZpZyk7ClN0cmluZyBpbnB1dCA9ICJ7XHJcbiIKICAgICsgIiAgXCJtYWluXCI6IHtcclxuIgogICAgKyAiICAgIFwiY29tbW9uXCI6IHtcclxuIgogICAgKyAiICAgICAgXCJmaWVsZFwiOiBcImludmFsaWRmaWVsZFwiXHJcbiIKICAgICsgIiAgICB9XHJcbiIKICAgICsgIiAgfVxyXG4iCiAgICArICJ9IjsKClNldDxWYWxpZGF0aW9uTWVzc2FnZT4gYXNzZXJ0aW9ucyA9IHNjaGVtYS52YWxpZGF0ZShpbnB1dCwgSW5wdXRGb3JtYXQuSlNPTiwgZXhlY3V0aW9uQ29udGV4dCAtPiB7CiAgICAvLyBCeSBkZWZhdWx0IHNpbmNlIERyYWZ0IDIwMTktMDkgdGhlIGZvcm1hdCBrZXl3b3JkIG9ubHkgZ2VuZXJhdGVzIGFubm90YXRpb25zIGFuZCBub3QgYXNzZXJ0aW9ucwogICAgZXhlY3V0aW9uQ29udGV4dC5nZXRFeGVjdXRpb25Db25maWcoKS5zZXRGb3JtYXRBc3NlcnRpb25zRW5hYmxlZCh0cnVlKTsKfSk7CmBgYAoKIyMjIFZhbGlkYXRpbmcgYSBzY2hlbWEgYWdhaW5zdCBhIG1ldGEtc2NoZW1hCgpUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyBhIHNjaGVtYSBpcyB2YWxpZGF0ZWQgYWdhaW5zdCBhIG1ldGEtc2NoZW1hLgoKVGhpcyBpcyBhY3R1YWxseSB0aGUgc2FtZSBhcyB2YWxpZGF0aW5nIGlucHV0cyBhZ2FpbnN0IGEgc2NoZW1hIGV4Y2VwdCBpbiB0aGlzIGNhc2UgdGhlIGlucHV0IGlzIHRoZSBzY2hlbWEgYW5kIHRoZSBzY2hlbWEgdXNlZCBpcyB0aGUgbWV0YS1zY2hlbWEuCgpOb3RlIHRoYXQgdGhlIG1ldGEtc2NoZW1hcyBmb3IgRHJhZnQgNCwgRHJhZnQgNiwgRHJhZnQgNywgRHJhZnQgMjAxOS0wOSBhbmQgRHJhZnQgMjAyMC0xMiBhcmUgYnVuZGxlZCB3aXRoIHRoZSBsaWJyYXJ5IGFuZCB0aGVzZSBjbGFzc3BhdGggcmVzb3VyY2VzIHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0LgoKYGBgamF2YQpKc29uU2NoZW1hRmFjdG9yeSBqc29uU2NoZW1hRmFjdG9yeSA9IEpzb25TY2hlbWFGYWN0b3J5LmdldEluc3RhbmNlKFZlcnNpb25GbGFnLlYyMDIwMTIpOwoKU2NoZW1hVmFsaWRhdG9yc0NvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBTY2hlbWFWYWxpZGF0b3JzQ29uZmlnLmJ1aWxkZXIoKTsKLy8gQnkgZGVmYXVsdCB0aGUgSkRLIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbXBsZW1lbnRhdGlvbiB3aGljaCBpcyBub3QgRUNNQSAyNjIgY29tcGxpYW50IGlzIHVzZWQKLy8gTm90ZSB0aGF0IHNldHRpbmcgdGhpcyByZXF1aXJlcyBpbmNsdWRpbmcgb3B0aW9uYWwgZGVwZW5kZW5jaWVzCi8vIGJ1aWxkZXIucmVndWxhckV4cHJlc3Npb25GYWN0b3J5KEdyYWFsSlNSZWd1bGFyRXhwcmVzc2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKSk7Ci8vIGJ1aWxkZXIucmVndWxhckV4cHJlc3Npb25GYWN0b3J5KEpvbmlSZWd1bGFyRXhwcmVzc2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKSk7ClNjaGVtYVZhbGlkYXRvcnNDb25maWcgY29uZmlnID0gYnVpbGRlci5idWlsZCgpOwoKLy8gRHVlIHRvIHRoZSBtYXBwaW5nIHRoZSBtZXRhLXNjaGVtYSB3aWxsIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBjbGFzc3BhdGggYXQgY2xhc3NwYXRoOmRyYWZ0LzIwMjAtMTIvc2NoZW1hLgpKc29uU2NoZW1hIHNjaGVtYSA9IGpzb25TY2hlbWFGYWN0b3J5LmdldFNjaGVtYShTY2hlbWFMb2NhdGlvbi5vZihTY2hlbWFJZC5WMjAyMDEyKSwgY29uZmlnKTsKU3RyaW5nIGlucHV0ID0gIntcclxuIgogICAgKyAiICBcInR5cGVcIjogXCJvYmplY3RcIixcclxuIgogICAgKyAiICBcInByb3BlcnRpZXNcIjoge1xyXG4iCiAgICArICIgICAgXCJrZXlcIjoge1xyXG4iCiAgICArICIgICAgICBcInRpdGxlXCIgOiBcIk15IGtleVwiLFxyXG4iCiAgICArICIgICAgICBcInR5cGVcIjogXCJpbnZhbGlkdHlwZVwiXHJcbiIKICAgICsgIiAgICB9XHJcbiIKICAgICsgIiAgfVxyXG4iCiAgICArICJ9IjsKU2V0PFZhbGlkYXRpb25NZXNzYWdlPiBhc3NlcnRpb25zID0gc2NoZW1hLnZhbGlkYXRlKGlucHV0LCBJbnB1dEZvcm1hdC5KU09OLCBleGVjdXRpb25Db250ZXh0IC0+IHsKICAgIC8vIEJ5IGRlZmF1bHQgc2luY2UgRHJhZnQgMjAxOS0wOSB0aGUgZm9ybWF0IGtleXdvcmQgb25seSBnZW5lcmF0ZXMgYW5ub3RhdGlvbnMgYW5kIG5vdCBhc3NlcnRpb25zCiAgICBleGVjdXRpb25Db250ZXh0LmdldEV4ZWN1dGlvbkNvbmZpZygpLnNldEZvcm1hdEFzc2VydGlvbnNFbmFibGVkKHRydWUpOwp9KTsKYGBgCiMjIyBSZXN1bHRzIGFuZCBvdXRwdXQgZm9ybWF0cwoKIyMjIyBSZXN1bHRzCgpUaGUgZm9sbG93aW5nIHR5cGVzIG9mIHJlc3VsdHMgYXJlIGdlbmVyYXRlZCBieSB0aGUgbGlicmFyeS4KCnwgVHlwZSAgICAgICAgfCBEZXNjcmlwdGlvbgp8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tCnwgQXNzZXJ0aW9ucyAgfCBWYWxpZGF0aW9uIGVycm9ycyBnZW5lcmF0ZWQgYnkgYSBrZXl3b3JkIG9uIGEgcGFydGljdWxhciBpbnB1dCBkYXRhIGluc3RhbmNlLiBUaGlzIGlzIGdlbmVyYWxseSBkZXNjcmliZWQgaW4gYSBgVmFsaWRhdGlvbk1lc3NhZ2VgIG9yIGluIGEgYE91dHB1dFVuaXRgLiBOb3RlIHRoYXQgc2luY2UgRHJhZnQgMjAxOS0wOSB0aGUgYGZvcm1hdGAga2V5d29yZCBubyBsb25nZXIgZ2VuZXJhdGVzIGFzc2VydGlvbnMgYnkgZGVmYXVsdCBhbmQgaW5zdGVhZCBnZW5lcmF0ZXMgb25seSBhbm5vdGF0aW9ucyB1bmxlc3MgY29uZmlndXJlZCBvdGhlcndpc2UgdXNpbmcgYSBjb25maWd1cmF0aW9uIG9wdGlvbiBvciBieSB1c2luZyBhIG1ldGEtc2NoZW1hIHRoYXQgdXNlcyB0aGUgYXBwcm9wcmlhdGUgdm9jYWJ1bGFyeS4KfCBBbm5vdGF0aW9ucyB8IEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGJ5IGEga2V5d29yZCBmb3IgYSBwYXJ0aWN1bGFyIGlucHV0IGRhdGEgaW5zdGFuY2UuIFRoaXMgaXMgZ2VuZXJhbGx5IGRlc2NyaWJlZCBpbiBhIGBPdXRwdXRVbml0YC4gQW5ub3RhdGlvbiBjb2xsZWN0aW9uIGFuZCByZXBvcnRpbmcgaXMgdHVybmVkIG9mZiBieSBkZWZhdWx0LiBBbm5vdGF0aW9ucyByZXF1aXJlZCBieSBrZXl3b3JkcyBzdWNoIGFzIGB1bmV2YWx1YXRlZFByb3BlcnRpZXNgIG9yIGB1bmV2YWx1YXRlZEl0ZW1zYCBhcmUgYWx3YXlzIGNvbGxlY3RlZCBmb3IgZXZhbHVhdGlvbiBwdXJwb3NlcyBhbmQgY2Fubm90IGJlIGRpc2FibGVkIGJ1dCB3aWxsIG5vdCBiZSByZXBvcnRlZCB1bmxlc3MgY29uZmlndXJlZCB0byBkbyBzby4KClRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBkZXNjcmliZSBib3RoIHR5cGVzIG9mIHJlc3VsdHMuCgp8IFR5cGUgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24KfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLQp8IEV2YWx1YXRpb24gUGF0aCAgIHwgVGhpcyBpcyB0aGUgc2V0IG9mIGtleXMgZnJvbSB0aGUgcm9vdCB0aHJvdWdoIHdoaWNoIGV2YWx1YXRpb24gcGFzc2VzIHRvIHJlYWNoIHRoZSBzY2hlbWEgZm9yIGV2YWx1YXRpbmcgdGhlIGluc3RhbmNlLiBUaGlzIGluY2x1ZGVzIGAkcmVmYCBhbmQgYCRkeW5hbWljUmVmYC4gZWcuIGBgYC9wcm9wZXJ0aWVzL2Jhci8kcmVmL3Byb3BlcnRpZXMvYmFyLXByb3BgYGAKfCBTY2hlbWEgTG9jYXRpb24gICB8IFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBJUkkgb2YgdGhlIHNjaGVtYSBwbHVzIHRoZSBKU09OIHBvaW50ZXIgZnJhZ21lbnQgdG8gdGhlIHNjaGVtYSB0aGF0IHdhcyB1c2VkIGZvciBldmFsdWF0aW5nIHRoZSBpbnN0YW5jZS4gZWcuIGBgYGh0dHBzOi8vanNvbi1zY2hlbWEub3JnL3NjaGVtYXMvZXhhbXBsZSMvJGRlZnMvYmFyL3Byb3BlcnRpZXMvYmFyLXByb3BgYGAKfCBJbnN0YW5jZSBMb2NhdGlvbiB8IFRoaXMgaXMgdGhlIEpTT04gcG9pbnRlciBmcmFnbWVudCB0byB0aGUgaW5zdGFuY2UgZGF0YSB0aGF0IHdhcyBiZWluZyBldmFsdWF0ZWQuIGVnLiBgYGAvYmFyL2Jhci1wcm9wYGBgCgpBc3NlcnRpb25zIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgoKfCBUeXBlICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uCnwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0KfCBNZXNzYWdlICAgICAgICAgICB8IFRoZSB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2UuCnwgQ29kZSAgICAgICAgICAgICAgfCBUaGUgZXJyb3IgY29kZS4KfCBNZXNzYWdlIEtleSAgICAgICB8IFRoZSBtZXNzYWdlIGtleSB1c2VkIGZvciBnZW5lcmF0aW5nIHRoZSBtZXNzYWdlIGZvciBsb2NhbGl6YXRpb24uCnwgQXJndW1lbnRzICAgICAgICAgfCBUaGUgYXJndW1lbnRzIHVzZWQgZm9yIGdlbmVyYXRpbmcgdGhlIG1lc3NhZ2UuCnwgVHlwZSAgICAgICAgICAgICAgfCBUaGUga2V5d29yZCB0aGF0IGdlbmVyYXRlZCB0aGUgbWVzc2FnZS4KfCBQcm9wZXJ0eSAgICAgICAgICB8IFRoZSBwcm9wZXJ0eSBuYW1lIHRoYXQgY2F1c2VkIHRoZSB2YWxpZGF0aW9uIGVycm9yIGZvciBleGFtcGxlIGZvciB0aGUgYHJlcXVpcmVkYCBrZXl3b3JkLiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcGFydCBvZiB0aGUgaW5zdGFuY2UgbG9jYXRpb24gYXMgdGhhdCBwb2ludHMgdG8gdGhlIGluc3RhbmNlIG5vZGUuCnwgU2NoZW1hIE5vZGUgICAgICAgfCBUaGUgYEpzb25Ob2RlYCBwb2ludGVkIHRvIGJ5IHRoZSBTY2hlbWEgTG9jYXRpb24uIFRoaXMgaXMgdGhlIHNjaGVtYSBkYXRhIHRoYXQgY2F1c2VkIHRoZSBpbnB1dCBkYXRhIHRvIGZhaWwuIEl0IGlzIHBvc3NpYmxlIHRvIGdldCB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gYnkgY29uZmlndXJpbmcgdGhlIGBKc29uU2NoZW1hRmFjdG9yeWAgd2l0aCBhIGBKc29uTm9kZVJlYWRlcmAgdGhhdCB1c2VzIHRoZSBgTG9jYXRpb25Kc29uTm9kZUZhY3RvcnlGYWN0b3J5YCBhbmQgdXNpbmcgYEpzb25Ob2Rlcy50b2tlbkxvY2F0aW9uT2Yoc2NoZW1hTm9kZSlgLgp8IEluc3RhbmNlIE5vZGUgICAgIHwgVGhlIGBKc29uTm9kZWAgcG9pbnRlZCB0byBieSB0aGUgSW5zdGFuY2UgTG9jYXRpb24uIFRoaXMgaXMgdGhlIGlucHV0IGRhdGEgdGhhdCBmYWlsZWQgdmFsaWRhdGlvbi4gSXQgaXMgcG9zc2libGUgdG8gZ2V0IHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBieSBjb25maWd1cmluZyB0aGUgYEpzb25TY2hlbWFGYWN0b3J5YCB3aXRoIGEgYEpzb25Ob2RlUmVhZGVyYCB0aGF0IHVzZXMgdGhlIGBMb2NhdGlvbkpzb25Ob2RlRmFjdG9yeUZhY3RvcnlgIGFuZCB1c2luZyBgSnNvbk5vZGVzLnRva2VuTG9jYXRpb25PZihpbnN0YW5jZU5vZGUpYC4KfCBFcnJvciAgICAgICAgICAgICB8IFRoZSBlcnJvci4KfCBEZXRhaWxzICAgICAgICAgICB8IEFkZGl0aW9uYWwgZGV0YWlscyB0aGF0IGNhbiBiZSBzZXQgYnkgY3VzdG9tIGtleXdvcmQgdmFsaWRhdG9yIGltcGxlbWVudGF0aW9ucy4gVGhpcyBpcyBub3QgdXNlZCBieSB0aGUgbGlicmFyeS4KCkFubm90YXRpb25zIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgoKfCBUeXBlICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uCnwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0KfCBWYWx1ZSAgICAgICAgICAgICB8IFRoZSBhbm5vdGF0aW9uIHZhbHVlIGdlbmVyYXRlZAoKIyMjIyMgTGluZSBhbmQgQ29sdW1uIEluZm9ybWF0aW9uCgpUaGUgbGlicmFyeSBjYW4gYmUgY29uZmlndXJlZCB0byBzdG9yZSBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gaW4gdGhlIGBKc29uTm9kZWAgaW5zdGFuY2VzIGZvciB0aGUgaW5zdGFuY2UgYW5kIHNjaGVtYSBub2Rlcy4gVGhpcyB3aWxsIGFkdmVyc2VseSBhZmZlY3QgcGVyZm9ybWFuY2UgYW5kIGlzIG5vdCBjb25maWd1cmVkIGJ5IGRlZmF1bHQuCgpUaGlzIGlzIGRvbmUgYnkgY29uZmlndXJpbmcgYSBgSnNvbk5vZGVSZWFkZXJgIHRoYXQgdXNlcyB0aGUgYExvY2F0aW9uSnNvbk5vZGVGYWN0b3J5RmFjdG9yeWBvbiB0aGUgYEpzb25TY2hlbWFGYWN0b3J5YC4gVGhlIGBKc29uTG9jYXRpb25gIGluZm9ybWF0aW9uIGNhbiB0aGVuIGJlIHJldHJpZXZlZCB1c2luZyBgSnNvbk5vZGVzLnRva2VuTG9jYXRpb25PZihqc29uTm9kZSlgLgoKYGBgamF2YQpTdHJpbmcgc2NoZW1hRGF0YSA9ICJ7XHJcbiIKICAgICAgICAgICAgICAgICsgIiAgXCIkaWRcIjogXCJodHRwczovL3NjaGVtYS9teXNjaGVtYVwiLFxyXG4iCiAgICAgICAgICAgICAgICArICIgIFwicHJvcGVydGllc1wiOiB7XHJcbiIKICAgICAgICAgICAgICAgICsgIiAgICBcInN0YXJ0RGF0ZVwiOiB7XHJcbiIKICAgICAgICAgICAgICAgICsgIiAgICAgIFwiZm9ybWF0XCI6IFwiZGF0ZVwiLFxyXG4iCiAgICAgICAgICAgICAgICArICIgICAgICBcIm1pbkxlbmd0aFwiOiA2XHJcbiIKICAgICAgICAgICAgICAgICsgIiAgICB9XHJcbiIKICAgICAgICAgICAgICAgICsgIiAgfVxyXG4iCiAgICAgICAgICAgICAgICArICJ9IjsKU3RyaW5nIGlucHV0RGF0YSA9ICJ7XHJcbiIKICAgICAgICAgICAgICAgICsgIiAgXCJzdGFydERhdGVcIjogXCIxXCJcclxuIgogICAgICAgICAgICAgICAgKyAifSI7Ckpzb25TY2hlbWFGYWN0b3J5IGZhY3RvcnkgPSBKc29uU2NoZW1hRmFjdG9yeS5nZXRJbnN0YW5jZShWZXJzaW9uRmxhZy5WMjAyMDEyLAogICAgICAgIGJ1aWxkZXIgLT4gYnVpbGRlci5qc29uTm9kZVJlYWRlcihKc29uTm9kZVJlYWRlci5idWlsZGVyKCkubG9jYXRpb25Bd2FyZSgpLmJ1aWxkKCkpKTsKU2NoZW1hVmFsaWRhdG9yc0NvbmZpZyBjb25maWcgPSBTY2hlbWFWYWxpZGF0b3JzQ29uZmlnLmJ1aWxkZXIoKS5idWlsZCgpOwpKc29uU2NoZW1hIHNjaGVtYSA9IGZhY3RvcnkuZ2V0U2NoZW1hKHNjaGVtYURhdGEsIElucHV0Rm9ybWF0LkpTT04sIGNvbmZpZyk7ClNldDxWYWxpZGF0aW9uTWVzc2FnZT4gbWVzc2FnZXMgPSBzY2hlbWEudmFsaWRhdGUoaW5wdXREYXRhLCBJbnB1dEZvcm1hdC5KU09OLCBleGVjdXRpb25Db250ZXh0IC0+IHsKICAgIGV4ZWN1dGlvbkNvbnRleHQuZ2V0RXhlY3V0aW9uQ29uZmlnKCkuc2V0Rm9ybWF0QXNzZXJ0aW9uc0VuYWJsZWQodHJ1ZSk7Cn0pOwpMaXN0PFZhbGlkYXRpb25NZXNzYWdlPiBsaXN0ID0gbWVzc2FnZXMuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKVmFsaWRhdGlvbk1lc3NhZ2UgZm9ybWF0ID0gbGlzdC5nZXQoMCk7Ckpzb25Mb2NhdGlvbiBmb3JtYXRJbnN0YW5jZU5vZGVUb2tlbkxvY2F0aW9uID0gSnNvbk5vZGVzLnRva2VuTG9jYXRpb25PZihmb3JtYXQuZ2V0SW5zdGFuY2VOb2RlKCkpOwpKc29uTG9jYXRpb24gZm9ybWF0U2NoZW1hTm9kZVRva2VuTG9jYXRpb24gPSBKc29uTm9kZXMudG9rZW5Mb2NhdGlvbk9mKGZvcm1hdC5nZXRTY2hlbWFOb2RlKCkpOwpWYWxpZGF0aW9uTWVzc2FnZSBtaW5MZW5ndGggPSBsaXN0LmdldCgxKTsKSnNvbkxvY2F0aW9uIG1pbkxlbmd0aEluc3RhbmNlTm9kZVRva2VuTG9jYXRpb24gPSBKc29uTm9kZXMudG9rZW5Mb2NhdGlvbk9mKG1pbkxlbmd0aC5nZXRJbnN0YW5jZU5vZGUoKSk7Ckpzb25Mb2NhdGlvbiBtaW5MZW5ndGhTY2hlbWFOb2RlVG9rZW5Mb2NhdGlvbiA9IEpzb25Ob2Rlcy50b2tlbkxvY2F0aW9uT2YobWluTGVuZ3RoLmdldFNjaGVtYU5vZGUoKSk7Cgphc3NlcnRFcXVhbHMoImZvcm1hdCIsIGZvcm1hdC5nZXRUeXBlKCkpOwphc3NlcnRFcXVhbHMoImRhdGUiLCBmb3JtYXQuZ2V0U2NoZW1hTm9kZSgpLmFzVGV4dCgpKTsKYXNzZXJ0RXF1YWxzKDUsIGZvcm1hdFNjaGVtYU5vZGVUb2tlbkxvY2F0aW9uLmdldExpbmVOcigpKTsKYXNzZXJ0RXF1YWxzKDE3LCBmb3JtYXRTY2hlbWFOb2RlVG9rZW5Mb2NhdGlvbi5nZXRDb2x1bW5OcigpKTsKYXNzZXJ0RXF1YWxzKCIxIiwgZm9ybWF0LmdldEluc3RhbmNlTm9kZSgpLmFzVGV4dCgpKTsKYXNzZXJ0RXF1YWxzKDIsIGZvcm1hdEluc3RhbmNlTm9kZVRva2VuTG9jYXRpb24uZ2V0TGluZU5yKCkpOwphc3NlcnRFcXVhbHMoMTYsIGZvcm1hdEluc3RhbmNlTm9kZVRva2VuTG9jYXRpb24uZ2V0Q29sdW1uTnIoKSk7CmFzc2VydEVxdWFscygibWluTGVuZ3RoIiwgbWluTGVuZ3RoLmdldFR5cGUoKSk7CmFzc2VydEVxdWFscygiNiIsIG1pbkxlbmd0aC5nZXRTY2hlbWFOb2RlKCkuYXNUZXh0KCkpOwphc3NlcnRFcXVhbHMoNiwgbWluTGVuZ3RoU2NoZW1hTm9kZVRva2VuTG9jYXRpb24uZ2V0TGluZU5yKCkpOwphc3NlcnRFcXVhbHMoMjAsIG1pbkxlbmd0aFNjaGVtYU5vZGVUb2tlbkxvY2F0aW9uLmdldENvbHVtbk5yKCkpOwphc3NlcnRFcXVhbHMoIjEiLCBtaW5MZW5ndGguZ2V0SW5zdGFuY2VOb2RlKCkuYXNUZXh0KCkpOwphc3NlcnRFcXVhbHMoMiwgbWluTGVuZ3RoSW5zdGFuY2VOb2RlVG9rZW5Mb2NhdGlvbi5nZXRMaW5lTnIoKSk7CmFzc2VydEVxdWFscygxNiwgbWluTGVuZ3RoSW5zdGFuY2VOb2RlVG9rZW5Mb2NhdGlvbi5nZXRDb2x1bW5OcigpKTsKYXNzZXJ0RXF1YWxzKDE2LCBtaW5MZW5ndGhJbnN0YW5jZU5vZGVUb2tlbkxvY2F0aW9uLmdldENvbHVtbk5yKCkpOwpgYGAKCgojIyMjIE91dHB1dCBmb3JtYXRzCgpUaGlzIGxpYnJhcnkgaW1wbGVtZW50cyB0aGUgRmxhZywgTGlzdCBhbmQgSGllcmFyY2hpY2FsIG91dHB1dCBmb3JtYXRzIGRlZmluZWQgaW4gdGhlIFtTcGVjaWZpY2F0aW9uIGZvciBNYWNoaW5lLVJlYWRhYmxlIE91dHB1dCBmb3IgSlNPTiBTY2hlbWEgVmFsaWRhdGlvbiBhbmQgQW5ub3RhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL2pzb24tc2NoZW1hLW9yZy9qc29uLXNjaGVtYS1zcGVjL2Jsb2IvODI3MDY1M2E5ZjU5ZmFkZDJkZjBkNzg5ZjIyZDQ4NjI1NDUwNWJiZS9qc29uc2NoZW1hLXZhbGlkYXRpb24tb3V0cHV0LW1hY2hpbmVzLm1kKS4KClRoZSBMaXN0IGFuZCBIaWVyYXJjaGljYWwgb3V0cHV0IGZvcm1hdHMgYXJlIHBhcnRpY3VsYXJseSBoZWxwZnVsIGZvciB1bmRlcnN0YW5kaW5nIGhvdyB0aGUgc3lzdGVtIGFycml2ZWQgYXQgYSBwYXJ0aWN1bGFyIHJlc3VsdC4KCnwgT3V0cHV0IEZvcm1hdCAgICAgfCBEZXNjcmlwdGlvbgp8LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tCnwgRGVmYXVsdCAgICAgICAgICAgfCBHZW5lcmF0ZXMgdGhlIGxpc3Qgb2YgYXNzZXJ0aW9ucy4KfCBCb29sZWFuICAgICAgICAgICB8IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWxpZGF0aW9uIGlzIHN1Y2Nlc3NmdWwuIE5vdGUgdGhhdCB0aGUgZmFpbCBmYXN0IG9wdGlvbiBpcyB0dXJuZWQgb24gYnkgZGVmYXVsdCBmb3IgdGhpcyBvdXRwdXQgZm9ybWF0Lgp8IEZsYWcgICAgICAgICAgICAgIHwgUmV0dXJucyBhbiBgT3V0cHV0RmxhZ2Agb2JqZWN0IHdpdGggYHZhbGlkYCBoYXZpbmcgYHRydWVgIGlmIHRoZSB2YWxpZGF0aW9uIGlzIHN1Y2Nlc3NmdWwuIE5vdGUgdGhhdCB0aGUgZmFpbCBmYXN0IG9wdGlvbiBpcyB0dXJuZWQgb24gYnkgZGVmYXVsdCBmb3IgdGhpcyBvdXRwdXQgZm9ybWF0Lgp8IExpc3QgICAgICAgICAgICAgIHwgUmV0dXJucyBhbiBgT3V0cHV0VW5pdGAgb2JqZWN0IHdpdGggYGRldGFpbHNgIHdpdGggYSBsaXN0IG9mIGBPdXRwdXRVbml0YCBvYmplY3RzIHdpdGggdGhlIGFzc2VydGlvbnMgYW5kIGFubm90YXRpb25zLiBOb3RlIHRoYXQgYW5ub3RhdGlvbnMgYXJlIG5vdCBjb2xsZWN0ZWQgYnkgZGVmYXVsdCBhbmQgaXQgaGFzIHRvIGJlIGVuYWJsZWQgYXMgaXQgd2lsbCBpbXBhY3QgcGVyZm9ybWFuY2UuCnwgSGllcmFyY2hpY2FsICAgICAgfCBSZXR1cm5zIGFuIGBPdXRwdXRVbml0YCBvYmplY3Qgd2l0aCBhIGhpZXJhcmNoeSBvZiBgT3V0cHV0VW5pdGAgb2JqZWN0cyBmb3IgdGhlIGV2YWx1YXRpb24gcGF0aCB3aXRoIHRoZSBhc3NlcnRpb25zIGFuZCBhbm5vdGF0aW9ucy4gTm90ZSB0aGF0IGFubm90YXRpb25zIGFyZSBub3QgY29sbGVjdGVkIGJ5IGRlZmF1bHQgYW5kIGl0IGhhcyB0byBiZSBlbmFibGVkIGFzIGl0IHdpbGwgaW1wYWN0IHBlcmZvcm1hbmNlLgoKVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBnZW5lcmF0ZSB0aGUgaGllcmFyY2hpY2FsIG91dHB1dCBmb3JtYXQgd2l0aCBhbm5vdGF0aW9uIGNvbGxlY3Rpb24gYW5kIHJlcG9ydGluZyB0dXJuZWQgb24gYW5kIGZvcm1hdCBhc3NlcnRpb25zIHR1cm5lZCBvbi4KCmBgYGphdmEKSnNvblNjaGVtYUZhY3RvcnkgZmFjdG9yeSA9IEpzb25TY2hlbWFGYWN0b3J5LmdldEluc3RhbmNlKFZlcnNpb25GbGFnLlYyMDIwMTIpOwpTY2hlbWFWYWxpZGF0b3JzQ29uZmlnIGNvbmZpZyA9IFNjaGVtYVZhbGlkYXRvcnNDb25maWcoKS5idWlsZGVyKCkuZm9ybWF0QXNzZXJ0aW9uc0VuYWJsZWQodHJ1ZSkuYnVpbGQoKTsKSnNvblNjaGVtYSBzY2hlbWEgPSBmYWN0b3J5LmdldFNjaGVtYShTY2hlbWFMb2NhdGlvbi5vZigiaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvc2NoZW1hcy9leGFtcGxlIiksIGNvbmZpZyk7CgpPdXRwdXRVbml0IG91dHB1dFVuaXQgPSBzY2hlbWEudmFsaWRhdGUoaW5wdXREYXRhLCBJbnB1dEZvcm1hdC5KU09OLCBPdXRwdXRGb3JtYXQuSElFUkFSQ0hJQ0FMLCBleGVjdXRpb25Db250ZXh0IC0+IHsKICAgIGV4ZWN1dGlvbkNvbnRleHQuZ2V0RXhlY3V0aW9uQ29uZmlnKCkuc2V0QW5ub3RhdGlvbkNvbGxlY3Rpb25FbmFibGVkKHRydWUpOwogICAgZXhlY3V0aW9uQ29udGV4dC5nZXRFeGVjdXRpb25Db25maWcoKS5zZXRBbm5vdGF0aW9uQ29sbGVjdGlvbkZpbHRlcihrZXl3b3JkIC0+IHRydWUpOwp9KTsKYGBgClRoZSBmb2xsb3dpbmcgaXMgc2FtcGxlIG91dHB1dCBmcm9tIHRoZSBIaWVyYXJjaGljYWwgZm9ybWF0LgoKYGBganNvbgp7CiAgInZhbGlkIiA6IGZhbHNlLAogICJldmFsdWF0aW9uUGF0aCIgOiAiIiwKICAic2NoZW1hTG9jYXRpb24iIDogImh0dHBzOi8vanNvbi1zY2hlbWEub3JnL3NjaGVtYXMvZXhhbXBsZSMiLAogICJpbnN0YW5jZUxvY2F0aW9uIiA6ICIiLAogICJkcm9wcGVkQW5ub3RhdGlvbnMiIDogewogICAgInByb3BlcnRpZXMiIDogWyAiZm9vIiwgImJhciIgXSwKICAgICJ0aXRsZSIgOiAicm9vdCIKICB9LAogICJkZXRhaWxzIiA6IFsgewogICAgInZhbGlkIiA6IGZhbHNlLAogICAgImV2YWx1YXRpb25QYXRoIiA6ICIvcHJvcGVydGllcy9mb28vYWxsT2YvMCIsCiAgICAic2NoZW1hTG9jYXRpb24iIDogImh0dHBzOi8vanNvbi1zY2hlbWEub3JnL3NjaGVtYXMvZXhhbXBsZSMvcHJvcGVydGllcy9mb28vYWxsT2YvMCIsCiAgICAiaW5zdGFuY2VMb2NhdGlvbiIgOiAiL2ZvbyIsCiAgICAiZXJyb3JzIiA6IHsKICAgICAgInJlcXVpcmVkIiA6ICJyZXF1aXJlZCBwcm9wZXJ0eSAndW5zcGVjaWZpZWQtcHJvcCcgbm90IGZvdW5kIgogICAgfQogIH0sIHsKICAgICJ2YWxpZCIgOiBmYWxzZSwKICAgICJldmFsdWF0aW9uUGF0aCIgOiAiL3Byb3BlcnRpZXMvZm9vL2FsbE9mLzEiLAogICAgInNjaGVtYUxvY2F0aW9uIiA6ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9zY2hlbWFzL2V4YW1wbGUjL3Byb3BlcnRpZXMvZm9vL2FsbE9mLzEiLAogICAgImluc3RhbmNlTG9jYXRpb24iIDogIi9mb28iLAogICAgImRyb3BwZWRBbm5vdGF0aW9ucyIgOiB7CiAgICAgICJwcm9wZXJ0aWVzIiA6IFsgImZvby1wcm9wIiBdLAogICAgICAidGl0bGUiIDogImZvby10aXRsZSIsCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBbICJmb28tcHJvcCIsICJvdGhlci1wcm9wIiBdCiAgICB9LAogICAgImRldGFpbHMiIDogWyB7CiAgICAgICJ2YWxpZCIgOiBmYWxzZSwKICAgICAgImV2YWx1YXRpb25QYXRoIiA6ICIvcHJvcGVydGllcy9mb28vYWxsT2YvMS9wcm9wZXJ0aWVzL2Zvby1wcm9wIiwKICAgICAgInNjaGVtYUxvY2F0aW9uIiA6ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9zY2hlbWFzL2V4YW1wbGUjL3Byb3BlcnRpZXMvZm9vL2FsbE9mLzEvcHJvcGVydGllcy9mb28tcHJvcCIsCiAgICAgICJpbnN0YW5jZUxvY2F0aW9uIiA6ICIvZm9vL2Zvby1wcm9wIiwKICAgICAgImVycm9ycyIgOiB7CiAgICAgICAgImNvbnN0IiA6ICJtdXN0IGJlIGEgY29uc3RhbnQgdmFsdWUgMSIKICAgICAgfSwKICAgICAgImRyb3BwZWRBbm5vdGF0aW9ucyIgOiB7CiAgICAgICAgInRpdGxlIiA6ICJmb28tcHJvcC10aXRsZSIKICAgICAgfQogICAgfSBdCiAgfSwgewogICAgInZhbGlkIiA6IGZhbHNlLAogICAgImV2YWx1YXRpb25QYXRoIiA6ICIvcHJvcGVydGllcy9iYXIvJHJlZiIsCiAgICAic2NoZW1hTG9jYXRpb24iIDogImh0dHBzOi8vanNvbi1zY2hlbWEub3JnL3NjaGVtYXMvZXhhbXBsZSMvJGRlZnMvYmFyIiwKICAgICJpbnN0YW5jZUxvY2F0aW9uIiA6ICIvYmFyIiwKICAgICJkcm9wcGVkQW5ub3RhdGlvbnMiIDogewogICAgICAicHJvcGVydGllcyIgOiBbICJiYXItcHJvcCIgXSwKICAgICAgInRpdGxlIiA6ICJiYXItdGl0bGUiCiAgICB9LAogICAgImRldGFpbHMiIDogWyB7CiAgICAgICJ2YWxpZCIgOiBmYWxzZSwKICAgICAgImV2YWx1YXRpb25QYXRoIiA6ICIvcHJvcGVydGllcy9iYXIvJHJlZi9wcm9wZXJ0aWVzL2Jhci1wcm9wIiwKICAgICAgInNjaGVtYUxvY2F0aW9uIiA6ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9zY2hlbWFzL2V4YW1wbGUjLyRkZWZzL2Jhci9wcm9wZXJ0aWVzL2Jhci1wcm9wIiwKICAgICAgImluc3RhbmNlTG9jYXRpb24iIDogIi9iYXIvYmFyLXByb3AiLAogICAgICAiZXJyb3JzIiA6IHsKICAgICAgICAibWluaW11bSIgOiAibXVzdCBoYXZlIGEgbWluaW11bSB2YWx1ZSBvZiAxMCIKICAgICAgfSwKICAgICAgImRyb3BwZWRBbm5vdGF0aW9ucyIgOiB7CiAgICAgICAgInRpdGxlIiA6ICJiYXItcHJvcC10aXRsZSIKICAgICAgfQogICAgfSBdCiAgfSBdCn0KYGBgCgojIyBDb25maWd1cmF0aW9uCgojIyMgRXhlY3V0aW9uIENvbmZpZ3VyYXRpb24KCnwgTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVmYXVsdCBWYWx1ZQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfCBgYW5ub3RhdGlvbkNvbGxlY3Rpb25FbmFibGVkYCAgfCBDb250cm9scyB3aGV0aGVyIGFubm90YXRpb25zIGFyZSBjb2xsZWN0ZWQgZHVyaW5nIHByb2Nlc3NpbmcuIE5vdGUgdGhhdCBjb2xsZWN0aW5nIGFubm90YXRpb25zIHdpbGwgYWR2ZXJzZWx5IGFmZmVjdCBwZXJmb3JtYW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgZmFsc2VgCnwgYGFubm90YXRpb25Db2xsZWN0aW9uRmlsdGVyYCAgIHwgVGhlIHByZWRpY2F0ZSB1c2VkIHRvIGNvbnRyb2wgd2hpY2gga2V5d29yZCB0byBjb2xsZWN0IGFuZCByZXBvcnQgYW5ub3RhdGlvbnMgZm9yLiBUaGlzIHJlcXVpcmVzIGBhbm5vdGF0aW9uQ29sbGVjdGlvbkVuYWJsZWRgIHRvIGJlIGB0cnVlYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGtleXdvcmQgLT4gZmFsc2VgCnwgYGxvY2FsZWAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGxvY2FsZSB0byB1c2UgZm9yIGdlbmVyYXRpbmcgbWVzc2FnZXMgaW4gdGhlIGBWYWxpZGF0aW9uTWVzc2FnZWAuIE5vdGUgdGhhdCB0aGlzIHZhbHVlIGlzIGNvcGllZCBmcm9tIGBTY2hlbWFWYWxpZGF0b3JzQ29uZmlnYCBmb3IgZWFjaCBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYExvY2FsZS5nZXREZWZhdWx0KClgCnwgYGZhaWxGYXN0YCAgICAgICAgICAgICAgICAgICAgIHwgV2hldGhlciB0byByZXR1cm4gZmFpbHVyZSBpbW1lZGlhdGVseSB3aGVuIGFuIGFzc2VydGlvbiBpcyBnZW5lcmF0ZWQuIE5vdGUgdGhhdCB0aGlzIHZhbHVlIGlzIGNvcGllZCBmcm9tIGBTY2hlbWFWYWxpZGF0b3JzQ29uZmlnYCBmb3IgZWFjaCBleGVjdXRpb24gYnV0IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGB0cnVlYCBmb3IgdGhlIEJvb2xlYW4gYW5kIEZsYWcgb3V0cHV0IGZvcm1hdHMuIHwgYGZhbHNlYAp8IGBmb3JtYXRBc3NlcnRpb25zRW5hYmxlZGAgICAgICB8IFRoZSBkZWZhdWx0IGlzIHRvIGdlbmVyYXRlIGZvcm1hdCBhc3NlcnRpb25zIGZyb20gRHJhZnQgNCB0byBEcmFmdCA3IGFuZCB0byBvbmx5IGdlbmVyYXRlIGFubm90YXRpb25zIGZyb20gRHJhZnQgMjAxOS0wOS4gU2V0dGluZyB0byBgdHJ1ZWAgb3IgYGZhbHNlYCB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBudWxsYAp8IGBkZWJ1Z0VuYWJsZWRgICAgICAgICAgICAgICAgICB8IENvbnRyb2xzIHdoZXRoZXIgZGVidWcgbG9nZ2luZyBpcyBlbmFibGVkIGZvciBsb2dnaW5nIHRoZSBub2RlIGluZm9ybWF0aW9uIHdoZW4gcHJvY2Vzc2luZy4gTm90ZSB0aGF0IHRoaXMgd2lsbCBnZW5lcmF0ZSBhIGxvdCBvZiBsb2dzIHRoYXQgd2lsbCBhZmZlY3QgcGVyZm9ybWFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBmYWxzZWAKCiMjIyBTY2hlbWEgVmFsaWRhdG9ycyBDb25maWd1cmF0aW9uCgp8IE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZWZhdWx0IFZhbHVlCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KfCBgYXBwbHlEZWZhdWx0c1N0cmF0ZWd5YCAgICAgICAgICAgICAgIHwgVGhlIHN0cmF0ZWd5IGZvciBhcHBseWluZyBkZWZhdWx0cyB3aGVuIHdhbGtpbmcgd2hlbiBtaXNzaW5nIG9yIG51bGwgbm9kZXMgYXJlIGVuY291bnRlcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYEFwcGx5RGVmYXVsdHNTdHJhdGVneS5FTVBUWV9BUFBMWV9ERUZBVUxUU19TVFJBVEVHWWAKfCBgY2FjaGVSZWZzYCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV2hldGhlciB0aGUgc2NoZW1hcyBsb2FkZWQgZnJvbSByZWZzIHdpbGwgYmUgY2FjaGVkIGFuZCByZXVzZWQgZm9yIHN1YnNlcXVlbnQgcnVucy4gU2V0dGluZyB0aGlzIHRvIGBmYWxzZWAgd2lsbCBhZmZlY3QgcGVyZm9ybWFuY2UgYnV0IG1heSBiZSBuZWNjZXNzYXJ5IHRvIHByZXZlbnQgaGlnaCBtZW1vcnkgdXNhZ2UgZm9yIHRoZSBjYWNoZSBpZiBtdWx0aXBsZSBuZXN0ZWQgYXBwbGljYXRvcnMgbGlrZSBgYW55T2ZgLCBgb25lT2ZgIGFuZCBgYWxsT2ZgIGFyZSB1c2VkLiAgfCBgdHJ1ZWAKfCBgZGlzY3JpbWluYXRvcktleXdvcmRFbmFibGVkYCAgICAgICAgIHwgV2hldGhlciB0aGUgYGRpc2NyaW1pbmF0b3JgIGtleXdvcmQgaXMgaGFuZGxlZCBhY2NvcmRpbmcgdG8gT3BlbkFQSSAzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGZhbHNlYAp8IGBlcnJvck1lc3NhZ2VLZXl3b3JkYCAgICAgICAgICAgICAgICAgfCBUaGUga2V5d29yZCB0byB1c2UgZm9yIGN1c3RvbSBlcnJvciBtZXNzYWdlcyBpbiB0aGUgc2NoZW1hLiBJZiBub3Qgc2V0IHRoaXMgZmVhdHVyZXMgaXMgZGlzYWJsZWQuIFRoaXMgaXMgdHlwaWNhbGx5IHNldCB0byBgZXJyb3JNZXNzYWdlYCBvciBgbWVzc2FnZWAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgbnVsbGAKfCBgZXhlY3V0aW9uQ29udGV4dEN1c3RvbWl6ZXJgICAgICAgICAgIHwgVGhpcyBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUgdGhlIGBFeGVjdXRpb25Db250ZXh0YCBnZW5lcmF0ZWQgYnkgdGhlIGBKc29uU2NoZW1hYCBmb3IgZWFjaCB2YWxpZGF0aW9uIHJ1bi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYG51bGxgCnwgYGZhaWxGYXN0YCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdoZXRoZXIgdG8gcmV0dXJuIGZhaWx1cmUgaW1tZWRpYXRlbHkgd2hlbiBhbiBhc3NlcnRpb24gaXMgZ2VuZXJhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBmYWxzZWAKfCBgZm9ybWF0QXNzZXJ0aW9uc0VuYWJsZWRgICAgICAgICAgICAgIHwgVGhlIGRlZmF1bHQgaXMgdG8gZ2VuZXJhdGUgZm9ybWF0IGFzc2VydGlvbnMgZnJvbSBEcmFmdCA0IHRvIERyYWZ0IDcgYW5kIHRvIG9ubHkgZ2VuZXJhdGUgYW5ub3RhdGlvbnMgZnJvbSBEcmFmdCAyMDE5LTA5LiBTZXR0aW5nIHRvIGB0cnVlYCBvciBgZmFsc2VgIHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYG51bGxgCnwgYGphdmFTZW1hbnRpY3NgICAgICAgICAgICAgICAgICAgICAgICB8IFdoZXRoZXIgamF2YSBzZW1hbnRpY3MgaXMgdXNlZCBmb3IgdGhlIGB0eXBlYCBrZXl3b3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBmYWxzZWAKfCBgbG9jYWxlYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGxvY2FsZSB0byB1c2UgZm9yIGdlbmVyYXRpbmcgbWVzc2FnZXMgaW4gdGhlIGBWYWxpZGF0aW9uTWVzc2FnZWAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYExvY2FsZS5nZXREZWZhdWx0KClgCnwgYGxvc3NsZXNzTmFycm93aW5nYCAgICAgICAgICAgICAgICAgICB8IFdoZXRoZXIgbG9zc2xlc3MgbmFycm93aW5nIGlzIHVzZWQgZm9yIHRoZSBgdHlwZWAga2V5d29yZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBmYWxzZWAKfCBgbWVzc2FnZVNvdXJjZWAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhpcyBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBsb2NhbGUgc3BlY2lmaWMgbWVzc2FnZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYERlZmF1bHRNZXNzYWdlU291cmNlLmdldEluc3RhbmNlKClgCnwgYG51bGxhYmxlS2V5d29yZEVuYWJsZWRgICAgICAgICAgICAgICB8IFdoZXRoZXIgdGhlIGBudWxsYWJsZWAga2V5d29yZCBpcyBoYW5kbGVkIGFjY29yZGluZyB0byBPcGVuQVBJIDMuMC4gVGhpcyBhZmZlY3RzIHRoZSBgZW51bWAgYW5kIGB0eXBlYCBrZXl3b3Jkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBmYWxzZWAKfCBgcGF0aFR5cGVgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIHBhdGggdHlwZSB0byB1c2UgZm9yIHJlcG9ydGluZyB0aGUgaW5zdGFuY2UgbG9jYXRpb24gYW5kIGV2YWx1YXRpb24gcGF0aC4gU2V0IHRvIGBQYXRoVHlwZS5KU09OX1BBVEhgIHRvIHVzZSBKU09OIFBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYFBhdGhUeXBlLkpTT05fUE9JTlRFUmAKfCBgcHJlbG9hZEpzb25TY2hlbWFgICAgICAgICAgICAgICAgICAgIHwgV2hldGhlciB0aGUgc2NoZW1hIHdpbGwgYmUgcHJlbG9hZGVkIGJlZm9yZSBwcm9jZXNzaW5nIGFueSBpbnB1dC4gVGhpcyB3aWxsIHVzZSBtZW1vcnkgYnV0IHRoZSBleGVjdXRpb24gb2YgdGhlIHZhbGlkYXRpb24gd2lsbCBiZSBmYXN0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYHRydWVgCnwgYHByZWxvYWRKc29uU2NoZW1hUmVmTWF4TmVzdGluZ0RlcHRoYCB8IFRoZSBtYXggZGVwdGggb2YgdGhlIGV2YWx1YXRpb24gcGF0aCB0byBwcmVsb2FkIHdoZW4gcHJlbG9hZGluZyByZWZzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGA0MGAKfCBgcmVhZE9ubHlgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV2hldGhlciBzY2hlbWEgaXMgcmVhZCBvbmx5LiBUaGlzIGFmZmVjdHMgdGhlIGByZWFkT25seWAga2V5d29yZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYG51bGxgCnwgYHJlZ3VsYXJFeHByZXNzaW9uRmFjdG9yeWAgICAgICAgICAgICB8IFRoZSBmYWN0b3J5IHRvIHVzZSB0byBjcmVhdGUgcmVndWxhciBleHByZXNzaW9ucyBmb3IgaW5zdGFuY2UgYEpvbmlSZWd1bGFyRXhwcmVzc2lvbkZhY3RvcnlgIG9yIGBHcmFhbEpTUmVndWxhckV4cHJlc3Npb25GYWN0b3J5YC4gVGhpcyByZXF1aXJlcyB0aGUgZGVwZW5kZW5jeSB0byBiZSBtYW51YWxseSBhZGRlZCB0byB0aGUgcHJvamVjdCBvciBhIGBDbGFzc05vdEZvdW5kRXhjZXB0aW9uYCB3aWxsIGJlIHRocm93bi4gfCBgSkRLUmVndWxhckV4cHJlc3Npb25GYWN0b3J5LmdldEluc3RhbmNlKClgCnwgYHNjaGVtYUlkVmFsaWRhdG9yYCAgICAgICAgICAgICAgICAgICB8IFRoaXMgaXMgdXNlZCB0byBjdXN0b21pemUgaG93IHRoZSBgJGlkYCB2YWx1ZXMgYXJlIHZhbGlkYXRlZC4gTm90ZSB0aGF0IHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsbG93cyBub24tZW1wdHkgZnJhZ21lbnRzIHdoZXJlIG5vIGJhc2UgSVJJIGlzIHNwZWNpZmllZCBhbmQgYWxzbyBhbGxvd3Mgbm9uLWFic29sdXRlIElSSSBgJGlkYCB2YWx1ZXMgaW4gdGhlIHJvb3Qgc2NoZW1hLiAgICB8IGBKc29uU2NoZW1hSWRWYWxpZGF0b3IuREVGQVVMVGAKfCBgc3RyaWN0YCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhpcyBpcyBzZXQgd2hldGhlciBrZXl3b3JkcyBhcmUgc3RyaWN0IGluIHRoZWlyIHZhbGlkYXRpb24uIFdoYXQgdGhpcyBkb2VzIGRlcGVuZHMgb24gdGhlIGluZGl2aWR1YWwgdmFsaWRhdG9ycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBgdHlwZUxvb3NlYCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgV2hldGhlciB0eXBlcyBhcmUgaW50ZXJwcmV0ZWQgaW4gYSBsb29zZSBtYW5uZXIuIElmIHNldCB0byB0cnVlLCBhIHNpbmdsZSB2YWx1ZSBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYSBzaXplIDEgYXJyYXkuIFN0cmluZ3MgbWF5IGFsc28gYmUgaW50ZXJwcmV0ZWQgYXMgbnVtYmVyLCBpbnRlZ2VyIG9yIGJvb2xlYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGZhbHNlYAp8IGB3cml0ZU9ubHlgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBXaGV0aGVyIHNjaGVtYSBpcyB3cml0ZSBvbmx5LiBUaGlzIGFmZmVjdHMgdGhlIGB3cml0ZU9ubHlgIGtleXdvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgbnVsbGAKCiMjIFBlcmZvcm1hbmNlIENvbnNpZGVyYXRpb25zCgpXaGVuIHRoZSBsaWJyYXJ5IGNyZWF0ZXMgYSBzY2hlbWEgZnJvbSB0aGUgc2NoZW1hIGZhY3RvcnksIGl0IGNyZWF0ZXMgYSBkaXN0aW5jdCB2YWxpZGF0b3IgaW5zdGFuY2UgZm9yIGVhY2ggbG9jYXRpb24gb24gdGhlIGV2YWx1YXRpb24gcGF0aC4gVGhpcyBtZWFucyBpZiB0aGVyZSBhcmUgZGlmZmVyZW50IGAkcmVmYCB0aGF0IHJlZmVyZW5jZSB0aGUgc2FtZSBzY2hlbWEgbG9jYXRpb24sIGRpZmZlcmVudCB2YWxpZGF0b3IgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIGZvciBlYWNoIGV2YWx1YXRpb24gcGF0aC4KCldoZW4gdGhlIHNjaGVtYSBpcyBjcmVhdGVkLCB0aGUgbGlicmFyeSB3aWxsIGJ5IGRlZmF1bHQgYXV0b21hdGljYWxseSBwcmVsb2FkIGFsbCB0aGUgdmFsaWRhdG9ycyBuZWVkZWQgYW5kIHJlc29sdmUgcmVmZXJlbmNlcy4gVGhpcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgYHByZWxvYWRKc29uU2NoZW1hYCBvcHRpb24gaW4gdGhlIGBTY2hlbWFWYWxpZGF0b3JzQ29uZmlnYC4gQXQgdGhpcyBwb2ludCwgbm8gZXhjZXB0aW9ucyB3aWxsIGJlIHRocm93biBpZiBhIHJlZmVyZW5jZSBjYW5ub3QgYmUgcmVzb2x2ZWQuIElmIHRoZXJlIGFyZSByZWZlcmVuY2VzIHRoYXQgYXJlIGN5Y2xpYywgb25seSB0aGUgZmlyc3QgY3ljbGUgd2lsbCBiZSBwcmVsb2FkZWQuIElmIHlvdSB3aXNoIHRvIGVuc3VyZSB0aGF0IHJlbW90ZSByZWZlcmVuY2VzIGNhbiBhbGwgYmUgcmVzb2x2ZWQsIHRoZSBgaW5pdGlhbGl6ZVZhbGlkYXRvcnNgIG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgb24gdGhlIGBKc29uU2NoZW1hYCB3aGljaCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgcmVmZXJlbmNlcyB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZC4KCkluc3RhbmNlcyBmb3IgYEpzb25TY2hlbWFGYWN0b3J5YCBhbmQgdGhlIGBKc29uU2NoZW1hYCBjcmVhdGVkIGZyb20gaXQgYXJlIGRlc2lnbmVkIHRvIGJlIHRocmVhZC1zYWZlIHByb3ZpZGVkIGl0cyBjb25maWd1cmF0aW9uIGlzIG5vdCBtb2RpZmllZCBhbmQgc2hvdWxkIGJlIGNhY2hlZCBhbmQgcmV1c2VkLiBOb3QgcmV1c2luZyB0aGUgYEpzb25TY2hlbWFgIG1lYW5zIHRoYXQgdGhlIHNjaGVtYSBkYXRhIG5lZWRzIHRvIGJlIHJlcGVhdGVkIHBhcnNlZCB3aXRoIHZhbGlkYXRvciBpbnN0YW5jZXMgY3JlYXRlZCBhbmQgcmVmZXJlbmNlcyByZXNvbHZlZC4gV2hlbiByZWZlcmVuY2VzIGFyZSByZXNvbHZlZCwgdGhlIHZhbGlkYXRvcnMgY3JlYXRlZCB3aWxsIGJlIGNhY2hlZC4gRm9yIHNjaGVtYXMgdGhhdCBoYXZlIGRlZXBseSBuZXN0ZWQgcmVmZXJlbmNlcywgdGhlIG1lbW9yeSBuZWVkZWQgZm9yIHRoZSB2YWxpZGF0b3JzIG1heSBiZSB2ZXJ5IGhpZ2gsIGluIHdoaWNoIGNhc2UgdGhlIGNhY2hpbmcgbWF5IG5lZWQgdG8gYmUgZGlzYWJsZWQgdXNpbmcgdGhlIGBjYWNoZVJlZnNgIG9wdGlvbiBpbiB0aGUgYFNjaGVtYVZhbGlkYXRvcnNDb25maWdgLiBEaXNhYmxpbmcgdGhpcyB3aWxsIG1lYW4gdGhlIHZhbGlkYXRvcnMgZnJvbSB0aGUgcmVmZXJlbmNlcyBuZWVkIHRvIGJlIHJlLWNyZWF0ZWQgZm9yIGVhY2ggdmFsaWRhdGlvbiBydW4gd2hpY2ggd2lsbCBpbXBhY3QgcGVyZm9ybWFuY2UuCgpDb2xsZWN0aW5nIGFubm90YXRpb25zIHdpbGwgYWR2ZXJzZWx5IGFmZmVjdCB2YWxpZGF0aW9uIHBlcmZvcm1hbmNlLgoKVGhlIGVhcmxpZXIgZHJhZnQgc3BlY2lmaWNhdGlvbnMgY29udGFpbiBsZXNzIGtleXdvcmRzIHRoYXQgY2FuIHBvdGVudGlhbGx5IGltcGFjdCBwZXJmb3JtYW5jZS4gRm9yIGluc3RhbmNlIHRoZSB1c2Ugb2YgdGhlIGB1bmV2YWx1YXRlZFByb3BlcnRpZXNgIG9yIGB1bmV2YWx1YXRlZEl0ZW1zYCBrZXl3b3JkIHdpbGwgdHJpZ2dlciBhbm5vdGF0aW9uIGNvbGxlY3Rpb24gaW4gdGhlIHJlbGF0ZWQgdmFsaWRhdG9ycywgc3VjaCBhcyB0aGUgYHByb3BlcnRpZXNgIG9yIGBpdGVtc2AgdmFsaWRhdG9ycy4KClRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHVzaW5nIGEgc2NoZW1hIHdpdGggYSBsYXRlciBkcmFmdCBzcGVjaWZpY2F0aW9uIHdpbGwgYXV0b21hdGljYWxseSBjYXVzZSBhIHBlcmZvcm1hbmNlIGltcGFjdC4gRm9yIGluc3RhbmNlLCB0aGUgYHByb3BlcnRpZXNgIHZhbGlkYXRvciB3aWxsIHBlcmZvcm0gY2hlY2tzIHRvIGRldGVybWluZSBpZiBhbm5vdGF0aW9ucyBuZWVkIHRvIGJlIGNvbGxlY3RlZCwgYW5kIGNoZWNrcyBpZiB0aGUgbWV0YS1zY2hlbWEgY29udGFpbnMgdGhlIGB1bmV2YWx1YXRlZFByb3BlcnRpZXNgIGtleXdvcmQgYW5kIHdoZXRoZXIgdGhlIGB1bmV2YWx1YXRlZFByb3BlcnRpZXNgIGtleXdvcmQgZXhpc3RzIGFkamFjZW50IHRoZSBldmFsdWF0aW9uIHBhdGguCgojIyBTZWN1cml0eSBDb25zaWRlcmF0aW9ucwoKVGhlIGxpYnJhcnkgYXNzdW1lcyB0aGF0IHRoZSBzY2hlbWFzIGJlaW5nIGxvYWRlZCBhcmUgdHJ1c3RlZC4gVGhpcyBzZWN1cml0eSBtb2RlbCBhc3N1bWVzIHRoZSB1c2UgY2FzZSB3aGVyZSB0aGUgc2NoZW1hcyBhcmUgYnVuZGxlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiBvbiB0aGUgY2xhc3NwYXRoLgoKfCBJc3N1ZSAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTWl0aWdhdGlvbgp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnwgU2NoZW1hIExvYWRpbmcgICAgICAgIHwgVGhlIGxpYnJhcnkgYnkgZGVmYXVsdCB3aWxsIGxvYWQgc2NoZW1hcyBmcm9tIHRoZSBjbGFzc3BhdGggYW5kIG92ZXIgdGhlIGludGVybmV0IGlmIG5lZWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgYERpc2FsbG93U2NoZW1hTG9hZGVyYCBjYW4gYmUgY29uZmlndXJlZCB0byBub3QgYWxsb3cgc2NoZW1hIHJldHJpZXZhbC4gQWx0ZXJuYXRpdmVseSBhbiBgQWxsb3dTY2hlbWFMb2FkZXJgIGNhbiBiZSBjb25maWd1cmVkIHRvIHJlc3RyaWN0IHRoZSByZXRyaWV2YWwgSVJJcyB0aGF0IGFyZSBhbGxvd2VkLgp8IFNjaGVtYSBDYWNoaW5nICAgICAgICB8IFRoZSBsaWJyYXJ5IGJ5IGRlZmF1bHQgcHJlbG9hZHMgYW5kIGNhY2hlcyByZWZlcmVuY2VzIHdoZW4gbG9hZGluZyBzY2hlbWFzLiBXaGlsZSB0aGVyZSBpcyBhIG1heCBuZXN0aW5nIGRlcHRoIHdoZW4gcHJlbG9hZGluZyBzY2hlbWFzIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCBhIHNjaGVtYSB0aGF0IGhhcyBhIGZhbiBvdXQgdGhhdCBjb25zdW1lcyBhIGxvdCBvZiBtZW1vcnkgZnJvbSB0aGUgc2VydmVyLiAgfCBTZXQgYGNhY2hlUmVmc2Agb3B0aW9uIGluIGBTY2hlbWFWYWxpZGF0b3JzQ29uZmlnYCB0byBmYWxzZS4KfCBSZWd1bGFyIEV4cHJlc3Npb25zICAgfCBUaGUgbGlicmFyeSBkb2VzIG5vdCB2YWxpZGF0ZSBpZiBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBzdXNjZXB0YWJsZSB0byBkZW5pYWwgb2Ygc2VydmljZSAoW1JlRG9TXShodHRwczovL293YXNwLm9yZy93d3ctY29tbXVuaXR5L2F0dGFja3MvUmVndWxhcl9leHByZXNzaW9uX0RlbmlhbF9vZl9TZXJ2aWNlXy1fUmVEb1MpKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQW4gYEFsbG93UmVndWxhckV4cHJlc3Npb25GYWN0b3J5YCBjYW4gYmUgY29uZmlndXJlZCB0byBwZXJmb3JtIHZhbGlkYXRpb24gb24gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdGhhdCBhcmUgYWxsb3dlZC4KfCBWYWxpZGF0aW9uIEVycm9ycyAgICAgfCBUaGUgbGlicmFyeSBieSBkZWZhdWx0IGF0dGVtcHRzIHRvIHJldHVybiBhbGwgdmFsaWRhdGlvbiBlcnJvcnMuIFRoZSB1c2Ugb2YgYXBwbGljYXRvcnMgc3VjaCBhcyBgYWxsT2ZgIHdpdGggYSBsYXJnZSBudW1iZXIgb2Ygc2NoZW1hcyBtYXkgcmVzdWx0IGluIGEgbGFyZ2UgbnVtYmVyIG9mIHZhbGlkYXRpb24gZXJyb3JzIHRha2luZyB1cCBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2V0IGBmYWlsRmFzdGAgb3B0aW9uIGluIGBTY2hlbWFWYWxpZGF0b3JzQ29uZmlnYCB0byBpbW1lZGlhdGVseSByZXR1cm4gd2hlbiB0aGUgZmlyc3QgZXJyb3IgaXMgZW5jb3VudGVyZWQuIFRoZSBgT3V0cHV0Rm9ybWF0LkJPT0xFQU5gIG9yIGBPdXRwdXRGb3JtYXQuRkxBR2AgYWxzbyBjYW4gYmUgdXNlZC4KCiMjIFtRdWljayBTdGFydF0oZG9jL3F1aWNrc3RhcnQubWQpCgojIyBbQ3VzdG9taXppbmcgU2NoZW1hIFJldHJpZXZhbF0oZG9jL3NjaGVtYS1yZXRyaWV2YWwubWQpCgojIyBbQ3VzdG9taXppbmcgTWV0YS1TY2hlbWFzLCBWb2NhYnVsYXJpZXMsIEtleXdvcmRzIGFuZCBGb3JtYXRzXShkb2MvY3VzdG9tLW1ldGEtc2NoZW1hLm1kKQoKIyMgW09wZW5BUEkgU3BlY2lmaWNhdGlvbl0oZG9jL29wZW5hcGkubWQpCgojIyBbVmFsaWRhdG9yc10oZG9jL3ZhbGlkYXRvcnMubWQpCgojIyBbQ29uZmlndXJhdGlvbl0oZG9jL2NvbmZpZy5tZCkKCiMjIFtTcGVjaWZpY2F0aW9uIFZlcnNpb25dKGRvYy9zcGVjdmVyc2lvbi5tZCkKCiMjIFtZQU1MIFZhbGlkYXRpb25dKGRvYy95YW1sLm1kKQoKIyMgW0NvbGxlY3RvciBDb250ZXh0XShkb2MvY29sbGVjdG9yLWNvbnRleHQubWQpCgojIyBbSlNPTiBTY2hlbWEgV2Fsa2VycyBhbmQgV2Fsa0xpc3RlbmVyc10oZG9jL3dhbGtlcnMubWQpCgojIyBbUmVndWxhciBFeHByZXNzaW9uc10oZG9jL2VjbWEtMjYyLm1kKQoKIyMgW0N1c3RvbSBFcnJvciBNZXNzYWdlc10oZG9jL2N1c3QtbXNnLm1kKQoKIyMgW011bHRpcGxlIExhbmd1YWdlXShkb2MvbXVsdGlwbGUtbGFuZ3VhZ2UubWQpCgojIyBbTWV0YVNjaGVtYSBWYWxpZGF0aW9uXShkb2MvbWV0YXNjaGVtYS12YWxpZGF0aW9uLm1kKQoKIyMgW1ZhbGlkYXRpbmcgUkZDIDMzMzkgZHVyYXRpb25zXShkb2MvZHVyYXRpb24ubWQpCgojIyBQcm9qZWN0cwoKVGhlIFtsaWdodC1yZXN0LTRqXShodHRwczovL2dpdGh1Yi5jb20vbmV0d29ya250L2xpZ2h0LXJlc3QtNGopLCBbbGlnaHQtZ3JhcGhxbC00al0oaHR0cHM6Ly9naXRodWIuY29tL25ldHdvcmtudC9saWdodC1ncmFwaHFsLTRqKSBhbmQgW2xpZ2h0LWh5YnJpZC00al0oaHR0cHM6Ly9naXRodWIuY29tL25ldHdvcmtudC9saWdodC1oeWJyaWQtNGopIHVzZSB0aGlzIGxpYnJhcnkgdG8gdmFsaWRhdGUgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGJhc2VkIG9uIHRoZSBzcGVjaWZpY2F0aW9ucy4gSWYgeW91IGFyZSB1c2luZyBvdGhlciBmcmFtZXdvcmtzIGxpa2UgU3ByaW5nIEJvb3QsIHlvdSBjYW4gdXNlIHRoZSBbT3BlbkFwaVZhbGlkYXRvcl0oaHR0cHM6Ly9naXRodWIuY29tL21zZXJ2aWNldGVjaC9vcGVuYXBpLXNjaGVtYS12YWxpZGF0aW9uKSwgYSBnZW5lcmljIE9wZW5BUEkgMy4wIHZhbGlkYXRvciBiYXNlZCBvbiB0aGUgT3BlbkFQSSAzLjAgc3BlY2lmaWNhdGlvbi4KCklmIHlvdSBoYXZlIGEgcHJvamVjdCB1c2luZyB0aGlzIGxpYnJhcnksIHBsZWFzZSBzdWJtaXQgYSBQUiB0byBhZGQgeW91ciBwcm9qZWN0IGJlbG93LgoKIyMgQ29udHJpYnV0b3JzCgpUaGFua3MgdG8gdGhlIGZvbGxvd2luZyBwZW9wbGUgd2hvIGhhdmUgY29udHJpYnV0ZWQgdG8gdGhpcyBwcm9qZWN0LiBJZiB5b3UgYXJlIHVzaW5nIHRoaXMgbGlicmFyeSwgcGxlYXNlIGNvbnNpZGVyIHRvIGJlIGEgc3BvbnNvciBmb3Igb25lIG9mIHRoZSBjb250cmlidXRvcnMuCgpbQHN0ZXZlaHVdKGh0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycy9zdGV2ZWh1KQoKW0BwcmFzaGFudGgtY2hhaXRhbnlhXShodHRwczovL2dpdGh1Yi5jb20vcHJhc2hhbnRoLWNoYWl0YW55YSkKCltAZmR1dHRvbl0oaHR0cHM6Ly9naXRodWIuY29tL2ZkdXR0b24pCgpbQHZhbGZpcnN0XShodHRwczovL2dpdGh1Yi5jb20vdmFsZmlyc3QpCgpbQEJhbGxvb25XZW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9CYWxsb29uV2VuKQoKW0BqaWFjaGVuMTEyMF0oaHR0cHM6Ly9naXRodWIuY29tL2ppYWNoZW4xMTIwKQoKW0BkZG9icmluXShodHRwczovL2dpdGh1Yi5jb20vZGRvYnJpbikKCltAZXNrYWJldHhlXShodHRwczovL2dpdGh1Yi5jb20vZXNrYWJldHhlKQoKW0BlaHJtYW5uXShodHRwczovL2dpdGh1Yi5jb20vZWhybWFubikKCltAcHJhc2hhbnRoam9zXShodHRwczovL2dpdGh1Yi5jb20vcHJhc2hhbnRoam9zKQoKW0BTdWJoYWppdGRhczI5OF0oaHR0cHM6Ly9naXRodWIuY29tL1N1Ymhhaml0ZGFzMjk4KQoKW0BGV2llc25lcl0oaHR0cHM6Ly9naXRodWIuY29tL0ZXaWVzbmVyKQoKW0ByaHdvb2RdKGh0dHBzOi8vZ2l0aHViLmNvbS9yaHdvb2QpCgpbQGphd2FmZl0oaHR0cHM6Ly9naXRodWIuY29tL2phd2FmZikKCltAbml0aW4xODkxXShodHRwczovL2dpdGh1Yi5jb20vbml0aW4xODkxKQoKCkZvciBhbGwgY29udHJpYnV0b3JzLCBwbGVhc2UgdmlzaXQgaHR0cHM6Ly9naXRodWIuY29tL25ldHdvcmtudC9qc29uLXNjaGVtYS12YWxpZGF0b3IvZ3JhcGhzL2NvbnRyaWJ1dG9ycwoKSWYgeW91IGFyZSBhIGNvbnRyaWJ1dG9yLCBwbGVhc2Ugam9pbiB0aGUgW0dpdEh1YiBTcG9uc29yc10oaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzKSBhbmQgc3dpdGNoIHRoZSBsaW5rIHRvIHlvdXIgc3BvbnNvcnMgZGFzaGJvYXJkIHZpYSBhIFBSLgoKIyMgU3BvbnNvcnMKCgojIyMgSW5kaXZpZHVhbCBTcG9uc29ycwoKCiMjIyBDb3Jwb3JhdGlvbiBTcG9uc29ycwo=
+ readmeEtag: '"a9398d82af5ff2cdcd780db3c8346b63b70031eb"'
+ readmeLastModified: Wed, 15 Jan 2025 02:29:39 GMT
repositoryId: 68291529
description: >-
A fast Java JSON schema validator that supports draft V4, V6, V7, V2019-09
and V2020-12
created: '2016-09-15T12:24:16Z'
- updated: '2025-01-14T00:08:54Z'
+ updated: '2025-01-15T02:29:45Z'
language: Java
archived: false
stars: 873
@@ -8243,8 +8243,8 @@
owner: networknt
logo: https://avatars.githubusercontent.com/u/8740739?v=4
license: Apache-2.0
- repoEtag: '"a274556649c9b983da94bf1c19167ca9da3e3dbdc85b2baf1b8686106710fd62"'
- repoLastModified: Tue, 14 Jan 2025 00:08:54 GMT
+ repoEtag: '"61d7c7a9915b38cc1c675cd8c288a38598330fb321584caaad58c49e4497f1fc"'
+ repoLastModified: Wed, 15 Jan 2025 02:29:45 GMT
foundInMaster: true
category: Parsers
id: 69c6f349899d198b4045edb7ffa3fb74
@@ -8259,17 +8259,17 @@
repositoryId: 113924383
description: Utility for comparing two OpenAPI specifications.
created: '2017-12-12T00:39:30Z'
- updated: '2025-01-12T07:00:56Z'
+ updated: '2025-01-14T16:55:24Z'
language: Java
archived: false
- stars: 854
+ stars: 855
watchers: 19
forks: 155
owner: OpenAPITools
logo: https://avatars.githubusercontent.com/u/37325267?v=4
license: Apache-2.0
- repoEtag: '"d70632462c78673841b3813aed369ac3c4755b98be0ebdc3917646b06b02450b"'
- repoLastModified: Sun, 12 Jan 2025 07:00:56 GMT
+ repoEtag: '"0e82bbbaadabad8feea76d4c6d2c0f4152f71f6c1e2d50cfbbed608dec780639"'
+ repoLastModified: Tue, 14 Jan 2025 16:55:24 GMT
foundInMaster: true
category: Parsers
id: c128907e9d949a67c1bda0e0ceda755a
@@ -8345,17 +8345,17 @@
A collection of Editors, Linters, Parsers, Code Generators,
Documentation, Testing
created: '2017-12-15T22:51:00Z'
- updated: '2025-01-08T08:24:42Z'
+ updated: '2025-01-14T06:32:11Z'
language: HTML
archived: false
- stars: 714
+ stars: 713
watchers: 30
forks: 331
owner: apisyouwonthate
logo: https://avatars.githubusercontent.com/u/35378327?v=4
license: MIT
- repoEtag: '"df4fc766760bad1b3450aa9c9f320c26eb1184368740e9e2d91d4ce0518d9d68"'
- repoLastModified: Wed, 08 Jan 2025 08:24:42 GMT
+ repoEtag: '"95c0eeb9e8436caa2a8a0feadc07c3880f381df15a8805e4adef13c6e6166fc2"'
+ repoLastModified: Tue, 14 Jan 2025 06:32:11 GMT
foundInMaster: true
category: Description Validators
id: bf8b6a3a6298d701eabc857d42d5c371
@@ -8442,17 +8442,17 @@
🤖 Generator for GH repo to help you manage the OpenAPI definition
lifecycle
created: '2016-05-16T22:45:23Z'
- updated: '2025-01-11T00:38:02Z'
+ updated: '2025-01-14T03:32:06Z'
language: JavaScript
archived: false
- stars: 678
+ stars: 677
watchers: 26
forks: 106
owner: Redocly
logo: https://avatars.githubusercontent.com/u/32099856?v=4
license: MIT
- repoEtag: '"4c4f9af3936950ddba93ab48f1cedc4715dd09a428c855a40ae231d8ed0050ad"'
- repoLastModified: Sat, 11 Jan 2025 00:38:02 GMT
+ repoEtag: '"703afc52f6e1460cbe88632dd9813cf550a06ecafeef3d7933dfb90778756640"'
+ repoLastModified: Tue, 14 Jan 2025 03:32:06 GMT
foundInMaster: true
v3_1: true
category:
@@ -8475,17 +8475,17 @@
Query, provision and operate Cloud and SaaS resources and APIs using an
extensible SQL based framework
created: '2022-01-03T08:20:06Z'
- updated: '2025-01-13T18:25:34Z'
+ updated: '2025-01-14T15:25:52Z'
language: Go
archived: false
- stars: 669
+ stars: 679
watchers: 13
forks: 66
owner: stackql
logo: https://avatars.githubusercontent.com/u/95105302?v=4
license: MIT
- repoEtag: '"27bff51c0f69bb39440fdf2fedcab5960aab91df851fb09b5e0c62aa5aec5430"'
- repoLastModified: Mon, 13 Jan 2025 18:25:34 GMT
+ repoEtag: '"257ba6761c5ec5fde7be9ae88630fd340c36ef6e2b89f55453b5451bbe22ce4c"'
+ repoLastModified: Tue, 14 Jan 2025 15:25:52 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -8501,7 +8501,7 @@
😎 A list of awesome projects related to OpenAPI 3.0.x, curated by the
community
created: '2017-03-02T19:31:41Z'
- updated: '2025-01-13T15:06:28Z'
+ updated: '2025-01-15T00:02:53Z'
language: JavaScript
archived: false
stars: 644
@@ -8510,8 +8510,8 @@
owner: APIs-guru
logo: https://avatars.githubusercontent.com/u/10975548?v=4
license: BSD-3-Clause
- repoEtag: '"ac945e8acfc9bbefa07feea94a3276b33bc17afb1c4bfc5b6f112744dd0e549e"'
- repoLastModified: Mon, 13 Jan 2025 15:06:28 GMT
+ repoEtag: '"765eda8b13a84539a09c413fcf07e9aa32be8efff15e01f41f4e74fbc361cd1c"'
+ repoLastModified: Wed, 15 Jan 2025 00:02:53 GMT
foundInMaster: true
category: Parsers
id: 64d4029fd6b82879b746263cac7ce274
@@ -8579,16 +8579,16 @@
repositoryId: 417437020
description: A tool for generating code base on an OpenAPI schema.
created: '2021-10-15T09:08:51Z'
- updated: '2025-01-14T03:22:19Z'
+ updated: '2025-01-15T01:56:16Z'
language: TypeScript
archived: false
- stars: 528
+ stars: 529
watchers: 5
forks: 67
owner: fabien0102
logo: https://avatars.githubusercontent.com/u/1761469?v=4
- repoEtag: '"675eadc40b44ca9f8a216d3e918bdceab962a3a3c4bdbaa8a89ab80075281404"'
- repoLastModified: Tue, 14 Jan 2025 03:22:19 GMT
+ repoEtag: '"04fa17d09ae4ef82355c7caf8311d965f345bc3e1aaf5da6ca4604358b8333b7"'
+ repoLastModified: Wed, 15 Jan 2025 01:56:16 GMT
category: Testing
foundInMaster: true
- source: openapi3 tags
@@ -8602,17 +8602,17 @@
repositoryId: 273958287
description: 🦕 OpenAPI plugin for generating API reference docs in Docusaurus.
created: '2020-06-21T18:06:52Z'
- updated: '2025-01-07T22:50:08Z'
+ updated: '2025-01-14T12:48:16Z'
language: TypeScript
archived: false
- stars: 514
+ stars: 515
watchers: 9
forks: 82
owner: cloud-annotations
logo: https://avatars.githubusercontent.com/u/47490031?v=4
license: MIT
- repoEtag: '"b68399b125e35af04ded6c605b330eb5aeab6ac380580aa6184aba90a37b1a28"'
- repoLastModified: Tue, 07 Jan 2025 22:50:08 GMT
+ repoEtag: '"c786f92d6c39ec25c2538f051e59a8f2c29295f9e7ea170fb11a23fc84025069"'
+ repoLastModified: Tue, 14 Jan 2025 12:48:16 GMT
foundInMaster: true
category: SDK
id: 5acf9bbe5338a800925f2b0e23eca0a1
@@ -8712,17 +8712,17 @@
repositoryId: 117561740
description: (Unofficial) Google Home local API documentation.
created: '2018-01-15T15:22:58Z'
- updated: '2025-01-10T06:28:14Z'
+ updated: '2025-01-14T09:44:40Z'
language: Handlebars
archived: false
- stars: 453
+ stars: 452
watchers: 31
forks: 38
owner: rithvikvibhu
logo: https://avatars.githubusercontent.com/u/5113343?v=4
license: MIT
- repoEtag: '"90cc8bc790df8dd3eb0fa80805f9e7a787de2f148417a5e850d907420fc9accc"'
- repoLastModified: Fri, 10 Jan 2025 06:28:14 GMT
+ repoEtag: '"3322acd4187cc1cc7ea3c50d827b1a80423057df1f0f2391234347e999673677"'
+ repoLastModified: Tue, 14 Jan 2025 09:44:40 GMT
foundInMaster: true
category: SDK
id: 6f3b994d76d4f6770123b20ae9bd03a2
@@ -8817,17 +8817,17 @@
repositoryId: 479982630
description: Clean Architecture Example using FastAPI framework
created: '2022-04-10T10:23:51Z'
- updated: '2025-01-11T06:44:38Z'
+ updated: '2025-01-14T23:06:00Z'
language: Python
archived: false
- stars: 411
+ stars: 412
watchers: 4
forks: 55
owner: 0xTheProDev
logo: https://avatars.githubusercontent.com/u/14367736?v=4
license: MIT
- repoEtag: '"faca838df672d6df779dcccb5cf3d6b7f02aa1251f219fef708a6f32816cd0a3"'
- repoLastModified: Sat, 11 Jan 2025 06:44:38 GMT
+ repoEtag: '"3c259309bb8b093340214a4c7da835cc77ea9e35ed35220c98719fd569e737e7"'
+ repoLastModified: Tue, 14 Jan 2025 23:06:00 GMT
category: Server Implementations
foundInMaster: true
oldLocations:
@@ -8955,17 +8955,17 @@
OpenAPI 3 and 3.1 schema generator and validator for Hono, itty-router and
more!
created: '2022-11-08T11:43:41Z'
- updated: '2025-01-13T22:52:36Z'
+ updated: '2025-01-15T01:06:33Z'
language: TypeScript
archived: false
- stars: 387
+ stars: 388
watchers: 10
forks: 43
owner: cloudflare
logo: https://avatars.githubusercontent.com/u/314135?v=4
license: MIT
- repoEtag: '"207baa084af7edfcb79ee1d19e795ec834c3aef62c3bd1dc5a8c053241f32b87"'
- repoLastModified: Mon, 13 Jan 2025 22:52:36 GMT
+ repoEtag: '"28a14113adfc81b79309ec8eafdb3f7bbacc900be1612d14ee3fe7e4c1422557"'
+ repoLastModified: Wed, 15 Jan 2025 01:06:33 GMT
category: Server Implementations
foundInMaster: true
oldLocations:
@@ -9010,17 +9010,17 @@
🚄 A Yeoman generator for Express.js based 12-factor apps and apis using
Typescript
created: '2017-05-29T22:33:47Z'
- updated: '2024-11-10T18:27:22Z'
+ updated: '2025-01-14T16:45:18Z'
language: TypeScript
archived: false
- stars: 360
+ stars: 361
watchers: 10
forks: 43
owner: cdimascio
logo: https://avatars.githubusercontent.com/u/4706618?v=4
license: MIT
- repoEtag: '"635dc5f6b9e82c2676dd7a52de9a3bec856acac3327847d00a13107e2432a2d0"'
- repoLastModified: Sun, 10 Nov 2024 18:27:22 GMT
+ repoEtag: '"bc567a3c8f2f72ea3c3f2b08d1dced884b298ece1c7594e788c59488d95967e9"'
+ repoLastModified: Tue, 14 Jan 2025 16:45:18 GMT
foundInMaster: true
category: Description Validators
id: ec24bd83d219c38af4319203892ff3cb
@@ -9157,17 +9157,17 @@
A library for generating typed models based on inputs such as AsyncAPI,
OpenAPI, and JSON Schema documents with high customization
created: '2021-01-21T12:27:51Z'
- updated: '2025-01-07T12:23:09Z'
+ updated: '2025-01-14T19:33:25Z'
language: TypeScript
archived: false
- stars: 334
+ stars: 335
watchers: 7
forks: 188
owner: asyncapi
logo: https://avatars.githubusercontent.com/u/16401334?v=4
license: Apache-2.0
- repoEtag: '"aed0bbda69376d11d43e93b3faf2db9e18aaf12242f6b63daaa02be97510a4f9"'
- repoLastModified: Tue, 07 Jan 2025 12:23:09 GMT
+ repoEtag: '"9e34b4f43de354e653739a518e21a28297ae3ae7cbeebbbd955f42db82476cfa"'
+ repoLastModified: Tue, 14 Jan 2025 19:33:25 GMT
foundInMaster: true
- source: openapi3 tags
repository: https://github.com/samchungy/zod-openapi
@@ -9237,17 +9237,17 @@
Openapi-core is a Python library that adds client-side and server-side
support for the OpenAPI v3.0 and OpenAPI v3.1 specification.
created: '2017-09-20T10:25:35Z'
- updated: '2025-01-13T23:38:29Z'
+ updated: '2025-01-14T09:08:18Z'
language: Python
archived: false
- stars: 311
+ stars: 312
watchers: 8
forks: 131
owner: python-openapi
logo: https://avatars.githubusercontent.com/u/126442889?v=4
license: BSD-3-Clause
- repoEtag: '"1c773c5152150035808e084ebe27e851992251d6faa35e7c526ac3b629232fc8"'
- repoLastModified: Mon, 13 Jan 2025 23:38:29 GMT
+ repoEtag: '"f452a4a007eabbfb02bd168204662ac56df2471949979decd97d143eab4bd167"'
+ repoLastModified: Tue, 14 Jan 2025 09:08:18 GMT
category:
- Data Validators
- Parsers
@@ -9408,11 +9408,11 @@
archived: false
stars: 263
watchers: 12
- forks: 58
+ forks: 59
owner: fsprojects
logo: https://avatars.githubusercontent.com/u/6001315?v=4
license: Unlicense
- repoEtag: '"82b50c75fcd086415aa802ac59abaa781d5e3992133804e4ccc58f7e632514f0"'
+ repoEtag: '"f4211d957b93404c7bd098c97e3c3fed8d155936c95a11fa84974dd03e12eef9"'
repoLastModified: Mon, 06 Jan 2025 20:32:55 GMT
foundInMaster: true
category: SDK
@@ -9597,7 +9597,7 @@
owner: Cornutum
logo: https://avatars.githubusercontent.com/u/11477145?v=4
license: MIT
- repoEtag: '"07e404bf722d46427f14a4db9458559bf5f57833c347006eb3288c1422ba6f87"'
+ repoEtag: '"23c657adc404317491f4ba1128f1277e205d157e75756eb43ca6d20d1095cbf3"'
repoLastModified: Sun, 12 Jan 2025 14:11:02 GMT
foundInMaster: true
category: Testing
@@ -9644,17 +9644,17 @@
SDKs. 🌐 Terraform providers and Contract Tests for your API. OpenAPI
native.
created: '2022-09-29T10:13:15Z'
- updated: '2025-01-14T01:19:19Z'
+ updated: '2025-01-14T21:21:29Z'
language: JavaScript
archived: false
- stars: 222
+ stars: 223
watchers: 16
forks: 16
owner: speakeasy-api
logo: https://avatars.githubusercontent.com/u/91446104?v=4
license: NOASSERTION
- repoEtag: '"415cb47c2258ed1a533ae42e6e387af54e3b5fc3f07aef5090fdb7d415a72bc3"'
- repoLastModified: Tue, 14 Jan 2025 01:19:19 GMT
+ repoEtag: '"1b3d31794b495562d620ec7f536aa45c4f15b27f19f8978a7b2f566d72fb4957"'
+ repoLastModified: Tue, 14 Jan 2025 21:21:29 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -9688,15 +9688,15 @@
id: 17db61563d8b069fd3d4a63d36459a68
repositoryMetadata:
base64Readme: >-
- WyFbQnVpbGRdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9hY3Rpb25zL3dvcmtmbG93cy9idWlsZC55bWwvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2FjdGlvbnMvd29ya2Zsb3dzL2J1aWxkLnltbCkKWyFbU21va2UgVGVzdHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9hY3Rpb25zL3dvcmtmbG93cy9zbW9rZS10ZXN0cy55bWwvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2FjdGlvbnMvd29ya2Zsb3dzL3Ntb2tlLXRlc3RzLnltbCkKWyFbTnVHZXRdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnVnZXQvdi9yZWZpdHRlcj9jb2xvcj1ibHVlKV0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL3JlZml0dGVyKQpbIVtRdWFsaXR5IEdhdGUgU3RhdHVzXShodHRwczovL3NvbmFyY2xvdWQuaW8vYXBpL3Byb2plY3RfYmFkZ2VzL21lYXN1cmU/cHJvamVjdD1jaHJpc3RpYW5oZWxsZV9yZWZpdHRlciZtZXRyaWM9YWxlcnRfc3RhdHVzKV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL3N1bW1hcnkvbmV3X2NvZGU/aWQ9Y2hyaXN0aWFuaGVsbGVfcmVmaXR0ZXIpClshW2NvZGVjb3ZdKGh0dHBzOi8vY29kZWNvdi5pby9naC9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9ncmFwaC9iYWRnZS5zdmc/dG9rZW49MjQyWVQxTjZUMildKGh0dHBzOi8vY29kZWNvdi5pby9naC9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlcikKCjwhLS0gQUxMLUNPTlRSSUJVVE9SUy1CQURHRTpTVEFSVCAtIERvIG5vdCByZW1vdmUgb3IgbW9kaWZ5IHRoaXMgc2VjdGlvbiAtLT4KWyFbQWxsIENvbnRyaWJ1dG9yc10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9hbGxfY29udHJpYnV0b3JzLTYwLW9yYW5nZS5zdmc/c3R5bGU9ZmxhdC1zcXVhcmUpXSgjY29udHJpYnV0b3JzLSkKPCEtLSBBTEwtQ09OVFJJQlVUT1JTLUJBREdFOkVORCAtLT4KCiMgUmVmaXR0ZXIKUmVmaXR0ZXIgaXMgYSB0b29sIGZvciBnZW5lcmF0aW5nIGEgQyMgUkVTVCBBUEkgQ2xpZW50IHVzaW5nIHRoZSBbUmVmaXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGl2ZXVpL3JlZml0KSBsaWJyYXJ5LiBSZWZpdHRlciBjYW4gZ2VuZXJhdGUgdGhlIFJlZml0IGludGVyZmFjZSBhbmQgY29udHJhY3RzIGZyb20gT3BlbkFQSSBzcGVjaWZpY2F0aW9ucy4gUmVmaXR0ZXIgY291bGQgZm9ybWF0IHRoZSBnZW5lcmF0ZWQgUmVmaXQgaW50ZXJmYWNlIHRvIGJlIG1hbmFnZWQgYnkgW0FwaXpyXShodHRwczovL3d3dy5hcGl6ci5uZXQpICh2NispIGFuZCBnZW5lcmF0ZSBzb21lIHJlZ2lzdHJhdGlvbiBoZWxwZXJzIHRvby4KClJlZml0dGVyIGNvbWVzIGluIDIgZm9ybXM6Ci0gQSBbLk5FVCBDTEkgVG9vbF0oI2NsaS10b29sKSBkaXN0cmlidXRlZCB2aWEgW251Z2V0Lm9yZ10oaHR0cDovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvcmVmaXR0ZXIpIHRoYXQgb3V0cHV0cyBhIHNpbmdsZSBDIyBmaWxlIG9uIGRpc2sKLSBBIFtDIyBTb3VyY2UgR2VuZXJhdG9yXSgjc291cmNlLWdlbmVyYXRvcikgdmlhIHRoZSBbUmVmaXR0ZXIuU291cmNlR2VuZXJhdG9yXShodHRwOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9yZWZpdHRlci5zb3VyY2VnZW5lcmF0b3IpIHBhY2thZ2UgdGhhdCBnZW5lcmF0ZXMgY29kZSBvbiBjb21waWxlIHRpbWUgYmFzZWQgb24gYSBbLnJlZml0dGVyXSgjLnJlZml0dGVyLWZpbGUtZm9ybWF0KSB3aXRoaW4gdGhlIHByb2plY3QgZGlyZWN0b3J5LgoKIyMgQ0xJIFRvb2wKCiMjIyBJbnN0YWxsYXRpb246CgpUaGUgdG9vbCBpcyBwYWNrYWdlZCBhcyBhIC5ORVQgVG9vbCBhbmQgaXMgcHVibGlzaGVkIHRvIG51Z2V0Lm9yZy4gWW91IGNhbiBpbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHRvb2wgbGlrZSB0aGlzOgoKYGBgc2hlbGwKZG90bmV0IHRvb2wgaW5zdGFsbCAtLWdsb2JhbCBSZWZpdHRlcgpgYGAKCiMjIyBVc2FnZToKCmBgYHNoZWxsCiQgcmVmaXR0ZXIgLS1oZWxwCmBgYAoKYGBgdGV4dApVU0FHRToKICAgIHJlZml0dGVyIFtVUkwgb3IgaW5wdXQgZmlsZV0gW09QVElPTlNdCgpFWEFNUExFUzoKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uCiAgICByZWZpdHRlciBodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92My9vcGVuYXBpLnlhbWwKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tc2V0dGluZ3MtZmlsZSAuL29wZW5hcGkucmVmaXR0ZXIgLS1vdXRwdXQgLi9HZW5lcmF0ZWRDb2RlLmNzCiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLW5hbWVzcGFjZSAiWW91ci5OYW1lc3BhY2UuT2YuQ2hvaWNlLkdlbmVyYXRlZENvZGUiIC0tb3V0cHV0IC4vR2VuZXJhdGVkQ29kZS5jcwogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1uYW1lc3BhY2UgIllvdXIuTmFtZXNwYWNlLk9mLkNob2ljZS5HZW5lcmF0ZWRDb2RlIiAtLWludGVybmFsCiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLW91dHB1dCAuL0lHZW5lcmF0ZWRDb2RlLmNzIC0taW50ZXJmYWNlLW9ubHkKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tb3V0cHV0IC4vR2VuZXJhdGVkQ29udHJhY3RzLmNzIC0tY29udHJhY3Qtb25seQogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS11c2UtYXBpLXJlc3BvbnNlCiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLWNhbmNlbGxhdGlvbi10b2tlbnMKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbm8tb3BlcmF0aW9uLWhlYWRlcnMKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbm8tYWNjZXB0LWhlYWRlcnMKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tdXNlLWlzby1kYXRlLWZvcm1hdAogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1hZGRpdGlvbmFsLW5hbWVzcGFjZSAiWW91ci5BZGRpdGlvbmFsLk5hbWVzcGFjZSIgLS1hZGRpdGlvbmFsLW5hbWVzcGFjZSAiWW91ci5PdGhlci5BZGRpdGlvbmFsLk5hbWVzcGFjZSIKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbXVsdGlwbGUtaW50ZXJmYWNlcyBCeUVuZHBvaW50CiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLXRhZyBQZXQgLS10YWcgU3RvcmUgLS10YWcgVXNlcgogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1tYXRjaC1wYXRoICdeL3BldC8uKicKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tdHJpbS11bnVzZWQtc2NoZW1hCiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLXRyaW0tdW51c2VkLXNjaGVtYSAgLS1rZWVwLXNjaGVtYSAnXk1vZGVsJCcgLS1rZWVwLXNjaGVtYSAnXlBlcnNvbi4rJwogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1uby1kZXByZWNhdGVkLW9wZXJhdGlvbnMKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tb3BlcmF0aW9uLW5hbWUtdGVtcGxhdGUgJ3tvcGVyYXRpb25OYW1lfUFzeW5jJwogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1vcHRpb25hbC1udWxsYWJsZS1wYXJhbWV0ZXJzCiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLXVzZS1wb2x5bW9ycGhpYy1zZXJpYWxpemF0aW9uCgpBUkdVTUVOVFM6CiAgICBbVVJMIG9yIGlucHV0IGZpbGVdICAgIFVSTCBvciBmaWxlIHBhdGggdG8gT3BlbkFQSSBTcGVjaWZpY2F0aW9uIGZpbGUKCk9QVElPTlM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFQKICAgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludHMgaGVscCBpbmZvcm1hdGlvbgogICAgLXYsIC0tdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50cyB2ZXJzaW9uIGluZm9ybWF0aW9uCiAgICAtcywgLS1zZXR0aW5ncy1maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCB0byAucmVmaXR0ZXIgc2V0dGluZ3MgZmlsZS4gU3BlY2lmeWluZyB0aGlzIHdpbGwgaWdub3JlIGFsbCBvdGhlciBzZXR0aW5ncyAoZXhjZXB0IGZvciAtLW91dHB1dCkKICAgIC1uLCAtLW5hbWVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVkQ29kZSAgICBEZWZhdWx0IG5hbWVzcGFjZSB0byB1c2UgZm9yIGdlbmVyYXRlZCB0eXBlcwogICAgICAgIC0tY29udHJhY3RzLW5hbWVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgbmFtZXNwYWNlIHRvIHVzZSBmb3IgZ2VuZXJhdGVkIGNvbnRyYWN0cwogICAgLW8sIC0tb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQuY3MgICAgICAgIFBhdGggdG8gT3V0cHV0IGZpbGUgb3IgZm9sZGVyIChpZiBtdWx0aXBsZSBmaWxlcyBhcmUgZ2VuZXJhdGVkKQogICAgICAgIC0tY29udHJhY3RzLW91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCBwYXRoIGZvciBnZW5lcmF0ZWQgY29udHJhY3RzLiBFbmFibGluZyB0aGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlcyBnZW5lcmF0aW5nIG11bHRpcGxlIGZpbGVzCiAgICAgICAgLS1uby1hdXRvLWdlbmVyYXRlZC1oZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3QgYWRkIDxhdXRvLWdlbmVyYXRlZD4gaGVhZGVyIHRvIG91dHB1dCBmaWxlCiAgICAgICAgLS1uby1hY2NlcHQtaGVhZGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3QgYWRkIDxBY2NlcHQ+IGhlYWRlciB0byBvdXRwdXQgZmlsZQogICAgICAgIC0taW50ZXJmYWNlLW9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGNvbnRyYWN0IHR5cGVzCiAgICAgICAgLS1jb250cmFjdC1vbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgY2xpZW50cwogICAgICAgIC0tdXNlLWFwaS1yZXNwb25zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybiBUYXNrPElBcGlSZXNwb25zZTxUPj4gaW5zdGVhZCBvZiBUYXNrPFQ+CiAgICAgICAgLS11c2Utb2JzZXJ2YWJsZS1yZXNwb25zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuIElPYnNlcnZhYmxlIGluc3RlYWQgb2YgVGFzawogICAgICAgIC0taW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGUgYWNjZXNzaWJpbGl0eSBvZiB0aGUgZ2VuZXJhdGVkIHR5cGVzIHRvICdpbnRlcm5hbCcKICAgICAgICAtLWNhbmNlbGxhdGlvbi10b2tlbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgY2FuY2VsbGF0aW9uIHRva2VucwogICAgICAgIC0tbm8tb3BlcmF0aW9uLWhlYWRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIG9wZXJhdGlvbiBoZWFkZXJzCiAgICAgICAgLS1uby1sb2dnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3QgbG9nIGVycm9ycyBvciBjb2xsZWN0IHRlbGVtZXRyeQogICAgICAgIC0tYWRkaXRpb25hbC1uYW1lc3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBhZGRpdGlvbmFsIG5hbWVzcGFjZSB0byBnZW5lcmF0ZWQgdHlwZXMKICAgICAgICAtLWV4Y2x1ZGUtbmFtZXNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNsdWRlIG5hbWVzcGFjZSBvbiBnZW5lcmF0ZWQgdHlwZXMKICAgICAgICAtLXVzZS1pc28tZGF0ZS1mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsaWNpdGx5IGZvcm1hdCBkYXRlIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIGluIElTTyA4NjAxIHN0YW5kYXJkIGRhdGUgZm9ybWF0IHVzaW5nIGRlbGltaXRlcnMgKDIwMjMtMDYtMTUpCiAgICAgICAgLS1tdWx0aXBsZS1pbnRlcmZhY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgYSBSZWZpdCBpbnRlcmZhY2UgZm9yIGVhY2ggZW5kcG9pbnQuIE1heSBiZSBvbmUgb2YgQnlFbmRwb2ludCwgQnlUYWcKICAgICAgICAtLW11bHRpcGxlLWZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBtdWx0aXBsZSBmaWxlcyBpbnN0ZWFkIG9mIGEgc2luZ2xlIGxhcmdlIGZpbGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCBmaWxlcyBjYW4gYmUgdGhlIGZvbGxvd2luZzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFJlZml0SW50ZXJmYWNlcy5jcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVwZW5kZW5jeUluamVjdGlvbi5jcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQ29udHJhY3RzLmNzCiAgICAgICAgLS1tYXRjaC1wYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBpbmNsdWRlIFBhdGhzIHRoYXQgbWF0Y2ggdGhlIHByb3ZpZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4gTWF5IGJlIHNldCBtdWx0aXBsZSB0aW1lcwogICAgICAgIC0tdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgaW5jbHVkZSBFbmRwb2ludHMgdGhhdCBjb250YWluIHRoaXMgdGFnLiBNYXkgYmUgc2V0IG11bHRpcGxlIHRpbWVzIGFuZCByZXN1bHQgaW4gT1InZWQgZXZhbHVhdGlvbgogICAgICAgIC0tc2tpcC12YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXAgdmFsaWRhdGlvbiBvZiB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uCiAgICAgICAgLS1uby1kZXByZWNhdGVkLW9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgZGVwcmVjYXRlZCBvcGVyYXRpb25zCiAgICAgICAgLS1vcGVyYXRpb24tbmFtZS10ZW1wbGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgb3BlcmF0aW9uIG5hbWVzIHVzaW5nIHBhdHRlcm4uIFdoZW4gdXNpbmcgLS1tdWx0aXBsZS1pbnRlcmZhY2VzIEJ5RW5kcG9pbnQsIHRoaXMgaXMgbmFtZSBvZiB0aGUgRXhlY3V0ZSgpIG1ldGhvZCBpbiB0aGUgaW50ZXJmYWNlCiAgICAgICAgLS1vcHRpb25hbC1udWxsYWJsZS1wYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgbnVsbGFibGUgcGFyYW1ldGVycyBhcyBvcHRpb25hbCBwYXJhbWV0ZXJzCiAgICAgICAgLS10cmltLXVudXNlZC1zY2hlbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlcyB1bnJlZmVyZW5jZWQgY29tcG9uZW50cyBzY2hlbWEgdG8ga2VlcCB0aGUgZ2VuZXJhdGVkIG91dHB1dCB0byBhIG1pbmltdW0KICAgICAgICAtLWtlZXAtc2NoZW1hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JjZSB0byBrZWVwIG1hdGNoaW5nIHNjaGVtYSwgdXNlcyByZWd1bGFyIGV4cHJlc3Npb25zLiBVc2UgdG9nZXRoZXIgd2l0aCAiLS10cmltLXVudXNlZC1zY2hlbWEiLiBDYW4gYmUgc2V0IG11bHRpcGxlIHRpbWVzCiAgICAgICAgLS1uby1iYW5uZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3Qgc2hvdyBkb25hdGlvbiBiYW5uZXIKICAgICAgICAtLXNraXAtZGVmYXVsdC1hZGRpdGlvbmFsLXByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSB0byBza2lwIGRlZmF1bHQgYWRkaXRpb25hbCBwcm9wZXJ0aWVzCiAgICAgICAgLS1vcGVyYXRpb24tbmFtZS1nZW5lcmF0b3IgICAgICAgICAgICAgIERlZmF1bHQgICAgICAgICAgVGhlIE5Td2FnIElPcGVyYXRpb25OYW1lR2VuZXJhdG9yIGltcGxlbWVudGF0aW9uIHRvIHVzZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXkgYmUgb25lIG9mOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTXVsdGlwbGVDbGllbnRzRnJvbU9wZXJhdGlvbklkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBNdWx0aXBsZUNsaWVudHNGcm9tUGF0aFNlZ21lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBNdWx0aXBsZUNsaWVudHNGcm9tRmlyc3RUYWdBbmRPcGVyYXRpb25JZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTXVsdGlwbGVDbGllbnRzRnJvbUZpcnN0VGFnQW5kT3BlcmF0aW9uTmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTXVsdGlwbGVDbGllbnRzRnJvbUZpcnN0VGFnQW5kUGF0aFNlZ21lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTaW5nbGVDbGllbnRGcm9tT3BlcmF0aW9uSWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNpbmdsZUNsaWVudEZyb21QYXRoU2VnbWVudHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgaHR0cHM6Ly9yZWZpdHRlci5naXRodWIuaW8vYXBpL1JlZml0dGVyLkNvcmUuT3BlcmF0aW9uTmFtZUdlbmVyYXRvclR5cGVzLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24KICAgICAgICAtLWltbXV0YWJsZS1yZWNvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBjb250cmFjdHMgYXMgaW1tdXRhYmxlIHJlY29yZHMgaW5zdGVhZCBvZiBjbGFzc2VzCiAgICAgICAgLS11c2UtYXBpenIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIEFwaXpyIGJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQWRkaW5nIGEgZmluYWwgSUFwaXpyUmVxdWVzdE9wdGlvbnMgb3B0aW9ucyBwYXJhbWV0ZXIgdG8gYWxsIGdlbmVyYXRlZCBtZXRob2RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQcm92aWRpbmcgY2FuY2VsbGF0aW9uIHRva2VucyBieSBBcGl6ciByZXF1ZXN0IG9wdGlvbnMgaW5zdGVhZCBvZiBhIGRlZGljYXRlZCBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFVzaW5nIG1ldGhvZCBvdmVybG9hZHMgaW5zdGVhZCBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGh0dHBzOi8vcmVmaXR0ZXIuZ2l0aHViLmlvIGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBodHRwczovL3d3dy5hcGl6ci5uZXQgdG8gZ2V0IHN0YXJ0ZWQgd2l0aCBBcGl6cgogICAgICAgIC0tdXNlLWR5bmFtaWMtcXVlcnlzdHJpbmctcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgIEVuYWJsZSB3cmFwcGluZyBtdWx0aXBsZSBxdWVyeSBwYXJhbWV0ZXJzIGludG8gYSBzaW5nbGUgY29tcGxleCBvbmUuIERlZmF1bHQgaXMgbm8gd3JhcHBpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGl2ZXVpL3JlZml0P3RhYj1yZWFkbWUtb3YtZmlsZSNkeW5hbWljLXF1ZXJ5c3RyaW5nLXBhcmFtZXRlcnMgZm9yIG1vcmUgaW5mb3JtYXRpb24KICAgICAgICAtLXVzZS1wb2x5bW9ycGhpYy1zZXJpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgU3lzdGVtLlRleHQuSnNvbiBwb2x5bW9ycGhpYyBzZXJpYWxpemF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VzIE5Td2FnIEpzb25Jbmhlcml0YW5jZUNvbnZlcnRlciBhdHRyaWJ1dGVzIHdpdGggU3lzdGVtLlRleHQuSnNvbiBKc29uUG9seW1vcnBoaWNBdHRyaWJ1dGVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvIGhhdmUgdGhlIG5hdGl2ZSBzdXBwb3J0IG9mIGluaGVyaXRhbmNlIChkZSlzZXJpYWxpemF0aW9uIGFuZCBmYWxsYmFjayB0byBiYXNlIHR5cGVzIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkcyB3aXRoICh5ZXQpIHVua25vd24gdHlwZXMgYXJlIG9mZmVyZWQgYnkgbmV3ZXIgdmVyc2lvbnMgb2YgYW4gQVBJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy9kb3RuZXQvc3RhbmRhcmQvc2VyaWFsaXphdGlvbi9zeXN0ZW0tdGV4dC1qc29uL3BvbHltb3JwaGlzbSBmb3IgbW9yZSBpbmZvcm1hdGlvbgogICAgICAgIC0tZGlzcG9zYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHJlZml0IGNsaWVudHMgdGhhdCBpbXBsZW1lbnQgSURpc3Bvc2FibGUKYGBgCgpUbyBnZW5lcmF0ZSBjb2RlIGZyb20gYW4gT3BlbkFQSSBzcGVjaWZpY2F0aW9ucyBmaWxlLCBydW4gdGhlIGZvbGxvd2luZzoKCmBgYHNoZWxsCiQgcmVmaXR0ZXIgW3BhdGggdG8gT3BlbkFQSSBzcGVjIGZpbGVdIC0tbmFtZXNwYWNlICJbWW91ci5OYW1lc3BhY2UuT2YuQ2hvaWNlLkdlbmVyYXRlZENvZGVdIgpgYGAKClRoaXMgd2lsbCBnZW5lcmF0ZSBhIGZpbGUgY2FsbGVkIGBPdXRwdXQuY3NgIHdoaWNoIGNvbnRhaW5zIHRoZSBSZWZpdCBpbnRlcmZhY2UgYW5kIGNvbnRyYWN0IGNsYXNzZXMgZ2VuZXJhdGVkIHVzaW5nIFtOU3dhZ10oaHR0cHM6Ly9naXRodWIuY29tL1JpY29TdXRlci9OU3dhZykKCiMjIFNvdXJjZSBHZW5lcmF0b3IKClJlZml0dGVyIGlzIGF2YWlsYWJsZSBhcyBhIEMjIFNvdXJjZSBHZW5lcmF0b3IgdGhhdCB1c2VzIHRoZSBbUmVmaXR0ZXIuQ29yZV0oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL3RyZWUvbWFpbi9zcmMvUmVmaXR0ZXIuQ29yZSkgbGlicmFyeSBmb3IgZ2VuZXJhdGluZyBhIFJFU1QgQVBJIENsaWVudCB1c2luZyB0aGUgW1JlZml0XShodHRwczovL2dpdGh1Yi5jb20vcmVhY3RpdmV1aS9yZWZpdCkgbGlicmFyeS4gUmVmaXR0ZXIgY2FuIGdlbmVyYXRlIHRoZSBSZWZpdCBpbnRlcmZhY2UgZnJvbSBPcGVuQVBJIHNwZWNpZmljYXRpb25zLiBSZWZpdHRlciBjb3VsZCBmb3JtYXQgdGhlIGdlbmVyYXRlZCBSZWZpdCBpbnRlcmZhY2UgdG8gYmUgbWFuYWdlZCBieSBbQXBpenJdKGh0dHBzOi8vd3d3LmFwaXpyLm5ldCkgYW5kIGdlbmVyYXRlIHNvbWUgcmVnaXN0cmF0aW9uIGhlbHBlcnMgdG9vLgoKVGhlIFJlZml0dGVyIHNvdXJjZSBnZW5lcmF0b3IgaXMgYSBiaXQgdW50cmFkaXRpb25hbCBpbiBhIHNlbnNlIHRoYXQgaXQgY3JlYXRlcyBhIGZvbGRlciBjYWxsZWQgYEdlbmVyYXRlZGAgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgdGhlIGAucmVmaXR0ZXJgIGZpbGUgYW5kIGdlbmVyYXRlcyBmaWxlcyB0byBkaXNrIHVuZGVyIHRoZSBgR2VuZXJhdGVkYCBmb2xkZXIgKGNhbiBiZSBjaGFuZ2VkIHdpdGggYC0tb3V0cHV0Rm9sZGVyYCkuIFRoZSBzb3VyY2UgZ2VuZXJhdG9yIG91dHB1dCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHByb2plY3QgYW5kIGNvbW1pdHRlZCB0byBzb3VyY2UgY29udHJvbC4gVGhpcyBpcyBkb25lIGJlY2F1c2UgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIHRyaWdnZXIgdGhlIFJlZml0IHNvdXJjZSBnZW5lcmF0b3IgdG8gcGlja3VwIHRoZSBSZWZpdHRlciBnZW5lcmF0ZWQgY29kZQoKKioqKFRyYW5zbGF0aW9uOiBJIGNvdWxkbid0IGZvciB0aGUgbGlmZSBvZiBtZSBmaWd1cmUgaG93IHRvIGdldCB0aGF0IHRvIHdvcmssIHNvcnJ5KSoqKgoKIyMjIEluc3RhbGxhdGlvbgoKVGhlIHNvdXJjZSBnZW5lcmF0b3IgaXMgZGlzdHJpYnV0ZWQgYXMgYSBOdUdldCBwYWNrYWdlIGFuZCBzaG91bGQgYmUgaW5zdGFsbGVkIHRvIHRoZSBwcm9qZWN0IHRoYXQgd2lsbCBjb250YWluIHRoZSBnZW5lcmF0ZWQgY29kZQoKYGBgc2hlbGwKZG90bmV0IGFkZCBwYWNrYWdlIFJlZml0dGVyLlNvdXJjZUdlbmVyYXRvcgpgYGAKCiMjIyBVc2FnZQoKVGhpcyBzb3VyY2UgZ2VuZXJhdG9yIGdlbmVyYXRlcyBjb2RlIGJhc2VkIG9uIGFueSBgLnJlZml0dGVyYCBmaWxlIGluY2x1ZGVkIHRvIHRoZSBwcm9qZWN0IGFzIGBBZGRpdGlvbmFsRmlsZXNgLgoKVGhlIGdlbmVyYXRvciBjYW4gYXV0b21hdGljYWxseSBkZXRlY3QgYWxsIGAucmVmaXR0ZXJgIGZpbGVzIGluc2lkZSB0aGUgcHJvamVjdCB0aGF0IHJlZmVyZW5jZWQgdGhlIGBSZWZpdHRlci5Tb3VyY2VHZW5lcmF0b3JgIHBhY2thZ2UgYW5kIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jbHVkZSB0aGVtIG1hbnVhbGx5IGFzIGBBZGRpdGlvbmFsRmlsZXNgCgojIyMgLlJlZml0dGVyIEZpbGUgZm9ybWF0CgpUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgYC5yZWZpdHRlcmAgZmlsZQoKYGBganMKewogICJvcGVuQXBpUGF0aCI6ICIvcGF0aC90by95b3VyL29wZW5BUEkiLCAvLyBSZXF1aXJlZAogICJuYW1lc3BhY2UiOiAiT3JnLlN5c3RlbS5TZXJ2aWNlLkFwaS5HZW5lcmF0ZWRDb2RlIiwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9R2VuZXJhdGVkQ29kZQogICJjb250cmFjdHNOYW1lc3BhY2UiOiAiT3JnLlN5c3RlbS5TZXJ2aWNlLkFwaS5HZW5lcmF0ZWRDb2RlLkNvbnRyYWN0cyIsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PUdlbmVyYXRlZENvZGUKICAibmFtaW5nIjogewogICAgInVzZU9wZW5BcGlUaXRsZSI6IGZhbHNlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD10cnVlCiAgICAiaW50ZXJmYWNlTmFtZSI6ICJNeUFwaUNsaWVudCIgLy8gT3B0aW9uYWwuIERlZmF1bHQ9QXBpQ2xpZW50CiAgfSwKICAiZ2VuZXJhdGVDb250cmFjdHMiOiB0cnVlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD10cnVlCiAgImdlbmVyYXRlQ2xpZW50cyI6IHRydWUsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PXRydWUKICAiZ2VuZXJhdGVYbWxEb2NDb2RlQ29tbWVudHMiOiB0cnVlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD10cnVlCiAgImdlbmVyYXRlU3RhdHVzQ29kZUNvbW1lbnRzIjogdHJ1ZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9dHJ1ZQogICJhZGRBdXRvR2VuZXJhdGVkSGVhZGVyIjogdHJ1ZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9dHJ1ZQogICJhZGRBY2NlcHRIZWFkZXJzIjogdHJ1ZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9dHJ1ZQogICJyZXR1cm5JQXBpUmVzcG9uc2UiOiBmYWxzZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9ZmFsc2UKICAicmVzcG9uc2VUeXBlT3ZlcnJpZGUiOiB7IC8vIE9wdGlvbmFsLiBEZWZhdWx0PXt9CiAgICAiRmlsZV9VcGxvYWQiOiAiSUFwaVJlc3BvbnNlIiwKICAgICJGaWxlX0Rvd25sb2FkIjogIlN5c3RlbS5OZXQuSHR0cC5IdHRwQ29udGVudCIKICB9LAogICJnZW5lcmF0ZU9wZXJhdGlvbkhlYWRlcnMiOiB0cnVlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD10cnVlCiAgInR5cGVBY2Nlc3NpYmlsaXR5IjogIlB1YmxpYyIsIC8vIE9wdGlvbmFsLiBWYWx1ZXM9UHVibGljfEludGVybmFsLiBEZWZhdWx0PVB1YmxpYwogICJ1c2VDYW5jZWxsYXRpb25Ub2tlbnMiOiBmYWxzZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9ZmFsc2UKICAidXNlSXNvRGF0ZUZvcm1hdCI6IGZhbHNlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD1mYWxzZQogICJtdWx0aXBsZUludGVyZmFjZXMiOiAiQnlFbmRwb2ludCIsIC8vIE9wdGlvbmFsLiBNYXkgYmUgb25lIG9mICJCeUVuZHBvaW50IiBvciAiQnlUYWciCiAgImdlbmVyYXRlRGVwcmVjYXRlZE9wZXJhdGlvbnMiOiBmYWxzZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9dHJ1ZQogICJvcGVyYXRpb25OYW1lVGVtcGxhdGUiOiAie29wZXJhdGlvbk5hbWV9QXN5bmMiLCAvLyBPcHRpb25hbC4gTXVzdCBjb250YWluIHtvcGVyYXRpb25OYW1lfSB3aGVuIG11bHRpcGxlSW50ZXJmYWNlcyAhPSBCeUVuZHBvaW50CiAgIm9wdGlvbmFsUGFyYW1ldGVycyI6IGZhbHNlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD1mYWxzZQogICJvdXRwdXRGb2xkZXIiOiAiLi4vQ3VzdG9tT3V0cHV0IiAvLyBPcHRpb25hbC4gRGVmYXVsdD0uL0dlbmVyYXRlZAogICJvdXRwdXRGaWxlbmFtZSI6ICJSZWZpdEludGVyZmFjZS5jcyIsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PU91dHB1dC5jcyBmb3IgQ0xJIHRvb2wKICAiY29udHJhY3RzT3V0cHV0Rm9sZGVyIjogIi4uL0NvbnRyYWN0cyIsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PU5VTEwKICAiZ2VuZXJhdGVNdWx0aXBsZUZpbGVzIjogZmFsc2UsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PWZhbHNlCiAgImFkZGl0aW9uYWxOYW1lc3BhY2VzIjogWyAvLyBPcHRpb25hbAogICAgIk5hbWVzcGFjZTEiLAogICAgIk5hbWVzcGFjZTIiCiAgXSwKICAiaW5jbHVkZVRhZ3MiOiBbIC8vIE9wdGlvbmFsLiBPcGVuQVBJIFRhZyB0byBpbmNsdWRlIHdoZW4gZ2VuZXJhdGluZyBjb2RlCiAgICAiUGV0IiwKICAgICJTdG9yZSIsCiAgICAiVXNlciIKICBdLAogICJpbmNsdWRlUGF0aE1hdGNoZXMiOiBbIC8vIE9wdGlvbmFsLiBPbmx5IGluY2x1ZGUgUGF0aHMgdGhhdCBtYXRjaCB0aGUgcHJvdmlkZWQgcmVndWxhciBleHByZXNzaW9uCiAgICAiXi9wZXQvLioiLAogICAgIl4vc3RvcmUvLioiCiAgXSwKICAidHJpbVVudXNlZFNjaGVtYSI6IGZhbHNlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD1mYWxzZQogICJrZWVwU2NoZW1hUGF0dGVybnMiOiBbIC8vIE9wdGlvbmFsLiBGb3JjZSB0byBrZWVwIG1hdGNoaW5nIHNjaGVtYSwgdXNlcyByZWd1bGFyIGV4cHJlc3Npb25zLiBVc2UgdG9nZXRoZXIgd2l0aCB0cmltVW51c2VkU2NoZW1hPXRydWUKICAgICJeTW9kZWwkIiwKICAgICJeUGVyc29uLisiCiAgXSwKICAiZ2VuZXJhdGVEZWZhdWx0QWRkaXRpb25hbFByb3BlcnRpZXMiOiB0cnVlLCAvLyBPcHRpb25hbC4gZGVmYXVsdD10cnVlCiAgIm9wZXJhdGlvbk5hbWVHZW5lcmF0b3IiOiAiRGVmYXVsdCIsIC8vIE9wdGlvbmFsLiBNYXkgYmUgb25lIG9mIERlZmF1bHQsIE11bHRpcGxlQ2xpZW50c0Zyb21PcGVyYXRpb25JZCwgTXVsdGlwbGVDbGllbnRzRnJvbVBhdGhTZWdtZW50cywgTXVsdGlwbGVDbGllbnRzRnJvbUZpcnN0VGFnQW5kT3BlcmF0aW9uSWQsIE11bHRpcGxlQ2xpZW50c0Zyb21GaXJzdFRhZ0FuZE9wZXJhdGlvbk5hbWUsIE11bHRpcGxlQ2xpZW50c0Zyb21GaXJzdFRhZ0FuZFBhdGhTZWdtZW50cywgU2luZ2xlQ2xpZW50RnJvbU9wZXJhdGlvbklkLCBTaW5nbGVDbGllbnRGcm9tUGF0aFNlZ21lbnRzCiAgImltbXV0YWJsZVJlY29yZHMiOiBmYWxzZSwKICAidXNlRHluYW1pY1F1ZXJ5c3RyaW5nUGFyYW1ldGVycyI6IHRydWUsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PWZhbHNlCiAgInVzZVBvbHltb3JwaGljU2VyaWFsaXphdGlvbiI6IHRydWUsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PWZhbHNlCiAgImdlbmVyYXRlRGlzcG9zYWJsZUNsaWVudHMiOiB0cnVlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD1mYWxzZQogICJkZXBlbmRlbmN5SW5qZWN0aW9uU2V0dGluZ3MiOiB7IC8vIE9wdGlvbmFsCiAgICAiYmFzZVVybCI6ICJodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92MyIsIC8vIE9wdGlvbmFsLiBMZWF2ZSB0aGlzIGJsYW5rIHRvIHNldCB0aGUgYmFzZSBhZGRyZXNzIG1hbnVhbGx5CiAgICAiaHR0cE1lc3NhZ2VIYW5kbGVycyI6IFsgLy8gT3B0aW9uYWwKICAgICAgICAiQXV0aG9yaXphdGlvbk1lc3NhZ2VIYW5kbGVyIiwKICAgICAgICAiVGVsZW1ldHJ5TWVzc2FnZUhhbmRsZXIiCiAgICBdLAogICAgInVzZVBvbGx5IjogdHJ1ZSwgLy8gREVQUkVDQVRFRCAtIFVzZSAidHJhbnNpZW50RXJyb3JIYW5kbGVyIjogIk5vbmV8UG9sbHl8SHR0cFJlc2lsaWVuY2UiIGluc3RlYWQKICAgICJ0cmFuc2llbnRFcnJvckhhbmRsZXIiOiAiSHR0cFJlc2lsaWVuY2UiLCAvLyBPcHRpb25hbC4gU2V0IHRoaXMgdG8gY29uZmlndXJlIHRyYW5zaWVudCBlcnJvciBoYW5kbGluZyB3aXRoIGEgcmV0cnkgcG9saWN5IHRoYXQgdXNlcyBhIGppdHRlcmVkIGJhY2tvZmYuIE1heSBiZSBvbmUgb2YgTm9uZSwgUG9sbHksIEh0dHBSZXNpbGllbmNlCiAgICAibWF4UmV0cnlDb3VudCI6IDMsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PTYKICAgICJmaXJzdEJhY2tvZmZSZXRyeUluU2Vjb25kcyI6IDAuNSAvLyBPcHRpb25hbC4gRGVmYXVsdD0xLjAKICB9LAogICJhcGl6clNldHRpbmdzIjogeyAvLyBPcHRpb25hbAogICAgIndpdGhSZXF1ZXN0T3B0aW9ucyI6IHRydWUsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PXRydWUKICAgICJ3aXRoUmVnaXN0cmF0aW9uSGVscGVyIjogdHJ1ZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9ZmFsc2UKICAgICJ3aXRoQ2FjaGVQcm92aWRlciI6ICJJbk1lbW9yeSIsIC8vIE9wdGlvbmFsLiBWYWx1ZXM9Tm9uZXxBa2F2YWNoZXxNb25rZXlDYWNoZXxJbk1lbW9yeXxEaXN0cmlidXRlZEFzU3RyaW5nfERpc3RyaWJ1dGVkQXNCeXRlQXJyYXkuIERlZmF1bHQ9Tm9uZQogICAgIndpdGhQcmlvcml0eSI6IHRydWUsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PWZhbHNlCiAgICAid2l0aE1lZGlhdGlvbiI6IHRydWUsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PWZhbHNlCiAgICAid2l0aE9wdGlvbmFsTWVkaWF0aW9uIjogdHJ1ZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9ZmFsc2UKICAgICJ3aXRoTWFwcGluZ1Byb3ZpZGVyIjogIkF1dG9NYXBwZXIiLCAvLyBPcHRpb25hbC4gVmFsdWVzPU5vbmV8QXV0b01hcHBlcnxNYXBzdGVyLiBEZWZhdWx0PU5vbmUKICAgICJ3aXRoRmlsZVRyYW5zZmVyIjogdHJ1ZSAvLyBPcHRpb25hbC4gRGVmYXVsdD1mYWxzZQogIH0sCiAgImNvZGVHZW5lcmF0b3JTZXR0aW5ncyI6IHsgLy8gT3B0aW9uYWwuIERlZmF1bHQgc2V0dGluZ3MgYXJlIHRoZSB2YWx1ZXMgc2V0IGluIHRoaXMgZXhhbXBsZQogICAgInJlcXVpcmVkUHJvcGVydGllc011c3RCZURlZmluZWQiOiB0cnVlLAogICAgImdlbmVyYXRlRGF0YUFubm90YXRpb25zIjogdHJ1ZSwKICAgICJhbnlUeXBlIjogIm9iamVjdCIsCiAgICAiZGF0ZVR5cGUiOiAiU3lzdGVtLkRhdGVUaW1lT2Zmc2V0IiwKICAgICJkYXRlVGltZVR5cGUiOiAiU3lzdGVtLkRhdGVUaW1lT2Zmc2V0IiwKICAgICJ0aW1lVHlwZSI6ICJTeXN0ZW0uVGltZVNwYW4iLAogICAgInRpbWVTcGFuVHlwZSI6ICJTeXN0ZW0uVGltZVNwYW4iLAogICAgImFycmF5VHlwZSI6ICJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JQ29sbGVjdGlvbiIsCiAgICAiZGljdGlvbmFyeVR5cGUiOiAiU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSURpY3Rpb25hcnkiLAogICAgImFycmF5SW5zdGFuY2VUeXBlIjogIlN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5Db2xsZWN0aW9uIiwKICAgICJkaWN0aW9uYXJ5SW5zdGFuY2VUeXBlIjogIlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnkiLAogICAgImFycmF5QmFzZVR5cGUiOiAiU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb24iLAogICAgImRpY3Rpb25hcnlCYXNlVHlwZSI6ICJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5IiwKICAgICJwcm9wZXJ0eVNldHRlckFjY2Vzc01vZGlmaWVyIjogIiIsCiAgICAiZ2VuZXJhdGVJbW11dGFibGVBcnJheVByb3BlcnRpZXMiOiBmYWxzZSwKICAgICJnZW5lcmF0ZUltbXV0YWJsZURpY3Rpb25hcnlQcm9wZXJ0aWVzIjogZmFsc2UsCiAgICAiaGFuZGxlUmVmZXJlbmNlcyI6IGZhbHNlLAogICAgImpzb25TZXJpYWxpemVyU2V0dGluZ3NUcmFuc2Zvcm1hdGlvbk1ldGhvZCI6IG51bGwsCiAgICAiZ2VuZXJhdGVKc29uTWV0aG9kcyI6IGZhbHNlLAogICAgImVuZm9yY2VGbGFnRW51bXMiOiBmYWxzZSwKICAgICJpbmxpbmVOYW1lZERpY3Rpb25hcmllcyI6IGZhbHNlLAogICAgImlubGluZU5hbWVkVHVwbGVzIjogdHJ1ZSwKICAgICJpbmxpbmVOYW1lZEFycmF5cyI6IGZhbHNlLAogICAgImdlbmVyYXRlT3B0aW9uYWxQcm9wZXJ0aWVzQXNOdWxsYWJsZSI6IGZhbHNlLAogICAgImdlbmVyYXRlTnVsbGFibGVSZWZlcmVuY2VUeXBlcyI6IGZhbHNlLAogICAgImdlbmVyYXRlTmF0aXZlUmVjb3JkcyI6IGZhbHNlLAogICAgImdlbmVyYXRlRGVmYXVsdFZhbHVlcyI6IHRydWUsCiAgICAiaW5saW5lTmFtZWRBbnkiOiBmYWxzZSwKICAgICJkYXRlRm9ybWF0IjogInl5eXktTU0tZGQiLAogICAgImV4Y2x1ZGVkVHlwZU5hbWVzIjogWwogICAgICAiRXhjbHVkZWRUeXBlRm9vIiwKICAgICAgIkV4Y2x1ZGVkVHlwZUJhciIKICAgIF0KICB9Cn0KYGBgCgotIGBvcGVuQXBpUGF0aGAgLSBwb2ludHMgdG8gdGhlIE9wZW5BUEkgU3BlY2lmaWNhdGlvbnMgZmlsZS4gVGhpcyBjYW4gYmUgdGhlIHBhdGggdG8gYSBmaWxlIHN0b3JlZCBvbiBkaXNrLCByZWxhdGl2ZSB0byB0aGUgYC5yZWZpdHRlcmAgZmlsZS4gVGhpcyBjYW4gYWxzbyBiZSBhIFVSTCB0byBhIHJlbW90ZSBmaWxlIHRoYXQgd2lsbCBiZSBkb3dubG9hZGVkIG92ZXIgSFRUUC9IVFRQUwotIGBuYW1lc3BhY2VgIC0gdGhlIG5hbWVzcGFjZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gSWYgbm90IHNwZWNpZmllZCwgdGhpcyBkZWZhdWx0cyB0byBgR2VuZXJhdGVkQ29kZWAKLSBgbmFtaW5nLnVzZU9wZW5BcGlUaXRsZWAgLSBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBPcGVuQXBpIHRpdGxlIHNob3VsZCBiZSB1c2VkLiBEZWZhdWx0IGlzIGB0cnVlYAotIGBuYW1pbmcuaW50ZXJmYWNlTmFtZWAgLSB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZS4gVGhlIGdlbmVyYXRlZCBjb2RlIHdpbGwgYXV0b21hdGljYWxseSBwcmVmaXggdGhpcyB3aXRoIGBJYCBzbyBpZiB0aGlzIHNldCB0byBgTXlBcGlDbGllbnRgIHRoZW4gdGhlIGdlbmVyYXRlZCBpbnRlcmZhY2UgaXMgY2FsbGVkIGBJTXlBcGlDbGllbnRgLiBEZWZhdWx0IGlzIGBBcGlDbGllbnRgCi0gYGdlbmVyYXRlQ29udHJhY3RzYCAtIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgY29udHJhY3RzIHNob3VsZCBiZSBnZW5lcmF0ZWQuIEEgdXNlIGNhc2UgZm9yIHRoaXMgaXMgc2V2ZXJhbCBBUEkgY2xpZW50cyB1c2UgdGhlIHNhbWUgY29udHJhY3RzLiBEZWZhdWx0IGlzIGB0cnVlYAotIGBnZW5lcmF0ZUNsaWVudHNgOiAgLSBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGNsaWVudHMgc2hvdWxkIGJlIGdlbmVyYXRlZC4gQSB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0byBzZXBlcmF0ZSBjbGllbnRzIGFuZCBjb250cmFjdHMgaW4gdHdvIGdlbmVyYXRpb24KLSBgZ2VuZXJhdGVYbWxEb2NDb2RlQ29tbWVudHNgIC0gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBYTUwgZG9jIGNvbW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQuIERlZmF1bHQgaXMgYHRydWVgCi0gYGdlbmVyYXRlU3RhdHVzQ29kZUNvbW1lbnRzYCAtIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFhNTCBkb2NzIGZvciBgQXBpRXhjZXB0aW9uYCBhbmQgYElBcGlSZXNwb25zZWAgY29udGFpbiBkZXRhaWxlZCBkZXNjcmlwdGlvbnMgZm9yIGV2ZXJ5IGRvY3VtZW50ZWQgc3RhdHVzIGNvZGUuIERlZmF1bHQgaXMgYHRydWVgCi0gYGFkZEF1dG9HZW5lcmF0ZWRIZWFkZXJgIC0gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBYTUwgZG9jIGNvbW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQuIERlZmF1bHQgaXMgYHRydWVgCi0gYGFkZEFjY2VwdEhlYWRlcnNgIC0gIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gYWRkIGFjY2VwdCBoZWFkZXJzIFtIZWFkZXJzKCJBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24iKV0uIERlZmF1bHQgaXMgYHRydWVgCi0gYHJldHVybklBcGlSZXNwb25zZWAgLSBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHJldHVybiBgSUFwaVJlc3BvbnNlPFQ+YCBvYmplY3RzLiBEZWZhdWx0IGlzIGBmYWxzZWAKLSBgcmVzcG9uc2VUeXBlT3ZlcnJpZGVgIC0gYSBkaWN0aW9uYXJ5IHdpdGggb3BlcmF0aW9uIGlkcyAoYXMgc3BlY2lmaWVkIGluIHRoZSBPcGVuQVBJIGRvY3VtZW50KSBhbmQgYSBwYXJ0aWN1bGFyIHJldHVybiB0eXBlIHRvIHVzZS4gVGhlIHR5cGVzIGFyZSB3cmFwcGVkIGluIGEgdGFzaywgYnV0IG90aGVyd2lzZSB1bm1vZGlmaWVkIChzbyBtYWtlIHN1cmUgdG8gc3BlY2lmeSBvciBpbXBvcnQgdGhlaXIgbmFtZXNwYWNlcykuIERlZmF1bHQgaXMgYHt9YAotIGBnZW5lcmF0ZU9wZXJhdGlvbkhlYWRlcnNgIC0gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byB1c2Ugb3BlcmF0aW9uIGhlYWRlcnMgaW4gdGhlIGdlbmVyYXRlZCBtZXRob2RzLiBEZWZhdWx0IGlzIGB0cnVlYAotIGB0eXBlQWNjZXNzaWJpbGl0eWAgLSB0aGUgZ2VuZXJhdGVkIHR5cGUgYWNjZXNzaWJpbGl0eS4gUG9zc2libGUgdmFsdWVzIGFyZSBgUHVibGljYCBhbmQgYEludGVybmFsYC4gRGVmYXVsdCBpcyBgUHVibGljYAotIGB1c2VDYW5jZWxsYXRpb25Ub2tlbnNgIC0gVXNlIGNhbmNlbGxhdGlvbiB0b2tlbnMgaW4gdGhlIGdlbmVyYXRlZCBtZXRob2RzLiBEZWZhdWx0IGlzIGBmYWxzZWAKLSBgdXNlSXNvRGF0ZUZvcm1hdGAgLSBTZXQgdG8gYHRydWVgIHRvIGV4cGxpY2l0bHkgZm9ybWF0IGRhdGUgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgaW4gSVNPIDg2MDEgc3RhbmRhcmQgZGF0ZSBmb3JtYXQgdXNpbmcgZGVsaW1pdGVycyAoZm9yIGV4YW1wbGU6IDIwMjMtMDYtMTUpLiBEZWZhdWx0IGlzIGBmYWxzZWAKLSBgbXVsdGlwbGVJbnRlcmZhY2VzYCAtIFNldCB0byBgQnlFbmRwb2ludGAgdG8gZ2VuZXJhdGUgYW4gaW50ZXJmYWNlIGZvciBlYWNoIGVuZHBvaW50LCBvciBgQnlUYWdgIHRvIGdyb3VwIEVuZHBvaW50cyBieSB0aGVpciBUYWcgKGxpa2UgU3dhZ2dlclVJIGdyb3VwcyB0aGVtKS4KLSBgb3V0cHV0Rm9sZGVyYCAtIGEgc3RyaW5nIGRlc2NyaWJpbmcgYSByZWxhdGl2ZSBwYXRoIHRvIGEgZGVzaXJlZCBvdXRwdXQgZm9sZGVyLiBEZWZhdWx0IGlzIGAuL0dlbmVyYXRlZGAKLSBgb3V0cHV0RmlsZW5hbWVgIC0gT3V0cHV0IGZpbGVuYW1lLiBEZWZhdWx0IGlzIGBPdXRwdXQuY3NgIHdoZW4gdXNlZCBmcm9tIHRoZSBDTEkgdG9vbCwgb3RoZXJ3aXNlIGl0cyB0aGUgLnJlZml0dGVyIGZpbGVuYW1lLiBTbyBgUGV0c3RvcmUucmVmaXR0ZXJgIGJlY29tZXMgYFBldHN0b3JlLmNzYC4KLSBgYWRkaXRpb25hbE5hbWVzcGFjZXNgIC0gQSBjb2xsZWN0aW9uIG9mIGFkZGl0aW9uYWwgbmFtZXNwYWNlcyB0byBpbmNsdWRlIGluIHRoZSBnZW5lcmF0ZWQgZmlsZS4gQSB1c2UgY2FzZSBmb3IgdGhpcyBpcyB3aGVuIHlvdSB3YW50IHRvIHJldXNlIGNvbnRyYWN0cyBmcm9tIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0aGFuIHRoZSBnZW5lcmF0ZWQgY29kZS4gRGVmYXVsdCBpcyBlbXB0eQotIGBpbmNsdWRlVGFnc2AgLSBBIGNvbGxlY3Rpb24gb2YgdGFncyB0byB1c2UgYSBmaWx0ZXIgZm9yIGluY2x1ZGluZyBlbmRwb2ludHMgdGhhdCBjb250YWluIHRoaXMgdGFnLgotIGBpbmNsdWRlUGF0aE1hdGNoZXNgIC0gQSBjb2xsZWN0aW9uIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdXNlZCB0byBmaWx0ZXIgcGF0aHMuCi0gYGdlbmVyYXRlRGVwcmVjYXRlZE9wZXJhdGlvbnNgIC0gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBkZXByZWNhdGVkIG9wZXJhdGlvbnMgc2hvdWxkIGJlIGdlbmVyYXRlZCBvciBza2lwcGVkLiBEZWZhdWx0IGlzIGB0cnVlYAotIGBvcGVyYXRpb25OYW1lVGVtcGxhdGVgIC0gR2VuZXJhdGUgb3BlcmF0aW9uIG5hbWVzIHVzaW5nIHBhdHRlcm4uIFRoaXMgbXVzdCBjb250YWluIHRoZSBzdHJpbmcge29wZXJhdGlvbk5hbWV9LiBBbiBleGFtcGxlIHVzYWdlIG9mIHRoaXMgY291bGQgYmUgYHtvcGVyYXRpb25OYW1lfUFzeW5jYCB0byBzdWZmaXggYWxsIG1ldGhvZCBuYW1lcyB3aXRoIEFzeW5jCi0gYG9wdGlvbmFsUGFyYW1ldGVyc2AgLSBHZW5lcmF0ZSBub24tcmVxdWlyZWQgcGFyYW1ldGVycyBhcyBudWxsYWJsZSBvcHRpb25hbCBwYXJhbWV0ZXJzCi0gYHRyaW1VbnVzZWRTY2hlbWFgIC0gUmVtb3ZlcyB1bnJlZmVyZW5jZWQgY29tcG9uZW50cyBzY2hlbWEgdG8ga2VlcCB0aGUgZ2VuZXJhdGVkIG91dHB1dCB0byBhIG1pbmltdW0KLSBga2VlcFNjaGVtYVBhdHRlcm5zYDogQSBjb2xsZWN0aW9uIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gZm9yY2UgdG8ga2VlcCBtYXRjaGluZyBzY2hlbWEuIFRoaXMgaXMgdXNlZCB0b2dldGhlciB3aXRoIGB0cmltVW51c2VkU2NoZW1hYAotIGBnZW5lcmF0ZURlZmF1bHRBZGRpdGlvbmFsUHJvcGVydGllc2A6IFNldCB0byBgZmFsc2VgIHRvIHNraXAgZGVmYXVsdCBhZGRpdGlvbmFsIHByb3BlcnRpZXMuIERlZmF1bHQgaXMgYHRydWVgCi0gYG9wZXJhdGlvbk5hbWVHZW5lcmF0b3JgOiBUaGUgTlN3YWcgYElPcGVyYXRpb25OYW1lR2VuZXJhdG9yYCBpbXBsZW1lbnRhdGlvbiB0byB1c2UuIFNlZSBodHRwczovL3JlZml0dGVyLmdpdGh1Yi5pby9hcGkvUmVmaXR0ZXIuQ29yZS5PcGVyYXRpb25OYW1lR2VuZXJhdG9yVHlwZXMuaHRtbAotIGBpbW11dGFibGVSZWNvcmRzYDogU2V0IHRvIGB0cnVlYCB0byBnZW5lcmF0ZSBjb250cmFjdHMgYXMgaW1tdXRhYmxlIHJlY29yZHMgaW5zdGVhZCBvZiBjbGFzc2VzLiBEZWZhdWx0IGlzIGBmYWxzZWAKLSBgdXNlRHluYW1pY1F1ZXJ5c3RyaW5nUGFyYW1ldGVyc2A6IFNldCB0byBgdHJ1ZWAgdG8gd3JhcCBtdWx0aXBsZSBxdWVyeSBwYXJhbWV0ZXJzIGludG8gYSBzaW5nbGUgY29tcGxleCBvbmUuIERlZmF1bHQgaXMgYGZhbHNlYCAobm8gd3JhcHBpbmcpLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0aXZldWkvcmVmaXQ/dGFiPXJlYWRtZS1vdi1maWxlI2R5bmFtaWMtcXVlcnlzdHJpbmctcGFyYW1ldGVycyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSBgZGVwZW5kZW5jeUluamVjdGlvblNldHRpbmdzYCAtIFNldHRpbmcgdGhpcyB3aWxsIGdlbmVyYXRlZCBleHRlbnNpb24gbWV0aG9kcyB0byBgSVNlcnZpY2VDb2xsZWN0aW9uYCBmb3IgY29uZmlndXJpbmcgUmVmaXQgY2xpZW50cwogIC0gYGJhc2VVcmxgIC0gVXNlZCBhcyB0aGUgSHR0cENsaWVudCBiYXNlIGFkZHJlc3MuIExlYXZlIHRoaXMgYmxhbmsgdG8gbWFudWFsbHkgc2V0IHRoZSBiYXNlIFVSTAogIC0gYGh0dHBNZXNzYWdlSGFuZGxlcnNgIC0gQSBjb2xsZWN0aW9uIG9mIGBIdHRwTWVzc2FnZUhhbmRsZXJgIHRoYXQgaXMgYWRkZWQgdG8gdGhlIEh0dHBDbGllbnQgcGlwZWxpbmUKICAtIGB1c2VQb2xseWAgLSBTZXQgdGhpcyB0byBgdHJ1ZWAgdG8gY29uZmlndXJlIHRoZSBIdHRwQ2xpZW50IHRvIHVzZSBQb2xseSB1c2luZyBhIHJldHJ5IHBvbGljeSB3aXRoIGEgaml0dGVyZWQgYmFja29mZi4gIFRoaXMgaXMgKipERVBSRUNBVEVEKiosIHVzZSBgdHJhbnNpZW50RXJyb3JIYW5kbGVyYCBpbnN0ZWFkCiAgLSBgdHJhbnNpZW50RXJyb3JIYW5kbGVyYDogU2V0IHRoaXMgdG8gY29uZmlndXJlIHRyYW5zaWVudCBlcnJvciBoYW5kbGluZyB3aXRoIGEgcmV0cnkgcG9saWN5IHRoYXQgdXNlcyBhIGppdHRlcmVkIGJhY2tvZmYuIFNlZSBodHRwczovL3JlZml0dGVyLmdpdGh1Yi5pby9hcGkvUmVmaXR0ZXIuQ29yZS5UcmFuc2llbnRFcnJvckhhbmRsZXIuaHRtbAogIC0gYGZpcnN0QmFja29mZlJldHJ5SW5TZWNvbmRzYCAtIFRoaXMgaXMgdGhlIGR1cmF0aW9uIG9mIHRoZSBpbml0aWFsIHJldHJ5IGJhY2tvZmYuIERlZmF1bHQgaXMgMSBzZWNvbmQKLSBgYXBpenJTZXR0aW5nc2AgLSBTZXR0aW5nIHRoaXMgd2lsbCBmb3JtYXQgUmVmaXQgaW50ZXJmYWNlIHRvIGJlIG1hbmFnZWQgYnkgQXBpenIuIFNlZSBodHRwczovL3d3dy5hcGl6ci5uZXQgZm9yIG1vcmUgaW5mb3JtYXRpb24KICAtIGB3aXRoUmVxdWVzdE9wdGlvbnNgIC0gVGVsbHMgaWYgdGhlIFJlZml0IGludGVyZmFjZSBtZXRob2RzIHNob3VsZCBoYXZlIGEgZmluYWwgSUFwaXpyUmVxdWVzdE9wdGlvbnMgb3B0aW9ucyBwYXJhbWV0ZXIKICAtIGB3aXRoUmVnaXN0cmF0aW9uSGVscGVyYCAtIFRlbGxzIGlmIFJlZml0dGVyIHNob3VsZCBnZW5lcmF0ZSBBcGl6ciByZWdpc3RyYXRpb24gaGVscGVycyAoZXh0ZW5kZWQgd2l0aCBkZXBlbmRlbmN5SW5qZWN0aW9uU2V0dGluZ3Mgc2V0LCBvdGhlcndpc2Ugc3RhdGljKQogIC0gYHdpdGhDYWNoZVByb3ZpZGVyYCAtIFNldCB0aGUgY2FjaGUgcHJvdmlkZXIgdG8gYmUgdXNlZAogIC0gYHdpdGhQcmlvcml0eWAgLSBUZWxscyBpZiBBcGl6ciBzaG91bGQgaGFuZGxlIHJlcXVlc3QgcHJpb3JpdHkKICAtIGB3aXRoTWVkaWF0aW9uYCAtIFRlbGxzIGlmIEFwaXpyIHNob3VsZCBoYW5kbGUgcmVxdWVzdCBtZWRpYXRpb24gKGV4dGVuZGVkIG9ubHkpCiAgLSBgd2l0aE9wdGlvbmFsTWVkaWF0aW9uYCAtIFRlbGxzIGlmIEFwaXpyIHNob3VsZCBoYW5kbGUgb3B0aW9uYWwgcmVxdWVzdCBtZWRpYXRpb24gKGV4dGVuZGVkIG9ubHkpCiAgLSBgd2l0aE1hcHBpbmdQcm92aWRlcmAgLSBTZXQgdGhlIG1hcHBpbmcgcHJvdmlkZXIgdG8gYmUgdXNlZAogIC0gYHdpdGhGaWxlVHJhbnNmZXJgIC0gVGVsbHMgaWYgQXBpenIgc2hvdWxkIGhhbmRsZSBmaWxlIHRyYW5zZmVyCi0gYGNvZGVHZW5lcmF0b3JTZXR0aW5nc2AgLSBTZXR0aW5nIHRoaXMgYWxsb3dzIGN1c3RvbWl6YXRpb24gb2YgdGhlIE5Td2FnIGdlbmVyYXRlZCB0eXBlcyBhbmQgY29udHJhY3RzCiAgLSBgcmVxdWlyZWRQcm9wZXJ0aWVzTXVzdEJlRGVmaW5lZGAgLSBEZWZhdWx0IGlzIHRydWUsCiAgLSBgZ2VuZXJhdGVEYXRhQW5ub3RhdGlvbnNgIC0gRGVmYXVsdCBpcyB0cnVlLAogIC0gYGFueVR5cGVgIC0gRGVmYXVsdCBpcyBgb2JqZWN0YCwKICAtIGBkYXRlVHlwZWAgLSBEZWZhdWx0IGlzIGBTeXN0ZW0uRGF0ZVRpbWVPZmZzZXRgLAogIC0gYGRhdGVUaW1lVHlwZWAgLSBEZWZhdWx0IGlzIGBTeXN0ZW0uRGF0ZVRpbWVPZmZzZXRgLAogIC0gYHRpbWVUeXBlYCAtIERlZmF1bHQgaXMgYFN5c3RlbS5UaW1lU3BhbmAsCiAgLSBgdGltZVNwYW5UeXBlYCAtIERlZmF1bHQgaXMgYFN5c3RlbS5UaW1lU3BhbmAsCiAgLSBgYXJyYXlUeXBlYCAtIERlZmF1bHQgaXMgYFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklDb2xsZWN0aW9uYCwKICAtIGBkaWN0aW9uYXJ5VHlwZWAgLSBEZWZhdWx0IGlzIGBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRGljdGlvbmFyeWAsCiAgLSBgYXJyYXlJbnN0YW5jZVR5cGVgIC0gRGVmYXVsdCBpcyBgU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gLAogIC0gYGRpY3Rpb25hcnlJbnN0YW5jZVR5cGVgIC0gRGVmYXVsdCBpcyBgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAsCiAgLSBgYXJyYXlCYXNlVHlwZWAgLSBEZWZhdWx0IGlzIGBTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuQ29sbGVjdGlvbmAsCiAgLSBgZGljdGlvbmFyeUJhc2VUeXBlYCAtIERlZmF1bHQgaXMgYFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgLAogIC0gYHByb3BlcnR5U2V0dGVyQWNjZXNzTW9kaWZpZXJgIC0gRGVmYXVsdCBpcyBgYCwKICAtIGBnZW5lcmF0ZUltbXV0YWJsZUFycmF5UHJvcGVydGllc2AgLSBEZWZhdWx0IGlzIGZhbHNlLAogIC0gYGdlbmVyYXRlSW1tdXRhYmxlRGljdGlvbmFyeVByb3BlcnRpZXNgIC0gRGVmYXVsdCBpcyBmYWxzZSwKICAtIGBoYW5kbGVSZWZlcmVuY2VzYCAtIERlZmF1bHQgaXMgZmFsc2UsCiAgLSBganNvblNlcmlhbGl6ZXJTZXR0aW5nc1RyYW5zZm9ybWF0aW9uTWV0aG9kYCAtIERlZmF1bHQgaXMgbnVsbCwKICAtIGBnZW5lcmF0ZUpzb25NZXRob2RzYCAtIERlZmF1bHQgaXMgZmFsc2UsCiAgLSBgZW5mb3JjZUZsYWdFbnVtc2AgLSBEZWZhdWx0IGlzIGZhbHNlLAogIC0gYGlubGluZU5hbWVkRGljdGlvbmFyaWVzYCAtIERlZmF1bHQgaXMgZmFsc2UsCiAgLSBgaW5saW5lTmFtZWRUdXBsZXNgIC0gRGVmYXVsdCBpcyB0cnVlLAogIC0gYGlubGluZU5hbWVkQXJyYXlzYCAtIERlZmF1bHQgaXMgZmFsc2UsCiAgLSBgZ2VuZXJhdGVPcHRpb25hbFByb3BlcnRpZXNBc051bGxhYmxlYCAtIERlZmF1bHQgaXMgZmFsc2UsCiAgLSBgZ2VuZXJhdGVOdWxsYWJsZVJlZmVyZW5jZVR5cGVzYCAtIERlZmF1bHQgaXMgZmFsc2UsCiAgLSBgZ2VuZXJhdGVOYXRpdmVSZWNvcmRzYCAtIERlZmF1bHQgaXMgZmFsc2UKICAtIGBnZW5lcmF0ZURlZmF1bHRWYWx1ZXNgIC0gRGVmYXVsdCBpcyB0cnVlCiAgLSBgaW5saW5lTmFtZWRBbnlgIC0gRGVmYXVsdCBpcyBmYWxzZQogIC0gYGRhdGVGb3JtYXRgIC0gRGVmYXVsdCBpcyBgeXl5eS1NTS1kZGAKICAtIGBleGNsdWRlZFR5cGVOYW1lc2AgLSBEZWZhdWx0IGlzIGVtcHR5CgojIyBNU0J1aWxkCgpBIGNvbW1vbiBzY2VuYXJpbyBmb3IgZ2VuZXJhdGluZyBjb2RlIGZyb20gT3BlbkFQSSBzcGVjaWZpY2F0aW9ucyBpcyB0byBkbyBpdCBhdCBidWlsZCB0aW1lLiBUaGlzIGNhbiBiZSBhY2hpZXZlZCB1c2luZyBNU0J1aWxkIHRhc2tzLiBBbiBleGFtcGxlIG9mIHN1Y2ggYW4gYXBwcm9hY2ggd291bGQgYmUgdG8gaW5jbHVkZSBhIGAucmVmaXR0ZXJgIGZpbGUgaW4gdGhlIHByb2plY3RzIGRpcmVjdG9yeSBhbmQgZXhlY3V0ZSB0aGUgUmVmaXR0ZXIgQ0xJIGZyb20gcHJlLWJ1aWxkIGV2ZW50cwoKYGBgeG1sCjxUYXJnZXQgTmFtZT0iUmVmaXR0ZXIiIEFmdGVyVGFyZ2V0cz0iUHJlQnVpbGRFdmVudCI+CiAgICA8RXhlYyBXb3JraW5nRGlyZWN0b3J5PSIkKFByb2plY3REaXIpIiBDb21tYW5kPSJyZWZpdHRlciAtLXNldHRpbmdzLWZpbGUgLnJlZml0dGVyIC0tc2tpcC12YWxpZGF0aW9uIiAvPgo8L1RhcmdldD4KYGBgCgpUaGUgc25pcHBldCBhYm92ZSByZXF1aXJlcyB0aGF0IFJlZml0dGVyIGlzIGluc3RhbGxlZCBvbiB0aGUgbWFjaGluZSBhcyBhIGdsb2JhbGx5IGF2YWlsYWJsZSBkb3RuZXQgdG9vbC4gVGhpcyBtaWdodCBub3QgYmUgdGhlIGNhc2UgaWYgeW91J3JlIHJ1bm5pbmcgb24gYSBidWlsZCBhZ2VudCBmcm9tIGEgQ0kvQ0QgZW52aXJvbm1lbnQuIEluIHRoaXMgY2FzZSB5b3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIFJlZml0dGVyIGFzIGEgbG9jYWwgdG9vbCB1c2luZyBhIG1hbmlmZXN0IGZpbGUsIGFzIGRlc2NyaWJlZCBpbiBbdGhpcyB0dXRvcmlhbF0oaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL2RvdG5ldC9jb3JlL3Rvb2xzL2xvY2FsLXRvb2xzLWhvdy10by11c2U/V1QubWNfaWQ9RFQtTVZQLTUwMDQ4MjIpCgpgYGB4bWwKPFRhcmdldCBOYW1lPSJSZWZpdHRlciIgQWZ0ZXJUYXJnZXRzPSJQcmVCdWlsZEV2ZW50Ij4KICAgIDxFeGVjIFdvcmtpbmdEaXJlY3Rvcnk9IiQoUHJvamVjdERpcikiIENvbW1hbmQ9ImRvdG5ldCB0b29sIHJlc3RvcmUiIC8+CiAgICA8RXhlYyBXb3JraW5nRGlyZWN0b3J5PSIkKFByb2plY3REaXIpIiBDb21tYW5kPSJyZWZpdHRlciAtLXNldHRpbmdzLWZpbGUgLnJlZml0dGVyIC0tc2tpcC12YWxpZGF0aW9uIiAvPgo8L1RhcmdldD4KYGBgCgpUaGUgYGRvdG5ldCBidWlsZGAgcHJvY2VzcyBkb2VzIHdpbGwgcHJvYmFibHkgbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBwYWNrYWdlIHJlcG9zaXRvcnkgaW4gd2hpY2ggdG8gZG93bmxvYWQgUmVmaXR0ZXIgZnJvbSwgdGhpcyBpcyBhdCBsZWFzdCB0aGUgY2FzZSB3aXRoIEF6dXJlIFBpcGVsaW5lcyBhbmQgQXp1cmUgQXJ0aWZhY3RzLiBUbyB3b3JrYXJvdW5kIHRoaXMsIHlvdSBjYW4gcHJvdmlkZSBhIHNlcGFyYXRlIGBudWdldC5jb25maWdgIHRoYXQgb25seSB1c2VzIGBudWdldC5vcmdgIGFzIGEgYDxwYWNrYWdlU291cmNlPmAuCgpTb21ldGhpbmcgbGlrZSB0aGlzOgoKYGBgeG1sCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cjxjb25maWd1cmF0aW9uPgogIDxwYWNrYWdlU291cmNlcz4KICAgIDxjbGVhciAvPgogICAgPGFkZCBrZXk9Ik51R2V0IiB2YWx1ZT0iaHR0cHM6Ly9hcGkubnVnZXQub3JnL3YzL2luZGV4Lmpzb24iIC8+CiAgPC9wYWNrYWdlU291cmNlcz4KPC9jb25maWd1cmF0aW9uPgpgYGAKCllvdSBtaWdodCB3YW50IHRvIHBsYWNlIHRoZSBgbnVnZXQuY29uZmlnYCBmaWxlIGluIGFub3RoZXIgZm9sZGVyIHRvIGF2b2lkIHVzaW5nIGl0IHRvIGJ1aWxkIHRoZSAuTkVUIHByb2plY3QsIHRoZW4geW91IGNhbiBzcGVjaWZ5IHRoaXMgd2hlbiBleGVjdXRpbmcgYGRvdG5ldCB0b29sIHJlc3RvcmVgCgpgYGB4bWwKPFRhcmdldCBOYW1lPSJSZWZpdHRlciIgQWZ0ZXJUYXJnZXRzPSJQcmVCdWlsZEV2ZW50Ij4KICAgIDxFeGVjIFdvcmtpbmdEaXJlY3Rvcnk9IiQoUHJvamVjdERpcikiIENvbW1hbmQ9ImRvdG5ldCB0b29sIHJlc3RvcmUgLS1jb25maWdmaWxlIHJlZml0dGVyL251Z2V0LmNvbmZpZyIgLz4KICAgIDxFeGVjIFdvcmtpbmdEaXJlY3Rvcnk9IiQoUHJvamVjdERpcikiIENvbW1hbmQ9InJlZml0dGVyIC0tc2V0dGluZ3MtZmlsZSAucmVmaXR0ZXIgLS1za2lwLXZhbGlkYXRpb24iIC8+CjwvVGFyZ2V0PgpgYGAKCkluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgYG51Z2V0LmNvbmZpZ2AgZmlsZSBpcyBwbGFjZWQgdW5kZXIgdGhlIGByZWZpdHRlcmAgZm9sZGVyLgoKIyMjIFJlZml0dGVyLk1TQnVpbGQgcGFja2FnZQoKUmVmaXR0ZXIgc2hpcHMgd2l0aCBhbiBNU0J1aWxkIGN1c3RvbSB0YXNrIHRoYXQgaXMgZGlzdHJpYnV0ZWQgYXMgYSBOdUdldCBwYWNrYWdlIGFuZCBpbmNsdWRlcyB0aGUgUmVmaXR0ZXIgQ0xJIGJpbmFyeS4gVGhpcyB3aWxsIHNpbXBsaWZ5IGdlbmVyYXRpbmcgY29kZSBmcm9tIE9wZW5BUEkgc3BlY2lmaWNhdGlvbnMgYXQgYnVpbGQgdGltZS4KClRvIHVzZSB0aGUgcGFja2FnZSwgaW5zdGFsbCBgUmVmaXR0ZXIuTVNCdWlsZGAKCmBgYHhtbAo8SXRlbUdyb3VwPgogICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iUmVmaXR0ZXIuTVNCdWlsZCIgVmVyc2lvbj0iMS41LjAiIC8+CjwvSXRlbUdyb3VwPgpgYGAKClRoZSBNU0J1aWxkIHBhY2thZ2UgaW5jbHVkZXMgYSBjdXN0b20gYC50YXJnZXRgIGZpbGUgd2hpY2ggZXhlY3V0ZXMgdGhlIGBSZWZpdHRlckdlbmVyYXRlVGFza2AgY3VzdG9tIHRhc2sgYW5kIGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoaXM6CgpgYGB4bWwKPFRhcmdldCBOYW1lPSJSZWZpdHRlciIgQmVmb3JlVGFyZ2V0cz0iQmVmb3JlQnVpbGQiPgogICAgPFJlZml0dGVyR2VuZXJhdGVUYXNrIFByb2plY3RGaWxlRGlyZWN0b3J5PSIkKE1TQnVpbGRQcm9qZWN0RGlyZWN0b3J5KSIKICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlTG9nZ2luZz0iJChSZWZpdHRlck5vTG9nZ2luZykiLz4KICAgIDxJdGVtR3JvdXA+CiAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iKiovKi5jcyIgLz4KICAgIDwvSXRlbUdyb3VwPgogIDwvVGFyZ2V0PgpgYGAKClRoZSBgUmVmaXR0ZXJHZW5lcmF0ZVRhc2tgIHRhc2sgd2lsbCBzY2FuIHRoZSBwcm9qZWN0IGZvbGRlciBmb3IgYC5yZWZpdHRlcmAgZmlsZXMgYW5kIGV4ZWN1dGVzIHRoZW0gYWxsLiBCeSBkZWZhdWx0LCB0ZWxlbWV0cnkgY29sbGVjdGlvbiBpcyBlbmFibGVkLCBhbmQgdG8gb3B0LW91dCBvZiBpdCB5b3UgbXVzdCBzcGVjaWZ5IGA8UmVmaXR0ZXJOb0xvZ2dpbmc+dHJ1ZTwvUmVmaXR0ZXJOb0xvZ2dpbmc+YCBpbiB0aGUgYC5jc3Byb2pgIGA8UHJvcGVydHlHcm91cD5gCgoKIyBVc2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUKCkhlcmUncyBhbiBleGFtcGxlIGdlbmVyYXRlZCBvdXRwdXQgZnJvbSB0aGUgW1N3YWdnZXIgUGV0c3RvcmUgZXhhbXBsZV0oaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pbykgdXNpbmcgdGhlIGRlZmF1bHQgc2V0dGluZ3MKCioqQ0xJIFRvb2wqKgoKYGBgYmFzaAokIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbmFtZXNwYWNlICJZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZSIKYGBgCgoqKlNvdXJjZSBHZW5lcmF0b3IgKioqLnJlZml0dGVyKioqIGZpbGUqKgoKYGBganNvbgp7CiAgIm9wZW5BcGlQYXRoIjogIi4vb3BlbmFwaS5qc29uIiwKICAibmFtZXNwYWNlIjogIllvdXIuTmFtZXNwYWNlLk9mLkNob2ljZS5HZW5lcmF0ZWRDb2RlIgp9CmBgYAoKKipPdXRwdXQgKFNuaXBwZXQpKioKCkZ1bGwgb3V0cHV0IGlzIGF2YWlsYWJsZSBbaGVyZV0oZG9jcy9EZWZhdWx0T3V0cHV0LmNzKQoKCmBgYGNzCnVzaW5nIFJlZml0Owp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLlRleHQuSnNvbi5TZXJpYWxpemF0aW9uOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwoKbmFtZXNwYWNlIFlvdXIuTmFtZXNwYWNlLk9mLkNob2ljZS5HZW5lcmF0ZWRDb2RlCnsKICAgIFtTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlKCJSZWZpdHRlciIsICIxLjAuMC4wIildCiAgICBwdWJsaWMgcGFydGlhbCBpbnRlcmZhY2UgSVN3YWdnZXJQZXRzdG9yZQogICAgewogICAgICAgIC8vLyA8c3VtbWFyeT5VcGRhdGUgYW4gZXhpc3RpbmcgcGV0PC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cmVtYXJrcz5VcGRhdGUgYW4gZXhpc3RpbmcgcGV0IGJ5IElkPC9yZW1hcmtzPgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYm9keSI+VXBkYXRlIGFuIGV4aXN0ZW50IHBldCBpbiB0aGUgc3RvcmU8L3BhcmFtPgogICAgICAgIC8vLyA8cmV0dXJucz5TdWNjZXNzZnVsIG9wZXJhdGlvbjwvcmV0dXJucz4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcGlFeGNlcHRpb24iPgogICAgICAgIC8vLyBUaHJvd24gd2hlbiB0aGUgcmVxdWVzdCByZXR1cm5zIGEgbm9uLXN1Y2Nlc3Mgc3RhdHVzIGNvZGU6CiAgICAgICAgLy8vIDxsaXN0IHR5cGU9InRhYmxlIj4KICAgICAgICAvLy8gPGxpc3RoZWFkZXI+CiAgICAgICAgLy8vIDx0ZXJtPlN0YXR1czwvdGVybT4KICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KICAgICAgICAvLy8gPC9saXN0aGVhZGVyPgogICAgICAgIC8vLyA8aXRlbT4KICAgICAgICAvLy8gPHRlcm0+NDAwPC90ZXJtPgogICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+SW52YWxpZCBJRCBzdXBwbGllZDwvZGVzY3JpcHRpb24+CiAgICAgICAgLy8vIDwvaXRlbT4KICAgICAgICAvLy8gPGl0ZW0+CiAgICAgICAgLy8vIDx0ZXJtPjQwNDwvdGVybT4KICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPlBldCBub3QgZm91bmQ8L2Rlc2NyaXB0aW9uPgogICAgICAgIC8vLyA8L2l0ZW0+CiAgICAgICAgLy8vIDxpdGVtPgogICAgICAgIC8vLyA8dGVybT40MDU8L3Rlcm0+CiAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj5WYWxpZGF0aW9uIGV4Y2VwdGlvbjwvZGVzY3JpcHRpb24+CiAgICAgICAgLy8vIDwvaXRlbT4KICAgICAgICAvLy8gPC9saXN0PgogICAgICAgIC8vLyA8L2V4Y2VwdGlvbj4KICAgICAgICBbSGVhZGVycygiQWNjZXB0OiBhcHBsaWNhdGlvbi94bWwsIGFwcGxpY2F0aW9uL2pzb24iKV0KICAgICAgICBbUHV0KCIvcGV0IildCiAgICAgICAgVGFzazxQZXQ+IFVwZGF0ZVBldChbQm9keV0gUGV0IGJvZHkpOwoKICAgICAgICAuLi4KICAgIH0KfQpgYGAKCkhlcmUncyBhbiBleGFtcGxlIGdlbmVyYXRlZCBvdXRwdXQgZnJvbSB0aGUgW1N3YWdnZXIgUGV0c3RvcmUgZXhhbXBsZV0oaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pbykgY29uZmlndXJlZCB0byB3cmFwIHRoZSByZXR1cm4gdHlwZSBpbiBgSUFwaVJlc3BvbnNlPFQ+YAoKKipDTEkgVG9vbCoqCgpgYGBiYXNoCiQgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1uYW1lc3BhY2UgIllvdXIuTmFtZXNwYWNlLk9mLkNob2ljZS5HZW5lcmF0ZWRDb2RlIiAtLXVzZS1hcGktcmVzcG9uc2UKYGBgCgoqKlNvdXJjZSBHZW5lcmF0b3IgKioqLnJlZml0dGVyKioqIGZpbGUqKgoKYGBganNvbgp7CiAgIm9wZW5BcGlQYXRoIjogIi4vb3BlbmFwaS5qc29uIiwKICAibmFtZXNwYWNlIjogIllvdXIuTmFtZXNwYWNlLk9mLkNob2ljZS5HZW5lcmF0ZWRDb2RlIiwKICAicmV0dXJuSUFwaVJlc3BvbnNlIjogdHJ1ZQp9CmBgYAoKKipPdXRwdXQgKFNuaXBwZXQpKioKCkZ1bGwgb3V0cHV0IGlzIGF2YWlsYWJsZSBbaGVyZV0oZG9jcy9JQXBpUmVzcG9uc2VPdXRwdXQuY3MpCgpgYGBjcwp1c2luZyBSZWZpdDsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CnVzaW5nIFN5c3RlbS5UZXh0Lkpzb24uU2VyaWFsaXphdGlvbjsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKCm5hbWVzcGFjZSBZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZQp7CiAgICBbU3lzdGVtLkNvZGVEb20uQ29tcGlsZXIuR2VuZXJhdGVkQ29kZSgiUmVmaXR0ZXIiLCAiMS4wLjAuMCIpXQogICAgcHVibGljIHBhcnRpYWwgaW50ZXJmYWNlIElTd2FnZ2VyUGV0c3RvcmUKICAgIHsKICAgICAgICAvLy8gPHN1bW1hcnk+VXBkYXRlIGFuIGV4aXN0aW5nIHBldDwvc3VtbWFyeT4KICAgICAgICAvLy8gPHJlbWFya3M+VXBkYXRlIGFuIGV4aXN0aW5nIHBldCBieSBJZDwvcmVtYXJrcz4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJvZHkiPlVwZGF0ZSBhbiBleGlzdGVudCBwZXQgaW4gdGhlIHN0b3JlPC9wYXJhbT4KICAgICAgICAvLy8gPHJldHVybnM+CiAgICAgICAgLy8vIEEgPHNlZSBjcmVmPSJUYXNrIi8+IHJlcHJlc2VudGluZyB0aGUgPHNlZSBjcmVmPSJJQXBpUmVzcG9uc2UiLz4gaW5zdGFuY2UgY29udGFpbmluZyB0aGUgcmVzdWx0OgogICAgICAgIC8vLyA8bGlzdCB0eXBlPSJ0YWJsZSI+CiAgICAgICAgLy8vIDxsaXN0aGVhZGVyPgogICAgICAgIC8vLyA8dGVybT5TdGF0dXM8L3Rlcm0+CiAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+CiAgICAgICAgLy8vIDwvbGlzdGhlYWRlcj4KICAgICAgICAvLy8gPGl0ZW0+CiAgICAgICAgLy8vIDx0ZXJtPjIwMDwvdGVybT4KICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPlN1Y2Nlc3NmdWwgb3BlcmF0aW9uPC9kZXNjcmlwdGlvbj4KICAgICAgICAvLy8gPC9pdGVtPgogICAgICAgIC8vLyA8aXRlbT4KICAgICAgICAvLy8gPHRlcm0+NDAwPC90ZXJtPgogICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+SW52YWxpZCBJRCBzdXBwbGllZDwvZGVzY3JpcHRpb24+CiAgICAgICAgLy8vIDwvaXRlbT4KICAgICAgICAvLy8gPGl0ZW0+CiAgICAgICAgLy8vIDx0ZXJtPjQwNDwvdGVybT4KICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPlBldCBub3QgZm91bmQ8L2Rlc2NyaXB0aW9uPgogICAgICAgIC8vLyA8L2l0ZW0+CiAgICAgICAgLy8vIDxpdGVtPgogICAgICAgIC8vLyA8dGVybT40MDU8L3Rlcm0+CiAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj5WYWxpZGF0aW9uIGV4Y2VwdGlvbjwvZGVzY3JpcHRpb24+CiAgICAgICAgLy8vIDwvaXRlbT4KICAgICAgICAvLy8gPC9saXN0PgogICAgICAgIC8vLyA8L3JldHVybnM+CiAgICAgICAgW0hlYWRlcnMoIkFjY2VwdDogYXBwbGljYXRpb24veG1sLCBhcHBsaWNhdGlvbi9qc29uIildCiAgICAgICAgW1B1dCgiL3BldCIpXQogICAgICAgIFRhc2s8SUFwaVJlc3BvbnNlPFBldD4+IFVwZGF0ZVBldChbQm9keV0gUGV0IGJvZHkpOwoKICAgICAgICAuLi4KICAgIH0KfQpgYGAKCkhlcmUncyBhbiBleGFtcGxlIGdlbmVyYXRlZCBvdXRwdXQgZnJvbSB0aGUgW1N3YWdnZXIgUGV0c3RvcmUgZXhhbXBsZV0oaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pbykgY29uZmlndXJlZCB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UgZm9yIGVhY2ggZW5kcG9pbnQKCioqQ0xJIFRvb2wqKgoKYGBgYmFzaAokIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbmFtZXNwYWNlICJZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZSIgLS1tdWx0aXBsZS1pbnRlcmZhY2VzIEJ5RW5kcG9pbnQKYGBgCgoqKlNvdXJjZSBHZW5lcmF0b3IgKioqLnJlZml0dGVyKioqIGZpbGUqKgoKYGBganNvbgp7CiAgIm9wZW5BcGlQYXRoIjogIi4vb3BlbmFwaS5qc29uIiwKICAibmFtZXNwYWNlIjogIllvdXIuTmFtZXNwYWNlLk9mLkNob2ljZS5HZW5lcmF0ZWRDb2RlIiwKICAibXVsdGlwbGVJbnRlcmZhY2VzIjogIkJ5RW5kcG9pbnQiCn0KYGBgCgoqKk91dHB1dCAoU25pcHBldCkqKgoKRnVsbCBvdXRwdXQgaXMgYXZhaWxhYmxlIFtoZXJlXShkb2NzL0lBcGlSZXNwb25zZU91dHB1dC5jcykKCmBgYGNzCi8vLyA8c3VtbWFyeT5VcGRhdGUgYW4gZXhpc3RpbmcgcGV0PC9zdW1tYXJ5PgpbU3lzdGVtLkNvZGVEb20uQ29tcGlsZXIuR2VuZXJhdGVkQ29kZSgiUmVmaXR0ZXIiLCAiMS4wLjAuMCIpXQpwdWJsaWMgcGFydGlhbCBpbnRlcmZhY2UgSVVwZGF0ZVBldEVuZHBvaW50CnsKICAgIC8vLyA8c3VtbWFyeT5VcGRhdGUgYW4gZXhpc3RpbmcgcGV0PC9zdW1tYXJ5PgogICAgLy8vIDxyZW1hcmtzPlVwZGF0ZSBhbiBleGlzdGluZyBwZXQgYnkgSWQ8L3JlbWFya3M+CiAgICAvLy8gPHBhcmFtIG5hbWU9ImJvZHkiPlVwZGF0ZSBhbiBleGlzdGVudCBwZXQgaW4gdGhlIHN0b3JlPC9wYXJhbT4KICAgIC8vLyA8cmV0dXJucz5TdWNjZXNzZnVsIG9wZXJhdGlvbjwvcmV0dXJucz4KICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFwaUV4Y2VwdGlvbiI+CiAgICAvLy8gVGhyb3duIHdoZW4gdGhlIHJlcXVlc3QgcmV0dXJucyBhIG5vbi1zdWNjZXNzIHN0YXR1cyBjb2RlOgogICAgLy8vIDxsaXN0IHR5cGU9InRhYmxlIj4KICAgIC8vLyA8bGlzdGhlYWRlcj4KICAgIC8vLyA8dGVybT5TdGF0dXM8L3Rlcm0+CiAgICAvLy8gPGRlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KICAgIC8vLyA8L2xpc3RoZWFkZXI+CiAgICAvLy8gPGl0ZW0+CiAgICAvLy8gPHRlcm0+NDAwPC90ZXJtPgogICAgLy8vIDxkZXNjcmlwdGlvbj5JbnZhbGlkIElEIHN1cHBsaWVkPC9kZXNjcmlwdGlvbj4KICAgIC8vLyA8L2l0ZW0+CiAgICAvLy8gPGl0ZW0+CiAgICAvLy8gPHRlcm0+NDA0PC90ZXJtPgogICAgLy8vIDxkZXNjcmlwdGlvbj5QZXQgbm90IGZvdW5kPC9kZXNjcmlwdGlvbj4KICAgIC8vLyA8L2l0ZW0+CiAgICAvLy8gPGl0ZW0+CiAgICAvLy8gPHRlcm0+NDA1PC90ZXJtPgogICAgLy8vIDxkZXNjcmlwdGlvbj5WYWxpZGF0aW9uIGV4Y2VwdGlvbjwvZGVzY3JpcHRpb24+CiAgICAvLy8gPC9pdGVtPgogICAgLy8vIDwvbGlzdD4KICAgIC8vLyA8L2V4Y2VwdGlvbj4KICAgIFtIZWFkZXJzKCJBY2NlcHQ6IGFwcGxpY2F0aW9uL3htbCwgYXBwbGljYXRpb24vanNvbiIpXQogICAgW1B1dCgiL3BldCIpXQogICAgVGFzazxQZXQ+IEV4ZWN1dGUoW0JvZHldIFBldCBib2R5KTsKfQpgYGAKCkhlcmUncyBhbiBleGFtcGxlIGdlbmVyYXRlZCBvdXRwdXQgZnJvbSB0aGUgW1N3YWdnZXIgUGV0c3RvcmUgZXhhbXBsZV0oaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pbykgY29uZmlndXJlZCB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2Ugd2l0aCBkeW5hbWljIHF1ZXJ5c3RyaW5nIHBhcmVtZXRlcnMKCioqQ0xJIFRvb2wqKgoKYGBgYmFzaAokIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbmFtZXNwYWNlICJZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZSIgLS11c2UtZHluYW1pYy1xdWVyeXN0cmluZy1wYXJhbWV0ZXJzCmBgYAoKKipPdXRwdXQgKFNuaXBwZXQpKioKCkZ1bGwgb3V0cHV0IGlzIGF2YWlsYWJsZSBbaGVyZV0oZG9jcy9EeW5hbWljUXVlcnlTdHJpbmdQYXJhbWV0ZXJzLmNzKQoKYGBgY3MKW1N5c3RlbS5Db2RlRG9tLkNvbXBpbGVyLkdlbmVyYXRlZENvZGUoIlJlZml0dGVyIiwgIjEuMC4wLjAiKV0KcHVibGljIHBhcnRpYWwgaW50ZXJmYWNlIElTd2FnZ2VyUGV0c3RvcmVPcGVuQVBJMzAKewogICAgLy8vIDxzdW1tYXJ5PlVwZGF0ZXMgYSBwZXQgaW4gdGhlIHN0b3JlIHdpdGggZm9ybSBkYXRhPC9zdW1tYXJ5PgogICAgLy8vIDxwYXJhbSBuYW1lPSJwZXRJZCI+SUQgb2YgcGV0IHRoYXQgbmVlZHMgdG8gYmUgdXBkYXRlZDwvcGFyYW0+CiAgICAvLy8gPHBhcmFtIG5hbWU9InF1ZXJ5UGFyYW1zIj5UaGUgZHluYW1pYyBxdWVyeXN0cmluZyBwYXJhbWV0ZXIgd3JhcHBpbmcgYWxsIG90aGVycy48L3BhcmFtPgogICAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJUYXNrIi8+IHRoYXQgY29tcGxldGVzIHdoZW4gdGhlIHJlcXVlc3QgaXMgZmluaXNoZWQuPC9yZXR1cm5zPgogICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXBpRXhjZXB0aW9uIj4KICAgIC8vLyBUaHJvd24gd2hlbiB0aGUgcmVxdWVzdCByZXR1cm5zIGEgbm9uLXN1Y2Nlc3Mgc3RhdHVzIGNvZGU6CiAgICAvLy8gPGxpc3QgdHlwZT0idGFibGUiPgogICAgLy8vIDxsaXN0aGVhZGVyPgogICAgLy8vIDx0ZXJtPlN0YXR1czwvdGVybT4KICAgIC8vLyA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgogICAgLy8vIDwvbGlzdGhlYWRlcj4KICAgIC8vLyA8aXRlbT4KICAgIC8vLyA8dGVybT40MDU8L3Rlcm0+CiAgICAvLy8gPGRlc2NyaXB0aW9uPkludmFsaWQgaW5wdXQ8L2Rlc2NyaXB0aW9uPgogICAgLy8vIDwvaXRlbT4KICAgIC8vLyA8L2xpc3Q+CiAgICAvLy8gPC9leGNlcHRpb24+CiAgICBbUG9zdCgiL3BldC97cGV0SWR9IildCiAgICBUYXNrIFVwZGF0ZVBldFdpdGhGb3JtKGxvbmcgcGV0SWQsIFtRdWVyeV0gVXBkYXRlUGV0V2l0aEZvcm1RdWVyeVBhcmFtcyBxdWVyeVBhcmFtcyk7Cn0KCnB1YmxpYyBjbGFzcyBVcGRhdGVQZXRXaXRoRm9ybVF1ZXJ5UGFyYW1zCnsKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBOYW1lIG9mIHBldCB0aGF0IG5lZWRzIHRvIGJlIHVwZGF0ZWQKICAgIC8vLyA8L3N1bW1hcnk+CiAgICBbUXVlcnldCiAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQoKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBTdGF0dXMgb2YgcGV0IHRoYXQgbmVlZHMgdG8gYmUgdXBkYXRlZAogICAgLy8vIDwvc3VtbWFyeT4KICAgIFtRdWVyeV0KICAgIHB1YmxpYyBzdHJpbmcgU3RhdHVzIHsgZ2V0OyBzZXQ7IH0KfQpgYGAKCiMjIFJlc3RTZXJ2aWNlCgpIZXJlJ3MgYW4gZXhhbXBsZSB1c2FnZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUgYWJvdmUKCmBgYGNzCnVzaW5nIFJlZml0Owp1c2luZyBTeXN0ZW07CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CgpuYW1lc3BhY2UgWW91ci5OYW1lc3BhY2UuT2YuQ2hvaWNlLkdlbmVyYXRlZENvZGU7CgppbnRlcm5hbCBjbGFzcyBQcm9ncmFtCnsKICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgTWFpbihzdHJpbmdbXSBhcmdzKQogICAgewogICAgICAgIHZhciBjbGllbnQgPSBSZXN0U2VydmljZS5Gb3I8SVN3YWdnZXJQZXRzdG9yZT4oImh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8vYXBpL3YzIik7CiAgICAgICAgdmFyIHBldCA9IGF3YWl0IGNsaWVudC5HZXRQZXRCeUlkKDEpOwoKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiIyMgVXNpbmcgVGFzazxUPiBhcyByZXR1cm4gdHlwZSAjIyIpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQiTmFtZToge3BldC5OYW1lfSIpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQiQ2F0ZWdvcnk6IHtwZXQuQ2F0ZWdvcnkuTmFtZX0iKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkIlN0YXR1czoge3BldC5TdGF0dXN9Iik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKCiAgICAgICAgdmFyIGNsaWVudDIgPSBSZXN0U2VydmljZS5Gb3I8V2l0aEFwaVJlc3BvbnNlLklTd2FnZ2VyUGV0c3RvcmU+KCJodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92MyIpOwogICAgICAgIHZhciByZXNwb25zZSA9IGF3YWl0IGNsaWVudDIuR2V0UGV0QnlJZCgyKTsKCiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiMjIFVzaW5nIFRhc2s8SUFwaVJlc3BvbnNlPFQ+PiBhcyByZXR1cm4gdHlwZSAjIyIpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQiSFRUUCBTdGF0dXMgQ29kZToge3Jlc3BvbnNlLlN0YXR1c0NvZGV9Iik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJCJOYW1lOiB7cmVzcG9uc2UuQ29udGVudC5OYW1lfSIpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQiQ2F0ZWdvcnk6IHtyZXNwb25zZS5Db250ZW50LkNhdGVnb3J5Lk5hbWV9Iik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJCJTdGF0dXM6IHtyZXNwb25zZS5Db250ZW50LlN0YXR1c30iKTsKICAgIH0KfQpgYGAKClRoZSBgUmVzdFNlcnZpY2VgIGNsYXNzIGdlbmVyYXRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBgSVN3YWdnZXJQZXRzdG9yZWAgdGhhdCB1c2VzIGBIdHRwQ2xpZW50YCB0byBtYWtlIGl0cyBjYWxscy4KClRoZSBjb2RlIGFib3ZlIHdoZW4gcnVuIHdpbGwgb3V0cHV0IHNvbWV0aGluZyBsaWtlIHRoaXM6CgpgYGAKIyMgVXNpbmcgVGFzazxUPiBhcyByZXR1cm4gdHlwZSAjIwpOYW1lOiBHYXRpdG90b3RvdG8KQ2F0ZWdvcnk6IENoYXVjaXRvClN0YXR1czogU29sZAoKIyMgVXNpbmcgVGFzazxJQXBpUmVzcG9uc2U8VD4+IGFzIHJldHVybiB0eXBlICMjCkhUVFAgU3RhdHVzIENvZGU6IE9LCk5hbWU6IEdhdGl0b3RvdG90bwpDYXRlZ29yeTogQ2hhdWNpdG8KU3RhdHVzOiBTb2xkCmBgYAoKIyMgQVNQLk5FVCBDb3JlIGFuZCBIdHRwQ2xpZW50RmFjdG9yeQoKSGVyZSdzIGFuIGV4YW1wbGUgTWluaW1hbCBBUEkgd2l0aCB0aGUgW2BSZWZpdC5IdHRwQ2xpZW50RmFjdG9yeWBdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9SZWZpdC5IdHRwQ2xpZW50RmFjdG9yeSkgbGlicmFyeToKCmBgYGNzCnVzaW5nIFJlZml0Owp1c2luZyBZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZTsKCnZhciBidWlsZGVyID0gV2ViQXBwbGljYXRpb24uQ3JlYXRlQnVpbGRlcihhcmdzKTsKYnVpbGRlci5TZXJ2aWNlcy5BZGRFbmRwb2ludHNBcGlFeHBsb3JlcigpOwpidWlsZGVyLlNlcnZpY2VzLkFkZFN3YWdnZXJHZW4oKTsKYnVpbGRlci5TZXJ2aWNlcwogICAgLkFkZFJlZml0Q2xpZW50PElTd2FnZ2VyUGV0c3RvcmU+KCkKICAgIC5Db25maWd1cmVIdHRwQ2xpZW50KGMgPT4gYy5CYXNlQWRkcmVzcyA9IG5ldyBVcmkoImh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8vYXBpL3YzIikpOwoKdmFyIGFwcCA9IGJ1aWxkZXIuQnVpbGQoKTsKYXBwLk1hcEdldCgKICAgICAgICAiL3BldC97aWQ6bG9uZ30iLAogICAgICAgIGFzeW5jIChJU3dhZ2dlclBldHN0b3JlIHBldHN0b3JlLCBsb25nIGlkKSA9PgogICAgICAgIHsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRzLk9rKGF3YWl0IHBldHN0b3JlLkdldFBldEJ5SWQoaWQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoUmVmaXQuQXBpRXhjZXB0aW9uIGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRzLlN0YXR1c0NvZGUoKGludCllLlN0YXR1c0NvZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSkKICAgIC5XaXRoTmFtZSgiR2V0UGV0QnlJZCIpCiAgICAuV2l0aE9wZW5BcGkoKTsKCmFwcC5Vc2VIdHRwc1JlZGlyZWN0aW9uKCk7CmFwcC5Vc2VTd2FnZ2VyVUkoKTsKYXBwLlVzZVN3YWdnZXIoKTsKYXBwLlJ1bigpOwpgYGAKCgouTkVUIENvcmUgc3VwcG9ydHMgcmVnaXN0ZXJpbmcgdGhlIGdlbmVyYXRlZCBgSVN3YWdnZXJQZXRzdG9yZWAgaW50ZXJmYWNlIHZpYSBgSHR0cENsaWVudEZhY3RvcnlgCgpUaGUgZm9sbG93aW5nIHJlcXVlc3QgdG8gdGhlIEFQSSBhYm92ZQpgYGBzaGVsbAokIGN1cmwgLVggJ0dFVCcgJ2h0dHBzOi8vbG9jYWxob3N0OjUwMDEvcGV0LzEnIC1IICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nCmBgYAoKUmV0dXJucyBhIHJlc3BvbnNlIHRoYXQgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczoKYGBganNvbgp7CiAgImlkIjogMSwKICAibmFtZSI6ICJTcGVjaWFsX2NoYXJfb3duZXJfIUAjJF4mKClgLnRlc3RpbmciLAogICJwaG90b1VybHMiOiBbCiAgICAiaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9yZXNvdXJjZXMvcGhvdG9zLzYyMzM4OTA5NS5qcGciCiAgXSwKICAidGFncyI6IFtdLAogICJzdGF0dXMiOiAiU29sZCIKfQpgYGAKCiMjIERlcGVuZGVuY3kgSW5qZWN0aW9uCgpSZWZpdHRlciBzdXBwb3J0cyBnZW5lcmF0aW5nIGJvb3RzdHJhcHBpbmcgY29kZSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBjb252ZW5pZW50bHkgY29uZmlndXJlIGFsbCBnZW5lcmF0ZWQgUmVmaXQgaW50ZXJmYWNlcyBieSBjYWxsaW5nIGEgc2luZ2xlIGV4dGVuc2lvbiBtZXRob2QgdG8gYElTZXJ2aWNlQ29sbGVjdGlvbmAuCgpUaGlzIGlzIGVuYWJsZWQgdGhyb3VnaCB0aGUgYC5yZWZpdHRlcmAgc2V0dGluZ3MgZmlsZSBsaWtlIHRoaXM6CgpgYGBqc29uCnsKICAib3BlbkFwaVBhdGgiOiAiLi4vT3BlbkFQSS92My4wL3BldHN0b3JlLmpzb24iLAogICJuYW1lc3BhY2UiOiAiUGV0c3RvcmUiLAogICJkZXBlbmRlbmN5SW5qZWN0aW9uU2V0dGluZ3MiOiB7CiAgICAiYmFzZVVybCI6ICJodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92MyIsCiAgICAiaHR0cE1lc3NhZ2VIYW5kbGVycyI6IFsgIlRlbGVtZXRyeURlbGVnYXRpbmdIYW5kbGVyIiBdLAogICAgInRyYW5zaWVudEVycm9ySGFuZGxlciI6ICJQb2xseSIsCiAgICAibWF4UmV0cnlDb3VudCI6IDMsCiAgICAiZmlyc3RCYWNrb2ZmUmV0cnlJblNlY29uZHMiOiAwLjUKICB9Cn0KYGBgCgp3aGljaCB3aWxsIGdlbmVyYXRlIGFuIGV4dGVuc2lvbiBtZXRob2QgdG8gYElTZXJ2aWNlQ29sbGVjdGlvbmAgY2FsbGVkIGBDb25maWd1cmVSZWZpdENsaWVudHMoKWAuIFRoZSBnZW5lcmF0ZWQgZXh0ZW5zaW9uIG1ldGhvZCBkZXBlbmRzIG9uIFtgUmVmaXQuSHR0cENsaWVudEZhY3RvcnlgXShodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvUmVmaXQuSHR0cENsaWVudEZhY3RvcnkpIGxpYnJhcnkgYW5kIGxvb2tzIGxpa2UgdGhpczoKCmBgYGNzCnB1YmxpYyBzdGF0aWMgSVNlcnZpY2VDb2xsZWN0aW9uIENvbmZpZ3VyZVJlZml0Q2xpZW50cygKICAgIHRoaXMgSVNlcnZpY2VDb2xsZWN0aW9uIHNlcnZpY2VzLAogICAgQWN0aW9uPElIdHRwQ2xpZW50QnVpbGRlcj4/IGJ1aWxkZXIgPSBkZWZhdWx0LAogICAgUmVmaXRTZXR0aW5ncz8gc2V0dGluZ3MgPSBkZWZhdWx0KQp7CiAgICB2YXIgY2xpZW50QnVpbGRlcklTd2FnZ2VyUGV0c3RvcmUgPSBzZXJ2aWNlcwogICAgICAgIC5BZGRSZWZpdENsaWVudDxJU3dhZ2dlclBldHN0b3JlPihzZXR0aW5ncykKICAgICAgICAuQ29uZmlndXJlSHR0cENsaWVudChjID0+IGMuQmFzZUFkZHJlc3MgPSBuZXcgVXJpKCJodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92MyIpKQogICAgICAgIC5BZGRIdHRwTWVzc2FnZUhhbmRsZXI8VGVsZW1ldHJ5RGVsZWdhdGluZ0hhbmRsZXI+KCk7CgogICAgY2xpZW50QnVpbGRlcklTd2FnZ2VyUGV0c3RvcmUKICAgICAgICAuQWRkUG9saWN5SGFuZGxlcigKICAgICAgICAgICAgSHR0cFBvbGljeUV4dGVuc2lvbnMKICAgICAgICAgICAgICAgIC5IYW5kbGVUcmFuc2llbnRIdHRwRXJyb3IoKQogICAgICAgICAgICAgICAgLldhaXRBbmRSZXRyeUFzeW5jKAogICAgICAgICAgICAgICAgICAgIEJhY2tvZmYuRGVjb3JyZWxhdGVkSml0dGVyQmFja29mZlYyKAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lU3Bhbi5Gcm9tU2Vjb25kcygwLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAzKSkpOwoKICAgIGJ1aWxkZXI/Lkludm9rZShjbGllbnRCdWlsZGVySVN3YWdnZXJQZXRzdG9yZSk7CgogICAgcmV0dXJuIHNlcnZpY2VzOwp9CmBgYAoKVGhpcyBjb21lcyBpbiBoYW5keSBlc3BlY2lhbGx5IHdoZW4gZ2VuZXJhdGluZyBtdWx0aXBsZSBpbnRlcmZhY2VzLCBieSB0YWcgb3IgZW5kcG9pbnQuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGAucmVmaXR0ZXJgIHNldHRpbmdzIGZpbGUKCmBgYGpzb24KewogICJvcGVuQXBpUGF0aCI6ICIuLi9PcGVuQVBJL3YzLjAvcGV0c3RvcmUuanNvbiIsCiAgIm5hbWVzcGFjZSI6ICJQZXRzdG9yZSIsCiAgIm11bHRpcGxlSW50ZXJmYWNlcyI6ICJCeVRhZyIsCiAgImRlcGVuZGVuY3lJbmplY3Rpb25TZXR0aW5ncyI6IHsKICAgICJiYXNlVXJsIjogImh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8vYXBpL3YzIiwKICAgICJodHRwTWVzc2FnZUhhbmRsZXJzIjogWyAiVGVsZW1ldHJ5RGVsZWdhdGluZ0hhbmRsZXIiIF0sCiAgICAidHJhbnNpZW50RXJyb3JIYW5kbGVyIjogIlBvbGx5IiwKICAgICJtYXhSZXRyeUNvdW50IjogMywKICAgICJmaXJzdEJhY2tvZmZSZXRyeUluU2Vjb25kcyI6IDAuNQogIH0KfQpgYGAKCldpbGwgZ2VuZXJhdGUgYSBzaW5nbGUgYENvbmZpZ3VyZVJlZml0Q2xpZW50cygpYCBleHRlbnNpb24gbWV0aG9kcyB0aGF0IG1heSBjb250YWluIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGNvbmZpZ3VyYXRpb24gY29kZSBmb3IgbXVsdGlwbGUgaW50ZXJmYWNlcyBsaWtlIHRoaXMKCmBgYGNzaGFycApwdWJsaWMgc3RhdGljIElTZXJ2aWNlQ29sbGVjdGlvbiBDb25maWd1cmVSZWZpdENsaWVudHMoCiAgICB0aGlzIElTZXJ2aWNlQ29sbGVjdGlvbiBzZXJ2aWNlcywKICAgIEFjdGlvbjxJSHR0cENsaWVudEJ1aWxkZXI+PyBidWlsZGVyID0gZGVmYXVsdCwKICAgIFJlZml0U2V0dGluZ3M/IHNldHRpbmdzID0gZGVmYXVsdCkKewogICAgdmFyIGNsaWVudEJ1aWxkZXJJUGV0QXBpID0gc2VydmljZXMKICAgICAgICAuQWRkUmVmaXRDbGllbnQ8SVBldEFwaT4oc2V0dGluZ3MpCiAgICAgICAgLkNvbmZpZ3VyZUh0dHBDbGllbnQoYyA9PiBjLkJhc2VBZGRyZXNzID0gbmV3IFVyaSgiaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9hcGkvdjMiKSkKICAgICAgICAuQWRkSHR0cE1lc3NhZ2VIYW5kbGVyPFRlbGVtZXRyeURlbGVnYXRpbmdIYW5kbGVyPigpOwoKICAgIGNsaWVudEJ1aWxkZXJJUGV0QXBpCiAgICAgICAgLkFkZFBvbGljeUhhbmRsZXIoCiAgICAgICAgICAgIEh0dHBQb2xpY3lFeHRlbnNpb25zCiAgICAgICAgICAgICAgICAuSGFuZGxlVHJhbnNpZW50SHR0cEVycm9yKCkKICAgICAgICAgICAgICAgIC5XYWl0QW5kUmV0cnlBc3luYygKICAgICAgICAgICAgICAgICAgICBCYWNrb2ZmLkRlY29ycmVsYXRlZEppdHRlckJhY2tvZmZWMigKICAgICAgICAgICAgICAgICAgICAgICAgVGltZVNwYW4uRnJvbVNlY29uZHMoMC41KSwKICAgICAgICAgICAgICAgICAgICAgICAgMykpKTsKCiAgICBidWlsZGVyPy5JbnZva2UoY2xpZW50QnVpbGRlcklQZXRBcGkpOwoKICAgIHZhciBjbGllbnRCdWlsZGVySVN0b3JlQXBpID0gc2VydmljZXMKICAgICAgICAuQWRkUmVmaXRDbGllbnQ8SVN0b3JlQXBpPihzZXR0aW5ncykKICAgICAgICAuQ29uZmlndXJlSHR0cENsaWVudChjID0+IGMuQmFzZUFkZHJlc3MgPSBuZXcgVXJpKCJodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92MyIpKQogICAgICAgIC5BZGRIdHRwTWVzc2FnZUhhbmRsZXI8VGVsZW1ldHJ5RGVsZWdhdGluZ0hhbmRsZXI+KCk7CgogICAgY2xpZW50QnVpbGRlcklTdG9yZUFwaQogICAgICAgIC5BZGRQb2xpY3lIYW5kbGVyKAogICAgICAgICAgICBIdHRwUG9saWN5RXh0ZW5zaW9ucwogICAgICAgICAgICAgICAgLkhhbmRsZVRyYW5zaWVudEh0dHBFcnJvcigpCiAgICAgICAgICAgICAgICAuV2FpdEFuZFJldHJ5QXN5bmMoCiAgICAgICAgICAgICAgICAgICAgQmFja29mZi5EZWNvcnJlbGF0ZWRKaXR0ZXJCYWNrb2ZmVjIoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVTcGFuLkZyb21TZWNvbmRzKDAuNSksCiAgICAgICAgICAgICAgICAgICAgICAgIDMpKSk7CgogICAgYnVpbGRlcj8uSW52b2tlKGNsaWVudEJ1aWxkZXJJU3RvcmVBcGkpOwoKICAgIHZhciBjbGllbnRCdWlsZGVySVVzZXJBcGkgPSBzZXJ2aWNlcwogICAgICAgIC5BZGRSZWZpdENsaWVudDxJVXNlckFwaT4oc2V0dGluZ3MpCiAgICAgICAgLkNvbmZpZ3VyZUh0dHBDbGllbnQoYyA9PiBjLkJhc2VBZGRyZXNzID0gbmV3IFVyaSgiaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9hcGkvdjMiKSkKICAgICAgICAuQWRkSHR0cE1lc3NhZ2VIYW5kbGVyPFRlbGVtZXRyeURlbGVnYXRpbmdIYW5kbGVyPigpOwoKICAgIGNsaWVudEJ1aWxkZXJJVXNlckFwaQogICAgICAgIC5BZGRQb2xpY3lIYW5kbGVyKAogICAgICAgICAgICBIdHRwUG9saWN5RXh0ZW5zaW9ucwogICAgICAgICAgICAgICAgLkhhbmRsZVRyYW5zaWVudEh0dHBFcnJvcigpCiAgICAgICAgICAgICAgICAuV2FpdEFuZFJldHJ5QXN5bmMoCiAgICAgICAgICAgICAgICAgICAgQmFja29mZi5EZWNvcnJlbGF0ZWRKaXR0ZXJCYWNrb2ZmVjIoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVTcGFuLkZyb21TZWNvbmRzKDAuNSksCiAgICAgICAgICAgICAgICAgICAgICAgIDMpKSk7CgogICAgYnVpbGRlcj8uSW52b2tlKGNsaWVudEJ1aWxkZXJJVXNlckFwaSk7CgogICAgcmV0dXJuIHNlcnZpY2VzOwp9CmBgYAoKUGVyc29uYWxseSwgdGhleSBJIHVzZSBSZWZpdHRlciBpcyB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UgcGVyIGVuZHBvaW50LCBzbyB3aGVuIGdlbmVyYXRpbmcgY29kZSBmb3IgYSBsYXJnZSBhbmQgY29tcGxleCBBUEksIEkgbWlnaHQgaGF2ZSBzZXZlcmFsIGludGVyZmFjZXMuCgojIyBBcGl6cgoKW0FwaXpyXShodHRwczovL3d3dy5hcGl6ci5uZXQpIGlzIGEgUmVmaXQgY2xpZW50IG1hbmFnZXIgdGhhdCBwcm92aWRlcyBhIHNldCBvZiBmZWF0dXJlcyB0byBlbmhhbmNlIHJlcXVlc3RpbmcgZXhwZXJpZW5jZSB3aXRoIHJlc2lsaWVuY2UsIGNhY2hpbmcsIHByaW9yaXR5LCBtZWRpYXRpb24sIG1hcHBpbmcsIGxvZ2dpbmcsIGF1dGhlbnRpY2F0aW9uLCBmaWxlIHRyYW5zZmVyIGNhcGFiaWxpdGllcyBhbmQgbWFueSBtb3JlLi4uCgojIyMgR2VuZXJhdGluZyB0aGUgaW50ZXJmYWNlcwoKUmVmaXR0ZXIgc3VwcG9ydHMgZ2VuZXJhdGluZyBBcGl6ciBmb3JtYXR0ZWQgUmVmaXQgaW50ZXJmYWNlcyB0aGF0IGNhbiBiZSBtYW5hZ2VkIHRoZW4gYnkgQXBpenIgKHY2KykuCgpZb3UgY2FuIGVuYWJsZSBBcGl6ciBmb3JtYXR0ZWQgUmVmaXQgaW50ZXJmYWNlIGdlbmVyYXRpb24gZWl0aGVyOgotIFdpdGggdGhlIGAtLXVzZS1hcGl6cmAgY29tbWFuZCBsaW5lIGFyZ3VtZW50Ci0gQnkgc2V0dGluZyB0aGUgYGFwaXpyU2V0dGluZ3NgIHNlY3Rpb24gaW4gdGhlIGAucmVmaXR0ZXJgIHNldHRpbmdzIGZpbGUKCk5vdGUgdGhhdCBgLS11c2UtYXBpenJgIHVzZXMgZGVmYXVsdCBBcGl6ciBzZXR0aW5ncyB3aXRoIGB3aXRoUmVxdWVzdE9wdGlvbnNgIHNldCB0byBgdHJ1ZWAgYXMgcmVjb21tZW5kZWQsIHdoaWxlIHRoZSBgLnJlZml0dGVyYCBzZXR0aW5ncyBmaWxlIGFsbG93cyB5b3UgdG8gY29uZmlndXJlIGl0IGRlZXBlci4KCkluIGJvdGggY2FzZXMsIGl0IHdpbGwgZm9ybWF0IHRoZSBnZW5lcmF0ZWQgUmVmaXQgaW50ZXJmYWNlcyB0byBiZSBBcGl6ciByZWFkeSBieToKLSBBZGRpbmcgYSBmaW5hbCBJQXBpenJSZXF1ZXN0T3B0aW9ucyBvcHRpb25zIHBhcmFtZXRlciB0byBhbGwgZ2VuZXJhdGVkIG1ldGhvZHMgKGlmIGB3aXRoUmVxdWVzdE9wdGlvbnNgIGlzIHNldCB0byBgdHJ1ZWApCi0gUHJvdmlkaW5nIGNhbmNlbGxhdGlvbiB0b2tlbnMgYnkgQXBpenIgcmVxdWVzdCBvcHRpb25zIGluc3RlYWQgb2YgYSBkZWRpY2F0ZWQgcGFyYW1ldGVyIChpZiBgd2l0aFJlcXVlc3RPcHRpb25zYCBpcyBzZXQgdG8gYHRydWVgKQotIFVzaW5nIG1ldGhvZCBvdmVybG9hZHMgaW5zdGVhZCBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzIChub3RlIHRoYXQgc2V0dGluZyBgdXNlRHluYW1pY1F1ZXJ5c3RyaW5nUGFyYW1ldGVyc2AgdG8gYHRydWVgIGltcHJvdmUgb3ZlcmxvYWRpbmcgZXhwZXJpZW5jZSkKCkZyb20gaGVyZSwgeW91J3JlIGRlZmluaXRseSBmcmVlIHRvIHVzZSB0aGUgZm9ybWF0dGVkIGludGVyZmFjZSB3aXRoIEFwaXpyIGJ5IHJlZ2lzdGVyaW5nLCBjb25maWd1cmluZyBhbmQgdXNpbmcgaXQgZm9sbG93aW5nIHRoZSBbQXBpenIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cuYXBpenIubmV0KS4gQnV0IFJlZml0dGVyIGNhbiBnbyBmdXJ0aGVyIGJ5IGdlbmVyYXRpbmcgc29tZSBoZWxwZXJzIHRvIG1ha2UgdGhlIGNvbmZpZ3VyYXRpb24gZWFzaWVyLgoKIyMjIEdlbmVyYXRpbmcgdGhlIGhlbHBlcnMKClJlZml0dGVyIHN1cHBvcnRzIGdlbmVyYXRpbmcgQXBpenIgKHY2KykgYm9vdHN0cmFwcGluZyBjb2RlIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbnZlbmllbnRseSBjb25maWd1cmUgYWxsIGdlbmVyYXRlZCBBcGl6ciBmb3JtYXR0ZWQgUmVmaXQgaW50ZXJmYWNlcyBieSBjYWxsaW5nIGEgc2luZ2xlIG1ldGhvZC4KSXQgY291bGQgYmUgZWl0aGVyIGFuIGV4dGVuc2lvbiBtZXRob2QgdG8gYElTZXJ2aWNlQ29sbGVjdGlvbmAgaWYgRGVwZW5kZW5jeUluamVjdGlvblNldHRpbmdzIGFyZSBzZXQsIG9yIGEgc3RhdGljIGJ1aWxkZXIgbWV0aG9kIGlmIG5vdC4KCiMjIyBbRXh0ZW5kZWRdKCN0YWIvdGFiaWQtZXh0ZW5kZWQpCgpUbyBlbmFibGUgQXBpenIgcmVnaXN0cmF0aW9uIGNvZGUgZ2VuZXJhdGlvbiBmb3IgYElTZXJ2aWNlQ29sbGVjdGlvbmAsIHlvdSBuZWVkIGF0IGxlYXN0IHRvIHNldCB0aGUgYHdpdGhSZWdpc3RyYXRpb25IZWxwZXJgIHByb3BlcnR5IHRvIGB0cnVlYCBhbmQgY29uZmlndXJlIHRoZSBgRGVwZW5kZW5jeUluamVjdGlvblNldHRpbmdzYCBzZWN0aW9uIGluIHRoZSBgLnJlZml0dGVyYCBzZXR0aW5ncyBmaWxlLgpUaGlzIGlzIHdoYXQgdGhlIGAucmVmaXR0ZXJgIHNldHRpbmdzIGZpbGUgbWF5IGxvb2sgbGlrZSwgZGVwZW5kaW5nIG9uIHlvdSBjb25maWd1cmF0aW9uOgoKYGBganNvbgp7CiAgIm9wZW5BcGlQYXRoIjogIi4uL09wZW5BUEkvdjMuMC9wZXRzdG9yZS5qc29uIiwKICAibmFtZXNwYWNlIjogIlBldHN0b3JlIiwKICAidXNlRHluYW1pY1F1ZXJ5c3RyaW5nUGFyYW1ldGVycyI6IHRydWUsCiAgImRlcGVuZGVuY3lJbmplY3Rpb25TZXR0aW5ncyI6IHsKICAgICJiYXNlVXJsIjogImh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8vYXBpL3YzIiwKICAgICJodHRwTWVzc2FnZUhhbmRsZXJzIjogWyAiTXlEZWxlZ2F0aW5nSGFuZGxlciIgXSwKICAgICJ0cmFuc2llbnRFcnJvckhhbmRsZXIiOiAiSHR0cFJlc2lsaWVuY2UiLAogICAgIm1heFJldHJ5Q291bnQiOiAzLAogICAgImZpcnN0QmFja29mZlJldHJ5SW5TZWNvbmRzIjogMC41CiAgfSwKICAiYXBpenJTZXR0aW5ncyI6IHsKICAgICJ3aXRoUmVxdWVzdE9wdGlvbnMiOiB0cnVlLCAvLyBSZWNvbW1lbmRlZCB0byBpbmNsdWRlIGFuIEFwaXpyIHJlcXVlc3Qgb3B0aW9ucyBwYXJhbWV0ZXIgdG8gUmVmaXQgaW50ZXJmYWNlIG1ldGhvZHMKICAgICJ3aXRoUmVnaXN0cmF0aW9uSGVscGVyIjogdHJ1ZSwgLy8gTWFuZGF0b3J5IHRvIGFjdHVhbGx5IGdlbmVyYXRlIHRoZSBBcGl6ciByZWdpc3RyYXRpb24gZXh0ZW5kZWQgbWV0aG9kCiAgICAid2l0aENhY2hlUHJvdmlkZXIiOiAiSW5NZW1vcnkiLCAvLyBPcHRpb25hbCwgZGVmYXVsdCBpcyBOb25lCiAgICAid2l0aFByaW9yaXR5IjogdHJ1ZSwgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgZmFsc2UKICAgICJ3aXRoTWVkaWF0aW9uIjogdHJ1ZSwgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgZmFsc2UKICAgICJ3aXRoT3B0aW9uYWxNZWRpYXRpb24iOiB0cnVlLCAvLyBPcHRpb25hbCwgZGVmYXVsdCBpcyBmYWxzZQogICAgIndpdGhNYXBwaW5nUHJvdmlkZXIiOiAiQXV0b01hcHBlciIsIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIE5vbmUKICAgICJ3aXRoRmlsZVRyYW5zZmVyIjogdHJ1ZSAvLyBPcHRpb25hbCwgZGVmYXVsdCBpcyBmYWxzZQogIH0KfQpgYGAKCndoaWNoIHdpbGwgZ2VuZXJhdGUgYW4gZXh0ZW5zaW9uIG1ldGhvZCB0byBgSVNlcnZpY2VDb2xsZWN0aW9uYCBjYWxsZWQgYENvbmZpZ3VyZVBldHN0b3JlQXBpQXBpenJNYW5hZ2VyKClgLiBUaGUgZ2VuZXJhdGVkIGV4dGVuc2lvbiBtZXRob2QgZGVwZW5kcyBvbiBbYEFwaXpyLkV4dGVuc2lvbnMuTWljcm9zb2Z0LkRlcGVuZGVuY3lJbmplY3Rpb25gXShodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvQXBpenIuRXh0ZW5zaW9ucy5NaWNyb3NvZnQuRGVwZW5kZW5jeUluamVjdGlvbikgbGlicmFyeSBhbmQgbG9va3MgbGlrZSB0aGlzOgoKYGBgY3MKcHVibGljIHN0YXRpYyBJU2VydmljZUNvbGxlY3Rpb24gQ29uZmlndXJlUGV0c3RvcmVBcGlBcGl6ck1hbmFnZXIoCiAgICB0aGlzIElTZXJ2aWNlQ29sbGVjdGlvbiBzZXJ2aWNlcywKICAgIEFjdGlvbjxJQXBpenJFeHRlbmRlZE1hbmFnZXJPcHRpb25zQnVpbGRlcj4/IG9wdGlvbnNCdWlsZGVyID0gbnVsbCkKewogICAgb3B0aW9uc0J1aWxkZXIgPz89IF8gPT4geyB9OyAvLyBEZWZhdWx0IGVtcHR5IG9wdGlvbnMgaWYgbnVsbAogICAgb3B0aW9uc0J1aWxkZXIgKz0gb3B0aW9ucyA9PiBvcHRpb25zCiAgICAgICAgLldpdGhCYXNlQWRkcmVzcygiaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9hcGkvdjMiLCBBcGl6ckR1cGxpY2F0ZVN0cmF0ZWd5Lklnbm9yZSkKICAgICAgICAuV2l0aERlbGVnYXRpbmdIYW5kbGVyPE15RGVsZWdhdGluZ0hhbmRsZXI+KCkKICAgICAgICAuQ29uZmlndXJlSHR0cENsaWVudEJ1aWxkZXIoYnVpbGRlciA9PiBidWlsZGVyCiAgICAgICAgICAgIC5BZGRTdGFuZGFyZFJlc2lsaWVuY2VIYW5kbGVyKGNvbmZpZyA9PgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25maWcuUmV0cnkgPSBuZXcgSHR0cFJldHJ5U3RyYXRlZ3lPcHRpb25zCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVXNlSml0dGVyID0gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBNYXhSZXRyeUF0dGVtcHRzID0gMywKICAgICAgICAgICAgICAgICAgICBEZWxheSA9IFRpbWVTcGFuLkZyb21TZWNvbmRzKDAuNSkKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pKQogICAgICAgIC5XaXRoSW5NZW1vcnlDYWNoZUhhbmRsZXIoKQogICAgICAgIC5XaXRoQXV0b01hcHBlck1hcHBpbmdIYW5kbGVyKCkKICAgICAgICAuV2l0aFByaW9yaXR5KCkKICAgICAgICAuV2l0aE9wdGlvbmFsTWVkaWF0aW9uKCkKICAgICAgICAuV2l0aEZpbGVUcmFuc2Zlck9wdGlvbmFsTWVkaWF0aW9uKCk7CgogICAgcmV0dXJuIHNlcnZpY2VzLkFkZEFwaXpyTWFuYWdlckZvcjxJUGV0c3RvcmVBcGk+KG9wdGlvbnNCdWlsZGVyKTsKfQpgYGAKClRoaXMgY29tZXMgaW4gaGFuZHkgZXNwZWNpYWxseSB3aGVuIGdlbmVyYXRpbmcgbXVsdGlwbGUgaW50ZXJmYWNlcywgYnkgdGFnIG9yIGVuZHBvaW50LiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBgLnJlZml0dGVyYCBzZXR0aW5ncyBmaWxlCgpgYGBqc29uCnsKICAib3BlbkFwaVBhdGgiOiAiLi4vT3BlbkFQSS92My4wL3BldHN0b3JlLmpzb24iLAogICJuYW1lc3BhY2UiOiAiUGV0c3RvcmUiLAogICJ1c2VEeW5hbWljUXVlcnlzdHJpbmdQYXJhbWV0ZXJzIjogdHJ1ZSwKICAibXVsdGlwbGVJbnRlcmZhY2VzIjogIkJ5VGFnIiwKICAibmFtaW5nIjogewogICAgInVzZU9wZW5BcGlUaXRsZSI6IGZhbHNlLAogICAgImludGVyZmFjZU5hbWUiOiAiUGV0c3RvcmUiCiAgfSwKICAiZGVwZW5kZW5jeUluamVjdGlvblNldHRpbmdzIjogewogICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9hcGkvdjMiLAogICAgImh0dHBNZXNzYWdlSGFuZGxlcnMiOiBbICJNeURlbGVnYXRpbmdIYW5kbGVyIiBdLAogICAgInRyYW5zaWVudEVycm9ySGFuZGxlciI6ICJIdHRwUmVzaWxpZW5jZSIsCiAgICAibWF4UmV0cnlDb3VudCI6IDMsCiAgICAiZmlyc3RCYWNrb2ZmUmV0cnlJblNlY29uZHMiOiAwLjUKICB9LAogICJhcGl6clNldHRpbmdzIjogewogICAgIndpdGhSZXF1ZXN0T3B0aW9ucyI6IHRydWUsIC8vIFJlY29tbWVuZGVkIHRvIGluY2x1ZGUgYW4gQXBpenIgcmVxdWVzdCBvcHRpb25zIHBhcmFtZXRlciB0byBSZWZpdCBpbnRlcmZhY2UgbWV0aG9kcwogICAgIndpdGhSZWdpc3RyYXRpb25IZWxwZXIiOiB0cnVlLCAvLyBNYW5kYXRvcnkgdG8gYWN0dWFsbHkgZ2VuZXJhdGUgdGhlIEFwaXpyIHJlZ2lzdHJhdGlvbiBleHRlbmRlZCBtZXRob2QKICAgICJ3aXRoQ2FjaGVQcm92aWRlciI6ICJJbk1lbW9yeSIsIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIE5vbmUKICAgICJ3aXRoUHJpb3JpdHkiOiB0cnVlLCAvLyBPcHRpb25hbCwgZGVmYXVsdCBpcyBmYWxzZQogICAgIndpdGhNZWRpYXRpb24iOiB0cnVlLCAvLyBPcHRpb25hbCwgZGVmYXVsdCBpcyBmYWxzZQogICAgIndpdGhPcHRpb25hbE1lZGlhdGlvbiI6IHRydWUsIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlCiAgICAid2l0aE1hcHBpbmdQcm92aWRlciI6ICJBdXRvTWFwcGVyIiwgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgTm9uZQogICAgIndpdGhGaWxlVHJhbnNmZXIiOiB0cnVlIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlCiAgfQp9CmBgYAoKV2lsbCBnZW5lcmF0ZSBhIHNpbmdsZSBgQ29uZmlndXJlUGV0c3RvcmVBcGl6ck1hbmFnZXJzKClgIGV4dGVuc2lvbiBtZXRob2QgdGhhdCBtYXkgY29udGFpbiBkZXBlbmRlbmN5IGluamVjdGlvbiBjb25maWd1cmF0aW9uIGNvZGUgZm9yIG11bHRpcGxlIGludGVyZmFjZXMgbGlrZSB0aGlzCgpgYGBjc2hhcnAKcHVibGljIHN0YXRpYyBJU2VydmljZUNvbGxlY3Rpb24gQ29uZmlndXJlUGV0c3RvcmVBcGl6ck1hbmFnZXJzKAogICAgdGhpcyBJU2VydmljZUNvbGxlY3Rpb24gc2VydmljZXMsCiAgICBBY3Rpb248SUFwaXpyRXh0ZW5kZWRDb21tb25PcHRpb25zQnVpbGRlcj4/IG9wdGlvbnNCdWlsZGVyID0gbnVsbCkKewogICAgb3B0aW9uc0J1aWxkZXIgPz89IF8gPT4geyB9OyAvLyBEZWZhdWx0IGVtcHR5IG9wdGlvbnMgaWYgbnVsbAogICAgb3B0aW9uc0J1aWxkZXIgKz0gb3B0aW9ucyA9PiBvcHRpb25zCiAgICAgICAgLldpdGhCYXNlQWRkcmVzcygiaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9hcGkvdjMiLCBBcGl6ckR1cGxpY2F0ZVN0cmF0ZWd5Lklnbm9yZSkKICAgICAgICAuV2l0aERlbGVnYXRpbmdIYW5kbGVyPE15RGVsZWdhdGluZ0hhbmRsZXI+KCkKICAgICAgICAuQ29uZmlndXJlSHR0cENsaWVudEJ1aWxkZXIoYnVpbGRlciA9PiBidWlsZGVyCiAgICAgICAgICAgIC5BZGRTdGFuZGFyZFJlc2lsaWVuY2VIYW5kbGVyKGNvbmZpZyA9PgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25maWcuUmV0cnkgPSBuZXcgSHR0cFJldHJ5U3RyYXRlZ3lPcHRpb25zCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVXNlSml0dGVyID0gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBNYXhSZXRyeUF0dGVtcHRzID0gMywKICAgICAgICAgICAgICAgICAgICBEZWxheSA9IFRpbWVTcGFuLkZyb21TZWNvbmRzKDAuNSkKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pKQogICAgICAgIC5XaXRoSW5NZW1vcnlDYWNoZUhhbmRsZXIoKQogICAgICAgIC5XaXRoQXV0b01hcHBlck1hcHBpbmdIYW5kbGVyKCkKICAgICAgICAuV2l0aFByaW9yaXR5KCkKICAgICAgICAuV2l0aE9wdGlvbmFsTWVkaWF0aW9uKCkKICAgICAgICAuV2l0aEZpbGVUcmFuc2Zlck9wdGlvbmFsTWVkaWF0aW9uKCk7CgogICAgcmV0dXJuIHNlcnZpY2VzLkFkZEFwaXpyKAogICAgICAgIHJlZ2lzdHJ5ID0+IHJlZ2lzdHJ5CiAgICAgICAgICAgIC5BZGRNYW5hZ2VyRm9yPElQZXRBcGk+KCkKICAgICAgICAgICAgLkFkZE1hbmFnZXJGb3I8SVN0b3JlQXBpPigpCiAgICAgICAgICAgIC5BZGRNYW5hZ2VyRm9yPElVc2VyQXBpPigpLAogICAgICAgIG9wdGlvbnNCdWlsZGVyKTsKCn0KYGBgCgpIZXJlLCBgSVBldEFwaWAsIGBJU3RvcmVBcGlgIGFuZCBgSVVzZXJBcGlgIGFyZSB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZXMgd2hpY2ggc2hhcmUgdGhlIHNhbWUgY29tbW9uIGNvbmZpZ3VyYXRpb24gZGVmaW5lZCBmcm9tIHRoZSBgLnJlZml0dGVyYCBmaWxlLgoKIyMjIFtTdGF0aWNdKCN0YWIvdGFiaWQtc3RhdGljKQoKVG8gZW5hYmxlIEFwaXpyIHN0YXRpYyBidWlsZGVyIGNvZGUgZ2VuZXJhdGlvbiwgeW91IG5lZWQgYXQgbGVhc3QgdG8gc2V0IHRoZSBgd2l0aFJlZ2lzdHJhdGlvbkhlbHBlcmAgcHJvcGVydHkgdG8gYHRydWVgIGFuZCBsZWF2ZSB0aGUgYERlcGVuZGVuY3lJbmplY3Rpb25TZXR0aW5nc2Agc2VjdGlvbiB0byBudWxsIGluIHRoZSBgLnJlZml0dGVyYCBzZXR0aW5ncyBmaWxlLgpUaGlzIGlzIHdoYXQgdGhlIGAucmVmaXR0ZXJgIHNldHRpbmdzIGZpbGUgbWF5IGxvb2sgbGlrZSwgZGVwZW5kaW5nIG9uIHlvdSBjb25maWd1cmF0aW9uOgoKYGBganNvbgp7CiAgIm9wZW5BcGlQYXRoIjogIi4uL09wZW5BUEkvdjMuMC9wZXRzdG9yZS5qc29uIiwKICAibmFtZXNwYWNlIjogIlBldHN0b3JlIiwKICAidXNlRHluYW1pY1F1ZXJ5c3RyaW5nUGFyYW1ldGVycyI6IHRydWUsCiAgImFwaXpyU2V0dGluZ3MiOiB7CiAgICAid2l0aFJlcXVlc3RPcHRpb25zIjogdHJ1ZSwgLy8gUmVjb21tZW5kZWQgdG8gaW5jbHVkZSBhbiBBcGl6ciByZXF1ZXN0IG9wdGlvbnMgcGFyYW1ldGVyIHRvIFJlZml0IGludGVyZmFjZSBtZXRob2RzCiAgICAid2l0aFJlZ2lzdHJhdGlvbkhlbHBlciI6IHRydWUsIC8vIE1hbmRhdG9yeSB0byBhY3R1YWxseSBnZW5lcmF0ZSB0aGUgQXBpenIgcmVnaXN0cmF0aW9uIGV4dGVuZGVkIG1ldGhvZAogICAgIndpdGhDYWNoZVByb3ZpZGVyIjogIkFrYXZhY2hlIiwgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgTm9uZQogICAgIndpdGhQcmlvcml0eSI6IHRydWUsIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlCiAgICAid2l0aE1hcHBpbmdQcm92aWRlciI6ICJBdXRvTWFwcGVyIiwgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgTm9uZQogICAgIndpdGhGaWxlVHJhbnNmZXIiOiB0cnVlIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlCiAgfQp9CmBgYAoKd2hpY2ggd2lsbCBnZW5lcmF0ZSBhIHN0YXRpYyBidWlsZGVyIG1ldGhvZCBjYWxsZWQgYEJ1aWxkUGV0c3RvcmUzMEFwaXpyTWFuYWdlcigpYC4gVGhlIGdlbmVyYXRlZCBidWlsZGVyIG1ldGhvZCBkZXBlbmRzIG9uIFtgQXBpenJgXShodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvQXBpenIpIGxpYnJhcnkgYW5kIGxvb2tzIGxpa2UgdGhpczoKCmBgYGNzCnB1YmxpYyBzdGF0aWMgSUFwaXpyTWFuYWdlcjxJU3dhZ2dlclBldHN0b3JlT3BlbkFQSTMwPiBCdWlsZFBldHN0b3JlMzBBcGl6ck1hbmFnZXIoQWN0aW9uPElBcGl6ck1hbmFnZXJPcHRpb25zQnVpbGRlcj4gb3B0aW9uc0J1aWxkZXIpCnsKICAgIG9wdGlvbnNCdWlsZGVyID8/PSBfID0+IHsgfTsgLy8gRGVmYXVsdCBlbXB0eSBvcHRpb25zIGlmIG51bGwKICAgIG9wdGlvbnNCdWlsZGVyICs9IG9wdGlvbnMgPT4gb3B0aW9ucwogICAgICAgIC5XaXRoQWthdmFjaGVDYWNoZUhhbmRsZXIoKQogICAgICAgIC5XaXRoQXV0b01hcHBlck1hcHBpbmdIYW5kbGVyKG5ldyBNYXBwZXJDb25maWd1cmF0aW9uKGNvbmZpZyA9PiB7IC8qIFlPVVJfTUFQUElOR1NfSEVSRSAqLyB9KSkKICAgICAgICAuV2l0aFByaW9yaXR5KCk7CgogICAgcmV0dXJuIEFwaXpyQnVpbGRlci5DdXJyZW50LkNyZWF0ZU1hbmFnZXJGb3I8SVN3YWdnZXJQZXRzdG9yZU9wZW5BUEkzMD4ob3B0aW9uc0J1aWxkZXIpOwp9CmBgYAoKVGhpcyBjb21lcyBpbiBoYW5keSBlc3BlY2lhbGx5IHdoZW4gZ2VuZXJhdGluZyBtdWx0aXBsZSBpbnRlcmZhY2VzLCBieSB0YWcgb3IgZW5kcG9pbnQuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGAucmVmaXR0ZXJgIHNldHRpbmdzIGZpbGUKCmBgYGpzb24KewogICJvcGVuQXBpUGF0aCI6ICIuLi9PcGVuQVBJL3YzLjAvcGV0c3RvcmUuanNvbiIsCiAgIm5hbWVzcGFjZSI6ICJQZXRzdG9yZSIsCiAgInVzZUR5bmFtaWNRdWVyeXN0cmluZ1BhcmFtZXRlcnMiOiB0cnVlLAogICJtdWx0aXBsZUludGVyZmFjZXMiOiAiQnlUYWciLAogICJuYW1pbmciOiB7CiAgICAidXNlT3BlbkFwaVRpdGxlIjogZmFsc2UsCiAgICAiaW50ZXJmYWNlTmFtZSI6ICJQZXRzdG9yZSIKICB9LAogICJkZXBlbmRlbmN5SW5qZWN0aW9uU2V0dGluZ3MiOiB7CiAgICAiYmFzZVVybCI6ICJodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92MyIsCiAgICAiaHR0cE1lc3NhZ2VIYW5kbGVycyI6IFsgIk15RGVsZWdhdGluZ0hhbmRsZXIiIF0sCiAgICAidHJhbnNpZW50RXJyb3JIYW5kbGVyIjogIkh0dHBSZXNpbGllbmNlIiwKICAgICJtYXhSZXRyeUNvdW50IjogMywKICAgICJmaXJzdEJhY2tvZmZSZXRyeUluU2Vjb25kcyI6IDAuNQogIH0sCiAgImFwaXpyU2V0dGluZ3MiOiB7CiAgICAid2l0aFJlcXVlc3RPcHRpb25zIjogdHJ1ZSwgLy8gUmVjb21tZW5kZWQgdG8gaW5jbHVkZSBhbiBBcGl6ciByZXF1ZXN0IG9wdGlvbnMgcGFyYW1ldGVyIHRvIFJlZml0IGludGVyZmFjZSBtZXRob2RzCiAgICAid2l0aFJlZ2lzdHJhdGlvbkhlbHBlciI6IHRydWUsIC8vIE1hbmRhdG9yeSB0byBhY3R1YWxseSBnZW5lcmF0ZSB0aGUgQXBpenIgcmVnaXN0cmF0aW9uIGV4dGVuZGVkIG1ldGhvZAogICAgIndpdGhDYWNoZVByb3ZpZGVyIjogIkluTWVtb3J5IiwgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgTm9uZQogICAgIndpdGhQcmlvcml0eSI6IHRydWUsIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlCiAgICAid2l0aE1lZGlhdGlvbiI6IHRydWUsIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlCiAgICAid2l0aE9wdGlvbmFsTWVkaWF0aW9uIjogdHJ1ZSwgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgZmFsc2UKICAgICJ3aXRoTWFwcGluZ1Byb3ZpZGVyIjogIkF1dG9NYXBwZXIiLCAvLyBPcHRpb25hbCwgZGVmYXVsdCBpcyBOb25lCiAgICAid2l0aEZpbGVUcmFuc2ZlciI6IHRydWUgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgZmFsc2UKICB9Cn0KYGBgCgpXaWxsIGdlbmVyYXRlIGEgc2luZ2xlIGBCdWlsZFBldHN0b3JlQXBpenJNYW5hZ2VycygpYCBidWlsZGVyIG1ldGhvZCB0aGF0IG1heSBjb250YWluIGNvbmZpZ3VyYXRpb24gY29kZSBmb3IgbXVsdGlwbGUgaW50ZXJmYWNlcyBsaWtlIHRoaXMKCmBgYGNzaGFycApwdWJsaWMgc3RhdGljIElBcGl6clJlZ2lzdHJ5IEJ1aWxkUGV0c3RvcmVBcGl6ck1hbmFnZXJzKEFjdGlvbjxJQXBpenJDb21tb25PcHRpb25zQnVpbGRlcj4gb3B0aW9uc0J1aWxkZXIpCnsKICAgIG9wdGlvbnNCdWlsZGVyID8/PSBfID0+IHsgfTsgLy8gRGVmYXVsdCBlbXB0eSBvcHRpb25zIGlmIG51bGwKICAgIG9wdGlvbnNCdWlsZGVyICs9IG9wdGlvbnMgPT4gb3B0aW9ucwogICAgICAgIC5XaXRoQWthdmFjaGVDYWNoZUhhbmRsZXIoKQogICAgICAgIC5XaXRoQXV0b01hcHBlck1hcHBpbmdIYW5kbGVyKG5ldyBNYXBwZXJDb25maWd1cmF0aW9uKGNvbmZpZyA9PiB7IC8qIFlPVVJfTUFQUElOR1NfSEVSRSAqLyB9KSkKICAgICAgICAuV2l0aFByaW9yaXR5KCk7CgogICAgcmV0dXJuIEFwaXpyQnVpbGRlci5DdXJyZW50LkNyZWF0ZVJlZ2lzdHJ5KAogICAgICAgIHJlZ2lzdHJ5ID0+IHJlZ2lzdHJ5CiAgICAgICAgICAgIC5BZGRNYW5hZ2VyRm9yPElQZXRBcGk+KCkKICAgICAgICAgICAgLkFkZE1hbmFnZXJGb3I8SVN0b3JlQXBpPigpCiAgICAgICAgICAgIC5BZGRNYW5hZ2VyRm9yPElVc2VyQXBpPigpLAogICAgICAgIG9wdGlvbnNCdWlsZGVyKTsKfQpgYGAKCkhlcmUsIGBJUGV0QXBpYCwgYElTdG9yZUFwaWAgYW5kIGBJVXNlckFwaWAgYXJlIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlcyB3aGljaCBzaGFyZSB0aGUgc2FtZSBjb21tb24gY29uZmlndXJhdGlvbiBkZWZpbmVkIGZyb20gdGhlIGAucmVmaXR0ZXJgIGZpbGUuCgoqKioKCiMjIyBDdXN0b21pemluZyB0aGUgY29uZmlndXJhdGlvbgoKWW91IG1heSB3YW50IHRvIGFkanVzdCBhcGlzIGNvbmZpZ3VyYXRpb24sIGZvciBleGFtcGxlLCB0byBhZGQgYSBjdXN0b20gaGVhZGVyIHRvIHJlcXVlc3RzLiBUaGlzIGNhbiBiZSBkb25lIHVzaW5nIHRoZSBgQWN0aW9uPFRBcGl6ck9wdGlvbnNCdWlsZGVyPmAgcGFyYW1ldGVyIHdoaWxlIGNhbGxpbmcgdGhlIGdlbmVyYXRlZCBtZXRob2QuClRvIGtub3cgaG93IHRvIG1ha2UgQXBpenIgZml0IHlvdXIgbmVlZHMsIHBsZWFzZSByZWZlciB0byB0aGUgW0FwaXpyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3LmFwaXpyLm5ldCkuCgojIyMgVXNpbmcgdGhlIG1hbmFnZXJzCgpPbmNlIHlvdSBjYWxsZWQgdGhlIGdlbmVyYXRlZCBtZXRob2QsIHlvdSB3aWxsIGdldCBhbiBgSUFwaXpyTWFuYWdlcjxUPmAgaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBtYWtlIHJlcXVlc3RzIHRvIHRoZSBBUEkuIEhlcmUncyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgaXQ6CgpgYGBjc2hhcnAKdmFyIHJlc3VsdCA9IGF3YWl0IHBldHN0b3JlTWFuYWdlci5FeGVjdXRlQXN5bmMoKGFwaSwgb3B0KSA9PiBhcGkuR2V0UGV0QnlJZCgxLCBvcHQpLAogICAgb3B0aW9ucyA9PiBvcHRpb25zIC8vIFdoYXRldmVyIGZpbmFsIHJlcXVlc3Qgb3B0aW9ucyB5b3Ugd2FudCB0byBhcHBseQogICAgICAgIC5XaXRoUHJpb3JpdHkoUHJpb3JpdHkuQmFja2dyb3VuZCkKICAgICAgICAuV2l0aEhlYWRlcnMoWyJIZWFkZXJLZXkxOiBIZWFkZXJWYWx1ZTEiXSkKICAgICAgICAuV2l0aFJlcXVlc3RUaW1lb3V0KCIwMDowMDoxMCIpCiAgICAgICAgLldpdGhDYW5jZWxsYXRpb24oY3RzLlRva2VuKSk7CmBgYAoKUGxlYXNlIGhlYWQgdG8gdGhlIFtBcGl6ciBkb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5hcGl6ci5uZXQpIHRvIGdldCBtb3JlLgoKIyMgU3lzdGVtIHJlcXVpcmVtZW50cwouTkVUIDguMAoKIyMgQ29udHJpYnV0b3JzCgo8IS0tIEFMTC1DT05UUklCVVRPUlMtTElTVDpTVEFSVCAtIERvIG5vdCByZW1vdmUgb3IgbW9kaWZ5IHRoaXMgc2VjdGlvbiAtLT4KPCEtLSBwcmV0dGllci1pZ25vcmUtc3RhcnQgLS0+CjwhLS0gbWFya2Rvd25saW50LWRpc2FibGUgLS0+Cjx0YWJsZT4KICA8dGJvZHk+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL25lb0dlbmV2YSI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS84MDQ3MjQ/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlBoaWxpcCBDb3giLz48YnIgLz48c3ViPjxiPlBoaWxpcCBDb3g8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1uZW9HZW5ldmEiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9jYW0ubWFjZmFyLmxhbmQvIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTg4NDc/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkNhbWVyb24gTWFjRmFybGFuZCIvPjxiciAvPjxzdWI+PGI+Q2FtZXJvbiBNYWNGYXJsYW5kPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9ZGlzdGFudGNhbSIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwOi8va2dhbWUudHciPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMzY0NjUzMj92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0ia2dhbWUiLz48YnIgLz48c3ViPjxiPmtnYW1lPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9a2dhbWVjYXJ0ZXIiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cDovL3lya2kubm8iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTE1NzM2MDE/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlRob21hcyBQZXR0ZXJzZW4gLyBZcmtpIi8+PGJyIC8+PHN1Yj48Yj5UaG9tYXMgUGV0dGVyc2VuIC8gWXJraTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPSIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vMWt2aW4iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDY0MjU5ODA/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkFydGVtIi8+PGJyIC8+PHN1Yj48Yj5BcnRlbTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQTFrdmluIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbTdjbGFya2UiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDc0MzkxNDQ/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9Im03Y2xhcmtlIi8+PGJyIC8+PHN1Yj48Yj5tN2NsYXJrZTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQW03Y2xhcmtlIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20va2lyaWRlcyI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xMzYwMjE0Mz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0ia2lyaWRlcyIvPjxiciAvPjxzdWI+PGI+a2lyaWRlczwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWtpcmlkZXMiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPWtpcmlkZXMiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9ndWlsbGF1bWVzZXJhbGUiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNjY3MjQwNj92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iZ3VpbGxhdW1lc2VyYWxlIi8+PGJyIC8+PHN1Yj48Yj5ndWlsbGF1bWVzZXJhbGU8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1ndWlsbGF1bWVzZXJhbGUiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBZ3VpbGxhdW1lc2VyYWxlIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUm9mbGluY29wdGVyIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2OTAyNDM/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkRlbm5pcyBCcmVudGplcyIvPjxiciAvPjxzdWI+PGI+RGVubmlzIEJyZW50amVzPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9Um9mbGluY29wdGVyIiB0aXRsZT0iQ29kZSI+8J+SuzwvYT4gPGEgaHJlZj0iI2lkZWFzLVJvZmxpbmNvcHRlciIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9oaWNrZXlkYW1pYW4vIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzU3NDM2P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJEYW1pYW4gSGlja2V5Ii8+PGJyIC8+PHN1Yj48Yj5EYW1pYW4gSGlja2V5PC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBZGFtaWFuaCIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3JpY2hhcmRodS1sbWciPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI2NDMwNzg3P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJyaWNoYXJkaHUtbG1nIi8+PGJyIC8+PHN1Yj48Yj5yaWNoYXJkaHUtbG1nPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBcmljaGFyZGh1LWxtZyIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2JyZWFzZS1jb2xpbiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS80NzM1ODkzNT92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iYnJlYXNlLWNvbGluIi8+PGJyIC8+PHN1Yj48Yj5icmVhc2UtY29saW48L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9pc3N1ZXM/cT1hdXRob3IlM0FicmVhc2UtY29saW4iIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hbmdlbG9mYiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8yMDMyMjU3P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJhbmdlbG9mYiIvPjxiciAvPjxzdWI+PGI+YW5nZWxvZmI8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1hbmdlbG9mYiIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vTm9HUm8iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNTY2NTI3Mz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iRGltIE5vZ3JvIi8+PGJyIC8+PHN1Yj48Yj5EaW0gTm9ncm88L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1Ob0dSbyIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3lhZGFuaWxvdjE5Ij48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE3MTYxMDY1P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJ5YWRhbmlsb3YxOSIvPjxiciAvPjxzdWI+PGI+eWFkYW5pbG92MTk8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9IiNpZGVhcy15YWRhbmlsb3YxOSIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPXlhZGFuaWxvdjE5IiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYW5wb3dlbGw4OCI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xMTAwMzk3P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJEYW5pZWwgUG93ZWxsIi8+PGJyIC8+PHN1Yj48Yj5EYW5pZWwgUG93ZWxsPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBZGFucG93ZWxsODgiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9Fa2tlaXIiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMzYxOTQ2ODU/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkVra2VpciIvPjxiciAvPjxzdWI+PGI+RWtrZWlyPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9RWtrZWlyIiB0aXRsZT0iRG9jdW1lbnRhdGlvbiI+8J+TljwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQUVra2VpciIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3dheWxvbm10eiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS80NjA0NTc5P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJXYXlsb24gTWFydGluZXoiLz48YnIgLz48c3ViPjxiPldheWxvbiBNYXJ0aW5lejwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQXdheWxvbm10eiIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3ZpbmF5bWFkdXBhdGhpIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzM4MTAyOTAwP3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJ2a21hZHVwYSIvPjxiciAvPjxzdWI+PGI+dmttYWR1cGE8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9pc3N1ZXM/cT1hdXRob3IlM0F2aW5heW1hZHVwYXRoaSIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL05vYmxpeCI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8yMjA3Njg4Mz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iTm9ibGl4Ii8+PGJyIC8+PHN1Yj48Yj5Ob2JsaXg8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1Ob2JsaXgiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPiA8YSBocmVmPSIjaWRlYXMtTm9ibGl4IiB0aXRsZT0iSWRlYXMsIFBsYW5uaW5nLCAmIEZlZWRiYWNrIj7wn6SUPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly93d3cudmVlemxhLmlvIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzIzMDQzMj92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iQXR0aWxhIEhhamRyaWsiLz48YnIgLz48c3ViPjxiPkF0dGlsYSBIYWpkcmlrPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSIjaWRlYXMtYXR0aWxhaCIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYmllbGlrMDEiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvOTIwOTUwP3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJiaWVsaWswMSIvPjxiciAvPjxzdWI+PGI+YmllbGlrMDE8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9pc3N1ZXM/cT1hdXRob3IlM0FiaWVsaWswMSIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPiA8YSBocmVmPSIjaWRlYXMtYmllbGlrMDEiIHRpdGxlPSJJZGVhcywgUGxhbm5pbmcsICYgRmVlZGJhY2siPvCfpJQ8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbmFhZWVmIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzQzMzM5MDcxP3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJuYWFlZWYiLz48YnIgLz48c3ViPjxiPm5hYWVlZjwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iI2lkZWFzLW5hYWVlZiIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hbHJ6Ij48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzMxMDU5Nzk/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkFsaXJlemEgSGFiaWJpIi8+PGJyIC8+PHN1Yj48Yj5BbGlyZXphIEhhYmliaTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWFscnoiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9FRVBhcmtlciI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTg3NDA3Nj92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iSmVmZiBQYXJrZXIsIFBFIi8+PGJyIC8+PHN1Yj48Yj5KZWZmIFBhcmtlciwgUEU8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9pc3N1ZXM/cT1hdXRob3IlM0FFRVBhcmtlciIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2pvZHM0Ij48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzM4MzI4MjA/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9ImpvZHMiLz48YnIgLz48c3ViPjxiPmpvZHM8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9IiNpZGVhcy1qb2RzNCIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWpvZHM0IiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZWRpbWFycXVleiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS80MTc5MTcxOT92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iRWRpbWFycXVleiBNZWRlaXJvcyIvPjxiciAvPjxzdWI+PGI+RWRpbWFycXVleiBNZWRlaXJvczwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPWVkaW1hcnF1ZXoiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NhZmFra2VzaWtjaSI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS83MDY3MjUyP3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJzYWZha2tlc2lrY2kiLz48YnIgLz48c3ViPjxiPnNhZmFra2VzaWtjaTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQXNhZmFra2VzaWtjaSIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9mb2xicmVjaHQiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ1NTM3ODQ2P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJmb2xicmVjaHQiLz48YnIgLz48c3ViPjxiPmZvbGJyZWNodDwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWZvbGJyZWNodCIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21vcnRlbmxhdXJzZW4iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMjg3NTk3Mzc/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9Im1vcnRlbmxhdXJzZW4iLz48YnIgLz48c3ViPjxiPm1vcnRlbmxhdXJzZW48L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1tb3J0ZW5sYXVyc2VuIiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYW51ZWwtZmVybmFuZGV6LXJvZHJpZ3VleiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS80ODUyMDIwNT92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0ibWFudWVsLWZlcm5hbmRlei1yb2RyaWd1ZXoiLz48YnIgLz48c3ViPjxiPm1hbnVlbC1mZXJuYW5kZXotcm9kcmlndWV6PC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBbWFudWVsLWZlcm5hbmRlei1yb2RyaWd1ZXoiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9lbGl5YW1taW5lIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzY2NDQ4MDc/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkVsaSBZYW1taW5lIi8+PGJyIC8+PHN1Yj48Yj5FbGkgWWFtbWluZTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWVsaXlhbW1pbmUiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9rYW1pLXBvaSI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS80NzMyMjY5MT92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0ia2FtaS1wb2kiLz48YnIgLz48c3ViPjxiPmthbWktcG9pPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSIjaWRlYXMta2FtaS1wb2kiIHRpdGxlPSJJZGVhcywgUGxhbm5pbmcsICYgRmVlZGJhY2siPvCfpJQ8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vWGVldmlzIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzU4MzUwNDQ/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlhlZXZpcyIvPjxiciAvPjxzdWI+PGI+WGVldmlzPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBWGVldmlzIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vREo0ZGRpIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2OTYxMDI/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkRKNGRkaSIvPjxiciAvPjxzdWI+PGI+REo0ZGRpPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9REo0ZGRpIiB0aXRsZT0iQ29kZSI+8J+SuzwvYT4gPGEgaHJlZj0iI2lkZWFzLURKNGRkaSIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGlyZW5jYW5jYXRhbGtheWEiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNTcyMjM3MzI/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9ImRpcmVuY2FuY2F0YWxrYXlhIi8+PGJyIC8+PHN1Yj48Yj5kaXJlbmNhbmNhdGFsa2F5YTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPWRpcmVuY2FuY2F0YWxrYXlhIiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9yb2JwYWxtIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0OTM5NTMwP3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJSb2JlcnQgUGFsbXF2aXN0Ii8+PGJyIC8+PHN1Yj48Yj5Sb2JlcnQgUGFsbXF2aXN0PC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSIjaWRlYXMtcm9icGFsbSIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPXJvYnBhbG0iIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1RpbW90aHlNYWtraXNvbiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS80OTM0OTUxMz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iVGltIE0iLz48YnIgLz48c3ViPjxiPlRpbSBNPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9VGltb3RoeU1ha2tpc29uIiB0aXRsZT0iRG9jdW1lbnRhdGlvbiI+8J+TljwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qYW5mb2xicmVjaHQiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDIxODY2MDQ/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9ImphbmZvbGJyZWNodCIvPjxiciAvPjxzdWI+PGI+amFuZm9sYnJlY2h0PC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSIjaWRlYXMtamFuZm9sYnJlY2h0IiB0aXRsZT0iSWRlYXMsIFBsYW5uaW5nLCAmIEZlZWRiYWNrIj7wn6SUPC9hPiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9amFuZm9sYnJlY2h0IiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vc2MtbnNlZ3VpbiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xMzM5MTAzMDk/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9Ik5pY2sgU2VndWluIi8+PGJyIC8+PHN1Yj48Yj5OaWNrIFNlZ3VpbjwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPW9zYy1uc2VndWluIiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYXZpZC1icmluay10YWxvZ3kiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDM4Mjg3Mzk/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkRhdmlkIEJyaW5rIi8+PGJyIC8+PHN1Yj48Yj5EYXZpZCBCcmluazwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWRhdmlkLWJyaW5rLXRhbG9neSIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9ZGF2aWQtYnJpbmstdGFsb2d5IiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYW1taXRqYW5ldCI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS85NTI3MjM/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlN0dSBXaWxzb24iLz48YnIgLz48c3ViPjxiPlN0dSBXaWxzb248L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9IiNpZGVhcy1kYW1taXRqYW5ldCIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPWRhbW1pdGphbmV0IiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2hhcnB6aWxsYSI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNjc2MzYzND92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0ic2hhcnB6aWxsYSIvPjxiciAvPjxzdWI+PGI+c2hhcnB6aWxsYTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iI2lkZWFzLXNoYXJwemlsbGEiIHRpdGxlPSJJZGVhcywgUGxhbm5pbmcsICYgRmVlZGJhY2siPvCfpJQ8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vSmFwcGluZW4iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDQ0MDg0OTc/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlRhdHUiLz48YnIgLz48c3ViPjxiPlRhdHU8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9pc3N1ZXM/cT1hdXRob3IlM0FKYXBwaW5lbiIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cDovL3d3dy5yZXNwYXduc2l2ZS5jb20iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDI3MjMwNz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iSsOpcsOpbXkgQlJVTi1QSUNBUkQiLz48YnIgLz48c3ViPjxiPkrDqXLDqW15IEJSVU4tUElDQVJEPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSIjaWRlYXMtSmVyZW15QlAiIHRpdGxlPSJJZGVhcywgUGxhbm5pbmcsICYgRmVlZGJhY2siPvCfpJQ8L2E+IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1KZXJlbXlCUCIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1KZXJlbXlCUCIgdGl0bGU9IkRvY3VtZW50YXRpb24iPvCfk5Y8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZWJhcm5hcmQiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTA1OTY4Mz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iRWQgQmFybmFyZCIvPjxiciAvPjxzdWI+PGI+RWQgQmFybmFyZDwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iI2lkZWFzLWViYXJuYXJkIiB0aXRsZT0iSWRlYXMsIFBsYW5uaW5nLCAmIEZlZWRiYWNrIj7wn6SUPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Jhc3RpZW5ub2VsOTMiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTgyNTAzNTA/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9ImJhc3RpZW4ubm9lbCIvPjxiciAvPjxzdWI+PGI+YmFzdGllbi5ub2VsPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBYmFzdGllbm5vZWw5MyIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL01laWtlbExQIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzExNjY5ODQ2P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJNZWlrZWwgUGhpbGlwcCIvPjxiciAvPjxzdWI+PGI+TWVpa2VsIFBoaWxpcHA8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9IiNpZGVhcy1NZWlrZWxMUCIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHA6Ly9iZXJrc2VsdmkuZGV2Ij48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzU0Njc2NTE2P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJCZXJrIFNlbHZpIi8+PGJyIC8+PHN1Yj48Yj5CZXJrIFNlbHZpPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSIjaWRlYXMtYmVya3NsdiIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPWJlcmtzbHYiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vd3d3LnRoZWJ1aWxkc2hlZXQuY29tLyI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS85OTA5NTY0P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJKb3NodWEgT3plcmkiLz48YnIgLz48c3ViPjxiPkpvc2h1YSBPemVyaTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQVhlQ2x1dGNoIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2thbmNhbmUubmwvIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzcwMTUzND92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iUnlhbiBIZWF0aCIvPjxiciAvPjxzdWI+PGI+UnlhbiBIZWF0aDwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iI2lkZWFzLXJ5YW5oZWF0aCIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPXJ5YW5oZWF0aCIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vQnJpYW9ldWlkaHRucyI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS83NTMwMTU2P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJCcmlhbiBCcnVubmVyIi8+PGJyIC8+PHN1Yj48Yj5CcmlhbiBCcnVubmVyPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSIjaWRlYXMtQnJpYW9ldWlkaHRucyIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9mc2FtaWVjIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEzMTY2MDIwP3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJGcmFuayBTYW1pZWMiLz48YnIgLz48c3ViPjxiPkZyYW5rIFNhbWllYzwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPWZzYW1pZWMiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2ZhYmlvbG9yZWdnaWFuIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzMxNDgwNzY4P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJGYWJpbyBMb3JlZ2dpYW4iLz48YnIgLz48c3ViPjxiPkZhYmlvIExvcmVnZ2lhbjwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWZhYmlvbG9yZWdnaWFuIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZ2VvbWV0cmlrYWwiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTE4NzUyOD92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iZ2VvbWV0cmlrYWwiLz48YnIgLz48c3ViPjxiPmdlb21ldHJpa2FsPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBZ2VvbWV0cmlrYWwiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zaHViaW5wIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzI1NzYzNzc2P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJTaHViaW4gUGF2ZWwiLz48YnIgLz48c3ViPjxiPlNodWJpbiBQYXZlbDwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPXNodWJpbnAiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vd3d3Lm5ldGluZHVzdHJ5Lm5sIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzMwMzAzND92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iV2llYmUgVGlqc21hIi8+PGJyIC8+PHN1Yj48Yj5XaWViZSBUaWpzbWE8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9IiNpZGVhcy16aWRhZCIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9oZ2RlbWVycyI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNjkxOTA4NzY/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkhlbnJpIERlbWVycyIvPjxiciAvPjxzdWI+PGI+SGVucmkgRGVtZXJzPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBaGdkZW1lcnMiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9GYXJnZWtyaXR0Ij48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzExNDQ4OTQxP3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJBbXVuZCIvPjxiciAvPjxzdWI+PGI+QW11bmQ8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1GYXJnZWtyaXR0IiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS92ZWx2b2x1ZSI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTU0NDU5Njg/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlZlZ2FyZCBMw7hra2VuIi8+PGJyIC8+PHN1Yj48Yj5WZWdhcmQgTMO4a2tlbjwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPXZlbHZvbHVlIiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgPC90cj4KICA8L3Rib2R5Pgo8L3RhYmxlPgoKPCEtLSBtYXJrZG93bmxpbnQtcmVzdG9yZSAtLT4KPCEtLSBwcmV0dGllci1pZ25vcmUtZW5kIC0tPgoKPCEtLSBBTEwtQ09OVFJJQlVUT1JTLUxJU1Q6RU5EIC0tPgoKIwoKRm9yIHRpcHMgYW5kIHRyaWNrcyBvbiBzb2Z0d2FyZSBkZXZlbG9wbWVudCwgY2hlY2sgb3V0IFtteSBibG9nXShodHRwczovL2NocmlzdGlhbmhlbGxlLmNvbSkKCklmIHlvdSBmaW5kIHRoaXMgdXNlZnVsIGFuZCBmZWVsIGEgYml0IGdlbmVyb3VzIHRoZW4gZmVlbCBmcmVlIHRvIFtidXkgbWUgYSBjb2ZmZWUg4piVXShodHRwczovL3d3dy5idXltZWFjb2ZmZWUuY29tL2NocmlzdGlhbmhlbGxlKQo=
- readmeEtag: '"2c4527860d8a831cdda47b7d1db560458e683860"'
- readmeLastModified: Thu, 09 Jan 2025 11:40:43 GMT
+ WyFbQnVpbGRdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9hY3Rpb25zL3dvcmtmbG93cy9idWlsZC55bWwvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2FjdGlvbnMvd29ya2Zsb3dzL2J1aWxkLnltbCkKWyFbU21va2UgVGVzdHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9hY3Rpb25zL3dvcmtmbG93cy9zbW9rZS10ZXN0cy55bWwvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2FjdGlvbnMvd29ya2Zsb3dzL3Ntb2tlLXRlc3RzLnltbCkKWyFbTnVHZXRdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnVnZXQvdi9yZWZpdHRlcj9jb2xvcj1ibHVlKV0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL3JlZml0dGVyKQpbIVtRdWFsaXR5IEdhdGUgU3RhdHVzXShodHRwczovL3NvbmFyY2xvdWQuaW8vYXBpL3Byb2plY3RfYmFkZ2VzL21lYXN1cmU/cHJvamVjdD1jaHJpc3RpYW5oZWxsZV9yZWZpdHRlciZtZXRyaWM9YWxlcnRfc3RhdHVzKV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL3N1bW1hcnkvbmV3X2NvZGU/aWQ9Y2hyaXN0aWFuaGVsbGVfcmVmaXR0ZXIpClshW2NvZGVjb3ZdKGh0dHBzOi8vY29kZWNvdi5pby9naC9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9ncmFwaC9iYWRnZS5zdmc/dG9rZW49MjQyWVQxTjZUMildKGh0dHBzOi8vY29kZWNvdi5pby9naC9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlcikKCjwhLS0gQUxMLUNPTlRSSUJVVE9SUy1CQURHRTpTVEFSVCAtIERvIG5vdCByZW1vdmUgb3IgbW9kaWZ5IHRoaXMgc2VjdGlvbiAtLT4KWyFbQWxsIENvbnRyaWJ1dG9yc10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9hbGxfY29udHJpYnV0b3JzLTYxLW9yYW5nZS5zdmc/c3R5bGU9ZmxhdC1zcXVhcmUpXSgjY29udHJpYnV0b3JzLSkKPCEtLSBBTEwtQ09OVFJJQlVUT1JTLUJBREdFOkVORCAtLT4KCiMgUmVmaXR0ZXIKUmVmaXR0ZXIgaXMgYSB0b29sIGZvciBnZW5lcmF0aW5nIGEgQyMgUkVTVCBBUEkgQ2xpZW50IHVzaW5nIHRoZSBbUmVmaXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGl2ZXVpL3JlZml0KSBsaWJyYXJ5LiBSZWZpdHRlciBjYW4gZ2VuZXJhdGUgdGhlIFJlZml0IGludGVyZmFjZSBhbmQgY29udHJhY3RzIGZyb20gT3BlbkFQSSBzcGVjaWZpY2F0aW9ucy4gUmVmaXR0ZXIgY291bGQgZm9ybWF0IHRoZSBnZW5lcmF0ZWQgUmVmaXQgaW50ZXJmYWNlIHRvIGJlIG1hbmFnZWQgYnkgW0FwaXpyXShodHRwczovL3d3dy5hcGl6ci5uZXQpICh2NispIGFuZCBnZW5lcmF0ZSBzb21lIHJlZ2lzdHJhdGlvbiBoZWxwZXJzIHRvby4KClJlZml0dGVyIGNvbWVzIGluIDIgZm9ybXM6Ci0gQSBbLk5FVCBDTEkgVG9vbF0oI2NsaS10b29sKSBkaXN0cmlidXRlZCB2aWEgW251Z2V0Lm9yZ10oaHR0cDovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvcmVmaXR0ZXIpIHRoYXQgb3V0cHV0cyBhIHNpbmdsZSBDIyBmaWxlIG9uIGRpc2sKLSBBIFtDIyBTb3VyY2UgR2VuZXJhdG9yXSgjc291cmNlLWdlbmVyYXRvcikgdmlhIHRoZSBbUmVmaXR0ZXIuU291cmNlR2VuZXJhdG9yXShodHRwOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9yZWZpdHRlci5zb3VyY2VnZW5lcmF0b3IpIHBhY2thZ2UgdGhhdCBnZW5lcmF0ZXMgY29kZSBvbiBjb21waWxlIHRpbWUgYmFzZWQgb24gYSBbLnJlZml0dGVyXSgjLnJlZml0dGVyLWZpbGUtZm9ybWF0KSB3aXRoaW4gdGhlIHByb2plY3QgZGlyZWN0b3J5LgoKIyMgQ0xJIFRvb2wKCiMjIyBJbnN0YWxsYXRpb246CgpUaGUgdG9vbCBpcyBwYWNrYWdlZCBhcyBhIC5ORVQgVG9vbCBhbmQgaXMgcHVibGlzaGVkIHRvIG51Z2V0Lm9yZy4gWW91IGNhbiBpbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHRvb2wgbGlrZSB0aGlzOgoKYGBgc2hlbGwKZG90bmV0IHRvb2wgaW5zdGFsbCAtLWdsb2JhbCBSZWZpdHRlcgpgYGAKCiMjIyBVc2FnZToKCmBgYHNoZWxsCiQgcmVmaXR0ZXIgLS1oZWxwCmBgYAoKYGBgdGV4dApVU0FHRToKICAgIHJlZml0dGVyIFtVUkwgb3IgaW5wdXQgZmlsZV0gW09QVElPTlNdCgpFWEFNUExFUzoKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uCiAgICByZWZpdHRlciBodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92My9vcGVuYXBpLnlhbWwKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tc2V0dGluZ3MtZmlsZSAuL29wZW5hcGkucmVmaXR0ZXIgLS1vdXRwdXQgLi9HZW5lcmF0ZWRDb2RlLmNzCiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLW5hbWVzcGFjZSAiWW91ci5OYW1lc3BhY2UuT2YuQ2hvaWNlLkdlbmVyYXRlZENvZGUiIC0tb3V0cHV0IC4vR2VuZXJhdGVkQ29kZS5jcwogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1uYW1lc3BhY2UgIllvdXIuTmFtZXNwYWNlLk9mLkNob2ljZS5HZW5lcmF0ZWRDb2RlIiAtLWludGVybmFsCiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLW91dHB1dCAuL0lHZW5lcmF0ZWRDb2RlLmNzIC0taW50ZXJmYWNlLW9ubHkKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tb3V0cHV0IC4vR2VuZXJhdGVkQ29udHJhY3RzLmNzIC0tY29udHJhY3Qtb25seQogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS11c2UtYXBpLXJlc3BvbnNlCiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLWNhbmNlbGxhdGlvbi10b2tlbnMKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbm8tb3BlcmF0aW9uLWhlYWRlcnMKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbm8tYWNjZXB0LWhlYWRlcnMKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tdXNlLWlzby1kYXRlLWZvcm1hdAogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1hZGRpdGlvbmFsLW5hbWVzcGFjZSAiWW91ci5BZGRpdGlvbmFsLk5hbWVzcGFjZSIgLS1hZGRpdGlvbmFsLW5hbWVzcGFjZSAiWW91ci5PdGhlci5BZGRpdGlvbmFsLk5hbWVzcGFjZSIKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbXVsdGlwbGUtaW50ZXJmYWNlcyBCeUVuZHBvaW50CiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLXRhZyBQZXQgLS10YWcgU3RvcmUgLS10YWcgVXNlcgogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1tYXRjaC1wYXRoICdeL3BldC8uKicKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tdHJpbS11bnVzZWQtc2NoZW1hCiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLXRyaW0tdW51c2VkLXNjaGVtYSAgLS1rZWVwLXNjaGVtYSAnXk1vZGVsJCcgLS1rZWVwLXNjaGVtYSAnXlBlcnNvbi4rJwogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1uby1kZXByZWNhdGVkLW9wZXJhdGlvbnMKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tb3BlcmF0aW9uLW5hbWUtdGVtcGxhdGUgJ3tvcGVyYXRpb25OYW1lfUFzeW5jJwogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1vcHRpb25hbC1udWxsYWJsZS1wYXJhbWV0ZXJzCiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLXVzZS1wb2x5bW9ycGhpYy1zZXJpYWxpemF0aW9uCgpBUkdVTUVOVFM6CiAgICBbVVJMIG9yIGlucHV0IGZpbGVdICAgIFVSTCBvciBmaWxlIHBhdGggdG8gT3BlbkFQSSBTcGVjaWZpY2F0aW9uIGZpbGUKCk9QVElPTlM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFQKICAgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludHMgaGVscCBpbmZvcm1hdGlvbgogICAgLXYsIC0tdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50cyB2ZXJzaW9uIGluZm9ybWF0aW9uCiAgICAtcywgLS1zZXR0aW5ncy1maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCB0byAucmVmaXR0ZXIgc2V0dGluZ3MgZmlsZS4gU3BlY2lmeWluZyB0aGlzIHdpbGwgaWdub3JlIGFsbCBvdGhlciBzZXR0aW5ncyAoZXhjZXB0IGZvciAtLW91dHB1dCkKICAgIC1uLCAtLW5hbWVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVkQ29kZSAgICBEZWZhdWx0IG5hbWVzcGFjZSB0byB1c2UgZm9yIGdlbmVyYXRlZCB0eXBlcwogICAgICAgIC0tY29udHJhY3RzLW5hbWVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgbmFtZXNwYWNlIHRvIHVzZSBmb3IgZ2VuZXJhdGVkIGNvbnRyYWN0cwogICAgLW8sIC0tb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQuY3MgICAgICAgIFBhdGggdG8gT3V0cHV0IGZpbGUgb3IgZm9sZGVyIChpZiBtdWx0aXBsZSBmaWxlcyBhcmUgZ2VuZXJhdGVkKQogICAgICAgIC0tY29udHJhY3RzLW91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dCBwYXRoIGZvciBnZW5lcmF0ZWQgY29udHJhY3RzLiBFbmFibGluZyB0aGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlcyBnZW5lcmF0aW5nIG11bHRpcGxlIGZpbGVzCiAgICAgICAgLS1uby1hdXRvLWdlbmVyYXRlZC1oZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3QgYWRkIDxhdXRvLWdlbmVyYXRlZD4gaGVhZGVyIHRvIG91dHB1dCBmaWxlCiAgICAgICAgLS1uby1hY2NlcHQtaGVhZGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3QgYWRkIDxBY2NlcHQ+IGhlYWRlciB0byBvdXRwdXQgZmlsZQogICAgICAgIC0taW50ZXJmYWNlLW9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGNvbnRyYWN0IHR5cGVzCiAgICAgICAgLS1jb250cmFjdC1vbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgY2xpZW50cwogICAgICAgIC0tdXNlLWFwaS1yZXNwb25zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybiBUYXNrPElBcGlSZXNwb25zZTxUPj4gaW5zdGVhZCBvZiBUYXNrPFQ+CiAgICAgICAgLS11c2Utb2JzZXJ2YWJsZS1yZXNwb25zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuIElPYnNlcnZhYmxlIGluc3RlYWQgb2YgVGFzawogICAgICAgIC0taW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGUgYWNjZXNzaWJpbGl0eSBvZiB0aGUgZ2VuZXJhdGVkIHR5cGVzIHRvICdpbnRlcm5hbCcKICAgICAgICAtLWNhbmNlbGxhdGlvbi10b2tlbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgY2FuY2VsbGF0aW9uIHRva2VucwogICAgICAgIC0tbm8tb3BlcmF0aW9uLWhlYWRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIG9wZXJhdGlvbiBoZWFkZXJzCiAgICAgICAgLS1uby1sb2dnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3QgbG9nIGVycm9ycyBvciBjb2xsZWN0IHRlbGVtZXRyeQogICAgICAgIC0tYWRkaXRpb25hbC1uYW1lc3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBhZGRpdGlvbmFsIG5hbWVzcGFjZSB0byBnZW5lcmF0ZWQgdHlwZXMKICAgICAgICAtLWV4Y2x1ZGUtbmFtZXNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNsdWRlIG5hbWVzcGFjZSBvbiBnZW5lcmF0ZWQgdHlwZXMKICAgICAgICAtLXVzZS1pc28tZGF0ZS1mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsaWNpdGx5IGZvcm1hdCBkYXRlIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIGluIElTTyA4NjAxIHN0YW5kYXJkIGRhdGUgZm9ybWF0IHVzaW5nIGRlbGltaXRlcnMgKDIwMjMtMDYtMTUpCiAgICAgICAgLS1tdWx0aXBsZS1pbnRlcmZhY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgYSBSZWZpdCBpbnRlcmZhY2UgZm9yIGVhY2ggZW5kcG9pbnQuIE1heSBiZSBvbmUgb2YgQnlFbmRwb2ludCwgQnlUYWcKICAgICAgICAtLW11bHRpcGxlLWZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBtdWx0aXBsZSBmaWxlcyBpbnN0ZWFkIG9mIGEgc2luZ2xlIGxhcmdlIGZpbGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG91dHB1dCBmaWxlcyBjYW4gYmUgdGhlIGZvbGxvd2luZzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFJlZml0SW50ZXJmYWNlcy5jcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVwZW5kZW5jeUluamVjdGlvbi5jcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQ29udHJhY3RzLmNzCiAgICAgICAgLS1tYXRjaC1wYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSBpbmNsdWRlIFBhdGhzIHRoYXQgbWF0Y2ggdGhlIHByb3ZpZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbi4gTWF5IGJlIHNldCBtdWx0aXBsZSB0aW1lcwogICAgICAgIC0tdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgaW5jbHVkZSBFbmRwb2ludHMgdGhhdCBjb250YWluIHRoaXMgdGFnLiBNYXkgYmUgc2V0IG11bHRpcGxlIHRpbWVzIGFuZCByZXN1bHQgaW4gT1InZWQgZXZhbHVhdGlvbgogICAgICAgIC0tc2tpcC12YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXAgdmFsaWRhdGlvbiBvZiB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uCiAgICAgICAgLS1uby1kZXByZWNhdGVkLW9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgZGVwcmVjYXRlZCBvcGVyYXRpb25zCiAgICAgICAgLS1vcGVyYXRpb24tbmFtZS10ZW1wbGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgb3BlcmF0aW9uIG5hbWVzIHVzaW5nIHBhdHRlcm4uIFdoZW4gdXNpbmcgLS1tdWx0aXBsZS1pbnRlcmZhY2VzIEJ5RW5kcG9pbnQsIHRoaXMgaXMgbmFtZSBvZiB0aGUgRXhlY3V0ZSgpIG1ldGhvZCBpbiB0aGUgaW50ZXJmYWNlCiAgICAgICAgLS1vcHRpb25hbC1udWxsYWJsZS1wYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgbnVsbGFibGUgcGFyYW1ldGVycyBhcyBvcHRpb25hbCBwYXJhbWV0ZXJzCiAgICAgICAgLS10cmltLXVudXNlZC1zY2hlbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlcyB1bnJlZmVyZW5jZWQgY29tcG9uZW50cyBzY2hlbWEgdG8ga2VlcCB0aGUgZ2VuZXJhdGVkIG91dHB1dCB0byBhIG1pbmltdW0KICAgICAgICAtLWtlZXAtc2NoZW1hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JjZSB0byBrZWVwIG1hdGNoaW5nIHNjaGVtYSwgdXNlcyByZWd1bGFyIGV4cHJlc3Npb25zLiBVc2UgdG9nZXRoZXIgd2l0aCAiLS10cmltLXVudXNlZC1zY2hlbWEiLiBDYW4gYmUgc2V0IG11bHRpcGxlIHRpbWVzCiAgICAgICAgLS1uby1iYW5uZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9uJ3Qgc2hvdyBkb25hdGlvbiBiYW5uZXIKICAgICAgICAtLXNraXAtZGVmYXVsdC1hZGRpdGlvbmFsLXByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSB0byBza2lwIGRlZmF1bHQgYWRkaXRpb25hbCBwcm9wZXJ0aWVzCiAgICAgICAgLS1vcGVyYXRpb24tbmFtZS1nZW5lcmF0b3IgICAgICAgICAgICAgIERlZmF1bHQgICAgICAgICAgVGhlIE5Td2FnIElPcGVyYXRpb25OYW1lR2VuZXJhdG9yIGltcGxlbWVudGF0aW9uIHRvIHVzZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXkgYmUgb25lIG9mOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTXVsdGlwbGVDbGllbnRzRnJvbU9wZXJhdGlvbklkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBNdWx0aXBsZUNsaWVudHNGcm9tUGF0aFNlZ21lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBNdWx0aXBsZUNsaWVudHNGcm9tRmlyc3RUYWdBbmRPcGVyYXRpb25JZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTXVsdGlwbGVDbGllbnRzRnJvbUZpcnN0VGFnQW5kT3BlcmF0aW9uTmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gTXVsdGlwbGVDbGllbnRzRnJvbUZpcnN0VGFnQW5kUGF0aFNlZ21lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTaW5nbGVDbGllbnRGcm9tT3BlcmF0aW9uSWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNpbmdsZUNsaWVudEZyb21QYXRoU2VnbWVudHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgaHR0cHM6Ly9yZWZpdHRlci5naXRodWIuaW8vYXBpL1JlZml0dGVyLkNvcmUuT3BlcmF0aW9uTmFtZUdlbmVyYXRvclR5cGVzLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24KICAgICAgICAtLWltbXV0YWJsZS1yZWNvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBjb250cmFjdHMgYXMgaW1tdXRhYmxlIHJlY29yZHMgaW5zdGVhZCBvZiBjbGFzc2VzCiAgICAgICAgLS11c2UtYXBpenIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIEFwaXpyIGJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQWRkaW5nIGEgZmluYWwgSUFwaXpyUmVxdWVzdE9wdGlvbnMgb3B0aW9ucyBwYXJhbWV0ZXIgdG8gYWxsIGdlbmVyYXRlZCBtZXRob2RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBQcm92aWRpbmcgY2FuY2VsbGF0aW9uIHRva2VucyBieSBBcGl6ciByZXF1ZXN0IG9wdGlvbnMgaW5zdGVhZCBvZiBhIGRlZGljYXRlZCBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFVzaW5nIG1ldGhvZCBvdmVybG9hZHMgaW5zdGVhZCBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGh0dHBzOi8vcmVmaXR0ZXIuZ2l0aHViLmlvIGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBodHRwczovL3d3dy5hcGl6ci5uZXQgdG8gZ2V0IHN0YXJ0ZWQgd2l0aCBBcGl6cgogICAgICAgIC0tdXNlLWR5bmFtaWMtcXVlcnlzdHJpbmctcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgIEVuYWJsZSB3cmFwcGluZyBtdWx0aXBsZSBxdWVyeSBwYXJhbWV0ZXJzIGludG8gYSBzaW5nbGUgY29tcGxleCBvbmUuIERlZmF1bHQgaXMgbm8gd3JhcHBpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGl2ZXVpL3JlZml0P3RhYj1yZWFkbWUtb3YtZmlsZSNkeW5hbWljLXF1ZXJ5c3RyaW5nLXBhcmFtZXRlcnMgZm9yIG1vcmUgaW5mb3JtYXRpb24KICAgICAgICAtLXVzZS1wb2x5bW9ycGhpYy1zZXJpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgU3lzdGVtLlRleHQuSnNvbiBwb2x5bW9ycGhpYyBzZXJpYWxpemF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VzIE5Td2FnIEpzb25Jbmhlcml0YW5jZUNvbnZlcnRlciBhdHRyaWJ1dGVzIHdpdGggU3lzdGVtLlRleHQuSnNvbiBKc29uUG9seW1vcnBoaWNBdHRyaWJ1dGVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvIGhhdmUgdGhlIG5hdGl2ZSBzdXBwb3J0IG9mIGluaGVyaXRhbmNlIChkZSlzZXJpYWxpemF0aW9uIGFuZCBmYWxsYmFjayB0byBiYXNlIHR5cGVzIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkcyB3aXRoICh5ZXQpIHVua25vd24gdHlwZXMgYXJlIG9mZmVyZWQgYnkgbmV3ZXIgdmVyc2lvbnMgb2YgYW4gQVBJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy9kb3RuZXQvc3RhbmRhcmQvc2VyaWFsaXphdGlvbi9zeXN0ZW0tdGV4dC1qc29uL3BvbHltb3JwaGlzbSBmb3IgbW9yZSBpbmZvcm1hdGlvbgogICAgICAgIC0tZGlzcG9zYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHJlZml0IGNsaWVudHMgdGhhdCBpbXBsZW1lbnQgSURpc3Bvc2FibGUKYGBgCgpUbyBnZW5lcmF0ZSBjb2RlIGZyb20gYW4gT3BlbkFQSSBzcGVjaWZpY2F0aW9ucyBmaWxlLCBydW4gdGhlIGZvbGxvd2luZzoKCmBgYHNoZWxsCiQgcmVmaXR0ZXIgW3BhdGggdG8gT3BlbkFQSSBzcGVjIGZpbGVdIC0tbmFtZXNwYWNlICJbWW91ci5OYW1lc3BhY2UuT2YuQ2hvaWNlLkdlbmVyYXRlZENvZGVdIgpgYGAKClRoaXMgd2lsbCBnZW5lcmF0ZSBhIGZpbGUgY2FsbGVkIGBPdXRwdXQuY3NgIHdoaWNoIGNvbnRhaW5zIHRoZSBSZWZpdCBpbnRlcmZhY2UgYW5kIGNvbnRyYWN0IGNsYXNzZXMgZ2VuZXJhdGVkIHVzaW5nIFtOU3dhZ10oaHR0cHM6Ly9naXRodWIuY29tL1JpY29TdXRlci9OU3dhZykKCiMjIFNvdXJjZSBHZW5lcmF0b3IKClJlZml0dGVyIGlzIGF2YWlsYWJsZSBhcyBhIEMjIFNvdXJjZSBHZW5lcmF0b3IgdGhhdCB1c2VzIHRoZSBbUmVmaXR0ZXIuQ29yZV0oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL3RyZWUvbWFpbi9zcmMvUmVmaXR0ZXIuQ29yZSkgbGlicmFyeSBmb3IgZ2VuZXJhdGluZyBhIFJFU1QgQVBJIENsaWVudCB1c2luZyB0aGUgW1JlZml0XShodHRwczovL2dpdGh1Yi5jb20vcmVhY3RpdmV1aS9yZWZpdCkgbGlicmFyeS4gUmVmaXR0ZXIgY2FuIGdlbmVyYXRlIHRoZSBSZWZpdCBpbnRlcmZhY2UgZnJvbSBPcGVuQVBJIHNwZWNpZmljYXRpb25zLiBSZWZpdHRlciBjb3VsZCBmb3JtYXQgdGhlIGdlbmVyYXRlZCBSZWZpdCBpbnRlcmZhY2UgdG8gYmUgbWFuYWdlZCBieSBbQXBpenJdKGh0dHBzOi8vd3d3LmFwaXpyLm5ldCkgYW5kIGdlbmVyYXRlIHNvbWUgcmVnaXN0cmF0aW9uIGhlbHBlcnMgdG9vLgoKVGhlIFJlZml0dGVyIHNvdXJjZSBnZW5lcmF0b3IgaXMgYSBiaXQgdW50cmFkaXRpb25hbCBpbiBhIHNlbnNlIHRoYXQgaXQgY3JlYXRlcyBhIGZvbGRlciBjYWxsZWQgYEdlbmVyYXRlZGAgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgdGhlIGAucmVmaXR0ZXJgIGZpbGUgYW5kIGdlbmVyYXRlcyBmaWxlcyB0byBkaXNrIHVuZGVyIHRoZSBgR2VuZXJhdGVkYCBmb2xkZXIgKGNhbiBiZSBjaGFuZ2VkIHdpdGggYC0tb3V0cHV0Rm9sZGVyYCkuIFRoZSBzb3VyY2UgZ2VuZXJhdG9yIG91dHB1dCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHByb2plY3QgYW5kIGNvbW1pdHRlZCB0byBzb3VyY2UgY29udHJvbC4gVGhpcyBpcyBkb25lIGJlY2F1c2UgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIHRyaWdnZXIgdGhlIFJlZml0IHNvdXJjZSBnZW5lcmF0b3IgdG8gcGlja3VwIHRoZSBSZWZpdHRlciBnZW5lcmF0ZWQgY29kZQoKKioqKFRyYW5zbGF0aW9uOiBJIGNvdWxkbid0IGZvciB0aGUgbGlmZSBvZiBtZSBmaWd1cmUgaG93IHRvIGdldCB0aGF0IHRvIHdvcmssIHNvcnJ5KSoqKgoKIyMjIEluc3RhbGxhdGlvbgoKVGhlIHNvdXJjZSBnZW5lcmF0b3IgaXMgZGlzdHJpYnV0ZWQgYXMgYSBOdUdldCBwYWNrYWdlIGFuZCBzaG91bGQgYmUgaW5zdGFsbGVkIHRvIHRoZSBwcm9qZWN0IHRoYXQgd2lsbCBjb250YWluIHRoZSBnZW5lcmF0ZWQgY29kZQoKYGBgc2hlbGwKZG90bmV0IGFkZCBwYWNrYWdlIFJlZml0dGVyLlNvdXJjZUdlbmVyYXRvcgpgYGAKCiMjIyBVc2FnZQoKVGhpcyBzb3VyY2UgZ2VuZXJhdG9yIGdlbmVyYXRlcyBjb2RlIGJhc2VkIG9uIGFueSBgLnJlZml0dGVyYCBmaWxlIGluY2x1ZGVkIHRvIHRoZSBwcm9qZWN0IGFzIGBBZGRpdGlvbmFsRmlsZXNgLgoKVGhlIGdlbmVyYXRvciBjYW4gYXV0b21hdGljYWxseSBkZXRlY3QgYWxsIGAucmVmaXR0ZXJgIGZpbGVzIGluc2lkZSB0aGUgcHJvamVjdCB0aGF0IHJlZmVyZW5jZWQgdGhlIGBSZWZpdHRlci5Tb3VyY2VHZW5lcmF0b3JgIHBhY2thZ2UgYW5kIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jbHVkZSB0aGVtIG1hbnVhbGx5IGFzIGBBZGRpdGlvbmFsRmlsZXNgCgojIyMgLlJlZml0dGVyIEZpbGUgZm9ybWF0CgpUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgYC5yZWZpdHRlcmAgZmlsZQoKYGBganMKewogICJvcGVuQXBpUGF0aCI6ICIvcGF0aC90by95b3VyL29wZW5BUEkiLCAvLyBSZXF1aXJlZAogICJuYW1lc3BhY2UiOiAiT3JnLlN5c3RlbS5TZXJ2aWNlLkFwaS5HZW5lcmF0ZWRDb2RlIiwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9R2VuZXJhdGVkQ29kZQogICJjb250cmFjdHNOYW1lc3BhY2UiOiAiT3JnLlN5c3RlbS5TZXJ2aWNlLkFwaS5HZW5lcmF0ZWRDb2RlLkNvbnRyYWN0cyIsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PUdlbmVyYXRlZENvZGUKICAibmFtaW5nIjogewogICAgInVzZU9wZW5BcGlUaXRsZSI6IGZhbHNlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD10cnVlCiAgICAiaW50ZXJmYWNlTmFtZSI6ICJNeUFwaUNsaWVudCIgLy8gT3B0aW9uYWwuIERlZmF1bHQ9QXBpQ2xpZW50CiAgfSwKICAiZ2VuZXJhdGVDb250cmFjdHMiOiB0cnVlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD10cnVlCiAgImdlbmVyYXRlQ2xpZW50cyI6IHRydWUsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PXRydWUKICAiZ2VuZXJhdGVYbWxEb2NDb2RlQ29tbWVudHMiOiB0cnVlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD10cnVlCiAgImdlbmVyYXRlU3RhdHVzQ29kZUNvbW1lbnRzIjogdHJ1ZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9dHJ1ZQogICJhZGRBdXRvR2VuZXJhdGVkSGVhZGVyIjogdHJ1ZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9dHJ1ZQogICJhZGRBY2NlcHRIZWFkZXJzIjogdHJ1ZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9dHJ1ZQogICJyZXR1cm5JQXBpUmVzcG9uc2UiOiBmYWxzZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9ZmFsc2UKICAicmVzcG9uc2VUeXBlT3ZlcnJpZGUiOiB7IC8vIE9wdGlvbmFsLiBEZWZhdWx0PXt9CiAgICAiRmlsZV9VcGxvYWQiOiAiSUFwaVJlc3BvbnNlIiwKICAgICJGaWxlX0Rvd25sb2FkIjogIlN5c3RlbS5OZXQuSHR0cC5IdHRwQ29udGVudCIKICB9LAogICJnZW5lcmF0ZU9wZXJhdGlvbkhlYWRlcnMiOiB0cnVlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD10cnVlCiAgInR5cGVBY2Nlc3NpYmlsaXR5IjogIlB1YmxpYyIsIC8vIE9wdGlvbmFsLiBWYWx1ZXM9UHVibGljfEludGVybmFsLiBEZWZhdWx0PVB1YmxpYwogICJ1c2VDYW5jZWxsYXRpb25Ub2tlbnMiOiBmYWxzZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9ZmFsc2UKICAidXNlSXNvRGF0ZUZvcm1hdCI6IGZhbHNlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD1mYWxzZQogICJtdWx0aXBsZUludGVyZmFjZXMiOiAiQnlFbmRwb2ludCIsIC8vIE9wdGlvbmFsLiBNYXkgYmUgb25lIG9mICJCeUVuZHBvaW50IiBvciAiQnlUYWciCiAgImdlbmVyYXRlRGVwcmVjYXRlZE9wZXJhdGlvbnMiOiBmYWxzZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9dHJ1ZQogICJvcGVyYXRpb25OYW1lVGVtcGxhdGUiOiAie29wZXJhdGlvbk5hbWV9QXN5bmMiLCAvLyBPcHRpb25hbC4gTXVzdCBjb250YWluIHtvcGVyYXRpb25OYW1lfSB3aGVuIG11bHRpcGxlSW50ZXJmYWNlcyAhPSBCeUVuZHBvaW50CiAgIm9wdGlvbmFsUGFyYW1ldGVycyI6IGZhbHNlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD1mYWxzZQogICJvdXRwdXRGb2xkZXIiOiAiLi4vQ3VzdG9tT3V0cHV0IiAvLyBPcHRpb25hbC4gRGVmYXVsdD0uL0dlbmVyYXRlZAogICJvdXRwdXRGaWxlbmFtZSI6ICJSZWZpdEludGVyZmFjZS5jcyIsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PU91dHB1dC5jcyBmb3IgQ0xJIHRvb2wKICAiY29udHJhY3RzT3V0cHV0Rm9sZGVyIjogIi4uL0NvbnRyYWN0cyIsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PU5VTEwKICAiZ2VuZXJhdGVNdWx0aXBsZUZpbGVzIjogZmFsc2UsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PWZhbHNlCiAgImFkZGl0aW9uYWxOYW1lc3BhY2VzIjogWyAvLyBPcHRpb25hbAogICAgIk5hbWVzcGFjZTEiLAogICAgIk5hbWVzcGFjZTIiCiAgXSwKICAiaW5jbHVkZVRhZ3MiOiBbIC8vIE9wdGlvbmFsLiBPcGVuQVBJIFRhZyB0byBpbmNsdWRlIHdoZW4gZ2VuZXJhdGluZyBjb2RlCiAgICAiUGV0IiwKICAgICJTdG9yZSIsCiAgICAiVXNlciIKICBdLAogICJpbmNsdWRlUGF0aE1hdGNoZXMiOiBbIC8vIE9wdGlvbmFsLiBPbmx5IGluY2x1ZGUgUGF0aHMgdGhhdCBtYXRjaCB0aGUgcHJvdmlkZWQgcmVndWxhciBleHByZXNzaW9uCiAgICAiXi9wZXQvLioiLAogICAgIl4vc3RvcmUvLioiCiAgXSwKICAidHJpbVVudXNlZFNjaGVtYSI6IGZhbHNlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD1mYWxzZQogICJrZWVwU2NoZW1hUGF0dGVybnMiOiBbIC8vIE9wdGlvbmFsLiBGb3JjZSB0byBrZWVwIG1hdGNoaW5nIHNjaGVtYSwgdXNlcyByZWd1bGFyIGV4cHJlc3Npb25zLiBVc2UgdG9nZXRoZXIgd2l0aCB0cmltVW51c2VkU2NoZW1hPXRydWUKICAgICJeTW9kZWwkIiwKICAgICJeUGVyc29uLisiCiAgXSwKICAiZ2VuZXJhdGVEZWZhdWx0QWRkaXRpb25hbFByb3BlcnRpZXMiOiB0cnVlLCAvLyBPcHRpb25hbC4gZGVmYXVsdD10cnVlCiAgIm9wZXJhdGlvbk5hbWVHZW5lcmF0b3IiOiAiRGVmYXVsdCIsIC8vIE9wdGlvbmFsLiBNYXkgYmUgb25lIG9mIERlZmF1bHQsIE11bHRpcGxlQ2xpZW50c0Zyb21PcGVyYXRpb25JZCwgTXVsdGlwbGVDbGllbnRzRnJvbVBhdGhTZWdtZW50cywgTXVsdGlwbGVDbGllbnRzRnJvbUZpcnN0VGFnQW5kT3BlcmF0aW9uSWQsIE11bHRpcGxlQ2xpZW50c0Zyb21GaXJzdFRhZ0FuZE9wZXJhdGlvbk5hbWUsIE11bHRpcGxlQ2xpZW50c0Zyb21GaXJzdFRhZ0FuZFBhdGhTZWdtZW50cywgU2luZ2xlQ2xpZW50RnJvbU9wZXJhdGlvbklkLCBTaW5nbGVDbGllbnRGcm9tUGF0aFNlZ21lbnRzCiAgImltbXV0YWJsZVJlY29yZHMiOiBmYWxzZSwKICAidXNlRHluYW1pY1F1ZXJ5c3RyaW5nUGFyYW1ldGVycyI6IHRydWUsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PWZhbHNlCiAgInVzZVBvbHltb3JwaGljU2VyaWFsaXphdGlvbiI6IHRydWUsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PWZhbHNlCiAgImdlbmVyYXRlRGlzcG9zYWJsZUNsaWVudHMiOiB0cnVlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD1mYWxzZQogICJkZXBlbmRlbmN5SW5qZWN0aW9uU2V0dGluZ3MiOiB7IC8vIE9wdGlvbmFsCiAgICAiYmFzZVVybCI6ICJodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92MyIsIC8vIE9wdGlvbmFsLiBMZWF2ZSB0aGlzIGJsYW5rIHRvIHNldCB0aGUgYmFzZSBhZGRyZXNzIG1hbnVhbGx5CiAgICAiaHR0cE1lc3NhZ2VIYW5kbGVycyI6IFsgLy8gT3B0aW9uYWwKICAgICAgICAiQXV0aG9yaXphdGlvbk1lc3NhZ2VIYW5kbGVyIiwKICAgICAgICAiVGVsZW1ldHJ5TWVzc2FnZUhhbmRsZXIiCiAgICBdLAogICAgInVzZVBvbGx5IjogdHJ1ZSwgLy8gREVQUkVDQVRFRCAtIFVzZSAidHJhbnNpZW50RXJyb3JIYW5kbGVyIjogIk5vbmV8UG9sbHl8SHR0cFJlc2lsaWVuY2UiIGluc3RlYWQKICAgICJ0cmFuc2llbnRFcnJvckhhbmRsZXIiOiAiSHR0cFJlc2lsaWVuY2UiLCAvLyBPcHRpb25hbC4gU2V0IHRoaXMgdG8gY29uZmlndXJlIHRyYW5zaWVudCBlcnJvciBoYW5kbGluZyB3aXRoIGEgcmV0cnkgcG9saWN5IHRoYXQgdXNlcyBhIGppdHRlcmVkIGJhY2tvZmYuIE1heSBiZSBvbmUgb2YgTm9uZSwgUG9sbHksIEh0dHBSZXNpbGllbmNlCiAgICAibWF4UmV0cnlDb3VudCI6IDMsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PTYKICAgICJmaXJzdEJhY2tvZmZSZXRyeUluU2Vjb25kcyI6IDAuNSAvLyBPcHRpb25hbC4gRGVmYXVsdD0xLjAKICB9LAogICJhcGl6clNldHRpbmdzIjogeyAvLyBPcHRpb25hbAogICAgIndpdGhSZXF1ZXN0T3B0aW9ucyI6IHRydWUsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PXRydWUKICAgICJ3aXRoUmVnaXN0cmF0aW9uSGVscGVyIjogdHJ1ZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9ZmFsc2UKICAgICJ3aXRoQ2FjaGVQcm92aWRlciI6ICJJbk1lbW9yeSIsIC8vIE9wdGlvbmFsLiBWYWx1ZXM9Tm9uZXxBa2F2YWNoZXxNb25rZXlDYWNoZXxJbk1lbW9yeXxEaXN0cmlidXRlZEFzU3RyaW5nfERpc3RyaWJ1dGVkQXNCeXRlQXJyYXkuIERlZmF1bHQ9Tm9uZQogICAgIndpdGhQcmlvcml0eSI6IHRydWUsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PWZhbHNlCiAgICAid2l0aE1lZGlhdGlvbiI6IHRydWUsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PWZhbHNlCiAgICAid2l0aE9wdGlvbmFsTWVkaWF0aW9uIjogdHJ1ZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9ZmFsc2UKICAgICJ3aXRoTWFwcGluZ1Byb3ZpZGVyIjogIkF1dG9NYXBwZXIiLCAvLyBPcHRpb25hbC4gVmFsdWVzPU5vbmV8QXV0b01hcHBlcnxNYXBzdGVyLiBEZWZhdWx0PU5vbmUKICAgICJ3aXRoRmlsZVRyYW5zZmVyIjogdHJ1ZSAvLyBPcHRpb25hbC4gRGVmYXVsdD1mYWxzZQogIH0sCiAgImNvZGVHZW5lcmF0b3JTZXR0aW5ncyI6IHsgLy8gT3B0aW9uYWwuIERlZmF1bHQgc2V0dGluZ3MgYXJlIHRoZSB2YWx1ZXMgc2V0IGluIHRoaXMgZXhhbXBsZQogICAgInJlcXVpcmVkUHJvcGVydGllc011c3RCZURlZmluZWQiOiB0cnVlLAogICAgImdlbmVyYXRlRGF0YUFubm90YXRpb25zIjogdHJ1ZSwKICAgICJhbnlUeXBlIjogIm9iamVjdCIsCiAgICAiZGF0ZVR5cGUiOiAiU3lzdGVtLkRhdGVUaW1lT2Zmc2V0IiwKICAgICJkYXRlVGltZVR5cGUiOiAiU3lzdGVtLkRhdGVUaW1lT2Zmc2V0IiwKICAgICJ0aW1lVHlwZSI6ICJTeXN0ZW0uVGltZVNwYW4iLAogICAgInRpbWVTcGFuVHlwZSI6ICJTeXN0ZW0uVGltZVNwYW4iLAogICAgImFycmF5VHlwZSI6ICJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JQ29sbGVjdGlvbiIsCiAgICAiZGljdGlvbmFyeVR5cGUiOiAiU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSURpY3Rpb25hcnkiLAogICAgImFycmF5SW5zdGFuY2VUeXBlIjogIlN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbC5Db2xsZWN0aW9uIiwKICAgICJkaWN0aW9uYXJ5SW5zdGFuY2VUeXBlIjogIlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnkiLAogICAgImFycmF5QmFzZVR5cGUiOiAiU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb24iLAogICAgImRpY3Rpb25hcnlCYXNlVHlwZSI6ICJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5IiwKICAgICJwcm9wZXJ0eVNldHRlckFjY2Vzc01vZGlmaWVyIjogIiIsCiAgICAiZ2VuZXJhdGVJbW11dGFibGVBcnJheVByb3BlcnRpZXMiOiBmYWxzZSwKICAgICJnZW5lcmF0ZUltbXV0YWJsZURpY3Rpb25hcnlQcm9wZXJ0aWVzIjogZmFsc2UsCiAgICAiaGFuZGxlUmVmZXJlbmNlcyI6IGZhbHNlLAogICAgImpzb25TZXJpYWxpemVyU2V0dGluZ3NUcmFuc2Zvcm1hdGlvbk1ldGhvZCI6IG51bGwsCiAgICAiZ2VuZXJhdGVKc29uTWV0aG9kcyI6IGZhbHNlLAogICAgImVuZm9yY2VGbGFnRW51bXMiOiBmYWxzZSwKICAgICJpbmxpbmVOYW1lZERpY3Rpb25hcmllcyI6IGZhbHNlLAogICAgImlubGluZU5hbWVkVHVwbGVzIjogdHJ1ZSwKICAgICJpbmxpbmVOYW1lZEFycmF5cyI6IGZhbHNlLAogICAgImdlbmVyYXRlT3B0aW9uYWxQcm9wZXJ0aWVzQXNOdWxsYWJsZSI6IGZhbHNlLAogICAgImdlbmVyYXRlTnVsbGFibGVSZWZlcmVuY2VUeXBlcyI6IGZhbHNlLAogICAgImdlbmVyYXRlTmF0aXZlUmVjb3JkcyI6IGZhbHNlLAogICAgImdlbmVyYXRlRGVmYXVsdFZhbHVlcyI6IHRydWUsCiAgICAiaW5saW5lTmFtZWRBbnkiOiBmYWxzZSwKICAgICJkYXRlRm9ybWF0IjogInl5eXktTU0tZGQiLAogICAgImV4Y2x1ZGVkVHlwZU5hbWVzIjogWwogICAgICAiRXhjbHVkZWRUeXBlRm9vIiwKICAgICAgIkV4Y2x1ZGVkVHlwZUJhciIKICAgIF0KICB9Cn0KYGBgCgotIGBvcGVuQXBpUGF0aGAgLSBwb2ludHMgdG8gdGhlIE9wZW5BUEkgU3BlY2lmaWNhdGlvbnMgZmlsZS4gVGhpcyBjYW4gYmUgdGhlIHBhdGggdG8gYSBmaWxlIHN0b3JlZCBvbiBkaXNrLCByZWxhdGl2ZSB0byB0aGUgYC5yZWZpdHRlcmAgZmlsZS4gVGhpcyBjYW4gYWxzbyBiZSBhIFVSTCB0byBhIHJlbW90ZSBmaWxlIHRoYXQgd2lsbCBiZSBkb3dubG9hZGVkIG92ZXIgSFRUUC9IVFRQUwotIGBuYW1lc3BhY2VgIC0gdGhlIG5hbWVzcGFjZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gSWYgbm90IHNwZWNpZmllZCwgdGhpcyBkZWZhdWx0cyB0byBgR2VuZXJhdGVkQ29kZWAKLSBgbmFtaW5nLnVzZU9wZW5BcGlUaXRsZWAgLSBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBPcGVuQXBpIHRpdGxlIHNob3VsZCBiZSB1c2VkLiBEZWZhdWx0IGlzIGB0cnVlYAotIGBuYW1pbmcuaW50ZXJmYWNlTmFtZWAgLSB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZS4gVGhlIGdlbmVyYXRlZCBjb2RlIHdpbGwgYXV0b21hdGljYWxseSBwcmVmaXggdGhpcyB3aXRoIGBJYCBzbyBpZiB0aGlzIHNldCB0byBgTXlBcGlDbGllbnRgIHRoZW4gdGhlIGdlbmVyYXRlZCBpbnRlcmZhY2UgaXMgY2FsbGVkIGBJTXlBcGlDbGllbnRgLiBEZWZhdWx0IGlzIGBBcGlDbGllbnRgCi0gYGdlbmVyYXRlQ29udHJhY3RzYCAtIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgY29udHJhY3RzIHNob3VsZCBiZSBnZW5lcmF0ZWQuIEEgdXNlIGNhc2UgZm9yIHRoaXMgaXMgc2V2ZXJhbCBBUEkgY2xpZW50cyB1c2UgdGhlIHNhbWUgY29udHJhY3RzLiBEZWZhdWx0IGlzIGB0cnVlYAotIGBnZW5lcmF0ZUNsaWVudHNgOiAgLSBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGNsaWVudHMgc2hvdWxkIGJlIGdlbmVyYXRlZC4gQSB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0byBzZXBlcmF0ZSBjbGllbnRzIGFuZCBjb250cmFjdHMgaW4gdHdvIGdlbmVyYXRpb24KLSBgZ2VuZXJhdGVYbWxEb2NDb2RlQ29tbWVudHNgIC0gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBYTUwgZG9jIGNvbW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQuIERlZmF1bHQgaXMgYHRydWVgCi0gYGdlbmVyYXRlU3RhdHVzQ29kZUNvbW1lbnRzYCAtIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFhNTCBkb2NzIGZvciBgQXBpRXhjZXB0aW9uYCBhbmQgYElBcGlSZXNwb25zZWAgY29udGFpbiBkZXRhaWxlZCBkZXNjcmlwdGlvbnMgZm9yIGV2ZXJ5IGRvY3VtZW50ZWQgc3RhdHVzIGNvZGUuIERlZmF1bHQgaXMgYHRydWVgCi0gYGFkZEF1dG9HZW5lcmF0ZWRIZWFkZXJgIC0gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBYTUwgZG9jIGNvbW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQuIERlZmF1bHQgaXMgYHRydWVgCi0gYGFkZEFjY2VwdEhlYWRlcnNgIC0gIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gYWRkIGFjY2VwdCBoZWFkZXJzIFtIZWFkZXJzKCJBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24iKV0uIERlZmF1bHQgaXMgYHRydWVgCi0gYHJldHVybklBcGlSZXNwb25zZWAgLSBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHJldHVybiBgSUFwaVJlc3BvbnNlPFQ+YCBvYmplY3RzLiBEZWZhdWx0IGlzIGBmYWxzZWAKLSBgcmVzcG9uc2VUeXBlT3ZlcnJpZGVgIC0gYSBkaWN0aW9uYXJ5IHdpdGggb3BlcmF0aW9uIGlkcyAoYXMgc3BlY2lmaWVkIGluIHRoZSBPcGVuQVBJIGRvY3VtZW50KSBhbmQgYSBwYXJ0aWN1bGFyIHJldHVybiB0eXBlIHRvIHVzZS4gVGhlIHR5cGVzIGFyZSB3cmFwcGVkIGluIGEgdGFzaywgYnV0IG90aGVyd2lzZSB1bm1vZGlmaWVkIChzbyBtYWtlIHN1cmUgdG8gc3BlY2lmeSBvciBpbXBvcnQgdGhlaXIgbmFtZXNwYWNlcykuIERlZmF1bHQgaXMgYHt9YAotIGBnZW5lcmF0ZU9wZXJhdGlvbkhlYWRlcnNgIC0gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byB1c2Ugb3BlcmF0aW9uIGhlYWRlcnMgaW4gdGhlIGdlbmVyYXRlZCBtZXRob2RzLiBEZWZhdWx0IGlzIGB0cnVlYAotIGB0eXBlQWNjZXNzaWJpbGl0eWAgLSB0aGUgZ2VuZXJhdGVkIHR5cGUgYWNjZXNzaWJpbGl0eS4gUG9zc2libGUgdmFsdWVzIGFyZSBgUHVibGljYCBhbmQgYEludGVybmFsYC4gRGVmYXVsdCBpcyBgUHVibGljYAotIGB1c2VDYW5jZWxsYXRpb25Ub2tlbnNgIC0gVXNlIGNhbmNlbGxhdGlvbiB0b2tlbnMgaW4gdGhlIGdlbmVyYXRlZCBtZXRob2RzLiBEZWZhdWx0IGlzIGBmYWxzZWAKLSBgdXNlSXNvRGF0ZUZvcm1hdGAgLSBTZXQgdG8gYHRydWVgIHRvIGV4cGxpY2l0bHkgZm9ybWF0IGRhdGUgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgaW4gSVNPIDg2MDEgc3RhbmRhcmQgZGF0ZSBmb3JtYXQgdXNpbmcgZGVsaW1pdGVycyAoZm9yIGV4YW1wbGU6IDIwMjMtMDYtMTUpLiBEZWZhdWx0IGlzIGBmYWxzZWAKLSBgbXVsdGlwbGVJbnRlcmZhY2VzYCAtIFNldCB0byBgQnlFbmRwb2ludGAgdG8gZ2VuZXJhdGUgYW4gaW50ZXJmYWNlIGZvciBlYWNoIGVuZHBvaW50LCBvciBgQnlUYWdgIHRvIGdyb3VwIEVuZHBvaW50cyBieSB0aGVpciBUYWcgKGxpa2UgU3dhZ2dlclVJIGdyb3VwcyB0aGVtKS4KLSBgb3V0cHV0Rm9sZGVyYCAtIGEgc3RyaW5nIGRlc2NyaWJpbmcgYSByZWxhdGl2ZSBwYXRoIHRvIGEgZGVzaXJlZCBvdXRwdXQgZm9sZGVyLiBEZWZhdWx0IGlzIGAuL0dlbmVyYXRlZGAKLSBgb3V0cHV0RmlsZW5hbWVgIC0gT3V0cHV0IGZpbGVuYW1lLiBEZWZhdWx0IGlzIGBPdXRwdXQuY3NgIHdoZW4gdXNlZCBmcm9tIHRoZSBDTEkgdG9vbCwgb3RoZXJ3aXNlIGl0cyB0aGUgLnJlZml0dGVyIGZpbGVuYW1lLiBTbyBgUGV0c3RvcmUucmVmaXR0ZXJgIGJlY29tZXMgYFBldHN0b3JlLmNzYC4KLSBgYWRkaXRpb25hbE5hbWVzcGFjZXNgIC0gQSBjb2xsZWN0aW9uIG9mIGFkZGl0aW9uYWwgbmFtZXNwYWNlcyB0byBpbmNsdWRlIGluIHRoZSBnZW5lcmF0ZWQgZmlsZS4gQSB1c2UgY2FzZSBmb3IgdGhpcyBpcyB3aGVuIHlvdSB3YW50IHRvIHJldXNlIGNvbnRyYWN0cyBmcm9tIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0aGFuIHRoZSBnZW5lcmF0ZWQgY29kZS4gRGVmYXVsdCBpcyBlbXB0eQotIGBpbmNsdWRlVGFnc2AgLSBBIGNvbGxlY3Rpb24gb2YgdGFncyB0byB1c2UgYSBmaWx0ZXIgZm9yIGluY2x1ZGluZyBlbmRwb2ludHMgdGhhdCBjb250YWluIHRoaXMgdGFnLgotIGBpbmNsdWRlUGF0aE1hdGNoZXNgIC0gQSBjb2xsZWN0aW9uIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdXNlZCB0byBmaWx0ZXIgcGF0aHMuCi0gYGdlbmVyYXRlRGVwcmVjYXRlZE9wZXJhdGlvbnNgIC0gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBkZXByZWNhdGVkIG9wZXJhdGlvbnMgc2hvdWxkIGJlIGdlbmVyYXRlZCBvciBza2lwcGVkLiBEZWZhdWx0IGlzIGB0cnVlYAotIGBvcGVyYXRpb25OYW1lVGVtcGxhdGVgIC0gR2VuZXJhdGUgb3BlcmF0aW9uIG5hbWVzIHVzaW5nIHBhdHRlcm4uIFRoaXMgbXVzdCBjb250YWluIHRoZSBzdHJpbmcge29wZXJhdGlvbk5hbWV9LiBBbiBleGFtcGxlIHVzYWdlIG9mIHRoaXMgY291bGQgYmUgYHtvcGVyYXRpb25OYW1lfUFzeW5jYCB0byBzdWZmaXggYWxsIG1ldGhvZCBuYW1lcyB3aXRoIEFzeW5jCi0gYG9wdGlvbmFsUGFyYW1ldGVyc2AgLSBHZW5lcmF0ZSBub24tcmVxdWlyZWQgcGFyYW1ldGVycyBhcyBudWxsYWJsZSBvcHRpb25hbCBwYXJhbWV0ZXJzCi0gYHRyaW1VbnVzZWRTY2hlbWFgIC0gUmVtb3ZlcyB1bnJlZmVyZW5jZWQgY29tcG9uZW50cyBzY2hlbWEgdG8ga2VlcCB0aGUgZ2VuZXJhdGVkIG91dHB1dCB0byBhIG1pbmltdW0KLSBga2VlcFNjaGVtYVBhdHRlcm5zYDogQSBjb2xsZWN0aW9uIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gZm9yY2UgdG8ga2VlcCBtYXRjaGluZyBzY2hlbWEuIFRoaXMgaXMgdXNlZCB0b2dldGhlciB3aXRoIGB0cmltVW51c2VkU2NoZW1hYAotIGBnZW5lcmF0ZURlZmF1bHRBZGRpdGlvbmFsUHJvcGVydGllc2A6IFNldCB0byBgZmFsc2VgIHRvIHNraXAgZGVmYXVsdCBhZGRpdGlvbmFsIHByb3BlcnRpZXMuIERlZmF1bHQgaXMgYHRydWVgCi0gYG9wZXJhdGlvbk5hbWVHZW5lcmF0b3JgOiBUaGUgTlN3YWcgYElPcGVyYXRpb25OYW1lR2VuZXJhdG9yYCBpbXBsZW1lbnRhdGlvbiB0byB1c2UuIFNlZSBodHRwczovL3JlZml0dGVyLmdpdGh1Yi5pby9hcGkvUmVmaXR0ZXIuQ29yZS5PcGVyYXRpb25OYW1lR2VuZXJhdG9yVHlwZXMuaHRtbAotIGBpbW11dGFibGVSZWNvcmRzYDogU2V0IHRvIGB0cnVlYCB0byBnZW5lcmF0ZSBjb250cmFjdHMgYXMgaW1tdXRhYmxlIHJlY29yZHMgaW5zdGVhZCBvZiBjbGFzc2VzLiBEZWZhdWx0IGlzIGBmYWxzZWAKLSBgdXNlRHluYW1pY1F1ZXJ5c3RyaW5nUGFyYW1ldGVyc2A6IFNldCB0byBgdHJ1ZWAgdG8gd3JhcCBtdWx0aXBsZSBxdWVyeSBwYXJhbWV0ZXJzIGludG8gYSBzaW5nbGUgY29tcGxleCBvbmUuIERlZmF1bHQgaXMgYGZhbHNlYCAobm8gd3JhcHBpbmcpLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0aXZldWkvcmVmaXQ/dGFiPXJlYWRtZS1vdi1maWxlI2R5bmFtaWMtcXVlcnlzdHJpbmctcGFyYW1ldGVycyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSBgZGVwZW5kZW5jeUluamVjdGlvblNldHRpbmdzYCAtIFNldHRpbmcgdGhpcyB3aWxsIGdlbmVyYXRlZCBleHRlbnNpb24gbWV0aG9kcyB0byBgSVNlcnZpY2VDb2xsZWN0aW9uYCBmb3IgY29uZmlndXJpbmcgUmVmaXQgY2xpZW50cwogIC0gYGJhc2VVcmxgIC0gVXNlZCBhcyB0aGUgSHR0cENsaWVudCBiYXNlIGFkZHJlc3MuIExlYXZlIHRoaXMgYmxhbmsgdG8gbWFudWFsbHkgc2V0IHRoZSBiYXNlIFVSTAogIC0gYGh0dHBNZXNzYWdlSGFuZGxlcnNgIC0gQSBjb2xsZWN0aW9uIG9mIGBIdHRwTWVzc2FnZUhhbmRsZXJgIHRoYXQgaXMgYWRkZWQgdG8gdGhlIEh0dHBDbGllbnQgcGlwZWxpbmUKICAtIGB1c2VQb2xseWAgLSBTZXQgdGhpcyB0byBgdHJ1ZWAgdG8gY29uZmlndXJlIHRoZSBIdHRwQ2xpZW50IHRvIHVzZSBQb2xseSB1c2luZyBhIHJldHJ5IHBvbGljeSB3aXRoIGEgaml0dGVyZWQgYmFja29mZi4gIFRoaXMgaXMgKipERVBSRUNBVEVEKiosIHVzZSBgdHJhbnNpZW50RXJyb3JIYW5kbGVyYCBpbnN0ZWFkCiAgLSBgdHJhbnNpZW50RXJyb3JIYW5kbGVyYDogU2V0IHRoaXMgdG8gY29uZmlndXJlIHRyYW5zaWVudCBlcnJvciBoYW5kbGluZyB3aXRoIGEgcmV0cnkgcG9saWN5IHRoYXQgdXNlcyBhIGppdHRlcmVkIGJhY2tvZmYuIFNlZSBodHRwczovL3JlZml0dGVyLmdpdGh1Yi5pby9hcGkvUmVmaXR0ZXIuQ29yZS5UcmFuc2llbnRFcnJvckhhbmRsZXIuaHRtbAogIC0gYGZpcnN0QmFja29mZlJldHJ5SW5TZWNvbmRzYCAtIFRoaXMgaXMgdGhlIGR1cmF0aW9uIG9mIHRoZSBpbml0aWFsIHJldHJ5IGJhY2tvZmYuIERlZmF1bHQgaXMgMSBzZWNvbmQKLSBgYXBpenJTZXR0aW5nc2AgLSBTZXR0aW5nIHRoaXMgd2lsbCBmb3JtYXQgUmVmaXQgaW50ZXJmYWNlIHRvIGJlIG1hbmFnZWQgYnkgQXBpenIuIFNlZSBodHRwczovL3d3dy5hcGl6ci5uZXQgZm9yIG1vcmUgaW5mb3JtYXRpb24KICAtIGB3aXRoUmVxdWVzdE9wdGlvbnNgIC0gVGVsbHMgaWYgdGhlIFJlZml0IGludGVyZmFjZSBtZXRob2RzIHNob3VsZCBoYXZlIGEgZmluYWwgSUFwaXpyUmVxdWVzdE9wdGlvbnMgb3B0aW9ucyBwYXJhbWV0ZXIKICAtIGB3aXRoUmVnaXN0cmF0aW9uSGVscGVyYCAtIFRlbGxzIGlmIFJlZml0dGVyIHNob3VsZCBnZW5lcmF0ZSBBcGl6ciByZWdpc3RyYXRpb24gaGVscGVycyAoZXh0ZW5kZWQgd2l0aCBkZXBlbmRlbmN5SW5qZWN0aW9uU2V0dGluZ3Mgc2V0LCBvdGhlcndpc2Ugc3RhdGljKQogIC0gYHdpdGhDYWNoZVByb3ZpZGVyYCAtIFNldCB0aGUgY2FjaGUgcHJvdmlkZXIgdG8gYmUgdXNlZAogIC0gYHdpdGhQcmlvcml0eWAgLSBUZWxscyBpZiBBcGl6ciBzaG91bGQgaGFuZGxlIHJlcXVlc3QgcHJpb3JpdHkKICAtIGB3aXRoTWVkaWF0aW9uYCAtIFRlbGxzIGlmIEFwaXpyIHNob3VsZCBoYW5kbGUgcmVxdWVzdCBtZWRpYXRpb24gKGV4dGVuZGVkIG9ubHkpCiAgLSBgd2l0aE9wdGlvbmFsTWVkaWF0aW9uYCAtIFRlbGxzIGlmIEFwaXpyIHNob3VsZCBoYW5kbGUgb3B0aW9uYWwgcmVxdWVzdCBtZWRpYXRpb24gKGV4dGVuZGVkIG9ubHkpCiAgLSBgd2l0aE1hcHBpbmdQcm92aWRlcmAgLSBTZXQgdGhlIG1hcHBpbmcgcHJvdmlkZXIgdG8gYmUgdXNlZAogIC0gYHdpdGhGaWxlVHJhbnNmZXJgIC0gVGVsbHMgaWYgQXBpenIgc2hvdWxkIGhhbmRsZSBmaWxlIHRyYW5zZmVyCi0gYGNvZGVHZW5lcmF0b3JTZXR0aW5nc2AgLSBTZXR0aW5nIHRoaXMgYWxsb3dzIGN1c3RvbWl6YXRpb24gb2YgdGhlIE5Td2FnIGdlbmVyYXRlZCB0eXBlcyBhbmQgY29udHJhY3RzCiAgLSBgcmVxdWlyZWRQcm9wZXJ0aWVzTXVzdEJlRGVmaW5lZGAgLSBEZWZhdWx0IGlzIHRydWUsCiAgLSBgZ2VuZXJhdGVEYXRhQW5ub3RhdGlvbnNgIC0gRGVmYXVsdCBpcyB0cnVlLAogIC0gYGFueVR5cGVgIC0gRGVmYXVsdCBpcyBgb2JqZWN0YCwKICAtIGBkYXRlVHlwZWAgLSBEZWZhdWx0IGlzIGBTeXN0ZW0uRGF0ZVRpbWVPZmZzZXRgLAogIC0gYGRhdGVUaW1lVHlwZWAgLSBEZWZhdWx0IGlzIGBTeXN0ZW0uRGF0ZVRpbWVPZmZzZXRgLAogIC0gYHRpbWVUeXBlYCAtIERlZmF1bHQgaXMgYFN5c3RlbS5UaW1lU3BhbmAsCiAgLSBgdGltZVNwYW5UeXBlYCAtIERlZmF1bHQgaXMgYFN5c3RlbS5UaW1lU3BhbmAsCiAgLSBgYXJyYXlUeXBlYCAtIERlZmF1bHQgaXMgYFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklDb2xsZWN0aW9uYCwKICAtIGBkaWN0aW9uYXJ5VHlwZWAgLSBEZWZhdWx0IGlzIGBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRGljdGlvbmFyeWAsCiAgLSBgYXJyYXlJbnN0YW5jZVR5cGVgIC0gRGVmYXVsdCBpcyBgU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsLkNvbGxlY3Rpb25gLAogIC0gYGRpY3Rpb25hcnlJbnN0YW5jZVR5cGVgIC0gRGVmYXVsdCBpcyBgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAsCiAgLSBgYXJyYXlCYXNlVHlwZWAgLSBEZWZhdWx0IGlzIGBTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWwuQ29sbGVjdGlvbmAsCiAgLSBgZGljdGlvbmFyeUJhc2VUeXBlYCAtIERlZmF1bHQgaXMgYFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkRpY3Rpb25hcnlgLAogIC0gYHByb3BlcnR5U2V0dGVyQWNjZXNzTW9kaWZpZXJgIC0gRGVmYXVsdCBpcyBgYCwKICAtIGBnZW5lcmF0ZUltbXV0YWJsZUFycmF5UHJvcGVydGllc2AgLSBEZWZhdWx0IGlzIGZhbHNlLAogIC0gYGdlbmVyYXRlSW1tdXRhYmxlRGljdGlvbmFyeVByb3BlcnRpZXNgIC0gRGVmYXVsdCBpcyBmYWxzZSwKICAtIGBoYW5kbGVSZWZlcmVuY2VzYCAtIERlZmF1bHQgaXMgZmFsc2UsCiAgLSBganNvblNlcmlhbGl6ZXJTZXR0aW5nc1RyYW5zZm9ybWF0aW9uTWV0aG9kYCAtIERlZmF1bHQgaXMgbnVsbCwKICAtIGBnZW5lcmF0ZUpzb25NZXRob2RzYCAtIERlZmF1bHQgaXMgZmFsc2UsCiAgLSBgZW5mb3JjZUZsYWdFbnVtc2AgLSBEZWZhdWx0IGlzIGZhbHNlLAogIC0gYGlubGluZU5hbWVkRGljdGlvbmFyaWVzYCAtIERlZmF1bHQgaXMgZmFsc2UsCiAgLSBgaW5saW5lTmFtZWRUdXBsZXNgIC0gRGVmYXVsdCBpcyB0cnVlLAogIC0gYGlubGluZU5hbWVkQXJyYXlzYCAtIERlZmF1bHQgaXMgZmFsc2UsCiAgLSBgZ2VuZXJhdGVPcHRpb25hbFByb3BlcnRpZXNBc051bGxhYmxlYCAtIERlZmF1bHQgaXMgZmFsc2UsCiAgLSBgZ2VuZXJhdGVOdWxsYWJsZVJlZmVyZW5jZVR5cGVzYCAtIERlZmF1bHQgaXMgZmFsc2UsCiAgLSBgZ2VuZXJhdGVOYXRpdmVSZWNvcmRzYCAtIERlZmF1bHQgaXMgZmFsc2UKICAtIGBnZW5lcmF0ZURlZmF1bHRWYWx1ZXNgIC0gRGVmYXVsdCBpcyB0cnVlCiAgLSBgaW5saW5lTmFtZWRBbnlgIC0gRGVmYXVsdCBpcyBmYWxzZQogIC0gYGRhdGVGb3JtYXRgIC0gRGVmYXVsdCBpcyBgeXl5eS1NTS1kZGAKICAtIGBleGNsdWRlZFR5cGVOYW1lc2AgLSBEZWZhdWx0IGlzIGVtcHR5CgojIyBNU0J1aWxkCgpBIGNvbW1vbiBzY2VuYXJpbyBmb3IgZ2VuZXJhdGluZyBjb2RlIGZyb20gT3BlbkFQSSBzcGVjaWZpY2F0aW9ucyBpcyB0byBkbyBpdCBhdCBidWlsZCB0aW1lLiBUaGlzIGNhbiBiZSBhY2hpZXZlZCB1c2luZyBNU0J1aWxkIHRhc2tzLiBBbiBleGFtcGxlIG9mIHN1Y2ggYW4gYXBwcm9hY2ggd291bGQgYmUgdG8gaW5jbHVkZSBhIGAucmVmaXR0ZXJgIGZpbGUgaW4gdGhlIHByb2plY3RzIGRpcmVjdG9yeSBhbmQgZXhlY3V0ZSB0aGUgUmVmaXR0ZXIgQ0xJIGZyb20gcHJlLWJ1aWxkIGV2ZW50cwoKYGBgeG1sCjxUYXJnZXQgTmFtZT0iUmVmaXR0ZXIiIEFmdGVyVGFyZ2V0cz0iUHJlQnVpbGRFdmVudCI+CiAgICA8RXhlYyBXb3JraW5nRGlyZWN0b3J5PSIkKFByb2plY3REaXIpIiBDb21tYW5kPSJyZWZpdHRlciAtLXNldHRpbmdzLWZpbGUgLnJlZml0dGVyIC0tc2tpcC12YWxpZGF0aW9uIiAvPgo8L1RhcmdldD4KYGBgCgpUaGUgc25pcHBldCBhYm92ZSByZXF1aXJlcyB0aGF0IFJlZml0dGVyIGlzIGluc3RhbGxlZCBvbiB0aGUgbWFjaGluZSBhcyBhIGdsb2JhbGx5IGF2YWlsYWJsZSBkb3RuZXQgdG9vbC4gVGhpcyBtaWdodCBub3QgYmUgdGhlIGNhc2UgaWYgeW91J3JlIHJ1bm5pbmcgb24gYSBidWlsZCBhZ2VudCBmcm9tIGEgQ0kvQ0QgZW52aXJvbm1lbnQuIEluIHRoaXMgY2FzZSB5b3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIFJlZml0dGVyIGFzIGEgbG9jYWwgdG9vbCB1c2luZyBhIG1hbmlmZXN0IGZpbGUsIGFzIGRlc2NyaWJlZCBpbiBbdGhpcyB0dXRvcmlhbF0oaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL2RvdG5ldC9jb3JlL3Rvb2xzL2xvY2FsLXRvb2xzLWhvdy10by11c2U/V1QubWNfaWQ9RFQtTVZQLTUwMDQ4MjIpCgpgYGB4bWwKPFRhcmdldCBOYW1lPSJSZWZpdHRlciIgQWZ0ZXJUYXJnZXRzPSJQcmVCdWlsZEV2ZW50Ij4KICAgIDxFeGVjIFdvcmtpbmdEaXJlY3Rvcnk9IiQoUHJvamVjdERpcikiIENvbW1hbmQ9ImRvdG5ldCB0b29sIHJlc3RvcmUiIC8+CiAgICA8RXhlYyBXb3JraW5nRGlyZWN0b3J5PSIkKFByb2plY3REaXIpIiBDb21tYW5kPSJyZWZpdHRlciAtLXNldHRpbmdzLWZpbGUgLnJlZml0dGVyIC0tc2tpcC12YWxpZGF0aW9uIiAvPgo8L1RhcmdldD4KYGBgCgpUaGUgYGRvdG5ldCBidWlsZGAgcHJvY2VzcyBkb2VzIHdpbGwgcHJvYmFibHkgbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBwYWNrYWdlIHJlcG9zaXRvcnkgaW4gd2hpY2ggdG8gZG93bmxvYWQgUmVmaXR0ZXIgZnJvbSwgdGhpcyBpcyBhdCBsZWFzdCB0aGUgY2FzZSB3aXRoIEF6dXJlIFBpcGVsaW5lcyBhbmQgQXp1cmUgQXJ0aWZhY3RzLiBUbyB3b3JrYXJvdW5kIHRoaXMsIHlvdSBjYW4gcHJvdmlkZSBhIHNlcGFyYXRlIGBudWdldC5jb25maWdgIHRoYXQgb25seSB1c2VzIGBudWdldC5vcmdgIGFzIGEgYDxwYWNrYWdlU291cmNlPmAuCgpTb21ldGhpbmcgbGlrZSB0aGlzOgoKYGBgeG1sCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cjxjb25maWd1cmF0aW9uPgogIDxwYWNrYWdlU291cmNlcz4KICAgIDxjbGVhciAvPgogICAgPGFkZCBrZXk9Ik51R2V0IiB2YWx1ZT0iaHR0cHM6Ly9hcGkubnVnZXQub3JnL3YzL2luZGV4Lmpzb24iIC8+CiAgPC9wYWNrYWdlU291cmNlcz4KPC9jb25maWd1cmF0aW9uPgpgYGAKCllvdSBtaWdodCB3YW50IHRvIHBsYWNlIHRoZSBgbnVnZXQuY29uZmlnYCBmaWxlIGluIGFub3RoZXIgZm9sZGVyIHRvIGF2b2lkIHVzaW5nIGl0IHRvIGJ1aWxkIHRoZSAuTkVUIHByb2plY3QsIHRoZW4geW91IGNhbiBzcGVjaWZ5IHRoaXMgd2hlbiBleGVjdXRpbmcgYGRvdG5ldCB0b29sIHJlc3RvcmVgCgpgYGB4bWwKPFRhcmdldCBOYW1lPSJSZWZpdHRlciIgQWZ0ZXJUYXJnZXRzPSJQcmVCdWlsZEV2ZW50Ij4KICAgIDxFeGVjIFdvcmtpbmdEaXJlY3Rvcnk9IiQoUHJvamVjdERpcikiIENvbW1hbmQ9ImRvdG5ldCB0b29sIHJlc3RvcmUgLS1jb25maWdmaWxlIHJlZml0dGVyL251Z2V0LmNvbmZpZyIgLz4KICAgIDxFeGVjIFdvcmtpbmdEaXJlY3Rvcnk9IiQoUHJvamVjdERpcikiIENvbW1hbmQ9InJlZml0dGVyIC0tc2V0dGluZ3MtZmlsZSAucmVmaXR0ZXIgLS1za2lwLXZhbGlkYXRpb24iIC8+CjwvVGFyZ2V0PgpgYGAKCkluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgYG51Z2V0LmNvbmZpZ2AgZmlsZSBpcyBwbGFjZWQgdW5kZXIgdGhlIGByZWZpdHRlcmAgZm9sZGVyLgoKIyMjIFJlZml0dGVyLk1TQnVpbGQgcGFja2FnZQoKUmVmaXR0ZXIgc2hpcHMgd2l0aCBhbiBNU0J1aWxkIGN1c3RvbSB0YXNrIHRoYXQgaXMgZGlzdHJpYnV0ZWQgYXMgYSBOdUdldCBwYWNrYWdlIGFuZCBpbmNsdWRlcyB0aGUgUmVmaXR0ZXIgQ0xJIGJpbmFyeS4gVGhpcyB3aWxsIHNpbXBsaWZ5IGdlbmVyYXRpbmcgY29kZSBmcm9tIE9wZW5BUEkgc3BlY2lmaWNhdGlvbnMgYXQgYnVpbGQgdGltZS4KClRvIHVzZSB0aGUgcGFja2FnZSwgaW5zdGFsbCBgUmVmaXR0ZXIuTVNCdWlsZGAKCmBgYHhtbAo8SXRlbUdyb3VwPgogICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iUmVmaXR0ZXIuTVNCdWlsZCIgVmVyc2lvbj0iMS41LjAiIC8+CjwvSXRlbUdyb3VwPgpgYGAKClRoZSBNU0J1aWxkIHBhY2thZ2UgaW5jbHVkZXMgYSBjdXN0b20gYC50YXJnZXRgIGZpbGUgd2hpY2ggZXhlY3V0ZXMgdGhlIGBSZWZpdHRlckdlbmVyYXRlVGFza2AgY3VzdG9tIHRhc2sgYW5kIGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoaXM6CgpgYGB4bWwKPFRhcmdldCBOYW1lPSJSZWZpdHRlciIgQmVmb3JlVGFyZ2V0cz0iQmVmb3JlQnVpbGQiPgogICAgPFJlZml0dGVyR2VuZXJhdGVUYXNrIFByb2plY3RGaWxlRGlyZWN0b3J5PSIkKE1TQnVpbGRQcm9qZWN0RGlyZWN0b3J5KSIKICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlTG9nZ2luZz0iJChSZWZpdHRlck5vTG9nZ2luZykiLz4KICAgIDxJdGVtR3JvdXA+CiAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iKiovKi5jcyIgLz4KICAgIDwvSXRlbUdyb3VwPgogIDwvVGFyZ2V0PgpgYGAKClRoZSBgUmVmaXR0ZXJHZW5lcmF0ZVRhc2tgIHRhc2sgd2lsbCBzY2FuIHRoZSBwcm9qZWN0IGZvbGRlciBmb3IgYC5yZWZpdHRlcmAgZmlsZXMgYW5kIGV4ZWN1dGVzIHRoZW0gYWxsLiBCeSBkZWZhdWx0LCB0ZWxlbWV0cnkgY29sbGVjdGlvbiBpcyBlbmFibGVkLCBhbmQgdG8gb3B0LW91dCBvZiBpdCB5b3UgbXVzdCBzcGVjaWZ5IGA8UmVmaXR0ZXJOb0xvZ2dpbmc+dHJ1ZTwvUmVmaXR0ZXJOb0xvZ2dpbmc+YCBpbiB0aGUgYC5jc3Byb2pgIGA8UHJvcGVydHlHcm91cD5gCgoKIyBVc2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUKCkhlcmUncyBhbiBleGFtcGxlIGdlbmVyYXRlZCBvdXRwdXQgZnJvbSB0aGUgW1N3YWdnZXIgUGV0c3RvcmUgZXhhbXBsZV0oaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pbykgdXNpbmcgdGhlIGRlZmF1bHQgc2V0dGluZ3MKCioqQ0xJIFRvb2wqKgoKYGBgYmFzaAokIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbmFtZXNwYWNlICJZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZSIKYGBgCgoqKlNvdXJjZSBHZW5lcmF0b3IgKioqLnJlZml0dGVyKioqIGZpbGUqKgoKYGBganNvbgp7CiAgIm9wZW5BcGlQYXRoIjogIi4vb3BlbmFwaS5qc29uIiwKICAibmFtZXNwYWNlIjogIllvdXIuTmFtZXNwYWNlLk9mLkNob2ljZS5HZW5lcmF0ZWRDb2RlIgp9CmBgYAoKKipPdXRwdXQgKFNuaXBwZXQpKioKCkZ1bGwgb3V0cHV0IGlzIGF2YWlsYWJsZSBbaGVyZV0oZG9jcy9EZWZhdWx0T3V0cHV0LmNzKQoKCmBgYGNzCnVzaW5nIFJlZml0Owp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLlRleHQuSnNvbi5TZXJpYWxpemF0aW9uOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwoKbmFtZXNwYWNlIFlvdXIuTmFtZXNwYWNlLk9mLkNob2ljZS5HZW5lcmF0ZWRDb2RlCnsKICAgIFtTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlKCJSZWZpdHRlciIsICIxLjAuMC4wIildCiAgICBwdWJsaWMgcGFydGlhbCBpbnRlcmZhY2UgSVN3YWdnZXJQZXRzdG9yZQogICAgewogICAgICAgIC8vLyA8c3VtbWFyeT5VcGRhdGUgYW4gZXhpc3RpbmcgcGV0PC9zdW1tYXJ5PgogICAgICAgIC8vLyA8cmVtYXJrcz5VcGRhdGUgYW4gZXhpc3RpbmcgcGV0IGJ5IElkPC9yZW1hcmtzPgogICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYm9keSI+VXBkYXRlIGFuIGV4aXN0ZW50IHBldCBpbiB0aGUgc3RvcmU8L3BhcmFtPgogICAgICAgIC8vLyA8cmV0dXJucz5TdWNjZXNzZnVsIG9wZXJhdGlvbjwvcmV0dXJucz4KICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcGlFeGNlcHRpb24iPgogICAgICAgIC8vLyBUaHJvd24gd2hlbiB0aGUgcmVxdWVzdCByZXR1cm5zIGEgbm9uLXN1Y2Nlc3Mgc3RhdHVzIGNvZGU6CiAgICAgICAgLy8vIDxsaXN0IHR5cGU9InRhYmxlIj4KICAgICAgICAvLy8gPGxpc3RoZWFkZXI+CiAgICAgICAgLy8vIDx0ZXJtPlN0YXR1czwvdGVybT4KICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KICAgICAgICAvLy8gPC9saXN0aGVhZGVyPgogICAgICAgIC8vLyA8aXRlbT4KICAgICAgICAvLy8gPHRlcm0+NDAwPC90ZXJtPgogICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+SW52YWxpZCBJRCBzdXBwbGllZDwvZGVzY3JpcHRpb24+CiAgICAgICAgLy8vIDwvaXRlbT4KICAgICAgICAvLy8gPGl0ZW0+CiAgICAgICAgLy8vIDx0ZXJtPjQwNDwvdGVybT4KICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPlBldCBub3QgZm91bmQ8L2Rlc2NyaXB0aW9uPgogICAgICAgIC8vLyA8L2l0ZW0+CiAgICAgICAgLy8vIDxpdGVtPgogICAgICAgIC8vLyA8dGVybT40MDU8L3Rlcm0+CiAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj5WYWxpZGF0aW9uIGV4Y2VwdGlvbjwvZGVzY3JpcHRpb24+CiAgICAgICAgLy8vIDwvaXRlbT4KICAgICAgICAvLy8gPC9saXN0PgogICAgICAgIC8vLyA8L2V4Y2VwdGlvbj4KICAgICAgICBbSGVhZGVycygiQWNjZXB0OiBhcHBsaWNhdGlvbi94bWwsIGFwcGxpY2F0aW9uL2pzb24iKV0KICAgICAgICBbUHV0KCIvcGV0IildCiAgICAgICAgVGFzazxQZXQ+IFVwZGF0ZVBldChbQm9keV0gUGV0IGJvZHkpOwoKICAgICAgICAuLi4KICAgIH0KfQpgYGAKCkhlcmUncyBhbiBleGFtcGxlIGdlbmVyYXRlZCBvdXRwdXQgZnJvbSB0aGUgW1N3YWdnZXIgUGV0c3RvcmUgZXhhbXBsZV0oaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pbykgY29uZmlndXJlZCB0byB3cmFwIHRoZSByZXR1cm4gdHlwZSBpbiBgSUFwaVJlc3BvbnNlPFQ+YAoKKipDTEkgVG9vbCoqCgpgYGBiYXNoCiQgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1uYW1lc3BhY2UgIllvdXIuTmFtZXNwYWNlLk9mLkNob2ljZS5HZW5lcmF0ZWRDb2RlIiAtLXVzZS1hcGktcmVzcG9uc2UKYGBgCgoqKlNvdXJjZSBHZW5lcmF0b3IgKioqLnJlZml0dGVyKioqIGZpbGUqKgoKYGBganNvbgp7CiAgIm9wZW5BcGlQYXRoIjogIi4vb3BlbmFwaS5qc29uIiwKICAibmFtZXNwYWNlIjogIllvdXIuTmFtZXNwYWNlLk9mLkNob2ljZS5HZW5lcmF0ZWRDb2RlIiwKICAicmV0dXJuSUFwaVJlc3BvbnNlIjogdHJ1ZQp9CmBgYAoKKipPdXRwdXQgKFNuaXBwZXQpKioKCkZ1bGwgb3V0cHV0IGlzIGF2YWlsYWJsZSBbaGVyZV0oZG9jcy9JQXBpUmVzcG9uc2VPdXRwdXQuY3MpCgpgYGBjcwp1c2luZyBSZWZpdDsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CnVzaW5nIFN5c3RlbS5UZXh0Lkpzb24uU2VyaWFsaXphdGlvbjsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKCm5hbWVzcGFjZSBZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZQp7CiAgICBbU3lzdGVtLkNvZGVEb20uQ29tcGlsZXIuR2VuZXJhdGVkQ29kZSgiUmVmaXR0ZXIiLCAiMS4wLjAuMCIpXQogICAgcHVibGljIHBhcnRpYWwgaW50ZXJmYWNlIElTd2FnZ2VyUGV0c3RvcmUKICAgIHsKICAgICAgICAvLy8gPHN1bW1hcnk+VXBkYXRlIGFuIGV4aXN0aW5nIHBldDwvc3VtbWFyeT4KICAgICAgICAvLy8gPHJlbWFya3M+VXBkYXRlIGFuIGV4aXN0aW5nIHBldCBieSBJZDwvcmVtYXJrcz4KICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJvZHkiPlVwZGF0ZSBhbiBleGlzdGVudCBwZXQgaW4gdGhlIHN0b3JlPC9wYXJhbT4KICAgICAgICAvLy8gPHJldHVybnM+CiAgICAgICAgLy8vIEEgPHNlZSBjcmVmPSJUYXNrIi8+IHJlcHJlc2VudGluZyB0aGUgPHNlZSBjcmVmPSJJQXBpUmVzcG9uc2UiLz4gaW5zdGFuY2UgY29udGFpbmluZyB0aGUgcmVzdWx0OgogICAgICAgIC8vLyA8bGlzdCB0eXBlPSJ0YWJsZSI+CiAgICAgICAgLy8vIDxsaXN0aGVhZGVyPgogICAgICAgIC8vLyA8dGVybT5TdGF0dXM8L3Rlcm0+CiAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+CiAgICAgICAgLy8vIDwvbGlzdGhlYWRlcj4KICAgICAgICAvLy8gPGl0ZW0+CiAgICAgICAgLy8vIDx0ZXJtPjIwMDwvdGVybT4KICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPlN1Y2Nlc3NmdWwgb3BlcmF0aW9uPC9kZXNjcmlwdGlvbj4KICAgICAgICAvLy8gPC9pdGVtPgogICAgICAgIC8vLyA8aXRlbT4KICAgICAgICAvLy8gPHRlcm0+NDAwPC90ZXJtPgogICAgICAgIC8vLyA8ZGVzY3JpcHRpb24+SW52YWxpZCBJRCBzdXBwbGllZDwvZGVzY3JpcHRpb24+CiAgICAgICAgLy8vIDwvaXRlbT4KICAgICAgICAvLy8gPGl0ZW0+CiAgICAgICAgLy8vIDx0ZXJtPjQwNDwvdGVybT4KICAgICAgICAvLy8gPGRlc2NyaXB0aW9uPlBldCBub3QgZm91bmQ8L2Rlc2NyaXB0aW9uPgogICAgICAgIC8vLyA8L2l0ZW0+CiAgICAgICAgLy8vIDxpdGVtPgogICAgICAgIC8vLyA8dGVybT40MDU8L3Rlcm0+CiAgICAgICAgLy8vIDxkZXNjcmlwdGlvbj5WYWxpZGF0aW9uIGV4Y2VwdGlvbjwvZGVzY3JpcHRpb24+CiAgICAgICAgLy8vIDwvaXRlbT4KICAgICAgICAvLy8gPC9saXN0PgogICAgICAgIC8vLyA8L3JldHVybnM+CiAgICAgICAgW0hlYWRlcnMoIkFjY2VwdDogYXBwbGljYXRpb24veG1sLCBhcHBsaWNhdGlvbi9qc29uIildCiAgICAgICAgW1B1dCgiL3BldCIpXQogICAgICAgIFRhc2s8SUFwaVJlc3BvbnNlPFBldD4+IFVwZGF0ZVBldChbQm9keV0gUGV0IGJvZHkpOwoKICAgICAgICAuLi4KICAgIH0KfQpgYGAKCkhlcmUncyBhbiBleGFtcGxlIGdlbmVyYXRlZCBvdXRwdXQgZnJvbSB0aGUgW1N3YWdnZXIgUGV0c3RvcmUgZXhhbXBsZV0oaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pbykgY29uZmlndXJlZCB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UgZm9yIGVhY2ggZW5kcG9pbnQKCioqQ0xJIFRvb2wqKgoKYGBgYmFzaAokIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbmFtZXNwYWNlICJZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZSIgLS1tdWx0aXBsZS1pbnRlcmZhY2VzIEJ5RW5kcG9pbnQKYGBgCgoqKlNvdXJjZSBHZW5lcmF0b3IgKioqLnJlZml0dGVyKioqIGZpbGUqKgoKYGBganNvbgp7CiAgIm9wZW5BcGlQYXRoIjogIi4vb3BlbmFwaS5qc29uIiwKICAibmFtZXNwYWNlIjogIllvdXIuTmFtZXNwYWNlLk9mLkNob2ljZS5HZW5lcmF0ZWRDb2RlIiwKICAibXVsdGlwbGVJbnRlcmZhY2VzIjogIkJ5RW5kcG9pbnQiCn0KYGBgCgoqKk91dHB1dCAoU25pcHBldCkqKgoKRnVsbCBvdXRwdXQgaXMgYXZhaWxhYmxlIFtoZXJlXShkb2NzL0lBcGlSZXNwb25zZU91dHB1dC5jcykKCmBgYGNzCi8vLyA8c3VtbWFyeT5VcGRhdGUgYW4gZXhpc3RpbmcgcGV0PC9zdW1tYXJ5PgpbU3lzdGVtLkNvZGVEb20uQ29tcGlsZXIuR2VuZXJhdGVkQ29kZSgiUmVmaXR0ZXIiLCAiMS4wLjAuMCIpXQpwdWJsaWMgcGFydGlhbCBpbnRlcmZhY2UgSVVwZGF0ZVBldEVuZHBvaW50CnsKICAgIC8vLyA8c3VtbWFyeT5VcGRhdGUgYW4gZXhpc3RpbmcgcGV0PC9zdW1tYXJ5PgogICAgLy8vIDxyZW1hcmtzPlVwZGF0ZSBhbiBleGlzdGluZyBwZXQgYnkgSWQ8L3JlbWFya3M+CiAgICAvLy8gPHBhcmFtIG5hbWU9ImJvZHkiPlVwZGF0ZSBhbiBleGlzdGVudCBwZXQgaW4gdGhlIHN0b3JlPC9wYXJhbT4KICAgIC8vLyA8cmV0dXJucz5TdWNjZXNzZnVsIG9wZXJhdGlvbjwvcmV0dXJucz4KICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFwaUV4Y2VwdGlvbiI+CiAgICAvLy8gVGhyb3duIHdoZW4gdGhlIHJlcXVlc3QgcmV0dXJucyBhIG5vbi1zdWNjZXNzIHN0YXR1cyBjb2RlOgogICAgLy8vIDxsaXN0IHR5cGU9InRhYmxlIj4KICAgIC8vLyA8bGlzdGhlYWRlcj4KICAgIC8vLyA8dGVybT5TdGF0dXM8L3Rlcm0+CiAgICAvLy8gPGRlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KICAgIC8vLyA8L2xpc3RoZWFkZXI+CiAgICAvLy8gPGl0ZW0+CiAgICAvLy8gPHRlcm0+NDAwPC90ZXJtPgogICAgLy8vIDxkZXNjcmlwdGlvbj5JbnZhbGlkIElEIHN1cHBsaWVkPC9kZXNjcmlwdGlvbj4KICAgIC8vLyA8L2l0ZW0+CiAgICAvLy8gPGl0ZW0+CiAgICAvLy8gPHRlcm0+NDA0PC90ZXJtPgogICAgLy8vIDxkZXNjcmlwdGlvbj5QZXQgbm90IGZvdW5kPC9kZXNjcmlwdGlvbj4KICAgIC8vLyA8L2l0ZW0+CiAgICAvLy8gPGl0ZW0+CiAgICAvLy8gPHRlcm0+NDA1PC90ZXJtPgogICAgLy8vIDxkZXNjcmlwdGlvbj5WYWxpZGF0aW9uIGV4Y2VwdGlvbjwvZGVzY3JpcHRpb24+CiAgICAvLy8gPC9pdGVtPgogICAgLy8vIDwvbGlzdD4KICAgIC8vLyA8L2V4Y2VwdGlvbj4KICAgIFtIZWFkZXJzKCJBY2NlcHQ6IGFwcGxpY2F0aW9uL3htbCwgYXBwbGljYXRpb24vanNvbiIpXQogICAgW1B1dCgiL3BldCIpXQogICAgVGFzazxQZXQ+IEV4ZWN1dGUoW0JvZHldIFBldCBib2R5KTsKfQpgYGAKCkhlcmUncyBhbiBleGFtcGxlIGdlbmVyYXRlZCBvdXRwdXQgZnJvbSB0aGUgW1N3YWdnZXIgUGV0c3RvcmUgZXhhbXBsZV0oaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pbykgY29uZmlndXJlZCB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2Ugd2l0aCBkeW5hbWljIHF1ZXJ5c3RyaW5nIHBhcmVtZXRlcnMKCioqQ0xJIFRvb2wqKgoKYGBgYmFzaAokIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbmFtZXNwYWNlICJZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZSIgLS11c2UtZHluYW1pYy1xdWVyeXN0cmluZy1wYXJhbWV0ZXJzCmBgYAoKKipPdXRwdXQgKFNuaXBwZXQpKioKCkZ1bGwgb3V0cHV0IGlzIGF2YWlsYWJsZSBbaGVyZV0oZG9jcy9EeW5hbWljUXVlcnlTdHJpbmdQYXJhbWV0ZXJzLmNzKQoKYGBgY3MKW1N5c3RlbS5Db2RlRG9tLkNvbXBpbGVyLkdlbmVyYXRlZENvZGUoIlJlZml0dGVyIiwgIjEuMC4wLjAiKV0KcHVibGljIHBhcnRpYWwgaW50ZXJmYWNlIElTd2FnZ2VyUGV0c3RvcmVPcGVuQVBJMzAKewogICAgLy8vIDxzdW1tYXJ5PlVwZGF0ZXMgYSBwZXQgaW4gdGhlIHN0b3JlIHdpdGggZm9ybSBkYXRhPC9zdW1tYXJ5PgogICAgLy8vIDxwYXJhbSBuYW1lPSJwZXRJZCI+SUQgb2YgcGV0IHRoYXQgbmVlZHMgdG8gYmUgdXBkYXRlZDwvcGFyYW0+CiAgICAvLy8gPHBhcmFtIG5hbWU9InF1ZXJ5UGFyYW1zIj5UaGUgZHluYW1pYyBxdWVyeXN0cmluZyBwYXJhbWV0ZXIgd3JhcHBpbmcgYWxsIG90aGVycy48L3BhcmFtPgogICAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJUYXNrIi8+IHRoYXQgY29tcGxldGVzIHdoZW4gdGhlIHJlcXVlc3QgaXMgZmluaXNoZWQuPC9yZXR1cm5zPgogICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXBpRXhjZXB0aW9uIj4KICAgIC8vLyBUaHJvd24gd2hlbiB0aGUgcmVxdWVzdCByZXR1cm5zIGEgbm9uLXN1Y2Nlc3Mgc3RhdHVzIGNvZGU6CiAgICAvLy8gPGxpc3QgdHlwZT0idGFibGUiPgogICAgLy8vIDxsaXN0aGVhZGVyPgogICAgLy8vIDx0ZXJtPlN0YXR1czwvdGVybT4KICAgIC8vLyA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgogICAgLy8vIDwvbGlzdGhlYWRlcj4KICAgIC8vLyA8aXRlbT4KICAgIC8vLyA8dGVybT40MDU8L3Rlcm0+CiAgICAvLy8gPGRlc2NyaXB0aW9uPkludmFsaWQgaW5wdXQ8L2Rlc2NyaXB0aW9uPgogICAgLy8vIDwvaXRlbT4KICAgIC8vLyA8L2xpc3Q+CiAgICAvLy8gPC9leGNlcHRpb24+CiAgICBbUG9zdCgiL3BldC97cGV0SWR9IildCiAgICBUYXNrIFVwZGF0ZVBldFdpdGhGb3JtKGxvbmcgcGV0SWQsIFtRdWVyeV0gVXBkYXRlUGV0V2l0aEZvcm1RdWVyeVBhcmFtcyBxdWVyeVBhcmFtcyk7Cn0KCnB1YmxpYyBjbGFzcyBVcGRhdGVQZXRXaXRoRm9ybVF1ZXJ5UGFyYW1zCnsKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBOYW1lIG9mIHBldCB0aGF0IG5lZWRzIHRvIGJlIHVwZGF0ZWQKICAgIC8vLyA8L3N1bW1hcnk+CiAgICBbUXVlcnldCiAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQoKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBTdGF0dXMgb2YgcGV0IHRoYXQgbmVlZHMgdG8gYmUgdXBkYXRlZAogICAgLy8vIDwvc3VtbWFyeT4KICAgIFtRdWVyeV0KICAgIHB1YmxpYyBzdHJpbmcgU3RhdHVzIHsgZ2V0OyBzZXQ7IH0KfQpgYGAKCiMjIFJlc3RTZXJ2aWNlCgpIZXJlJ3MgYW4gZXhhbXBsZSB1c2FnZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUgYWJvdmUKCmBgYGNzCnVzaW5nIFJlZml0Owp1c2luZyBTeXN0ZW07CnVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CgpuYW1lc3BhY2UgWW91ci5OYW1lc3BhY2UuT2YuQ2hvaWNlLkdlbmVyYXRlZENvZGU7CgppbnRlcm5hbCBjbGFzcyBQcm9ncmFtCnsKICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgTWFpbihzdHJpbmdbXSBhcmdzKQogICAgewogICAgICAgIHZhciBjbGllbnQgPSBSZXN0U2VydmljZS5Gb3I8SVN3YWdnZXJQZXRzdG9yZT4oImh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8vYXBpL3YzIik7CiAgICAgICAgdmFyIHBldCA9IGF3YWl0IGNsaWVudC5HZXRQZXRCeUlkKDEpOwoKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiIyMgVXNpbmcgVGFzazxUPiBhcyByZXR1cm4gdHlwZSAjIyIpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQiTmFtZToge3BldC5OYW1lfSIpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQiQ2F0ZWdvcnk6IHtwZXQuQ2F0ZWdvcnkuTmFtZX0iKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkIlN0YXR1czoge3BldC5TdGF0dXN9Iik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKCiAgICAgICAgdmFyIGNsaWVudDIgPSBSZXN0U2VydmljZS5Gb3I8V2l0aEFwaVJlc3BvbnNlLklTd2FnZ2VyUGV0c3RvcmU+KCJodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92MyIpOwogICAgICAgIHZhciByZXNwb25zZSA9IGF3YWl0IGNsaWVudDIuR2V0UGV0QnlJZCgyKTsKCiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiMjIFVzaW5nIFRhc2s8SUFwaVJlc3BvbnNlPFQ+PiBhcyByZXR1cm4gdHlwZSAjIyIpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQiSFRUUCBTdGF0dXMgQ29kZToge3Jlc3BvbnNlLlN0YXR1c0NvZGV9Iik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJCJOYW1lOiB7cmVzcG9uc2UuQ29udGVudC5OYW1lfSIpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQiQ2F0ZWdvcnk6IHtyZXNwb25zZS5Db250ZW50LkNhdGVnb3J5Lk5hbWV9Iik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJCJTdGF0dXM6IHtyZXNwb25zZS5Db250ZW50LlN0YXR1c30iKTsKICAgIH0KfQpgYGAKClRoZSBgUmVzdFNlcnZpY2VgIGNsYXNzIGdlbmVyYXRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBgSVN3YWdnZXJQZXRzdG9yZWAgdGhhdCB1c2VzIGBIdHRwQ2xpZW50YCB0byBtYWtlIGl0cyBjYWxscy4KClRoZSBjb2RlIGFib3ZlIHdoZW4gcnVuIHdpbGwgb3V0cHV0IHNvbWV0aGluZyBsaWtlIHRoaXM6CgpgYGAKIyMgVXNpbmcgVGFzazxUPiBhcyByZXR1cm4gdHlwZSAjIwpOYW1lOiBHYXRpdG90b3RvdG8KQ2F0ZWdvcnk6IENoYXVjaXRvClN0YXR1czogU29sZAoKIyMgVXNpbmcgVGFzazxJQXBpUmVzcG9uc2U8VD4+IGFzIHJldHVybiB0eXBlICMjCkhUVFAgU3RhdHVzIENvZGU6IE9LCk5hbWU6IEdhdGl0b3RvdG90bwpDYXRlZ29yeTogQ2hhdWNpdG8KU3RhdHVzOiBTb2xkCmBgYAoKIyMgQVNQLk5FVCBDb3JlIGFuZCBIdHRwQ2xpZW50RmFjdG9yeQoKSGVyZSdzIGFuIGV4YW1wbGUgTWluaW1hbCBBUEkgd2l0aCB0aGUgW2BSZWZpdC5IdHRwQ2xpZW50RmFjdG9yeWBdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9SZWZpdC5IdHRwQ2xpZW50RmFjdG9yeSkgbGlicmFyeToKCmBgYGNzCnVzaW5nIFJlZml0Owp1c2luZyBZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZTsKCnZhciBidWlsZGVyID0gV2ViQXBwbGljYXRpb24uQ3JlYXRlQnVpbGRlcihhcmdzKTsKYnVpbGRlci5TZXJ2aWNlcy5BZGRFbmRwb2ludHNBcGlFeHBsb3JlcigpOwpidWlsZGVyLlNlcnZpY2VzLkFkZFN3YWdnZXJHZW4oKTsKYnVpbGRlci5TZXJ2aWNlcwogICAgLkFkZFJlZml0Q2xpZW50PElTd2FnZ2VyUGV0c3RvcmU+KCkKICAgIC5Db25maWd1cmVIdHRwQ2xpZW50KGMgPT4gYy5CYXNlQWRkcmVzcyA9IG5ldyBVcmkoImh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8vYXBpL3YzIikpOwoKdmFyIGFwcCA9IGJ1aWxkZXIuQnVpbGQoKTsKYXBwLk1hcEdldCgKICAgICAgICAiL3BldC97aWQ6bG9uZ30iLAogICAgICAgIGFzeW5jIChJU3dhZ2dlclBldHN0b3JlIHBldHN0b3JlLCBsb25nIGlkKSA9PgogICAgICAgIHsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRzLk9rKGF3YWl0IHBldHN0b3JlLkdldFBldEJ5SWQoaWQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoUmVmaXQuQXBpRXhjZXB0aW9uIGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRzLlN0YXR1c0NvZGUoKGludCllLlN0YXR1c0NvZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSkKICAgIC5XaXRoTmFtZSgiR2V0UGV0QnlJZCIpCiAgICAuV2l0aE9wZW5BcGkoKTsKCmFwcC5Vc2VIdHRwc1JlZGlyZWN0aW9uKCk7CmFwcC5Vc2VTd2FnZ2VyVUkoKTsKYXBwLlVzZVN3YWdnZXIoKTsKYXBwLlJ1bigpOwpgYGAKCgouTkVUIENvcmUgc3VwcG9ydHMgcmVnaXN0ZXJpbmcgdGhlIGdlbmVyYXRlZCBgSVN3YWdnZXJQZXRzdG9yZWAgaW50ZXJmYWNlIHZpYSBgSHR0cENsaWVudEZhY3RvcnlgCgpUaGUgZm9sbG93aW5nIHJlcXVlc3QgdG8gdGhlIEFQSSBhYm92ZQpgYGBzaGVsbAokIGN1cmwgLVggJ0dFVCcgJ2h0dHBzOi8vbG9jYWxob3N0OjUwMDEvcGV0LzEnIC1IICdhY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24nCmBgYAoKUmV0dXJucyBhIHJlc3BvbnNlIHRoYXQgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczoKYGBganNvbgp7CiAgImlkIjogMSwKICAibmFtZSI6ICJTcGVjaWFsX2NoYXJfb3duZXJfIUAjJF4mKClgLnRlc3RpbmciLAogICJwaG90b1VybHMiOiBbCiAgICAiaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9yZXNvdXJjZXMvcGhvdG9zLzYyMzM4OTA5NS5qcGciCiAgXSwKICAidGFncyI6IFtdLAogICJzdGF0dXMiOiAiU29sZCIKfQpgYGAKCiMjIERlcGVuZGVuY3kgSW5qZWN0aW9uCgpSZWZpdHRlciBzdXBwb3J0cyBnZW5lcmF0aW5nIGJvb3RzdHJhcHBpbmcgY29kZSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBjb252ZW5pZW50bHkgY29uZmlndXJlIGFsbCBnZW5lcmF0ZWQgUmVmaXQgaW50ZXJmYWNlcyBieSBjYWxsaW5nIGEgc2luZ2xlIGV4dGVuc2lvbiBtZXRob2QgdG8gYElTZXJ2aWNlQ29sbGVjdGlvbmAuCgpUaGlzIGlzIGVuYWJsZWQgdGhyb3VnaCB0aGUgYC5yZWZpdHRlcmAgc2V0dGluZ3MgZmlsZSBsaWtlIHRoaXM6CgpgYGBqc29uCnsKICAib3BlbkFwaVBhdGgiOiAiLi4vT3BlbkFQSS92My4wL3BldHN0b3JlLmpzb24iLAogICJuYW1lc3BhY2UiOiAiUGV0c3RvcmUiLAogICJkZXBlbmRlbmN5SW5qZWN0aW9uU2V0dGluZ3MiOiB7CiAgICAiYmFzZVVybCI6ICJodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92MyIsCiAgICAiaHR0cE1lc3NhZ2VIYW5kbGVycyI6IFsgIlRlbGVtZXRyeURlbGVnYXRpbmdIYW5kbGVyIiBdLAogICAgInRyYW5zaWVudEVycm9ySGFuZGxlciI6ICJQb2xseSIsCiAgICAibWF4UmV0cnlDb3VudCI6IDMsCiAgICAiZmlyc3RCYWNrb2ZmUmV0cnlJblNlY29uZHMiOiAwLjUKICB9Cn0KYGBgCgp3aGljaCB3aWxsIGdlbmVyYXRlIGFuIGV4dGVuc2lvbiBtZXRob2QgdG8gYElTZXJ2aWNlQ29sbGVjdGlvbmAgY2FsbGVkIGBDb25maWd1cmVSZWZpdENsaWVudHMoKWAuIFRoZSBnZW5lcmF0ZWQgZXh0ZW5zaW9uIG1ldGhvZCBkZXBlbmRzIG9uIFtgUmVmaXQuSHR0cENsaWVudEZhY3RvcnlgXShodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvUmVmaXQuSHR0cENsaWVudEZhY3RvcnkpIGxpYnJhcnkgYW5kIGxvb2tzIGxpa2UgdGhpczoKCmBgYGNzCnB1YmxpYyBzdGF0aWMgSVNlcnZpY2VDb2xsZWN0aW9uIENvbmZpZ3VyZVJlZml0Q2xpZW50cygKICAgIHRoaXMgSVNlcnZpY2VDb2xsZWN0aW9uIHNlcnZpY2VzLAogICAgQWN0aW9uPElIdHRwQ2xpZW50QnVpbGRlcj4/IGJ1aWxkZXIgPSBkZWZhdWx0LAogICAgUmVmaXRTZXR0aW5ncz8gc2V0dGluZ3MgPSBkZWZhdWx0KQp7CiAgICB2YXIgY2xpZW50QnVpbGRlcklTd2FnZ2VyUGV0c3RvcmUgPSBzZXJ2aWNlcwogICAgICAgIC5BZGRSZWZpdENsaWVudDxJU3dhZ2dlclBldHN0b3JlPihzZXR0aW5ncykKICAgICAgICAuQ29uZmlndXJlSHR0cENsaWVudChjID0+IGMuQmFzZUFkZHJlc3MgPSBuZXcgVXJpKCJodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92MyIpKQogICAgICAgIC5BZGRIdHRwTWVzc2FnZUhhbmRsZXI8VGVsZW1ldHJ5RGVsZWdhdGluZ0hhbmRsZXI+KCk7CgogICAgY2xpZW50QnVpbGRlcklTd2FnZ2VyUGV0c3RvcmUKICAgICAgICAuQWRkUG9saWN5SGFuZGxlcigKICAgICAgICAgICAgSHR0cFBvbGljeUV4dGVuc2lvbnMKICAgICAgICAgICAgICAgIC5IYW5kbGVUcmFuc2llbnRIdHRwRXJyb3IoKQogICAgICAgICAgICAgICAgLldhaXRBbmRSZXRyeUFzeW5jKAogICAgICAgICAgICAgICAgICAgIEJhY2tvZmYuRGVjb3JyZWxhdGVkSml0dGVyQmFja29mZlYyKAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lU3Bhbi5Gcm9tU2Vjb25kcygwLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAzKSkpOwoKICAgIGJ1aWxkZXI/Lkludm9rZShjbGllbnRCdWlsZGVySVN3YWdnZXJQZXRzdG9yZSk7CgogICAgcmV0dXJuIHNlcnZpY2VzOwp9CmBgYAoKVGhpcyBjb21lcyBpbiBoYW5keSBlc3BlY2lhbGx5IHdoZW4gZ2VuZXJhdGluZyBtdWx0aXBsZSBpbnRlcmZhY2VzLCBieSB0YWcgb3IgZW5kcG9pbnQuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGAucmVmaXR0ZXJgIHNldHRpbmdzIGZpbGUKCmBgYGpzb24KewogICJvcGVuQXBpUGF0aCI6ICIuLi9PcGVuQVBJL3YzLjAvcGV0c3RvcmUuanNvbiIsCiAgIm5hbWVzcGFjZSI6ICJQZXRzdG9yZSIsCiAgIm11bHRpcGxlSW50ZXJmYWNlcyI6ICJCeVRhZyIsCiAgImRlcGVuZGVuY3lJbmplY3Rpb25TZXR0aW5ncyI6IHsKICAgICJiYXNlVXJsIjogImh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8vYXBpL3YzIiwKICAgICJodHRwTWVzc2FnZUhhbmRsZXJzIjogWyAiVGVsZW1ldHJ5RGVsZWdhdGluZ0hhbmRsZXIiIF0sCiAgICAidHJhbnNpZW50RXJyb3JIYW5kbGVyIjogIlBvbGx5IiwKICAgICJtYXhSZXRyeUNvdW50IjogMywKICAgICJmaXJzdEJhY2tvZmZSZXRyeUluU2Vjb25kcyI6IDAuNQogIH0KfQpgYGAKCldpbGwgZ2VuZXJhdGUgYSBzaW5nbGUgYENvbmZpZ3VyZVJlZml0Q2xpZW50cygpYCBleHRlbnNpb24gbWV0aG9kcyB0aGF0IG1heSBjb250YWluIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGNvbmZpZ3VyYXRpb24gY29kZSBmb3IgbXVsdGlwbGUgaW50ZXJmYWNlcyBsaWtlIHRoaXMKCmBgYGNzaGFycApwdWJsaWMgc3RhdGljIElTZXJ2aWNlQ29sbGVjdGlvbiBDb25maWd1cmVSZWZpdENsaWVudHMoCiAgICB0aGlzIElTZXJ2aWNlQ29sbGVjdGlvbiBzZXJ2aWNlcywKICAgIEFjdGlvbjxJSHR0cENsaWVudEJ1aWxkZXI+PyBidWlsZGVyID0gZGVmYXVsdCwKICAgIFJlZml0U2V0dGluZ3M/IHNldHRpbmdzID0gZGVmYXVsdCkKewogICAgdmFyIGNsaWVudEJ1aWxkZXJJUGV0QXBpID0gc2VydmljZXMKICAgICAgICAuQWRkUmVmaXRDbGllbnQ8SVBldEFwaT4oc2V0dGluZ3MpCiAgICAgICAgLkNvbmZpZ3VyZUh0dHBDbGllbnQoYyA9PiBjLkJhc2VBZGRyZXNzID0gbmV3IFVyaSgiaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9hcGkvdjMiKSkKICAgICAgICAuQWRkSHR0cE1lc3NhZ2VIYW5kbGVyPFRlbGVtZXRyeURlbGVnYXRpbmdIYW5kbGVyPigpOwoKICAgIGNsaWVudEJ1aWxkZXJJUGV0QXBpCiAgICAgICAgLkFkZFBvbGljeUhhbmRsZXIoCiAgICAgICAgICAgIEh0dHBQb2xpY3lFeHRlbnNpb25zCiAgICAgICAgICAgICAgICAuSGFuZGxlVHJhbnNpZW50SHR0cEVycm9yKCkKICAgICAgICAgICAgICAgIC5XYWl0QW5kUmV0cnlBc3luYygKICAgICAgICAgICAgICAgICAgICBCYWNrb2ZmLkRlY29ycmVsYXRlZEppdHRlckJhY2tvZmZWMigKICAgICAgICAgICAgICAgICAgICAgICAgVGltZVNwYW4uRnJvbVNlY29uZHMoMC41KSwKICAgICAgICAgICAgICAgICAgICAgICAgMykpKTsKCiAgICBidWlsZGVyPy5JbnZva2UoY2xpZW50QnVpbGRlcklQZXRBcGkpOwoKICAgIHZhciBjbGllbnRCdWlsZGVySVN0b3JlQXBpID0gc2VydmljZXMKICAgICAgICAuQWRkUmVmaXRDbGllbnQ8SVN0b3JlQXBpPihzZXR0aW5ncykKICAgICAgICAuQ29uZmlndXJlSHR0cENsaWVudChjID0+IGMuQmFzZUFkZHJlc3MgPSBuZXcgVXJpKCJodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92MyIpKQogICAgICAgIC5BZGRIdHRwTWVzc2FnZUhhbmRsZXI8VGVsZW1ldHJ5RGVsZWdhdGluZ0hhbmRsZXI+KCk7CgogICAgY2xpZW50QnVpbGRlcklTdG9yZUFwaQogICAgICAgIC5BZGRQb2xpY3lIYW5kbGVyKAogICAgICAgICAgICBIdHRwUG9saWN5RXh0ZW5zaW9ucwogICAgICAgICAgICAgICAgLkhhbmRsZVRyYW5zaWVudEh0dHBFcnJvcigpCiAgICAgICAgICAgICAgICAuV2FpdEFuZFJldHJ5QXN5bmMoCiAgICAgICAgICAgICAgICAgICAgQmFja29mZi5EZWNvcnJlbGF0ZWRKaXR0ZXJCYWNrb2ZmVjIoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVTcGFuLkZyb21TZWNvbmRzKDAuNSksCiAgICAgICAgICAgICAgICAgICAgICAgIDMpKSk7CgogICAgYnVpbGRlcj8uSW52b2tlKGNsaWVudEJ1aWxkZXJJU3RvcmVBcGkpOwoKICAgIHZhciBjbGllbnRCdWlsZGVySVVzZXJBcGkgPSBzZXJ2aWNlcwogICAgICAgIC5BZGRSZWZpdENsaWVudDxJVXNlckFwaT4oc2V0dGluZ3MpCiAgICAgICAgLkNvbmZpZ3VyZUh0dHBDbGllbnQoYyA9PiBjLkJhc2VBZGRyZXNzID0gbmV3IFVyaSgiaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9hcGkvdjMiKSkKICAgICAgICAuQWRkSHR0cE1lc3NhZ2VIYW5kbGVyPFRlbGVtZXRyeURlbGVnYXRpbmdIYW5kbGVyPigpOwoKICAgIGNsaWVudEJ1aWxkZXJJVXNlckFwaQogICAgICAgIC5BZGRQb2xpY3lIYW5kbGVyKAogICAgICAgICAgICBIdHRwUG9saWN5RXh0ZW5zaW9ucwogICAgICAgICAgICAgICAgLkhhbmRsZVRyYW5zaWVudEh0dHBFcnJvcigpCiAgICAgICAgICAgICAgICAuV2FpdEFuZFJldHJ5QXN5bmMoCiAgICAgICAgICAgICAgICAgICAgQmFja29mZi5EZWNvcnJlbGF0ZWRKaXR0ZXJCYWNrb2ZmVjIoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVTcGFuLkZyb21TZWNvbmRzKDAuNSksCiAgICAgICAgICAgICAgICAgICAgICAgIDMpKSk7CgogICAgYnVpbGRlcj8uSW52b2tlKGNsaWVudEJ1aWxkZXJJVXNlckFwaSk7CgogICAgcmV0dXJuIHNlcnZpY2VzOwp9CmBgYAoKUGVyc29uYWxseSwgdGhleSBJIHVzZSBSZWZpdHRlciBpcyB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UgcGVyIGVuZHBvaW50LCBzbyB3aGVuIGdlbmVyYXRpbmcgY29kZSBmb3IgYSBsYXJnZSBhbmQgY29tcGxleCBBUEksIEkgbWlnaHQgaGF2ZSBzZXZlcmFsIGludGVyZmFjZXMuCgojIyBBcGl6cgoKW0FwaXpyXShodHRwczovL3d3dy5hcGl6ci5uZXQpIGlzIGEgUmVmaXQgY2xpZW50IG1hbmFnZXIgdGhhdCBwcm92aWRlcyBhIHNldCBvZiBmZWF0dXJlcyB0byBlbmhhbmNlIHJlcXVlc3RpbmcgZXhwZXJpZW5jZSB3aXRoIHJlc2lsaWVuY2UsIGNhY2hpbmcsIHByaW9yaXR5LCBtZWRpYXRpb24sIG1hcHBpbmcsIGxvZ2dpbmcsIGF1dGhlbnRpY2F0aW9uLCBmaWxlIHRyYW5zZmVyIGNhcGFiaWxpdGllcyBhbmQgbWFueSBtb3JlLi4uCgojIyMgR2VuZXJhdGluZyB0aGUgaW50ZXJmYWNlcwoKUmVmaXR0ZXIgc3VwcG9ydHMgZ2VuZXJhdGluZyBBcGl6ciBmb3JtYXR0ZWQgUmVmaXQgaW50ZXJmYWNlcyB0aGF0IGNhbiBiZSBtYW5hZ2VkIHRoZW4gYnkgQXBpenIgKHY2KykuCgpZb3UgY2FuIGVuYWJsZSBBcGl6ciBmb3JtYXR0ZWQgUmVmaXQgaW50ZXJmYWNlIGdlbmVyYXRpb24gZWl0aGVyOgotIFdpdGggdGhlIGAtLXVzZS1hcGl6cmAgY29tbWFuZCBsaW5lIGFyZ3VtZW50Ci0gQnkgc2V0dGluZyB0aGUgYGFwaXpyU2V0dGluZ3NgIHNlY3Rpb24gaW4gdGhlIGAucmVmaXR0ZXJgIHNldHRpbmdzIGZpbGUKCk5vdGUgdGhhdCBgLS11c2UtYXBpenJgIHVzZXMgZGVmYXVsdCBBcGl6ciBzZXR0aW5ncyB3aXRoIGB3aXRoUmVxdWVzdE9wdGlvbnNgIHNldCB0byBgdHJ1ZWAgYXMgcmVjb21tZW5kZWQsIHdoaWxlIHRoZSBgLnJlZml0dGVyYCBzZXR0aW5ncyBmaWxlIGFsbG93cyB5b3UgdG8gY29uZmlndXJlIGl0IGRlZXBlci4KCkluIGJvdGggY2FzZXMsIGl0IHdpbGwgZm9ybWF0IHRoZSBnZW5lcmF0ZWQgUmVmaXQgaW50ZXJmYWNlcyB0byBiZSBBcGl6ciByZWFkeSBieToKLSBBZGRpbmcgYSBmaW5hbCBJQXBpenJSZXF1ZXN0T3B0aW9ucyBvcHRpb25zIHBhcmFtZXRlciB0byBhbGwgZ2VuZXJhdGVkIG1ldGhvZHMgKGlmIGB3aXRoUmVxdWVzdE9wdGlvbnNgIGlzIHNldCB0byBgdHJ1ZWApCi0gUHJvdmlkaW5nIGNhbmNlbGxhdGlvbiB0b2tlbnMgYnkgQXBpenIgcmVxdWVzdCBvcHRpb25zIGluc3RlYWQgb2YgYSBkZWRpY2F0ZWQgcGFyYW1ldGVyIChpZiBgd2l0aFJlcXVlc3RPcHRpb25zYCBpcyBzZXQgdG8gYHRydWVgKQotIFVzaW5nIG1ldGhvZCBvdmVybG9hZHMgaW5zdGVhZCBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzIChub3RlIHRoYXQgc2V0dGluZyBgdXNlRHluYW1pY1F1ZXJ5c3RyaW5nUGFyYW1ldGVyc2AgdG8gYHRydWVgIGltcHJvdmUgb3ZlcmxvYWRpbmcgZXhwZXJpZW5jZSkKCkZyb20gaGVyZSwgeW91J3JlIGRlZmluaXRseSBmcmVlIHRvIHVzZSB0aGUgZm9ybWF0dGVkIGludGVyZmFjZSB3aXRoIEFwaXpyIGJ5IHJlZ2lzdGVyaW5nLCBjb25maWd1cmluZyBhbmQgdXNpbmcgaXQgZm9sbG93aW5nIHRoZSBbQXBpenIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cuYXBpenIubmV0KS4gQnV0IFJlZml0dGVyIGNhbiBnbyBmdXJ0aGVyIGJ5IGdlbmVyYXRpbmcgc29tZSBoZWxwZXJzIHRvIG1ha2UgdGhlIGNvbmZpZ3VyYXRpb24gZWFzaWVyLgoKIyMjIEdlbmVyYXRpbmcgdGhlIGhlbHBlcnMKClJlZml0dGVyIHN1cHBvcnRzIGdlbmVyYXRpbmcgQXBpenIgKHY2KykgYm9vdHN0cmFwcGluZyBjb2RlIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbnZlbmllbnRseSBjb25maWd1cmUgYWxsIGdlbmVyYXRlZCBBcGl6ciBmb3JtYXR0ZWQgUmVmaXQgaW50ZXJmYWNlcyBieSBjYWxsaW5nIGEgc2luZ2xlIG1ldGhvZC4KSXQgY291bGQgYmUgZWl0aGVyIGFuIGV4dGVuc2lvbiBtZXRob2QgdG8gYElTZXJ2aWNlQ29sbGVjdGlvbmAgaWYgRGVwZW5kZW5jeUluamVjdGlvblNldHRpbmdzIGFyZSBzZXQsIG9yIGEgc3RhdGljIGJ1aWxkZXIgbWV0aG9kIGlmIG5vdC4KCiMjIyBbRXh0ZW5kZWRdKCN0YWIvdGFiaWQtZXh0ZW5kZWQpCgpUbyBlbmFibGUgQXBpenIgcmVnaXN0cmF0aW9uIGNvZGUgZ2VuZXJhdGlvbiBmb3IgYElTZXJ2aWNlQ29sbGVjdGlvbmAsIHlvdSBuZWVkIGF0IGxlYXN0IHRvIHNldCB0aGUgYHdpdGhSZWdpc3RyYXRpb25IZWxwZXJgIHByb3BlcnR5IHRvIGB0cnVlYCBhbmQgY29uZmlndXJlIHRoZSBgRGVwZW5kZW5jeUluamVjdGlvblNldHRpbmdzYCBzZWN0aW9uIGluIHRoZSBgLnJlZml0dGVyYCBzZXR0aW5ncyBmaWxlLgpUaGlzIGlzIHdoYXQgdGhlIGAucmVmaXR0ZXJgIHNldHRpbmdzIGZpbGUgbWF5IGxvb2sgbGlrZSwgZGVwZW5kaW5nIG9uIHlvdSBjb25maWd1cmF0aW9uOgoKYGBganNvbgp7CiAgIm9wZW5BcGlQYXRoIjogIi4uL09wZW5BUEkvdjMuMC9wZXRzdG9yZS5qc29uIiwKICAibmFtZXNwYWNlIjogIlBldHN0b3JlIiwKICAidXNlRHluYW1pY1F1ZXJ5c3RyaW5nUGFyYW1ldGVycyI6IHRydWUsCiAgImRlcGVuZGVuY3lJbmplY3Rpb25TZXR0aW5ncyI6IHsKICAgICJiYXNlVXJsIjogImh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8vYXBpL3YzIiwKICAgICJodHRwTWVzc2FnZUhhbmRsZXJzIjogWyAiTXlEZWxlZ2F0aW5nSGFuZGxlciIgXSwKICAgICJ0cmFuc2llbnRFcnJvckhhbmRsZXIiOiAiSHR0cFJlc2lsaWVuY2UiLAogICAgIm1heFJldHJ5Q291bnQiOiAzLAogICAgImZpcnN0QmFja29mZlJldHJ5SW5TZWNvbmRzIjogMC41CiAgfSwKICAiYXBpenJTZXR0aW5ncyI6IHsKICAgICJ3aXRoUmVxdWVzdE9wdGlvbnMiOiB0cnVlLCAvLyBSZWNvbW1lbmRlZCB0byBpbmNsdWRlIGFuIEFwaXpyIHJlcXVlc3Qgb3B0aW9ucyBwYXJhbWV0ZXIgdG8gUmVmaXQgaW50ZXJmYWNlIG1ldGhvZHMKICAgICJ3aXRoUmVnaXN0cmF0aW9uSGVscGVyIjogdHJ1ZSwgLy8gTWFuZGF0b3J5IHRvIGFjdHVhbGx5IGdlbmVyYXRlIHRoZSBBcGl6ciByZWdpc3RyYXRpb24gZXh0ZW5kZWQgbWV0aG9kCiAgICAid2l0aENhY2hlUHJvdmlkZXIiOiAiSW5NZW1vcnkiLCAvLyBPcHRpb25hbCwgZGVmYXVsdCBpcyBOb25lCiAgICAid2l0aFByaW9yaXR5IjogdHJ1ZSwgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgZmFsc2UKICAgICJ3aXRoTWVkaWF0aW9uIjogdHJ1ZSwgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgZmFsc2UKICAgICJ3aXRoT3B0aW9uYWxNZWRpYXRpb24iOiB0cnVlLCAvLyBPcHRpb25hbCwgZGVmYXVsdCBpcyBmYWxzZQogICAgIndpdGhNYXBwaW5nUHJvdmlkZXIiOiAiQXV0b01hcHBlciIsIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIE5vbmUKICAgICJ3aXRoRmlsZVRyYW5zZmVyIjogdHJ1ZSAvLyBPcHRpb25hbCwgZGVmYXVsdCBpcyBmYWxzZQogIH0KfQpgYGAKCndoaWNoIHdpbGwgZ2VuZXJhdGUgYW4gZXh0ZW5zaW9uIG1ldGhvZCB0byBgSVNlcnZpY2VDb2xsZWN0aW9uYCBjYWxsZWQgYENvbmZpZ3VyZVBldHN0b3JlQXBpQXBpenJNYW5hZ2VyKClgLiBUaGUgZ2VuZXJhdGVkIGV4dGVuc2lvbiBtZXRob2QgZGVwZW5kcyBvbiBbYEFwaXpyLkV4dGVuc2lvbnMuTWljcm9zb2Z0LkRlcGVuZGVuY3lJbmplY3Rpb25gXShodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvQXBpenIuRXh0ZW5zaW9ucy5NaWNyb3NvZnQuRGVwZW5kZW5jeUluamVjdGlvbikgbGlicmFyeSBhbmQgbG9va3MgbGlrZSB0aGlzOgoKYGBgY3MKcHVibGljIHN0YXRpYyBJU2VydmljZUNvbGxlY3Rpb24gQ29uZmlndXJlUGV0c3RvcmVBcGlBcGl6ck1hbmFnZXIoCiAgICB0aGlzIElTZXJ2aWNlQ29sbGVjdGlvbiBzZXJ2aWNlcywKICAgIEFjdGlvbjxJQXBpenJFeHRlbmRlZE1hbmFnZXJPcHRpb25zQnVpbGRlcj4/IG9wdGlvbnNCdWlsZGVyID0gbnVsbCkKewogICAgb3B0aW9uc0J1aWxkZXIgPz89IF8gPT4geyB9OyAvLyBEZWZhdWx0IGVtcHR5IG9wdGlvbnMgaWYgbnVsbAogICAgb3B0aW9uc0J1aWxkZXIgKz0gb3B0aW9ucyA9PiBvcHRpb25zCiAgICAgICAgLldpdGhCYXNlQWRkcmVzcygiaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9hcGkvdjMiLCBBcGl6ckR1cGxpY2F0ZVN0cmF0ZWd5Lklnbm9yZSkKICAgICAgICAuV2l0aERlbGVnYXRpbmdIYW5kbGVyPE15RGVsZWdhdGluZ0hhbmRsZXI+KCkKICAgICAgICAuQ29uZmlndXJlSHR0cENsaWVudEJ1aWxkZXIoYnVpbGRlciA9PiBidWlsZGVyCiAgICAgICAgICAgIC5BZGRTdGFuZGFyZFJlc2lsaWVuY2VIYW5kbGVyKGNvbmZpZyA9PgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25maWcuUmV0cnkgPSBuZXcgSHR0cFJldHJ5U3RyYXRlZ3lPcHRpb25zCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVXNlSml0dGVyID0gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBNYXhSZXRyeUF0dGVtcHRzID0gMywKICAgICAgICAgICAgICAgICAgICBEZWxheSA9IFRpbWVTcGFuLkZyb21TZWNvbmRzKDAuNSkKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pKQogICAgICAgIC5XaXRoSW5NZW1vcnlDYWNoZUhhbmRsZXIoKQogICAgICAgIC5XaXRoQXV0b01hcHBlck1hcHBpbmdIYW5kbGVyKCkKICAgICAgICAuV2l0aFByaW9yaXR5KCkKICAgICAgICAuV2l0aE9wdGlvbmFsTWVkaWF0aW9uKCkKICAgICAgICAuV2l0aEZpbGVUcmFuc2Zlck9wdGlvbmFsTWVkaWF0aW9uKCk7CgogICAgcmV0dXJuIHNlcnZpY2VzLkFkZEFwaXpyTWFuYWdlckZvcjxJUGV0c3RvcmVBcGk+KG9wdGlvbnNCdWlsZGVyKTsKfQpgYGAKClRoaXMgY29tZXMgaW4gaGFuZHkgZXNwZWNpYWxseSB3aGVuIGdlbmVyYXRpbmcgbXVsdGlwbGUgaW50ZXJmYWNlcywgYnkgdGFnIG9yIGVuZHBvaW50LiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBgLnJlZml0dGVyYCBzZXR0aW5ncyBmaWxlCgpgYGBqc29uCnsKICAib3BlbkFwaVBhdGgiOiAiLi4vT3BlbkFQSS92My4wL3BldHN0b3JlLmpzb24iLAogICJuYW1lc3BhY2UiOiAiUGV0c3RvcmUiLAogICJ1c2VEeW5hbWljUXVlcnlzdHJpbmdQYXJhbWV0ZXJzIjogdHJ1ZSwKICAibXVsdGlwbGVJbnRlcmZhY2VzIjogIkJ5VGFnIiwKICAibmFtaW5nIjogewogICAgInVzZU9wZW5BcGlUaXRsZSI6IGZhbHNlLAogICAgImludGVyZmFjZU5hbWUiOiAiUGV0c3RvcmUiCiAgfSwKICAiZGVwZW5kZW5jeUluamVjdGlvblNldHRpbmdzIjogewogICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9hcGkvdjMiLAogICAgImh0dHBNZXNzYWdlSGFuZGxlcnMiOiBbICJNeURlbGVnYXRpbmdIYW5kbGVyIiBdLAogICAgInRyYW5zaWVudEVycm9ySGFuZGxlciI6ICJIdHRwUmVzaWxpZW5jZSIsCiAgICAibWF4UmV0cnlDb3VudCI6IDMsCiAgICAiZmlyc3RCYWNrb2ZmUmV0cnlJblNlY29uZHMiOiAwLjUKICB9LAogICJhcGl6clNldHRpbmdzIjogewogICAgIndpdGhSZXF1ZXN0T3B0aW9ucyI6IHRydWUsIC8vIFJlY29tbWVuZGVkIHRvIGluY2x1ZGUgYW4gQXBpenIgcmVxdWVzdCBvcHRpb25zIHBhcmFtZXRlciB0byBSZWZpdCBpbnRlcmZhY2UgbWV0aG9kcwogICAgIndpdGhSZWdpc3RyYXRpb25IZWxwZXIiOiB0cnVlLCAvLyBNYW5kYXRvcnkgdG8gYWN0dWFsbHkgZ2VuZXJhdGUgdGhlIEFwaXpyIHJlZ2lzdHJhdGlvbiBleHRlbmRlZCBtZXRob2QKICAgICJ3aXRoQ2FjaGVQcm92aWRlciI6ICJJbk1lbW9yeSIsIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIE5vbmUKICAgICJ3aXRoUHJpb3JpdHkiOiB0cnVlLCAvLyBPcHRpb25hbCwgZGVmYXVsdCBpcyBmYWxzZQogICAgIndpdGhNZWRpYXRpb24iOiB0cnVlLCAvLyBPcHRpb25hbCwgZGVmYXVsdCBpcyBmYWxzZQogICAgIndpdGhPcHRpb25hbE1lZGlhdGlvbiI6IHRydWUsIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlCiAgICAid2l0aE1hcHBpbmdQcm92aWRlciI6ICJBdXRvTWFwcGVyIiwgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgTm9uZQogICAgIndpdGhGaWxlVHJhbnNmZXIiOiB0cnVlIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlCiAgfQp9CmBgYAoKV2lsbCBnZW5lcmF0ZSBhIHNpbmdsZSBgQ29uZmlndXJlUGV0c3RvcmVBcGl6ck1hbmFnZXJzKClgIGV4dGVuc2lvbiBtZXRob2QgdGhhdCBtYXkgY29udGFpbiBkZXBlbmRlbmN5IGluamVjdGlvbiBjb25maWd1cmF0aW9uIGNvZGUgZm9yIG11bHRpcGxlIGludGVyZmFjZXMgbGlrZSB0aGlzCgpgYGBjc2hhcnAKcHVibGljIHN0YXRpYyBJU2VydmljZUNvbGxlY3Rpb24gQ29uZmlndXJlUGV0c3RvcmVBcGl6ck1hbmFnZXJzKAogICAgdGhpcyBJU2VydmljZUNvbGxlY3Rpb24gc2VydmljZXMsCiAgICBBY3Rpb248SUFwaXpyRXh0ZW5kZWRDb21tb25PcHRpb25zQnVpbGRlcj4/IG9wdGlvbnNCdWlsZGVyID0gbnVsbCkKewogICAgb3B0aW9uc0J1aWxkZXIgPz89IF8gPT4geyB9OyAvLyBEZWZhdWx0IGVtcHR5IG9wdGlvbnMgaWYgbnVsbAogICAgb3B0aW9uc0J1aWxkZXIgKz0gb3B0aW9ucyA9PiBvcHRpb25zCiAgICAgICAgLldpdGhCYXNlQWRkcmVzcygiaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9hcGkvdjMiLCBBcGl6ckR1cGxpY2F0ZVN0cmF0ZWd5Lklnbm9yZSkKICAgICAgICAuV2l0aERlbGVnYXRpbmdIYW5kbGVyPE15RGVsZWdhdGluZ0hhbmRsZXI+KCkKICAgICAgICAuQ29uZmlndXJlSHR0cENsaWVudEJ1aWxkZXIoYnVpbGRlciA9PiBidWlsZGVyCiAgICAgICAgICAgIC5BZGRTdGFuZGFyZFJlc2lsaWVuY2VIYW5kbGVyKGNvbmZpZyA9PgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25maWcuUmV0cnkgPSBuZXcgSHR0cFJldHJ5U3RyYXRlZ3lPcHRpb25zCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVXNlSml0dGVyID0gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBNYXhSZXRyeUF0dGVtcHRzID0gMywKICAgICAgICAgICAgICAgICAgICBEZWxheSA9IFRpbWVTcGFuLkZyb21TZWNvbmRzKDAuNSkKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pKQogICAgICAgIC5XaXRoSW5NZW1vcnlDYWNoZUhhbmRsZXIoKQogICAgICAgIC5XaXRoQXV0b01hcHBlck1hcHBpbmdIYW5kbGVyKCkKICAgICAgICAuV2l0aFByaW9yaXR5KCkKICAgICAgICAuV2l0aE9wdGlvbmFsTWVkaWF0aW9uKCkKICAgICAgICAuV2l0aEZpbGVUcmFuc2Zlck9wdGlvbmFsTWVkaWF0aW9uKCk7CgogICAgcmV0dXJuIHNlcnZpY2VzLkFkZEFwaXpyKAogICAgICAgIHJlZ2lzdHJ5ID0+IHJlZ2lzdHJ5CiAgICAgICAgICAgIC5BZGRNYW5hZ2VyRm9yPElQZXRBcGk+KCkKICAgICAgICAgICAgLkFkZE1hbmFnZXJGb3I8SVN0b3JlQXBpPigpCiAgICAgICAgICAgIC5BZGRNYW5hZ2VyRm9yPElVc2VyQXBpPigpLAogICAgICAgIG9wdGlvbnNCdWlsZGVyKTsKCn0KYGBgCgpIZXJlLCBgSVBldEFwaWAsIGBJU3RvcmVBcGlgIGFuZCBgSVVzZXJBcGlgIGFyZSB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZXMgd2hpY2ggc2hhcmUgdGhlIHNhbWUgY29tbW9uIGNvbmZpZ3VyYXRpb24gZGVmaW5lZCBmcm9tIHRoZSBgLnJlZml0dGVyYCBmaWxlLgoKIyMjIFtTdGF0aWNdKCN0YWIvdGFiaWQtc3RhdGljKQoKVG8gZW5hYmxlIEFwaXpyIHN0YXRpYyBidWlsZGVyIGNvZGUgZ2VuZXJhdGlvbiwgeW91IG5lZWQgYXQgbGVhc3QgdG8gc2V0IHRoZSBgd2l0aFJlZ2lzdHJhdGlvbkhlbHBlcmAgcHJvcGVydHkgdG8gYHRydWVgIGFuZCBsZWF2ZSB0aGUgYERlcGVuZGVuY3lJbmplY3Rpb25TZXR0aW5nc2Agc2VjdGlvbiB0byBudWxsIGluIHRoZSBgLnJlZml0dGVyYCBzZXR0aW5ncyBmaWxlLgpUaGlzIGlzIHdoYXQgdGhlIGAucmVmaXR0ZXJgIHNldHRpbmdzIGZpbGUgbWF5IGxvb2sgbGlrZSwgZGVwZW5kaW5nIG9uIHlvdSBjb25maWd1cmF0aW9uOgoKYGBganNvbgp7CiAgIm9wZW5BcGlQYXRoIjogIi4uL09wZW5BUEkvdjMuMC9wZXRzdG9yZS5qc29uIiwKICAibmFtZXNwYWNlIjogIlBldHN0b3JlIiwKICAidXNlRHluYW1pY1F1ZXJ5c3RyaW5nUGFyYW1ldGVycyI6IHRydWUsCiAgImFwaXpyU2V0dGluZ3MiOiB7CiAgICAid2l0aFJlcXVlc3RPcHRpb25zIjogdHJ1ZSwgLy8gUmVjb21tZW5kZWQgdG8gaW5jbHVkZSBhbiBBcGl6ciByZXF1ZXN0IG9wdGlvbnMgcGFyYW1ldGVyIHRvIFJlZml0IGludGVyZmFjZSBtZXRob2RzCiAgICAid2l0aFJlZ2lzdHJhdGlvbkhlbHBlciI6IHRydWUsIC8vIE1hbmRhdG9yeSB0byBhY3R1YWxseSBnZW5lcmF0ZSB0aGUgQXBpenIgcmVnaXN0cmF0aW9uIGV4dGVuZGVkIG1ldGhvZAogICAgIndpdGhDYWNoZVByb3ZpZGVyIjogIkFrYXZhY2hlIiwgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgTm9uZQogICAgIndpdGhQcmlvcml0eSI6IHRydWUsIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlCiAgICAid2l0aE1hcHBpbmdQcm92aWRlciI6ICJBdXRvTWFwcGVyIiwgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgTm9uZQogICAgIndpdGhGaWxlVHJhbnNmZXIiOiB0cnVlIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlCiAgfQp9CmBgYAoKd2hpY2ggd2lsbCBnZW5lcmF0ZSBhIHN0YXRpYyBidWlsZGVyIG1ldGhvZCBjYWxsZWQgYEJ1aWxkUGV0c3RvcmUzMEFwaXpyTWFuYWdlcigpYC4gVGhlIGdlbmVyYXRlZCBidWlsZGVyIG1ldGhvZCBkZXBlbmRzIG9uIFtgQXBpenJgXShodHRwczovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvQXBpenIpIGxpYnJhcnkgYW5kIGxvb2tzIGxpa2UgdGhpczoKCmBgYGNzCnB1YmxpYyBzdGF0aWMgSUFwaXpyTWFuYWdlcjxJU3dhZ2dlclBldHN0b3JlT3BlbkFQSTMwPiBCdWlsZFBldHN0b3JlMzBBcGl6ck1hbmFnZXIoQWN0aW9uPElBcGl6ck1hbmFnZXJPcHRpb25zQnVpbGRlcj4gb3B0aW9uc0J1aWxkZXIpCnsKICAgIG9wdGlvbnNCdWlsZGVyID8/PSBfID0+IHsgfTsgLy8gRGVmYXVsdCBlbXB0eSBvcHRpb25zIGlmIG51bGwKICAgIG9wdGlvbnNCdWlsZGVyICs9IG9wdGlvbnMgPT4gb3B0aW9ucwogICAgICAgIC5XaXRoQWthdmFjaGVDYWNoZUhhbmRsZXIoKQogICAgICAgIC5XaXRoQXV0b01hcHBlck1hcHBpbmdIYW5kbGVyKG5ldyBNYXBwZXJDb25maWd1cmF0aW9uKGNvbmZpZyA9PiB7IC8qIFlPVVJfTUFQUElOR1NfSEVSRSAqLyB9KSkKICAgICAgICAuV2l0aFByaW9yaXR5KCk7CgogICAgcmV0dXJuIEFwaXpyQnVpbGRlci5DdXJyZW50LkNyZWF0ZU1hbmFnZXJGb3I8SVN3YWdnZXJQZXRzdG9yZU9wZW5BUEkzMD4ob3B0aW9uc0J1aWxkZXIpOwp9CmBgYAoKVGhpcyBjb21lcyBpbiBoYW5keSBlc3BlY2lhbGx5IHdoZW4gZ2VuZXJhdGluZyBtdWx0aXBsZSBpbnRlcmZhY2VzLCBieSB0YWcgb3IgZW5kcG9pbnQuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGAucmVmaXR0ZXJgIHNldHRpbmdzIGZpbGUKCmBgYGpzb24KewogICJvcGVuQXBpUGF0aCI6ICIuLi9PcGVuQVBJL3YzLjAvcGV0c3RvcmUuanNvbiIsCiAgIm5hbWVzcGFjZSI6ICJQZXRzdG9yZSIsCiAgInVzZUR5bmFtaWNRdWVyeXN0cmluZ1BhcmFtZXRlcnMiOiB0cnVlLAogICJtdWx0aXBsZUludGVyZmFjZXMiOiAiQnlUYWciLAogICJuYW1pbmciOiB7CiAgICAidXNlT3BlbkFwaVRpdGxlIjogZmFsc2UsCiAgICAiaW50ZXJmYWNlTmFtZSI6ICJQZXRzdG9yZSIKICB9LAogICJkZXBlbmRlbmN5SW5qZWN0aW9uU2V0dGluZ3MiOiB7CiAgICAiYmFzZVVybCI6ICJodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92MyIsCiAgICAiaHR0cE1lc3NhZ2VIYW5kbGVycyI6IFsgIk15RGVsZWdhdGluZ0hhbmRsZXIiIF0sCiAgICAidHJhbnNpZW50RXJyb3JIYW5kbGVyIjogIkh0dHBSZXNpbGllbmNlIiwKICAgICJtYXhSZXRyeUNvdW50IjogMywKICAgICJmaXJzdEJhY2tvZmZSZXRyeUluU2Vjb25kcyI6IDAuNQogIH0sCiAgImFwaXpyU2V0dGluZ3MiOiB7CiAgICAid2l0aFJlcXVlc3RPcHRpb25zIjogdHJ1ZSwgLy8gUmVjb21tZW5kZWQgdG8gaW5jbHVkZSBhbiBBcGl6ciByZXF1ZXN0IG9wdGlvbnMgcGFyYW1ldGVyIHRvIFJlZml0IGludGVyZmFjZSBtZXRob2RzCiAgICAid2l0aFJlZ2lzdHJhdGlvbkhlbHBlciI6IHRydWUsIC8vIE1hbmRhdG9yeSB0byBhY3R1YWxseSBnZW5lcmF0ZSB0aGUgQXBpenIgcmVnaXN0cmF0aW9uIGV4dGVuZGVkIG1ldGhvZAogICAgIndpdGhDYWNoZVByb3ZpZGVyIjogIkluTWVtb3J5IiwgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgTm9uZQogICAgIndpdGhQcmlvcml0eSI6IHRydWUsIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlCiAgICAid2l0aE1lZGlhdGlvbiI6IHRydWUsIC8vIE9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlCiAgICAid2l0aE9wdGlvbmFsTWVkaWF0aW9uIjogdHJ1ZSwgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgZmFsc2UKICAgICJ3aXRoTWFwcGluZ1Byb3ZpZGVyIjogIkF1dG9NYXBwZXIiLCAvLyBPcHRpb25hbCwgZGVmYXVsdCBpcyBOb25lCiAgICAid2l0aEZpbGVUcmFuc2ZlciI6IHRydWUgLy8gT3B0aW9uYWwsIGRlZmF1bHQgaXMgZmFsc2UKICB9Cn0KYGBgCgpXaWxsIGdlbmVyYXRlIGEgc2luZ2xlIGBCdWlsZFBldHN0b3JlQXBpenJNYW5hZ2VycygpYCBidWlsZGVyIG1ldGhvZCB0aGF0IG1heSBjb250YWluIGNvbmZpZ3VyYXRpb24gY29kZSBmb3IgbXVsdGlwbGUgaW50ZXJmYWNlcyBsaWtlIHRoaXMKCmBgYGNzaGFycApwdWJsaWMgc3RhdGljIElBcGl6clJlZ2lzdHJ5IEJ1aWxkUGV0c3RvcmVBcGl6ck1hbmFnZXJzKEFjdGlvbjxJQXBpenJDb21tb25PcHRpb25zQnVpbGRlcj4gb3B0aW9uc0J1aWxkZXIpCnsKICAgIG9wdGlvbnNCdWlsZGVyID8/PSBfID0+IHsgfTsgLy8gRGVmYXVsdCBlbXB0eSBvcHRpb25zIGlmIG51bGwKICAgIG9wdGlvbnNCdWlsZGVyICs9IG9wdGlvbnMgPT4gb3B0aW9ucwogICAgICAgIC5XaXRoQWthdmFjaGVDYWNoZUhhbmRsZXIoKQogICAgICAgIC5XaXRoQXV0b01hcHBlck1hcHBpbmdIYW5kbGVyKG5ldyBNYXBwZXJDb25maWd1cmF0aW9uKGNvbmZpZyA9PiB7IC8qIFlPVVJfTUFQUElOR1NfSEVSRSAqLyB9KSkKICAgICAgICAuV2l0aFByaW9yaXR5KCk7CgogICAgcmV0dXJuIEFwaXpyQnVpbGRlci5DdXJyZW50LkNyZWF0ZVJlZ2lzdHJ5KAogICAgICAgIHJlZ2lzdHJ5ID0+IHJlZ2lzdHJ5CiAgICAgICAgICAgIC5BZGRNYW5hZ2VyRm9yPElQZXRBcGk+KCkKICAgICAgICAgICAgLkFkZE1hbmFnZXJGb3I8SVN0b3JlQXBpPigpCiAgICAgICAgICAgIC5BZGRNYW5hZ2VyRm9yPElVc2VyQXBpPigpLAogICAgICAgIG9wdGlvbnNCdWlsZGVyKTsKfQpgYGAKCkhlcmUsIGBJUGV0QXBpYCwgYElTdG9yZUFwaWAgYW5kIGBJVXNlckFwaWAgYXJlIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlcyB3aGljaCBzaGFyZSB0aGUgc2FtZSBjb21tb24gY29uZmlndXJhdGlvbiBkZWZpbmVkIGZyb20gdGhlIGAucmVmaXR0ZXJgIGZpbGUuCgoqKioKCiMjIyBDdXN0b21pemluZyB0aGUgY29uZmlndXJhdGlvbgoKWW91IG1heSB3YW50IHRvIGFkanVzdCBhcGlzIGNvbmZpZ3VyYXRpb24sIGZvciBleGFtcGxlLCB0byBhZGQgYSBjdXN0b20gaGVhZGVyIHRvIHJlcXVlc3RzLiBUaGlzIGNhbiBiZSBkb25lIHVzaW5nIHRoZSBgQWN0aW9uPFRBcGl6ck9wdGlvbnNCdWlsZGVyPmAgcGFyYW1ldGVyIHdoaWxlIGNhbGxpbmcgdGhlIGdlbmVyYXRlZCBtZXRob2QuClRvIGtub3cgaG93IHRvIG1ha2UgQXBpenIgZml0IHlvdXIgbmVlZHMsIHBsZWFzZSByZWZlciB0byB0aGUgW0FwaXpyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3LmFwaXpyLm5ldCkuCgojIyMgVXNpbmcgdGhlIG1hbmFnZXJzCgpPbmNlIHlvdSBjYWxsZWQgdGhlIGdlbmVyYXRlZCBtZXRob2QsIHlvdSB3aWxsIGdldCBhbiBgSUFwaXpyTWFuYWdlcjxUPmAgaW5zdGFuY2UgdGhhdCB5b3UgY2FuIHVzZSB0byBtYWtlIHJlcXVlc3RzIHRvIHRoZSBBUEkuIEhlcmUncyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgaXQ6CgpgYGBjc2hhcnAKdmFyIHJlc3VsdCA9IGF3YWl0IHBldHN0b3JlTWFuYWdlci5FeGVjdXRlQXN5bmMoKGFwaSwgb3B0KSA9PiBhcGkuR2V0UGV0QnlJZCgxLCBvcHQpLAogICAgb3B0aW9ucyA9PiBvcHRpb25zIC8vIFdoYXRldmVyIGZpbmFsIHJlcXVlc3Qgb3B0aW9ucyB5b3Ugd2FudCB0byBhcHBseQogICAgICAgIC5XaXRoUHJpb3JpdHkoUHJpb3JpdHkuQmFja2dyb3VuZCkKICAgICAgICAuV2l0aEhlYWRlcnMoWyJIZWFkZXJLZXkxOiBIZWFkZXJWYWx1ZTEiXSkKICAgICAgICAuV2l0aFJlcXVlc3RUaW1lb3V0KCIwMDowMDoxMCIpCiAgICAgICAgLldpdGhDYW5jZWxsYXRpb24oY3RzLlRva2VuKSk7CmBgYAoKUGxlYXNlIGhlYWQgdG8gdGhlIFtBcGl6ciBkb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5hcGl6ci5uZXQpIHRvIGdldCBtb3JlLgoKIyMgU3lzdGVtIHJlcXVpcmVtZW50cwouTkVUIDguMAoKIyMgQ29udHJpYnV0b3JzCgo8IS0tIEFMTC1DT05UUklCVVRPUlMtTElTVDpTVEFSVCAtIERvIG5vdCByZW1vdmUgb3IgbW9kaWZ5IHRoaXMgc2VjdGlvbiAtLT4KPCEtLSBwcmV0dGllci1pZ25vcmUtc3RhcnQgLS0+CjwhLS0gbWFya2Rvd25saW50LWRpc2FibGUgLS0+Cjx0YWJsZT4KICA8dGJvZHk+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL25lb0dlbmV2YSI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS84MDQ3MjQ/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlBoaWxpcCBDb3giLz48YnIgLz48c3ViPjxiPlBoaWxpcCBDb3g8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1uZW9HZW5ldmEiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9jYW0ubWFjZmFyLmxhbmQvIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTg4NDc/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkNhbWVyb24gTWFjRmFybGFuZCIvPjxiciAvPjxzdWI+PGI+Q2FtZXJvbiBNYWNGYXJsYW5kPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9ZGlzdGFudGNhbSIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwOi8va2dhbWUudHciPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMzY0NjUzMj92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0ia2dhbWUiLz48YnIgLz48c3ViPjxiPmtnYW1lPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9a2dhbWVjYXJ0ZXIiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cDovL3lya2kubm8iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTE1NzM2MDE/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlRob21hcyBQZXR0ZXJzZW4gLyBZcmtpIi8+PGJyIC8+PHN1Yj48Yj5UaG9tYXMgUGV0dGVyc2VuIC8gWXJraTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPSIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vMWt2aW4iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDY0MjU5ODA/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkFydGVtIi8+PGJyIC8+PHN1Yj48Yj5BcnRlbTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQTFrdmluIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbTdjbGFya2UiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDc0MzkxNDQ/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9Im03Y2xhcmtlIi8+PGJyIC8+PHN1Yj48Yj5tN2NsYXJrZTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQW03Y2xhcmtlIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20va2lyaWRlcyI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xMzYwMjE0Mz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0ia2lyaWRlcyIvPjxiciAvPjxzdWI+PGI+a2lyaWRlczwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWtpcmlkZXMiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPWtpcmlkZXMiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9ndWlsbGF1bWVzZXJhbGUiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNjY3MjQwNj92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iZ3VpbGxhdW1lc2VyYWxlIi8+PGJyIC8+PHN1Yj48Yj5ndWlsbGF1bWVzZXJhbGU8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1ndWlsbGF1bWVzZXJhbGUiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBZ3VpbGxhdW1lc2VyYWxlIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUm9mbGluY29wdGVyIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2OTAyNDM/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkRlbm5pcyBCcmVudGplcyIvPjxiciAvPjxzdWI+PGI+RGVubmlzIEJyZW50amVzPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9Um9mbGluY29wdGVyIiB0aXRsZT0iQ29kZSI+8J+SuzwvYT4gPGEgaHJlZj0iI2lkZWFzLVJvZmxpbmNvcHRlciIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9oaWNrZXlkYW1pYW4vIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzU3NDM2P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJEYW1pYW4gSGlja2V5Ii8+PGJyIC8+PHN1Yj48Yj5EYW1pYW4gSGlja2V5PC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBZGFtaWFuaCIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3JpY2hhcmRodS1sbWciPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI2NDMwNzg3P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJyaWNoYXJkaHUtbG1nIi8+PGJyIC8+PHN1Yj48Yj5yaWNoYXJkaHUtbG1nPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBcmljaGFyZGh1LWxtZyIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2JyZWFzZS1jb2xpbiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS80NzM1ODkzNT92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iYnJlYXNlLWNvbGluIi8+PGJyIC8+PHN1Yj48Yj5icmVhc2UtY29saW48L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9pc3N1ZXM/cT1hdXRob3IlM0FicmVhc2UtY29saW4iIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hbmdlbG9mYiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8yMDMyMjU3P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJhbmdlbG9mYiIvPjxiciAvPjxzdWI+PGI+YW5nZWxvZmI8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1hbmdlbG9mYiIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vTm9HUm8iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNTY2NTI3Mz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iRGltIE5vZ3JvIi8+PGJyIC8+PHN1Yj48Yj5EaW0gTm9ncm88L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1Ob0dSbyIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3lhZGFuaWxvdjE5Ij48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE3MTYxMDY1P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJ5YWRhbmlsb3YxOSIvPjxiciAvPjxzdWI+PGI+eWFkYW5pbG92MTk8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9IiNpZGVhcy15YWRhbmlsb3YxOSIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPXlhZGFuaWxvdjE5IiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYW5wb3dlbGw4OCI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xMTAwMzk3P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJEYW5pZWwgUG93ZWxsIi8+PGJyIC8+PHN1Yj48Yj5EYW5pZWwgUG93ZWxsPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBZGFucG93ZWxsODgiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9Fa2tlaXIiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMzYxOTQ2ODU/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkVra2VpciIvPjxiciAvPjxzdWI+PGI+RWtrZWlyPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9RWtrZWlyIiB0aXRsZT0iRG9jdW1lbnRhdGlvbiI+8J+TljwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQUVra2VpciIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3dheWxvbm10eiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS80NjA0NTc5P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJXYXlsb24gTWFydGluZXoiLz48YnIgLz48c3ViPjxiPldheWxvbiBNYXJ0aW5lejwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQXdheWxvbm10eiIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3ZpbmF5bWFkdXBhdGhpIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzM4MTAyOTAwP3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJ2a21hZHVwYSIvPjxiciAvPjxzdWI+PGI+dmttYWR1cGE8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9pc3N1ZXM/cT1hdXRob3IlM0F2aW5heW1hZHVwYXRoaSIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL05vYmxpeCI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8yMjA3Njg4Mz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iTm9ibGl4Ii8+PGJyIC8+PHN1Yj48Yj5Ob2JsaXg8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1Ob2JsaXgiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPiA8YSBocmVmPSIjaWRlYXMtTm9ibGl4IiB0aXRsZT0iSWRlYXMsIFBsYW5uaW5nLCAmIEZlZWRiYWNrIj7wn6SUPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly93d3cudmVlemxhLmlvIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzIzMDQzMj92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iQXR0aWxhIEhhamRyaWsiLz48YnIgLz48c3ViPjxiPkF0dGlsYSBIYWpkcmlrPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSIjaWRlYXMtYXR0aWxhaCIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYmllbGlrMDEiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvOTIwOTUwP3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJiaWVsaWswMSIvPjxiciAvPjxzdWI+PGI+YmllbGlrMDE8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9pc3N1ZXM/cT1hdXRob3IlM0FiaWVsaWswMSIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPiA8YSBocmVmPSIjaWRlYXMtYmllbGlrMDEiIHRpdGxlPSJJZGVhcywgUGxhbm5pbmcsICYgRmVlZGJhY2siPvCfpJQ8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbmFhZWVmIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzQzMzM5MDcxP3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJuYWFlZWYiLz48YnIgLz48c3ViPjxiPm5hYWVlZjwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iI2lkZWFzLW5hYWVlZiIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hbHJ6Ij48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzMxMDU5Nzk/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkFsaXJlemEgSGFiaWJpIi8+PGJyIC8+PHN1Yj48Yj5BbGlyZXphIEhhYmliaTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWFscnoiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9FRVBhcmtlciI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTg3NDA3Nj92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iSmVmZiBQYXJrZXIsIFBFIi8+PGJyIC8+PHN1Yj48Yj5KZWZmIFBhcmtlciwgUEU8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9pc3N1ZXM/cT1hdXRob3IlM0FFRVBhcmtlciIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2pvZHM0Ij48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzM4MzI4MjA/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9ImpvZHMiLz48YnIgLz48c3ViPjxiPmpvZHM8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9IiNpZGVhcy1qb2RzNCIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWpvZHM0IiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZWRpbWFycXVleiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS80MTc5MTcxOT92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iRWRpbWFycXVleiBNZWRlaXJvcyIvPjxiciAvPjxzdWI+PGI+RWRpbWFycXVleiBNZWRlaXJvczwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPWVkaW1hcnF1ZXoiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NhZmFra2VzaWtjaSI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS83MDY3MjUyP3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJzYWZha2tlc2lrY2kiLz48YnIgLz48c3ViPjxiPnNhZmFra2VzaWtjaTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQXNhZmFra2VzaWtjaSIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9mb2xicmVjaHQiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ1NTM3ODQ2P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJmb2xicmVjaHQiLz48YnIgLz48c3ViPjxiPmZvbGJyZWNodDwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWZvbGJyZWNodCIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21vcnRlbmxhdXJzZW4iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMjg3NTk3Mzc/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9Im1vcnRlbmxhdXJzZW4iLz48YnIgLz48c3ViPjxiPm1vcnRlbmxhdXJzZW48L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1tb3J0ZW5sYXVyc2VuIiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYW51ZWwtZmVybmFuZGV6LXJvZHJpZ3VleiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS80ODUyMDIwNT92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0ibWFudWVsLWZlcm5hbmRlei1yb2RyaWd1ZXoiLz48YnIgLz48c3ViPjxiPm1hbnVlbC1mZXJuYW5kZXotcm9kcmlndWV6PC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBbWFudWVsLWZlcm5hbmRlei1yb2RyaWd1ZXoiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9lbGl5YW1taW5lIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzY2NDQ4MDc/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkVsaSBZYW1taW5lIi8+PGJyIC8+PHN1Yj48Yj5FbGkgWWFtbWluZTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWVsaXlhbW1pbmUiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9rYW1pLXBvaSI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS80NzMyMjY5MT92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0ia2FtaS1wb2kiLz48YnIgLz48c3ViPjxiPmthbWktcG9pPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSIjaWRlYXMta2FtaS1wb2kiIHRpdGxlPSJJZGVhcywgUGxhbm5pbmcsICYgRmVlZGJhY2siPvCfpJQ8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vWGVldmlzIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzU4MzUwNDQ/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlhlZXZpcyIvPjxiciAvPjxzdWI+PGI+WGVldmlzPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBWGVldmlzIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vREo0ZGRpIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2OTYxMDI/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkRKNGRkaSIvPjxiciAvPjxzdWI+PGI+REo0ZGRpPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9REo0ZGRpIiB0aXRsZT0iQ29kZSI+8J+SuzwvYT4gPGEgaHJlZj0iI2lkZWFzLURKNGRkaSIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGlyZW5jYW5jYXRhbGtheWEiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNTcyMjM3MzI/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9ImRpcmVuY2FuY2F0YWxrYXlhIi8+PGJyIC8+PHN1Yj48Yj5kaXJlbmNhbmNhdGFsa2F5YTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPWRpcmVuY2FuY2F0YWxrYXlhIiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9yb2JwYWxtIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0OTM5NTMwP3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJSb2JlcnQgUGFsbXF2aXN0Ii8+PGJyIC8+PHN1Yj48Yj5Sb2JlcnQgUGFsbXF2aXN0PC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSIjaWRlYXMtcm9icGFsbSIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPXJvYnBhbG0iIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1RpbW90aHlNYWtraXNvbiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS80OTM0OTUxMz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iVGltIE0iLz48YnIgLz48c3ViPjxiPlRpbSBNPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9VGltb3RoeU1ha2tpc29uIiB0aXRsZT0iRG9jdW1lbnRhdGlvbiI+8J+TljwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qYW5mb2xicmVjaHQiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDIxODY2MDQ/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9ImphbmZvbGJyZWNodCIvPjxiciAvPjxzdWI+PGI+amFuZm9sYnJlY2h0PC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSIjaWRlYXMtamFuZm9sYnJlY2h0IiB0aXRsZT0iSWRlYXMsIFBsYW5uaW5nLCAmIEZlZWRiYWNrIj7wn6SUPC9hPiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9amFuZm9sYnJlY2h0IiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vc2MtbnNlZ3VpbiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xMzM5MTAzMDk/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9Ik5pY2sgU2VndWluIi8+PGJyIC8+PHN1Yj48Yj5OaWNrIFNlZ3VpbjwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPW9zYy1uc2VndWluIiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYXZpZC1icmluay10YWxvZ3kiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDM4Mjg3Mzk/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkRhdmlkIEJyaW5rIi8+PGJyIC8+PHN1Yj48Yj5EYXZpZCBCcmluazwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWRhdmlkLWJyaW5rLXRhbG9neSIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9ZGF2aWQtYnJpbmstdGFsb2d5IiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYW1taXRqYW5ldCI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS85NTI3MjM/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlN0dSBXaWxzb24iLz48YnIgLz48c3ViPjxiPlN0dSBXaWxzb248L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9IiNpZGVhcy1kYW1taXRqYW5ldCIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPWRhbW1pdGphbmV0IiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2hhcnB6aWxsYSI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNjc2MzYzND92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0ic2hhcnB6aWxsYSIvPjxiciAvPjxzdWI+PGI+c2hhcnB6aWxsYTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iI2lkZWFzLXNoYXJwemlsbGEiIHRpdGxlPSJJZGVhcywgUGxhbm5pbmcsICYgRmVlZGJhY2siPvCfpJQ8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vSmFwcGluZW4iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDQ0MDg0OTc/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlRhdHUiLz48YnIgLz48c3ViPjxiPlRhdHU8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9pc3N1ZXM/cT1hdXRob3IlM0FKYXBwaW5lbiIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cDovL3d3dy5yZXNwYXduc2l2ZS5jb20iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDI3MjMwNz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iSsOpcsOpbXkgQlJVTi1QSUNBUkQiLz48YnIgLz48c3ViPjxiPkrDqXLDqW15IEJSVU4tUElDQVJEPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSIjaWRlYXMtSmVyZW15QlAiIHRpdGxlPSJJZGVhcywgUGxhbm5pbmcsICYgRmVlZGJhY2siPvCfpJQ8L2E+IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1KZXJlbXlCUCIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1KZXJlbXlCUCIgdGl0bGU9IkRvY3VtZW50YXRpb24iPvCfk5Y8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZWJhcm5hcmQiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTA1OTY4Mz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iRWQgQmFybmFyZCIvPjxiciAvPjxzdWI+PGI+RWQgQmFybmFyZDwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iI2lkZWFzLWViYXJuYXJkIiB0aXRsZT0iSWRlYXMsIFBsYW5uaW5nLCAmIEZlZWRiYWNrIj7wn6SUPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Jhc3RpZW5ub2VsOTMiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTgyNTAzNTA/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9ImJhc3RpZW4ubm9lbCIvPjxiciAvPjxzdWI+PGI+YmFzdGllbi5ub2VsPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBYmFzdGllbm5vZWw5MyIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL01laWtlbExQIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzExNjY5ODQ2P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJNZWlrZWwgUGhpbGlwcCIvPjxiciAvPjxzdWI+PGI+TWVpa2VsIFBoaWxpcHA8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9IiNpZGVhcy1NZWlrZWxMUCIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHA6Ly9iZXJrc2VsdmkuZGV2Ij48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzU0Njc2NTE2P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJCZXJrIFNlbHZpIi8+PGJyIC8+PHN1Yj48Yj5CZXJrIFNlbHZpPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSIjaWRlYXMtYmVya3NsdiIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPWJlcmtzbHYiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vd3d3LnRoZWJ1aWxkc2hlZXQuY29tLyI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS85OTA5NTY0P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJKb3NodWEgT3plcmkiLz48YnIgLz48c3ViPjxiPkpvc2h1YSBPemVyaTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQVhlQ2x1dGNoIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2thbmNhbmUubmwvIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzcwMTUzND92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iUnlhbiBIZWF0aCIvPjxiciAvPjxzdWI+PGI+UnlhbiBIZWF0aDwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iI2lkZWFzLXJ5YW5oZWF0aCIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPXJ5YW5oZWF0aCIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vQnJpYW9ldWlkaHRucyI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS83NTMwMTU2P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJCcmlhbiBCcnVubmVyIi8+PGJyIC8+PHN1Yj48Yj5CcmlhbiBCcnVubmVyPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSIjaWRlYXMtQnJpYW9ldWlkaHRucyIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9mc2FtaWVjIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEzMTY2MDIwP3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJGcmFuayBTYW1pZWMiLz48YnIgLz48c3ViPjxiPkZyYW5rIFNhbWllYzwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPWZzYW1pZWMiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2ZhYmlvbG9yZWdnaWFuIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzMxNDgwNzY4P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJGYWJpbyBMb3JlZ2dpYW4iLz48YnIgLz48c3ViPjxiPkZhYmlvIExvcmVnZ2lhbjwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWZhYmlvbG9yZWdnaWFuIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZ2VvbWV0cmlrYWwiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTE4NzUyOD92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iZ2VvbWV0cmlrYWwiLz48YnIgLz48c3ViPjxiPmdlb21ldHJpa2FsPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBZ2VvbWV0cmlrYWwiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zaHViaW5wIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzI1NzYzNzc2P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJTaHViaW4gUGF2ZWwiLz48YnIgLz48c3ViPjxiPlNodWJpbiBQYXZlbDwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPXNodWJpbnAiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vd3d3Lm5ldGluZHVzdHJ5Lm5sIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzMwMzAzND92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iV2llYmUgVGlqc21hIi8+PGJyIC8+PHN1Yj48Yj5XaWViZSBUaWpzbWE8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9IiNpZGVhcy16aWRhZCIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9oZ2RlbWVycyI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNjkxOTA4NzY/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkhlbnJpIERlbWVycyIvPjxiciAvPjxzdWI+PGI+SGVucmkgRGVtZXJzPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBaGdkZW1lcnMiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9GYXJnZWtyaXR0Ij48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzExNDQ4OTQxP3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJBbXVuZCIvPjxiciAvPjxzdWI+PGI+QW11bmQ8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1GYXJnZWtyaXR0IiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS92ZWx2b2x1ZSI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTU0NDU5Njg/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlZlZ2FyZCBMw7hra2VuIi8+PGJyIC8+PHN1Yj48Yj5WZWdhcmQgTMO4a2tlbjwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPXZlbHZvbHVlIiB0aXRsZT0iQ29kZSI+8J+SuzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9icmFkLXRlY2hub2xvZ2lrIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE1OTk3NTA2Mz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iYnJhZC10ZWNobm9sb2dpayIvPjxiciAvPjxzdWI+PGI+YnJhZC10ZWNobm9sb2dpazwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWJyYWQtdGVjaG5vbG9naWsiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgPC90cj4KICA8L3Rib2R5Pgo8L3RhYmxlPgoKPCEtLSBtYXJrZG93bmxpbnQtcmVzdG9yZSAtLT4KPCEtLSBwcmV0dGllci1pZ25vcmUtZW5kIC0tPgoKPCEtLSBBTEwtQ09OVFJJQlVUT1JTLUxJU1Q6RU5EIC0tPgoKIwoKRm9yIHRpcHMgYW5kIHRyaWNrcyBvbiBzb2Z0d2FyZSBkZXZlbG9wbWVudCwgY2hlY2sgb3V0IFtteSBibG9nXShodHRwczovL2NocmlzdGlhbmhlbGxlLmNvbSkKCklmIHlvdSBmaW5kIHRoaXMgdXNlZnVsIGFuZCBmZWVsIGEgYml0IGdlbmVyb3VzIHRoZW4gZmVlbCBmcmVlIHRvIFtidXkgbWUgYSBjb2ZmZWUg4piVXShodHRwczovL3d3dy5idXltZWFjb2ZmZWUuY29tL2NocmlzdGlhbmhlbGxlKQo=
+ readmeEtag: '"6eacc7c4f09e82dd98085b0623d964e26ba487b8"'
+ readmeLastModified: Tue, 14 Jan 2025 15:52:14 GMT
repositoryId: 598846021
description: >-
A tool for generating Refit interfaces and contracts from OpenAPI
specifications
created: '2023-02-07T23:18:12Z'
- updated: '2025-01-13T22:37:55Z'
+ updated: '2025-01-14T15:52:18Z'
language: C#
archived: false
stars: 221
@@ -9705,8 +9705,8 @@
owner: christianhelle
logo: https://avatars.githubusercontent.com/u/710400?v=4
license: MIT
- repoEtag: '"e2efae3ddf2c07a25054572a37ab4af7235a4c5dfa74bb54ebfcfefa0fade0ff"'
- repoLastModified: Mon, 13 Jan 2025 22:37:55 GMT
+ repoEtag: '"bf19a10aa07a81cde6ee7c9082bdbd3931429eb0bc730e8f0ebbb58c777fdedb"'
+ repoLastModified: Tue, 14 Jan 2025 15:52:18 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -9781,7 +9781,7 @@
owner: luolingchun
logo: https://avatars.githubusercontent.com/u/22740403?v=4
license: MIT
- repoEtag: '"10970f0f24bbc95e93777a0ec29d234eb0d890b254fce2f2c69d11c2ed3978c0"'
+ repoEtag: '"753f5f4d9895ffb28015f7e3e2ce44077c72398db82a8f29fc33820ca5b46c6f"'
repoLastModified: Sun, 12 Jan 2025 03:35:39 GMT
foundInMaster: true
category: Server Implementations
@@ -9826,17 +9826,17 @@
A plugin for the Fastify webserver to autogenerate a Fastify
configuration based on a OpenApi(v2/v3) specification.
created: '2018-06-30T19:02:58Z'
- updated: '2025-01-07T15:49:52Z'
+ updated: '2025-01-14T22:27:19Z'
language: JavaScript
archived: false
- stars: 206
+ stars: 207
watchers: 6
forks: 33
owner: seriousme
logo: https://avatars.githubusercontent.com/u/3322396?v=4
license: MIT
- repoEtag: '"4d7aaebc3843a571adf1433a8202666540ab3d7ce7e39cd65d288b4475a862c2"'
- repoLastModified: Tue, 07 Jan 2025 15:49:52 GMT
+ repoEtag: '"8803cf12e9cf473aa5184b570d91e9986b23bcecf6826e0963904691f58b7e6e"'
+ repoLastModified: Tue, 14 Jan 2025 22:27:19 GMT
foundInMaster: true
category:
- Data Validators
@@ -10043,7 +10043,7 @@
owner: christianhelle
logo: https://avatars.githubusercontent.com/u/710400?v=4
license: GPL-3.0
- repoEtag: '"6e0d41e8603ab023b9ea9bc95f973835143d7ba30998c03e6c449e9e8d90cc2a"'
+ repoEtag: '"74460b8204ce9319155900dbe52d92d4148afb7985b5170b2cf382efbf028589"'
repoLastModified: Fri, 10 Jan 2025 16:26:16 GMT
category: SDK
foundInMaster: true
@@ -10573,7 +10573,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: '2025-01-13T03:39:06Z'
+ updated: '2025-01-14T14:53:09Z'
language: JavaScript
archived: false
stars: 117
@@ -10581,8 +10581,8 @@
forks: 34
owner: OAI
logo: https://avatars.githubusercontent.com/u/16343502?v=4
- repoEtag: '"51e8a15fb2e8ef58b34ff05288ca11a53a68df7ad989cdb93c69e188230345c9"'
- repoLastModified: Mon, 13 Jan 2025 03:39:06 GMT
+ repoEtag: '"becf3f4a772f12e3e026041f29d2bd831b555c8b807bc94b490c334c37a523ab"'
+ repoLastModified: Tue, 14 Jan 2025 14:53:09 GMT
category: Server Implementations
foundInMaster: true
oldLocations:
@@ -10636,7 +10636,7 @@
owner: kuimono
logo: https://avatars.githubusercontent.com/u/16016416?v=4
license: MIT
- repoEtag: '"bbe8b6a0fa8e3451944a8230a7814774db13ed53b33e33fc0576538e199d67ae"'
+ repoEtag: '"ec12b843012e1184ff2d238e9aca12c91b2a75eaa79012a0a7c78d75645714f2"'
repoLastModified: Fri, 03 Jan 2025 18:59:36 GMT
foundInMaster: true
category: Parsers
@@ -10708,17 +10708,17 @@
repositoryId: 68995825
description: OpenAPI (fka Swagger) spec renderer for Sphinx.
created: '2016-09-23T06:28:32Z'
- updated: '2025-01-10T00:08:26Z'
+ updated: '2025-01-14T20:34:53Z'
language: Python
archived: false
- stars: 114
+ stars: 115
watchers: 11
forks: 83
owner: sphinx-contrib
logo: https://avatars.githubusercontent.com/u/31936682?v=4
license: BSD-2-Clause
- repoEtag: '"de6efb0a847821b00f11d95611e39cc32f7bb6537eadee560a6ec2823f6877fb"'
- repoLastModified: Fri, 10 Jan 2025 00:08:26 GMT
+ repoEtag: '"deeedd5e04b96fc7866e0eea7e47447377f98bfc3fc604e1090fd43025b5cd36"'
+ repoLastModified: Tue, 14 Jan 2025 20:34:53 GMT
foundInMaster: true
category:
- Converters
@@ -11077,7 +11077,7 @@
owner: jellyfin
logo: https://avatars.githubusercontent.com/u/45698031?v=4
license: LGPL-3.0
- repoEtag: '"03f8f086570ea8c3e69856cc865253ec92ffca4a9272c87143dcb72cdd2d0f02"'
+ repoEtag: '"ee4c2276ad783e7985a188ef1638ee77767b90581775b6d90dd8f4b17e4ea11a"'
repoLastModified: Tue, 31 Dec 2024 16:49:32 GMT
foundInMaster: true
category: Testing
@@ -11132,7 +11132,7 @@
owner: christianhelle
logo: https://avatars.githubusercontent.com/u/710400?v=4
license: MIT
- repoEtag: '"8e311478e06efae7597d4fd448bf30269fcd2b928641fc2a7ed17d185f29bfef"'
+ repoEtag: '"1bd683a6de28c2511642962c7cc17d06438b3fa1201913ebb5289ec303eb1db0"'
repoLastModified: Fri, 10 Jan 2025 12:40:49 GMT
category: Parsers
foundInMaster: true
@@ -11172,17 +11172,17 @@
repositoryId: 138299589
description: Pyramid addon for OpenAPI3 validation of requests and responses.
created: '2018-06-22T12:20:57Z'
- updated: '2025-01-13T18:10:02Z'
+ updated: '2025-01-14T09:51:20Z'
language: Python
archived: false
- stars: 84
+ stars: 85
watchers: 14
forks: 47
owner: Pylons
logo: https://avatars.githubusercontent.com/u/452227?v=4
license: MIT
- repoEtag: '"4b7c2467ec5ea981eafaab85d9a0778abf3d05b2980951465fbca07d360c9b7f"'
- repoLastModified: Mon, 13 Jan 2025 18:10:02 GMT
+ repoEtag: '"4d9b576752cf0e7e7492f177e71d756585b00763ad703b1566a97a33fa778fc1"'
+ repoLastModified: Tue, 14 Jan 2025 09:51:20 GMT
foundInMaster: true
category: Testing
id: 68586d443740aa8b483e2facfd87c65e
@@ -11311,7 +11311,7 @@
repositoryId: 249737066
description: Semantic parser for API specifications
created: '2020-03-24T14:55:51Z'
- updated: '2025-01-10T17:12:31Z'
+ updated: '2025-01-14T23:42:15Z'
language: TypeScript
archived: false
stars: 73
@@ -11319,8 +11319,8 @@
forks: 18
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
- repoEtag: '"1538ad18381043909bb3af159fa7a253d72b9ee17aa6896bf4a27f35a7179c6b"'
- repoLastModified: Fri, 10 Jan 2025 17:12:31 GMT
+ repoEtag: '"bee9afd0a306fd334d3d4db20d97f58b1a55c08c5c1e4a198d0d3210e77c325c"'
+ repoLastModified: Tue, 14 Jan 2025 23:42:15 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -11446,17 +11446,17 @@
OpenAPI 3 parser to use a specification inside of the code in your
projects
created: '2020-08-27T00:47:00Z'
- updated: '2024-12-13T11:37:40Z'
+ updated: '2025-01-14T07:51:03Z'
language: Python
archived: false
- stars: 67
+ stars: 68
watchers: 2
forks: 34
owner: manchenkoff
logo: https://avatars.githubusercontent.com/u/6690063?v=4
license: MIT
- repoEtag: '"becf89a2d2cc9e290d80f94a3532bf8112a2043ce4757c17035a8bf936ea80f7"'
- repoLastModified: Fri, 13 Dec 2024 11:37:40 GMT
+ repoEtag: '"5bd0b86976a75528f5a323b4e5752b1ba8f15ee77a5b5de0dd5a4419cd3557e4"'
+ repoLastModified: Tue, 14 Jan 2025 07:51:03 GMT
foundInMaster: true
category: Parsers
id: 074facec95becd6c9d361eb75f2d1d2f
@@ -11556,17 +11556,17 @@
repositoryId: 735578513
description: Generate VitePress API Docs from OpenAPI specifications
created: '2023-12-25T12:25:21Z'
- updated: '2025-01-11T21:48:05Z'
+ updated: '2025-01-14T10:29:48Z'
language: TypeScript
archived: false
- stars: 65
+ stars: 66
watchers: 2
forks: 10
owner: enzonotario
logo: https://avatars.githubusercontent.com/u/10469299?v=4
license: MIT
- repoEtag: '"a8f2817b531edef4b381ad6659f56706f443bb76b316ce3ddb5faddf0015e44e"'
- repoLastModified: Sat, 11 Jan 2025 21:48:05 GMT
+ repoEtag: '"3ae4a84506676b56ae74fb2c784fdcc0815b95fa37fce2547d680b90f67f1b00"'
+ repoLastModified: Tue, 14 Jan 2025 10:29:48 GMT
category: Parsers
foundInMaster: true
oldLocations:
@@ -11663,11 +11663,11 @@
archived: false
stars: 60
watchers: 3
- forks: 23
+ forks: 24
owner: a-h
logo: https://avatars.githubusercontent.com/u/1029947?v=4
license: MIT
- repoEtag: '"1f736ea9d79160842d2b48fac362c406edf53c5099104aa5165eab78e5cb396d"'
+ repoEtag: '"ad4ab7f171695a9789a077d4fefdd0eee3b67047a94415d72e628b99c045ea04"'
repoLastModified: Wed, 25 Dec 2024 03:42:49 GMT
category: Parsers
foundInMaster: true
@@ -11716,7 +11716,7 @@
owner: Sideko-Inc
logo: https://avatars.githubusercontent.com/u/122366043?v=4
license: NOASSERTION
- repoEtag: '"72d687fc82d1160929ceda4d2572cf3248ebcd25fc02f514b7232d02d352493b"'
+ repoEtag: '"d9540ceec72d420ee0117baac94c203e252f1cb145f7c390e38993b9bf49b117"'
repoLastModified: Mon, 13 Jan 2025 17:51:17 GMT
category: SDK
foundInMaster: true
@@ -11734,17 +11734,17 @@
repositoryId: 506151512
description: 'A client generator from openapi for python. '
created: '2022-06-22T07:56:40Z'
- updated: '2025-01-13T07:33:01Z'
+ updated: '2025-01-14T06:12:17Z'
language: Python
archived: false
- stars: 59
+ stars: 60
watchers: 3
forks: 28
owner: MarcoMuellner
logo: https://avatars.githubusercontent.com/u/13886384?v=4
license: MIT
- repoEtag: '"998595fdacb140209928c420b845e9082f167b537b2a0b3f8035028198bb20b4"'
- repoLastModified: Mon, 13 Jan 2025 07:33:01 GMT
+ repoEtag: '"076e94eda3abc6f29da03fd3d5004323b96433ede4960e9d6066ecbd964be4d5"'
+ repoLastModified: Tue, 14 Jan 2025 06:12:17 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -12120,7 +12120,7 @@
This GitHub Actions validates OpenAPI (OAS) definition file using Swagger
Editor.
created: '2021-03-05T18:37:29Z'
- updated: '2025-01-13T04:19:04Z'
+ updated: '2025-01-14T09:48:26Z'
language: JavaScript
archived: false
stars: 48
@@ -12129,8 +12129,8 @@
owner: swaggerexpert
logo: https://avatars.githubusercontent.com/u/172408630?v=4
license: BSD-3-Clause
- repoEtag: '"e9aa37d0b267ac771464ea72548cabecdb35921ffdb88d209d89eced0a27f032"'
- repoLastModified: Mon, 13 Jan 2025 04:19:04 GMT
+ repoEtag: '"cf628f28da44ded29d6ba76db8cd96fb4c3e5e389b7aa4bb4f194b7d634d8650"'
+ repoLastModified: Tue, 14 Jan 2025 09:48:26 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -12201,11 +12201,11 @@
archived: false
stars: 47
watchers: 6
- forks: 17
+ forks: 18
owner: javalin
logo: https://avatars.githubusercontent.com/u/28701086?v=4
license: Apache-2.0
- repoEtag: '"ed339f90d17fa7e0d8a8f7fdc7cb1a6f5679b9e1b65923b25f8d10c9e42ea1b6"'
+ repoEtag: '"d79f23cc0f33bfc48fd75f33c546f204bc150bc0c918afea2307e3a39d919443"'
repoLastModified: Wed, 01 Jan 2025 14:08:18 GMT
category: SDK
foundInMaster: true
@@ -12251,16 +12251,16 @@
Spring Boot 3.1 & Spring Security 6 : Token Based Authentication example
with JWT, Authorization, Spring Data & PostgreSQL
created: '2023-06-27T10:15:47Z'
- updated: '2025-01-13T07:54:34Z'
+ updated: '2025-01-14T04:40:46Z'
language: Java
archived: false
- stars: 46
+ stars: 47
watchers: 3
forks: 12
owner: MossaabFrifita
logo: https://avatars.githubusercontent.com/u/34568592?v=4
- repoEtag: '"878f33d334c602dbdfa1793eae425b68f83a92012cdc37d6b145607ab05ae539"'
- repoLastModified: Mon, 13 Jan 2025 07:54:34 GMT
+ repoEtag: '"f3b35aa5256a905195ed6417f7420bd7b901a41a71c01cb234b39b476d8305be"'
+ repoLastModified: Tue, 14 Jan 2025 04:40:46 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -12713,7 +12713,7 @@
Dart implementation to generate (dart) server stubs and client libraries
from OpenAPI 3.0 yaml files.
created: '2020-06-07T12:41:17Z'
- updated: '2024-11-20T17:43:20Z'
+ updated: '2025-01-14T15:53:44Z'
language: Dart
archived: false
stars: 38
@@ -12721,8 +12721,8 @@
forks: 21
owner: hpoul
logo: https://avatars.githubusercontent.com/u/313066?v=4
- repoEtag: '"9bc7f215f25d49f3fa39518ee87904b1f78579a259eb606a016dc759fb1383c7"'
- repoLastModified: Wed, 20 Nov 2024 17:43:20 GMT
+ repoEtag: '"c6256f0ff8e87ae2c5a336a2974ffe05edc35ca51e4c476ecef512db550bf067"'
+ repoLastModified: Tue, 14 Jan 2025 15:53:44 GMT
foundInMaster: true
category: Code Generators
id: ced3cf309aea10ea14f4d94579214646
@@ -12977,7 +12977,7 @@
open-source solution for your open and private data needs. French only for
the time being, internationalization coming soon.
created: '2017-11-24T22:19:00Z'
- updated: '2025-01-13T18:14:39Z'
+ updated: '2025-01-14T16:56:49Z'
language: JavaScript
archived: false
stars: 34
@@ -12986,8 +12986,8 @@
owner: data-fair
logo: https://avatars.githubusercontent.com/u/83776320?v=4
license: AGPL-3.0
- repoEtag: '"7eeb4ab5f00f65bc6f03ceba9b7569662c63b4f3e0a8792e1225138e933cb7c6"'
- repoLastModified: Mon, 13 Jan 2025 18:14:39 GMT
+ repoEtag: '"09388212ccee0400649cdef158b23c4611687dd0b441006de46acedd88612760"'
+ repoLastModified: Tue, 14 Jan 2025 16:56:49 GMT
foundInMaster: true
category:
- Documentation
@@ -13304,17 +13304,17 @@
A community-created collection of configuration, plugins and techniques
for getting the best from Redocly CLI in every situation.
created: '2023-09-28T15:12:02Z'
- updated: '2025-01-12T15:43:02Z'
+ updated: '2025-01-14T06:58:15Z'
language: JavaScript
archived: false
- stars: 30
+ stars: 31
watchers: 15
- forks: 7
+ forks: 6
owner: Redocly
logo: https://avatars.githubusercontent.com/u/32099856?v=4
license: MIT
- repoEtag: '"93d8a1d91ea192673c258deae8e14e717c8db5b7bdeaa6c83fc60dc394dbbf67"'
- repoLastModified: Sun, 12 Jan 2025 15:43:02 GMT
+ repoEtag: '"80d2328cfbfd023d42c55a033bd09383c2ec353b8a84cffdc371c8c7424b7aed"'
+ repoLastModified: Tue, 14 Jan 2025 06:58:15 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -13379,17 +13379,17 @@
repositoryId: 393620909
description: RESTful API for managing a school
created: '2021-08-07T08:06:01Z'
- updated: '2025-01-13T15:08:19Z'
+ updated: '2025-01-14T12:10:26Z'
language: Java
archived: false
- stars: 28
+ stars: 29
watchers: 3
forks: 128
owner: hei-school
logo: https://avatars.githubusercontent.com/u/88576095?v=4
license: MIT
- repoEtag: '"74f63375ea790d5ee999b8806ef0639336b2aaf46e98b0743cbf6d9801e8a7d4"'
- repoLastModified: Mon, 13 Jan 2025 15:08:19 GMT
+ repoEtag: '"2f5b3f00ad4b4edf4d337649f48e43e4a493ab18f5abba3ea690d62ce81e5ab6"'
+ repoLastModified: Tue, 14 Jan 2025 12:10:26 GMT
foundInMaster: true
category: Code Generators
id: bf98240ea893afa32efc180fb73dd5b6
@@ -13819,7 +13819,7 @@
repositoryId: 178213765
description: Generate schema sources for Scala, Java and Elm from an openapi 3.0 spec.
created: '2019-03-28T13:53:17Z'
- updated: '2025-01-13T06:18:58Z'
+ updated: '2025-01-14T06:18:39Z'
language: Scala
archived: false
stars: 23
@@ -13828,8 +13828,8 @@
owner: eikek
logo: https://avatars.githubusercontent.com/u/701128?v=4
license: MIT
- repoEtag: '"dc06ee9bd0eb03f009dac858d608bf3532d5efd13d0ece838c55586aa16e9a87"'
- repoLastModified: Mon, 13 Jan 2025 06:18:58 GMT
+ repoEtag: '"35916360a9d2fe904e3fbb87fbff11b28843cca9d3555fa6856426a073753152"'
+ repoLastModified: Tue, 14 Jan 2025 06:18:39 GMT
foundInMaster: true
category: Parsers
id: c55aff4f35aaeecc6904953f3eb67cb6
@@ -14097,11 +14097,11 @@
archived: false
stars: 22
watchers: 7
- forks: 6
+ forks: 7
owner: zweidenker
logo: https://avatars.githubusercontent.com/u/20300491?v=4
license: MIT
- repoEtag: '"a8f8c7a3cab841f462652607c7227ea2810dad3fc90fa9938a52605342d0865e"'
+ repoEtag: '"06e554ff5f80c240de19d6a0d033c60a7169c4efdc57163fbe29ceaf2d950f00"'
repoLastModified: Sun, 13 Aug 2023 00:57:19 GMT
foundInMaster: true
category:
@@ -14184,7 +14184,7 @@
owner: dkackman
logo: https://avatars.githubusercontent.com/u/5160233?v=4
license: Apache-2.0
- repoEtag: '"49119c33050acbb6a4fb53db55ad387c9b8475e5179c736d8b7ff4092b49232e"'
+ repoEtag: '"40b5c4109cfa50abd682db55dbdb4c18bddaa0f39f09af1a86b5e0f844a0378d"'
repoLastModified: Sat, 11 Jan 2025 02:05:53 GMT
foundInMaster: true
category: Server
@@ -14700,17 +14700,17 @@
extensions. Ready to build performant and cost-efficient APIs on top of
BigQuery or Snowflake for AI Agents and Data Apps
created: '2024-09-29T14:06:01Z'
- updated: '2025-01-12T13:36:56Z'
+ updated: '2025-01-14T20:26:31Z'
language: C++
archived: false
- stars: 20
+ stars: 22
watchers: 3
forks: 2
owner: DataZooDE
logo: https://avatars.githubusercontent.com/u/136052936?v=4
license: Apache-2.0
- repoEtag: '"bf79bcf9e132f2174f7fe2390b47dabd90fb9f27a73b8b82ea649ca86279ea23"'
- repoLastModified: Sun, 12 Jan 2025 13:36:56 GMT
+ repoEtag: '"53f92119bef6db1e09153e0c1ba73fc58b68e0f9fb75b32a7cad489f9d11bbad"'
+ repoLastModified: Tue, 14 Jan 2025 20:26:31 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -14959,16 +14959,16 @@
This project contains the source code of a Spring Boot 3 REST API example
application.
created: '2018-10-25T00:16:09Z'
- updated: '2024-11-26T18:30:39Z'
+ updated: '2025-01-14T21:51:29Z'
language: Java
archived: false
- stars: 17
+ stars: 18
watchers: 1
forks: 11
owner: igor-baiborodine
logo: https://avatars.githubusercontent.com/u/1027701?v=4
- repoEtag: '"0182ac293296d12edb86d37cdff83a64926f4766b201096e22087800e1aa6a11"'
- repoLastModified: Tue, 26 Nov 2024 18:30:39 GMT
+ repoEtag: '"218a49e34d5b0b9cf51a89a7177604ce7554dca9501e4cec4e7a63edbc15c0b7"'
+ repoLastModified: Tue, 14 Jan 2025 21:51:29 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -15465,7 +15465,7 @@
owner: vymalo
logo: https://avatars.githubusercontent.com/u/128943481?v=4
license: MIT
- repoEtag: '"fde95377bd922c91e8d06fa81d1dc2ec3a92b94caaa0a0f2865388ecac3fe6f8"'
+ repoEtag: '"bc695124e3157c92ee05a8994dfcd40c3a0c578b4d6efe51999ad94367d00ba3"'
repoLastModified: Tue, 24 Dec 2024 12:53:59 GMT
category: Server Implementations
oldLocations:
@@ -15591,7 +15591,7 @@
owner: apiaddicts
logo: https://avatars.githubusercontent.com/u/31730093?v=4
license: NOASSERTION
- repoEtag: '"4b0ba821d383bc3c8b68decc1cdab27cc636fb1711eb8233679098daf464040e"'
+ repoEtag: '"1bd4afd0c04b91c0ec0f041b8faae7da66e196d2fb2c6e2f45b053b0c532c3aa"'
repoLastModified: Mon, 30 Dec 2024 17:39:01 GMT
category: Server Implementations
foundInMaster: true
@@ -16678,7 +16678,7 @@
forks: 0
owner: responsibleapi
logo: https://avatars.githubusercontent.com/u/119290467?v=4
- repoEtag: '"cfb6edbd329e7c175c3aeab569780c7fe7bde0f038c44f5a0379105c448d1183"'
+ repoEtag: '"110fa852d0799594c1614a94264fab8d2aeeaa07e00aa3bb8f36168c6ad2fe1d"'
repoLastModified: Thu, 09 Jan 2025 00:40:40 GMT
category: Parsers
foundInMaster: true
@@ -18417,7 +18417,7 @@
repositoryId: 318430456
description: The OpenAPI specifications for the Apideck APIs.
created: '2020-12-04T06:55:12Z'
- updated: '2025-01-13T10:19:13Z'
+ updated: '2025-01-14T14:34:44Z'
language: null
archived: false
stars: 7
@@ -18426,8 +18426,8 @@
owner: apideck-libraries
logo: https://avatars.githubusercontent.com/u/73573473?v=4
license: MIT
- repoEtag: '"582383eb9af10b48bd70b561fe6eaef9c39457f23cda9a0556b7531a2760ff4a"'
- repoLastModified: Mon, 13 Jan 2025 10:19:13 GMT
+ repoEtag: '"858ea54fd0bb9008e43b807dd1e14147365997ec6b3758b0cf0a1e2b1bcd73be"'
+ repoLastModified: Tue, 14 Jan 2025 14:34:44 GMT
foundInMaster: true
category:
- Testing
@@ -18622,17 +18622,17 @@
repositoryId: 886914571
description: AI-Copilot for OpenAPI Description Documents
created: '2024-11-11T20:49:34Z'
- updated: '2025-01-13T01:23:07Z'
+ updated: '2025-01-14T18:01:17Z'
language: TypeScript
archived: false
- stars: 6
+ stars: 5
watchers: 1
forks: 0
owner: LLM-Studios
logo: https://avatars.githubusercontent.com/u/151792168?v=4
license: MIT
- repoEtag: '"0d35a854bb999bec2c0331c72e511437b05e03a46cc0c6c58a2c71e46394513e"'
- repoLastModified: Mon, 13 Jan 2025 01:23:07 GMT
+ repoEtag: '"f03e3e7bc2c78ba265dd53283a6b3e886d75fc6d932c7e135866e932e28b3829"'
+ repoLastModified: Tue, 14 Jan 2025 18:01:17 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -19662,16 +19662,16 @@
API documentation boilerplate for redoc (OpenAPI) with some extra features
like automatically generated postman collection.
created: '2024-08-23T15:47:58Z'
- updated: '2025-01-06T07:35:05Z'
+ updated: '2025-01-14T13:41:46Z'
language: TypeScript
archived: false
- stars: 5
+ stars: 6
watchers: 1
forks: 0
owner: HasanQQ
logo: https://avatars.githubusercontent.com/u/44672191?v=4
- repoEtag: '"1d19ab6188bab05f776e79593bc486df43beb7bbf3aec1090ae8d5302e28d043"'
- repoLastModified: Mon, 06 Jan 2025 07:35:05 GMT
+ repoEtag: '"92595015c8d5f83aefc066098fb7271587c375212dbd9b6ceba73eb618221185"'
+ repoLastModified: Tue, 14 Jan 2025 13:41:46 GMT
category: Server Implementations
foundInMaster: true
v3: true
@@ -20000,11 +20000,11 @@
archived: false
stars: 5
watchers: 2
- forks: 3
+ forks: 4
owner: Gichure
logo: https://avatars.githubusercontent.com/u/6824034?v=4
license: MIT
- repoEtag: '"9dd3c6f770cd6d8d2fff69ea05e6576a7863e25213543e665d0808bb080d30d2"'
+ repoEtag: '"1c4420f2e634e3f1291494bab7895f27510a4f6c4542bdf35a8a4eed0ac06308"'
repoLastModified: Wed, 08 Jan 2025 09:44:46 GMT
category: Server Implementations
foundInMaster: true
@@ -20614,7 +20614,7 @@
owner: swaggerexpert
logo: https://avatars.githubusercontent.com/u/172408630?v=4
license: Apache-2.0
- repoEtag: '"518fbda1e2a44d673ca6e7cf997470680d8895e9161e9752a4fffff2d64beb2c"'
+ repoEtag: '"e2eab9483a8daa0153512a3a65218565c36ee017e67ef7a13a23d04f6c1a8642"'
repoLastModified: Tue, 31 Dec 2024 07:40:12 GMT
category: Parsers
foundInMaster: true
@@ -21295,7 +21295,7 @@
Membrane is a general purpose input validation library, supports both PHP
Attributes and OpenAPI specifications
created: '2022-04-24T12:10:16Z'
- updated: '2025-01-10T15:36:39Z'
+ updated: '2025-01-14T12:57:30Z'
language: PHP
archived: false
stars: 4
@@ -21304,8 +21304,8 @@
owner: membrane-php
logo: https://avatars.githubusercontent.com/u/104306108?v=4
license: NOASSERTION
- repoEtag: '"794d08f7bfa64fb5a04c4a9aaa2a8f0db416a5c3165f69a51330fb5f27b2a806"'
- repoLastModified: Fri, 10 Jan 2025 15:36:39 GMT
+ repoEtag: '"d606eb1233659314d6cdfdb25b48aacb65493c65cd7d70978c68a35789810943"'
+ repoLastModified: Tue, 14 Jan 2025 12:57:30 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -21482,7 +21482,7 @@
repositoryId: 853046067
description: Generate Java Records from OpenAPI Specifications
created: '2024-09-05T22:21:02Z'
- updated: '2025-01-09T21:49:37Z'
+ updated: '2025-01-14T22:30:34Z'
language: Java
archived: false
stars: 3
@@ -21491,8 +21491,8 @@
owner: Chrimle
logo: https://avatars.githubusercontent.com/u/28791817?v=4
license: Apache-2.0
- repoEtag: '"c9133b58e0236f70a5d599632193d2aaf162bb325757e34621c9e0d73db2e13e"'
- repoLastModified: Thu, 09 Jan 2025 21:49:37 GMT
+ repoEtag: '"3a7c22a978c56bc8df3f77bff68039aa102bbb5dc1e00cdf0042d51fff0cc892"'
+ repoLastModified: Tue, 14 Jan 2025 22:30:34 GMT
category: Parsers
foundInMaster: true
- source:
@@ -22412,17 +22412,17 @@
Client SDK code generator to convert OpenApi v3 specifications into TS
endpoint caller functions with Zod types.
created: '2024-02-26T16:38:59Z'
- updated: '2024-12-18T05:35:33Z'
+ updated: '2025-01-14T16:23:30Z'
language: TypeScript
archived: false
- stars: 3
+ stars: 4
watchers: 1
forks: 0
owner: inkognitro
logo: https://avatars.githubusercontent.com/u/22317587?v=4
license: MIT
- repoEtag: '"e5477ac793d41a93fbc855a1a5bd95a43b54bc7308b9f28e7d26fcb78cca8a54"'
- repoLastModified: Wed, 18 Dec 2024 05:35:33 GMT
+ repoEtag: '"a30377e47ea764d83933c89975f42a95d2725d7d34d17009cddda070952ed46d"'
+ repoLastModified: Tue, 14 Jan 2025 16:23:30 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -24363,7 +24363,7 @@
repositoryId: 115034680
description: OpenAPI Specifications for WarframeStat.us API
created: '2017-12-21T18:21:32Z'
- updated: '2025-01-13T16:30:06Z'
+ updated: '2025-01-15T00:38:36Z'
language: CSS
archived: false
stars: 2
@@ -24372,8 +24372,8 @@
owner: WFCD
logo: https://avatars.githubusercontent.com/u/24436369?v=4
license: MIT
- repoEtag: '"d9edd68a66df5ba98010631bb24bca7cfcda7f1b478fda65ffc6277dc5de75c0"'
- repoLastModified: Mon, 13 Jan 2025 16:30:06 GMT
+ repoEtag: '"69003344bdf7721986d4c5de8accf1c8755b30c920e7b3965516eacfed01263d"'
+ repoLastModified: Wed, 15 Jan 2025 00:38:36 GMT
foundInMaster: true
category:
- Description Validators
@@ -26196,7 +26196,7 @@
Models for the analysis requests to listen.dev and the consequent verdicts
responses
created: '2023-07-11T11:39:58Z'
- updated: '2025-01-09T15:56:18Z'
+ updated: '2025-01-14T21:57:20Z'
language: Go
archived: false
stars: 1
@@ -26205,8 +26205,8 @@
owner: listendev
logo: https://avatars.githubusercontent.com/u/103680976?v=4
license: Apache-2.0
- repoEtag: '"71d705b4ff14700426e024dfd25609b51f196918581f52add1da7c23aedfdf7b"'
- repoLastModified: Thu, 09 Jan 2025 15:56:18 GMT
+ repoEtag: '"59d36e021fcea08c720f18b51c1c9a6009504cc065ae0f9be79beb353e9ed79a"'
+ repoLastModified: Tue, 14 Jan 2025 21:57:20 GMT
category: Parsers
foundInMaster: true
- source:
@@ -30686,13 +30686,13 @@
id: 78fd9e63b8ce0aabb3f592921ea83c75
repositoryMetadata:
base64Readme: >-
- IyBaZXJvdG9wcm9kXERhdGFNb2RlbE9wZW5hcGkzMAoKIVtdKC4vYXJ0L2xvZ28ucG5nKQoKWyFbUmVwb10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9naXRodWItZ3JheT9sb2dvPWdpdGh1YildKGh0dHBzOi8vZ2l0aHViLmNvbS96ZXJvLXRvLXByb2QvZGF0YS1tb2RlbC1vcGVuYXBpMzApClshW0dpdEh1YiBBY3Rpb25zIFdvcmtmbG93IFN0YXR1c10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9naXRodWIvYWN0aW9ucy93b3JrZmxvdy9zdGF0dXMvemVyby10by1wcm9kL2RhdGEtbW9kZWwtb3BlbmFwaTMwL3Rlc3QueW1sP2xhYmVsPXRlc3RzKV0oaHR0cHM6Ly9naXRodWIuY29tL3plcm8tdG8tcHJvZC9kYXRhLW1vZGVsLW9wZW5hcGkzMC9hY3Rpb25zKQpbIVtQYWNrYWdpc3QgRG93bmxvYWRzXShodHRwczovL2ltZy5zaGllbGRzLmlvL3BhY2thZ2lzdC9kdC96ZXJvLXRvLXByb2QvZGF0YS1tb2RlbC1vcGVuYXBpMzA/Y29sb3I9Ymx1ZSldKGh0dHBzOi8vcGFja2FnaXN0Lm9yZy9wYWNrYWdlcy96ZXJvLXRvLXByb2QvZGF0YS1tb2RlbC1vcGVuYXBpMzAvc3RhdHMpClshW1BhY2thZ2lzdCBWZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL3BhY2thZ2lzdC92L3plcm8tdG8tcHJvZC9kYXRhLW1vZGVsLW9wZW5hcGkzMD9jb2xvcj1mMjhkMWEpXShodHRwczovL3BhY2thZ2lzdC5vcmcvcGFja2FnZXMvemVyby10by1wcm9kL2RhdGEtbW9kZWwtb3BlbmFwaTMwKQpbIVtMaWNlbnNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL3BhY2thZ2lzdC9sL3plcm8tdG8tcHJvZC9kYXRhLW1vZGVsLW9wZW5hcGkzMD9jb2xvcj1yZWQpXShodHRwczovL2dpdGh1Yi5jb20vemVyby10by1wcm9kL2RhdGEtbW9kZWwtb3BlbmFwaTMwL2Jsb2IvbWFpbi9MSUNFTlNFLm1kKQpbIVt3YWthdGltZV0oaHR0cHM6Ly93YWthdGltZS5jb20vYmFkZ2UvZ2l0aHViL3plcm8tdG8tcHJvZC9kYXRhLW1vZGVsLW9wZW5hcGkzMC5zdmcpXShodHRwczovL3dha2F0aW1lLmNvbS9iYWRnZS9naXRodWIvemVyby10by1wcm9kL2RhdGEtbW9kZWwtb3BlbmFwaTMwKQpbIVtIaXRzLW9mLUNvZGVdKGh0dHBzOi8vaGl0c29mY29kZS5jb20vZ2l0aHViL3plcm8tdG8tcHJvZC9kYXRhLW1vZGVsLW9wZW5hcGkzMD9icmFuY2g9bWFpbildKGh0dHBzOi8vaGl0c29mY29kZS5jb20vZ2l0aHViL3plcm8tdG8tcHJvZC9kYXRhLW1vZGVsLW9wZW5hcGkzMC92aWV3P2JyYW5jaD1tYWluKQoKIyMgQ29udGVudHMKCi0gW0ludHJvZHVjdGlvbl0oI2ludHJvZHVjdGlvbikKLSBbUmVxdWlyZW1lbnRzXSgjcmVxdWlyZW1lbnRzKQotIFtJbnN0YWxsYXRpb25dKCNpbnN0YWxsYXRpb24pCi0gW1VzYWdlXSgjdXNhZ2UpCi0gW0xvY2FsIERldmVsb3BtZW50XSgjbG9jYWwtZGV2ZWxvcG1lbnQpCiAgICAtIFtQcmVyZXF1aXNpdGVzXSgjcHJlcmVxdWlzaXRlcykKICAgIC0gW0luaXRpYWxpemluZ10oI2luaXRpYWxpemluZykKICAgIC0gW1Rlc3RpbmddKCN0ZXN0aW5nKQogICAgLSBbQ29uZmlndXJhdGlvbl0oI2NvbmZpZ3VyYXRpb24pCi0gW0NvbnRyaWJ1dGluZ10oI2NvbnRyaWJ1dGluZykKCiMjIEludHJvZHVjdGlvbgoKRGF0YU1vZGVscyBmb3IgT3BlbkFQSSAzLjAuKiBbc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwpLgoKIyMgUmVxdWlyZW1lbnRzCgotIFBIUCA4LjEgb3IgaGlnaGVyLgoKIyMgSW5zdGFsbGF0aW9uCgpJbnN0YWxsIGBaZXJvdG9wcm9kXERhdGFNb2RlbE9wZW5hcGkzMGAgdmlhIFtDb21wb3Nlcl0oaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvKToKCmBgYHNoZWxsCmNvbXBvc2VyIHJlcXVpcmUgemVyby10by1wcm9kL2RhdGEtbW9kZWwtb3BlbmFwaTMwCmBgYAoKVGhpcyB3aWxsIGFkZCB0aGUgcGFja2FnZSB0byB5b3VyIHByb2plY3TigJlzIGRlcGVuZGVuY2llcyBhbmQgY3JlYXRlIGFuIGF1dG9sb2FkZXIgZW50cnkgZm9yIGl0LgoKIyMgVXNhZ2UKCmBgYHBocAp1c2UgWmVyb3RvcHJvZFxEYXRhTW9kZWxPcGVuYXBpMzBcT3BlbkFwaTsKCiRPcGVuQXBpID0gT3BlbkFwaTo6ZnJvbShqc29uX2RlY29kZSgkanNvbiwgdHJ1ZSkpOwoKJE9wZW5BcGktPmNvbXBvbmVudHMtPnNjaGVtYXNbJ3BldCddLT5kZXNjcmlwdGlvbjsKYGBgCgojIyBUZXN0aW5nCgpgYGBzaGVsbAouL3ZlbmRvci9iaW4vcGhwdW5pdApgYGAKCiMjIEFjY2VwdGFuY2UgVGVzdHMKCnwgVGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IFs0LjcuMi4yIEluZm8gT2JqZWN0IEV4YW1wbGVdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2luZm8tb2JqZWN0LWV4YW1wbGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgWzQuNy4zLjIgQ29udGFjdCBPYmplY3QgRXhhbXBsZV0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjY29udGFjdC1vYmplY3QtZXhhbXBsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBbNC43LjQuMiBMaWNlbnNlIE9iamVjdCBFeGFtcGxlXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNsaWNlbnNlLW9iamVjdC1leGFtcGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IFs0LjcuNS4yIFNlcnZlciBPYmplY3QgRXhhbXBsZV0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjc2VydmVyLW9iamVjdC1leGFtcGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgWzQuNy43LjIgQ29tcG9uZW50cyBPYmplY3QgRXhhbXBsZV0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjY29tcG9uZW50cy1vYmplY3QtZXhhbXBsZSkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBbNC43LjguMyBQYXRocyBPYmplY3QgRXhhbXBsZV0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjcGF0aHMtb2JqZWN0LWV4YW1wbGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IFs0LjcuOS4yIFBhdGggSXRlbSBPYmplY3QgRXhhbXBsZV0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjcGF0aC1pdGVtLW9iamVjdC1leGFtcGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgWzQuNy4xMC4yIE9wZXJhdGlvbiBPYmplY3QgRXhhbXBsZV0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjb3BlcmF0aW9uLW9iamVjdC1leGFtcGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBbNC43LjExLjIgRXh0ZXJuYWwgRG9jdW1lbnRhdGlvbiBPYmplY3QgRXhhbXBsZV0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZXh0ZXJuYWwtZG9jdW1lbnRhdGlvbi1vYmplY3QtZXhhbXBsZSkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IFs0LjcuMTIuNSBQYXJhbWV0ZXIgT2JqZWN0IEV4YW1wbGVzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNwYXJhbWV0ZXItb2JqZWN0LWV4YW1wbGVzKSAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgWzQuNy4xMy4yIFJlcXVlc3QgQm9keSBFeGFtcGxlc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjcmVxdWVzdC1ib2R5LWV4YW1wbGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBbNC43LjE0LjIgTWVkaWEgVHlwZSBFeGFtcGxlc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjbWVkaWEtdHlwZS1leGFtcGxlcy0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMgUHJvcGVydGllcwoKIyBbNC4wIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3NwZWNpZmljYXRpb24pCgojIyBbNC43IFNjaGVtYV0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjc2NoZW1hLTApCgpUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIE9wZW5BUEkgRGVzY3JpcHRpb24gZm9ybWF0CgojIyMgWzQuNy4xIE9wZW5BUEkgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNvcGVuYXBpLW9iamVjdCkKClRoaXMgaXMgdGhlIHJvb3Qgb2JqZWN0IG9mIHRoZSBPcGVuQVBJIERlc2NyaXB0aW9uLgoKIyMjIyBbNC43LjEuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcykKCnwgRmllbGQgTmFtZSAgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18Cnwgb3BlbmFwaSAgICAgIHwgW2BzdHJpbmdgXShzcmMvT3BlbkFwaS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgaW5mbyAgICAgICAgIHwgW2BJbmZvIE9iamVjdGBdKHNyYy9JbmZvLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgc2VydmVycyAgICAgIHwgW2BbU2VydmVyIE9iamVjdF1gXShzcmMvU2VydmVyLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgcGF0aHMgICAgICAgIHwgW2BQYXRocyBPYmplY3RgXShzcmMvUGF0aEl0ZW0ucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgY29tcG9uZW50cyAgIHwgW2BDb21wb25lbnRzIE9iamVjdGBdKHNyYy9Db21wb25lbnRzLnBocCkgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgc2VjdXJpdHkgICAgIHwgW2BTZWN1cml0eSBSZXF1aXJlbWVudCBPYmplY3RgXShzcmMvT3BlbkFwaS5waHApICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgdGFncyAgICAgICAgIHwgW1tgVGFnIE9iamVjdGBdKHNyYy9UYWcucGhwKV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZXh0ZXJuYWxEb2NzIHwgW2BFeHRlcm5hbCBEb2N1bWVudGF0aW9uIE9iamVjdGBdKHNyYy9FeHRlcm5hbERvY3VtZW50YXRpb24ucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy4yIEluZm8gT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNpbmZvLW9iamVjdCkKClRoZSBvYmplY3QgcHJvdmlkZXMgbWV0YWRhdGEgYWJvdXQgdGhlIEFQSS4KCiMjIyMgWzQuNy4yLjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtMCkKCnwgRmllbGQgTmFtZSAgICAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgdGl0bGUgICAgICAgICAgfCBbYHN0cmluZ2BdKHNyYy9JbmZvLnBocCkgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVzY3JpcHRpb24gICAgfCBbYHN0cmluZ2BdKHNyYy9JbmZvLnBocCkgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgdGVybXNPZlNlcnZpY2UgfCBbYHN0cmluZ2BdKHNyYy9JbmZvLnBocCkgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgY29udGFjdCAgICAgICAgfCBbYENvbnRhY3QgT2JqZWN0YF0oc3JjL0NvbnRhY3QucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgbGljZW5zZSAgICAgICAgfCBbYExpY2Vuc2UgT2JqZWN0YF0oc3JjL0xpY2Vuc2UucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgdmVyc2lvbiAgICAgICAgfCBbYHN0cmluZ2BdKHNyYy9JbmZvLnBocCkgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy4zIENvbnRhY3QgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNjb250YWN0LW9iamVjdCkKCkNvbnRhY3QgaW5mb3JtYXRpb24gZm9yIHRoZSBleHBvc2VkIEFQSS4KCiMjIyMgWzQuNy4zLjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtMSkKCnwgRmllbGQgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBuYW1lICB8IFtgc3RyaW5nYF0oc3JjL0NvbnRhY3QucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgdXJsICAgfCBbYHN0cmluZ2BdKHNyYy9Db250YWN0LnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGVtYWlsIHwgW2BlbWFpbGBdKHNyYy9Db250YWN0LnBocCkgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjQgTGljZW5zZSBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2xpY2Vuc2Utb2JqZWN0KQoKTGljZW5zZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGV4cG9zZWQgQVBJLgoKIyMjIyBbNC43LjQuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy0yKQoKfCBGaWVsZCB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IG5hbWUgIHwgW2BzdHJpbmdgXShzcmMvTGljZW5zZS5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCB1cmwgICB8IFtgc3RyaW5nYF0oc3JjL0xpY2Vuc2UucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy41IFNlcnZlciBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3NlcnZlci1vYmplY3QpCgpBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgU2VydmVyLgoKIyMjIyBbNC43LjUuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy0zKQoKfCBGaWVsZCBOYW1lICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCB1cmwgICAgICAgICB8IFtgc3RyaW5nYF0oc3JjL1NlcnZlci5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBkZXNjcmlwdGlvbiB8IFtgc3RyaW5nYF0oc3JjL1NlcnZlci5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCB2YXJpYWJsZXMgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9TZXJ2ZXIucGhwKSwgW2BTZXJ2ZXIgVmFyaWFibGUgT2JqZWN0YF0oc3JjL1NlcnZlclZhcmlhYmxlLnBocCldIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjYgU2VydmVyIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjc2VydmVyLXZhcmlhYmxlLW9iamVjdCkKCkFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBTZXJ2ZXIgVmFyaWFibGUgZm9yIHNlcnZlciBVUkwgdGVtcGxhdGUgc3Vic3RpdHV0aW9uLgoKIyMjIyBbNC43LjYuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy00KQoKfCBGaWVsZCBOYW1lICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IGVudW0gICAgICAgIHwgW1tgc3RyaW5nYF1dKHNyYy9TZXJ2ZXJWYXJpYWJsZS5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBkZWZhdWx0ICAgICB8IFtgc3RyaW5nYF0oc3JjL1NlcnZlclZhcmlhYmxlLnBocCkgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVzY3JpcHRpb24gfCBbYHN0cmluZ2BdKHNyYy9TZXJ2ZXJWYXJpYWJsZS5waHApICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuNyBDb21wb25lbnRzIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjY29tcG9uZW50cy1vYmplY3QpCgpIb2xkcyBhIHNldCBvZiByZXVzYWJsZSBvYmplY3RzIGZvciBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUgT0FTLgoKIyMjIFs0LjcuNy4xIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLTUpCgp8IEZpZWxkIE5hbWUgICAgICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IHNjaGVtYXMgICAgICAgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9Db21wb25lbnRzLnBocCksIFtgU2NoZW1hIE9iamVjdGBdKHNyYy9TY2hlbWEucGhwKSBcfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCldICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHJlc3BvbnNlcyAgICAgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9Db21wb25lbnRzLnBocCksIFtgUmVzcG9uc2UgT2JqZWN0YF0oc3JjL1Jlc3BvbnNlLnBocCkgXHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApXSAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHBhcmFtZXRlcnMgICAgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9Db21wb25lbnRzLnBocCksIFtgUGFyYW1ldGVyIE9iamVjdGBdKHNyYy9QYXJhbWV0ZXIucGhwKSBcfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCldICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGV4YW1wbGVzICAgICAgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9Db21wb25lbnRzLnBocCksIFtgRXhhbXBsZSBPYmplY3RgXShzcmMvRXhhbXBsZS5waHApIFx8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKV0gICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHJlcXVlc3RCb2RpZXMgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9Db21wb25lbnRzLnBocCksIFtgUmVxdWVzdCBCb2R5IE9iamVjdGBdKHNyYy9SZXF1ZXN0Qm9keS5waHApIFx8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKV0gICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGhlYWRlcnMgICAgICAgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9Db21wb25lbnRzLnBocCksIFtgSGVhZGVyIE9iamVjdGBdKHNyYy9IZWFkZXIucGhwKSBcfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCldICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHNlY3VyaXR5U2NoZW1lcyB8IE1hcFtbYHN0cmluZ2BdKHNyYy9Db21wb25lbnRzLnBocCksIFtgU2VjdXJpdHkgU2NoZW1lIE9iamVjdGBdKHNyYy9TZWN1cml0eVNjaGVtZS5waHApIFx8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKV0gfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGxpbmtzICAgICAgICAgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9Db21wb25lbnRzLnBocCksIFtgTGluayBPYmplY3RgXShzcmMvTGluay5waHApIFx8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKV0gICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGNhbGxiYWNrcyAgICAgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9Db21wb25lbnRzLnBocCksIFtgQ2FsbGJhY2sgT2JqZWN0YF0oc3JjL1BhdGhJdGVtLnBocCkgXHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApXSAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuOCBQYXRocyBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3BhdGhzLW9iamVjdCkKCkhvbGRzIHRoZSByZWxhdGl2ZSBwYXRocyB0byB0aGUgaW5kaXZpZHVhbCBlbmRwb2ludHMgYW5kIHRoZWlyIG9wZXJhdGlvbnMuCgojIyMjIFs0LjcuOC4xIFBhdHRlcm5lZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3BhdHRlcm5lZC1maWVsZHMpCgp8IEZpZWxkIE5hbWUgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IC97cGF0aH0gICAgfCBbUGF0aCBJdGVtIE9iamVjdF0oc3JjL1BhdGhJdGVtLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuOSBQYXRoIEl0ZW0gT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNwYXRoLWl0ZW0tb2JqZWN0KQoKRGVzY3JpYmVzIHRoZSBvcGVyYXRpb25zIGF2YWlsYWJsZSBvbiBhIHNpbmdsZSBwYXRoLgoKIyMjIyBbNC43LjkuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy02KQoKfCBGaWVsZCBOYW1lICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8ICRyZWYgICAgICAgIHwgW2BzdHJpbmdgXShzcmMvUGF0aEl0ZW0ucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBzdW1tYXJ5ICAgICB8IFtgc3RyaW5nYF0oc3JjL1BhdGhJdGVtLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVzY3JpcHRpb24gfCBbYHN0cmluZ2BdKHNyYy9QYXRoSXRlbS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGdldCAgICAgICAgIHwgW2BPcGVyYXRpb24gT2JqZWN0YF0oc3JjL09wZXJhdGlvbi5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBwdXQgICAgICAgICB8IFtgT3BlcmF0aW9uIE9iamVjdGBdKHNyYy9PcGVyYXRpb24ucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgcG9zdCAgICAgICAgfCBbYE9wZXJhdGlvbiBPYmplY3RgXShzcmMvT3BlcmF0aW9uLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGRlbGV0ZSAgICAgIHwgW2BPcGVyYXRpb24gT2JqZWN0YF0oc3JjL09wZXJhdGlvbi5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBvcHRpb25zICAgICB8IFtgT3BlcmF0aW9uIE9iamVjdGBdKHNyYy9PcGVyYXRpb24ucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgaGVhZCAgICAgICAgfCBbYE9wZXJhdGlvbiBPYmplY3RgXShzcmMvT3BlcmF0aW9uLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHBhdGNoICAgICAgIHwgW2BPcGVyYXRpb24gT2JqZWN0YF0oc3JjL09wZXJhdGlvbi5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCB0cmFjZSAgICAgICB8IFtgT3BlcmF0aW9uIE9iamVjdGBdKHNyYy9PcGVyYXRpb24ucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgc2VydmVycyAgICAgfCBbYFNlcnZlciBPYmplY3RgXShzcmMvU2VydmVyLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHBhcmFtZXRlcnMgIHwgW1tgUGFyYW1ldGVyIE9iamVjdGBdKHNyYy9QYXJhbWV0ZXIucGhwKSBcfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCldIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjEwIE9wZXJhdGlvbiBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI29wZXJhdGlvbi1vYmplY3QpCgpEZXNjcmliZXMgYSBzaW5nbGUgQVBJIG9wZXJhdGlvbiBvbiBhIHBhdGguCgojIyMjIFs0LjcuMTAuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy03KQoKfCBGaWVsZCBOYW1lICAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IHRhZ3MgICAgICAgICB8IFtbYHN0cmluZ2BdXShzcmMvT3BlcmF0aW9uLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBzdW1tYXJ5ICAgICAgfCBbYHN0cmluZ2BdKHNyYy9PcGVyYXRpb24ucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVzY3JpcHRpb24gIHwgW2BzdHJpbmdgXShzcmMvT3BlcmF0aW9uLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGV4dGVybmFsRG9jcyB8IFtgRXh0ZXJuYWwgRG9jdW1lbnRhdGlvbiBPYmplY3RgXShzcmMvRXh0ZXJuYWxEb2N1bWVudGF0aW9uLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBvcGVyYXRpb25JZCAgfCBbYHN0cmluZ2BdKHNyYy9PcGVyYXRpb24ucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgcGFyYW1ldGVycyAgIHwgW1tgUGFyYW1ldGVyIE9iamVjdGBdKHNyYy9QYXJhbWV0ZXIucGhwKSBcfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHJlcXVlc3RCb2R5ICB8IFtgUmVxdWVzdCBCb2R5IE9iamVjdGBdKHNyYy9SZXF1ZXN0Qm9keS5waHApIFx8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCByZXNwb25zZXMgICAgfCBbYFJlc3BvbnNlcyBPYmplY3RgXShzcmMvUmVzcG9uc2UucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgY2FsbGJhY2tzICAgIHwgTWFwW1tgc3RyaW5nYF0oc3JjL09wZXJhdGlvbi5waHApLCBbYENhbGxiYWNrIE9iamVjdGBdKHNyYy9QYXRoSXRlbS5waHApIFx8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKV0gfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGRlcHJlY2F0ZWQgICB8IFtgYm9vbGVhbmBdKHNyYy9PcGVyYXRpb24ucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBzZWN1cml0eSAgICAgfCBbYFNlY3VyaXR5IFJlcXVpcmVtZW50IE9iamVjdGBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgc2VydmVycyAgICAgIHwgW1tgU2VydmVyIE9iamVjdGBdXShzcmMvU2VydmVyLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMTEgRXh0ZXJuYWwgRG9jdW1lbnRhdGlvbiBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2V4dGVybmFsLWRvY3VtZW50YXRpb24tb2JqZWN0KQoKQWxsb3dzIHJlZmVyZW5jaW5nIGFuIGV4dGVybmFsIHJlc291cmNlIGZvciBleHRlbmRlZCBkb2N1bWVudGF0aW9uLgoKIyMjIyBbNC43LjExLjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtOCkKCnwgRmllbGQgTmFtZSAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgZGVzY3JpcHRpb24gfCBbYHN0cmluZ2BdKHNyYy9FeHRlcm5hbERvY3VtZW50YXRpb24ucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgdXJsICAgICAgICAgfCBbYHN0cmluZ2BdKHNyYy9FeHRlcm5hbERvY3VtZW50YXRpb24ucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy4xMiBQYXJhbWV0ZXIgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNwYXJhbWV0ZXItb2JqZWN0KQoKRGVzY3JpYmVzIGEgc2luZ2xlIG9wZXJhdGlvbiBwYXJhbWV0ZXIuCgojIyMjIFs0LjcuMTIuMiBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy05KQoKVGhlIHJ1bGVzIGZvciBzZXJpYWxpemF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIgYXJlIHNwZWNpZmllZCBpbiBvbmUgb2YgdHdvIHdheXMuIFBhcmFtZXRlciBPYmplY3RzIF9NVVNUXyBpbmNsdWRlIGVpdGhlciBhIGBjb250ZW50YCBmaWVsZCBvciBhIGBzY2hlbWFgCmZpZWxkLCBidXQgbm90IGJvdGguCgojIyMjIyBbNC43LjEyLjIuMSBDb21tb24gRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNjb21tb24tZml4ZWQtZmllbGRzKQoKVGhlc2UgZmllbGRzIF9NQVlfIGJlIHVzZWQgd2l0aCBlaXRoZXIgYGNvbnRlbnRgIG9yIGBzY2hlbWFgLgoKfCBGaWVsZCBOYW1lICAgICAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IG5hbWUgICAgICAgICAgICB8IFtgc3RyaW5nYF0oc3JjL1BhcmFtZXRlci5waHApICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBpbiAgICAgICAgICAgICAgfCBbYHN0cmluZ2BdKHNyYy9QYXJhbWV0ZXIucGhwKSAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVzY3JpcHRpb24gICAgIHwgW2BzdHJpbmdgXShzcmMvUGFyYW1ldGVyLnBocCkgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHJlcXVpcmVkICAgICAgICB8IFtgYm9vbGVhbmBdKHNyYy9QYXJhbWV0ZXIucGhwKSAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBkZXByZWNhdGVkICAgICAgfCBbYGJvb2xlYW5gXShzcmMvUGFyYW1ldGVyLnBocCkgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgYWxsb3dFbXB0eVZhbHVlIHwgW1tgYm9vbGVhbmBdXShzcmMvUGFyYW1ldGVyLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIyMgWzQuNy4xMi4yLjIgRml4ZWQgRmllbGRzIGZvciB1c2Ugd2l0aCBgc2NoZW1hYF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLWZvci11c2Utd2l0aC1zY2hlbWEpCgpGb3Igc2ltcGxlciBzY2VuYXJpb3MsIGEgYHNjaGVtYWAgYW5kIGBzdHlsZWAgY2FuIGRlc2NyaWJlIHRoZSBzdHJ1Y3R1cmUgYW5kIHN5bnRheCBvZiB0aGUgcGFyYW1ldGVyLgoKfCBGaWVsZCBOYW1lICAgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IHN0eWxlICAgICAgICAgfCBbYHN0cmluZ2BdKHNyYy9QYXJhbWV0ZXIucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBleHBsb2RlICAgICAgIHwgW2Bib29sZWFuYF0oc3JjL1BhcmFtZXRlci5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgYWxsb3dSZXNlcnZlZCB8IFtgYm9vbGVhbmBdKHNyYy9QYXJhbWV0ZXIucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHNjaGVtYSAgICAgICAgfCBbYFNjaGVtYSBPYmplY3RgXShzcmMvU2NoZW1hLnBocCkgXHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBleGFtcGxlICAgICAgIHwgW0FueV0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZXhhbXBsZXMgICAgICB8IE1hcFsgW2BzdHJpbmdgXShzcmMvU2NoZW1hLnBocCksIFtgRXhhbXBsZSBPYmplY3RgXShzcmMvRXhhbXBsZS5waHApIFx8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKV0gfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIyMgWzQuNy4xMi4yLjMgRml4ZWQgRmllbGRzIGZvciB1c2Ugd2l0aCBgY29udGVudGBdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy1mb3ItdXNlLXdpdGgtY29udGVudCkKCnwgRmllbGQgTmFtZSB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBjb250ZW50ICAgIHwgTWFwW1tgc3RyaW5nYF0oc3JjL1NjaGVtYS5waHApLCBbYE1lZGlhIFR5cGUgT2JqZWN0YF0oc3JjL1NjaGVtYS5waHApXSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy4xMyBSZXF1ZXN0IEJvZHkgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNyZXF1ZXN0LWJvZHktb2JqZWN0KQoKRGVzY3JpYmVzIGEgc2luZ2xlIHJlcXVlc3QgYm9keS4KCiMjIyMgWzQuNy4xMy4xIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLTEwKQoKfCBGaWVsZCBOYW1lICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IGRlc2NyaXB0aW9uIHwgW2BzdHJpbmdgXShzcmMvUmVxdWVzdEJvZHkucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBjb250ZW50ICAgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9SZXF1ZXN0Qm9keS5waHApLCBbYE1lZGlhIFR5cGUgT2JqZWN0YF0oc3JjL01lZGlhVHlwZS5waHApXSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgcmVxdWlyZWQgICAgfCBbYGJvb2xlYW5gXShzcmMvUmVxdWVzdEJvZHkucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMTQgTWVkaWEgVHlwZSBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI21lZGlhLXR5cGUtb2JqZWN0KQoKRWFjaCBNZWRpYSBUeXBlIE9iamVjdCBwcm92aWRlcyBzY2hlbWEgYW5kIGV4YW1wbGVzIGZvciB0aGUgbWVkaWEgdHlwZSBpZGVudGlmaWVkIGJ5IGl0cyBrZXkuCgojIyMjIFs0LjcuMTQuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy0xMSkKCnwgRmllbGQgTmFtZSB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18Cnwgc2NoZW1hICAgICB8IFtgU2NoZW1hIE9iamVjdGBdKHNyYy9TY2hlbWEucGhwKSBcfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZXhhbXBsZSAgICB8IFtBbnldKHNyYy9NZWRpYVR5cGUucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZXhhbXBsZXMgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9NZWRpYVR5cGUucGhwKSwgW2BFeGFtcGxlIE9iamVjdGBdKHNyYy9FeGFtcGxlLnBocCkgXHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApXSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZW5jb2RpbmcgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9NZWRpYVR5cGUucGhwKSwgW2BFbmNvZGluZyBPYmplY3RgXShzcmMvRW5jb2RpbmcucGhwKV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy4xNSBFbmNvZGluZyBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2VuY29kaW5nLW9iamVjdCkKCkEgc2luZ2xlIGVuY29kaW5nIGRlZmluaXRpb24gYXBwbGllZCB0byBhIHNpbmdsZSBzY2hlbWEgcHJvcGVydHkuCgojIyMjIFs0LjcuMTUuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy0xMikKCiMjIyMjIFs0LjcuMTUuMS4xIENvbW1vbiBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2NvbW1vbi1maXhlZC1maWVsZHMtMCkKClRoZXNlIGZpZWxkcyBfTUFZXyBiZSB1c2VkIGVpdGhlciB3aXRoIG9yIHdpdGhvdXQgdGhlIFJGQzY1NzAtc3R5bGUgc2VyaWFsaXphdGlvbiBmaWVsZHMgZGVmaW5lZCBpbiB0aGUgbmV4dCBzZWN0aW9uIGJlbG93LgoKfCBGaWVsZCBOYW1lICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IGNvbnRlbnRUeXBlIHwgW2BzdHJpbmdgXShzcmMvRW5jb2RpbmcucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBoZWFkZXJzICAgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9FbmNvZGluZy5waHApLCBbYEhlYWRlciBPYmplY3RgXShzcmMvSGVhZGVyLnBocCkgXHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApXSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMjIyBbNC43LjE1LjEuMiBGaXhlZCBGaWVsZHMgZm9yIFJGQzY1NzAtc3R5bGUgU2VyaWFsaXphdGlvbl0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLWZvci1yZmM2NTcwLXN0eWxlLXNlcmlhbGl6YXRpb24pCgp8IEZpZWxkIE5hbWUgICAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBzdHlsZSAgICAgICAgIHwgW2BzdHJpbmdgXShzcmMvRW5jb2RpbmcucGhwKSAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGV4cGxvZGUgICAgICAgfCBbYGJvb2xlYW5gXShzcmMvRW5jb2RpbmcucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgYWxsb3dSZXNlcnZlZCB8IFtgYm9vbGVhbmBdKHNyYy9FbmNvZGluZy5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjE2IFJlc3BvbnNlcyBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3Jlc3BvbnNlcy1vYmplY3QpCgpBIGNvbnRhaW5lciBmb3IgdGhlIGV4cGVjdGVkIHJlc3BvbnNlcyBvZiBhbiBvcGVyYXRpb24uIFRoZSBjb250YWluZXIgbWFwcyBhbiBIVFRQIHJlc3BvbnNlIGNvZGUgdG8gdGhlIGV4cGVjdGVkIHJlc3BvbnNlLgoKIyMjIyBbNC43LjE2LjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtMTMpCgp8IEZpZWxkIE5hbWUgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBkZWZhdWx0ICAgIHwgW2BSZXNwb25zZSBPYmplY3RgXShzcmMvUmVzcG9uc2UucGhwKSBcfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIyBbNC43LjE2LjIgUGF0dGVybmVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjcGF0dGVybmVkLWZpZWxkcy0wKQoKfCBGaWVsZCBOYW1lICAgICAgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgSFRUUCBTdGF0dXMgQ29kZSB8IFtgUmVzcG9uc2UgT2JqZWN0YF0oc3JjL1Jlc3BvbnNlLnBocCkgXHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjE3IFJlc3BvbnNlIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjcmVzcG9uc2Utb2JqZWN0KQoKRGVzY3JpYmVzIGEgc2luZ2xlIHJlc3BvbnNlIGZyb20gYW4gQVBJIG9wZXJhdGlvbiwgaW5jbHVkaW5nIGRlc2lnbi10aW1lLCBzdGF0aWMgbGlua3MgdG8gb3BlcmF0aW9ucyBiYXNlZCBvbiB0aGUgcmVzcG9uc2UuCgojIyMjIFs0LjcuMTcuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy0xNCkKCnwgRmllbGQgTmFtZSAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgZGVzY3JpcHRpb24gfCBbYHN0cmluZ2BdKHNyYy9SZXNwb25zZS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgaGVhZGVycyAgICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvUmVzcG9uc2UucGhwKSwgW0hlYWRlciBPYmplY3RdKHNyYy9IZWFkZXIucGhwKSBcfCBbUmVmZXJlbmNlIE9iamVjdF0oc3JjL1JlZmVyZW5jZS5waHApXSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgY29udGVudCAgICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvUmVzcG9uc2UucGhwKSwgW01lZGlhIFR5cGUgT2JqZWN0XShzcmMvSGVhZGVyLnBocCldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgbGlua3MgICAgICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvUmVzcG9uc2UucGhwKSwgW0xpbmsgT2JqZWN0XShzcmMvTGluay5waHApIFx8IFtSZWZlcmVuY2UgT2JqZWN0XShzcmMvUmVmZXJlbmNlLnBocCldICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy4xOSBFeGFtcGxlIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZXhhbXBsZS1vYmplY3QpCgpBbiBvYmplY3QgZ3JvdXBpbmcgYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgZXhhbXBsZSB2YWx1ZSB3aXRoIGJhc2ljIGBzdW1tYXJ5YCBhbmQgYGRlc2NyaXB0aW9uYCBtZXRhZGF0YS4KCiMjIyMgWzQuNy4xOS4xIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLTE1KQoKfCBGaWVsZCBOYW1lICAgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBzdW1tYXJ5ICAgICAgIHwgW2BzdHJpbmdgXShzcmMvRXhhbXBsZS5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBkZXNjcmlwdGlvbiAgIHwgW2BzdHJpbmdgXShzcmMvRXhhbXBsZS5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCB2YWx1ZSAgICAgICAgIHwgW0FueV0oc3JjL0V4YW1wbGUucGhwKSAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBleHRlcm5hbFZhbHVlIHwgW2BzdHJpbmdgXShzcmMvRXhhbXBsZS5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjIwIExpbmsgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNsaW5rLW9iamVjdCkKClRoZSBMaW5rIE9iamVjdCByZXByZXNlbnRzIGEgcG9zc2libGUgZGVzaWduLXRpbWUgbGluayBmb3IgYSByZXNwb25zZS4KCiMjIyMgWzQuNy4yMC4xIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLTE2KQoKfCBGaWVsZCBOYW1lICAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBvcGVyYXRpb25SZWYgfCBbYHN0cmluZ2BdKHNyYy9MaW5rLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBvcGVyYXRpb25JZCAgfCBbYHN0cmluZ2BdKHNyYy9MaW5rLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBwYXJhbWV0ZXJzICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvTGluay5waHApLCBbQW55XShzcmMvTGluay5waHApIFx8IFt7ZXhwcmVzc2lvbn1dKHNyYy9MaW5rLnBocCldIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCByZXF1ZXN0Qm9keSAgfCBbQW55XShzcmMvTGluay5waHApIFx8IFt7ZXhwcmVzc2lvbn1dKHNyYy9MaW5rLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBkZXNjcmlwdGlvbiAgfCBbYHN0cmluZ2BdKHNyYy9MaW5rLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBzZXJ2ZXIgICAgICAgfCBbYFNlcnZlciBPYmplY3RgXShzcmMvU2VydmVyLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjIxIEhlYWRlciBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2hlYWRlci1vYmplY3QpCgpEZXNjcmliZXMgYSBzaW5nbGUgaGVhZGVyIGZvciBIVFRQIHJlc3BvbnNlcyBhbmQgZm9yIGluZGl2aWR1YWwgcGFydHMgaW4gbXVsdGlwYXJ0IHJlcHJlc2VudGF0aW9ucy4KCiMjIyMgWzQuNy4yMS4xIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLTE3KQoKIyMjIyMgWzQuNy4yMS4xLjEgQ29tbW9uIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjY29tbW9uLWZpeGVkLWZpZWxkcy0xKQoKVGhlc2UgZmllbGRzIF9NQVlfIGJlIHVzZWQgd2l0aCBlaXRoZXIgYGNvbnRlbnRgIG9yIGBzY2hlbWFgLgoKfCBGaWVsZCBOYW1lICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IGRlc2NyaXB0aW9uIHwgW2BzdHJpbmdgXShzcmMvSGVhZGVyLnBocCkgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCByZXF1aXJlZCAgICB8IFtgYm9vbGVhbmBdKHNyYy9IZWFkZXIucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVwcmVjYXRlZCAgfCBbYGJvb2xlYW5gXShzcmMvSGVhZGVyLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIyMjIFs0LjcuMjEuMS4yIEZpeGVkIEZpZWxkcyBmb3IgdXNlIHdpdGggYHNjaGVtYWBdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy1mb3ItdXNlLXdpdGgtc2NoZW1hLTApCgpGb3Igc2ltcGxlciBzY2VuYXJpb3MsIGEgc2NoZW1hIGFuZCBzdHlsZSBjYW4gZGVzY3JpYmUgdGhlIHN0cnVjdHVyZSBhbmQgc3ludGF4IG9mIHRoZSBoZWFkZXIuCgp8IEZpZWxkIE5hbWUgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IHN0eWxlICAgICAgfCBbYHN0cmluZ2BdKHNyYy9IZWFkZXIucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGV4cGxvZGUgICAgfCBbYGJvb2xlYW5gXShzcmMvSGVhZGVyLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHNjaGVtYSAgICAgfCBbYFNjaGVtYSBPYmplY3RgXShzcmMvU2NoZW1hLnBocCkgXHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGV4YW1wbGUgICAgfCBbQW55XShzcmMvSGVhZGVyLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGV4YW1wbGVzICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvSGVhZGVyLnBocCksIFtgRXhhbXBsZSBPYmplY3RgXShzcmMvRXhhbXBsZS5waHApIFx8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKV0gfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIyMgWzQuNy4yMS4xLjMgRml4ZWQgRmllbGRzIGZvciB1c2Ugd2l0aCBgY29udGVudGBdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy1mb3ItdXNlLXdpdGgtY29udGVudC0wKQoKRm9yIG1vcmUgY29tcGxleCBzY2VuYXJpb3MsIHRoZSBjb250ZW50IGZpZWxkIGNhbiBkZWZpbmUgdGhlIG1lZGlhIHR5cGUgYW5kIHNjaGVtYSBvZiB0aGUgaGVhZGVyLCBhcyB3ZWxsIGFzIGdpdmUgZXhhbXBsZXMgb2YgaXRzIHVzZS4KCnwgRmllbGQgTmFtZSB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBjb250ZW50ICAgIHwgTWFwW1tgc3RyaW5nYF0oc3JjL0hlYWRlci5waHApLCBbYE1lZGlhIFR5cGUgT2JqZWN0YF0oc3JjL01lZGlhVHlwZS5waHApXSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy4yMiBUYWcgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCN0YWctb2JqZWN0KQoKQWRkcyBtZXRhZGF0YSB0byBhIHNpbmdsZSB0YWcgdGhhdCBpcyB1c2VkIGJ5IHRoZSBPcGVyYXRpb24gT2JqZWN0LiBJdCBpcyBub3QgbWFuZGF0b3J5IHRvIGhhdmUgYSBUYWcgT2JqZWN0IHBlciB0YWcgZGVmaW5lZCBpbiB0aGUgT3BlcmF0aW9uIE9iamVjdAppbnN0YW5jZXMuCgojIyMjIFs0LjcuMjIuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy0xOCkKCnwgRmllbGQgICAgICAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IG5hbWUgICAgICAgIHwgW2BzdHJpbmdgXShzcmMvVGFnLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVzY3JpcHRpb24gfCBbYHN0cmluZ2BdKHNyYy9UYWcucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBkZXNjcmlwdGlvbiB8IFtgRXh0ZXJuYWwgRG9jdW1lbnRhdGlvbiBPYmplY3RgXShzcmMvRXh0ZXJuYWxEb2N1bWVudGF0aW9uLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMjMgUmVmZXJlbmNlIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjcmVmZXJlbmNlLW9iamVjdCkKCkEgc2ltcGxlIG9iamVjdCB0byBhbGxvdyByZWZlcmVuY2luZyBvdGhlciBjb21wb25lbnRzIGluIHRoZSBPcGVuQVBJIERlc2NyaXB0aW9uLCBpbnRlcm5hbGx5IGFuZCBleHRlcm5hbGx5LgoKIyMjIyBbNC43LjIzLjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtMTkpCgp8IEZpZWxkIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8ICRyZWYgIHwgW2BzdHJpbmdgXShzcmMvUmVmZXJlbmNlLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMjQgU2NoZW1hIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjc2NoZW1hLW9iamVjdCkKClRoZSBTY2hlbWEgT2JqZWN0IGFsbG93cyB0aGUgZGVmaW5pdGlvbiBvZiBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgdHlwZXMuCgojIyMjIFs0LjcuMjQuMSBKU09OIFNjaGVtYSBLZXl3b3Jkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjanNvbi1zY2hlbWEta2V5d29yZHMpCgp8IEZpZWxkIE5hbWUgICAgICAgICAgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCB0aXRsZSAgICAgICAgICAgICAgICB8IFtgc3RyaW5nYF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IG11bHRpcGxlT2YgICAgICAgICAgIHwgW2BudW1iZXJgXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgbWF4aW11bSAgICAgICAgICAgICAgfCBbYG51bWJlcmBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBleGNsdXNpdmVNYXhpbXVtICAgICB8IFtgYm9vbGVhbmBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IG1pbmltdW0gICAgICAgICAgICAgIHwgW2BudW1iZXJgXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZXhjbHVzaXZlTWluaW11bSAgICAgfCBbYGJvb2xlYW5gXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBtYXhMZW5ndGggICAgICAgICAgICB8IFtgaW50ZWdlcmBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IG1pbkxlbmd0aCAgICAgICAgICAgIHwgW2BpbnRlZ2VyYF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgcGF0dGVybiAgICAgICAgICAgICAgfCBbYHN0cmluZ2BdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBtYXhJdGVtcyAgICAgICAgICAgICB8IFtgaW50ZWdlcmBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IG1pbkl0ZW1zICAgICAgICAgICAgIHwgW2BpbnRlZ2VyYF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgdW5pcXVlSXRlbXMgICAgICAgICAgfCBbYGJvb2xlYW5gXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBtYXhQcm9wZXJ0aWVzICAgICAgICB8IFtgaW50ZWdlcmBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IG1pblByb3BlcnRpZXMgICAgICAgIHwgW2BpbnRlZ2VyYF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgcmVxdWlyZWQgICAgICAgICAgICAgfCBbYGFycmF5YF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBlbnVtICAgICAgICAgICAgICAgICB8IFtgYXJyYXlgXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHR5cGUgICAgICAgICAgICAgICAgIHwgW2BzdHJpbmdgXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgYWxsT2YgICAgICAgICAgICAgICAgfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCkgXHwgW2BTY2hlbWEgT2JqZWN0YF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBvbmVPZiAgICAgICAgICAgICAgICB8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKSBcfCBbYFNjaGVtYSBPYmplY3RgXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGFueU9mICAgICAgICAgICAgICAgIHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApIFx8IFtgU2NoZW1hIE9iamVjdGBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgbm90ICAgICAgICAgICAgICAgICAgfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCkgXHwgW2BTY2hlbWEgT2JqZWN0YF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBpdGVtcyAgICAgICAgICAgICAgICB8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKSBcfCBbYFNjaGVtYSBPYmplY3RgXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHByb3BlcnRpZXMgICAgICAgICAgIHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApIFx8IFtgU2NoZW1hIE9iamVjdGBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgYWRkaXRpb25hbFByb3BlcnRpZXMgfCBbYGJvb2xlYW5gXShzcmMvUmVmZXJlbmNlLnBocCkgXHxbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCkgXHwgW2BTY2hlbWEgT2JqZWN0YF0oc3JjL1NjaGVtYS5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBkZXNjcmlwdGlvbiAgICAgICAgICB8IFtgc3RyaW5nYF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGZvcm1hdCAgICAgICAgICAgICAgIHwgW2BzdHJpbmdgXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZm9ybWF0ICAgICAgICAgICAgICAgfCBbYEFueWBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyMgWzQuNy4yNC4yIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLTIwKQoKfCBGaWVsZCBOYW1lICAgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IG51bGxhYmxlICAgICAgfCBbYGJvb2xlYW5gXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBkaXNjcmltaW5hdG9yIHwgYERpc2NyaW1pbmF0b3IgT2JqZWN0YCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgcmVhZE9ubHkgICAgICB8IFtgYm9vbGVhbmBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHdyaXRlT25seSAgICAgfCBbYGJvb2xlYW5gXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCB4bWwgICAgICAgICAgIHwgW2BYTUwgT2JqZWN0YF0oc3JjL1htbC5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZXh0ZXJuYWxEb2NzICB8IFtgRXh0ZXJuYWwgRG9jdW1lbnRhdGlvbiBPYmplY3RgXShzcmMvRXh0ZXJuYWxEb2N1bWVudGF0aW9uLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGV4YW1wbGUgICAgICAgfCBbQW55XShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBkZXByZWNhdGVkICAgIHwgW2Bib29sZWFuYF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy4yNSBEaXNjcmltaW5hdG9yIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZGlzY3JpbWluYXRvci1vYmplY3QpCgpXaGVuIHJlcXVlc3QgYm9kaWVzIG9yIHJlc3BvbnNlIHBheWxvYWRzIG1heSBiZSBvbmUgb2YgYSBudW1iZXIgb2YgZGlmZmVyZW50IHNjaGVtYXMsCmEgRGlzY3JpbWluYXRvciBPYmplY3QgZ2l2ZXMgYSBoaW50IGFib3V0IHRoZSBleHBlY3RlZCBzY2hlbWEgb2YgdGhlIGRvY3VtZW50LgoKIyMjIyBbNC43LjI1LjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtMjEpCgp8IEZpZWxkIE5hbWUgICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBwcm9wZXJ0eU5hbWUgfCBbYHN0cmluZ2BdKHNyYy9EaXNjcmltaW5hdG9yLnBocCkgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IG1hcHBpbmcgICAgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9EaXNjcmltaW5hdG9yLnBocCksIGBzdHJpbmdgXSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy4yNiBYTUwgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCN4bWwtb2JqZWN0KQoKQSBtZXRhZGF0YSBvYmplY3QgdGhhdCBhbGxvd3MgZm9yIG1vcmUgZmluZS10dW5lZCBYTUwgbW9kZWwgZGVmaW5pdGlvbnMuCgojIyMjIFs0LjcuMjYuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy0yMikKCnwgRmllbGQgTmFtZSB8IFR5cGUgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgbmFtZSAgICAgICB8IFtgc3RyaW5nYF0oc3JjL1htbC5waHApICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgbmFtZXNwYWNlICB8IFtgc3RyaW5nYF0oc3JjL1htbC5waHApICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgcHJlZml4ICAgICB8IFtgc3RyaW5nYF0oc3JjL1htbC5waHApICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgYXR0cmlidXRlICB8IFtgYm9vbGVhbmBdKHNyYy9YbWwucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgd3JhcHBlZCAgICB8IFtgYm9vbGVhbmBdKHNyYy9YbWwucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy4yNyBTZWN1cml0eSBTY2hlbWUgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNzZWN1cml0eS1zY2hlbWUtb2JqZWN0LTApCgpEZWZpbmVzIGEgc2VjdXJpdHkgc2NoZW1lIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIG9wZXJhdGlvbnMuCgojIyMjIFs0LjcuMjcuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy0yMykKCnwgRmllbGQgTmFtZSAgICAgICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCB0eXBlICAgICAgICAgICAgIHwgW2BzdHJpbmdgXShzcmMvU2VjdXJpdHlTY2hlbWUucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVzY3JpcHRpb24gICAgICB8IFtgc3RyaW5nYF0oc3JjL1NlY3VyaXR5U2NoZW1lLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IG5hbWUgICAgICAgICAgICAgfCBbYHN0cmluZ2BdKHNyYy9TZWN1cml0eVNjaGVtZS5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBpbiAgICAgICAgICAgICAgIHwgW2BzdHJpbmdgXShzcmMvU2VjdXJpdHlTY2hlbWUucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgc2NoZW1lICAgICAgICAgICB8IFtgc3RyaW5nYF0oc3JjL1NlY3VyaXR5U2NoZW1lLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGJlYXJlckZvcm1hdCAgICAgfCBbYHN0cmluZ2BdKHNyYy9TZWN1cml0eVNjaGVtZS5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBmbG93cyAgICAgICAgICAgIHwgW2BzdHJpbmdgXShzcmMvT0F1dGhGbG93cy5waHApICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgb3BlbklkQ29ubmVjdFVybCB8IFtgc3RyaW5nYF0oc3JjL1NlY3VyaXR5U2NoZW1lLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMjggT0F1dGggRmxvd3MgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNvYXV0aC1mbG93cy1vYmplY3QpCgpBbGxvd3MgY29uZmlndXJhdGlvbiBvZiB0aGUgc3VwcG9ydGVkIE9BdXRoIEZsb3dzLgoKIyMjIyBbNC43LjI4LjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtMjQpCgp8IEZpZWxkIE5hbWUgICAgICAgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBpbXBsaWNpdCAgICAgICAgICB8IFtgT0F1dGggRmxvdyBPYmplY3RgXShzcmMvT0F1dGhGbG93LnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHBhc3N3b3JkICAgICAgICAgIHwgW2BPQXV0aCBGbG93IE9iamVjdGBdKHNyYy9PQXV0aEZsb3cucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgY2xpZW50Q3JlZGVudGlhbHMgfCBbYE9BdXRoIEZsb3cgT2JqZWN0YF0oc3JjL09BdXRoRmxvdy5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBhdXRob3JpemF0aW9uQ29kZSB8IFtgT0F1dGggRmxvdyBPYmplY3RgXShzcmMvT0F1dGhGbG93LnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMjkgT0F1dGggRmxvdyBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3NlY3VyaXR5LXNjaGVtZS1vYmplY3QtMCkKCkRlZmluZXMgYSBzZWN1cml0eSBzY2hlbWUgdGhhdCBjYW4gYmUgdXNlZCBieSB0aGUgb3BlcmF0aW9ucy4KCiMjIyMgWzQuNy4yOS4xIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLTI1KQoKfCBGaWVsZCBOYW1lICAgICAgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgYXV0aG9yaXphdGlvblVybCB8IFtgc3RyaW5nYF0oc3JjL09BdXRoRmxvdy5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCB0b2tlblVybCAgICAgICAgIHwgW2BzdHJpbmdgXShzcmMvT0F1dGhGbG93LnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHJlZnJlc2hVcmwgICAgICAgfCBbYHN0cmluZ2BdKHNyYy9PQXV0aEZsb3cucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgc2NvcGVzICAgICAgICAgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9PQXV0aEZsb3cucGhwKSwgW2BzdHJpbmdgXShzcmMvT0F1dGhGbG93LnBocCldIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIExvY2FsIERldmVsb3BtZW50CgpUaGlzIHByb2plY3QgcHJvdmlkZXMgYSBjb252ZW5pZW50IFtkb2NrXShodHRwczovL2dpdGh1Yi5jb20vemVyby10by1wcm9kL2RvY2spIHNjcmlwdCB0byBzaW1wbGlmeSBsb2NhbCBkZXZlbG9wbWVudCB3b3JrZmxvd3Mgd2l0aGluIERvY2tlcgpjb250YWluZXJzLgoKWW91IGNhbiB1c2UgdGhpcyBzY3JpcHQgdG8gaW5pdGlhbGl6ZSB0aGUgcHJvamVjdCwgbWFuYWdlIENvbXBvc2VyIGRlcGVuZGVuY2llcywgYW5kIHJ1biB0ZXN0cyBpbiBhIGNvbnNpc3RlbnQgUEhQIGVudmlyb25tZW50LgoKIyMjIFByZXJlcXVpc2l0ZXMKCi0gRG9ja2VyIGluc3RhbGxlZCBhbmQgcnVubmluZwotIEEgYC5lbnZgIGZpbGUgKGNyZWF0ZWQgYXV0b21hdGljYWxseSB2aWEgdGhlIGBkb2NrIGluaXRgIGNvbW1hbmQsIGlmIGl0IGRvZXNu4oCZdCBhbHJlYWR5IGV4aXN0KQoKIyMjIEluaXRpYWxpemluZwoKVXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgdG8gc2V0IHVwIHRoZSBwcm9qZWN0OgoKYGBgc2hlbGwKc2ggZG9jayBpbml0CnNoIGRvY2sgY29tcG9zZXIgdXBkYXRlCmBgYAoKIyMjIFRlc3RpbmcKClRoaXMgY29tbWFuZCBydW5zIFBIUFVuaXQgaW5zaWRlIHRoZSBEb2NrZXIgY29udGFpbmVyLCB1c2luZyB0aGUgUEhQIHZlcnNpb24gc3BlY2lmaWVkIGluIHlvdXIgYC5lbnZgIGZpbGUuCllvdSBjYW4gbW9kaWZ5IG9yIGV4dGVuZCB0aGlzIHNjcmlwdCB0byBpbmNsdWRlIGFkZGl0aW9uYWwgdGVzdHMgb3IgY29tbWFuZHMgYXMgbmVlZGVkLgoKYGBgc2hlbGwKc2ggZG9jayB0ZXN0CmBgYAoKUnVuIHRoZSB0ZXN0IHN1aXRlIHdpdGggYWxsIHZlcnNpb25zIG9mIHBocDoKCmBgYHNoZWxsCnNoIHRlc3Quc2gKYGBgCgojIyMgQ29uZmlndXJhdGlvbgoKQmVmb3JlIHN0YXJ0aW5nIGRldmVsb3BtZW50LCB2ZXJpZnkgdGhhdCB5b3VyIGAuZW52YCBmaWxlIGNvbnRhaW5zIHRoZSBjb3JyZWN0IHNldHRpbmdzLgoKWW91IGNhbiBzcGVjaWZ5IHdoaWNoIFBIUCB2ZXJzaW9uIHRvIHVzZSBmb3IgbG9jYWwgZGV2ZWxvcG1lbnQsIGRlYnVnZ2luZywgYW5kIENvbXBvc2VyIG9wZXJhdGlvbnMgYnkgdXBkYXRpbmcgdGhlc2UgdmFyaWFibGVzIGluIHlvdXIgYC5lbnZgIGZpbGU6CgpgYGBkb3RlbnYKUEhQX1ZFUlNJT049OC4xClBIUF9ERUJVRz04LjEKUEhQX0NPTVBPU0VSPTguMQpgYGAKCk1ha2Ugc3VyZSB0aGVzZSB2YWx1ZXMgcmVmbGVjdCB0aGUgUEhQIHZlcnNpb25zIHlvdSBpbnRlbmQgdG8gdXNlLgpJZiB0aGUgYC5lbnZgIGZpbGUgZG9lcyBub3QgZXhpc3QsIHJ1biB0aGUgYHNoIGRvY2sgaW5pdGAgY29tbWFuZCB0byBjcmVhdGUgb25lIGZyb20gdGhlIGAuZW52LmV4YW1wbGVgIHRlbXBsYXRlLgoKIyMgQ29udHJpYnV0aW5nCgpDb250cmlidXRpb25zLCBpc3N1ZXMsIGFuZCBmZWF0dXJlIHJlcXVlc3RzIGFyZSB3ZWxjb21lIQpGZWVsIGZyZWUgdG8gY2hlY2sgdGhlIFtpc3N1ZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS96ZXJvLXRvLXByb2QvZGF0YS1tb2RlbC1vcGVuYXBpMzAvaXNzdWVzKSBwYWdlIGlmIHlvdSB3YW50IHRvIGNvbnRyaWJ1dGUuCgoxLiBGb3JrIHRoZSByZXBvc2l0b3J5LgoyLiBDcmVhdGUgYSBuZXcgYnJhbmNoIChgZ2l0IGNoZWNrb3V0IC1iIGZlYXR1cmUtYnJhbmNoYCkuCjMuIENvbW1pdCBjaGFuZ2VzIChgZ2l0IGNvbW1pdCAtbSAnQWRkIHNvbWUgZmVhdHVyZSdgKS4KNC4gUHVzaCB0byB0aGUgYnJhbmNoIChgZ2l0IHB1c2ggb3JpZ2luIGZlYXR1cmUtYnJhbmNoYCkuCjUuIENyZWF0ZSBhIG5ldyBQdWxsIFJlcXVlc3Qu
- readmeEtag: '"1dd1196ace3efba3a4c29859fb50d530a3ec692a"'
- readmeLastModified: Mon, 13 Jan 2025 01:54:02 GMT
+ IyBaZXJvdG9wcm9kXERhdGFNb2RlbE9wZW5hcGkzMAoKIVtdKC4vYXJ0L2xvZ28ucG5nKQoKWyFbUmVwb10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9naXRodWItZ3JheT9sb2dvPWdpdGh1YildKGh0dHBzOi8vZ2l0aHViLmNvbS96ZXJvLXRvLXByb2QvZGF0YS1tb2RlbC1vcGVuYXBpMzApClshW0dpdEh1YiBBY3Rpb25zIFdvcmtmbG93IFN0YXR1c10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9naXRodWIvYWN0aW9ucy93b3JrZmxvdy9zdGF0dXMvemVyby10by1wcm9kL2RhdGEtbW9kZWwtb3BlbmFwaTMwL3Rlc3QueW1sP2xhYmVsPXRlc3RzKV0oaHR0cHM6Ly9naXRodWIuY29tL3plcm8tdG8tcHJvZC9kYXRhLW1vZGVsLW9wZW5hcGkzMC9hY3Rpb25zKQpbIVtQYWNrYWdpc3QgRG93bmxvYWRzXShodHRwczovL2ltZy5zaGllbGRzLmlvL3BhY2thZ2lzdC9kdC96ZXJvLXRvLXByb2QvZGF0YS1tb2RlbC1vcGVuYXBpMzA/Y29sb3I9Ymx1ZSldKGh0dHBzOi8vcGFja2FnaXN0Lm9yZy9wYWNrYWdlcy96ZXJvLXRvLXByb2QvZGF0YS1tb2RlbC1vcGVuYXBpMzAvc3RhdHMpClshW1BhY2thZ2lzdCBWZXJzaW9uXShodHRwczovL2ltZy5zaGllbGRzLmlvL3BhY2thZ2lzdC92L3plcm8tdG8tcHJvZC9kYXRhLW1vZGVsLW9wZW5hcGkzMD9jb2xvcj1mMjhkMWEpXShodHRwczovL3BhY2thZ2lzdC5vcmcvcGFja2FnZXMvemVyby10by1wcm9kL2RhdGEtbW9kZWwtb3BlbmFwaTMwKQpbIVtMaWNlbnNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL3BhY2thZ2lzdC9sL3plcm8tdG8tcHJvZC9kYXRhLW1vZGVsLW9wZW5hcGkzMD9jb2xvcj1yZWQpXShodHRwczovL2dpdGh1Yi5jb20vemVyby10by1wcm9kL2RhdGEtbW9kZWwtb3BlbmFwaTMwL2Jsb2IvbWFpbi9MSUNFTlNFLm1kKQpbIVt3YWthdGltZV0oaHR0cHM6Ly93YWthdGltZS5jb20vYmFkZ2UvZ2l0aHViL3plcm8tdG8tcHJvZC9kYXRhLW1vZGVsLW9wZW5hcGkzMC5zdmcpXShodHRwczovL3dha2F0aW1lLmNvbS9iYWRnZS9naXRodWIvemVyby10by1wcm9kL2RhdGEtbW9kZWwtb3BlbmFwaTMwKQpbIVtIaXRzLW9mLUNvZGVdKGh0dHBzOi8vaGl0c29mY29kZS5jb20vZ2l0aHViL3plcm8tdG8tcHJvZC9kYXRhLW1vZGVsLW9wZW5hcGkzMD9icmFuY2g9bWFpbildKGh0dHBzOi8vaGl0c29mY29kZS5jb20vZ2l0aHViL3plcm8tdG8tcHJvZC9kYXRhLW1vZGVsLW9wZW5hcGkzMC92aWV3P2JyYW5jaD1tYWluKQoKIyMgQ29udGVudHMKCi0gW0ludHJvZHVjdGlvbl0oI2ludHJvZHVjdGlvbikKLSBbUmVxdWlyZW1lbnRzXSgjcmVxdWlyZW1lbnRzKQotIFtJbnN0YWxsYXRpb25dKCNpbnN0YWxsYXRpb24pCi0gW1VzYWdlXSgjdXNhZ2UpCi0gW0xvY2FsIERldmVsb3BtZW50XSguL0xPQ0FMX0RFVkVMT1BNRU5ULm1kKQotIFtDb250cmlidXRpbmddKCNjb250cmlidXRpbmcpCgojIyBJbnRyb2R1Y3Rpb24KCkRhdGFNb2RlbHMgZm9yIE9wZW5BUEkgMy4wLiogW3NwZWNpZmljYXRpb25dKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sKS4KCiMjIFJlcXVpcmVtZW50cwoKLSBQSFAgOC4xIG9yIGhpZ2hlci4KCiMjIEluc3RhbGxhdGlvbgoKSW5zdGFsbCBgWmVyb3RvcHJvZFxEYXRhTW9kZWxPcGVuYXBpMzBgIHZpYSBbQ29tcG9zZXJdKGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnLyk6CgpgYGBzaGVsbApjb21wb3NlciByZXF1aXJlIHplcm8tdG8tcHJvZC9kYXRhLW1vZGVsLW9wZW5hcGkzMApgYGAKClRoaXMgd2lsbCBhZGQgdGhlIHBhY2thZ2UgdG8geW91ciBwcm9qZWN04oCZcyBkZXBlbmRlbmNpZXMgYW5kIGNyZWF0ZSBhbiBhdXRvbG9hZGVyIGVudHJ5IGZvciBpdC4KCiMjIFVzYWdlCgpgYGBwaHAKdXNlIFplcm90b3Byb2RcRGF0YU1vZGVsT3BlbmFwaTMwXE9wZW5BcGk7CgokT3BlbkFwaSA9IE9wZW5BcGk6OmZyb20oanNvbl9kZWNvZGUoJGpzb24sIHRydWUpKTsKCiRPcGVuQXBpLT5jb21wb25lbnRzLT5zY2hlbWFzWydwZXQnXS0+ZGVzY3JpcHRpb247CmBgYAoKIyMgVGVzdGluZwoKYGBgc2hlbGwKLi92ZW5kb3IvYmluL3BocHVuaXQKYGBgCgojIyBBY2NlcHRhbmNlIFRlc3RzCgp8IFRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBbNC43LjIuMiBJbmZvIE9iamVjdCBFeGFtcGxlXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNpbmZvLW9iamVjdC1leGFtcGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IFs0LjcuMy4yIENvbnRhY3QgT2JqZWN0IEV4YW1wbGVdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2NvbnRhY3Qtb2JqZWN0LWV4YW1wbGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgWzQuNy40LjIgTGljZW5zZSBPYmplY3QgRXhhbXBsZV0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjbGljZW5zZS1vYmplY3QtZXhhbXBsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBbNC43LjUuMiBTZXJ2ZXIgT2JqZWN0IEV4YW1wbGVdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3NlcnZlci1vYmplY3QtZXhhbXBsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IFs0LjcuNy4yIENvbXBvbmVudHMgT2JqZWN0IEV4YW1wbGVdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2NvbXBvbmVudHMtb2JqZWN0LWV4YW1wbGUpICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgWzQuNy44LjMgUGF0aHMgT2JqZWN0IEV4YW1wbGVdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3BhdGhzLW9iamVjdC1leGFtcGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBbNC43LjkuMiBQYXRoIEl0ZW0gT2JqZWN0IEV4YW1wbGVdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3BhdGgtaXRlbS1vYmplY3QtZXhhbXBsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IFs0LjcuMTAuMiBPcGVyYXRpb24gT2JqZWN0IEV4YW1wbGVdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI29wZXJhdGlvbi1vYmplY3QtZXhhbXBsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgWzQuNy4xMS4yIEV4dGVybmFsIERvY3VtZW50YXRpb24gT2JqZWN0IEV4YW1wbGVdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2V4dGVybmFsLWRvY3VtZW50YXRpb24tb2JqZWN0LWV4YW1wbGUpIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBbNC43LjEyLjUgUGFyYW1ldGVyIE9iamVjdCBFeGFtcGxlc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjcGFyYW1ldGVyLW9iamVjdC1leGFtcGxlcykgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IFs0LjcuMTMuMiBSZXF1ZXN0IEJvZHkgRXhhbXBsZXNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3JlcXVlc3QtYm9keS1leGFtcGxlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgWzQuNy4xNC4yIE1lZGlhIFR5cGUgRXhhbXBsZXNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI21lZGlhLXR5cGUtZXhhbXBsZXMtMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIFByb3BlcnRpZXMKCiMgWzQuMCBTcGVjaWZpY2F0aW9uXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNzcGVjaWZpY2F0aW9uKQoKIyMgWzQuNyBTY2hlbWFdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3NjaGVtYS0wKQoKVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBPcGVuQVBJIERlc2NyaXB0aW9uIGZvcm1hdAoKIyMjIFs0LjcuMSBPcGVuQVBJIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjb3BlbmFwaS1vYmplY3QpCgpUaGlzIGlzIHRoZSByb290IG9iamVjdCBvZiB0aGUgT3BlbkFQSSBEZXNjcmlwdGlvbi4KCiMjIyMgWzQuNy4xLjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMpCgp8IEZpZWxkIE5hbWUgICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IG9wZW5hcGkgICAgICB8IFtgc3RyaW5nYF0oc3JjL09wZW5BcGkucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGluZm8gICAgICAgICB8IFtgSW5mbyBPYmplY3RgXShzcmMvSW5mby5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHNlcnZlcnMgICAgICB8IFtgW1NlcnZlciBPYmplY3RdYF0oc3JjL1NlcnZlci5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHBhdGhzICAgICAgICB8IFtgUGF0aHMgT2JqZWN0YF0oc3JjL1BhdGhJdGVtLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGNvbXBvbmVudHMgICB8IFtgQ29tcG9uZW50cyBPYmplY3RgXShzcmMvQ29tcG9uZW50cy5waHApICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHNlY3VyaXR5ICAgICB8IFtgU2VjdXJpdHkgUmVxdWlyZW1lbnQgT2JqZWN0YF0oc3JjL09wZW5BcGkucGhwKSAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHRhZ3MgICAgICAgICB8IFtbYFRhZyBPYmplY3RgXShzcmMvVGFnLnBocCldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGV4dGVybmFsRG9jcyB8IFtgRXh0ZXJuYWwgRG9jdW1lbnRhdGlvbiBPYmplY3RgXShzcmMvRXh0ZXJuYWxEb2N1bWVudGF0aW9uLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMiBJbmZvIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjaW5mby1vYmplY3QpCgpUaGUgb2JqZWN0IHByb3ZpZGVzIG1ldGFkYXRhIGFib3V0IHRoZSBBUEkuCgojIyMjIFs0LjcuMi4xIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLTApCgp8IEZpZWxkIE5hbWUgICAgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IHRpdGxlICAgICAgICAgIHwgW2BzdHJpbmdgXShzcmMvSW5mby5waHApICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGRlc2NyaXB0aW9uICAgIHwgW2BzdHJpbmdgXShzcmMvSW5mby5waHApICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHRlcm1zT2ZTZXJ2aWNlIHwgW2BzdHJpbmdgXShzcmMvSW5mby5waHApICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGNvbnRhY3QgICAgICAgIHwgW2BDb250YWN0IE9iamVjdGBdKHNyYy9Db250YWN0LnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGxpY2Vuc2UgICAgICAgIHwgW2BMaWNlbnNlIE9iamVjdGBdKHNyYy9MaWNlbnNlLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHZlcnNpb24gICAgICAgIHwgW2BzdHJpbmdgXShzcmMvSW5mby5waHApICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMyBDb250YWN0IE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjY29udGFjdC1vYmplY3QpCgpDb250YWN0IGluZm9ybWF0aW9uIGZvciB0aGUgZXhwb3NlZCBBUEkuCgojIyMjIFs0LjcuMy4xIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLTEpCgp8IEZpZWxkIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzICAgICAgICAgICAgIHwKfC0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgbmFtZSAgfCBbYHN0cmluZ2BdKHNyYy9Db250YWN0LnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHVybCAgIHwgW2BzdHJpbmdgXShzcmMvQ29udGFjdC5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBlbWFpbCB8IFtgZW1haWxgXShzcmMvQ29udGFjdC5waHApICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy40IExpY2Vuc2UgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNsaWNlbnNlLW9iamVjdCkKCkxpY2Vuc2UgaW5mb3JtYXRpb24gZm9yIHRoZSBleHBvc2VkIEFQSS4KCiMjIyMgWzQuNy40LjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtMikKCnwgRmllbGQgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBuYW1lICB8IFtgc3RyaW5nYF0oc3JjL0xpY2Vuc2UucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgdXJsICAgfCBbYHN0cmluZ2BdKHNyYy9MaWNlbnNlLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuNSBTZXJ2ZXIgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNzZXJ2ZXItb2JqZWN0KQoKQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIFNlcnZlci4KCiMjIyMgWzQuNy41LjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtMykKCnwgRmllbGQgTmFtZSAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgdXJsICAgICAgICAgfCBbYHN0cmluZ2BdKHNyYy9TZXJ2ZXIucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVzY3JpcHRpb24gfCBbYHN0cmluZ2BdKHNyYy9TZXJ2ZXIucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgdmFyaWFibGVzICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvU2VydmVyLnBocCksIFtgU2VydmVyIFZhcmlhYmxlIE9iamVjdGBdKHNyYy9TZXJ2ZXJWYXJpYWJsZS5waHApXSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy42IFNlcnZlciBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3NlcnZlci12YXJpYWJsZS1vYmplY3QpCgpBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgU2VydmVyIFZhcmlhYmxlIGZvciBzZXJ2ZXIgVVJMIHRlbXBsYXRlIHN1YnN0aXR1dGlvbi4KCiMjIyMgWzQuNy42LjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtNCkKCnwgRmllbGQgTmFtZSAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBlbnVtICAgICAgICB8IFtbYHN0cmluZ2BdXShzcmMvU2VydmVyVmFyaWFibGUucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVmYXVsdCAgICAgfCBbYHN0cmluZ2BdKHNyYy9TZXJ2ZXJWYXJpYWJsZS5waHApICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGRlc2NyaXB0aW9uIHwgW2BzdHJpbmdgXShzcmMvU2VydmVyVmFyaWFibGUucGhwKSAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjcgQ29tcG9uZW50cyBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2NvbXBvbmVudHMtb2JqZWN0KQoKSG9sZHMgYSBzZXQgb2YgcmV1c2FibGUgb2JqZWN0cyBmb3IgZGlmZmVyZW50IGFzcGVjdHMgb2YgdGhlIE9BUy4KCiMjIyBbNC43LjcuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy01KQoKfCBGaWVsZCBOYW1lICAgICAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBzY2hlbWFzICAgICAgICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvQ29tcG9uZW50cy5waHApLCBbYFNjaGVtYSBPYmplY3RgXShzcmMvU2NoZW1hLnBocCkgXHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApXSAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCByZXNwb25zZXMgICAgICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvQ29tcG9uZW50cy5waHApLCBbYFJlc3BvbnNlIE9iamVjdGBdKHNyYy9SZXNwb25zZS5waHApIFx8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKV0gICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBwYXJhbWV0ZXJzICAgICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvQ29tcG9uZW50cy5waHApLCBbYFBhcmFtZXRlciBPYmplY3RgXShzcmMvUGFyYW1ldGVyLnBocCkgXHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApXSAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBleGFtcGxlcyAgICAgICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvQ29tcG9uZW50cy5waHApLCBbYEV4YW1wbGUgT2JqZWN0YF0oc3JjL0V4YW1wbGUucGhwKSBcfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCldICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCByZXF1ZXN0Qm9kaWVzICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvQ29tcG9uZW50cy5waHApLCBbYFJlcXVlc3QgQm9keSBPYmplY3RgXShzcmMvUmVxdWVzdEJvZHkucGhwKSBcfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCldICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBoZWFkZXJzICAgICAgICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvQ29tcG9uZW50cy5waHApLCBbYEhlYWRlciBPYmplY3RgXShzcmMvSGVhZGVyLnBocCkgXHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApXSAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBzZWN1cml0eVNjaGVtZXMgfCBNYXBbW2BzdHJpbmdgXShzcmMvQ29tcG9uZW50cy5waHApLCBbYFNlY3VyaXR5IFNjaGVtZSBPYmplY3RgXShzcmMvU2VjdXJpdHlTY2hlbWUucGhwKSBcfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCldIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBsaW5rcyAgICAgICAgICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvQ29tcG9uZW50cy5waHApLCBbYExpbmsgT2JqZWN0YF0oc3JjL0xpbmsucGhwKSBcfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCldICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBjYWxsYmFja3MgICAgICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvQ29tcG9uZW50cy5waHApLCBbYENhbGxiYWNrIE9iamVjdGBdKHNyYy9QYXRoSXRlbS5waHApIFx8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKV0gICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjggUGF0aHMgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNwYXRocy1vYmplY3QpCgpIb2xkcyB0aGUgcmVsYXRpdmUgcGF0aHMgdG8gdGhlIGluZGl2aWR1YWwgZW5kcG9pbnRzIGFuZCB0aGVpciBvcGVyYXRpb25zLgoKIyMjIyBbNC43LjguMSBQYXR0ZXJuZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNwYXR0ZXJuZWQtZmllbGRzKQoKfCBGaWVsZCBOYW1lIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCAve3BhdGh9ICAgIHwgW1BhdGggSXRlbSBPYmplY3RdKHNyYy9QYXRoSXRlbS5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjkgUGF0aCBJdGVtIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjcGF0aC1pdGVtLW9iamVjdCkKCkRlc2NyaWJlcyB0aGUgb3BlcmF0aW9ucyBhdmFpbGFibGUgb24gYSBzaW5nbGUgcGF0aC4KCiMjIyMgWzQuNy45LjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtNikKCnwgRmllbGQgTmFtZSAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCAkcmVmICAgICAgICB8IFtgc3RyaW5nYF0oc3JjL1BhdGhJdGVtLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgc3VtbWFyeSAgICAgfCBbYHN0cmluZ2BdKHNyYy9QYXRoSXRlbS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGRlc2NyaXB0aW9uIHwgW2BzdHJpbmdgXShzcmMvUGF0aEl0ZW0ucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBnZXQgICAgICAgICB8IFtgT3BlcmF0aW9uIE9iamVjdGBdKHNyYy9PcGVyYXRpb24ucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgcHV0ICAgICAgICAgfCBbYE9wZXJhdGlvbiBPYmplY3RgXShzcmMvT3BlcmF0aW9uLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHBvc3QgICAgICAgIHwgW2BPcGVyYXRpb24gT2JqZWN0YF0oc3JjL09wZXJhdGlvbi5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBkZWxldGUgICAgICB8IFtgT3BlcmF0aW9uIE9iamVjdGBdKHNyYy9PcGVyYXRpb24ucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgb3B0aW9ucyAgICAgfCBbYE9wZXJhdGlvbiBPYmplY3RgXShzcmMvT3BlcmF0aW9uLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGhlYWQgICAgICAgIHwgW2BPcGVyYXRpb24gT2JqZWN0YF0oc3JjL09wZXJhdGlvbi5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBwYXRjaCAgICAgICB8IFtgT3BlcmF0aW9uIE9iamVjdGBdKHNyYy9PcGVyYXRpb24ucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgdHJhY2UgICAgICAgfCBbYE9wZXJhdGlvbiBPYmplY3RgXShzcmMvT3BlcmF0aW9uLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHNlcnZlcnMgICAgIHwgW2BTZXJ2ZXIgT2JqZWN0YF0oc3JjL1NlcnZlci5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBwYXJhbWV0ZXJzICB8IFtbYFBhcmFtZXRlciBPYmplY3RgXShzcmMvUGFyYW1ldGVyLnBocCkgXHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApXSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy4xMCBPcGVyYXRpb24gT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNvcGVyYXRpb24tb2JqZWN0KQoKRGVzY3JpYmVzIGEgc2luZ2xlIEFQSSBvcGVyYXRpb24gb24gYSBwYXRoLgoKIyMjIyBbNC43LjEwLjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtNykKCnwgRmllbGQgTmFtZSAgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCB0YWdzICAgICAgICAgfCBbW2BzdHJpbmdgXV0oc3JjL09wZXJhdGlvbi5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgc3VtbWFyeSAgICAgIHwgW2BzdHJpbmdgXShzcmMvT3BlcmF0aW9uLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGRlc2NyaXB0aW9uICB8IFtgc3RyaW5nYF0oc3JjL09wZXJhdGlvbi5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBleHRlcm5hbERvY3MgfCBbYEV4dGVybmFsIERvY3VtZW50YXRpb24gT2JqZWN0YF0oc3JjL0V4dGVybmFsRG9jdW1lbnRhdGlvbi5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgb3BlcmF0aW9uSWQgIHwgW2BzdHJpbmdgXShzcmMvT3BlcmF0aW9uLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHBhcmFtZXRlcnMgICB8IFtbYFBhcmFtZXRlciBPYmplY3RgXShzcmMvUGFyYW1ldGVyLnBocCkgXHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCByZXF1ZXN0Qm9keSAgfCBbYFJlcXVlc3QgQm9keSBPYmplY3RgXShzcmMvUmVxdWVzdEJvZHkucGhwKSBcfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgcmVzcG9uc2VzICAgIHwgW2BSZXNwb25zZXMgT2JqZWN0YF0oc3JjL1Jlc3BvbnNlLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGNhbGxiYWNrcyAgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9PcGVyYXRpb24ucGhwKSwgW2BDYWxsYmFjayBPYmplY3RgXShzcmMvUGF0aEl0ZW0ucGhwKSBcfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCldIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBkZXByZWNhdGVkICAgfCBbYGJvb2xlYW5gXShzcmMvT3BlcmF0aW9uLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgc2VjdXJpdHkgICAgIHwgW2BTZWN1cml0eSBSZXF1aXJlbWVudCBPYmplY3RgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHNlcnZlcnMgICAgICB8IFtbYFNlcnZlciBPYmplY3RgXV0oc3JjL1NlcnZlci5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjExIEV4dGVybmFsIERvY3VtZW50YXRpb24gT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNleHRlcm5hbC1kb2N1bWVudGF0aW9uLW9iamVjdCkKCkFsbG93cyByZWZlcmVuY2luZyBhbiBleHRlcm5hbCByZXNvdXJjZSBmb3IgZXh0ZW5kZWQgZG9jdW1lbnRhdGlvbi4KCiMjIyMgWzQuNy4xMS4xIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLTgpCgp8IEZpZWxkIE5hbWUgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IGRlc2NyaXB0aW9uIHwgW2BzdHJpbmdgXShzcmMvRXh0ZXJuYWxEb2N1bWVudGF0aW9uLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHVybCAgICAgICAgIHwgW2BzdHJpbmdgXShzcmMvRXh0ZXJuYWxEb2N1bWVudGF0aW9uLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMTIgUGFyYW1ldGVyIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjcGFyYW1ldGVyLW9iamVjdCkKCkRlc2NyaWJlcyBhIHNpbmdsZSBvcGVyYXRpb24gcGFyYW1ldGVyLgoKIyMjIyBbNC43LjEyLjIgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtOSkKClRoZSBydWxlcyBmb3Igc2VyaWFsaXphdGlvbiBvZiB0aGUgcGFyYW1ldGVyIGFyZSBzcGVjaWZpZWQgaW4gb25lIG9mIHR3byB3YXlzLiBQYXJhbWV0ZXIgT2JqZWN0cyBfTVVTVF8gaW5jbHVkZSBlaXRoZXIgYSBgY29udGVudGAgZmllbGQgb3IgYSBgc2NoZW1hYApmaWVsZCwgYnV0IG5vdCBib3RoLgoKIyMjIyMgWzQuNy4xMi4yLjEgQ29tbW9uIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjY29tbW9uLWZpeGVkLWZpZWxkcykKClRoZXNlIGZpZWxkcyBfTUFZXyBiZSB1c2VkIHdpdGggZWl0aGVyIGBjb250ZW50YCBvciBgc2NoZW1hYC4KCnwgRmllbGQgTmFtZSAgICAgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBuYW1lICAgICAgICAgICAgfCBbYHN0cmluZ2BdKHNyYy9QYXJhbWV0ZXIucGhwKSAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgaW4gICAgICAgICAgICAgIHwgW2BzdHJpbmdgXShzcmMvUGFyYW1ldGVyLnBocCkgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGRlc2NyaXB0aW9uICAgICB8IFtgc3RyaW5nYF0oc3JjL1BhcmFtZXRlci5waHApICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCByZXF1aXJlZCAgICAgICAgfCBbYGJvb2xlYW5gXShzcmMvUGFyYW1ldGVyLnBocCkgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVwcmVjYXRlZCAgICAgIHwgW2Bib29sZWFuYF0oc3JjL1BhcmFtZXRlci5waHApICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGFsbG93RW1wdHlWYWx1ZSB8IFtbYGJvb2xlYW5gXV0oc3JjL1BhcmFtZXRlci5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyMjIFs0LjcuMTIuMi4yIEZpeGVkIEZpZWxkcyBmb3IgdXNlIHdpdGggYHNjaGVtYWBdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy1mb3ItdXNlLXdpdGgtc2NoZW1hKQoKRm9yIHNpbXBsZXIgc2NlbmFyaW9zLCBhIGBzY2hlbWFgIGFuZCBgc3R5bGVgIGNhbiBkZXNjcmliZSB0aGUgc3RydWN0dXJlIGFuZCBzeW50YXggb2YgdGhlIHBhcmFtZXRlci4KCnwgRmllbGQgTmFtZSAgICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBzdHlsZSAgICAgICAgIHwgW2BzdHJpbmdgXShzcmMvUGFyYW1ldGVyLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZXhwbG9kZSAgICAgICB8IFtgYm9vbGVhbmBdKHNyYy9QYXJhbWV0ZXIucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGFsbG93UmVzZXJ2ZWQgfCBbYGJvb2xlYW5gXShzcmMvUGFyYW1ldGVyLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBzY2hlbWEgICAgICAgIHwgW2BTY2hlbWEgT2JqZWN0YF0oc3JjL1NjaGVtYS5waHApIFx8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZXhhbXBsZSAgICAgICB8IFtBbnldKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGV4YW1wbGVzICAgICAgfCBNYXBbIFtgc3RyaW5nYF0oc3JjL1NjaGVtYS5waHApLCBbYEV4YW1wbGUgT2JqZWN0YF0oc3JjL0V4YW1wbGUucGhwKSBcfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCldIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyMjIFs0LjcuMTIuMi4zIEZpeGVkIEZpZWxkcyBmb3IgdXNlIHdpdGggYGNvbnRlbnRgXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtZm9yLXVzZS13aXRoLWNvbnRlbnQpCgp8IEZpZWxkIE5hbWUgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgY29udGVudCAgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9TY2hlbWEucGhwKSwgW2BNZWRpYSBUeXBlIE9iamVjdGBdKHNyYy9TY2hlbWEucGhwKV0gfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMTMgUmVxdWVzdCBCb2R5IE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjcmVxdWVzdC1ib2R5LW9iamVjdCkKCkRlc2NyaWJlcyBhIHNpbmdsZSByZXF1ZXN0IGJvZHkuCgojIyMjIFs0LjcuMTMuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy0xMCkKCnwgRmllbGQgTmFtZSAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBkZXNjcmlwdGlvbiB8IFtgc3RyaW5nYF0oc3JjL1JlcXVlc3RCb2R5LnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgY29udGVudCAgICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvUmVxdWVzdEJvZHkucGhwKSwgW2BNZWRpYSBUeXBlIE9iamVjdGBdKHNyYy9NZWRpYVR5cGUucGhwKV0gfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHJlcXVpcmVkICAgIHwgW2Bib29sZWFuYF0oc3JjL1JlcXVlc3RCb2R5LnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjE0IE1lZGlhIFR5cGUgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNtZWRpYS10eXBlLW9iamVjdCkKCkVhY2ggTWVkaWEgVHlwZSBPYmplY3QgcHJvdmlkZXMgc2NoZW1hIGFuZCBleGFtcGxlcyBmb3IgdGhlIG1lZGlhIHR5cGUgaWRlbnRpZmllZCBieSBpdHMga2V5LgoKIyMjIyBbNC43LjE0LjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtMTEpCgp8IEZpZWxkIE5hbWUgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IHNjaGVtYSAgICAgfCBbYFNjaGVtYSBPYmplY3RgXShzcmMvU2NoZW1hLnBocCkgXHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGV4YW1wbGUgICAgfCBbQW55XShzcmMvTWVkaWFUeXBlLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGV4YW1wbGVzICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvTWVkaWFUeXBlLnBocCksIFtgRXhhbXBsZSBPYmplY3RgXShzcmMvRXhhbXBsZS5waHApIFx8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKV0gfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGVuY29kaW5nICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvTWVkaWFUeXBlLnBocCksIFtgRW5jb2RpbmcgT2JqZWN0YF0oc3JjL0VuY29kaW5nLnBocCldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMTUgRW5jb2RpbmcgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNlbmNvZGluZy1vYmplY3QpCgpBIHNpbmdsZSBlbmNvZGluZyBkZWZpbml0aW9uIGFwcGxpZWQgdG8gYSBzaW5nbGUgc2NoZW1hIHByb3BlcnR5LgoKIyMjIyBbNC43LjE1LjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtMTIpCgojIyMjIyBbNC43LjE1LjEuMSBDb21tb24gRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNjb21tb24tZml4ZWQtZmllbGRzLTApCgpUaGVzZSBmaWVsZHMgX01BWV8gYmUgdXNlZCBlaXRoZXIgd2l0aCBvciB3aXRob3V0IHRoZSBSRkM2NTcwLXN0eWxlIHNlcmlhbGl6YXRpb24gZmllbGRzIGRlZmluZWQgaW4gdGhlIG5leHQgc2VjdGlvbiBiZWxvdy4KCnwgRmllbGQgTmFtZSAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBjb250ZW50VHlwZSB8IFtgc3RyaW5nYF0oc3JjL0VuY29kaW5nLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgaGVhZGVycyAgICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvRW5jb2RpbmcucGhwKSwgW2BIZWFkZXIgT2JqZWN0YF0oc3JjL0hlYWRlci5waHApIFx8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKV0gfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIyMgWzQuNy4xNS4xLjIgRml4ZWQgRmllbGRzIGZvciBSRkM2NTcwLXN0eWxlIFNlcmlhbGl6YXRpb25dKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy1mb3ItcmZjNjU3MC1zdHlsZS1zZXJpYWxpemF0aW9uKQoKfCBGaWVsZCBOYW1lICAgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18Cnwgc3R5bGUgICAgICAgICB8IFtgc3RyaW5nYF0oc3JjL0VuY29kaW5nLnBocCkgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBleHBsb2RlICAgICAgIHwgW2Bib29sZWFuYF0oc3JjL0VuY29kaW5nLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGFsbG93UmVzZXJ2ZWQgfCBbYGJvb2xlYW5gXShzcmMvRW5jb2RpbmcucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy4xNiBSZXNwb25zZXMgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNyZXNwb25zZXMtb2JqZWN0KQoKQSBjb250YWluZXIgZm9yIHRoZSBleHBlY3RlZCByZXNwb25zZXMgb2YgYW4gb3BlcmF0aW9uLiBUaGUgY29udGFpbmVyIG1hcHMgYW4gSFRUUCByZXNwb25zZSBjb2RlIHRvIHRoZSBleHBlY3RlZCByZXNwb25zZS4KCiMjIyMgWzQuNy4xNi4xIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLTEzKQoKfCBGaWVsZCBOYW1lIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgZGVmYXVsdCAgICB8IFtgUmVzcG9uc2UgT2JqZWN0YF0oc3JjL1Jlc3BvbnNlLnBocCkgXHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyMgWzQuNy4xNi4yIFBhdHRlcm5lZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3BhdHRlcm5lZC1maWVsZHMtMCkKCnwgRmllbGQgTmFtZSAgICAgICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IEhUVFAgU3RhdHVzIENvZGUgfCBbYFJlc3BvbnNlIE9iamVjdGBdKHNyYy9SZXNwb25zZS5waHApIFx8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy4xNyBSZXNwb25zZSBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3Jlc3BvbnNlLW9iamVjdCkKCkRlc2NyaWJlcyBhIHNpbmdsZSByZXNwb25zZSBmcm9tIGFuIEFQSSBvcGVyYXRpb24sIGluY2x1ZGluZyBkZXNpZ24tdGltZSwgc3RhdGljIGxpbmtzIHRvIG9wZXJhdGlvbnMgYmFzZWQgb24gdGhlIHJlc3BvbnNlLgoKIyMjIyBbNC43LjE3LjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtMTQpCgp8IEZpZWxkIE5hbWUgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IGRlc2NyaXB0aW9uIHwgW2BzdHJpbmdgXShzcmMvUmVzcG9uc2UucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGhlYWRlcnMgICAgIHwgTWFwW1tgc3RyaW5nYF0oc3JjL1Jlc3BvbnNlLnBocCksIFtIZWFkZXIgT2JqZWN0XShzcmMvSGVhZGVyLnBocCkgXHwgW1JlZmVyZW5jZSBPYmplY3RdKHNyYy9SZWZlcmVuY2UucGhwKV0gfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGNvbnRlbnQgICAgIHwgTWFwW1tgc3RyaW5nYF0oc3JjL1Jlc3BvbnNlLnBocCksIFtNZWRpYSBUeXBlIE9iamVjdF0oc3JjL0hlYWRlci5waHApXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGxpbmtzICAgICAgIHwgTWFwW1tgc3RyaW5nYF0oc3JjL1Jlc3BvbnNlLnBocCksIFtMaW5rIE9iamVjdF0oc3JjL0xpbmsucGhwKSBcfCBbUmVmZXJlbmNlIE9iamVjdF0oc3JjL1JlZmVyZW5jZS5waHApXSAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMTkgRXhhbXBsZSBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2V4YW1wbGUtb2JqZWN0KQoKQW4gb2JqZWN0IGdyb3VwaW5nIGFuIGludGVybmFsIG9yIGV4dGVybmFsIGV4YW1wbGUgdmFsdWUgd2l0aCBiYXNpYyBgc3VtbWFyeWAgYW5kIGBkZXNjcmlwdGlvbmAgbWV0YWRhdGEuCgojIyMjIFs0LjcuMTkuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy0xNSkKCnwgRmllbGQgTmFtZSAgICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18Cnwgc3VtbWFyeSAgICAgICB8IFtgc3RyaW5nYF0oc3JjL0V4YW1wbGUucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVzY3JpcHRpb24gICB8IFtgc3RyaW5nYF0oc3JjL0V4YW1wbGUucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgdmFsdWUgICAgICAgICB8IFtBbnldKHNyYy9FeGFtcGxlLnBocCkgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZXh0ZXJuYWxWYWx1ZSB8IFtgc3RyaW5nYF0oc3JjL0V4YW1wbGUucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy4yMCBMaW5rIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjbGluay1vYmplY3QpCgpUaGUgTGluayBPYmplY3QgcmVwcmVzZW50cyBhIHBvc3NpYmxlIGRlc2lnbi10aW1lIGxpbmsgZm9yIGEgcmVzcG9uc2UuCgojIyMjIFs0LjcuMjAuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy0xNikKCnwgRmllbGQgTmFtZSAgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18Cnwgb3BlcmF0aW9uUmVmIHwgW2BzdHJpbmdgXShzcmMvTGluay5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgb3BlcmF0aW9uSWQgIHwgW2BzdHJpbmdgXShzcmMvTGluay5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgcGFyYW1ldGVycyAgIHwgTWFwW1tgc3RyaW5nYF0oc3JjL0xpbmsucGhwKSwgW0FueV0oc3JjL0xpbmsucGhwKSBcfCBbe2V4cHJlc3Npb259XShzcmMvTGluay5waHApXSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgcmVxdWVzdEJvZHkgIHwgW0FueV0oc3JjL0xpbmsucGhwKSBcfCBbe2V4cHJlc3Npb259XShzcmMvTGluay5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVzY3JpcHRpb24gIHwgW2BzdHJpbmdgXShzcmMvTGluay5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgc2VydmVyICAgICAgIHwgW2BTZXJ2ZXIgT2JqZWN0YF0oc3JjL1NlcnZlci5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMgWzQuNy4yMSBIZWFkZXIgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNoZWFkZXItb2JqZWN0KQoKRGVzY3JpYmVzIGEgc2luZ2xlIGhlYWRlciBmb3IgSFRUUCByZXNwb25zZXMgYW5kIGZvciBpbmRpdmlkdWFsIHBhcnRzIGluIG11bHRpcGFydCByZXByZXNlbnRhdGlvbnMuCgojIyMjIFs0LjcuMjEuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy0xNykKCiMjIyMjIFs0LjcuMjEuMS4xIENvbW1vbiBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2NvbW1vbi1maXhlZC1maWVsZHMtMSkKClRoZXNlIGZpZWxkcyBfTUFZXyBiZSB1c2VkIHdpdGggZWl0aGVyIGBjb250ZW50YCBvciBgc2NoZW1hYC4KCnwgRmllbGQgTmFtZSAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBkZXNjcmlwdGlvbiB8IFtgc3RyaW5nYF0oc3JjL0hlYWRlci5waHApICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgcmVxdWlyZWQgICAgfCBbYGJvb2xlYW5gXShzcmMvSGVhZGVyLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGRlcHJlY2F0ZWQgIHwgW2Bib29sZWFuYF0oc3JjL0hlYWRlci5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyMjIyBbNC43LjIxLjEuMiBGaXhlZCBGaWVsZHMgZm9yIHVzZSB3aXRoIGBzY2hlbWFgXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtZm9yLXVzZS13aXRoLXNjaGVtYS0wKQoKRm9yIHNpbXBsZXIgc2NlbmFyaW9zLCBhIHNjaGVtYSBhbmQgc3R5bGUgY2FuIGRlc2NyaWJlIHRoZSBzdHJ1Y3R1cmUgYW5kIHN5bnRheCBvZiB0aGUgaGVhZGVyLgoKfCBGaWVsZCBOYW1lIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBzdHlsZSAgICAgIHwgW2BzdHJpbmdgXShzcmMvSGVhZGVyLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBleHBsb2RlICAgIHwgW2Bib29sZWFuYF0oc3JjL0hlYWRlci5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBzY2hlbWEgICAgIHwgW2BTY2hlbWEgT2JqZWN0YF0oc3JjL1NjaGVtYS5waHApIFx8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBleGFtcGxlICAgIHwgW0FueV0oc3JjL0hlYWRlci5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBleGFtcGxlcyAgIHwgTWFwW1tgc3RyaW5nYF0oc3JjL0hlYWRlci5waHApLCBbYEV4YW1wbGUgT2JqZWN0YF0oc3JjL0V4YW1wbGUucGhwKSBcfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCldIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyMjIFs0LjcuMjEuMS4zIEZpeGVkIEZpZWxkcyBmb3IgdXNlIHdpdGggYGNvbnRlbnRgXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtZm9yLXVzZS13aXRoLWNvbnRlbnQtMCkKCkZvciBtb3JlIGNvbXBsZXggc2NlbmFyaW9zLCB0aGUgY29udGVudCBmaWVsZCBjYW4gZGVmaW5lIHRoZSBtZWRpYSB0eXBlIGFuZCBzY2hlbWEgb2YgdGhlIGhlYWRlciwgYXMgd2VsbCBhcyBnaXZlIGV4YW1wbGVzIG9mIGl0cyB1c2UuCgp8IEZpZWxkIE5hbWUgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgY29udGVudCAgICB8IE1hcFtbYHN0cmluZ2BdKHNyYy9IZWFkZXIucGhwKSwgW2BNZWRpYSBUeXBlIE9iamVjdGBdKHNyYy9NZWRpYVR5cGUucGhwKV0gfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMjIgVGFnIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjdGFnLW9iamVjdCkKCkFkZHMgbWV0YWRhdGEgdG8gYSBzaW5nbGUgdGFnIHRoYXQgaXMgdXNlZCBieSB0aGUgT3BlcmF0aW9uIE9iamVjdC4gSXQgaXMgbm90IG1hbmRhdG9yeSB0byBoYXZlIGEgVGFnIE9iamVjdCBwZXIgdGFnIGRlZmluZWQgaW4gdGhlIE9wZXJhdGlvbiBPYmplY3QKaW5zdGFuY2VzLgoKIyMjIyBbNC43LjIyLjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtMTgpCgp8IEZpZWxkICAgICAgIHwgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN0YXR1cyAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBuYW1lICAgICAgICB8IFtgc3RyaW5nYF0oc3JjL1RhZy5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGRlc2NyaXB0aW9uIHwgW2BzdHJpbmdgXShzcmMvVGFnLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVzY3JpcHRpb24gfCBbYEV4dGVybmFsIERvY3VtZW50YXRpb24gT2JqZWN0YF0oc3JjL0V4dGVybmFsRG9jdW1lbnRhdGlvbi5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjIzIFJlZmVyZW5jZSBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3JlZmVyZW5jZS1vYmplY3QpCgpBIHNpbXBsZSBvYmplY3QgdG8gYWxsb3cgcmVmZXJlbmNpbmcgb3RoZXIgY29tcG9uZW50cyBpbiB0aGUgT3BlbkFQSSBEZXNjcmlwdGlvbiwgaW50ZXJuYWxseSBhbmQgZXh0ZXJuYWxseS4KCiMjIyMgWzQuNy4yMy4xIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLTE5KQoKfCBGaWVsZCB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzICAgICAgICAgICAgIHwKfC0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCAkcmVmICB8IFtgc3RyaW5nYF0oc3JjL1JlZmVyZW5jZS5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjI0IFNjaGVtYSBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI3NjaGVtYS1vYmplY3QpCgpUaGUgU2NoZW1hIE9iamVjdCBhbGxvd3MgdGhlIGRlZmluaXRpb24gb2YgaW5wdXQgYW5kIG91dHB1dCBkYXRhIHR5cGVzLgoKIyMjIyBbNC43LjI0LjEgSlNPTiBTY2hlbWEgS2V5d29yZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2pzb24tc2NoZW1hLWtleXdvcmRzKQoKfCBGaWVsZCBOYW1lICAgICAgICAgICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgdGl0bGUgICAgICAgICAgICAgICAgfCBbYHN0cmluZ2BdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBtdWx0aXBsZU9mICAgICAgICAgICB8IFtgbnVtYmVyYF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IG1heGltdW0gICAgICAgICAgICAgIHwgW2BudW1iZXJgXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZXhjbHVzaXZlTWF4aW11bSAgICAgfCBbYGJvb2xlYW5gXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBtaW5pbXVtICAgICAgICAgICAgICB8IFtgbnVtYmVyYF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGV4Y2x1c2l2ZU1pbmltdW0gICAgIHwgW2Bib29sZWFuYF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgbWF4TGVuZ3RoICAgICAgICAgICAgfCBbYGludGVnZXJgXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBtaW5MZW5ndGggICAgICAgICAgICB8IFtgaW50ZWdlcmBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHBhdHRlcm4gICAgICAgICAgICAgIHwgW2BzdHJpbmdgXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgbWF4SXRlbXMgICAgICAgICAgICAgfCBbYGludGVnZXJgXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBtaW5JdGVtcyAgICAgICAgICAgICB8IFtgaW50ZWdlcmBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHVuaXF1ZUl0ZW1zICAgICAgICAgIHwgW2Bib29sZWFuYF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgbWF4UHJvcGVydGllcyAgICAgICAgfCBbYGludGVnZXJgXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBtaW5Qcm9wZXJ0aWVzICAgICAgICB8IFtgaW50ZWdlcmBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHJlcXVpcmVkICAgICAgICAgICAgIHwgW2BhcnJheWBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZW51bSAgICAgICAgICAgICAgICAgfCBbYGFycmF5YF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCB0eXBlICAgICAgICAgICAgICAgICB8IFtgc3RyaW5nYF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGFsbE9mICAgICAgICAgICAgICAgIHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApIFx8IFtgU2NoZW1hIE9iamVjdGBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8Cnwgb25lT2YgICAgICAgICAgICAgICAgfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCkgXHwgW2BTY2hlbWEgT2JqZWN0YF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBhbnlPZiAgICAgICAgICAgICAgICB8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKSBcfCBbYFNjaGVtYSBPYmplY3RgXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IG5vdCAgICAgICAgICAgICAgICAgIHwgW2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApIFx8IFtgU2NoZW1hIE9iamVjdGBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgaXRlbXMgICAgICAgICAgICAgICAgfCBbYFJlZmVyZW5jZSBPYmplY3RgXShzcmMvUmVmZXJlbmNlLnBocCkgXHwgW2BTY2hlbWEgT2JqZWN0YF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBwcm9wZXJ0aWVzICAgICAgICAgICB8IFtgUmVmZXJlbmNlIE9iamVjdGBdKHNyYy9SZWZlcmVuY2UucGhwKSBcfCBbYFNjaGVtYSBPYmplY3RgXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGFkZGl0aW9uYWxQcm9wZXJ0aWVzIHwgW2Bib29sZWFuYF0oc3JjL1JlZmVyZW5jZS5waHApIFx8W2BSZWZlcmVuY2UgT2JqZWN0YF0oc3JjL1JlZmVyZW5jZS5waHApIFx8IFtgU2NoZW1hIE9iamVjdGBdKHNyYy9TY2hlbWEucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVzY3JpcHRpb24gICAgICAgICAgfCBbYHN0cmluZ2BdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBmb3JtYXQgICAgICAgICAgICAgICB8IFtgc3RyaW5nYF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGZvcm1hdCAgICAgICAgICAgICAgIHwgW2BBbnlgXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyMjIFs0LjcuMjQuMiBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy0yMCkKCnwgRmllbGQgTmFtZSAgICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBudWxsYWJsZSAgICAgIHwgW2Bib29sZWFuYF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGlzY3JpbWluYXRvciB8IGBEaXNjcmltaW5hdG9yIE9iamVjdGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHJlYWRPbmx5ICAgICAgfCBbYGJvb2xlYW5gXShzcmMvU2NoZW1hLnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCB3cml0ZU9ubHkgICAgIHwgW2Bib29sZWFuYF0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgeG1sICAgICAgICAgICB8IFtgWE1MIE9iamVjdGBdKHNyYy9YbWwucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGV4dGVybmFsRG9jcyAgfCBbYEV4dGVybmFsIERvY3VtZW50YXRpb24gT2JqZWN0YF0oc3JjL0V4dGVybmFsRG9jdW1lbnRhdGlvbi5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBleGFtcGxlICAgICAgIHwgW0FueV0oc3JjL1NjaGVtYS5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZGVwcmVjYXRlZCAgICB8IFtgYm9vbGVhbmBdKHNyYy9TY2hlbWEucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMjUgRGlzY3JpbWluYXRvciBPYmplY3RdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2Rpc2NyaW1pbmF0b3Itb2JqZWN0KQoKV2hlbiByZXF1ZXN0IGJvZGllcyBvciByZXNwb25zZSBwYXlsb2FkcyBtYXkgYmUgb25lIG9mIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBzY2hlbWFzLAphIERpc2NyaW1pbmF0b3IgT2JqZWN0IGdpdmVzIGEgaGludCBhYm91dCB0aGUgZXhwZWN0ZWQgc2NoZW1hIG9mIHRoZSBkb2N1bWVudC4KCiMjIyMgWzQuNy4yNS4xIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLTIxKQoKfCBGaWVsZCBOYW1lICAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgcHJvcGVydHlOYW1lIHwgW2BzdHJpbmdgXShzcmMvRGlzY3JpbWluYXRvci5waHApICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBtYXBwaW5nICAgICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvRGlzY3JpbWluYXRvci5waHApLCBgc3RyaW5nYF0gfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMjYgWE1MIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjeG1sLW9iamVjdCkKCkEgbWV0YWRhdGEgb2JqZWN0IHRoYXQgYWxsb3dzIGZvciBtb3JlIGZpbmUtdHVuZWQgWE1MIG1vZGVsIGRlZmluaXRpb25zLgoKIyMjIyBbNC43LjI2LjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtMjIpCgp8IEZpZWxkIE5hbWUgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IG5hbWUgICAgICAgfCBbYHN0cmluZ2BdKHNyYy9YbWwucGhwKSAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IG5hbWVzcGFjZSAgfCBbYHN0cmluZ2BdKHNyYy9YbWwucGhwKSAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHByZWZpeCAgICAgfCBbYHN0cmluZ2BdKHNyYy9YbWwucGhwKSAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGF0dHJpYnV0ZSAgfCBbYGJvb2xlYW5gXShzcmMvWG1sLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHdyYXBwZWQgICAgfCBbYGJvb2xlYW5gXShzcmMvWG1sLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAoKIyMjIFs0LjcuMjcgU2VjdXJpdHkgU2NoZW1lIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjc2VjdXJpdHktc2NoZW1lLW9iamVjdC0wKQoKRGVmaW5lcyBhIHNlY3VyaXR5IHNjaGVtZSB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSBvcGVyYXRpb25zLgoKIyMjIyBbNC43LjI3LjEgRml4ZWQgRmllbGRzXShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNmaXhlZC1maWVsZHMtMjMpCgp8IEZpZWxkIE5hbWUgICAgICAgfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgdHlwZSAgICAgICAgICAgICB8IFtgc3RyaW5nYF0oc3JjL1NlY3VyaXR5U2NoZW1lLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGRlc2NyaXB0aW9uICAgICAgfCBbYHN0cmluZ2BdKHNyYy9TZWN1cml0eVNjaGVtZS5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBuYW1lICAgICAgICAgICAgIHwgW2BzdHJpbmdgXShzcmMvU2VjdXJpdHlTY2hlbWUucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgaW4gICAgICAgICAgICAgICB8IFtgc3RyaW5nYF0oc3JjL1NlY3VyaXR5U2NoZW1lLnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHNjaGVtZSAgICAgICAgICAgfCBbYHN0cmluZ2BdKHNyYy9TZWN1cml0eVNjaGVtZS5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBiZWFyZXJGb3JtYXQgICAgIHwgW2BzdHJpbmdgXShzcmMvU2VjdXJpdHlTY2hlbWUucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgZmxvd3MgICAgICAgICAgICB8IFtgc3RyaW5nYF0oc3JjL09BdXRoRmxvd3MucGhwKSAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IG9wZW5JZENvbm5lY3RVcmwgfCBbYHN0cmluZ2BdKHNyYy9TZWN1cml0eVNjaGVtZS5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjI4IE9BdXRoIEZsb3dzIE9iamVjdF0oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjb2F1dGgtZmxvd3Mtb2JqZWN0KQoKQWxsb3dzIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHN1cHBvcnRlZCBPQXV0aCBGbG93cy4KCiMjIyMgWzQuNy4yOC4xIEZpeGVkIEZpZWxkc10oaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvdjMuMC40Lmh0bWwjZml4ZWQtZmllbGRzLTI0KQoKfCBGaWVsZCBOYW1lICAgICAgICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXMgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgaW1wbGljaXQgICAgICAgICAgfCBbYE9BdXRoIEZsb3cgT2JqZWN0YF0oc3JjL09BdXRoRmxvdy5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCBwYXNzd29yZCAgICAgICAgICB8IFtgT0F1dGggRmxvdyBPYmplY3RgXShzcmMvT0F1dGhGbG93LnBocCkgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IGNsaWVudENyZWRlbnRpYWxzIHwgW2BPQXV0aCBGbG93IE9iamVjdGBdKHNyYy9PQXV0aEZsb3cucGhwKSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgYXV0aG9yaXphdGlvbkNvZGUgfCBbYE9BdXRoIEZsb3cgT2JqZWN0YF0oc3JjL09BdXRoRmxvdy5waHApIHwgOndoaXRlX2NoZWNrX21hcms6IHwKCiMjIyBbNC43LjI5IE9BdXRoIEZsb3cgT2JqZWN0XShodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy92My4wLjQuaHRtbCNzZWN1cml0eS1zY2hlbWUtb2JqZWN0LTApCgpEZWZpbmVzIGEgc2VjdXJpdHkgc2NoZW1lIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIG9wZXJhdGlvbnMuCgojIyMjIFs0LjcuMjkuMSBGaXhlZCBGaWVsZHNdKGh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzL3YzLjAuNC5odG1sI2ZpeGVkLWZpZWxkcy0yNSkKCnwgRmllbGQgTmFtZSAgICAgICB8IFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdHVzICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IGF1dGhvcml6YXRpb25VcmwgfCBbYHN0cmluZ2BdKHNyYy9PQXV0aEZsb3cucGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CnwgdG9rZW5VcmwgICAgICAgICB8IFtgc3RyaW5nYF0oc3JjL09BdXRoRmxvdy5waHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOndoaXRlX2NoZWNrX21hcms6IHwKfCByZWZyZXNoVXJsICAgICAgIHwgW2BzdHJpbmdgXShzcmMvT0F1dGhGbG93LnBocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA6d2hpdGVfY2hlY2tfbWFyazogfAp8IHNjb3BlcyAgICAgICAgICAgfCBNYXBbW2BzdHJpbmdgXShzcmMvT0F1dGhGbG93LnBocCksIFtgc3RyaW5nYF0oc3JjL09BdXRoRmxvdy5waHApXSB8IDp3aGl0ZV9jaGVja19tYXJrOiB8CgojIyBDb250cmlidXRpbmcKCkNvbnRyaWJ1dGlvbnMsIGlzc3VlcywgYW5kIGZlYXR1cmUgcmVxdWVzdHMgYXJlIHdlbGNvbWUhCkZlZWwgZnJlZSB0byBjaGVjayB0aGUgW2lzc3Vlc10oaHR0cHM6Ly9naXRodWIuY29tL3plcm8tdG8tcHJvZC9kYXRhLW1vZGVsLW9wZW5hcGkzMC9pc3N1ZXMpIHBhZ2UgaWYgeW91IHdhbnQgdG8gY29udHJpYnV0ZS4KCjEuIEZvcmsgdGhlIHJlcG9zaXRvcnkuCjIuIENyZWF0ZSBhIG5ldyBicmFuY2ggKGBnaXQgY2hlY2tvdXQgLWIgZmVhdHVyZS1icmFuY2hgKS4KMy4gQ29tbWl0IGNoYW5nZXMgKGBnaXQgY29tbWl0IC1tICdBZGQgc29tZSBmZWF0dXJlJ2ApLgo0LiBQdXNoIHRvIHRoZSBicmFuY2ggKGBnaXQgcHVzaCBvcmlnaW4gZmVhdHVyZS1icmFuY2hgKS4KNS4gQ3JlYXRlIGEgbmV3IFB1bGwgUmVxdWVzdC4=
+ readmeEtag: '"0b2bf1a6ce5706704183f26cf448abc716d8645c"'
+ readmeLastModified: Tue, 14 Jan 2025 13:49:28 GMT
repositoryId: 885105129
description: DataModels for OpenAPI 3.0.*
created: '2024-11-08T00:54:00Z'
- updated: '2025-01-13T01:54:11Z'
+ updated: '2025-01-14T13:50:02Z'
language: PHP
archived: false
stars: 1
@@ -30701,8 +30701,8 @@
owner: zero-to-prod
logo: https://avatars.githubusercontent.com/u/61474950?v=4
license: MIT
- repoEtag: '"d5fe80b87e3406eceffbfd7b490d707101bc91361ce2948af1891c55c150e8c9"'
- repoLastModified: Mon, 13 Jan 2025 01:54:11 GMT
+ repoEtag: '"263271d5a8534892422ddea812eeb0d399d8555186aec4109d58b18af48ebf3e"'
+ repoLastModified: Tue, 14 Jan 2025 13:50:02 GMT
category: Parsers
foundInMaster: true
- source: openapi3 tags
@@ -30717,7 +30717,7 @@
repositoryId: 823250960
description: Repo for jr. and me to play with microk8s, Flux and GitHub Actions
created: '2024-07-02T17:06:45Z'
- updated: '2025-01-13T19:07:31Z'
+ updated: '2025-01-14T20:22:09Z'
language: Java
archived: false
stars: 2
@@ -30725,8 +30725,8 @@
forks: 0
owner: roar-skinderviken
logo: https://avatars.githubusercontent.com/u/7499642?v=4
- repoEtag: '"72546aa452b365cbee116c23b6005fb45345590e4f6d0b3c9fd2b86ed8446738"'
- repoLastModified: Mon, 13 Jan 2025 19:07:31 GMT
+ repoEtag: '"775c4d59530ea20435f8b80aef25e64a2b2c042a7b24a5b23e970c8756e0f25e"'
+ repoLastModified: Tue, 14 Jan 2025 20:22:09 GMT
category: Server Implementations
foundInMaster: true
- source: openapi3 tags
@@ -30984,7 +30984,7 @@
owner: traefik
logo: https://avatars.githubusercontent.com/u/14280338?v=4
license: Apache-2.0
- repoEtag: '"bb5ebb914bd569fc6dc2c32558122695d2f56a1880a95681a6521c1647aa7d3d"'
+ repoEtag: '"4d7e0c5bf7c941765d7c5ad4b68a5c35e376221327d4abf32fad4ff206476bf6"'
repoLastModified: Mon, 16 Dec 2024 09:14:09 GMT
category: Server Implementations
foundInMaster: true
@@ -31986,17 +31986,17 @@
Simple, Fast, Code first and Compile time generated OpenAPI documentation
for Rust
created: '2021-09-30T22:00:31Z'
- updated: '2025-01-13T10:11:07Z'
+ updated: '2025-01-14T20:39:31Z'
language: Rust
archived: false
- stars: 2691
+ stars: 2695
watchers: 10
forks: 211
owner: juhaku
logo: https://avatars.githubusercontent.com/u/26358664?v=4
license: Apache-2.0
- repoEtag: '"e8fd30f6f20ae3246901212735e97ad2db10f6326e7fb8c191eb91689688c36c"'
- repoLastModified: Mon, 13 Jan 2025 10:11:07 GMT
+ repoEtag: '"318e7aab94bb872285c7882cab32a9beb7effbe51f32fa706674d049c2694e51"'
+ repoLastModified: Tue, 14 Jan 2025 20:39:31 GMT
foundInMaster: true
category: Parsers
id: 14269a89115b3be71493769fca4d995e
@@ -32076,7 +32076,7 @@
owner: x52dev
logo: https://avatars.githubusercontent.com/u/140988044?v=4
license: MIT
- repoEtag: '"b5dc596639594e05d69a0a417baa3574296b61cf3c80bf0bb85a8c209560063c"'
+ repoEtag: '"b4e824c7a2f1da37b0afd3b9ed5800f2eebe4237f3502f7261118acd9fde394e"'
repoLastModified: Mon, 13 Jan 2025 02:47:43 GMT
category: Parsers
foundInMaster: true
@@ -33685,17 +33685,17 @@
(TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either
in yaml or json formats. 🍺
created: '2020-02-05T08:31:50Z'
- updated: '2025-01-14T03:16:34Z'
+ updated: '2025-01-15T00:10:49Z'
language: TypeScript
archived: false
- stars: 3387
+ stars: 3391
watchers: 14
forks: 348
owner: orval-labs
logo: https://avatars.githubusercontent.com/u/176128704?v=4
license: MIT
- repoEtag: '"d550f76700c184cf1210b8d110f4107901632a6c71c4cc38e88360552af44596"'
- repoLastModified: Tue, 14 Jan 2025 03:16:34 GMT
+ repoEtag: '"1af20740108e61574caedd57997cdeb6ed596b7bbcb23f7d8f2fd48e8961cc4c"'
+ repoLastModified: Wed, 15 Jan 2025 00:10:49 GMT
foundInMaster: true
oldLocations:
- https://github.com/anymaniax/orval
@@ -34348,17 +34348,17 @@
applications. Currently targeting whitebox and blackbox testing of Web
APIs, like REST, GraphQL and RPC (e.g., gRPC and Thrift).
created: '2017-05-25T09:11:23Z'
- updated: '2025-01-09T13:29:18Z'
+ updated: '2025-01-14T04:07:17Z'
language: Kotlin
archived: false
- stars: 536
+ stars: 537
watchers: 24
forks: 86
owner: WebFuzzing
logo: https://avatars.githubusercontent.com/u/29148026?v=4
license: LGPL-3.0
- repoEtag: '"cbb434abc26174ed10355c639e1c46a8d38c2c2c5de2c6e36435f930f5996901"'
- repoLastModified: Thu, 09 Jan 2025 13:29:18 GMT
+ repoEtag: '"3bd4459254fcf90238a604fbe4d95ef6fac9144ed6c1d35f823fc3d37471b589"'
+ repoLastModified: Tue, 14 Jan 2025 04:07:17 GMT
foundInMaster: true
id: d1d3d85149c4a9437dbdbf157cf3d7c7
oldLocations:
@@ -34990,16 +34990,16 @@
Efficient validators from Typescript types generated by a blazing fast
compiler
created: '2023-08-28T02:32:08Z'
- updated: '2024-12-18T14:29:35Z'
+ updated: '2025-01-14T13:36:34Z'
language: Rust
archived: false
- stars: 4
+ stars: 5
watchers: 1
forks: 1
owner: lucasavila00
logo: https://avatars.githubusercontent.com/u/12750442?v=4
- repoEtag: '"6eb116c3bb3d09d55373e8547c6785030d5b9dc9eccb85a525cf65bf1442dbea"'
- repoLastModified: Wed, 18 Dec 2024 14:29:35 GMT
+ repoEtag: '"f342e4b8b67bcea6651dc84b892b218a0a4b2a2e93b1492eb01fbd67373cad95"'
+ repoLastModified: Tue, 14 Jan 2025 13:36:34 GMT
category:
- Server Implementations
- Parsers
@@ -35600,17 +35600,17 @@
repositoryId: 586543156
description: The ultimate toolkit for working with APIs.
created: '2023-01-08T14:15:23Z'
- updated: '2025-01-09T23:06:29Z'
+ updated: '2025-01-14T21:29:12Z'
language: TypeScript
archived: false
- stars: 838
+ stars: 839
watchers: 6
forks: 71
owner: kubb-labs
logo: https://avatars.githubusercontent.com/u/122118236?v=4
license: MIT
- repoEtag: '"13c7c86e12537a32e90a79f96f239871b2daa64ac90644475d98278afbc169c0"'
- repoLastModified: Thu, 09 Jan 2025 23:06:29 GMT
+ repoEtag: '"596b276a9b77bec44676a64c46042e6a1e62734b107533dc98cb89b574c2995e"'
+ repoLastModified: Tue, 14 Jan 2025 21:29:12 GMT
foundInMaster: true
oldLocations:
- https://github.com/kubb-project/kubb
@@ -35708,17 +35708,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: '2025-01-14T02:33:13Z'
+ updated: '2025-01-15T03:03:25Z'
language: TypeScript
archived: false
- stars: 29010
- watchers: 276
- forks: 5239
+ stars: 29046
+ watchers: 277
+ forks: 5240
owner: fastapi
logo: https://avatars.githubusercontent.com/u/156354296?v=4
license: MIT
- repoEtag: '"a1d7c42d673aa1e40a45766cc21a1e7af4fe27d04819fc63e25bf622beef3493"'
- repoLastModified: Tue, 14 Jan 2025 02:33:13 GMT
+ repoEtag: '"579a15bdfb77e52126659544867502ae2710b0806c297fba769cd236edf8d8c6"'
+ repoLastModified: Wed, 15 Jan 2025 03:03:25 GMT
foundInMaster: true
category: Server Implementations
id: 0354007b562b4efc3f08ce3da7f03afb
@@ -36325,7 +36325,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: '2025-01-09T12:52:27Z'
+ updated: '2025-01-15T03:11:09Z'
language: Java
archived: false
stars: 0
@@ -36333,8 +36333,8 @@
forks: 0
owner: bryopsida
logo: https://avatars.githubusercontent.com/u/8363252?v=4
- repoEtag: '"53edf5e15a9a3f8521488a4d25424d54750b884e0b301a6e1f980ca4e51f8847"'
- repoLastModified: Thu, 09 Jan 2025 12:52:27 GMT
+ repoEtag: '"648d2476a0835e3e549993f12f71a7ed13f86fa063f7ed2b0f82f42481414815"'
+ repoLastModified: Wed, 15 Jan 2025 03:11:09 GMT
category: Server Implementations
foundInMaster: true
- name: Ballerina OpenAPI tool
@@ -40532,7 +40532,7 @@
Examples and server integrations for generating the Swagger API
Specification, which enables easy access to your REST API
created: '2011-07-05T23:44:11Z'
- updated: '2025-01-13T08:14:11Z'
+ updated: '2025-01-14T21:04:07Z'
language: Java
archived: false
stars: 7401
@@ -40541,8 +40541,8 @@
owner: swagger-api
logo: https://avatars.githubusercontent.com/u/7658037?v=4
license: Apache-2.0
- repoEtag: '"9c572d5a64648ef71994084901a23ea4541723f062b89438cb8d25db9a3f26f5"'
- repoLastModified: Mon, 13 Jan 2025 08:14:11 GMT
+ repoEtag: '"936bfabb6971a121069ec5c90502423db6275ea662f07f7eb87dd65274b09d14"'
+ repoLastModified: Tue, 14 Jan 2025 21:04:07 GMT
id: 266d60df2d48ad8a47539de3c1071f3a
- source: IMPLEMENTATIONS.md
name: Microsoft.OpenApi.net
@@ -40565,7 +40565,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: '2025-01-13T23:16:30Z'
+ updated: '2025-01-14T21:35:07Z'
language: C#
archived: false
stars: 1435
@@ -40574,8 +40574,8 @@
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"3ffd7ef16308694a780e9dbad72b3edd3d45adaa5153a413705b1bd2e525c6fe"'
- repoLastModified: Mon, 13 Jan 2025 23:16:30 GMT
+ repoEtag: '"0a6b6c1055057d8efeeba5f221e1d6e40ecb4761d60fe6f64730dbaa361373cb"'
+ repoLastModified: Tue, 14 Jan 2025 21:35:07 GMT
id: f3215034d64cfcbcc28a4bdb0205a075
- source: IMPLEMENTATIONS.md
name: openapi-validator
@@ -40782,7 +40782,7 @@
owner: Cornutum
logo: https://avatars.githubusercontent.com/u/11477145?v=4
license: MIT
- repoEtag: '"07e404bf722d46427f14a4db9458559bf5f57833c347006eb3288c1422ba6f87"'
+ repoEtag: '"23c657adc404317491f4ba1128f1277e205d157e75756eb43ca6d20d1095cbf3"'
repoLastModified: Sun, 12 Jan 2025 14:11:02 GMT
id: 14da7572a7632f9a9fb1c1ab2acef586
- source: IMPLEMENTATIONS.md
@@ -41752,7 +41752,7 @@
LoopBack makes it easy to build modern API applications that require
complex integrations.
created: '2017-01-09T17:27:14Z'
- updated: '2025-01-13T22:42:40Z'
+ updated: '2025-01-15T00:54:42Z'
language: TypeScript
archived: false
stars: 4979
@@ -41761,8 +41761,8 @@
owner: loopbackio
logo: https://avatars.githubusercontent.com/u/22173486?v=4
license: NOASSERTION
- repoEtag: '"e370c05127e52b60d4042eedc2626ab4e1bbca355adfe8ff3e862be85de1a486"'
- repoLastModified: Mon, 13 Jan 2025 22:42:40 GMT
+ repoEtag: '"396c11014524e6fe7e13f9ed78cd9d628f837de0c81a5460dd6bd555097ceb58"'
+ repoLastModified: Wed, 15 Jan 2025 00:54:42 GMT
foundInMaster: true
id: 9132c25ad468bed25b9dbbe3a352abc2
v3: true
@@ -41834,17 +41834,17 @@
testing cloud services through their REST APIs and finding security and
reliability bugs in these services.
created: '2020-07-24T21:40:11Z'
- updated: '2025-01-13T19:30:43Z'
+ updated: '2025-01-14T21:30:44Z'
language: Python
archived: false
- stars: 2642
+ stars: 2644
watchers: 35
- forks: 307
+ forks: 308
owner: microsoft
logo: https://avatars.githubusercontent.com/u/6154722?v=4
license: MIT
- repoEtag: '"329cf7df517db93a532648f10c18c65876233b2232ea1e7fc25afa66eb70541b"'
- repoLastModified: Mon, 13 Jan 2025 19:30:43 GMT
+ repoEtag: '"506ac56e7d329dff5372bd312ea0273fe907d53764611b2877266753f8f01381"'
+ repoLastModified: Tue, 14 Jan 2025 21:30:44 GMT
foundInMaster: true
oldLocations:
- https://github.com/microsoft/restler