diff --git a/__tests__/__recordings__/configure-action-tests_1610138645/allows-for-ids-instead-of-names_2181842361/recording.har b/__tests__/__recordings__/configure-action-tests_1610138645/allows-for-ids-instead-of-names_2181842361/recording.har index 2e7dbc3..361c770 100644 --- a/__tests__/__recordings__/configure-action-tests_1610138645/allows-for-ids-instead-of-names_2181842361/recording.har +++ b/__tests__/__recordings__/configure-action-tests_1610138645/allows-for-ids-instead-of-names_2181842361/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "c6a8d72d08ddebc11c2622b786c55a00", + "_id": "68e6413ddfbccd07945fae79ede833b4", "_order": 0, "cache": {}, "request": { @@ -18,7 +18,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -42,10 +42,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 278, + "headersSize": 300, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -54,37 +54,59 @@ "value": "cloudtruth/configure-action" } ], - "url": "https://localhost:8000/api/v1/projects/?name=cloudtruth%2Fconfigure-action" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/?name=cloudtruth%2Fconfigure-action" }, "response": { - "bodySize": 323, + "bodySize": 512, "content": { "mimeType": "application/json", - "size": 323, + "size": 512, "text": { "count": 1, "next": null, "previous": null, "results": [ { - "created_at": "2021-09-17T14:10:32.574380Z", + "access_controlled": false, + "created_at": "2024-06-04T18:11:56.025576Z", + "dependents": [], + "depends_on": null, "description": "", - "id": "a9ff9bc3-d527-47eb-950b-1d7bcd06f183", - "modified_at": "2021-09-17T14:17:11.233790Z", + "id": "c50db8d7-901f-429e-856b-ee50a08dc08d", + "ledger_id": "16335396-f6f8-4774-a9ac-70cd4b9a48eb", + "modified_at": "2024-06-04T18:11:56.043087Z", "name": "cloudtruth/configure-action", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/" + "parameter_name_pattern": "", + "push_urls": [], + "pushes": [], + "role": null, + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/" } ] } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "jo4L/mnIDWgJLuX0RcfweCuqpQ3nWvRl9uAn4nZhIlteNFtKc1uuEB0+RKX2/0xqaBSCeia0M3L8Izkq7N/PCt6CIXaWhJZte5lrfJPg4jzGr08ukP3YfU+QXtfyj2QrJsrhKloikUpavXl0NojN5Ou7vlBuhCINxl6vHzJJnY80" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "jo4L/mnIDWgJLuX0RcfweCuqpQ3nWvRl9uAn4nZhIlteNFtKc1uuEB0+RKX2/0xqaBSCeia0M3L8Izkq7N/PCt6CIXaWhJZte5lrfJPg4jzGr08ukP3YfU+QXtfyj2QrJsrhKloikUpavXl0NojN5Ou7vlBuhCINxl6vHzJJnY80" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "UJbtyN56A2kWLdk5TneYyAEPHTEZTXyt985ZvqlwbPViMZlpL7OlB7ZU2OtSWxso" + "value": "FiMGubPG0LzRfos6x1knYSsk7gHWLiIGFgrVf2YnR6vLeMzWxDU4nheSOdcwB9Gl" }, { "expires": {}, @@ -92,25 +114,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "7zvqkjgghqrchh3w17xh76hkhh7vxztk" + "value": "03l5rz64qxw5h6io5m849rqcv269sk6a" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Tue, 04 Jun 2024 19:35:14 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:19 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "512" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=jo4L/mnIDWgJLuX0RcfweCuqpQ3nWvRl9uAn4nZhIlteNFtKc1uuEB0+RKX2/0xqaBSCeia0M3L8Izkq7N/PCt6CIXaWhJZte5lrfJPg4jzGr08ukP3YfU+QXtfyj2QrJsrhKloikUpavXl0NojN5Ou7vlBuhCINxl6vHzJJnY80; Expires=Tue, 11 Jun 2024 19:35:13 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=jo4L/mnIDWgJLuX0RcfweCuqpQ3nWvRl9uAn4nZhIlteNFtKc1uuEB0+RKX2/0xqaBSCeia0M3L8Izkq7N/PCt6CIXaWhJZte5lrfJPg4jzGr08ukP3YfU+QXtfyj2QrJsrhKloikUpavXl0NojN5Ou7vlBuhCINxl6vHzJJnY80; Expires=Tue, 11 Jun 2024 19:35:13 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=FiMGubPG0LzRfos6x1knYSsk7gHWLiIGFgrVf2YnR6vLeMzWxDU4nheSOdcwB9Gl; expires=Tue, 03 Jun 2025 19:35:14 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=03l5rz64qxw5h6io5m849rqcv269sk6a; expires=Tue, 18 Jun 2024 19:35:14 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -124,10 +170,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "323" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -137,24 +179,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=UJbtyN56A2kWLdk5TneYyAEPHTEZTXyt985ZvqlwbPViMZlpL7OlB7ZU2OtSWxso; expires=Fri, 16 Sep 2022 14:37:19 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=7zvqkjgghqrchh3w17xh76hkhh7vxztk; expires=Fri, 01 Oct 2021 14:37:19 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 576, + "headersSize": 1125, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:19.018Z", - "time": 338, + "startedDateTime": "2024-06-04T19:35:13.841Z", + "time": 984, "timings": { "blocked": -1, "connect": -1, @@ -162,11 +198,11 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 338 + "wait": 984 } }, { - "_id": "294fc3616dc92414c8a75b66d93cc838", + "_id": "9012016adf397b2818dd231841c4f097", "_order": 0, "cache": {}, "request": { @@ -176,7 +212,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -200,10 +236,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 260, + "headersSize": 282, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -212,38 +248,67 @@ "value": "default" } ], - "url": "https://localhost:8000/api/v1/environments/?name=default" + "url": "https://api.staging.cloudtruth.io/api/v1/environments/?name=default" }, "response": { - "bodySize": 368, + "bodySize": 1421, "content": { "mimeType": "application/json", - "size": 368, + "size": 1421, "text": { "count": 1, "next": null, "previous": null, "results": [ { - "created_at": "2021-09-17T13:30:42.266342Z", + "access_controlled": false, + "children": [ + "https://api.staging.cloudtruth.io/api/v1/environments/2abccd45-3a3e-4efc-954a-51cd91294609/", + "https://api.staging.cloudtruth.io/api/v1/environments/2869aad0-be79-4cce-9a68-872d3d33e0c0/", + "https://api.staging.cloudtruth.io/api/v1/environments/81217225-17f8-4323-be49-a409ac3429a6/", + "https://api.staging.cloudtruth.io/api/v1/environments/3c95f57f-448a-46e5-8955-ec5d8773072c/", + "https://api.staging.cloudtruth.io/api/v1/environments/fbf0487d-c13c-47d9-8c19-a71894e35d3e/", + "https://api.staging.cloudtruth.io/api/v1/environments/22b9e848-13e2-4e88-8a2d-804d07aa1ca4/", + "https://api.staging.cloudtruth.io/api/v1/environments/d4e94286-5f9f-418b-8bb2-5546af44bfc3/", + "https://api.staging.cloudtruth.io/api/v1/environments/3f025c2c-e945-4911-8b30-175417e0b752/", + "https://api.staging.cloudtruth.io/api/v1/environments/6fc450a2-5a4c-4e9b-89e5-0cf7f09c7951/", + "https://api.staging.cloudtruth.io/api/v1/environments/05a2acd1-4377-4406-9a8f-dc9845eda787/" + ], + "created_at": "2023-03-16T13:19:43.841719Z", "description": "Default environment, base for all environments.", - "id": "bdc8e316-ef59-4e2d-82ff-0e941565ce72", - "modified_at": "2021-09-17T14:10:36.775611Z", + "id": "76ba4595-bb96-406c-b1d7-f633e89d9c7d", + "ledger_id": "eb75bd6c-cd32-4421-9af5-32cf607967c9", + "modified_at": "2023-05-10T14:15:32.056188Z", "name": "default", "parent": null, - "url": "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/" + "role": null, + "url": "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/" } ] } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "emHLu7AxqdhJCbEASTrp2gbcN+3ipEys/4r6QNd8pqQUzPugP/LqjAVCm2oU8YoSzfH7zIP1F/P/DawP3Tfr/7tOPhj1ifEC6dDTd0ltw5Nzc4HcaT/njeXm3wLSk4zhQUBbqtE5ZfdfU5lAeihzj6hnE4oEKl5QxCuP9Eoq4P+f" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "emHLu7AxqdhJCbEASTrp2gbcN+3ipEys/4r6QNd8pqQUzPugP/LqjAVCm2oU8YoSzfH7zIP1F/P/DawP3Tfr/7tOPhj1ifEC6dDTd0ltw5Nzc4HcaT/njeXm3wLSk4zhQUBbqtE5ZfdfU5lAeihzj6hnE4oEKl5QxCuP9Eoq4P+f" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "EdUtkoeYgbNnDJfHao4oLKzwU2lq77IzDctxZBTnYTnEngxct2ect1azfs4PYDkT" + "value": "vEa5K56ZbASfsnLfahoSyBdLafLIoHdLQgjW7X03hSSh39h5rczcLPsqRQaXylWM" }, { "expires": {}, @@ -251,25 +316,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "y6j1zq8oa3c2797v999qgm8t3qufks54" + "value": "lkhxf2x1i0bw01kb48z9bravtzj2fsp2" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Tue, 04 Jun 2024 19:35:15 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:19 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "1421" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=emHLu7AxqdhJCbEASTrp2gbcN+3ipEys/4r6QNd8pqQUzPugP/LqjAVCm2oU8YoSzfH7zIP1F/P/DawP3Tfr/7tOPhj1ifEC6dDTd0ltw5Nzc4HcaT/njeXm3wLSk4zhQUBbqtE5ZfdfU5lAeihzj6hnE4oEKl5QxCuP9Eoq4P+f; Expires=Tue, 11 Jun 2024 19:35:14 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=emHLu7AxqdhJCbEASTrp2gbcN+3ipEys/4r6QNd8pqQUzPugP/LqjAVCm2oU8YoSzfH7zIP1F/P/DawP3Tfr/7tOPhj1ifEC6dDTd0ltw5Nzc4HcaT/njeXm3wLSk4zhQUBbqtE5ZfdfU5lAeihzj6hnE4oEKl5QxCuP9Eoq4P+f; Expires=Tue, 11 Jun 2024 19:35:14 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=vEa5K56ZbASfsnLfahoSyBdLafLIoHdLQgjW7X03hSSh39h5rczcLPsqRQaXylWM; expires=Tue, 03 Jun 2025 19:35:15 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=lkhxf2x1i0bw01kb48z9bravtzj2fsp2; expires=Tue, 18 Jun 2024 19:35:15 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -283,10 +372,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "368" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -296,24 +381,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=EdUtkoeYgbNnDJfHao4oLKzwU2lq77IzDctxZBTnYTnEngxct2ect1azfs4PYDkT; expires=Fri, 16 Sep 2022 14:37:19 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=y6j1zq8oa3c2797v999qgm8t3qufks54; expires=Fri, 01 Oct 2021 14:37:19 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 576, + "headersSize": 1126, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:19.364Z", - "time": 299, + "startedDateTime": "2024-06-04T19:35:14.834Z", + "time": 966, "timings": { "blocked": -1, "connect": -1, @@ -321,11 +400,11 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 299 + "wait": 966 } }, { - "_id": "7d9236f2ae8e7cda528267d0ec37e03d", + "_id": "55e14612fbc8ecc61c3283f9dec34588", "_order": 0, "cache": {}, "request": { @@ -335,7 +414,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -359,37 +438,59 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 280, + "headersSize": 302, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [], - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/" }, "response": { - "bodySize": 271, + "bodySize": 460, "content": { "mimeType": "application/json", - "size": 271, + "size": 460, "text": { - "created_at": "2021-09-17T14:10:32.574380Z", + "access_controlled": false, + "created_at": "2024-06-04T18:11:56.025576Z", + "dependents": [], + "depends_on": null, "description": "", - "id": "a9ff9bc3-d527-47eb-950b-1d7bcd06f183", - "modified_at": "2021-09-17T14:17:11.233790Z", + "id": "c50db8d7-901f-429e-856b-ee50a08dc08d", + "ledger_id": "16335396-f6f8-4774-a9ac-70cd4b9a48eb", + "modified_at": "2024-06-04T18:11:56.043087Z", "name": "cloudtruth/configure-action", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/" + "parameter_name_pattern": "", + "push_urls": [], + "pushes": [], + "role": null, + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/" } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "djmMBxEK3i7QGm11+tzYIssdBSOpQN+QB9NvEv5+Bd6jNwK3snRxSvzVNgrzCx3MFU5U1Dvq2elrFQisOdjYzFCwJaPkvGkbuFs0eLiyGWDiEms7ImAlMPnrk/V9mR7TFkjB4O6mTunyKEeWC5YVggNAOYmRwF2J0/sKJjAPXk3l" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "djmMBxEK3i7QGm11+tzYIssdBSOpQN+QB9NvEv5+Bd6jNwK3snRxSvzVNgrzCx3MFU5U1Dvq2elrFQisOdjYzFCwJaPkvGkbuFs0eLiyGWDiEms7ImAlMPnrk/V9mR7TFkjB4O6mTunyKEeWC5YVggNAOYmRwF2J0/sKJjAPXk3l" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "WmzAREwg0C20MESdhFIel5zSTee08REelP67lHOi2BY7KLjs2rWazyGgvubdDpK0" + "value": "akmrC28zbvMSxPeC6D6wnAUzOBen0X4CaP3Xv7v1QmD6oid0yVUMaM2CFo5lmTsd" }, { "expires": {}, @@ -397,25 +498,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "rarffqn4r98m02ih1s6lvmz1lk8ys5yo" + "value": "30vb24rm6bhi3k85hy4fgc9rlvizd3od" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Tue, 04 Jun 2024 19:35:16 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:20 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "460" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=djmMBxEK3i7QGm11+tzYIssdBSOpQN+QB9NvEv5+Bd6jNwK3snRxSvzVNgrzCx3MFU5U1Dvq2elrFQisOdjYzFCwJaPkvGkbuFs0eLiyGWDiEms7ImAlMPnrk/V9mR7TFkjB4O6mTunyKEeWC5YVggNAOYmRwF2J0/sKJjAPXk3l; Expires=Tue, 11 Jun 2024 19:35:15 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=djmMBxEK3i7QGm11+tzYIssdBSOpQN+QB9NvEv5+Bd6jNwK3snRxSvzVNgrzCx3MFU5U1Dvq2elrFQisOdjYzFCwJaPkvGkbuFs0eLiyGWDiEms7ImAlMPnrk/V9mR7TFkjB4O6mTunyKEeWC5YVggNAOYmRwF2J0/sKJjAPXk3l; Expires=Tue, 11 Jun 2024 19:35:15 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=akmrC28zbvMSxPeC6D6wnAUzOBen0X4CaP3Xv7v1QmD6oid0yVUMaM2CFo5lmTsd; expires=Tue, 03 Jun 2025 19:35:16 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=30vb24rm6bhi3k85hy4fgc9rlvizd3od; expires=Tue, 18 Jun 2024 19:35:16 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -429,10 +554,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "271" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -442,24 +563,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=WmzAREwg0C20MESdhFIel5zSTee08REelP67lHOi2BY7KLjs2rWazyGgvubdDpK0; expires=Fri, 16 Sep 2022 14:37:20 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=rarffqn4r98m02ih1s6lvmz1lk8ys5yo; expires=Fri, 01 Oct 2021 14:37:20 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 590, + "headersSize": 1139, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:19.671Z", - "time": 342, + "startedDateTime": "2024-06-04T19:35:15.805Z", + "time": 1088, "timings": { "blocked": -1, "connect": -1, @@ -467,11 +582,11 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 342 + "wait": 1088 } }, { - "_id": "3c280b713d9c79a0ee403e431fd09569", + "_id": "05edddf40ac101f0011ca40a3d26a019", "_order": 0, "cache": {}, "request": { @@ -481,7 +596,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -505,200 +620,156 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 347, + "headersSize": 381, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ { "name": "environment", - "value": "bdc8e316-ef59-4e2d-82ff-0e941565ce72" + "value": "76ba4595-bb96-406c-b1d7-f633e89d9c7d" }, { "name": "page", "value": "1" + }, + { + "name": "page_size", + "value": "3" } ], - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/?environment=bdc8e316-ef59-4e2d-82ff-0e941565ce72&page=1" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/?environment=76ba4595-bb96-406c-b1d7-f633e89d9c7d&page=1&page_size=3" }, "response": { - "bodySize": 5741, + "bodySize": 3649, "content": { "mimeType": "application/json", - "size": 5741, + "size": 3649, "text": { - "count": 5, + "count": 1, "next": null, "previous": null, "results": [ { - "created_at": "2021-09-17T14:10:35.343192Z", - "description": "", - "id": "b3bb4680-bc94-4a47-b238-171addc23156", - "modified_at": "2021-09-17T14:10:35.663230Z", - "name": "CTTEST_HAS_NO_OVERRIDE", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/b3bb4680-bc94-4a47-b238-171addc23156/", - "values": { - "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/": { - "created_at": "2021-09-17T14:10:35.647588Z", - "dynamic": false, - "dynamic_filter": "", - "dynamic_fqn": "", - "earliest_tag": null, - "environment": "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/", - "environment_name": "default", - "external": false, - "external_error": null, - "external_filter": "", - "external_fqn": "", - "id": "1d9e8383-f372-4471-a14b-139e8605e127", - "internal_value": "has_no_override_default", - "modified_at": "2021-09-17T14:10:35.647588Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/b3bb4680-bc94-4a47-b238-171addc23156/", - "secret": false, - "static_value": "has_no_override_default", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/b3bb4680-bc94-4a47-b238-171addc23156/values/1d9e8383-f372-4471-a14b-139e8605e127/", - "value": "has_no_override_default" - } - } - }, - { - "created_at": "2021-09-17T14:10:38.206228Z", - "description": "", - "id": "5e3ff32e-7b73-4bdc-b15e-55494f84f0f3", - "modified_at": "2021-09-17T14:10:38.206228Z", - "name": "CTTEST_HAS_NO_VALUE", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/5e3ff32e-7b73-4bdc-b15e-55494f84f0f3/", - "values": { - "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/": null - } - }, - { - "created_at": "2021-09-17T14:10:32.841971Z", - "description": "", - "id": "9fa37ea5-7872-4447-a55a-51ce1954de48", - "modified_at": "2021-09-17T14:17:11.230147Z", - "name": "CTTEST_NOT_A_SECRET", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/9fa37ea5-7872-4447-a55a-51ce1954de48/", - "values": { - "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/": { - "created_at": "2021-09-17T14:10:33.284290Z", - "dynamic": false, - "dynamic_filter": "", - "dynamic_fqn": "", - "earliest_tag": null, - "environment": "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/", - "environment_name": "default", - "external": false, - "external_error": null, - "external_filter": "", - "external_fqn": "", - "id": "7866de20-1bd4-481b-a815-b8c06fd8aaef", - "internal_value": "not_a_secret_default", - "modified_at": "2021-09-17T14:10:33.284290Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/9fa37ea5-7872-4447-a55a-51ce1954de48/", - "secret": false, - "static_value": "not_a_secret_default", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/9fa37ea5-7872-4447-a55a-51ce1954de48/values/7866de20-1bd4-481b-a815-b8c06fd8aaef/", - "value": "not_a_secret_default" - } - } - }, - { - "created_at": "2021-09-17T14:10:33.981024Z", + "created_at": "2024-06-05T20:12:52.092854Z", "description": "", - "id": "fda38b98-e5b0-4d37-8ca0-5c695212bb89", - "modified_at": "2021-09-17T14:10:34.977406Z", + "expiration_action": null, + "expired_status": null, + "expires": null, + "id": "9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49", + "ledger_id": "66f82427-0a89-424b-a0a7-94c795cb04c0", + "modified_at": "2024-06-05T20:12:52.114439Z", "name": "CTTEST_TOTALLY_A_SECRET", + "overrides": null, + "project": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/", + "project_name": "cloudtruth/configure-action", + "referencing_templates": [], + "referencing_values": [], "rules": [], "secret": true, "templates": [], "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/fda38b98-e5b0-4d37-8ca0-5c695212bb89/", + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/", "values": { - "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/": { - "created_at": "2021-09-17T14:10:34.313141Z", + "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/": { + "active_environment": "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/", + "active_environment_id": "76ba4595-bb96-406c-b1d7-f633e89d9c7d", + "active_environment_name": "default", + "created_at": "2024-06-05T20:13:01.294716Z", "dynamic": false, + "dynamic_error": null, "dynamic_filter": "", "dynamic_fqn": "", - "earliest_tag": null, - "environment": "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/", + "environment": "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/", + "environment_id": "76ba4595-bb96-406c-b1d7-f633e89d9c7d", "environment_name": "default", + "evaluated": false, + "expires_at": null, "external": false, "external_error": null, "external_filter": "", "external_fqn": "", - "id": "b92867d6-2c0d-43a7-9f16-85504c8f6ded", + "external_status": null, + "id": "f2cdcbf0-5261-4d67-9834-0b842c4c873d", "internal_value": null, - "modified_at": "2021-09-17T14:10:34.414380Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/fda38b98-e5b0-4d37-8ca0-5c695212bb89/", + "interpolated": false, + "ledger_id": "8216f912-60f6-4ba1-8af7-9ac30e7df799", + "modified_at": "2024-06-05T20:13:01.455153Z", + "parameter": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/", + "parameter_id": "9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49", + "referenced_parameters": [], + "referenced_projects": [], + "referenced_templates": [], "secret": true, "static_value": null, - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/fda38b98-e5b0-4d37-8ca0-5c695212bb89/values/b92867d6-2c0d-43a7-9f16-85504c8f6ded/", + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/values/f2cdcbf0-5261-4d67-9834-0b842c4c873d/", "value": "totally_a_secret_default" } - } - }, - { - "created_at": "2021-09-17T14:10:36.060882Z", - "description": "", - "id": "49dedfd8-8105-4d74-baa3-b6f5e5c3721c", - "modified_at": "2021-09-17T14:10:37.815115Z", - "name": "cttest.not.posix", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/49dedfd8-8105-4d74-baa3-b6f5e5c3721c/", - "values": { - "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/": { - "created_at": "2021-09-17T14:10:36.765569Z", + }, + "values_flat": [ + { + "active_environment": "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/", + "active_environment_id": "76ba4595-bb96-406c-b1d7-f633e89d9c7d", + "active_environment_name": "default", + "created_at": "2024-06-05T20:13:01.294716Z", "dynamic": false, + "dynamic_error": null, "dynamic_filter": "", "dynamic_fqn": "", - "earliest_tag": null, - "environment": "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/", + "environment": "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/", + "environment_id": "76ba4595-bb96-406c-b1d7-f633e89d9c7d", "environment_name": "default", + "evaluated": false, + "expires_at": null, "external": false, "external_error": null, "external_filter": "", "external_fqn": "", - "id": "5e58ab8c-826a-4398-8627-85fa011c0627", - "internal_value": "not.posix.default", - "modified_at": "2021-09-17T14:10:36.765569Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/49dedfd8-8105-4d74-baa3-b6f5e5c3721c/", - "secret": false, - "static_value": "not.posix.default", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/49dedfd8-8105-4d74-baa3-b6f5e5c3721c/values/5e58ab8c-826a-4398-8627-85fa011c0627/", - "value": "not.posix.default" + "external_status": null, + "id": "f2cdcbf0-5261-4d67-9834-0b842c4c873d", + "internal_value": null, + "interpolated": false, + "ledger_id": "8216f912-60f6-4ba1-8af7-9ac30e7df799", + "modified_at": "2024-06-05T20:13:01.455153Z", + "parameter": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/", + "parameter_id": "9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49", + "referenced_parameters": [], + "referenced_projects": [], + "referenced_templates": [], + "secret": true, + "static_value": null, + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/values/f2cdcbf0-5261-4d67-9834-0b842c4c873d/", + "value": "totally_a_secret_default" } - } + ] } ] } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "6keJmJPkxrPPZ41BxPqQoa8SA4uivYsTOGAHxHfAy2TP6S81JxM18bMb/c9jq7r1RmLPGQ4bRsnuLzFWOlbj0M6xeFih2xhVVk36QqsCM9YKDaiLdAOak8YaRN6kF5f4LzOe5eySYyMrWoAUcui2q/n1mN+azy+SgpU/3mV8aIjh" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "6keJmJPkxrPPZ41BxPqQoa8SA4uivYsTOGAHxHfAy2TP6S81JxM18bMb/c9jq7r1RmLPGQ4bRsnuLzFWOlbj0M6xeFih2xhVVk36QqsCM9YKDaiLdAOak8YaRN6kF5f4LzOe5eySYyMrWoAUcui2q/n1mN+azy+SgpU/3mV8aIjh" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "dwgGHBZ6nPukVdEQUF3wsN1otUDlyVwFNL1Ji2pupOq2htBXXwpWG3ph4CVpEMqW" + "value": "n2HDYhldXR9IwPn45vSVvftvzpsPqvDrjU5GeTMD00OYrL83268QDVmkcuw72dfi" }, { "expires": {}, @@ -706,25 +777,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "aws7l7xvqmysd6y9qzj0rz1el0xxs31p" + "value": "jl79rvr8vtcqrs4z0zdtoon52j6ndyut" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Thu, 06 Jun 2024 19:04:02 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:20 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "3649" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=6keJmJPkxrPPZ41BxPqQoa8SA4uivYsTOGAHxHfAy2TP6S81JxM18bMb/c9jq7r1RmLPGQ4bRsnuLzFWOlbj0M6xeFih2xhVVk36QqsCM9YKDaiLdAOak8YaRN6kF5f4LzOe5eySYyMrWoAUcui2q/n1mN+azy+SgpU/3mV8aIjh; Expires=Thu, 13 Jun 2024 19:04:01 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=6keJmJPkxrPPZ41BxPqQoa8SA4uivYsTOGAHxHfAy2TP6S81JxM18bMb/c9jq7r1RmLPGQ4bRsnuLzFWOlbj0M6xeFih2xhVVk36QqsCM9YKDaiLdAOak8YaRN6kF5f4LzOe5eySYyMrWoAUcui2q/n1mN+azy+SgpU/3mV8aIjh; Expires=Thu, 13 Jun 2024 19:04:01 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=n2HDYhldXR9IwPn45vSVvftvzpsPqvDrjU5GeTMD00OYrL83268QDVmkcuw72dfi; expires=Thu, 05 Jun 2025 19:04:02 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=jl79rvr8vtcqrs4z0zdtoon52j6ndyut; expires=Thu, 20 Jun 2024 19:04:02 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -738,10 +833,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "5741" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -751,24 +842,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=dwgGHBZ6nPukVdEQUF3wsN1otUDlyVwFNL1Ji2pupOq2htBXXwpWG3ph4CVpEMqW; expires=Fri, 16 Sep 2022 14:37:20 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=aws7l7xvqmysd6y9qzj0rz1el0xxs31p; expires=Fri, 01 Oct 2021 14:37:20 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 577, + "headersSize": 1126, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:20.021Z", - "time": 647, + "startedDateTime": "2024-06-06T19:04:01.827Z", + "time": 671, "timings": { "blocked": -1, "connect": -1, @@ -776,7 +861,7 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 647 + "wait": 671 } } ], diff --git a/__tests__/__recordings__/configure-action-tests_1610138645/configures-the-default-environment_2706873755/recording.har b/__tests__/__recordings__/configure-action-tests_1610138645/configures-the-default-environment_2706873755/recording.har index 22224ab..3f362dd 100644 --- a/__tests__/__recordings__/configure-action-tests_1610138645/configures-the-default-environment_2706873755/recording.har +++ b/__tests__/__recordings__/configure-action-tests_1610138645/configures-the-default-environment_2706873755/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "c6a8d72d08ddebc11c2622b786c55a00", + "_id": "68e6413ddfbccd07945fae79ede833b4", "_order": 0, "cache": {}, "request": { @@ -18,7 +18,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -42,10 +42,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 278, + "headersSize": 300, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -54,37 +54,59 @@ "value": "cloudtruth/configure-action" } ], - "url": "https://localhost:8000/api/v1/projects/?name=cloudtruth%2Fconfigure-action" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/?name=cloudtruth%2Fconfigure-action" }, "response": { - "bodySize": 323, + "bodySize": 512, "content": { "mimeType": "application/json", - "size": 323, + "size": 512, "text": { "count": 1, "next": null, "previous": null, "results": [ { - "created_at": "2021-09-17T14:10:32.574380Z", + "access_controlled": false, + "created_at": "2024-06-04T18:11:56.025576Z", + "dependents": [], + "depends_on": null, "description": "", - "id": "a9ff9bc3-d527-47eb-950b-1d7bcd06f183", - "modified_at": "2021-09-17T14:17:11.233790Z", + "id": "c50db8d7-901f-429e-856b-ee50a08dc08d", + "ledger_id": "16335396-f6f8-4774-a9ac-70cd4b9a48eb", + "modified_at": "2024-06-04T18:11:56.043087Z", "name": "cloudtruth/configure-action", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/" + "parameter_name_pattern": "", + "push_urls": [], + "pushes": [], + "role": null, + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/" } ] } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "8bg58nQbP8N8+Z7kdelTrKodv5trpCbVb18c1f4PsABEKHhlqyhw1tpvqKjNDqB96Dg5028gjXB7OfkeNuaQQma/qPS2ZjfjNU8dR2W5wRfbqSoGPo9bRiPvsu3Lpe4s2oDNuMfA02QjeCCh4XJp/d5lQI43eCY2YW8UpHvYnW9b" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "8bg58nQbP8N8+Z7kdelTrKodv5trpCbVb18c1f4PsABEKHhlqyhw1tpvqKjNDqB96Dg5028gjXB7OfkeNuaQQma/qPS2ZjfjNU8dR2W5wRfbqSoGPo9bRiPvsu3Lpe4s2oDNuMfA02QjeCCh4XJp/d5lQI43eCY2YW8UpHvYnW9b" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "2RBh8Fza4db3hhdw2hHLL1HkMLC6hUXKhUnygpQgTcIuamsPhQ1rILZ7ttJFny82" + "value": "qQCE9cPtR9ahsogPWiSL7ySqodOREWB18Lhxq27seRImyCKEqy0THVa8jRB9sh5C" }, { "expires": {}, @@ -92,268 +114,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "80ahk1o217b84n7cqccnpfrilp1myzj0" + "value": "zrexgp5kglip06kug4adh7lv5q5w8d25" } ], "headers": [ - { - "name": "server", - "value": "undisclosed" - }, { "name": "date", - "value": "Fri, 17 Sep 2021 14:37:17 GMT" - }, - { - "name": "connection", - "value": "close" + "value": "Tue, 04 Jun 2024 19:35:12 GMT" }, { "name": "content-type", "value": "application/json" }, - { - "name": "vary", - "value": "Accept, Cookie, Origin" - }, - { - "name": "allow", - "value": "GET, POST, HEAD, OPTIONS" - }, - { - "name": "x-frame-options", - "value": "DENY" - }, { "name": "content-length", - "value": "323" + "value": "512" }, { - "name": "x-content-type-options", - "value": "nosniff" - }, - { - "name": "referrer-policy", - "value": "same-origin" + "name": "connection", + "value": "close" }, { "_fromType": "array", "name": "set-cookie", - "value": "csrftoken=2RBh8Fza4db3hhdw2hHLL1HkMLC6hUXKhUnygpQgTcIuamsPhQ1rILZ7ttJFny82; expires=Fri, 16 Sep 2022 14:37:17 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + "value": "AWSALBTG=8bg58nQbP8N8+Z7kdelTrKodv5trpCbVb18c1f4PsABEKHhlqyhw1tpvqKjNDqB96Dg5028gjXB7OfkeNuaQQma/qPS2ZjfjNU8dR2W5wRfbqSoGPo9bRiPvsu3Lpe4s2oDNuMfA02QjeCCh4XJp/d5lQI43eCY2YW8UpHvYnW9b; Expires=Tue, 11 Jun 2024 19:35:11 GMT; Path=/" }, { "_fromType": "array", "name": "set-cookie", - "value": "sessionid=80ahk1o217b84n7cqccnpfrilp1myzj0; expires=Fri, 01 Oct 2021 14:37:17 GMT; Max-Age=1209600; Path=/; Secure" - } - ], - "headersSize": 576, - "httpVersion": "HTTP/1.1", - "redirectURL": "", - "status": 200, - "statusText": "OK" - }, - "startedDateTime": "2021-09-17T14:37:17.098Z", - "time": 702, - "timings": { - "blocked": -1, - "connect": -1, - "dns": -1, - "receive": 0, - "send": 0, - "ssl": -1, - "wait": 702 - } - }, - { - "_id": "3bbdd15429bdfd07b22480dadc7aa407", - "_order": 0, - "cache": {}, - "request": { - "bodySize": 0, - "cookies": [], - "headers": [ - { - "_fromType": "array", - "name": "user-agent", - "value": "configure-action/2.1.0" - }, - { - "_fromType": "array", - "name": "authorization", - "value": "Api-Key x" + "value": "AWSALBTGCORS=8bg58nQbP8N8+Z7kdelTrKodv5trpCbVb18c1f4PsABEKHhlqyhw1tpvqKjNDqB96Dg5028gjXB7OfkeNuaQQma/qPS2ZjfjNU8dR2W5wRfbqSoGPo9bRiPvsu3Lpe4s2oDNuMfA02QjeCCh4XJp/d5lQI43eCY2YW8UpHvYnW9b; Expires=Tue, 11 Jun 2024 19:35:11 GMT; Path=/; SameSite=None; Secure" }, { "_fromType": "array", - "name": "accept", - "value": "*/*" - }, - { - "_fromType": "array", - "name": "accept-encoding", - "value": "gzip,deflate" + "name": "set-cookie", + "value": "csrftoken=qQCE9cPtR9ahsogPWiSL7ySqodOREWB18Lhxq27seRImyCKEqy0THVa8jRB9sh5C; expires=Tue, 03 Jun 2025 19:35:12 GMT; Max-Age=31449600; Path=/; SameSite=Lax" }, { "_fromType": "array", - "name": "connection", - "value": "close" - }, - { - "name": "host", - "value": "localhost:8000" - } - ], - "headersSize": 330, - "httpVersion": "HTTP/1.1", - "method": "GET", - "queryString": [ - { - "name": "environment", - "value": "default" - }, - { - "name": "page", - "value": "1" - }, - { - "name": "page_size", - "value": "3" - } - ], - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/?environment=default&page=1&page_size=3" - }, - "response": { - "bodySize": 3281, - "content": { - "mimeType": "application/json", - "size": 3281, - "text": { - "count": 5, - "next": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/?environment=default&page=2&page_size=3", - "previous": null, - "results": [ - { - "created_at": "2021-09-17T14:10:35.343192Z", - "description": "", - "id": "b3bb4680-bc94-4a47-b238-171addc23156", - "modified_at": "2021-09-17T14:10:35.663230Z", - "name": "CTTEST_HAS_NO_OVERRIDE", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/b3bb4680-bc94-4a47-b238-171addc23156/", - "values": { - "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/": { - "created_at": "2021-09-17T14:10:35.647588Z", - "dynamic": false, - "dynamic_filter": "", - "dynamic_fqn": "", - "earliest_tag": null, - "environment": "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/", - "environment_name": "default", - "external": false, - "external_error": null, - "external_filter": "", - "external_fqn": "", - "id": "1d9e8383-f372-4471-a14b-139e8605e127", - "internal_value": "has_no_override_default", - "modified_at": "2021-09-17T14:10:35.647588Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/b3bb4680-bc94-4a47-b238-171addc23156/", - "secret": false, - "static_value": "has_no_override_default", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/b3bb4680-bc94-4a47-b238-171addc23156/values/1d9e8383-f372-4471-a14b-139e8605e127/", - "value": "has_no_override_default" - } - } - }, - { - "created_at": "2021-09-17T14:10:38.206228Z", - "description": "", - "id": "5e3ff32e-7b73-4bdc-b15e-55494f84f0f3", - "modified_at": "2021-09-17T14:10:38.206228Z", - "name": "CTTEST_HAS_NO_VALUE", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/5e3ff32e-7b73-4bdc-b15e-55494f84f0f3/", - "values": { - "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/": null - } - }, - { - "created_at": "2021-09-17T14:10:32.841971Z", - "description": "", - "id": "9fa37ea5-7872-4447-a55a-51ce1954de48", - "modified_at": "2021-09-17T14:17:11.230147Z", - "name": "CTTEST_NOT_A_SECRET", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/9fa37ea5-7872-4447-a55a-51ce1954de48/", - "values": { - "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/": { - "created_at": "2021-09-17T14:10:33.284290Z", - "dynamic": false, - "dynamic_filter": "", - "dynamic_fqn": "", - "earliest_tag": null, - "environment": "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/", - "environment_name": "default", - "external": false, - "external_error": null, - "external_filter": "", - "external_fqn": "", - "id": "7866de20-1bd4-481b-a815-b8c06fd8aaef", - "internal_value": "not_a_secret_default", - "modified_at": "2021-09-17T14:10:33.284290Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/9fa37ea5-7872-4447-a55a-51ce1954de48/", - "secret": false, - "static_value": "not_a_secret_default", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/9fa37ea5-7872-4447-a55a-51ce1954de48/values/7866de20-1bd4-481b-a815-b8c06fd8aaef/", - "value": "not_a_secret_default" - } - } - } - ] - } - }, - "cookies": [ - { - "expires": {}, - "maxAge": 31449600, - "name": "csrftoken", - "path": "/", - "sameSite": "Lax", - "value": "GRrqtmpYtIrw98ZuKkWj4BIjI4UZ2PyyR8vCM3P06WksNYAPw44b9OfBfQAHHGSF" + "name": "set-cookie", + "value": "sessionid=zrexgp5kglip06kug4adh7lv5q5w8d25; expires=Tue, 18 Jun 2024 19:35:12 GMT; Max-Age=1209600; Path=/; Secure" }, - { - "expires": {}, - "maxAge": 1209600, - "name": "sessionid", - "path": "/", - "secure": true, - "value": "u1ugi9xt3hnzj4iqbdy6peu6emk5estk" - } - ], - "headers": [ { "name": "server", - "value": "undisclosed" - }, - { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:18 GMT" - }, - { - "name": "connection", - "value": "close" - }, - { - "name": "content-type", - "value": "application/json" + "value": "gunicorn" }, { "name": "vary", @@ -367,10 +170,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "3281" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -380,24 +179,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=GRrqtmpYtIrw98ZuKkWj4BIjI4UZ2PyyR8vCM3P06WksNYAPw44b9OfBfQAHHGSF; expires=Fri, 16 Sep 2022 14:37:18 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=u1ugi9xt3hnzj4iqbdy6peu6emk5estk; expires=Fri, 01 Oct 2021 14:37:18 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 577, + "headersSize": 1125, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:17.813Z", - "time": 605, + "startedDateTime": "2024-06-04T19:35:11.277Z", + "time": 1518, "timings": { "blocked": -1, "connect": -1, @@ -405,11 +198,11 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 605 + "wait": 1518 } }, { - "_id": "3ac8174e62f0057af2c6cb1a2ca3fffe", + "_id": "a0ef4e7e2961b92d601b4728ed5f24e4", "_order": 0, "cache": {}, "request": { @@ -419,7 +212,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -443,10 +236,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 330, + "headersSize": 352, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -456,106 +249,143 @@ }, { "name": "page", - "value": "2" + "value": "1" }, { "name": "page_size", "value": "3" } ], - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/?environment=default&page=2&page_size=3" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/?environment=default&page=1&page_size=3" }, "response": { - "bodySize": 2752, + "bodySize": 3649, "content": { "mimeType": "application/json", - "size": 2752, + "size": 3649, "text": { - "count": 5, + "count": 1, "next": null, - "previous": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/?environment=default&page_size=3", + "previous": null, "results": [ { - "created_at": "2021-09-17T14:10:33.981024Z", + "created_at": "2024-06-05T20:12:52.092854Z", "description": "", - "id": "fda38b98-e5b0-4d37-8ca0-5c695212bb89", - "modified_at": "2021-09-17T14:10:34.977406Z", + "expiration_action": null, + "expired_status": null, + "expires": null, + "id": "9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49", + "ledger_id": "66f82427-0a89-424b-a0a7-94c795cb04c0", + "modified_at": "2024-06-05T20:12:52.114439Z", "name": "CTTEST_TOTALLY_A_SECRET", + "overrides": null, + "project": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/", + "project_name": "cloudtruth/configure-action", + "referencing_templates": [], + "referencing_values": [], "rules": [], "secret": true, "templates": [], "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/fda38b98-e5b0-4d37-8ca0-5c695212bb89/", + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/", "values": { - "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/": { - "created_at": "2021-09-17T14:10:34.313141Z", + "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/": { + "active_environment": "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/", + "active_environment_id": "76ba4595-bb96-406c-b1d7-f633e89d9c7d", + "active_environment_name": "default", + "created_at": "2024-06-05T20:13:01.294716Z", "dynamic": false, + "dynamic_error": null, "dynamic_filter": "", "dynamic_fqn": "", - "earliest_tag": null, - "environment": "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/", + "environment": "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/", + "environment_id": "76ba4595-bb96-406c-b1d7-f633e89d9c7d", "environment_name": "default", + "evaluated": false, + "expires_at": null, "external": false, "external_error": null, "external_filter": "", "external_fqn": "", - "id": "b92867d6-2c0d-43a7-9f16-85504c8f6ded", + "external_status": null, + "id": "f2cdcbf0-5261-4d67-9834-0b842c4c873d", "internal_value": null, - "modified_at": "2021-09-17T14:10:34.414380Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/fda38b98-e5b0-4d37-8ca0-5c695212bb89/", + "interpolated": false, + "ledger_id": "8216f912-60f6-4ba1-8af7-9ac30e7df799", + "modified_at": "2024-06-05T20:13:01.455153Z", + "parameter": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/", + "parameter_id": "9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49", + "referenced_parameters": [], + "referenced_projects": [], + "referenced_templates": [], "secret": true, "static_value": null, - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/fda38b98-e5b0-4d37-8ca0-5c695212bb89/values/b92867d6-2c0d-43a7-9f16-85504c8f6ded/", + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/values/f2cdcbf0-5261-4d67-9834-0b842c4c873d/", "value": "totally_a_secret_default" } - } - }, - { - "created_at": "2021-09-17T14:10:36.060882Z", - "description": "", - "id": "49dedfd8-8105-4d74-baa3-b6f5e5c3721c", - "modified_at": "2021-09-17T14:10:37.815115Z", - "name": "cttest.not.posix", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/49dedfd8-8105-4d74-baa3-b6f5e5c3721c/", - "values": { - "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/": { - "created_at": "2021-09-17T14:10:36.765569Z", + }, + "values_flat": [ + { + "active_environment": "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/", + "active_environment_id": "76ba4595-bb96-406c-b1d7-f633e89d9c7d", + "active_environment_name": "default", + "created_at": "2024-06-05T20:13:01.294716Z", "dynamic": false, + "dynamic_error": null, "dynamic_filter": "", "dynamic_fqn": "", - "earliest_tag": null, - "environment": "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/", + "environment": "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/", + "environment_id": "76ba4595-bb96-406c-b1d7-f633e89d9c7d", "environment_name": "default", + "evaluated": false, + "expires_at": null, "external": false, "external_error": null, "external_filter": "", "external_fqn": "", - "id": "5e58ab8c-826a-4398-8627-85fa011c0627", - "internal_value": "not.posix.default", - "modified_at": "2021-09-17T14:10:36.765569Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/49dedfd8-8105-4d74-baa3-b6f5e5c3721c/", - "secret": false, - "static_value": "not.posix.default", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/49dedfd8-8105-4d74-baa3-b6f5e5c3721c/values/5e58ab8c-826a-4398-8627-85fa011c0627/", - "value": "not.posix.default" + "external_status": null, + "id": "f2cdcbf0-5261-4d67-9834-0b842c4c873d", + "internal_value": null, + "interpolated": false, + "ledger_id": "8216f912-60f6-4ba1-8af7-9ac30e7df799", + "modified_at": "2024-06-05T20:13:01.455153Z", + "parameter": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/", + "parameter_id": "9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49", + "referenced_parameters": [], + "referenced_projects": [], + "referenced_templates": [], + "secret": true, + "static_value": null, + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/values/f2cdcbf0-5261-4d67-9834-0b842c4c873d/", + "value": "totally_a_secret_default" } - } + ] } ] } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "YohO6PvKtig8CZHOltOe3RYaAe5jj9IvnoxvI89LFuWZA1PqvrpevWS83oPWCffQjlJURD6RQKlJAFgrbgMWHVgPDL4iptMX04/IKxOIx9UD5weo07p6o9BT/G1nm/RRtQg6ByMTQWiRiJnaaEpmAziNu5Mn0nBCrsCDX7PSEaPi" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "YohO6PvKtig8CZHOltOe3RYaAe5jj9IvnoxvI89LFuWZA1PqvrpevWS83oPWCffQjlJURD6RQKlJAFgrbgMWHVgPDL4iptMX04/IKxOIx9UD5weo07p6o9BT/G1nm/RRtQg6ByMTQWiRiJnaaEpmAziNu5Mn0nBCrsCDX7PSEaPi" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "0aHqKU001mmD2pDjm1VBdcdpJlpH9WxrywgXB6WI1N2xgGQw8RJVJAnereKNlhTo" + "value": "EO9mVGHXntnVWhBVLFhvcZcuTirWLWt3YL2TOVhtKouL8PySyFq4h4UZnlZDPoxy" }, { "expires": {}, @@ -563,25 +393,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "whi9sul46ozzofl5yrsjvxyhjfq3mr2w" + "value": "u6pzvijl8cyjeytlmu0o1uyepa2o30qh" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Thu, 06 Jun 2024 19:04:01 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:18 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "3649" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=YohO6PvKtig8CZHOltOe3RYaAe5jj9IvnoxvI89LFuWZA1PqvrpevWS83oPWCffQjlJURD6RQKlJAFgrbgMWHVgPDL4iptMX04/IKxOIx9UD5weo07p6o9BT/G1nm/RRtQg6ByMTQWiRiJnaaEpmAziNu5Mn0nBCrsCDX7PSEaPi; Expires=Thu, 13 Jun 2024 19:04:01 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=YohO6PvKtig8CZHOltOe3RYaAe5jj9IvnoxvI89LFuWZA1PqvrpevWS83oPWCffQjlJURD6RQKlJAFgrbgMWHVgPDL4iptMX04/IKxOIx9UD5weo07p6o9BT/G1nm/RRtQg6ByMTQWiRiJnaaEpmAziNu5Mn0nBCrsCDX7PSEaPi; Expires=Thu, 13 Jun 2024 19:04:01 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=EO9mVGHXntnVWhBVLFhvcZcuTirWLWt3YL2TOVhtKouL8PySyFq4h4UZnlZDPoxy; expires=Thu, 05 Jun 2025 19:04:01 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=u6pzvijl8cyjeytlmu0o1uyepa2o30qh; expires=Thu, 20 Jun 2024 19:04:01 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -595,10 +449,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "2752" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -608,24 +458,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=0aHqKU001mmD2pDjm1VBdcdpJlpH9WxrywgXB6WI1N2xgGQw8RJVJAnereKNlhTo; expires=Fri, 16 Sep 2022 14:37:18 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=whi9sul46ozzofl5yrsjvxyhjfq3mr2w; expires=Fri, 01 Oct 2021 14:37:18 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 577, + "headersSize": 1126, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:18.430Z", - "time": 555, + "startedDateTime": "2024-06-06T19:04:00.991Z", + "time": 811, "timings": { "blocked": -1, "connect": -1, @@ -633,7 +477,7 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 555 + "wait": 811 } } ], diff --git a/__tests__/__recordings__/configure-action-tests_1610138645/configures-the-override-environment-using-a-tag_1503278047/recording.har b/__tests__/__recordings__/configure-action-tests_1610138645/configures-the-override-environment-using-a-tag_1503278047/recording.har index d015756..291e580 100644 --- a/__tests__/__recordings__/configure-action-tests_1610138645/configures-the-override-environment-using-a-tag_1503278047/recording.har +++ b/__tests__/__recordings__/configure-action-tests_1610138645/configures-the-override-environment-using-a-tag_1503278047/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "c6a8d72d08ddebc11c2622b786c55a00", + "_id": "68e6413ddfbccd07945fae79ede833b4", "_order": 0, "cache": {}, "request": { @@ -18,7 +18,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -42,10 +42,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 278, + "headersSize": 300, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -54,37 +54,59 @@ "value": "cloudtruth/configure-action" } ], - "url": "https://localhost:8000/api/v1/projects/?name=cloudtruth%2Fconfigure-action" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/?name=cloudtruth%2Fconfigure-action" }, "response": { - "bodySize": 323, + "bodySize": 512, "content": { "mimeType": "application/json", - "size": 323, + "size": 512, "text": { "count": 1, "next": null, "previous": null, "results": [ { - "created_at": "2021-09-17T14:10:32.574380Z", + "access_controlled": false, + "created_at": "2024-06-04T18:11:56.025576Z", + "dependents": [], + "depends_on": null, "description": "", - "id": "a9ff9bc3-d527-47eb-950b-1d7bcd06f183", - "modified_at": "2021-09-17T14:17:11.233790Z", + "id": "c50db8d7-901f-429e-856b-ee50a08dc08d", + "ledger_id": "16335396-f6f8-4774-a9ac-70cd4b9a48eb", + "modified_at": "2024-06-04T18:11:56.043087Z", "name": "cloudtruth/configure-action", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/" + "parameter_name_pattern": "", + "push_urls": [], + "pushes": [], + "role": null, + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/" } ] } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "V1lHw3qDhbrwW5RJznQgK3trXpeNZxNknOOAFE/QNmOqOSBuEOBUOmanFzEsb5KOgab9ur3AuacHfGx3iGz61eD79Ue6AdtXWaarSM951SO+dRVWoyYN/3vLrvtOGgCbkDMWp5AxAQC7oWjwKuzVhRvVwHBWWejBQkXgeUHPsekt" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "V1lHw3qDhbrwW5RJznQgK3trXpeNZxNknOOAFE/QNmOqOSBuEOBUOmanFzEsb5KOgab9ur3AuacHfGx3iGz61eD79Ue6AdtXWaarSM951SO+dRVWoyYN/3vLrvtOGgCbkDMWp5AxAQC7oWjwKuzVhRvVwHBWWejBQkXgeUHPsekt" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "5puNE2jiNPnMLEHS1GH2DENB6m1Zqf3n9TXzmj9pufp2gdjuyOVsf5nIGN6oj874" + "value": "KOI8192ocZPrdNAOLb6HwH43WxdDAFw6WySj7YtsuHSwrEdFC5II8eCTPbGa5W5a" }, { "expires": {}, @@ -92,25 +114,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "5uoiy2tsy87haenqed8zgzujh5dmgad5" + "value": "i4yz9cawbm7q5zpuok9ts8y7gazbe2oq" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Tue, 04 Jun 2024 19:35:22 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:23 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "512" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=V1lHw3qDhbrwW5RJznQgK3trXpeNZxNknOOAFE/QNmOqOSBuEOBUOmanFzEsb5KOgab9ur3AuacHfGx3iGz61eD79Ue6AdtXWaarSM951SO+dRVWoyYN/3vLrvtOGgCbkDMWp5AxAQC7oWjwKuzVhRvVwHBWWejBQkXgeUHPsekt; Expires=Tue, 11 Jun 2024 19:35:22 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=V1lHw3qDhbrwW5RJznQgK3trXpeNZxNknOOAFE/QNmOqOSBuEOBUOmanFzEsb5KOgab9ur3AuacHfGx3iGz61eD79Ue6AdtXWaarSM951SO+dRVWoyYN/3vLrvtOGgCbkDMWp5AxAQC7oWjwKuzVhRvVwHBWWejBQkXgeUHPsekt; Expires=Tue, 11 Jun 2024 19:35:22 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=KOI8192ocZPrdNAOLb6HwH43WxdDAFw6WySj7YtsuHSwrEdFC5II8eCTPbGa5W5a; expires=Tue, 03 Jun 2025 19:35:22 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=i4yz9cawbm7q5zpuok9ts8y7gazbe2oq; expires=Tue, 18 Jun 2024 19:35:22 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -124,10 +170,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "323" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -137,24 +179,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=5puNE2jiNPnMLEHS1GH2DENB6m1Zqf3n9TXzmj9pufp2gdjuyOVsf5nIGN6oj874; expires=Fri, 16 Sep 2022 14:37:23 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=5uoiy2tsy87haenqed8zgzujh5dmgad5; expires=Fri, 01 Oct 2021 14:37:23 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 576, + "headersSize": 1125, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:23.058Z", - "time": 517, + "startedDateTime": "2024-06-04T19:35:22.132Z", + "time": 794, "timings": { "blocked": -1, "connect": -1, @@ -162,11 +198,11 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 517 + "wait": 794 } }, { - "_id": "3dae19ae3f223433becd8530eeb13b93", + "_id": "d3f77c8107712d4f07e9291d28804b61", "_order": 0, "cache": {}, "request": { @@ -176,7 +212,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -200,10 +236,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 330, + "headersSize": 364, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -211,193 +247,52 @@ "name": "environment", "value": "staging" }, - { - "name": "tag", - "value": "tag-one" - }, { "name": "page", "value": "1" + }, + { + "name": "page_size", + "value": "3" + }, + { + "name": "tag", + "value": "tag-one" } ], - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/?environment=staging&tag=tag-one&page=1" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/?environment=staging&page=1&page_size=3&tag=tag-one" }, "response": { - "bodySize": 5787, + "bodySize": 71, "content": { "mimeType": "application/json", - "size": 5787, + "size": 71, "text": { - "count": 5, - "next": null, - "previous": null, - "results": [ - { - "created_at": "2021-09-17T14:10:38.206228Z", - "description": "", - "id": "5e3ff32e-7b73-4bdc-b15e-55494f84f0f3", - "modified_at": "2021-09-17T14:10:38.206228Z", - "name": "CTTEST_HAS_NO_VALUE", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/5e3ff32e-7b73-4bdc-b15e-55494f84f0f3/", - "values": { - "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/": null - } - }, - { - "created_at": "2021-09-17T14:10:36.060882Z", - "description": "", - "id": "49dedfd8-8105-4d74-baa3-b6f5e5c3721c", - "modified_at": "2021-09-17T14:10:36.060882Z", - "name": "cttest.not.posix", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/49dedfd8-8105-4d74-baa3-b6f5e5c3721c/", - "values": { - "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/": { - "created_at": "2021-09-17T14:10:37.796057Z", - "dynamic": false, - "dynamic_filter": "", - "dynamic_fqn": "", - "earliest_tag": "tag-one", - "environment": "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/", - "environment_name": "staging", - "external": false, - "external_error": null, - "external_filter": "", - "external_fqn": "", - "id": "1ab3ee1f-a5cd-4f0b-a807-3310b1f963cc", - "internal_value": "not.posix.override", - "modified_at": "2021-09-17T14:10:37.796057Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/49dedfd8-8105-4d74-baa3-b6f5e5c3721c/", - "secret": false, - "static_value": "not.posix.override", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/49dedfd8-8105-4d74-baa3-b6f5e5c3721c/values/1ab3ee1f-a5cd-4f0b-a807-3310b1f963cc/", - "value": "not.posix.override" - } - } - }, - { - "created_at": "2021-09-17T14:10:35.343192Z", - "description": "", - "id": "b3bb4680-bc94-4a47-b238-171addc23156", - "modified_at": "2021-09-17T14:10:35.343192Z", - "name": "CTTEST_HAS_NO_OVERRIDE", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/b3bb4680-bc94-4a47-b238-171addc23156/", - "values": { - "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/": { - "created_at": "2021-09-17T14:10:35.647588Z", - "dynamic": false, - "dynamic_filter": "", - "dynamic_fqn": "", - "earliest_tag": null, - "environment": "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/", - "environment_name": "default", - "external": false, - "external_error": null, - "external_filter": "", - "external_fqn": "", - "id": "1d9e8383-f372-4471-a14b-139e8605e127", - "internal_value": "has_no_override_default", - "modified_at": "2021-09-17T14:10:35.647588Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/b3bb4680-bc94-4a47-b238-171addc23156/", - "secret": false, - "static_value": "has_no_override_default", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/b3bb4680-bc94-4a47-b238-171addc23156/values/1d9e8383-f372-4471-a14b-139e8605e127/", - "value": "has_no_override_default" - } - } - }, - { - "created_at": "2021-09-17T14:10:33.981024Z", - "description": "", - "id": "fda38b98-e5b0-4d37-8ca0-5c695212bb89", - "modified_at": "2021-09-17T14:10:33.981024Z", - "name": "CTTEST_TOTALLY_A_SECRET", - "rules": [], - "secret": true, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/fda38b98-e5b0-4d37-8ca0-5c695212bb89/", - "values": { - "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/": { - "created_at": "2021-09-17T14:10:34.866480Z", - "dynamic": false, - "dynamic_filter": "", - "dynamic_fqn": "", - "earliest_tag": "tag-one", - "environment": "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/", - "environment_name": "staging", - "external": false, - "external_error": null, - "external_filter": "", - "external_fqn": "", - "id": "2110e786-578a-4de4-b6d0-ff463a372235", - "internal_value": null, - "modified_at": "2021-09-17T14:10:34.960830Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/fda38b98-e5b0-4d37-8ca0-5c695212bb89/", - "secret": true, - "static_value": null, - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/fda38b98-e5b0-4d37-8ca0-5c695212bb89/values/2110e786-578a-4de4-b6d0-ff463a372235/", - "value": "totally_a_secret_override" - } - } - }, - { - "created_at": "2021-09-17T14:10:32.841971Z", - "description": "", - "id": "9fa37ea5-7872-4447-a55a-51ce1954de48", - "modified_at": "2021-09-17T14:10:32.841971Z", - "name": "CTTEST_NOT_A_SECRET", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/9fa37ea5-7872-4447-a55a-51ce1954de48/", - "values": { - "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/": { - "created_at": "2021-09-17T14:10:33.636590Z", - "dynamic": false, - "dynamic_filter": "", - "dynamic_fqn": "", - "earliest_tag": "tag-one", - "environment": "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/", - "environment_name": "staging", - "external": false, - "external_error": null, - "external_filter": "", - "external_fqn": "", - "id": "37cdbc93-3cce-4709-ba39-369b76a654aa", - "internal_value": "not_a_secret_override_tag_one", - "modified_at": "2021-09-17T14:10:33.636590Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/9fa37ea5-7872-4447-a55a-51ce1954de48/", - "secret": false, - "static_value": "not_a_secret_override_tag_one", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/9fa37ea5-7872-4447-a55a-51ce1954de48/values/37cdbc93-3cce-4709-ba39-369b76a654aa/", - "value": "not_a_secret_override_tag_one" - } - } - } - ] + "detail": "Tag `tag-one` could not be found in environment `staging`." } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "auMka34MaEQSs5Rc/aeSfGKUkkYg0BfWQxnsH0osLu3tCZUxgZam1dbP60rxA/brLlgR7hlFdb7R8Ccq0RZr1YNj3osScizXjZys32YonUjhpFJ+Lx21yjB5+AmrVTcrSSaTZoG/ZJE6Go3pWz+cSJOawxmmGu3qi+/mVVSlZmS1" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "auMka34MaEQSs5Rc/aeSfGKUkkYg0BfWQxnsH0osLu3tCZUxgZam1dbP60rxA/brLlgR7hlFdb7R8Ccq0RZr1YNj3osScizXjZys32YonUjhpFJ+Lx21yjB5+AmrVTcrSSaTZoG/ZJE6Go3pWz+cSJOawxmmGu3qi+/mVVSlZmS1" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "GDhkyhLIoIzLtA1Sb75k7Yv5fA92Q38tljXnY4DGGmHmzvnXCDzoQySMYIIjfh3A" + "value": "B2AWzN1fZwnTpA083nM2mL0EV03tIDbRF4HgwmZZQ9Z7cdKeicHs5mVZpw1zrdGB" }, { "expires": {}, @@ -405,25 +300,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "7gybce2nkn78iiuvbjtrad8f38pj1noq" + "value": "a3zhn6qpu9kvx00ctlbotw6y7j4h5ffg" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Thu, 06 Jun 2024 19:04:04 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:24 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "71" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=auMka34MaEQSs5Rc/aeSfGKUkkYg0BfWQxnsH0osLu3tCZUxgZam1dbP60rxA/brLlgR7hlFdb7R8Ccq0RZr1YNj3osScizXjZys32YonUjhpFJ+Lx21yjB5+AmrVTcrSSaTZoG/ZJE6Go3pWz+cSJOawxmmGu3qi+/mVVSlZmS1; Expires=Thu, 13 Jun 2024 19:04:04 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=auMka34MaEQSs5Rc/aeSfGKUkkYg0BfWQxnsH0osLu3tCZUxgZam1dbP60rxA/brLlgR7hlFdb7R8Ccq0RZr1YNj3osScizXjZys32YonUjhpFJ+Lx21yjB5+AmrVTcrSSaTZoG/ZJE6Go3pWz+cSJOawxmmGu3qi+/mVVSlZmS1; Expires=Thu, 13 Jun 2024 19:04:04 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=B2AWzN1fZwnTpA083nM2mL0EV03tIDbRF4HgwmZZQ9Z7cdKeicHs5mVZpw1zrdGB; expires=Thu, 05 Jun 2025 19:04:04 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=a3zhn6qpu9kvx00ctlbotw6y7j4h5ffg; expires=Thu, 20 Jun 2024 19:04:04 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -437,10 +356,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "5787" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -450,24 +365,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=GDhkyhLIoIzLtA1Sb75k7Yv5fA92Q38tljXnY4DGGmHmzvnXCDzoQySMYIIjfh3A; expires=Fri, 16 Sep 2022 14:37:24 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=7gybce2nkn78iiuvbjtrad8f38pj1noq; expires=Fri, 01 Oct 2021 14:37:24 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 577, + "headersSize": 1124, "httpVersion": "HTTP/1.1", "redirectURL": "", - "status": 200, - "statusText": "OK" + "status": 404, + "statusText": "Not Found" }, - "startedDateTime": "2021-09-17T14:37:23.584Z", - "time": 628, + "startedDateTime": "2024-06-06T19:04:04.181Z", + "time": 601, "timings": { "blocked": -1, "connect": -1, @@ -475,7 +384,7 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 628 + "wait": 601 } } ], diff --git a/__tests__/__recordings__/configure-action-tests_1610138645/configures-the-override-environment_2952322436/recording.har b/__tests__/__recordings__/configure-action-tests_1610138645/configures-the-override-environment_2952322436/recording.har index f0ef559..df1b248 100644 --- a/__tests__/__recordings__/configure-action-tests_1610138645/configures-the-override-environment_2952322436/recording.har +++ b/__tests__/__recordings__/configure-action-tests_1610138645/configures-the-override-environment_2952322436/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "c6a8d72d08ddebc11c2622b786c55a00", + "_id": "68e6413ddfbccd07945fae79ede833b4", "_order": 0, "cache": {}, "request": { @@ -18,7 +18,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -42,10 +42,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 278, + "headersSize": 300, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -54,37 +54,59 @@ "value": "cloudtruth/configure-action" } ], - "url": "https://localhost:8000/api/v1/projects/?name=cloudtruth%2Fconfigure-action" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/?name=cloudtruth%2Fconfigure-action" }, "response": { - "bodySize": 323, + "bodySize": 512, "content": { "mimeType": "application/json", - "size": 323, + "size": 512, "text": { "count": 1, "next": null, "previous": null, "results": [ { - "created_at": "2021-09-17T14:10:32.574380Z", + "access_controlled": false, + "created_at": "2024-06-04T18:11:56.025576Z", + "dependents": [], + "depends_on": null, "description": "", - "id": "a9ff9bc3-d527-47eb-950b-1d7bcd06f183", - "modified_at": "2021-09-17T14:17:11.233790Z", + "id": "c50db8d7-901f-429e-856b-ee50a08dc08d", + "ledger_id": "16335396-f6f8-4774-a9ac-70cd4b9a48eb", + "modified_at": "2024-06-04T18:11:56.043087Z", "name": "cloudtruth/configure-action", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/" + "parameter_name_pattern": "", + "push_urls": [], + "pushes": [], + "role": null, + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/" } ] } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "jYuF38a/m+20J3YYlvVyUUDIaXgiwKuB/vDTNQ/uOptTvVg45arnRaSK1luPw2oQ6udcJkbobPZXlxI0dE5EcyDnA8C4+h4Lkkqpa/FKTqyFBbsgHoRMlbbVWwIhATRRv2OWRCM1AAJStDF3OcRJLnkPjhcOFU3yKMoUZNYQKqf2" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "jYuF38a/m+20J3YYlvVyUUDIaXgiwKuB/vDTNQ/uOptTvVg45arnRaSK1luPw2oQ6udcJkbobPZXlxI0dE5EcyDnA8C4+h4Lkkqpa/FKTqyFBbsgHoRMlbbVWwIhATRRv2OWRCM1AAJStDF3OcRJLnkPjhcOFU3yKMoUZNYQKqf2" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "ot19kuJvVxiHdFVGBFm4Nr5gq0nFW6wtLk8cihfmiAU3OgIACYwUS4KafHMwNPCQ" + "value": "PYsVlCIK2q0w2fILWdZInEQQAnsvz2dZYkBxV3171rcSgY0SR4qEGQlUztDx3czP" }, { "expires": {}, @@ -92,25 +114,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "udty9hplumee7750ahfwmrtxzrvox98r" + "value": "g90ti137jzcvuqnoufwx7ssxy1nkes85" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Tue, 04 Jun 2024 19:35:21 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:22 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "512" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=jYuF38a/m+20J3YYlvVyUUDIaXgiwKuB/vDTNQ/uOptTvVg45arnRaSK1luPw2oQ6udcJkbobPZXlxI0dE5EcyDnA8C4+h4Lkkqpa/FKTqyFBbsgHoRMlbbVWwIhATRRv2OWRCM1AAJStDF3OcRJLnkPjhcOFU3yKMoUZNYQKqf2; Expires=Tue, 11 Jun 2024 19:35:20 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=jYuF38a/m+20J3YYlvVyUUDIaXgiwKuB/vDTNQ/uOptTvVg45arnRaSK1luPw2oQ6udcJkbobPZXlxI0dE5EcyDnA8C4+h4Lkkqpa/FKTqyFBbsgHoRMlbbVWwIhATRRv2OWRCM1AAJStDF3OcRJLnkPjhcOFU3yKMoUZNYQKqf2; Expires=Tue, 11 Jun 2024 19:35:20 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=PYsVlCIK2q0w2fILWdZInEQQAnsvz2dZYkBxV3171rcSgY0SR4qEGQlUztDx3czP; expires=Tue, 03 Jun 2025 19:35:21 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=g90ti137jzcvuqnoufwx7ssxy1nkes85; expires=Tue, 18 Jun 2024 19:35:21 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -124,10 +170,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "323" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -137,24 +179,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=ot19kuJvVxiHdFVGBFm4Nr5gq0nFW6wtLk8cihfmiAU3OgIACYwUS4KafHMwNPCQ; expires=Fri, 16 Sep 2022 14:37:22 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=udty9hplumee7750ahfwmrtxzrvox98r; expires=Fri, 01 Oct 2021 14:37:22 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 576, + "headersSize": 1125, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:21.713Z", - "time": 671, + "startedDateTime": "2024-06-04T19:35:20.140Z", + "time": 924, "timings": { "blocked": -1, "connect": -1, @@ -162,11 +198,11 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 671 + "wait": 924 } }, { - "_id": "8ff0da928fe35edf9e9eae85493c3c7e", + "_id": "5dd075906f65248736cc13ac7745ddcc", "_order": 0, "cache": {}, "request": { @@ -176,7 +212,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -200,10 +236,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 318, + "headersSize": 352, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -214,186 +250,142 @@ { "name": "page", "value": "1" + }, + { + "name": "page_size", + "value": "3" } ], - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/?environment=staging&page=1" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/?environment=staging&page=1&page_size=3" }, "response": { - "bodySize": 5758, + "bodySize": 3649, "content": { "mimeType": "application/json", - "size": 5758, + "size": 3649, "text": { - "count": 5, + "count": 1, "next": null, "previous": null, "results": [ { - "created_at": "2021-09-17T14:10:35.343192Z", + "created_at": "2024-06-05T20:12:52.092854Z", "description": "", - "id": "b3bb4680-bc94-4a47-b238-171addc23156", - "modified_at": "2021-09-17T14:10:35.663230Z", - "name": "CTTEST_HAS_NO_OVERRIDE", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/b3bb4680-bc94-4a47-b238-171addc23156/", - "values": { - "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/": { - "created_at": "2021-09-17T14:10:35.647588Z", - "dynamic": false, - "dynamic_filter": "", - "dynamic_fqn": "", - "earliest_tag": null, - "environment": "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/", - "environment_name": "default", - "external": false, - "external_error": null, - "external_filter": "", - "external_fqn": "", - "id": "1d9e8383-f372-4471-a14b-139e8605e127", - "internal_value": "has_no_override_default", - "modified_at": "2021-09-17T14:10:35.647588Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/b3bb4680-bc94-4a47-b238-171addc23156/", - "secret": false, - "static_value": "has_no_override_default", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/b3bb4680-bc94-4a47-b238-171addc23156/values/1d9e8383-f372-4471-a14b-139e8605e127/", - "value": "has_no_override_default" - } - } - }, - { - "created_at": "2021-09-17T14:10:38.206228Z", - "description": "", - "id": "5e3ff32e-7b73-4bdc-b15e-55494f84f0f3", - "modified_at": "2021-09-17T14:10:38.206228Z", - "name": "CTTEST_HAS_NO_VALUE", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/5e3ff32e-7b73-4bdc-b15e-55494f84f0f3/", - "values": { - "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/": null - } - }, - { - "created_at": "2021-09-17T14:10:32.841971Z", - "description": "", - "id": "9fa37ea5-7872-4447-a55a-51ce1954de48", - "modified_at": "2021-09-17T14:17:11.230147Z", - "name": "CTTEST_NOT_A_SECRET", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/9fa37ea5-7872-4447-a55a-51ce1954de48/", - "values": { - "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/": { - "created_at": "2021-09-17T14:10:33.636590Z", - "dynamic": false, - "dynamic_filter": "", - "dynamic_fqn": "", - "earliest_tag": null, - "environment": "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/", - "environment_name": "staging", - "external": false, - "external_error": null, - "external_filter": "", - "external_fqn": "", - "id": "37cdbc93-3cce-4709-ba39-369b76a654aa", - "internal_value": "not_a_secret_override", - "modified_at": "2021-09-17T14:17:11.213290Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/9fa37ea5-7872-4447-a55a-51ce1954de48/", - "secret": false, - "static_value": "not_a_secret_override", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/9fa37ea5-7872-4447-a55a-51ce1954de48/values/37cdbc93-3cce-4709-ba39-369b76a654aa/", - "value": "not_a_secret_override" - } - } - }, - { - "created_at": "2021-09-17T14:10:33.981024Z", - "description": "", - "id": "fda38b98-e5b0-4d37-8ca0-5c695212bb89", - "modified_at": "2021-09-17T14:10:34.977406Z", + "expiration_action": null, + "expired_status": null, + "expires": null, + "id": "9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49", + "ledger_id": "66f82427-0a89-424b-a0a7-94c795cb04c0", + "modified_at": "2024-06-05T20:12:52.114439Z", "name": "CTTEST_TOTALLY_A_SECRET", + "overrides": null, + "project": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/", + "project_name": "cloudtruth/configure-action", + "referencing_templates": [], + "referencing_values": [], "rules": [], "secret": true, "templates": [], "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/fda38b98-e5b0-4d37-8ca0-5c695212bb89/", + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/", "values": { - "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/": { - "created_at": "2021-09-17T14:10:34.866480Z", + "https://api.staging.cloudtruth.io/api/v1/environments/fbf0487d-c13c-47d9-8c19-a71894e35d3e/": { + "active_environment": "https://api.staging.cloudtruth.io/api/v1/environments/fbf0487d-c13c-47d9-8c19-a71894e35d3e/", + "active_environment_id": "fbf0487d-c13c-47d9-8c19-a71894e35d3e", + "active_environment_name": "staging", + "created_at": "2024-06-05T20:13:01.294716Z", "dynamic": false, + "dynamic_error": null, "dynamic_filter": "", "dynamic_fqn": "", - "earliest_tag": "tag-one", - "environment": "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/", - "environment_name": "staging", + "environment": "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/", + "environment_id": "76ba4595-bb96-406c-b1d7-f633e89d9c7d", + "environment_name": "default", + "evaluated": false, + "expires_at": null, "external": false, "external_error": null, "external_filter": "", "external_fqn": "", - "id": "2110e786-578a-4de4-b6d0-ff463a372235", + "external_status": null, + "id": "f2cdcbf0-5261-4d67-9834-0b842c4c873d", "internal_value": null, - "modified_at": "2021-09-17T14:10:34.960830Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/fda38b98-e5b0-4d37-8ca0-5c695212bb89/", + "interpolated": false, + "ledger_id": "8216f912-60f6-4ba1-8af7-9ac30e7df799", + "modified_at": "2024-06-05T20:13:01.455153Z", + "parameter": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/", + "parameter_id": "9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49", + "referenced_parameters": [], + "referenced_projects": [], + "referenced_templates": [], "secret": true, "static_value": null, - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/fda38b98-e5b0-4d37-8ca0-5c695212bb89/values/2110e786-578a-4de4-b6d0-ff463a372235/", - "value": "totally_a_secret_override" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/values/f2cdcbf0-5261-4d67-9834-0b842c4c873d/", + "value": "totally_a_secret_default" } - } - }, - { - "created_at": "2021-09-17T14:10:36.060882Z", - "description": "", - "id": "49dedfd8-8105-4d74-baa3-b6f5e5c3721c", - "modified_at": "2021-09-17T14:10:37.815115Z", - "name": "cttest.not.posix", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/49dedfd8-8105-4d74-baa3-b6f5e5c3721c/", - "values": { - "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/": { - "created_at": "2021-09-17T14:10:37.796057Z", + }, + "values_flat": [ + { + "active_environment": "https://api.staging.cloudtruth.io/api/v1/environments/fbf0487d-c13c-47d9-8c19-a71894e35d3e/", + "active_environment_id": "fbf0487d-c13c-47d9-8c19-a71894e35d3e", + "active_environment_name": "staging", + "created_at": "2024-06-05T20:13:01.294716Z", "dynamic": false, + "dynamic_error": null, "dynamic_filter": "", "dynamic_fqn": "", - "earliest_tag": "tag-one", - "environment": "https://localhost:8000/api/v1/environments/6c8afe7b-0049-4790-bdd1-66d39232ab47/", - "environment_name": "staging", + "environment": "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/", + "environment_id": "76ba4595-bb96-406c-b1d7-f633e89d9c7d", + "environment_name": "default", + "evaluated": false, + "expires_at": null, "external": false, "external_error": null, "external_filter": "", "external_fqn": "", - "id": "1ab3ee1f-a5cd-4f0b-a807-3310b1f963cc", - "internal_value": "not.posix.override", - "modified_at": "2021-09-17T14:10:37.796057Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/49dedfd8-8105-4d74-baa3-b6f5e5c3721c/", - "secret": false, - "static_value": "not.posix.override", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/49dedfd8-8105-4d74-baa3-b6f5e5c3721c/values/1ab3ee1f-a5cd-4f0b-a807-3310b1f963cc/", - "value": "not.posix.override" + "external_status": null, + "id": "f2cdcbf0-5261-4d67-9834-0b842c4c873d", + "internal_value": null, + "interpolated": false, + "ledger_id": "8216f912-60f6-4ba1-8af7-9ac30e7df799", + "modified_at": "2024-06-05T20:13:01.455153Z", + "parameter": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/", + "parameter_id": "9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49", + "referenced_parameters": [], + "referenced_projects": [], + "referenced_templates": [], + "secret": true, + "static_value": null, + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/values/f2cdcbf0-5261-4d67-9834-0b842c4c873d/", + "value": "totally_a_secret_default" } - } + ] } ] } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "xDPlwB/UTbBuJEQ/ab6vkdoGMeDb1d3GG5KSuXkxvZWuyItOnzOg472Ao5VhTxpw8LQeLzvYYRxk/nxYQfqs72PLS9wtAsSyh7eB3Ec0tyuNlUEJgE+GXbGp6J8xWr/FvGeqUuJ1dzLi+NRm8zISrn97xICXNzUR10RIx9MPqv/e" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "xDPlwB/UTbBuJEQ/ab6vkdoGMeDb1d3GG5KSuXkxvZWuyItOnzOg472Ao5VhTxpw8LQeLzvYYRxk/nxYQfqs72PLS9wtAsSyh7eB3Ec0tyuNlUEJgE+GXbGp6J8xWr/FvGeqUuJ1dzLi+NRm8zISrn97xICXNzUR10RIx9MPqv/e" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "q92myw1nvM7RRrHNhcSwBBHj7D9AGTsTa6yNzEdjyVQ6KEnObVcqoYARGPaJ7b9t" + "value": "1dkc0F0e8H1loqkWWayQnPRS1IEXQ5YwI4aXjTNzhAmDj9hY0hAL4McSrUSK8TMF" }, { "expires": {}, @@ -401,25 +393,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "lt5ui7cw1xv9s8se1lgwqlcrcy5gu4tm" + "value": "qzps4037huq2wpm1fv0ypwf9m69qbzwn" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Thu, 06 Jun 2024 19:04:04 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:23 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "3649" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=xDPlwB/UTbBuJEQ/ab6vkdoGMeDb1d3GG5KSuXkxvZWuyItOnzOg472Ao5VhTxpw8LQeLzvYYRxk/nxYQfqs72PLS9wtAsSyh7eB3Ec0tyuNlUEJgE+GXbGp6J8xWr/FvGeqUuJ1dzLi+NRm8zISrn97xICXNzUR10RIx9MPqv/e; Expires=Thu, 13 Jun 2024 19:04:03 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=xDPlwB/UTbBuJEQ/ab6vkdoGMeDb1d3GG5KSuXkxvZWuyItOnzOg472Ao5VhTxpw8LQeLzvYYRxk/nxYQfqs72PLS9wtAsSyh7eB3Ec0tyuNlUEJgE+GXbGp6J8xWr/FvGeqUuJ1dzLi+NRm8zISrn97xICXNzUR10RIx9MPqv/e; Expires=Thu, 13 Jun 2024 19:04:03 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=1dkc0F0e8H1loqkWWayQnPRS1IEXQ5YwI4aXjTNzhAmDj9hY0hAL4McSrUSK8TMF; expires=Thu, 05 Jun 2025 19:04:04 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=qzps4037huq2wpm1fv0ypwf9m69qbzwn; expires=Thu, 20 Jun 2024 19:04:04 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -433,10 +449,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "5758" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -446,24 +458,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=q92myw1nvM7RRrHNhcSwBBHj7D9AGTsTa6yNzEdjyVQ6KEnObVcqoYARGPaJ7b9t; expires=Fri, 16 Sep 2022 14:37:23 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=lt5ui7cw1xv9s8se1lgwqlcrcy5gu4tm; expires=Fri, 01 Oct 2021 14:37:23 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 577, + "headersSize": 1126, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:22.399Z", - "time": 642, + "startedDateTime": "2024-06-06T19:04:03.446Z", + "time": 724, "timings": { "blocked": -1, "connect": -1, @@ -471,7 +477,7 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 642 + "wait": 724 } } ], diff --git a/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-a-bad-token_4252078280/recording.har b/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-a-bad-token_4252078280/recording.har index c1802fc..6b33353 100644 --- a/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-a-bad-token_4252078280/recording.har +++ b/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-a-bad-token_4252078280/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "c6a8d72d08ddebc11c2622b786c55a00", + "_id": "68e6413ddfbccd07945fae79ede833b4", "_order": 0, "cache": {}, "request": { @@ -18,7 +18,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -42,10 +42,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 248, + "headersSize": 270, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -54,7 +54,7 @@ "value": "cloudtruth/configure-action" } ], - "url": "https://localhost:8000/api/v1/projects/?name=cloudtruth%2Fconfigure-action" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/?name=cloudtruth%2Fconfigure-action" }, "response": { "bodySize": 50, @@ -65,27 +65,208 @@ "detail": "Incorrect authentication credentials." } }, - "cookies": [], + "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "/HXywgeezv2Vqbbn4ohJCCIs36Wy0krp2LlaBfEJM6Nvo4WOLkVSFro5yO55SJ2q6TF1FQIMa+mcxcvLMjta2SVpXygSdrcvj1G5VYqDvtiO4n6nnZjiXE2naHnek7ZoVXnsRpTxwqo/iH0LyHcgq9Bf/UOqmPwtrChUI0b9ddaj" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "/HXywgeezv2Vqbbn4ohJCCIs36Wy0krp2LlaBfEJM6Nvo4WOLkVSFro5yO55SJ2q6TF1FQIMa+mcxcvLMjta2SVpXygSdrcvj1G5VYqDvtiO4n6nnZjiXE2naHnek7ZoVXnsRpTxwqo/iH0LyHcgq9Bf/UOqmPwtrChUI0b9ddaj" + } + ], "headers": [ + { + "name": "date", + "value": "Tue, 04 Jun 2024 19:35:34 GMT" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "50" + }, + { + "name": "connection", + "value": "close" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=/HXywgeezv2Vqbbn4ohJCCIs36Wy0krp2LlaBfEJM6Nvo4WOLkVSFro5yO55SJ2q6TF1FQIMa+mcxcvLMjta2SVpXygSdrcvj1G5VYqDvtiO4n6nnZjiXE2naHnek7ZoVXnsRpTxwqo/iH0LyHcgq9Bf/UOqmPwtrChUI0b9ddaj; Expires=Tue, 11 Jun 2024 19:35:34 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=/HXywgeezv2Vqbbn4ohJCCIs36Wy0krp2LlaBfEJM6Nvo4WOLkVSFro5yO55SJ2q6TF1FQIMa+mcxcvLMjta2SVpXygSdrcvj1G5VYqDvtiO4n6nnZjiXE2naHnek7ZoVXnsRpTxwqo/iH0LyHcgq9Bf/UOqmPwtrChUI0b9ddaj; Expires=Tue, 11 Jun 2024 19:35:34 GMT; Path=/; SameSite=None; Secure" + }, { "name": "server", - "value": "undisclosed" + "value": "gunicorn" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:28 GMT" + "name": "www-authenticate", + "value": "Api-Key realm=\"https://app.staging.cloudtruth.io\", type=\"Service Account\", Bearer realm=\"https://app.staging.cloudtruth.io\", type=\"Auth0 JWT\"" + }, + { + "name": "vary", + "value": "Accept, Cookie, Origin" }, { + "name": "allow", + "value": "GET, POST, HEAD, OPTIONS" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "referrer-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + } + ], + "headersSize": 990, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 401, + "statusText": "Unauthorized" + }, + "startedDateTime": "2024-06-04T19:35:34.178Z", + "time": 163, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 163 + } + }, + { + "_id": "68e6413ddfbccd07945fae79ede833b4", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "_fromType": "array", + "name": "user-agent", + "value": "configure-action/2.2.1" + }, + { + "_fromType": "array", + "name": "authorization", + "value": "Api-Key decafc0ffee" + }, + { + "_fromType": "array", + "name": "accept", + "value": "*/*" + }, + { + "_fromType": "array", + "name": "accept-encoding", + "value": "gzip,deflate" + }, + { + "_fromType": "array", "name": "connection", "value": "close" }, + { + "name": "host", + "value": "api.staging.cloudtruth.io" + } + ], + "headersSize": 270, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "name", + "value": "cloudtruth/configure-action" + } + ], + "url": "https://api.staging.cloudtruth.io/api/v1/projects/?name=cloudtruth%2Fconfigure-action" + }, + "response": { + "bodySize": 50, + "content": { + "mimeType": "application/json", + "size": 50, + "text": { + "detail": "Incorrect authentication credentials." + } + }, + "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "5BtjEyXWRWe8fckdxx2cUUrL7+ZOF48emBaAu/Os1WgKJwjW/u8AIp0e4yDw6Wox195cJ08OlGhzR68NH8IH/KPsl4ZD1P/Owcc460uM8vCfJgKFuWf0Pp6LQHkGhyjzIK+q4v46+/5302G5+EFdyOTihGAFTWYTC8tDTj2ggzPN" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "5BtjEyXWRWe8fckdxx2cUUrL7+ZOF48emBaAu/Os1WgKJwjW/u8AIp0e4yDw6Wox195cJ08OlGhzR68NH8IH/KPsl4ZD1P/Owcc460uM8vCfJgKFuWf0Pp6LQHkGhyjzIK+q4v46+/5302G5+EFdyOTihGAFTWYTC8tDTj2ggzPN" + } + ], + "headers": [ + { + "name": "date", + "value": "Tue, 04 Jun 2024 19:36:55 GMT" + }, { "name": "content-type", "value": "application/json" }, + { + "name": "content-length", + "value": "50" + }, + { + "name": "connection", + "value": "close" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=5BtjEyXWRWe8fckdxx2cUUrL7+ZOF48emBaAu/Os1WgKJwjW/u8AIp0e4yDw6Wox195cJ08OlGhzR68NH8IH/KPsl4ZD1P/Owcc460uM8vCfJgKFuWf0Pp6LQHkGhyjzIK+q4v46+/5302G5+EFdyOTihGAFTWYTC8tDTj2ggzPN; Expires=Tue, 11 Jun 2024 19:36:55 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=5BtjEyXWRWe8fckdxx2cUUrL7+ZOF48emBaAu/Os1WgKJwjW/u8AIp0e4yDw6Wox195cJ08OlGhzR68NH8IH/KPsl4ZD1P/Owcc460uM8vCfJgKFuWf0Pp6LQHkGhyjzIK+q4v46+/5302G5+EFdyOTihGAFTWYTC8tDTj2ggzPN; Expires=Tue, 11 Jun 2024 19:36:55 GMT; Path=/; SameSite=None; Secure" + }, + { + "name": "server", + "value": "gunicorn" + }, { "name": "www-authenticate", - "value": "Api-Key realm=\"https://localhost:7000\", type=\"Service Account\", Bearer realm=\"https://localhost:7000\", type=\"Auth0 JWT\"" + "value": "Api-Key realm=\"https://app.staging.cloudtruth.io\", type=\"Service Account\", Bearer realm=\"https://app.staging.cloudtruth.io\", type=\"Auth0 JWT\"" }, { "name": "vary", @@ -99,10 +280,158 @@ "name": "x-frame-options", "value": "DENY" }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "referrer-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + } + ], + "headersSize": 990, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 401, + "statusText": "Unauthorized" + }, + "startedDateTime": "2024-06-04T19:36:55.585Z", + "time": 183, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 183 + } + }, + { + "_id": "68e6413ddfbccd07945fae79ede833b4", + "_order": 2, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "_fromType": "array", + "name": "user-agent", + "value": "configure-action/2.2.1" + }, + { + "_fromType": "array", + "name": "authorization", + "value": "Api-Key decafc0ffee" + }, + { + "_fromType": "array", + "name": "accept", + "value": "*/*" + }, + { + "_fromType": "array", + "name": "accept-encoding", + "value": "gzip,deflate" + }, + { + "_fromType": "array", + "name": "connection", + "value": "close" + }, + { + "name": "host", + "value": "api.staging.cloudtruth.io" + } + ], + "headersSize": 270, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "name", + "value": "cloudtruth/configure-action" + } + ], + "url": "https://api.staging.cloudtruth.io/api/v1/projects/?name=cloudtruth%2Fconfigure-action" + }, + "response": { + "bodySize": 50, + "content": { + "mimeType": "application/json", + "size": 50, + "text": { + "detail": "Incorrect authentication credentials." + } + }, + "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "vk8e5tb1K0lNcq6H4/qsBlVK2JdnACBdZOm8zA2x6v4UWZvwVxyzgsBVLVF3KfE0kg8ZYXar1sHX4y1+ltH4affo1jJ5Cgan3qWoaZfMqEfONwzwibmLk27lqDGqXX1GXZsMGowAyS59h2H6+MBf1feMulu2M9YDC8b4fKkKq4eH" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "vk8e5tb1K0lNcq6H4/qsBlVK2JdnACBdZOm8zA2x6v4UWZvwVxyzgsBVLVF3KfE0kg8ZYXar1sHX4y1+ltH4affo1jJ5Cgan3qWoaZfMqEfONwzwibmLk27lqDGqXX1GXZsMGowAyS59h2H6+MBf1feMulu2M9YDC8b4fKkKq4eH" + } + ], + "headers": [ + { + "name": "date", + "value": "Tue, 04 Jun 2024 19:36:55 GMT" + }, + { + "name": "content-type", + "value": "application/json" + }, { "name": "content-length", "value": "50" }, + { + "name": "connection", + "value": "close" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=vk8e5tb1K0lNcq6H4/qsBlVK2JdnACBdZOm8zA2x6v4UWZvwVxyzgsBVLVF3KfE0kg8ZYXar1sHX4y1+ltH4affo1jJ5Cgan3qWoaZfMqEfONwzwibmLk27lqDGqXX1GXZsMGowAyS59h2H6+MBf1feMulu2M9YDC8b4fKkKq4eH; Expires=Tue, 11 Jun 2024 19:36:55 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=vk8e5tb1K0lNcq6H4/qsBlVK2JdnACBdZOm8zA2x6v4UWZvwVxyzgsBVLVF3KfE0kg8ZYXar1sHX4y1+ltH4affo1jJ5Cgan3qWoaZfMqEfONwzwibmLk27lqDGqXX1GXZsMGowAyS59h2H6+MBf1feMulu2M9YDC8b4fKkKq4eH; Expires=Tue, 11 Jun 2024 19:36:55 GMT; Path=/; SameSite=None; Secure" + }, + { + "name": "server", + "value": "gunicorn" + }, + { + "name": "www-authenticate", + "value": "Api-Key realm=\"https://app.staging.cloudtruth.io\", type=\"Service Account\", Bearer realm=\"https://app.staging.cloudtruth.io\", type=\"Auth0 JWT\"" + }, + { + "name": "vary", + "value": "Accept, Cookie, Origin" + }, + { + "name": "allow", + "value": "GET, POST, HEAD, OPTIONS" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, { "name": "x-content-type-options", "value": "nosniff" @@ -110,16 +439,20 @@ { "name": "referrer-policy", "value": "same-origin" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 419, + "headersSize": 990, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 401, "statusText": "Unauthorized" }, - "startedDateTime": "2021-09-17T14:37:28.467Z", - "time": 47, + "startedDateTime": "2024-06-04T19:36:55.774Z", + "time": 175, "timings": { "blocked": -1, "connect": -1, @@ -127,7 +460,7 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 47 + "wait": 175 } } ], diff --git a/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-environment-id_916849840/recording.har b/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-environment-id_916849840/recording.har index 6fe0682..498328a 100644 --- a/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-environment-id_916849840/recording.har +++ b/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-environment-id_916849840/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "c6a8d72d08ddebc11c2622b786c55a00", + "_id": "68e6413ddfbccd07945fae79ede833b4", "_order": 0, "cache": {}, "request": { @@ -18,7 +18,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -42,10 +42,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 278, + "headersSize": 300, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -54,37 +54,59 @@ "value": "cloudtruth/configure-action" } ], - "url": "https://localhost:8000/api/v1/projects/?name=cloudtruth%2Fconfigure-action" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/?name=cloudtruth%2Fconfigure-action" }, "response": { - "bodySize": 323, + "bodySize": 512, "content": { "mimeType": "application/json", - "size": 323, + "size": 512, "text": { "count": 1, "next": null, "previous": null, "results": [ { - "created_at": "2021-09-17T14:10:32.574380Z", + "access_controlled": false, + "created_at": "2024-06-04T18:11:56.025576Z", + "dependents": [], + "depends_on": null, "description": "", - "id": "a9ff9bc3-d527-47eb-950b-1d7bcd06f183", - "modified_at": "2021-09-17T14:17:11.233790Z", + "id": "c50db8d7-901f-429e-856b-ee50a08dc08d", + "ledger_id": "16335396-f6f8-4774-a9ac-70cd4b9a48eb", + "modified_at": "2024-06-04T18:11:56.043087Z", "name": "cloudtruth/configure-action", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/" + "parameter_name_pattern": "", + "push_urls": [], + "pushes": [], + "role": null, + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/" } ] } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "FBVFOZGwlqzFonmUuOq1WR+BdEr1fbr/vt6TAJ7e7IwlDqth/w0kn/TspYZMeKBDMvxgQHB3XvehPULoiNA21/05LowtYrBM/EwIxNgkPZgWVexmOjCCaYCY3+45CR6IUWtkyY0jSvpXFbiQ4Sw29bcvyqYMPs0njavozP6pSs5W" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "FBVFOZGwlqzFonmUuOq1WR+BdEr1fbr/vt6TAJ7e7IwlDqth/w0kn/TspYZMeKBDMvxgQHB3XvehPULoiNA21/05LowtYrBM/EwIxNgkPZgWVexmOjCCaYCY3+45CR6IUWtkyY0jSvpXFbiQ4Sw29bcvyqYMPs0njavozP6pSs5W" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "hw7bGCRKlOIy04niq2X4EFVLnGjMus0bpYOZmyQgIgNkSbLZ3hi1SjrKEf0zfX3a" + "value": "DcDNzLaLhgUFMymWKd8D51bP1PkuMi3dbVDkQX1nPWjZvtZGquUpe0VWSCx8CLsA" }, { "expires": {}, @@ -92,25 +114,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "y1r66f5v09cazcffzuzsai6nrjh5q082" + "value": "9mbvtni8vit69jqwdvvoye8eziz0woyc" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Tue, 04 Jun 2024 19:35:29 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:26 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "512" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=FBVFOZGwlqzFonmUuOq1WR+BdEr1fbr/vt6TAJ7e7IwlDqth/w0kn/TspYZMeKBDMvxgQHB3XvehPULoiNA21/05LowtYrBM/EwIxNgkPZgWVexmOjCCaYCY3+45CR6IUWtkyY0jSvpXFbiQ4Sw29bcvyqYMPs0njavozP6pSs5W; Expires=Tue, 11 Jun 2024 19:35:28 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=FBVFOZGwlqzFonmUuOq1WR+BdEr1fbr/vt6TAJ7e7IwlDqth/w0kn/TspYZMeKBDMvxgQHB3XvehPULoiNA21/05LowtYrBM/EwIxNgkPZgWVexmOjCCaYCY3+45CR6IUWtkyY0jSvpXFbiQ4Sw29bcvyqYMPs0njavozP6pSs5W; Expires=Tue, 11 Jun 2024 19:35:28 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=DcDNzLaLhgUFMymWKd8D51bP1PkuMi3dbVDkQX1nPWjZvtZGquUpe0VWSCx8CLsA; expires=Tue, 03 Jun 2025 19:35:29 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=9mbvtni8vit69jqwdvvoye8eziz0woyc; expires=Tue, 18 Jun 2024 19:35:29 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -124,10 +170,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "323" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -137,24 +179,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=hw7bGCRKlOIy04niq2X4EFVLnGjMus0bpYOZmyQgIgNkSbLZ3hi1SjrKEf0zfX3a; expires=Fri, 16 Sep 2022 14:37:26 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=y1r66f5v09cazcffzuzsai6nrjh5q082; expires=Fri, 01 Oct 2021 14:37:26 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 576, + "headersSize": 1125, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:25.928Z", - "time": 485, + "startedDateTime": "2024-06-04T19:35:28.396Z", + "time": 875, "timings": { "blocked": -1, "connect": -1, @@ -162,11 +198,11 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 485 + "wait": 875 } }, { - "_id": "94834b655cc2cfc74a92922ed563efb2", + "_id": "f24002a43f103ee4c43c69c51d7528f7", "_order": 0, "cache": {}, "request": { @@ -176,7 +212,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -200,10 +236,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 347, + "headersSize": 381, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -214,27 +250,45 @@ { "name": "page", "value": "1" + }, + { + "name": "page_size", + "value": "3" } ], - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/?environment=39c58d99-ca5f-4802-8c2e-f3c060d57934&page=1" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/?environment=39c58d99-ca5f-4802-8c2e-f3c060d57934&page=1&page_size=3" }, "response": { - "bodySize": 23, + "bodySize": 75, "content": { "mimeType": "application/json", - "size": 23, + "size": 75, "text": { - "detail": "Not found." + "detail": "Environment(s) not found: 39c58d99-ca5f-4802-8c2e-f3c060d57934" } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "//1EWv/f24/r+S+z79BPupNgWP6qtOOpavn186v2K0hl2XjGFUXt4CbI2zL6KtMEEU4sQ++M+kERTghY+hF+t/qzqrM0ydjiZBtES8Enn0sMkMkdX7VAZaOA11JE2ameariJvZj7Ompmp0TTpnbz06ud2MDzhWZwZZlKVxnA2xFz" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "//1EWv/f24/r+S+z79BPupNgWP6qtOOpavn186v2K0hl2XjGFUXt4CbI2zL6KtMEEU4sQ++M+kERTghY+hF+t/qzqrM0ydjiZBtES8Enn0sMkMkdX7VAZaOA11JE2ameariJvZj7Ompmp0TTpnbz06ud2MDzhWZwZZlKVxnA2xFz" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "neVqludOgevNaXEgKoC3dMJGTDERWcVHuu0egFNalkTrzdexIHZC7aHDNd94C4bJ" + "value": "yNkQMjUiT1ZwDLvZQeEEgVCDNRjDDPN5hPKQ9YrjHpWTqrjGrl8s6zUlBJE2Vh0V" }, { "expires": {}, @@ -242,25 +296,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "0aer2ldwjla1jypkc78ija7b967ewuxa" + "value": "rz0cildv2m4s3y8jeanqv3x2ycaubl6h" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Thu, 06 Jun 2024 19:04:06 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:26 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "75" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=//1EWv/f24/r+S+z79BPupNgWP6qtOOpavn186v2K0hl2XjGFUXt4CbI2zL6KtMEEU4sQ++M+kERTghY+hF+t/qzqrM0ydjiZBtES8Enn0sMkMkdX7VAZaOA11JE2ameariJvZj7Ompmp0TTpnbz06ud2MDzhWZwZZlKVxnA2xFz; Expires=Thu, 13 Jun 2024 19:04:05 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=//1EWv/f24/r+S+z79BPupNgWP6qtOOpavn186v2K0hl2XjGFUXt4CbI2zL6KtMEEU4sQ++M+kERTghY+hF+t/qzqrM0ydjiZBtES8Enn0sMkMkdX7VAZaOA11JE2ameariJvZj7Ompmp0TTpnbz06ud2MDzhWZwZZlKVxnA2xFz; Expires=Thu, 13 Jun 2024 19:04:05 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=yNkQMjUiT1ZwDLvZQeEEgVCDNRjDDPN5hPKQ9YrjHpWTqrjGrl8s6zUlBJE2Vh0V; expires=Thu, 05 Jun 2025 19:04:06 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=rz0cildv2m4s3y8jeanqv3x2ycaubl6h; expires=Thu, 20 Jun 2024 19:04:06 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -274,10 +352,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "23" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -287,24 +361,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=neVqludOgevNaXEgKoC3dMJGTDERWcVHuu0egFNalkTrzdexIHZC7aHDNd94C4bJ; expires=Fri, 16 Sep 2022 14:37:26 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=0aer2ldwjla1jypkc78ija7b967ewuxa; expires=Fri, 01 Oct 2021 14:37:26 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 575, + "headersSize": 1124, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 404, "statusText": "Not Found" }, - "startedDateTime": "2021-09-17T14:37:26.422Z", - "time": 421, + "startedDateTime": "2024-06-06T19:04:05.578Z", + "time": 828, "timings": { "blocked": -1, "connect": -1, @@ -312,7 +380,7 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 421 + "wait": 828 } } ], diff --git a/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-environment-name_2823443702/recording.har b/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-environment-name_2823443702/recording.har index 3723145..cb68368 100644 --- a/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-environment-name_2823443702/recording.har +++ b/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-environment-name_2823443702/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "c6a8d72d08ddebc11c2622b786c55a00", + "_id": "68e6413ddfbccd07945fae79ede833b4", "_order": 0, "cache": {}, "request": { @@ -18,7 +18,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -42,10 +42,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 278, + "headersSize": 300, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -54,37 +54,59 @@ "value": "cloudtruth/configure-action" } ], - "url": "https://localhost:8000/api/v1/projects/?name=cloudtruth%2Fconfigure-action" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/?name=cloudtruth%2Fconfigure-action" }, "response": { - "bodySize": 323, + "bodySize": 512, "content": { "mimeType": "application/json", - "size": 323, + "size": 512, "text": { "count": 1, "next": null, "previous": null, "results": [ { - "created_at": "2021-09-17T14:10:32.574380Z", + "access_controlled": false, + "created_at": "2024-06-04T18:11:56.025576Z", + "dependents": [], + "depends_on": null, "description": "", - "id": "a9ff9bc3-d527-47eb-950b-1d7bcd06f183", - "modified_at": "2021-09-17T14:17:11.233790Z", + "id": "c50db8d7-901f-429e-856b-ee50a08dc08d", + "ledger_id": "16335396-f6f8-4774-a9ac-70cd4b9a48eb", + "modified_at": "2024-06-04T18:11:56.043087Z", "name": "cloudtruth/configure-action", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/" + "parameter_name_pattern": "", + "push_urls": [], + "pushes": [], + "role": null, + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/" } ] } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "fv4728xFnm96cnKh3SFNIAF+hPYAVAjx/IICvHomKuc4SoiAjMw4N9tfxHHL4tE/getfpirMkJ3xJz2uScFJ4ePFGH40fQLcES1l6fNa1AKlUE/TqAUzG2vIyTkr9P4EWvUXOECWwetlhCi7Edk0fdszRBFceFRFWjB+f9Es/SsG" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "fv4728xFnm96cnKh3SFNIAF+hPYAVAjx/IICvHomKuc4SoiAjMw4N9tfxHHL4tE/getfpirMkJ3xJz2uScFJ4ePFGH40fQLcES1l6fNa1AKlUE/TqAUzG2vIyTkr9P4EWvUXOECWwetlhCi7Edk0fdszRBFceFRFWjB+f9Es/SsG" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "YeuTRYy3kRJkx6oCGjuZ5nFxz4EmUZJV4jrsE02cMDmpwLCHqlzhAQqvEovI17jD" + "value": "fUcxCiscATBvbPFQQT83opnI19TLmwvfIvmoxLamXS1Fvi1ho1zZOK4c3L604pvr" }, { "expires": {}, @@ -92,25 +114,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "07n74huqvnukvpg5y6hakagwzrhzwkjh" + "value": "ji3um3f2dj9qr1yimtcsuzu0jjna3icd" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Tue, 04 Jun 2024 19:35:31 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:27 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "512" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=fv4728xFnm96cnKh3SFNIAF+hPYAVAjx/IICvHomKuc4SoiAjMw4N9tfxHHL4tE/getfpirMkJ3xJz2uScFJ4ePFGH40fQLcES1l6fNa1AKlUE/TqAUzG2vIyTkr9P4EWvUXOECWwetlhCi7Edk0fdszRBFceFRFWjB+f9Es/SsG; Expires=Tue, 11 Jun 2024 19:35:30 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=fv4728xFnm96cnKh3SFNIAF+hPYAVAjx/IICvHomKuc4SoiAjMw4N9tfxHHL4tE/getfpirMkJ3xJz2uScFJ4ePFGH40fQLcES1l6fNa1AKlUE/TqAUzG2vIyTkr9P4EWvUXOECWwetlhCi7Edk0fdszRBFceFRFWjB+f9Es/SsG; Expires=Tue, 11 Jun 2024 19:35:30 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=fUcxCiscATBvbPFQQT83opnI19TLmwvfIvmoxLamXS1Fvi1ho1zZOK4c3L604pvr; expires=Tue, 03 Jun 2025 19:35:31 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=ji3um3f2dj9qr1yimtcsuzu0jjna3icd; expires=Tue, 18 Jun 2024 19:35:31 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -124,10 +170,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "323" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -137,24 +179,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=YeuTRYy3kRJkx6oCGjuZ5nFxz4EmUZJV4jrsE02cMDmpwLCHqlzhAQqvEovI17jD; expires=Fri, 16 Sep 2022 14:37:27 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=07n74huqvnukvpg5y6hakagwzrhzwkjh; expires=Fri, 01 Oct 2021 14:37:27 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 576, + "headersSize": 1125, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:26.860Z", - "time": 460, + "startedDateTime": "2024-06-04T19:35:30.337Z", + "time": 884, "timings": { "blocked": -1, "connect": -1, @@ -162,11 +198,11 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 460 + "wait": 884 } }, { - "_id": "49f710d1efd0aa10f6f062333676e25e", + "_id": "a7834d46ff9d5d6900f5380be8b490f9", "_order": 0, "cache": {}, "request": { @@ -176,7 +212,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -200,10 +236,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 330, + "headersSize": 364, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -214,27 +250,45 @@ { "name": "page", "value": "1" + }, + { + "name": "page_size", + "value": "3" } ], - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/?environment=no_such_environment&page=1" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/?environment=no_such_environment&page=1&page_size=3" }, "response": { - "bodySize": 23, + "bodySize": 58, "content": { "mimeType": "application/json", - "size": 23, + "size": 58, "text": { - "detail": "Not found." + "detail": "Environment(s) not found: no_such_environment" } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "kzF23x1cwmOwporjXepqGR5LEmIRLnnzNoLoThy5SijDzyq/wGLjpGVreRr9XtCL6Wux3TX1CqeBrROGgmwiITq/RzUqMXVFzhrJerqKkGG6im3iEzuiAr7+acJSx4zGUwsvoqb9E9SstKi4UhCKF2siRCkYFUwktdyrCunQ8Yxz" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "kzF23x1cwmOwporjXepqGR5LEmIRLnnzNoLoThy5SijDzyq/wGLjpGVreRr9XtCL6Wux3TX1CqeBrROGgmwiITq/RzUqMXVFzhrJerqKkGG6im3iEzuiAr7+acJSx4zGUwsvoqb9E9SstKi4UhCKF2siRCkYFUwktdyrCunQ8Yxz" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "BS1hKCEG8fAA3onx0EVI27dE9sjNC9bC0Z8oMkjXqyPvf1Dh4ol3fDersPY76Tra" + "value": "qXys06d72Oh2YEbBkadWoK5UIsnpRMSWYB0QCWsGQ8REHITkT24Tt3dvwbqQTpPe" }, { "expires": {}, @@ -242,25 +296,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "upg7bconuaf1coexqgjmp7tr258852am" + "value": "g6wm64hzll2nhdl36ud5yx3iyte4o8t0" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Thu, 06 Jun 2024 19:04:07 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:27 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "58" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=kzF23x1cwmOwporjXepqGR5LEmIRLnnzNoLoThy5SijDzyq/wGLjpGVreRr9XtCL6Wux3TX1CqeBrROGgmwiITq/RzUqMXVFzhrJerqKkGG6im3iEzuiAr7+acJSx4zGUwsvoqb9E9SstKi4UhCKF2siRCkYFUwktdyrCunQ8Yxz; Expires=Thu, 13 Jun 2024 19:04:06 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=kzF23x1cwmOwporjXepqGR5LEmIRLnnzNoLoThy5SijDzyq/wGLjpGVreRr9XtCL6Wux3TX1CqeBrROGgmwiITq/RzUqMXVFzhrJerqKkGG6im3iEzuiAr7+acJSx4zGUwsvoqb9E9SstKi4UhCKF2siRCkYFUwktdyrCunQ8Yxz; Expires=Thu, 13 Jun 2024 19:04:06 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=qXys06d72Oh2YEbBkadWoK5UIsnpRMSWYB0QCWsGQ8REHITkT24Tt3dvwbqQTpPe; expires=Thu, 05 Jun 2025 19:04:07 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=g6wm64hzll2nhdl36ud5yx3iyte4o8t0; expires=Thu, 20 Jun 2024 19:04:07 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -274,10 +352,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "23" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -287,24 +361,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=BS1hKCEG8fAA3onx0EVI27dE9sjNC9bC0Z8oMkjXqyPvf1Dh4ol3fDersPY76Tra; expires=Fri, 16 Sep 2022 14:37:27 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=upg7bconuaf1coexqgjmp7tr258852am; expires=Fri, 01 Oct 2021 14:37:27 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 575, + "headersSize": 1124, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 404, "statusText": "Not Found" }, - "startedDateTime": "2021-09-17T14:37:27.330Z", - "time": 411, + "startedDateTime": "2024-06-06T19:04:06.439Z", + "time": 637, "timings": { "blocked": -1, "connect": -1, @@ -312,7 +380,7 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 411 + "wait": 637 } } ], diff --git a/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-project-id_4054910228/recording.har b/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-project-id_4054910228/recording.har index 5264c26..771619d 100644 --- a/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-project-id_4054910228/recording.har +++ b/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-project-id_4054910228/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "efef740b1b9b46a91edc4958aca395bf", + "_id": "c848aaf3a4f713256fbfdb40e49ba79e", "_order": 0, "cache": {}, "request": { @@ -18,7 +18,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -42,32 +42,46 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 280, + "headersSize": 302, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [], - "url": "https://localhost:8000/api/v1/projects/39c58d99-ca5f-4802-8c2e-f3c060d57934/" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/39c58d99-ca5f-4802-8c2e-f3c060d57934/" }, "response": { - "bodySize": 23, + "bodySize": 48, "content": { "mimeType": "application/json", - "size": 23, + "size": 48, "text": { - "detail": "Not found." + "detail": "No Project matches the given query." } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "+lWRlhFtXZd4gMPepTsdg0LiEHb1mR6CyrMrBQHa5KCcqm+yyXY23UV4WD3Js5FxENLSX8o9t2CHhGCX1QK6OTVNNTCLwtFi2qZJtxmZYds5vD64BkD6sqROms9NnMipo4LrjaJ6fXC23BiaBq5tvO7t8PBI+NQhQAuvvJLHMGPU" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "+lWRlhFtXZd4gMPepTsdg0LiEHb1mR6CyrMrBQHa5KCcqm+yyXY23UV4WD3Js5FxENLSX8o9t2CHhGCX1QK6OTVNNTCLwtFi2qZJtxmZYds5vD64BkD6sqROms9NnMipo4LrjaJ6fXC23BiaBq5tvO7t8PBI+NQhQAuvvJLHMGPU" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "LijYGrQJHxqR18unsMjhkwA5qWmmYNYbqNpUtojKHU1zTpxt8fv8kk7BupqzsAar" + "value": "ofhxJGy7zMNoPoxIWlUY9ZWogRRMaCtKmpHu7CwHLeH5E1nDMx7sSassSPKZYUTn" }, { "expires": {}, @@ -75,25 +89,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "apxzydm2c87fhg16e738jhd8j629jnaj" + "value": "bqs4jjkplrgtfl797zbsvkur8so9lkwm" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Tue, 04 Jun 2024 19:35:26 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:25 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "48" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=+lWRlhFtXZd4gMPepTsdg0LiEHb1mR6CyrMrBQHa5KCcqm+yyXY23UV4WD3Js5FxENLSX8o9t2CHhGCX1QK6OTVNNTCLwtFi2qZJtxmZYds5vD64BkD6sqROms9NnMipo4LrjaJ6fXC23BiaBq5tvO7t8PBI+NQhQAuvvJLHMGPU; Expires=Tue, 11 Jun 2024 19:35:26 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=+lWRlhFtXZd4gMPepTsdg0LiEHb1mR6CyrMrBQHa5KCcqm+yyXY23UV4WD3Js5FxENLSX8o9t2CHhGCX1QK6OTVNNTCLwtFi2qZJtxmZYds5vD64BkD6sqROms9NnMipo4LrjaJ6fXC23BiaBq5tvO7t8PBI+NQhQAuvvJLHMGPU; Expires=Tue, 11 Jun 2024 19:35:26 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=ofhxJGy7zMNoPoxIWlUY9ZWogRRMaCtKmpHu7CwHLeH5E1nDMx7sSassSPKZYUTn; expires=Tue, 03 Jun 2025 19:35:26 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=bqs4jjkplrgtfl797zbsvkur8so9lkwm; expires=Tue, 18 Jun 2024 19:35:26 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -107,9 +145,174 @@ "name": "x-frame-options", "value": "DENY" }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "referrer-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + } + ], + "headersSize": 1138, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 404, + "statusText": "Not Found" + }, + "startedDateTime": "2024-06-04T19:35:26.107Z", + "time": 870, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 870 + } + }, + { + "_id": "c848aaf3a4f713256fbfdb40e49ba79e", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "_fromType": "array", + "name": "user-agent", + "value": "configure-action/2.2.1" + }, + { + "_fromType": "array", + "name": "authorization", + "value": "Api-Key x" + }, + { + "_fromType": "array", + "name": "accept", + "value": "*/*" + }, + { + "_fromType": "array", + "name": "accept-encoding", + "value": "gzip,deflate" + }, + { + "_fromType": "array", + "name": "connection", + "value": "close" + }, + { + "name": "host", + "value": "api.staging.cloudtruth.io" + } + ], + "headersSize": 302, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://api.staging.cloudtruth.io/api/v1/projects/39c58d99-ca5f-4802-8c2e-f3c060d57934/" + }, + "response": { + "bodySize": 48, + "content": { + "mimeType": "application/json", + "size": 48, + "text": { + "detail": "No Project matches the given query." + } + }, + "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "UjnRO2w+vJlzsV1zX87L2wJXZ/pMQ2HZ5PdRrHHEQ8aKBxD0oX4zpLE/qfg0yr86TtLLC6GZOX43VUzjQ8mqfDwPPcCsA5YH83GwPWigV04NLL9fNdcsQGvDxTWiXBzqA/Oxu873aCVDKIvYqZuKkqL0ncko0JCg45UPdyU8O5nd" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "UjnRO2w+vJlzsV1zX87L2wJXZ/pMQ2HZ5PdRrHHEQ8aKBxD0oX4zpLE/qfg0yr86TtLLC6GZOX43VUzjQ8mqfDwPPcCsA5YH83GwPWigV04NLL9fNdcsQGvDxTWiXBzqA/Oxu873aCVDKIvYqZuKkqL0ncko0JCg45UPdyU8O5nd" + }, + { + "expires": {}, + "maxAge": 31449600, + "name": "csrftoken", + "path": "/", + "sameSite": "Lax", + "value": "ttN80nQdyhmaAFdBRb2PoUoRVsR7e4rE3qEyO6V0QKG0yOqV0TwpnEztKyF0u4WH" + }, + { + "expires": {}, + "maxAge": 1209600, + "name": "sessionid", + "path": "/", + "secure": true, + "value": "m5rscv0zaczsvq8yi7bw44m8t2epbgt8" + } + ], + "headers": [ + { + "name": "date", + "value": "Tue, 04 Jun 2024 19:36:48 GMT" + }, + { + "name": "content-type", + "value": "application/json" + }, { "name": "content-length", - "value": "23" + "value": "48" + }, + { + "name": "connection", + "value": "close" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=UjnRO2w+vJlzsV1zX87L2wJXZ/pMQ2HZ5PdRrHHEQ8aKBxD0oX4zpLE/qfg0yr86TtLLC6GZOX43VUzjQ8mqfDwPPcCsA5YH83GwPWigV04NLL9fNdcsQGvDxTWiXBzqA/Oxu873aCVDKIvYqZuKkqL0ncko0JCg45UPdyU8O5nd; Expires=Tue, 11 Jun 2024 19:36:48 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=UjnRO2w+vJlzsV1zX87L2wJXZ/pMQ2HZ5PdRrHHEQ8aKBxD0oX4zpLE/qfg0yr86TtLLC6GZOX43VUzjQ8mqfDwPPcCsA5YH83GwPWigV04NLL9fNdcsQGvDxTWiXBzqA/Oxu873aCVDKIvYqZuKkqL0ncko0JCg45UPdyU8O5nd; Expires=Tue, 11 Jun 2024 19:36:48 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=ttN80nQdyhmaAFdBRb2PoUoRVsR7e4rE3qEyO6V0QKG0yOqV0TwpnEztKyF0u4WH; expires=Tue, 03 Jun 2025 19:36:48 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=m5rscv0zaczsvq8yi7bw44m8t2epbgt8; expires=Tue, 18 Jun 2024 19:36:48 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" + }, + { + "name": "vary", + "value": "Accept, Cookie, Origin" + }, + { + "name": "allow", + "value": "GET, PUT, PATCH, DELETE, HEAD, OPTIONS" + }, + { + "name": "x-frame-options", + "value": "DENY" }, { "name": "x-content-type-options", @@ -119,25 +322,188 @@ "name": "referrer-policy", "value": "same-origin" }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + } + ], + "headersSize": 1138, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 404, + "statusText": "Not Found" + }, + "startedDateTime": "2024-06-04T19:36:47.926Z", + "time": 927, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 927 + } + }, + { + "_id": "c848aaf3a4f713256fbfdb40e49ba79e", + "_order": 2, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "_fromType": "array", + "name": "user-agent", + "value": "configure-action/2.2.1" + }, + { + "_fromType": "array", + "name": "authorization", + "value": "Api-Key x" + }, + { + "_fromType": "array", + "name": "accept", + "value": "*/*" + }, + { + "_fromType": "array", + "name": "accept-encoding", + "value": "gzip,deflate" + }, + { + "_fromType": "array", + "name": "connection", + "value": "close" + }, + { + "name": "host", + "value": "api.staging.cloudtruth.io" + } + ], + "headersSize": 302, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://api.staging.cloudtruth.io/api/v1/projects/39c58d99-ca5f-4802-8c2e-f3c060d57934/" + }, + "response": { + "bodySize": 48, + "content": { + "mimeType": "application/json", + "size": 48, + "text": { + "detail": "No Project matches the given query." + } + }, + "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "YFnrubcFj9XQHuWOruZNMt8o5dlOWVXumNb1HV9uoWxGQjr/c9HNBhCImU1l0DjyYoTOb0GLt8Dg8STOGewHtdWiIG2loeTbTgnU21dE0YKBLbOG3r4DhY2EDH9kPrttbAugudIljHfSEmLGrgWQMJLtBIDuCLWdSPc7+sRygLRs" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "YFnrubcFj9XQHuWOruZNMt8o5dlOWVXumNb1HV9uoWxGQjr/c9HNBhCImU1l0DjyYoTOb0GLt8Dg8STOGewHtdWiIG2loeTbTgnU21dE0YKBLbOG3r4DhY2EDH9kPrttbAugudIljHfSEmLGrgWQMJLtBIDuCLWdSPc7+sRygLRs" + }, + { + "expires": {}, + "maxAge": 31449600, + "name": "csrftoken", + "path": "/", + "sameSite": "Lax", + "value": "0XJj0u2F0nHLDX4uZXkxojEhJfID9lXdEp4WWVaWx67ACIqWHQd69QCQ8XU7xwom" + }, + { + "expires": {}, + "maxAge": 1209600, + "name": "sessionid", + "path": "/", + "secure": true, + "value": "81o3wlb29i20xx41mawy2n75ljc54vin" + } + ], + "headers": [ + { + "name": "date", + "value": "Tue, 04 Jun 2024 19:36:49 GMT" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "48" + }, + { + "name": "connection", + "value": "close" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=YFnrubcFj9XQHuWOruZNMt8o5dlOWVXumNb1HV9uoWxGQjr/c9HNBhCImU1l0DjyYoTOb0GLt8Dg8STOGewHtdWiIG2loeTbTgnU21dE0YKBLbOG3r4DhY2EDH9kPrttbAugudIljHfSEmLGrgWQMJLtBIDuCLWdSPc7+sRygLRs; Expires=Tue, 11 Jun 2024 19:36:48 GMT; Path=/" + }, { "_fromType": "array", "name": "set-cookie", - "value": "csrftoken=LijYGrQJHxqR18unsMjhkwA5qWmmYNYbqNpUtojKHU1zTpxt8fv8kk7BupqzsAar; expires=Fri, 16 Sep 2022 14:37:25 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + "value": "AWSALBTGCORS=YFnrubcFj9XQHuWOruZNMt8o5dlOWVXumNb1HV9uoWxGQjr/c9HNBhCImU1l0DjyYoTOb0GLt8Dg8STOGewHtdWiIG2loeTbTgnU21dE0YKBLbOG3r4DhY2EDH9kPrttbAugudIljHfSEmLGrgWQMJLtBIDuCLWdSPc7+sRygLRs; Expires=Tue, 11 Jun 2024 19:36:48 GMT; Path=/; SameSite=None; Secure" }, { "_fromType": "array", "name": "set-cookie", - "value": "sessionid=apxzydm2c87fhg16e738jhd8j629jnaj; expires=Fri, 01 Oct 2021 14:37:25 GMT; Max-Age=1209600; Path=/; Secure" + "value": "csrftoken=0XJj0u2F0nHLDX4uZXkxojEhJfID9lXdEp4WWVaWx67ACIqWHQd69QCQ8XU7xwom; expires=Tue, 03 Jun 2025 19:36:49 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=81o3wlb29i20xx41mawy2n75ljc54vin; expires=Tue, 18 Jun 2024 19:36:49 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" + }, + { + "name": "vary", + "value": "Accept, Cookie, Origin" + }, + { + "name": "allow", + "value": "GET, PUT, PATCH, DELETE, HEAD, OPTIONS" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "referrer-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 589, + "headersSize": 1138, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 404, "statusText": "Not Found" }, - "startedDateTime": "2021-09-17T14:37:25.128Z", - "time": 406, + "startedDateTime": "2024-06-04T19:36:48.856Z", + "time": 875, "timings": { "blocked": -1, "connect": -1, @@ -145,7 +511,7 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 406 + "wait": 875 } } ], diff --git a/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-project-name_417107770/recording.har b/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-project-name_417107770/recording.har index 4870db9..98dd634 100644 --- a/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-project-name_417107770/recording.har +++ b/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-project-name_417107770/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "5030e3f45aa2e12b54e4cdbf90d93a03", + "_id": "69fddae507ae8ab7e45c675923551d57", "_order": 0, "cache": {}, "request": { @@ -18,7 +18,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -42,10 +42,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 272, + "headersSize": 294, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -54,7 +54,7 @@ "value": "not_a_real_project_name" } ], - "url": "https://localhost:8000/api/v1/projects/?name=not_a_real_project_name" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/?name=not_a_real_project_name" }, "response": { "bodySize": 52, @@ -69,13 +69,27 @@ } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "Z4wO3T7FapcwJXx0SHMYI6rKpUr7cBQrpFAjZF3AEESX40WmTJLmi4Rpe3i9kBFUtua+nvhOCZ2wJxj4F6mk5Ra8ux5FF+Zubq5sxLAKunXSNbudng+yjZTq2jdtvhGfy/u45rZii42g1Vep61FmHhruClWVtrf4pXTY92JGh7ET" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "Z4wO3T7FapcwJXx0SHMYI6rKpUr7cBQrpFAjZF3AEESX40WmTJLmi4Rpe3i9kBFUtua+nvhOCZ2wJxj4F6mk5Ra8ux5FF+Zubq5sxLAKunXSNbudng+yjZTq2jdtvhGfy/u45rZii42g1Vep61FmHhruClWVtrf4pXTY92JGh7ET" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "rxVlC6ESQWTG5vsHjDmc44uyhQimP1fAi3Nb9cvO0VZn9OFg1zw5oioywr80ILoQ" + "value": "wgr5VfbJKRzJqJLBJdC8z3PZfwdAAf79akfmNJxemEdiHi5lxXKREcE61rzEIy6n" }, { "expires": {}, @@ -83,25 +97,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "nvm2zow5f65jf0cywo98c3ifbcqgh6ww" + "value": "gbslm7iu6nakxhvwzyweysbs4lgxf9dz" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Tue, 04 Jun 2024 19:35:28 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:25 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "52" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=Z4wO3T7FapcwJXx0SHMYI6rKpUr7cBQrpFAjZF3AEESX40WmTJLmi4Rpe3i9kBFUtua+nvhOCZ2wJxj4F6mk5Ra8ux5FF+Zubq5sxLAKunXSNbudng+yjZTq2jdtvhGfy/u45rZii42g1Vep61FmHhruClWVtrf4pXTY92JGh7ET; Expires=Tue, 11 Jun 2024 19:35:27 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=Z4wO3T7FapcwJXx0SHMYI6rKpUr7cBQrpFAjZF3AEESX40WmTJLmi4Rpe3i9kBFUtua+nvhOCZ2wJxj4F6mk5Ra8ux5FF+Zubq5sxLAKunXSNbudng+yjZTq2jdtvhGfy/u45rZii42g1Vep61FmHhruClWVtrf4pXTY92JGh7ET; Expires=Tue, 11 Jun 2024 19:35:27 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=wgr5VfbJKRzJqJLBJdC8z3PZfwdAAf79akfmNJxemEdiHi5lxXKREcE61rzEIy6n; expires=Tue, 03 Jun 2025 19:35:28 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=gbslm7iu6nakxhvwzyweysbs4lgxf9dz; expires=Tue, 18 Jun 2024 19:35:28 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -115,10 +153,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "52" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -128,24 +162,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=rxVlC6ESQWTG5vsHjDmc44uyhQimP1fAi3Nb9cvO0VZn9OFg1zw5oioywr80ILoQ; expires=Fri, 16 Sep 2022 14:37:25 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=nvm2zow5f65jf0cywo98c3ifbcqgh6ww; expires=Fri, 01 Oct 2021 14:37:25 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 575, + "headersSize": 1124, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:25.551Z", - "time": 353, + "startedDateTime": "2024-06-04T19:35:26.990Z", + "time": 1397, "timings": { "blocked": -1, "connect": -1, @@ -153,7 +181,7 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 353 + "wait": 1397 } } ], diff --git a/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-tag-name_3420049525/recording.har b/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-tag-name_3420049525/recording.har index 408d711..033da76 100644 --- a/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-tag-name_3420049525/recording.har +++ b/__tests__/__recordings__/configure-action-tests_1610138645/fails-properly-with-an-unknown-tag-name_3420049525/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "c6a8d72d08ddebc11c2622b786c55a00", + "_id": "68e6413ddfbccd07945fae79ede833b4", "_order": 0, "cache": {}, "request": { @@ -18,7 +18,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -42,10 +42,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 278, + "headersSize": 300, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -54,37 +54,59 @@ "value": "cloudtruth/configure-action" } ], - "url": "https://localhost:8000/api/v1/projects/?name=cloudtruth%2Fconfigure-action" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/?name=cloudtruth%2Fconfigure-action" }, "response": { - "bodySize": 323, + "bodySize": 512, "content": { "mimeType": "application/json", - "size": 323, + "size": 512, "text": { "count": 1, "next": null, "previous": null, "results": [ { - "created_at": "2021-09-17T14:10:32.574380Z", + "access_controlled": false, + "created_at": "2024-06-04T18:11:56.025576Z", + "dependents": [], + "depends_on": null, "description": "", - "id": "a9ff9bc3-d527-47eb-950b-1d7bcd06f183", - "modified_at": "2021-09-17T14:17:11.233790Z", + "id": "c50db8d7-901f-429e-856b-ee50a08dc08d", + "ledger_id": "16335396-f6f8-4774-a9ac-70cd4b9a48eb", + "modified_at": "2024-06-04T18:11:56.043087Z", "name": "cloudtruth/configure-action", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/" + "parameter_name_pattern": "", + "push_urls": [], + "pushes": [], + "role": null, + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/" } ] } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "uINcdiM9r0ddNg9Gwz2mGz0OCfpXlbQxYl+FrQki9EMSEeOqWkN/SYKLS9zNtMk5tUrKBwiRvIsduxNz80MJiJB9PT8ZH4WWDQBD8CISjIG9yewyIz7O5PXtgCwpm4MHEc/4BcTw3gw1ToAKlIcpYwKXbYOvL3YvA0zKoe8paDqn" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "uINcdiM9r0ddNg9Gwz2mGz0OCfpXlbQxYl+FrQki9EMSEeOqWkN/SYKLS9zNtMk5tUrKBwiRvIsduxNz80MJiJB9PT8ZH4WWDQBD8CISjIG9yewyIz7O5PXtgCwpm4MHEc/4BcTw3gw1ToAKlIcpYwKXbYOvL3YvA0zKoe8paDqn" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "Uik8fGMTCS1VkUM5TfnrIvzDy7BuEIgDecaKu0vVopUWLD50mq5hXB2d46XMFXjm" + "value": "WcG9zLnemUWl6vHmjnw5jdXB07HKLuklX3SUeElRgUx7fU5RTB1gdyYzMIwVPJle" }, { "expires": {}, @@ -92,25 +114,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "o813r3ly28zrbktro8nmzz4q0qlmsctc" + "value": "z16xqtbrxp4paf3xdjka70leuwe4gcpq" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Tue, 04 Jun 2024 19:35:33 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:28 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "512" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=uINcdiM9r0ddNg9Gwz2mGz0OCfpXlbQxYl+FrQki9EMSEeOqWkN/SYKLS9zNtMk5tUrKBwiRvIsduxNz80MJiJB9PT8ZH4WWDQBD8CISjIG9yewyIz7O5PXtgCwpm4MHEc/4BcTw3gw1ToAKlIcpYwKXbYOvL3YvA0zKoe8paDqn; Expires=Tue, 11 Jun 2024 19:35:32 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=uINcdiM9r0ddNg9Gwz2mGz0OCfpXlbQxYl+FrQki9EMSEeOqWkN/SYKLS9zNtMk5tUrKBwiRvIsduxNz80MJiJB9PT8ZH4WWDQBD8CISjIG9yewyIz7O5PXtgCwpm4MHEc/4BcTw3gw1ToAKlIcpYwKXbYOvL3YvA0zKoe8paDqn; Expires=Tue, 11 Jun 2024 19:35:32 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=WcG9zLnemUWl6vHmjnw5jdXB07HKLuklX3SUeElRgUx7fU5RTB1gdyYzMIwVPJle; expires=Tue, 03 Jun 2025 19:35:33 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=z16xqtbrxp4paf3xdjka70leuwe4gcpq; expires=Tue, 18 Jun 2024 19:35:33 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -124,10 +170,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "323" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -137,24 +179,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=Uik8fGMTCS1VkUM5TfnrIvzDy7BuEIgDecaKu0vVopUWLD50mq5hXB2d46XMFXjm; expires=Fri, 16 Sep 2022 14:37:28 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=o813r3ly28zrbktro8nmzz4q0qlmsctc; expires=Fri, 01 Oct 2021 14:37:28 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 576, + "headersSize": 1125, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:27.758Z", - "time": 364, + "startedDateTime": "2024-06-04T19:35:32.168Z", + "time": 973, "timings": { "blocked": -1, "connect": -1, @@ -162,11 +198,11 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 364 + "wait": 973 } }, { - "_id": "a9ae701af25349b43349a89d90de4c77", + "_id": "da74344a30beb94e81610721b0f261d3", "_order": 0, "cache": {}, "request": { @@ -176,7 +212,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -200,10 +236,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 342, + "headersSize": 376, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -211,16 +247,20 @@ "name": "environment", "value": "default" }, - { - "name": "tag", - "value": "not_a_real_tag_name" - }, { "name": "page", "value": "1" + }, + { + "name": "page_size", + "value": "3" + }, + { + "name": "tag", + "value": "not_a_real_tag_name" } ], - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/?environment=default&tag=not_a_real_tag_name&page=1" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/?environment=default&page=1&page_size=3&tag=not_a_real_tag_name" }, "response": { "bodySize": 83, @@ -232,13 +272,27 @@ } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "7kQO53ahCdZv0MmfB6/n3399X5mP0TwEUBC2pkO4OcSci4SuBUXWhlx3GPqOXsXvueUkrZ2fl+WRIchI5U6yJTF5iV2HeHtJ0o3OZTIM5KU56i++om2FHYIZE5MIDfdjobzFg7ZRn6AOKQzb5MYWhOaK34BX/1NIsjIkDTRDEXhE" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "7kQO53ahCdZv0MmfB6/n3399X5mP0TwEUBC2pkO4OcSci4SuBUXWhlx3GPqOXsXvueUkrZ2fl+WRIchI5U6yJTF5iV2HeHtJ0o3OZTIM5KU56i++om2FHYIZE5MIDfdjobzFg7ZRn6AOKQzb5MYWhOaK34BX/1NIsjIkDTRDEXhE" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "WriBvJEe6mopYWNx6crKk8oG5TrZv2r9g223tVZtKSARkMlAqd1FipMW6MaKqjcB" + "value": "i2wuAmOA2f7J8o2AHuaClxoqBNa9qWPcThlzgTVg228e1o6nC8nQogHvQxktBK5X" }, { "expires": {}, @@ -246,25 +300,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "rxtj4xpjdy1xc05d824akhs5oz5t4xjh" + "value": "e3y9dsbg2f1jffeem36kdprsl0d49jmb" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Thu, 06 Jun 2024 19:04:07 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:28 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "83" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=7kQO53ahCdZv0MmfB6/n3399X5mP0TwEUBC2pkO4OcSci4SuBUXWhlx3GPqOXsXvueUkrZ2fl+WRIchI5U6yJTF5iV2HeHtJ0o3OZTIM5KU56i++om2FHYIZE5MIDfdjobzFg7ZRn6AOKQzb5MYWhOaK34BX/1NIsjIkDTRDEXhE; Expires=Thu, 13 Jun 2024 19:04:07 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=7kQO53ahCdZv0MmfB6/n3399X5mP0TwEUBC2pkO4OcSci4SuBUXWhlx3GPqOXsXvueUkrZ2fl+WRIchI5U6yJTF5iV2HeHtJ0o3OZTIM5KU56i++om2FHYIZE5MIDfdjobzFg7ZRn6AOKQzb5MYWhOaK34BX/1NIsjIkDTRDEXhE; Expires=Thu, 13 Jun 2024 19:04:07 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=i2wuAmOA2f7J8o2AHuaClxoqBNa9qWPcThlzgTVg228e1o6nC8nQogHvQxktBK5X; expires=Thu, 05 Jun 2025 19:04:07 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=e3y9dsbg2f1jffeem36kdprsl0d49jmb; expires=Thu, 20 Jun 2024 19:04:07 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -278,10 +356,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "83" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -291,24 +365,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=WriBvJEe6mopYWNx6crKk8oG5TrZv2r9g223tVZtKSARkMlAqd1FipMW6MaKqjcB; expires=Fri, 16 Sep 2022 14:37:28 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=rxtj4xpjdy1xc05d824akhs5oz5t4xjh; expires=Fri, 01 Oct 2021 14:37:28 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 575, + "headersSize": 1124, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 404, "statusText": "Not Found" }, - "startedDateTime": "2021-09-17T14:37:28.130Z", - "time": 320, + "startedDateTime": "2024-06-06T19:04:07.094Z", + "time": 623, "timings": { "blocked": -1, "connect": -1, @@ -316,7 +384,7 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 320 + "wait": 623 } } ], diff --git a/__tests__/__recordings__/configure-action-tests_1610138645/prevents-overwriting-existing-environment-variables_3098864005/recording.har b/__tests__/__recordings__/configure-action-tests_1610138645/prevents-overwriting-existing-environment-variables_3098864005/recording.har index cc3a2c4..b4e44cf 100644 --- a/__tests__/__recordings__/configure-action-tests_1610138645/prevents-overwriting-existing-environment-variables_3098864005/recording.har +++ b/__tests__/__recordings__/configure-action-tests_1610138645/prevents-overwriting-existing-environment-variables_3098864005/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "c6a8d72d08ddebc11c2622b786c55a00", + "_id": "68e6413ddfbccd07945fae79ede833b4", "_order": 0, "cache": {}, "request": { @@ -18,7 +18,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -42,10 +42,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 278, + "headersSize": 300, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -54,37 +54,59 @@ "value": "cloudtruth/configure-action" } ], - "url": "https://localhost:8000/api/v1/projects/?name=cloudtruth%2Fconfigure-action" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/?name=cloudtruth%2Fconfigure-action" }, "response": { - "bodySize": 323, + "bodySize": 512, "content": { "mimeType": "application/json", - "size": 323, + "size": 512, "text": { "count": 1, "next": null, "previous": null, "results": [ { - "created_at": "2021-09-17T14:10:32.574380Z", + "access_controlled": false, + "created_at": "2024-06-04T18:11:56.025576Z", + "dependents": [], + "depends_on": null, "description": "", - "id": "a9ff9bc3-d527-47eb-950b-1d7bcd06f183", - "modified_at": "2021-09-17T14:17:11.233790Z", + "id": "c50db8d7-901f-429e-856b-ee50a08dc08d", + "ledger_id": "16335396-f6f8-4774-a9ac-70cd4b9a48eb", + "modified_at": "2024-06-04T18:11:56.043087Z", "name": "cloudtruth/configure-action", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/" + "parameter_name_pattern": "", + "push_urls": [], + "pushes": [], + "role": null, + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/" } ] } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "vY8zaGdWORQO84AYh3GrtCHlF0NGSQylYEgongDFr5vyjLm1Z93rYs8Wo4RFb6FgxGHD/nQNwNryCWLm6D2OdNK2gNQI4AqpTyLIYIYUe4x7+L/gSR8uR6tSShI5pq2mvX7zPF1Hrqk8YaJtzn94aZuqGkpQ3ltKpJSqK51YauOY" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "vY8zaGdWORQO84AYh3GrtCHlF0NGSQylYEgongDFr5vyjLm1Z93rYs8Wo4RFb6FgxGHD/nQNwNryCWLm6D2OdNK2gNQI4AqpTyLIYIYUe4x7+L/gSR8uR6tSShI5pq2mvX7zPF1Hrqk8YaJtzn94aZuqGkpQ3ltKpJSqK51YauOY" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "cAgpXAu65t7j6oBASFnuCuG0lJTFNLILIAjkJKoO0EoCxo011WLBxTpTQ33CwSQL" + "value": "inTSEmNO0n8eHPr65cq8XgLWI50LPJiG8yL1l7PUX62xGtmIg5IEJ3bFccProMeZ" }, { "expires": {}, @@ -92,25 +114,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "cbiiblsgt9x7h1x5697idp9xwsfj9clb" + "value": "1uknbuvgzofem72kobroprn7ihynon31" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Tue, 04 Jun 2024 19:35:18 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:21 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "512" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=vY8zaGdWORQO84AYh3GrtCHlF0NGSQylYEgongDFr5vyjLm1Z93rYs8Wo4RFb6FgxGHD/nQNwNryCWLm6D2OdNK2gNQI4AqpTyLIYIYUe4x7+L/gSR8uR6tSShI5pq2mvX7zPF1Hrqk8YaJtzn94aZuqGkpQ3ltKpJSqK51YauOY; Expires=Tue, 11 Jun 2024 19:35:18 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=vY8zaGdWORQO84AYh3GrtCHlF0NGSQylYEgongDFr5vyjLm1Z93rYs8Wo4RFb6FgxGHD/nQNwNryCWLm6D2OdNK2gNQI4AqpTyLIYIYUe4x7+L/gSR8uR6tSShI5pq2mvX7zPF1Hrqk8YaJtzn94aZuqGkpQ3ltKpJSqK51YauOY; Expires=Tue, 11 Jun 2024 19:35:18 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=inTSEmNO0n8eHPr65cq8XgLWI50LPJiG8yL1l7PUX62xGtmIg5IEJ3bFccProMeZ; expires=Tue, 03 Jun 2025 19:35:18 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=1uknbuvgzofem72kobroprn7ihynon31; expires=Tue, 18 Jun 2024 19:35:18 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -124,10 +170,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "323" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -137,24 +179,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=cAgpXAu65t7j6oBASFnuCuG0lJTFNLILIAjkJKoO0EoCxo011WLBxTpTQ33CwSQL; expires=Fri, 16 Sep 2022 14:37:21 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=cbiiblsgt9x7h1x5697idp9xwsfj9clb; expires=Fri, 01 Oct 2021 14:37:21 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 576, + "headersSize": 1125, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:20.694Z", - "time": 363, + "startedDateTime": "2024-06-04T19:35:18.068Z", + "time": 813, "timings": { "blocked": -1, "connect": -1, @@ -162,11 +198,11 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 363 + "wait": 813 } }, { - "_id": "94a5408566f06256422f6dc5ec210cc0", + "_id": "a0ef4e7e2961b92d601b4728ed5f24e4", "_order": 0, "cache": {}, "request": { @@ -176,7 +212,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -200,10 +236,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 318, + "headersSize": 352, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -214,186 +250,142 @@ { "name": "page", "value": "1" + }, + { + "name": "page_size", + "value": "3" } ], - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/?environment=default&page=1" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/?environment=default&page=1&page_size=3" }, "response": { - "bodySize": 5741, + "bodySize": 3649, "content": { "mimeType": "application/json", - "size": 5741, + "size": 3649, "text": { - "count": 5, + "count": 1, "next": null, "previous": null, "results": [ { - "created_at": "2021-09-17T14:10:35.343192Z", + "created_at": "2024-06-05T20:12:52.092854Z", "description": "", - "id": "b3bb4680-bc94-4a47-b238-171addc23156", - "modified_at": "2021-09-17T14:10:35.663230Z", - "name": "CTTEST_HAS_NO_OVERRIDE", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/b3bb4680-bc94-4a47-b238-171addc23156/", - "values": { - "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/": { - "created_at": "2021-09-17T14:10:35.647588Z", - "dynamic": false, - "dynamic_filter": "", - "dynamic_fqn": "", - "earliest_tag": null, - "environment": "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/", - "environment_name": "default", - "external": false, - "external_error": null, - "external_filter": "", - "external_fqn": "", - "id": "1d9e8383-f372-4471-a14b-139e8605e127", - "internal_value": "has_no_override_default", - "modified_at": "2021-09-17T14:10:35.647588Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/b3bb4680-bc94-4a47-b238-171addc23156/", - "secret": false, - "static_value": "has_no_override_default", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/b3bb4680-bc94-4a47-b238-171addc23156/values/1d9e8383-f372-4471-a14b-139e8605e127/", - "value": "has_no_override_default" - } - } - }, - { - "created_at": "2021-09-17T14:10:38.206228Z", - "description": "", - "id": "5e3ff32e-7b73-4bdc-b15e-55494f84f0f3", - "modified_at": "2021-09-17T14:10:38.206228Z", - "name": "CTTEST_HAS_NO_VALUE", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/5e3ff32e-7b73-4bdc-b15e-55494f84f0f3/", - "values": { - "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/": null - } - }, - { - "created_at": "2021-09-17T14:10:32.841971Z", - "description": "", - "id": "9fa37ea5-7872-4447-a55a-51ce1954de48", - "modified_at": "2021-09-17T14:17:11.230147Z", - "name": "CTTEST_NOT_A_SECRET", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/9fa37ea5-7872-4447-a55a-51ce1954de48/", - "values": { - "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/": { - "created_at": "2021-09-17T14:10:33.284290Z", - "dynamic": false, - "dynamic_filter": "", - "dynamic_fqn": "", - "earliest_tag": null, - "environment": "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/", - "environment_name": "default", - "external": false, - "external_error": null, - "external_filter": "", - "external_fqn": "", - "id": "7866de20-1bd4-481b-a815-b8c06fd8aaef", - "internal_value": "not_a_secret_default", - "modified_at": "2021-09-17T14:10:33.284290Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/9fa37ea5-7872-4447-a55a-51ce1954de48/", - "secret": false, - "static_value": "not_a_secret_default", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/9fa37ea5-7872-4447-a55a-51ce1954de48/values/7866de20-1bd4-481b-a815-b8c06fd8aaef/", - "value": "not_a_secret_default" - } - } - }, - { - "created_at": "2021-09-17T14:10:33.981024Z", - "description": "", - "id": "fda38b98-e5b0-4d37-8ca0-5c695212bb89", - "modified_at": "2021-09-17T14:10:34.977406Z", + "expiration_action": null, + "expired_status": null, + "expires": null, + "id": "9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49", + "ledger_id": "66f82427-0a89-424b-a0a7-94c795cb04c0", + "modified_at": "2024-06-05T20:12:52.114439Z", "name": "CTTEST_TOTALLY_A_SECRET", + "overrides": null, + "project": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/", + "project_name": "cloudtruth/configure-action", + "referencing_templates": [], + "referencing_values": [], "rules": [], "secret": true, "templates": [], "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/fda38b98-e5b0-4d37-8ca0-5c695212bb89/", + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/", "values": { - "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/": { - "created_at": "2021-09-17T14:10:34.313141Z", + "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/": { + "active_environment": "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/", + "active_environment_id": "76ba4595-bb96-406c-b1d7-f633e89d9c7d", + "active_environment_name": "default", + "created_at": "2024-06-05T20:13:01.294716Z", "dynamic": false, + "dynamic_error": null, "dynamic_filter": "", "dynamic_fqn": "", - "earliest_tag": null, - "environment": "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/", + "environment": "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/", + "environment_id": "76ba4595-bb96-406c-b1d7-f633e89d9c7d", "environment_name": "default", + "evaluated": false, + "expires_at": null, "external": false, "external_error": null, "external_filter": "", "external_fqn": "", - "id": "b92867d6-2c0d-43a7-9f16-85504c8f6ded", + "external_status": null, + "id": "f2cdcbf0-5261-4d67-9834-0b842c4c873d", "internal_value": null, - "modified_at": "2021-09-17T14:10:34.414380Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/fda38b98-e5b0-4d37-8ca0-5c695212bb89/", + "interpolated": false, + "ledger_id": "8216f912-60f6-4ba1-8af7-9ac30e7df799", + "modified_at": "2024-06-05T20:13:01.455153Z", + "parameter": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/", + "parameter_id": "9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49", + "referenced_parameters": [], + "referenced_projects": [], + "referenced_templates": [], "secret": true, "static_value": null, - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/fda38b98-e5b0-4d37-8ca0-5c695212bb89/values/b92867d6-2c0d-43a7-9f16-85504c8f6ded/", + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/values/f2cdcbf0-5261-4d67-9834-0b842c4c873d/", "value": "totally_a_secret_default" } - } - }, - { - "created_at": "2021-09-17T14:10:36.060882Z", - "description": "", - "id": "49dedfd8-8105-4d74-baa3-b6f5e5c3721c", - "modified_at": "2021-09-17T14:10:37.815115Z", - "name": "cttest.not.posix", - "rules": [], - "secret": false, - "templates": [], - "type": "string", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/49dedfd8-8105-4d74-baa3-b6f5e5c3721c/", - "values": { - "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/": { - "created_at": "2021-09-17T14:10:36.765569Z", + }, + "values_flat": [ + { + "active_environment": "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/", + "active_environment_id": "76ba4595-bb96-406c-b1d7-f633e89d9c7d", + "active_environment_name": "default", + "created_at": "2024-06-05T20:13:01.294716Z", "dynamic": false, + "dynamic_error": null, "dynamic_filter": "", "dynamic_fqn": "", - "earliest_tag": null, - "environment": "https://localhost:8000/api/v1/environments/bdc8e316-ef59-4e2d-82ff-0e941565ce72/", + "environment": "https://api.staging.cloudtruth.io/api/v1/environments/76ba4595-bb96-406c-b1d7-f633e89d9c7d/", + "environment_id": "76ba4595-bb96-406c-b1d7-f633e89d9c7d", "environment_name": "default", + "evaluated": false, + "expires_at": null, "external": false, "external_error": null, "external_filter": "", "external_fqn": "", - "id": "5e58ab8c-826a-4398-8627-85fa011c0627", - "internal_value": "not.posix.default", - "modified_at": "2021-09-17T14:10:36.765569Z", - "parameter": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/49dedfd8-8105-4d74-baa3-b6f5e5c3721c/", - "secret": false, - "static_value": "not.posix.default", - "url": "https://localhost:8000/api/v1/projects/a9ff9bc3-d527-47eb-950b-1d7bcd06f183/parameters/49dedfd8-8105-4d74-baa3-b6f5e5c3721c/values/5e58ab8c-826a-4398-8627-85fa011c0627/", - "value": "not.posix.default" + "external_status": null, + "id": "f2cdcbf0-5261-4d67-9834-0b842c4c873d", + "internal_value": null, + "interpolated": false, + "ledger_id": "8216f912-60f6-4ba1-8af7-9ac30e7df799", + "modified_at": "2024-06-05T20:13:01.455153Z", + "parameter": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/", + "parameter_id": "9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49", + "referenced_parameters": [], + "referenced_projects": [], + "referenced_templates": [], + "secret": true, + "static_value": null, + "url": "https://api.staging.cloudtruth.io/api/v1/projects/c50db8d7-901f-429e-856b-ee50a08dc08d/parameters/9d2dbada-0e90-4fa5-a6f8-4c6d9fb74e49/values/f2cdcbf0-5261-4d67-9834-0b842c4c873d/", + "value": "totally_a_secret_default" } - } + ] } ] } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "KcHEeKylp7V3qMt+1m5ou7NSn4E1sMbBXa5HC4cAnH7GIaUGe499Wex74pR1X6PXyZaidMfxo4279UmLL8XMLleYBVIj1isZQFX0xqzuuiDbAPi4BerS97rcZezMbQzs0PHVB6+DIbesTo/+AI9py+7nF52Tj1Hz5E2kfIYhZUZC" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "KcHEeKylp7V3qMt+1m5ou7NSn4E1sMbBXa5HC4cAnH7GIaUGe499Wex74pR1X6PXyZaidMfxo4279UmLL8XMLleYBVIj1isZQFX0xqzuuiDbAPi4BerS97rcZezMbQzs0PHVB6+DIbesTo/+AI9py+7nF52Tj1Hz5E2kfIYhZUZC" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "HSHHjp4oe1Y1brDljla1SjRIXbd2qeBxEPWhngYhBXpfmsxZJROgqdP7js5PdVNb" + "value": "ypgUCgl13BJgPTWwDgDGe8gHOIk9KJty4pgkTEWUY8nRbCXp4Dz8FqqPrdnU5AeN" }, { "expires": {}, @@ -401,25 +393,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "nkgh8sauox9zdyps2okpevtunt3hro7f" + "value": "wmj8nrvnvau4xvcvjjz9ux2reswqz57h" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Thu, 06 Jun 2024 19:04:03 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:21 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "3649" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=KcHEeKylp7V3qMt+1m5ou7NSn4E1sMbBXa5HC4cAnH7GIaUGe499Wex74pR1X6PXyZaidMfxo4279UmLL8XMLleYBVIj1isZQFX0xqzuuiDbAPi4BerS97rcZezMbQzs0PHVB6+DIbesTo/+AI9py+7nF52Tj1Hz5E2kfIYhZUZC; Expires=Thu, 13 Jun 2024 19:04:02 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=KcHEeKylp7V3qMt+1m5ou7NSn4E1sMbBXa5HC4cAnH7GIaUGe499Wex74pR1X6PXyZaidMfxo4279UmLL8XMLleYBVIj1isZQFX0xqzuuiDbAPi4BerS97rcZezMbQzs0PHVB6+DIbesTo/+AI9py+7nF52Tj1Hz5E2kfIYhZUZC; Expires=Thu, 13 Jun 2024 19:04:02 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=ypgUCgl13BJgPTWwDgDGe8gHOIk9KJty4pgkTEWUY8nRbCXp4Dz8FqqPrdnU5AeN; expires=Thu, 05 Jun 2025 19:04:03 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=wmj8nrvnvau4xvcvjjz9ux2reswqz57h; expires=Thu, 20 Jun 2024 19:04:03 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -433,10 +449,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "5741" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -446,24 +458,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=HSHHjp4oe1Y1brDljla1SjRIXbd2qeBxEPWhngYhBXpfmsxZJROgqdP7js5PdVNb; expires=Fri, 16 Sep 2022 14:37:21 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=nkgh8sauox9zdyps2okpevtunt3hro7f; expires=Fri, 01 Oct 2021 14:37:21 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 577, + "headersSize": 1126, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:21.066Z", - "time": 624, + "startedDateTime": "2024-06-06T19:04:02.514Z", + "time": 907, "timings": { "blocked": -1, "connect": -1, @@ -471,7 +477,7 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 624 + "wait": 907 } } ], diff --git a/__tests__/__recordings__/configure-action-tests_1610138645/warns-if-the-project-has-no-parameters_913152626/recording.har b/__tests__/__recordings__/configure-action-tests_1610138645/warns-if-the-project-has-no-parameters_913152626/recording.har index f75aa02..f327c05 100644 --- a/__tests__/__recordings__/configure-action-tests_1610138645/warns-if-the-project-has-no-parameters_913152626/recording.har +++ b/__tests__/__recordings__/configure-action-tests_1610138645/warns-if-the-project-has-no-parameters_913152626/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "d0d3bf1d014b139ab3f09c7419ab6fcc", + "_id": "2979820c65a7e8789c141c8500a8abd0", "_order": 0, "cache": {}, "request": { @@ -18,7 +18,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -42,10 +42,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 254, + "headersSize": 276, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -54,37 +54,59 @@ "value": "empty" } ], - "url": "https://localhost:8000/api/v1/projects/?name=empty" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/?name=empty" }, "response": { - "bodySize": 301, + "bodySize": 490, "content": { "mimeType": "application/json", - "size": 301, + "size": 490, "text": { "count": 1, "next": null, "previous": null, "results": [ { - "created_at": "2021-09-17T14:10:32.217305Z", + "access_controlled": false, + "created_at": "2024-06-04T19:35:11.393192Z", + "dependents": [], + "depends_on": null, "description": "", - "id": "c207f5a1-2b02-487d-b9ef-c3d18baea8f7", - "modified_at": "2021-09-17T14:10:32.217305Z", + "id": "60128a08-fbab-491e-b1fc-a0864b2b26f0", + "ledger_id": "fb56e9ed-d084-4a0a-b442-93ab2175a115", + "modified_at": "2024-06-04T19:35:11.411306Z", "name": "empty", - "url": "https://localhost:8000/api/v1/projects/c207f5a1-2b02-487d-b9ef-c3d18baea8f7/" + "parameter_name_pattern": "", + "push_urls": [], + "pushes": [], + "role": null, + "url": "https://api.staging.cloudtruth.io/api/v1/projects/60128a08-fbab-491e-b1fc-a0864b2b26f0/" } ] } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "xrRvXTPZ9g9tAgUFOmHtXMDsWamZg6gYq0H5+YFaVDVYG91lVWK6vbqZPrnUzc8Mv4VrLyFpao3+QdNKYcUtTrTD3gN1/CH7Uctxc2LsXWk+/J8KLVqCDN8FBYqfzG1fDwkj/R14CosWFgvGRZuetjvJvy4SGb559/HfLBCXa/Dd" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "xrRvXTPZ9g9tAgUFOmHtXMDsWamZg6gYq0H5+YFaVDVYG91lVWK6vbqZPrnUzc8Mv4VrLyFpao3+QdNKYcUtTrTD3gN1/CH7Uctxc2LsXWk+/J8KLVqCDN8FBYqfzG1fDwkj/R14CosWFgvGRZuetjvJvy4SGb559/HfLBCXa/Dd" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "PRew1HSAB7g3efuI2m9Y5RN7uIoRWdmJNWM7aCiypSGF04Houn4qloyFXo5p5Sjn" + "value": "Iza7FQamEO1J8DzrR7ZyoEVnQ5yfbzBmk8Z0sExPtLKk1R8I9ft1mJE1japPR1Ox" }, { "expires": {}, @@ -92,25 +114,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "m36zhesnm0qu3i9gue0mkekfqpox7gxz" + "value": "xjmgohsldc9dr7i5lpaidhdf8751tbl6" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Tue, 04 Jun 2024 19:35:25 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:24 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "490" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=xrRvXTPZ9g9tAgUFOmHtXMDsWamZg6gYq0H5+YFaVDVYG91lVWK6vbqZPrnUzc8Mv4VrLyFpao3+QdNKYcUtTrTD3gN1/CH7Uctxc2LsXWk+/J8KLVqCDN8FBYqfzG1fDwkj/R14CosWFgvGRZuetjvJvy4SGb559/HfLBCXa/Dd; Expires=Tue, 11 Jun 2024 19:35:24 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=xrRvXTPZ9g9tAgUFOmHtXMDsWamZg6gYq0H5+YFaVDVYG91lVWK6vbqZPrnUzc8Mv4VrLyFpao3+QdNKYcUtTrTD3gN1/CH7Uctxc2LsXWk+/J8KLVqCDN8FBYqfzG1fDwkj/R14CosWFgvGRZuetjvJvy4SGb559/HfLBCXa/Dd; Expires=Tue, 11 Jun 2024 19:35:24 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=Iza7FQamEO1J8DzrR7ZyoEVnQ5yfbzBmk8Z0sExPtLKk1R8I9ft1mJE1japPR1Ox; expires=Tue, 03 Jun 2025 19:35:25 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=xjmgohsldc9dr7i5lpaidhdf8751tbl6; expires=Tue, 18 Jun 2024 19:35:25 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -124,10 +170,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "301" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -137,24 +179,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=PRew1HSAB7g3efuI2m9Y5RN7uIoRWdmJNWM7aCiypSGF04Houn4qloyFXo5p5Sjn; expires=Fri, 16 Sep 2022 14:37:24 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=m36zhesnm0qu3i9gue0mkekfqpox7gxz; expires=Fri, 01 Oct 2021 14:37:24 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 576, + "headersSize": 1125, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:24.232Z", - "time": 452, + "startedDateTime": "2024-06-04T19:35:23.992Z", + "time": 1039, "timings": { "blocked": -1, "connect": -1, @@ -162,11 +198,11 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 452 + "wait": 1039 } }, { - "_id": "c0ede563e4fd771159f4ec6449c337a6", + "_id": "7d8fa440ee940bbbced61dcf654853ea", "_order": 0, "cache": {}, "request": { @@ -176,7 +212,7 @@ { "_fromType": "array", "name": "user-agent", - "value": "configure-action/2.1.0" + "value": "configure-action/2.2.1" }, { "_fromType": "array", @@ -200,10 +236,10 @@ }, { "name": "host", - "value": "localhost:8000" + "value": "api.staging.cloudtruth.io" } ], - "headersSize": 318, + "headersSize": 352, "httpVersion": "HTTP/1.1", "method": "GET", "queryString": [ @@ -214,9 +250,13 @@ { "name": "page", "value": "1" + }, + { + "name": "page_size", + "value": "3" } ], - "url": "https://localhost:8000/api/v1/projects/c207f5a1-2b02-487d-b9ef-c3d18baea8f7/parameters/?environment=default&page=1" + "url": "https://api.staging.cloudtruth.io/api/v1/projects/60128a08-fbab-491e-b1fc-a0864b2b26f0/parameters/?environment=default&page=1&page_size=3" }, "response": { "bodySize": 52, @@ -231,13 +271,27 @@ } }, "cookies": [ + { + "expires": {}, + "name": "AWSALBTG", + "path": "/", + "value": "KeZ4D1chmOf49FlQGpLQWCRPHg2nVCVBPeJ+dQ/GSSsCDCUOfkRR1Pz+vZbqos2eKMu/uaibqbK8iQHopiRJqKdLy5WiRuFPFk+WNCpR8ZhEObPHaxk62lo/FVaGVUWxuphhDyNyDE1xWQl+RUIvwcNRhGLWcCSwZhvIKegfiNhm" + }, + { + "expires": {}, + "name": "AWSALBTGCORS", + "path": "/", + "sameSite": "None", + "secure": true, + "value": "KeZ4D1chmOf49FlQGpLQWCRPHg2nVCVBPeJ+dQ/GSSsCDCUOfkRR1Pz+vZbqos2eKMu/uaibqbK8iQHopiRJqKdLy5WiRuFPFk+WNCpR8ZhEObPHaxk62lo/FVaGVUWxuphhDyNyDE1xWQl+RUIvwcNRhGLWcCSwZhvIKegfiNhm" + }, { "expires": {}, "maxAge": 31449600, "name": "csrftoken", "path": "/", "sameSite": "Lax", - "value": "cDrCV7H2RtapYGIMqQ2uwGjbKH3HHC9MqD0RlVUtpZHOeN43WLMTGwdS9dAR0Nfk" + "value": "tcfGVSptYYeSfBjRdhtpqTKHjFaF4MoqM7NR6jcMXWFDuv7wbsABEEWSipkpANgz" }, { "expires": {}, @@ -245,25 +299,49 @@ "name": "sessionid", "path": "/", "secure": true, - "value": "v6negztpe5gy2d1279obiivi7qfjdy1c" + "value": "5yr6xjqrnf0lm7vy3o6cd09n1924h2dh" } ], "headers": [ { - "name": "server", - "value": "undisclosed" + "name": "date", + "value": "Thu, 06 Jun 2024 19:04:05 GMT" }, { - "name": "date", - "value": "Fri, 17 Sep 2021 14:37:25 GMT" + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "52" }, { "name": "connection", "value": "close" }, { - "name": "content-type", - "value": "application/json" + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTG=KeZ4D1chmOf49FlQGpLQWCRPHg2nVCVBPeJ+dQ/GSSsCDCUOfkRR1Pz+vZbqos2eKMu/uaibqbK8iQHopiRJqKdLy5WiRuFPFk+WNCpR8ZhEObPHaxk62lo/FVaGVUWxuphhDyNyDE1xWQl+RUIvwcNRhGLWcCSwZhvIKegfiNhm; Expires=Thu, 13 Jun 2024 19:04:04 GMT; Path=/" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "AWSALBTGCORS=KeZ4D1chmOf49FlQGpLQWCRPHg2nVCVBPeJ+dQ/GSSsCDCUOfkRR1Pz+vZbqos2eKMu/uaibqbK8iQHopiRJqKdLy5WiRuFPFk+WNCpR8ZhEObPHaxk62lo/FVaGVUWxuphhDyNyDE1xWQl+RUIvwcNRhGLWcCSwZhvIKegfiNhm; Expires=Thu, 13 Jun 2024 19:04:04 GMT; Path=/; SameSite=None; Secure" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "csrftoken=tcfGVSptYYeSfBjRdhtpqTKHjFaF4MoqM7NR6jcMXWFDuv7wbsABEEWSipkpANgz; expires=Thu, 05 Jun 2025 19:04:05 GMT; Max-Age=31449600; Path=/; SameSite=Lax" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "sessionid=5yr6xjqrnf0lm7vy3o6cd09n1924h2dh; expires=Thu, 20 Jun 2024 19:04:05 GMT; Max-Age=1209600; Path=/; Secure" + }, + { + "name": "server", + "value": "gunicorn" }, { "name": "vary", @@ -277,10 +355,6 @@ "name": "x-frame-options", "value": "DENY" }, - { - "name": "content-length", - "value": "52" - }, { "name": "x-content-type-options", "value": "nosniff" @@ -290,24 +364,18 @@ "value": "same-origin" }, { - "_fromType": "array", - "name": "set-cookie", - "value": "csrftoken=cDrCV7H2RtapYGIMqQ2uwGjbKH3HHC9MqD0RlVUtpZHOeN43WLMTGwdS9dAR0Nfk; expires=Fri, 16 Sep 2022 14:37:25 GMT; Max-Age=31449600; Path=/; SameSite=Lax" - }, - { - "_fromType": "array", - "name": "set-cookie", - "value": "sessionid=v6negztpe5gy2d1279obiivi7qfjdy1c; expires=Fri, 01 Oct 2021 14:37:25 GMT; Max-Age=1209600; Path=/; Secure" + "name": "cross-origin-opener-policy", + "value": "same-origin" } ], - "headersSize": 575, + "headersSize": 1124, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2021-09-17T14:37:24.692Z", - "time": 416, + "startedDateTime": "2024-06-06T19:04:04.797Z", + "time": 749, "timings": { "blocked": -1, "connect": -1, @@ -315,7 +383,7 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 416 + "wait": 749 } } ], diff --git a/__tests__/action.test.ts b/__tests__/action.test.ts index 689bd64..3c4d4f4 100644 --- a/__tests__/action.test.ts +++ b/__tests__/action.test.ts @@ -19,12 +19,14 @@ jestPollyConfigService.config = { process.env.INPUT_APIKEY = process.env.CLOUDTRUTH_API_KEY process.env.INPUT_ENVIRONMENT = 'default' process.env.INPUT_PROJECT = 'cloudtruth/configure-action' -process.env.INPUT_SERVER = 'https://localhost:8000' +process.env.INPUT_SERVER = process.env.CLOUDTRUTH_SERVER || 'https://localhost:8000' process.env.TESTING_REST_API_PAGE_SIZE = '3' // to force multiple pages to be tested async function setup() { // helper to seed the test environment + core.debug(`Setting up test environment, creating client`) const client = api() + core.debug(`client created ${JSON.stringify(client)}`) let default_environment = (await client.environmentsList({name: process.env.INPUT_ENVIRONMENT!})).data.results![0] let staging_environment = (await client.environmentsList({name: 'staging'})).data.results![0] @@ -92,7 +94,7 @@ async function setup() { describe('configure-action tests', () => { beforeAll(async () => { - if (process.env.SETUP == 'setup') { + if (process.env.SETUP === 'setup') { await setup() } }) @@ -129,6 +131,7 @@ describe('configure-action tests', () => { process.env.INPUT_PROJECT = test_project.id let default_environment = (await client.environmentsList({name: process.env.INPUT_ENVIRONMENT!})).data.results![0] process.env.INPUT_ENVIRONMENT = default_environment.id + core.info(`Using environment ${default_environment.id}`) const spySetEnvvar = jest.spyOn(core, 'exportVariable') const spySetSecret = jest.spyOn(core, 'setSecret') await run() @@ -186,7 +189,9 @@ describe('configure-action tests', () => { process.env['INPUT_PROJECT'] = '39c58d99-ca5f-4802-8c2e-f3c060d57934' const spyFailed = jest.spyOn(core, 'setFailed') await run() - expect(spyFailed).toHaveBeenCalledWith(`Project "39c58d99-ca5f-4802-8c2e-f3c060d57934": Not found.`) + expect(spyFailed).toHaveBeenCalledWith( + `Project \"39c58d99-ca5f-4802-8c2e-f3c060d57934\": No Project matches the given query.` + ) }) it('fails properly with an unknown project name', async () => { @@ -207,14 +212,14 @@ describe('configure-action tests', () => { process.env['INPUT_ENVIRONMENT'] = '39c58d99-ca5f-4802-8c2e-f3c060d57934' const spyFailed = jest.spyOn(core, 'setFailed') await run() - expect(spyFailed).toHaveBeenCalledWith(`Not found.`) + expect(spyFailed).toHaveBeenCalledWith(`Environment(s) not found: 39c58d99-ca5f-4802-8c2e-f3c060d57934`) }) it('fails properly with an unknown environment name', async () => { process.env['INPUT_ENVIRONMENT'] = 'no_such_environment' const spyFailed = jest.spyOn(core, 'setFailed') await run() - expect(spyFailed).toHaveBeenCalledWith(`Not found.`) + expect(spyFailed).toHaveBeenCalledWith(`Environment(s) not found: no_such_environment`) }) it('fails properly with an unknown tag name', async () => { diff --git a/dist/index.js b/dist/index.js index f84cd05..2d247cd 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2834,13 +2834,47 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.run = exports.api = exports.configurefetch = void 0; +exports.run = exports.api = exports.configurefetch = exports.fetchWithRetry = void 0; const core = __importStar(__nccwpck_require__(2186)); const Api_1 = __nccwpck_require__(428); const version_1 = __nccwpck_require__(8217); const uuid_1 = __nccwpck_require__(5840); const isomorphic_fetch_1 = __importDefault(__nccwpck_require__(2340)); const USER_AGENT = `configure-action/${version_1.LIB_VERSION}`; +async function fetchWithRetry(url, { headers, ...options } = {}, init, { timeoutInSeconds, tries } = { timeoutInSeconds: 10, tries: 1 }) { + let response; + let controller; + core.debug(`Fetching ${url} with ${timeoutInSeconds} seconds timeout and will try ${tries} time(s).`); + for (let tryCount = 0; tryCount < tries; tryCount++) { + core.debug(`Try ${tryCount + 1} of ${tries}.`); + let timeoutId; + try { + controller = new AbortController(); + timeoutId = setTimeout(() => controller.abort(), timeoutInSeconds * 1000); + response = await (0, isomorphic_fetch_1.default)(url, { + signal: controller.signal, + headers: { + 'User-Agent': USER_AGENT, + ...headers + }, + ...init + }); + clearTimeout(timeoutId); + return response; + } + catch (error) { + core.debug(`Caught error ${error}`); + if (timeoutId) { + clearTimeout(timeoutId); + } + if (!(error instanceof DOMException) || error.name !== 'AbortError') { + throw error; + } + } + } + throw new Error(`Failed to fetch ${url} after ${tries} tries.`); +} +exports.fetchWithRetry = fetchWithRetry; const configurefetch = (url, /* istanbul ignore next */ { headers, ...options } = {}) => { @@ -2856,7 +2890,7 @@ exports.configurefetch = configurefetch; function api() { const api = new Api_1.Api({ baseUrl: core.getInput('server') || 'https://api.cloudtruth.io', - customFetch: exports.configurefetch, + customFetch: fetchWithRetry, securityWorker: (securityData) => { return { headers: { @@ -2867,6 +2901,7 @@ function api() { } }); api.setSecurityData({ apikey: core.getInput('apikey') }); + core.debug(`Using API server ${JSON.stringify(api)}`); return api; } exports.api = api; @@ -2919,18 +2954,27 @@ async function run() { const environment = core.getInput('environment', { required: true }); const tag = core.getInput('tag') || undefined; for (let page = 1;; ++page) { - core.debug(`Requesting parameter values for project='${project_id}' environment='${environment}' tag='${tag}' page=${page}`); let page_size = undefined; if (process.env.TESTING_REST_API_PAGE_SIZE) { page_size = parseInt(process.env.TESTING_REST_API_PAGE_SIZE); } - const response = await client.projectsParametersList({ + const payload = { projectPk: project_id, environment: environment, - tag: tag, page: page, page_size: page_size - }); + }; + if (tag) { + payload.tag = tag; + core.debug(`Requesting parameter values for project='${project_id}' environment='${environment}' tag='${tag}' page=${page}`); + } + else { + core.debug(`Requesting parameter values for project='${project_id}' environment='${environment}' page=${page}`); + } + core.debug(`Payload ${JSON.stringify(payload)}`); + const response = await client.projectsParametersList(payload); + core.debug(`Received ${response.data.results.length} parameters.`); + core.debug(`Data: ${JSON.stringify(response.data)}`); inject(response); if (response.data.next == null) { if (page == 1 && response.data.count == 0) { @@ -2956,7 +3000,7 @@ exports.run = run; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.LIB_VERSION = void 0; -exports.LIB_VERSION = "2.2.0"; +exports.LIB_VERSION = "2.2.1"; /***/ }), diff --git a/dist/index.js.map b/dist/index.js.map index e44ed5f..112bc06 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxkFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC7IA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxhBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChqDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnBA;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpBA;;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7BA;AACA;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA","sources":["../webpack://configure-action/./lib/gen/Api.js","../webpack://configure-action/./lib/gen/http-client.js","../webpack://configure-action/./lib/run.js","../webpack://configure-action/./lib/version.js","../webpack://configure-action/./node_modules/@actions/core/lib/command.js","../webpack://configure-action/./node_modules/@actions/core/lib/core.js","../webpack://configure-action/./node_modules/@actions/core/lib/file-command.js","../webpack://configure-action/./node_modules/@actions/core/lib/oidc-utils.js","../webpack://configure-action/./node_modules/@actions/core/lib/utils.js","../webpack://configure-action/./node_modules/@actions/http-client/auth.js","../webpack://configure-action/./node_modules/@actions/http-client/index.js","../webpack://configure-action/./node_modules/@actions/http-client/proxy.js","../webpack://configure-action/./node_modules/isomorphic-fetch/fetch-npm-node.js","../webpack://configure-action/./node_modules/node-fetch/lib/index.js","../webpack://configure-action/./node_modules/node-fetch/node_modules/tr46/index.js","../webpack://configure-action/./node_modules/node-fetch/node_modules/webidl-conversions/lib/index.js","../webpack://configure-action/./node_modules/node-fetch/node_modules/whatwg-url/lib/URL-impl.js","../webpack://configure-action/./node_modules/node-fetch/node_modules/whatwg-url/lib/URL.js","../webpack://configure-action/./node_modules/node-fetch/node_modules/whatwg-url/lib/public-api.js","../webpack://configure-action/./node_modules/node-fetch/node_modules/whatwg-url/lib/url-state-machine.js","../webpack://configure-action/./node_modules/node-fetch/node_modules/whatwg-url/lib/utils.js","../webpack://configure-action/./node_modules/tunnel/index.js","../webpack://configure-action/./node_modules/tunnel/lib/tunnel.js","../webpack://configure-action/./node_modules/uuid/dist/index.js","../webpack://configure-action/./node_modules/uuid/dist/md5.js","../webpack://configure-action/./node_modules/uuid/dist/nil.js","../webpack://configure-action/./node_modules/uuid/dist/parse.js","../webpack://configure-action/./node_modules/uuid/dist/regex.js","../webpack://configure-action/./node_modules/uuid/dist/rng.js","../webpack://configure-action/./node_modules/uuid/dist/sha1.js","../webpack://configure-action/./node_modules/uuid/dist/stringify.js","../webpack://configure-action/./node_modules/uuid/dist/v1.js","../webpack://configure-action/./node_modules/uuid/dist/v3.js","../webpack://configure-action/./node_modules/uuid/dist/v35.js","../webpack://configure-action/./node_modules/uuid/dist/v4.js","../webpack://configure-action/./node_modules/uuid/dist/v5.js","../webpack://configure-action/./node_modules/uuid/dist/validate.js","../webpack://configure-action/./node_modules/uuid/dist/version.js","../webpack://configure-action/./node_modules/@vercel/ncc/dist/ncc/@@notfound.js","../webpack://configure-action/external node-commonjs \"assert\"","../webpack://configure-action/external node-commonjs \"crypto\"","../webpack://configure-action/external node-commonjs \"events\"","../webpack://configure-action/external node-commonjs \"fs\"","../webpack://configure-action/external node-commonjs \"http\"","../webpack://configure-action/external node-commonjs \"https\"","../webpack://configure-action/external node-commonjs \"net\"","../webpack://configure-action/external node-commonjs \"os\"","../webpack://configure-action/external node-commonjs \"path\"","../webpack://configure-action/external node-commonjs \"punycode\"","../webpack://configure-action/external node-commonjs \"stream\"","../webpack://configure-action/external node-commonjs \"tls\"","../webpack://configure-action/external node-commonjs \"url\"","../webpack://configure-action/external node-commonjs \"util\"","../webpack://configure-action/external node-commonjs \"zlib\"","../webpack://configure-action/webpack/bootstrap","../webpack://configure-action/webpack/runtime/compat","../webpack://configure-action/./lib/main.js"],"sourcesContent":["\"use strict\";\n/* eslint-disable */\n/* tslint:disable */\n/*\n * ---------------------------------------------------------------\n * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ##\n * ## ##\n * ## AUTHOR: acacode ##\n * ## SOURCE: https://github.com/acacode/swagger-typescript-api ##\n * ---------------------------------------------------------------\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Api = void 0;\nconst http_client_1 = require(\"./http-client\");\nclass Api extends http_client_1.HttpClient {\n constructor() {\n super(...arguments);\n /**\n * @description OpenApi3 schema for this API. Format can be selected via content negotiation. - YAML: application/vnd.oai.openapi - JSON: application/vnd.oai.openapi+json\n *\n * @tags api\n * @name ApiSchemaRetrieve\n * @request GET:/api/schema/\n * @secure\n * @response `200` `Record`\n */\n this.apiSchemaRetrieve = (query, params = {}) => this.request({\n path: `/api/schema/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description A searchable log of all the actions taken by users and service accounts within the organization.\n *\n * @tags audit\n * @name AuditList\n * @request GET:/api/v1/audit/\n * @secure\n * @response `200` `PaginatedAuditTrailList`\n */\n this.auditList = (query, params = {}) => this.request({\n path: `/api/v1/audit/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Retrieve one record from the audit log.\n *\n * @tags audit\n * @name AuditRetrieve\n * @request GET:/api/v1/audit/{id}/\n * @secure\n * @response `200` `AuditTrail`\n */\n this.auditRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/audit/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Summary information about the organization's audit trail.\n *\n * @tags audit\n * @name AuditSummaryRetrieve\n * @request GET:/api/v1/audit/summary/\n * @secure\n * @response `200` `AuditTrailSummary`\n */\n this.auditSummaryRetrieve = (params = {}) => this.request({\n path: `/api/v1/audit/summary/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags backup\n * @name BackupSnapshotCreate\n * @summary Get a snapshot of all Projects with parameters\n * @request POST:/api/v1/backup/snapshot/\n * @secure\n * @response `200` `BackupDataSnapshot`\n */\n this.backupSnapshotCreate = (params = {}) => this.request({\n path: `/api/v1/backup/snapshot/`,\n method: 'POST',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags environments\n * @name EnvironmentsList\n * @request GET:/api/v1/environments/\n * @secure\n * @response `200` `PaginatedEnvironmentList`\n */\n this.environmentsList = (query, params = {}) => this.request({\n path: `/api/v1/environments/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags environments\n * @name EnvironmentsCreate\n * @request POST:/api/v1/environments/\n * @secure\n * @response `201` `Environment`\n */\n this.environmentsCreate = (data, params = {}) => this.request({\n path: `/api/v1/environments/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description The push operations that this environment was involved in.\n *\n * @tags environments\n * @name EnvironmentsPushesList\n * @summary List push operations.\n * @request GET:/api/v1/environments/{environment_pk}/pushes/\n * @secure\n * @response `200` `PaginatedTaskStepList`\n */\n this.environmentsPushesList = ({ environmentPk, ...query }, params = {}) => this.request({\n path: `/api/v1/environments/${environmentPk}/pushes/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Tags allow you to name stable points in time for your configuration. Any query API that accepts an `as_of` option will also accept a `tag` option however they are mutually exclusive.\n *\n * @tags environments\n * @name EnvironmentsTagsList\n * @request GET:/api/v1/environments/{environment_pk}/tags/\n * @secure\n * @response `200` `PaginatedTagList`\n */\n this.environmentsTagsList = ({ environmentPk, ...query }, params = {}) => this.request({\n path: `/api/v1/environments/${environmentPk}/tags/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Tags allow you to name stable points in time for your configuration. Any query API that accepts an `as_of` option will also accept a `tag` option however they are mutually exclusive.\n *\n * @tags environments\n * @name EnvironmentsTagsCreate\n * @request POST:/api/v1/environments/{environment_pk}/tags/\n * @secure\n * @response `201` `Tag`\n */\n this.environmentsTagsCreate = (environmentPk, data, params = {}) => this.request({\n path: `/api/v1/environments/${environmentPk}/tags/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Tags allow you to name stable points in time for your configuration. Any query API that accepts an `as_of` option will also accept a `tag` option however they are mutually exclusive.\n *\n * @tags environments\n * @name EnvironmentsTagsRetrieve\n * @request GET:/api/v1/environments/{environment_pk}/tags/{id}/\n * @secure\n * @response `200` `Tag`\n */\n this.environmentsTagsRetrieve = (environmentPk, id, params = {}) => this.request({\n path: `/api/v1/environments/${environmentPk}/tags/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Tags allow you to name stable points in time for your configuration. Any query API that accepts an `as_of` option will also accept a `tag` option however they are mutually exclusive.\n *\n * @tags environments\n * @name EnvironmentsTagsUpdate\n * @request PUT:/api/v1/environments/{environment_pk}/tags/{id}/\n * @secure\n * @response `200` `TagUpdate`\n */\n this.environmentsTagsUpdate = (environmentPk, id, data, params = {}) => this.request({\n path: `/api/v1/environments/${environmentPk}/tags/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Tags allow you to name stable points in time for your configuration. Any query API that accepts an `as_of` option will also accept a `tag` option however they are mutually exclusive.\n *\n * @tags environments\n * @name EnvironmentsTagsPartialUpdate\n * @request PATCH:/api/v1/environments/{environment_pk}/tags/{id}/\n * @secure\n * @response `200` `TagUpdate`\n */\n this.environmentsTagsPartialUpdate = (environmentPk, id, data, params = {}) => this.request({\n path: `/api/v1/environments/${environmentPk}/tags/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Tags allow you to name stable points in time for your configuration. Any query API that accepts an `as_of` option will also accept a `tag` option however they are mutually exclusive.\n *\n * @tags environments\n * @name EnvironmentsTagsDestroy\n * @request DELETE:/api/v1/environments/{environment_pk}/tags/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.environmentsTagsDestroy = (environmentPk, id, params = {}) => this.request({\n path: `/api/v1/environments/${environmentPk}/tags/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags environments\n * @name EnvironmentsRetrieve\n * @request GET:/api/v1/environments/{id}/\n * @secure\n * @response `200` `Environment`\n */\n this.environmentsRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/environments/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags environments\n * @name EnvironmentsUpdate\n * @request PUT:/api/v1/environments/{id}/\n * @secure\n * @response `200` `Environment`\n */\n this.environmentsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/environments/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags environments\n * @name EnvironmentsPartialUpdate\n * @request PATCH:/api/v1/environments/{id}/\n * @secure\n * @response `200` `Environment`\n */\n this.environmentsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/environments/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags environments\n * @name EnvironmentsDestroy\n * @request DELETE:/api/v1/environments/{id}/\n * @secure\n * @response `204` `void` Environment destroyed.\n * @response `409` `void` The environment has children and cannot be removed.\n */\n this.environmentsDestroy = (id, params = {}) => this.request({\n path: `/api/v1/environments/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Grants allow you to enable access control on Environments and Projects. Grants are part of the role-based access control feature set, so if your subscription does not have support for it, these paths will return a 403 Forbidden error.\n *\n * @tags grants\n * @name GrantsList\n * @request GET:/api/v1/grants/\n * @secure\n * @response `200` `PaginatedGrantList`\n * @response `403` `void` Forbidden: see response for further details.\n */\n this.grantsList = (query, params = {}) => this.request({\n path: `/api/v1/grants/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Grants allow you to enable access control on Environments and Projects. Grants are part of the role-based access control feature set, so if your subscription does not have support for it, these paths will return a 403 Forbidden error.\n *\n * @tags grants\n * @name GrantsCreate\n * @request POST:/api/v1/grants/\n * @secure\n * @response `201` `Grant`\n * @response `403` `void` Forbidden: see response for further details.\n */\n this.grantsCreate = (data, params = {}) => this.request({\n path: `/api/v1/grants/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Grants allow you to enable access control on Environments and Projects. Grants are part of the role-based access control feature set, so if your subscription does not have support for it, these paths will return a 403 Forbidden error.\n *\n * @tags grants\n * @name GrantsRetrieve\n * @request GET:/api/v1/grants/{id}/\n * @secure\n * @response `200` `Grant`\n * @response `403` `void` Forbidden: see response for further details.\n */\n this.grantsRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/grants/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Grants allow you to enable access control on Environments and Projects. Grants are part of the role-based access control feature set, so if your subscription does not have support for it, these paths will return a 403 Forbidden error.\n *\n * @tags grants\n * @name GrantsUpdate\n * @request PUT:/api/v1/grants/{id}/\n * @secure\n * @response `200` `Grant`\n * @response `403` `void` Forbidden: see response for further details.\n */\n this.grantsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/grants/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Grants allow you to enable access control on Environments and Projects. Grants are part of the role-based access control feature set, so if your subscription does not have support for it, these paths will return a 403 Forbidden error.\n *\n * @tags grants\n * @name GrantsPartialUpdate\n * @request PATCH:/api/v1/grants/{id}/\n * @secure\n * @response `200` `Grant`\n * @response `403` `void` Forbidden: see response for further details.\n */\n this.grantsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/grants/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Grants allow you to enable access control on Environments and Projects. Grants are part of the role-based access control feature set, so if your subscription does not have support for it, these paths will return a 403 Forbidden error.\n *\n * @tags grants\n * @name GrantsDestroy\n * @request DELETE:/api/v1/grants/{id}/\n * @secure\n * @response `204` `void` Deleted.\n * @response `403` `void` Forbidden: see response for further details.\n */\n this.grantsDestroy = (id, params = {}) => this.request({\n path: `/api/v1/grants/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Removes grants matching the query parameters atomically. Use this technique to disable access control on a scope, or remove all grants for a user.\n *\n * @tags grants\n * @name GrantsMultiDestroy\n * @request DELETE:/api/v1/grants/multi/\n * @secure\n * @response `200` `Grant`\n * @response `403` `void` Forbidden: see response for further details.\n */\n this.grantsMultiDestroy = (params = {}) => this.request({\n path: `/api/v1/grants/multi/`,\n method: 'DELETE',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Import parameters from the provided data.\n *\n * @tags import\n * @name ImportCreate\n * @request POST:/api/v1/import/\n * @secure\n * @response `201` `ImportCreateResponse`\n */\n this.importCreate = (query, data, params = {}) => this.request({\n path: `/api/v1/import/`,\n method: 'POST',\n query: query,\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsList\n * @request GET:/api/v1/integrations/aws/\n * @secure\n * @response `200` `PaginatedAwsIntegrationList`\n */\n this.integrationsAwsList = (query, params = {}) => this.request({\n path: `/api/v1/integrations/aws/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description ### Description ### Establishes an AWS Integration for your CloudTruth organization. ### Pre-Conditions ### - An AWS Integration for the account and role cannot already exist. ### Post-Conditions ### - You must establish an IAM role and trust relationship based on the Role Name and the External ID.\n *\n * @tags integrations\n * @name IntegrationsAwsCreate\n * @summary Establishes an AWS Integration.\n * @request POST:/api/v1/integrations/aws/\n * @secure\n * @response `201` `AwsIntegration`\n */\n this.integrationsAwsCreate = (data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsList\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pulls/\n * @secure\n * @response `200` `PaginatedAwsPullList`\n */\n this.integrationsAwsPullsList = ({ awsintegrationPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsCreate\n * @request POST:/api/v1/integrations/aws/{awsintegration_pk}/pulls/\n * @secure\n * @response `201` `AwsPull`\n */\n this.integrationsAwsPullsCreate = (awsintegrationPk, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsTasksList\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/\n * @secure\n * @response `200` `PaginatedAwsPullTaskList`\n */\n this.integrationsAwsPullsTasksList = ({ awsintegrationPk, awspullPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${awspullPk}/tasks/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsTasksStepsList\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/{awspulltask_pk}/steps/\n * @secure\n * @response `200` `PaginatedAwsPullTaskStepList`\n */\n this.integrationsAwsPullsTasksStepsList = ({ awsintegrationPk, awspullPk, awspulltaskPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${awspullPk}/tasks/${awspulltaskPk}/steps/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsTasksStepsRetrieve\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/{awspulltask_pk}/steps/{id}/\n * @secure\n * @response `200` `AwsPullTaskStep`\n */\n this.integrationsAwsPullsTasksStepsRetrieve = (awsintegrationPk, awspullPk, awspulltaskPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${awspullPk}/tasks/${awspulltaskPk}/steps/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsTasksRetrieve\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/{id}/\n * @secure\n * @response `200` `AwsPullTask`\n */\n this.integrationsAwsPullsTasksRetrieve = (awsintegrationPk, awspullPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${awspullPk}/tasks/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsRetrieve\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{id}/\n * @secure\n * @response `200` `AwsPull`\n */\n this.integrationsAwsPullsRetrieve = (awsintegrationPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsUpdate\n * @request PUT:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{id}/\n * @secure\n * @response `200` `AwsPull`\n */\n this.integrationsAwsPullsUpdate = (awsintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsPartialUpdate\n * @request PATCH:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{id}/\n * @secure\n * @response `200` `AwsPull`\n */\n this.integrationsAwsPullsPartialUpdate = (awsintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsDestroy\n * @request DELETE:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{id}/\n * @secure\n * @response `403` `void` Cannot destroy innate mapped pull of a data integration.\n */\n this.integrationsAwsPullsDestroy = (awsintegrationPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Enqueue a pull synchronization task for mapped external values accessible with this integration.\n *\n * @tags integrations\n * @name IntegrationsAwsPullsSyncCreate\n * @request POST:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{id}/sync/\n * @secure\n * @response `202` `void` Synchronization task enqueued.\n */\n this.integrationsAwsPullsSyncCreate = (awsintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${id}/sync/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesList\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pushes/\n * @secure\n * @response `200` `PaginatedAwsPushList`\n */\n this.integrationsAwsPushesList = ({ awsintegrationPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesCreate\n * @request POST:/api/v1/integrations/aws/{awsintegration_pk}/pushes/\n * @secure\n * @response `201` `AwsPush`\n */\n this.integrationsAwsPushesCreate = (awsintegrationPk, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesTasksList\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{awspush_pk}/tasks/\n * @secure\n * @response `200` `PaginatedAwsPushTaskList`\n */\n this.integrationsAwsPushesTasksList = ({ awsintegrationPk, awspushPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${awspushPk}/tasks/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesTasksStepsList\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{awspush_pk}/tasks/{awspushtask_pk}/steps/\n * @secure\n * @response `200` `PaginatedAwsPushTaskStepList`\n */\n this.integrationsAwsPushesTasksStepsList = ({ awsintegrationPk, awspushPk, awspushtaskPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${awspushPk}/tasks/${awspushtaskPk}/steps/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesTasksStepsRetrieve\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{awspush_pk}/tasks/{awspushtask_pk}/steps/{id}/\n * @secure\n * @response `200` `AwsPushTaskStep`\n */\n this.integrationsAwsPushesTasksStepsRetrieve = (awsintegrationPk, awspushPk, awspushtaskPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${awspushPk}/tasks/${awspushtaskPk}/steps/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesTasksRetrieve\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{awspush_pk}/tasks/{id}/\n * @secure\n * @response `200` `AwsPushTask`\n */\n this.integrationsAwsPushesTasksRetrieve = (awsintegrationPk, awspushPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${awspushPk}/tasks/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesRetrieve\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{id}/\n * @secure\n * @response `200` `AwsPush`\n */\n this.integrationsAwsPushesRetrieve = (awsintegrationPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesUpdate\n * @request PUT:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{id}/\n * @secure\n * @response `200` `AwsPushUpdate`\n */\n this.integrationsAwsPushesUpdate = (awsintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesPartialUpdate\n * @request PATCH:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{id}/\n * @secure\n * @response `200` `AwsPushUpdate`\n */\n this.integrationsAwsPushesPartialUpdate = (awsintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesDestroy\n * @request DELETE:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.integrationsAwsPushesDestroy = (awsintegrationPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Enqueue a push synchronization task.\n *\n * @tags integrations\n * @name IntegrationsAwsPushesSyncCreate\n * @request POST:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{id}/sync/\n * @secure\n * @response `202` `void` Synchronization task enqueued.\n */\n this.integrationsAwsPushesSyncCreate = (awsintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${id}/sync/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsRetrieve\n * @summary Get details of an AWS Integration.\n * @request GET:/api/v1/integrations/aws/{id}/\n * @secure\n * @response `200` `AwsIntegration`\n */\n this.integrationsAwsRetrieve = ({ id, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${id}/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsUpdate\n * @request PUT:/api/v1/integrations/aws/{id}/\n * @secure\n * @response `200` `AwsIntegration`\n */\n this.integrationsAwsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPartialUpdate\n * @request PATCH:/api/v1/integrations/aws/{id}/\n * @secure\n * @response `200` `AwsIntegration`\n */\n this.integrationsAwsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsDestroy\n * @summary Delete an AWS integration.\n * @request DELETE:/api/v1/integrations/aws/{id}/\n * @secure\n * @response `204` `void` Integration removed.\n * @response `409` `void` The integration is used by one (or more) Value(s) and cannot be removed.\n */\n this.integrationsAwsDestroy = ({ id, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${id}/`,\n method: 'DELETE',\n query: query,\n secure: true,\n ...params\n });\n /**\n * @description Probe a region and service using a pattern matching string that can be used in pull actions. This allows the pattern match to be checked for correctness and preview what will match during creation of the string.\n *\n * @tags integrations\n * @name IntegrationsAwsScanCreate\n * @summary Evaluate a potential pull pattern and understand what it will match.\n * @request POST:/api/v1/integrations/aws/{id}/scan/\n * @secure\n * @response `200` `DiscoveryResult`\n */\n this.integrationsAwsScanCreate = (id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${id}/scan/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description ### Description ### Queries a third-party integration to retrieve the data specified by the FQN. You can start exploring by not specifying an 'fqn', which will return a list of FQNs for the existing third-party integrations. Third-party integrations can be configured via the Integrations section of the web application.\n *\n * @tags integrations\n * @name IntegrationsExploreList\n * @summary Retrieve third-party integration data for the specified FQN.\n * @request GET:/api/v1/integrations/explore/\n * @secure\n * @response `200` `PaginatedIntegrationNodeList` The content at the FQN.\n * @response `400` `void` Invalid FQN requested.\n * @response `403` `void` Unable to contact the third-party integration.\n * @response `415` `void` Unsupported content type (usually this means it is binary).\n * @response `507` `void` Content exceeds internal size limit of 1MB.\n */\n this.integrationsExploreList = (query, params = {}) => this.request({\n path: `/api/v1/integrations/explore/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubList\n * @request GET:/api/v1/integrations/github/\n * @secure\n * @response `200` `PaginatedGitHubIntegrationList`\n */\n this.integrationsGithubList = (query, params = {}) => this.request({\n path: `/api/v1/integrations/github/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description ### Description ### Establishes a GitHub Integration in your CloudTruth organization. ### Pre-Conditions ### - The user must be an Administrator or Owner of your organization. - A GitHub Integration with the `installation_id` cannot already exist in this organization. - The user must first install the CloudTruth GitHub Application in their GitHub organization and obtain the `installation_id` of the application in order to create the integration. ### Initiating the GitHub Application Installation ### - Go to `https://github.com/apps/GITHUB_APP_NAME/installations/new?state=` - On successful installation the browser will return to `https://APP_URL/app_setup/github` (configured in ctops/bin/github*) and provide the `installation_id` in the URI. - POST to this api to verify and establish the integration.\n *\n * @tags integrations\n * @name IntegrationsGithubCreate\n * @summary Establishes a GitHub Integration.\n * @request POST:/api/v1/integrations/github/\n * @secure\n * @response `201` `GitHubIntegration`\n */\n this.integrationsGithubCreate = (data, params = {}) => this.request({\n path: `/api/v1/integrations/github/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsList\n * @request GET:/api/v1/integrations/github/{githubintegration_pk}/pulls/\n * @secure\n * @response `200` `PaginatedGitHubPullList`\n */\n this.integrationsGithubPullsList = ({ githubintegrationPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsTasksList\n * @request GET:/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/\n * @secure\n * @response `200` `PaginatedGitHubPullTaskList`\n */\n this.integrationsGithubPullsTasksList = ({ githubintegrationPk, githubpullPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${githubpullPk}/tasks/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsTasksStepsList\n * @request GET:/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/{githubpulltask_pk}/steps/\n * @secure\n * @response `200` `PaginatedGitHubPullTaskStepList`\n */\n this.integrationsGithubPullsTasksStepsList = ({ githubintegrationPk, githubpullPk, githubpulltaskPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${githubpullPk}/tasks/${githubpulltaskPk}/steps/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsTasksStepsRetrieve\n * @request GET:/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/{githubpulltask_pk}/steps/{id}/\n * @secure\n * @response `200` `GitHubPullTaskStep`\n */\n this.integrationsGithubPullsTasksStepsRetrieve = (githubintegrationPk, githubpullPk, githubpulltaskPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${githubpullPk}/tasks/${githubpulltaskPk}/steps/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsTasksRetrieve\n * @request GET:/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/{id}/\n * @secure\n * @response `200` `GitHubPullTask`\n */\n this.integrationsGithubPullsTasksRetrieve = (githubintegrationPk, githubpullPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${githubpullPk}/tasks/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsRetrieve\n * @request GET:/api/v1/integrations/github/{githubintegration_pk}/pulls/{id}/\n * @secure\n * @response `200` `GitHubPull`\n */\n this.integrationsGithubPullsRetrieve = (githubintegrationPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsUpdate\n * @request PUT:/api/v1/integrations/github/{githubintegration_pk}/pulls/{id}/\n * @secure\n * @response `200` `GitHubPull`\n */\n this.integrationsGithubPullsUpdate = (githubintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsPartialUpdate\n * @request PATCH:/api/v1/integrations/github/{githubintegration_pk}/pulls/{id}/\n * @secure\n * @response `200` `GitHubPull`\n */\n this.integrationsGithubPullsPartialUpdate = (githubintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Enqueue a pull synchronization task for mapped external values accessible with this integration.\n *\n * @tags integrations\n * @name IntegrationsGithubPullsSyncCreate\n * @request POST:/api/v1/integrations/github/{githubintegration_pk}/pulls/{id}/sync/\n * @secure\n * @response `202` `void` Synchronization task enqueued.\n */\n this.integrationsGithubPullsSyncCreate = (githubintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${id}/sync/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubRetrieve\n * @summary Get details of a GitHub Integration.\n * @request GET:/api/v1/integrations/github/{id}/\n * @secure\n * @response `200` `GitHubIntegration`\n */\n this.integrationsGithubRetrieve = ({ id, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/github/${id}/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubDestroy\n * @summary Delete a GitHub integration.\n * @request DELETE:/api/v1/integrations/github/{id}/\n * @secure\n * @response `204` `void` Integration removed.\n * @response `409` `void` The integration is used by one (or more) Value(s) and cannot be removed.\n */\n this.integrationsGithubDestroy = ({ id, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/github/${id}/`,\n method: 'DELETE',\n query: query,\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags invitations\n * @name InvitationsList\n * @request GET:/api/v1/invitations/\n * @secure\n * @response `200` `PaginatedInvitationList`\n */\n this.invitationsList = (query, params = {}) => this.request({\n path: `/api/v1/invitations/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Extend an invitation for someone else to join your organization.\n *\n * @tags invitations\n * @name InvitationsCreate\n * @summary Create an invitation.\n * @request POST:/api/v1/invitations/\n * @secure\n * @response `201` `Invitation`\n * @response `403` `void` Permission denied. Is the invitation role more permissive than your own?\n * @response `404` `void` Bad Request. Is there already an invitation for that email?\n */\n this.invitationsCreate = (data, params = {}) => this.request({\n path: `/api/v1/invitations/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags invitations\n * @name InvitationsRetrieve\n * @request GET:/api/v1/invitations/{id}/\n * @secure\n * @response `200` `Invitation`\n */\n this.invitationsRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/invitations/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags invitations\n * @name InvitationsUpdate\n * @request PUT:/api/v1/invitations/{id}/\n * @secure\n * @response `200` `Invitation`\n */\n this.invitationsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/invitations/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags invitations\n * @name InvitationsPartialUpdate\n * @request PATCH:/api/v1/invitations/{id}/\n * @secure\n * @response `200` `Invitation`\n */\n this.invitationsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/invitations/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags invitations\n * @name InvitationsDestroy\n * @request DELETE:/api/v1/invitations/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.invitationsDestroy = (id, params = {}) => this.request({\n path: `/api/v1/invitations/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Accept an invitation to join an organization. The email address used to log in and accept the invitation must match the email address specified by the inviting user when creating the invitation. On success the client receives the invitation record as it was updated. The client should then regenerate the JWT with the organization scope and proceed to the default landing page.\n *\n * @tags invitations\n * @name InvitationsAcceptCreate\n * @summary Accept an invitation.\n * @request POST:/api/v1/invitations/{id}/accept/\n * @secure\n * @response `200` `Invitation` The invitation was accepted. The client should obtain an organization scope token and proceed to the landing page.\n * @response `403` `void` Permission denied. The accepting user's email may not match the invitation?\n * @response `404` `void` Bad Request. The invitation does not exist or has already been accepted?\n */\n this.invitationsAcceptCreate = (id, params = {}) => this.request({\n path: `/api/v1/invitations/${id}/accept/`,\n method: 'POST',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Re-send an invitation to the recipient.\n *\n * @tags invitations\n * @name InvitationsResendCreate\n * @summary Resend an invitation.\n * @request POST:/api/v1/invitations/{id}/resend/\n * @secure\n * @response `200` `Invitation` The invitation state was reset to `pending`, which causes it to get sent again. The most recent state is returned. Clients should check the state.\n * @response `404` `void` Bad Request. Was the invitation already accepted?\n */\n this.invitationsResendCreate = (id, params = {}) => this.request({\n path: `/api/v1/invitations/${id}/resend/`,\n method: 'POST',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags memberships\n * @name MembershipsList\n * @request GET:/api/v1/memberships/\n * @secure\n * @response `200` `PaginatedMembershipList`\n */\n this.membershipsList = (query, params = {}) => this.request({\n path: `/api/v1/memberships/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags memberships\n * @name MembershipsCreate\n * @request POST:/api/v1/memberships/\n * @secure\n * @response `201` `Membership`\n */\n this.membershipsCreate = (data, params = {}) => this.request({\n path: `/api/v1/memberships/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags memberships\n * @name MembershipsRetrieve\n * @request GET:/api/v1/memberships/{id}/\n * @secure\n * @response `200` `Membership`\n */\n this.membershipsRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/memberships/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags memberships\n * @name MembershipsUpdate\n * @request PUT:/api/v1/memberships/{id}/\n * @secure\n * @response `200` `Membership`\n */\n this.membershipsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/memberships/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags memberships\n * @name MembershipsPartialUpdate\n * @request PATCH:/api/v1/memberships/{id}/\n * @secure\n * @response `200` `Membership`\n */\n this.membershipsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/memberships/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags memberships\n * @name MembershipsDestroy\n * @request DELETE:/api/v1/memberships/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.membershipsDestroy = (id, params = {}) => this.request({\n path: `/api/v1/memberships/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags organizations\n * @name OrganizationsList\n * @request GET:/api/v1/organizations/\n * @secure\n * @response `200` `PaginatedOrganizationList`\n */\n this.organizationsList = (query, params = {}) => this.request({\n path: `/api/v1/organizations/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags organizations\n * @name OrganizationsCreate\n * @request POST:/api/v1/organizations/\n * @secure\n * @response `201` `Organization`\n */\n this.organizationsCreate = (data, params = {}) => this.request({\n path: `/api/v1/organizations/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags organizations\n * @name OrganizationsRetrieve\n * @request GET:/api/v1/organizations/{id}/\n * @secure\n * @response `200` `Organization`\n */\n this.organizationsRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/organizations/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags organizations\n * @name OrganizationsUpdate\n * @request PUT:/api/v1/organizations/{id}/\n * @secure\n * @response `200` `Organization`\n */\n this.organizationsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/organizations/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags organizations\n * @name OrganizationsPartialUpdate\n * @request PATCH:/api/v1/organizations/{id}/\n * @secure\n * @response `200` `Organization`\n */\n this.organizationsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/organizations/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags organizations\n * @name OrganizationsDestroy\n * @request DELETE:/api/v1/organizations/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.organizationsDestroy = (id, params = {}) => this.request({\n path: `/api/v1/organizations/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsList\n * @request GET:/api/v1/projects/\n * @secure\n * @response `200` `PaginatedProjectList`\n */\n this.projectsList = (query, params = {}) => this.request({\n path: `/api/v1/projects/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsCreate\n * @request POST:/api/v1/projects/\n * @secure\n * @response `201` `Project`\n */\n this.projectsCreate = (data, params = {}) => this.request({\n path: `/api/v1/projects/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsRetrieve\n * @request GET:/api/v1/projects/{id}/\n * @secure\n * @response `200` `Project`\n */\n this.projectsRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/projects/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsUpdate\n * @request PUT:/api/v1/projects/{id}/\n * @secure\n * @response `200` `Project`\n */\n this.projectsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/projects/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsPartialUpdate\n * @request PATCH:/api/v1/projects/{id}/\n * @secure\n * @response `200` `Project`\n */\n this.projectsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/projects/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsDestroy\n * @request DELETE:/api/v1/projects/{id}/\n * @secure\n * @response `204` `void` Project destroyed.\n * @response `409` `void` The project has dependents and cannot be removed.\n */\n this.projectsDestroy = (id, params = {}) => this.request({\n path: `/api/v1/projects/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Exports all parameters in this project in the requested format. Parameter names and values will be coerced to the proper format (e.g. for a dotenv export, my_parameter will be capitalized to MY_PARAMETER and its value will be in a quoted string). Note that capitalization is the only name coercion that will be performed on parameter names, names that are invalid for a given format will be omitted.\n *\n * @tags projects\n * @name ProjectsParameterExportList\n * @request GET:/api/v1/projects/{project_pk}/parameter-export/\n * @secure\n * @response `200` `ParameterExport`\n * @response `422` `TemplateLookupError`\n */\n this.projectsParameterExportList = ({ projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameter-export/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersList\n * @request GET:/api/v1/projects/{project_pk}/parameters/\n * @secure\n * @response `200` `PaginatedParameterList`\n */\n this.projectsParametersList = ({ projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersCreate\n * @request POST:/api/v1/projects/{project_pk}/parameters/\n * @secure\n * @response `201` `Parameter`\n */\n this.projectsParametersCreate = (projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description The push operations that this parameter was involved in.\n *\n * @tags projects\n * @name ProjectsParametersPushesList\n * @summary List push operations.\n * @request GET:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/pushes/\n * @secure\n * @response `200` `PaginatedTaskStepList`\n */\n this.projectsParametersPushesList = ({ parameterPk, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/pushes/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersRulesList\n * @request GET:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/\n * @secure\n * @response `200` `PaginatedParameterRuleList`\n */\n this.projectsParametersRulesList = ({ parameterPk, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/rules/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersRulesCreate\n * @request POST:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/\n * @secure\n * @response `201` `ParameterRule`\n */\n this.projectsParametersRulesCreate = (parameterPk, projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/rules/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersRulesRetrieve\n * @request GET:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/{id}/\n * @secure\n * @response `200` `ParameterRule`\n */\n this.projectsParametersRulesRetrieve = (id, parameterPk, projectPk, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/rules/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersRulesUpdate\n * @request PUT:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/{id}/\n * @secure\n * @response `200` `ParameterRule`\n */\n this.projectsParametersRulesUpdate = (id, parameterPk, projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/rules/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersRulesPartialUpdate\n * @request PATCH:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/{id}/\n * @secure\n * @response `200` `ParameterRule`\n */\n this.projectsParametersRulesPartialUpdate = (id, parameterPk, projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/rules/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersRulesDestroy\n * @request DELETE:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.projectsParametersRulesDestroy = (id, parameterPk, projectPk, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/rules/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Retrieve previously set values of a parameter in one or all environments. To see all the _effective_ values for a parameter across every environment, use the Parameters API (see the `values` field).\n *\n * @tags projects\n * @name ProjectsParametersValuesList\n * @summary Retrieve values.\n * @request GET:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/\n * @secure\n * @response `200` `PaginatedValueList`\n */\n this.projectsParametersValuesList = ({ parameterPk, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/values/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Set the value of a parameter in an environment.\n *\n * @tags projects\n * @name ProjectsParametersValuesCreate\n * @summary Set a value.\n * @request POST:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/\n * @secure\n * @response `201` `Value`\n */\n this.projectsParametersValuesCreate = ({ parameterPk, projectPk, ...query }, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/values/`,\n method: 'POST',\n query: query,\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Retrieve the value of a parameter in an environment.\n *\n * @tags projects\n * @name ProjectsParametersValuesRetrieve\n * @summary Retrieve a value.\n * @request GET:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/{id}/\n * @secure\n * @response `200` `Value`\n */\n this.projectsParametersValuesRetrieve = ({ id, parameterPk, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/values/${id}/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Update the value of a parameter in an environment.\n *\n * @tags projects\n * @name ProjectsParametersValuesUpdate\n * @summary Update a value.\n * @request PUT:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/{id}/\n * @secure\n * @response `200` `Value`\n */\n this.projectsParametersValuesUpdate = ({ id, parameterPk, projectPk, ...query }, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/values/${id}/`,\n method: 'PUT',\n query: query,\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Update the value of a parameter in an environment.\n *\n * @tags projects\n * @name ProjectsParametersValuesPartialUpdate\n * @summary Update a value.\n * @request PATCH:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/{id}/\n * @secure\n * @response `200` `Value`\n */\n this.projectsParametersValuesPartialUpdate = ({ id, parameterPk, projectPk, ...query }, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/values/${id}/`,\n method: 'PATCH',\n query: query,\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Destroy the value of a parameter in an environment.\n *\n * @tags projects\n * @name ProjectsParametersValuesDestroy\n * @summary Destroy a value.\n * @request DELETE:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.projectsParametersValuesDestroy = ({ id, parameterPk, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/values/${id}/`,\n method: 'DELETE',\n query: query,\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersRetrieve\n * @request GET:/api/v1/projects/{project_pk}/parameters/{id}/\n * @secure\n * @response `200` `Parameter`\n */\n this.projectsParametersRetrieve = ({ id, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${id}/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersUpdate\n * @request PUT:/api/v1/projects/{project_pk}/parameters/{id}/\n * @secure\n * @response `200` `Parameter`\n * @response `400` `void` While checking pre-conditions, an external value was encountered that could not be resolved.\n * @response `404` `void` The given project id could not be found, or while checking pre-conditions, an external value was encountered that could not be resolved.\n * @response `415` `void` While checking pre-conditions, an external value was encountered that has an invalid content type.\n * @response `422` `void` A pre-condition to modifying the `secret` setting of the parameter failed, for example setting `secret: false` and having an external value that resolves to a value that is a secret. In this case it would be unsafe to allow the `secret` setting to change.\n * @response `507` `void` While checking pre-conditions, an external value was encountered that was too large to process.\n */\n this.projectsParametersUpdate = (id, projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersPartialUpdate\n * @request PATCH:/api/v1/projects/{project_pk}/parameters/{id}/\n * @secure\n * @response `200` `Parameter`\n * @response `400` `void` While checking pre-conditions, an external value was encountered that could not be resolved.\n * @response `404` `void` The given project id could not be found, or while checking pre-conditions, an external value was encountered that could not be resolved.\n * @response `415` `void` While checking pre-conditions, an external value was encountered that has an invalid content type.\n * @response `422` `void` A pre-condition to modifying the `secret` setting of the parameter failed, for example setting `secret: false` and having an external value that resolves to a value that is a secret. In this case it would be unsafe to allow the `secret` setting to change.\n * @response `507` `void` While checking pre-conditions, an external value was encountered that was too large to process.\n */\n this.projectsParametersPartialUpdate = (id, projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersDestroy\n * @request DELETE:/api/v1/projects/{project_pk}/parameters/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.projectsParametersDestroy = (id, projectPk, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Summary information about how a parameter has changed over time. The time range of historical information available depends on your subscription. Any changes to the parameter itself, including rules and values, is included.\n *\n * @tags projects\n * @name ProjectsParametersTimelineRetrieve\n * @request GET:/api/v1/projects/{project_pk}/parameters/{id}/timeline/\n * @secure\n * @response `200` `ParameterTimeline`\n */\n this.projectsParametersTimelineRetrieve = ({ id, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${id}/timeline/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Retrieve parameters at dual timepoints for comparison. Results are aligned by parameter name. This means if a parameter is created, then deleted, then created again with the same name the two records with different parameter IDs will show up in the same result entry. If t1 is not specified then it will point to a time in the past where nothing existed. If t2 is not specified then it is assumed to be \"now\".\n *\n * @tags projects\n * @name ProjectsParametersDualityList\n * @request GET:/api/v1/projects/{project_pk}/parameters/duality/\n * @secure\n * @response `200` `PaginatedParameterDualityList`\n */\n this.projectsParametersDualityList = ({ projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/duality/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Information about how the parameters of a project have changed over time. The time range of historical information available depends on your subscription. Any changes to the project's parameters, including rules and values, is included.\n *\n * @tags projects\n * @name ProjectsParametersTimelinesRetrieve\n * @request GET:/api/v1/projects/{project_pk}/parameters/timelines/\n * @secure\n * @response `200` `ParameterTimeline`\n */\n this.projectsParametersTimelinesRetrieve = ({ projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/timelines/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Endpoint for previewing a template. Post the template content in the request body.\n *\n * @tags projects\n * @name ProjectsTemplatePreviewCreate\n * @request POST:/api/v1/projects/{project_pk}/template-preview/\n * @secure\n * @response `200` `TemplatePreview`\n * @response `422` `TemplateLookupError`\n */\n this.projectsTemplatePreviewCreate = ({ projectPk, ...query }, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/template-preview/`,\n method: 'POST',\n query: query,\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsTemplatesList\n * @request GET:/api/v1/projects/{project_pk}/templates/\n * @secure\n * @response `200` `PaginatedTemplateList`\n * @response `422` `TemplateLookupError`\n */\n this.projectsTemplatesList = ({ projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsTemplatesCreate\n * @request POST:/api/v1/projects/{project_pk}/templates/\n * @secure\n * @response `201` `Template`\n * @response `422` `TemplateLookupError`\n */\n this.projectsTemplatesCreate = (projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsTemplatesRetrieve\n * @request GET:/api/v1/projects/{project_pk}/templates/{id}/\n * @secure\n * @response `200` `Template`\n * @response `422` `TemplateLookupError`\n */\n this.projectsTemplatesRetrieve = ({ id, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/${id}/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsTemplatesUpdate\n * @request PUT:/api/v1/projects/{project_pk}/templates/{id}/\n * @secure\n * @response `200` `Template`\n * @response `422` `TemplateLookupError`\n */\n this.projectsTemplatesUpdate = (id, projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsTemplatesPartialUpdate\n * @request PATCH:/api/v1/projects/{project_pk}/templates/{id}/\n * @secure\n * @response `200` `Template`\n * @response `422` `TemplateLookupError`\n */\n this.projectsTemplatesPartialUpdate = (id, projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsTemplatesDestroy\n * @request DELETE:/api/v1/projects/{project_pk}/templates/{id}/\n * @secure\n * @response `204` `void` Template destroyed.\n * @response `409` `void` The template is referenced by another template or value and cannot be removed.\n */\n this.projectsTemplatesDestroy = (id, projectPk, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Information about how a template has changed over time. The time range of historical information available depends on your subscription. Any changes to the template itself is included.\n *\n * @tags projects\n * @name ProjectsTemplatesTimelineRetrieve\n * @request GET:/api/v1/projects/{project_pk}/templates/{id}/timeline/\n * @secure\n * @response `200` `TemplateTimeline`\n */\n this.projectsTemplatesTimelineRetrieve = ({ id, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/${id}/timeline/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Information about how the templates of a project have changed over time. The time range of historical information available depends on your subscription. Any changes to the project's templates is included.\n *\n * @tags projects\n * @name ProjectsTemplatesTimelinesRetrieve\n * @request GET:/api/v1/projects/{project_pk}/templates/timelines/\n * @secure\n * @response `200` `TemplateTimeline`\n */\n this.projectsTemplatesTimelinesRetrieve = ({ projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/timelines/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags serviceaccounts\n * @name ServiceaccountsList\n * @request GET:/api/v1/serviceaccounts/\n * @secure\n * @response `200` `PaginatedServiceAccountList`\n */\n this.serviceaccountsList = (query, params = {}) => this.request({\n path: `/api/v1/serviceaccounts/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Creates a new ServiceAccount. A ServiceAccount is a user record intended for machine use (such as a build system). It does not have a username/password but is instead accessed using an API key. On creation, the API key will be returned. This key will only be shown once, is not stored on any CloudTruth system, and should be treated as a secret. Should the key be lost, you will need to delete and recreate the ServiceAccount in order to generate a new API key.\n *\n * @tags serviceaccounts\n * @name ServiceaccountsCreate\n * @summary Create a ServiceAccount user.\n * @request POST:/api/v1/serviceaccounts/\n * @secure\n * @response `201` `ServiceAccountCreateResponse`\n */\n this.serviceaccountsCreate = (data, params = {}) => this.request({\n path: `/api/v1/serviceaccounts/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags serviceaccounts\n * @name ServiceaccountsRetrieve\n * @request GET:/api/v1/serviceaccounts/{id}/\n * @secure\n * @response `200` `ServiceAccount`\n */\n this.serviceaccountsRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/serviceaccounts/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags serviceaccounts\n * @name ServiceaccountsUpdate\n * @request PUT:/api/v1/serviceaccounts/{id}/\n * @secure\n * @response `200` `ServiceAccount`\n */\n this.serviceaccountsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/serviceaccounts/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags serviceaccounts\n * @name ServiceaccountsPartialUpdate\n * @request PATCH:/api/v1/serviceaccounts/{id}/\n * @secure\n * @response `200` `ServiceAccount`\n */\n this.serviceaccountsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/serviceaccounts/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags serviceaccounts\n * @name ServiceaccountsDestroy\n * @request DELETE:/api/v1/serviceaccounts/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.serviceaccountsDestroy = (id, params = {}) => this.request({\n path: `/api/v1/serviceaccounts/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesList\n * @request GET:/api/v1/types/\n * @secure\n * @response `200` `PaginatedParameterTypeList`\n */\n this.typesList = (query, params = {}) => this.request({\n path: `/api/v1/types/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesCreate\n * @request POST:/api/v1/types/\n * @secure\n * @response `201` `ParameterType`\n */\n this.typesCreate = (data, params = {}) => this.request({\n path: `/api/v1/types/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesRulesList\n * @request GET:/api/v1/types/{parametertype_pk}/rules/\n * @secure\n * @response `200` `PaginatedParameterTypeRuleList`\n */\n this.typesRulesList = ({ parametertypePk, ...query }, params = {}) => this.request({\n path: `/api/v1/types/${parametertypePk}/rules/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesRulesCreate\n * @request POST:/api/v1/types/{parametertype_pk}/rules/\n * @secure\n * @response `201` `ParameterTypeRule`\n */\n this.typesRulesCreate = (parametertypePk, data, params = {}) => this.request({\n path: `/api/v1/types/${parametertypePk}/rules/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesRulesRetrieve\n * @request GET:/api/v1/types/{parametertype_pk}/rules/{id}/\n * @secure\n * @response `200` `ParameterTypeRule`\n */\n this.typesRulesRetrieve = (id, parametertypePk, params = {}) => this.request({\n path: `/api/v1/types/${parametertypePk}/rules/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesRulesUpdate\n * @request PUT:/api/v1/types/{parametertype_pk}/rules/{id}/\n * @secure\n * @response `200` `ParameterTypeRule`\n */\n this.typesRulesUpdate = (id, parametertypePk, data, params = {}) => this.request({\n path: `/api/v1/types/${parametertypePk}/rules/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesRulesPartialUpdate\n * @request PATCH:/api/v1/types/{parametertype_pk}/rules/{id}/\n * @secure\n * @response `200` `ParameterTypeRule`\n */\n this.typesRulesPartialUpdate = (id, parametertypePk, data, params = {}) => this.request({\n path: `/api/v1/types/${parametertypePk}/rules/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesRulesDestroy\n * @request DELETE:/api/v1/types/{parametertype_pk}/rules/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.typesRulesDestroy = (id, parametertypePk, params = {}) => this.request({\n path: `/api/v1/types/${parametertypePk}/rules/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesRetrieve\n * @request GET:/api/v1/types/{id}/\n * @secure\n * @response `200` `ParameterType`\n */\n this.typesRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/types/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesUpdate\n * @request PUT:/api/v1/types/{id}/\n * @secure\n * @response `200` `ParameterType`\n */\n this.typesUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/types/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesPartialUpdate\n * @request PATCH:/api/v1/types/{id}/\n * @secure\n * @response `200` `ParameterType`\n */\n this.typesPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/types/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesDestroy\n * @request DELETE:/api/v1/types/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.typesDestroy = (id, params = {}) => this.request({\n path: `/api/v1/types/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags users\n * @name UsersList\n * @request GET:/api/v1/users/\n * @secure\n * @response `200` `PaginatedUserList`\n */\n this.usersList = (query, params = {}) => this.request({\n path: `/api/v1/users/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags users\n * @name UsersRetrieve\n * @request GET:/api/v1/users/{id}/\n * @secure\n * @response `200` `User`\n */\n this.usersRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/users/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description ### Description ### Delete the specified user. This removes all access the User may have to any Organization. ### Pre-Conditions ### - The user cannot be the only owner of any Organization. - The bearer token must belong to the user being deleted. - All of the memberships related to the User will be deleted, so all the membership deletion pre-conditions must also be met.\n *\n * @tags users\n * @name UsersDestroy\n * @summary Delete the specified user.\n * @request DELETE:/api/v1/users/{id}/\n * @secure\n * @response `204` `void` User deleted. The client should behave as if the user logged out.\n * @response `400` `void` Bad Request - Is the user the only owner of any organization? - Were all required fields provided?\n * @response `403` `void` Forbidden - Did the Bearer token belong to the User being deleted?\n */\n this.usersDestroy = (id, params = {}) => this.request({\n path: `/api/v1/users/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Get user information about the current user.\n *\n * @tags users\n * @name UsersCurrentRetrieve\n * @summary Current user information\n * @request GET:/api/v1/users/current/\n * @secure\n * @response `200` `User` User information\n */\n this.usersCurrentRetrieve = (params = {}) => this.request({\n path: `/api/v1/users/current/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Endpoint for accessing utility functions\n *\n * @tags utils\n * @name UtilsGeneratePasswordCreate\n * @summary Get a randomly generated password using AWS Secrets Manager, with fallback to /dev/urandom.\n * @request POST:/api/v1/utils/generate_password/\n * @secure\n * @response `201` `GeneratedPasswordResponse`\n */\n this.utilsGeneratePasswordCreate = (query, params = {}) => this.request({\n path: `/api/v1/utils/generate_password/`,\n method: 'POST',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n }\n}\nexports.Api = Api;\n","\"use strict\";\n/* eslint-disable */\n/* tslint:disable */\n/*\n * ---------------------------------------------------------------\n * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ##\n * ## ##\n * ## AUTHOR: acacode ##\n * ## SOURCE: https://github.com/acacode/swagger-typescript-api ##\n * ---------------------------------------------------------------\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpClient = exports.ContentType = void 0;\nvar ContentType;\n(function (ContentType) {\n ContentType[\"Json\"] = \"application/json\";\n ContentType[\"FormData\"] = \"multipart/form-data\";\n ContentType[\"UrlEncoded\"] = \"application/x-www-form-urlencoded\";\n})(ContentType = exports.ContentType || (exports.ContentType = {}));\nclass HttpClient {\n constructor(apiConfig = {}) {\n this.baseUrl = '';\n this.securityData = null;\n this.abortControllers = new Map();\n this.customFetch = (...fetchParams) => fetch(...fetchParams);\n this.baseApiParams = {\n credentials: 'same-origin',\n headers: {},\n redirect: 'follow',\n referrerPolicy: 'no-referrer'\n };\n this.setSecurityData = (data) => {\n this.securityData = data;\n };\n this.contentFormatters = {\n [ContentType.Json]: (input) => input !== null && (typeof input === 'object' || typeof input === 'string') ? JSON.stringify(input) : input,\n [ContentType.FormData]: (input) => Object.keys(input || {}).reduce((formData, key) => {\n const property = input[key];\n formData.append(key, property instanceof Blob\n ? property\n : typeof property === 'object' && property !== null\n ? JSON.stringify(property)\n : `${property}`);\n return formData;\n }, new FormData()),\n [ContentType.UrlEncoded]: (input) => this.toQueryString(input)\n };\n this.createAbortSignal = (cancelToken) => {\n if (this.abortControllers.has(cancelToken)) {\n const abortController = this.abortControllers.get(cancelToken);\n if (abortController) {\n return abortController.signal;\n }\n return void 0;\n }\n const abortController = new AbortController();\n this.abortControllers.set(cancelToken, abortController);\n return abortController.signal;\n };\n this.abortRequest = (cancelToken) => {\n const abortController = this.abortControllers.get(cancelToken);\n if (abortController) {\n abortController.abort();\n this.abortControllers.delete(cancelToken);\n }\n };\n this.request = async ({ body, secure, path, type, query, format, baseUrl, cancelToken, ...params }) => {\n const secureParams = ((typeof secure === 'boolean' ? secure : this.baseApiParams.secure) &&\n this.securityWorker &&\n (await this.securityWorker(this.securityData))) ||\n {};\n const requestParams = this.mergeRequestParams(params, secureParams);\n const queryString = query && this.toQueryString(query);\n const payloadFormatter = this.contentFormatters[type || ContentType.Json];\n const responseFormat = format || requestParams.format;\n return this.customFetch(`${baseUrl || this.baseUrl || ''}${path}${queryString ? `?${queryString}` : ''}`, {\n ...requestParams,\n headers: {\n ...(type && type !== ContentType.FormData ? { 'Content-Type': type } : {}),\n ...(requestParams.headers || {})\n },\n signal: cancelToken ? this.createAbortSignal(cancelToken) : void 0,\n body: typeof body === 'undefined' || body === null ? null : payloadFormatter(body)\n }).then(async (response) => {\n const r = response;\n r.data = null;\n r.error = null;\n const data = !responseFormat\n ? r\n : await response[responseFormat]()\n .then(data => {\n if (r.ok) {\n r.data = data;\n }\n else {\n r.error = data;\n }\n return r;\n })\n .catch(e => {\n r.error = e;\n return r;\n });\n if (cancelToken) {\n this.abortControllers.delete(cancelToken);\n }\n if (!response.ok)\n throw data;\n return data;\n });\n };\n Object.assign(this, apiConfig);\n }\n encodeQueryParam(key, value) {\n const encodedKey = encodeURIComponent(key);\n return `${encodedKey}=${encodeURIComponent(typeof value === 'number' ? value : `${value}`)}`;\n }\n addQueryParam(query, key) {\n return this.encodeQueryParam(key, query[key]);\n }\n addArrayQueryParam(query, key) {\n const value = query[key];\n return value.map((v) => this.encodeQueryParam(key, v)).join('&');\n }\n toQueryString(rawQuery) {\n const query = rawQuery || {};\n const keys = Object.keys(query).filter(key => 'undefined' !== typeof query[key]);\n return keys\n .map(key => (Array.isArray(query[key]) ? this.addArrayQueryParam(query, key) : this.addQueryParam(query, key)))\n .join('&');\n }\n addQueryParams(rawQuery) {\n const queryString = this.toQueryString(rawQuery);\n return queryString ? `?${queryString}` : '';\n }\n mergeRequestParams(params1, params2) {\n return {\n ...this.baseApiParams,\n ...params1,\n ...(params2 || {}),\n headers: {\n ...(this.baseApiParams.headers || {}),\n ...(params1.headers || {}),\n ...((params2 && params2.headers) || {})\n }\n };\n }\n}\nexports.HttpClient = HttpClient;\n","\"use strict\";\n//\n// Copyright (C) 2021 CloudTruth, Inc.\n//\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.run = exports.api = exports.configurefetch = void 0;\nconst core = __importStar(require(\"@actions/core\"));\nconst Api_1 = require(\"./gen/Api\");\nconst version_1 = require(\"./version\");\nconst uuid_1 = require(\"uuid\");\nconst isomorphic_fetch_1 = __importDefault(require(\"isomorphic-fetch\"));\nconst USER_AGENT = `configure-action/${version_1.LIB_VERSION}`;\nconst configurefetch = (url, \n/* istanbul ignore next */\n{ headers, ...options } = {}) => {\n return (0, isomorphic_fetch_1.default)(url, {\n headers: {\n 'User-Agent': USER_AGENT,\n ...headers\n },\n ...options\n });\n};\nexports.configurefetch = configurefetch;\nfunction api() {\n const api = new Api_1.Api({\n baseUrl: core.getInput('server') || 'https://api.cloudtruth.io',\n customFetch: exports.configurefetch,\n securityWorker: (securityData) => {\n return {\n headers: {\n ['Authorization']: 'Api-Key ' + securityData.apikey\n },\n keepalive: true\n };\n }\n });\n api.setSecurityData({ apikey: core.getInput('apikey') });\n return api;\n}\nexports.api = api;\nfunction inject(response) {\n const overwrite = core.getInput('overwrite') || false;\n for (const entry of response.data.results) {\n const values = Object.values(entry.values);\n const valueRecord = values[0];\n const effectiveValue = valueRecord?.value;\n const isSecret = entry.secret;\n const parameterName = entry.name;\n if (effectiveValue != null) {\n if (parameterName in process.env && !overwrite) {\n throw new Error(`The environment variable \"${parameterName}\" already exists and cannot be overwritten.`);\n }\n if (isSecret) {\n core.info(`Declaring \"${parameterName}\" as a secret.`);\n core.setSecret(effectiveValue);\n }\n core.info(`Setting environment variable \"${parameterName}\"`);\n core.exportVariable(parameterName, effectiveValue);\n }\n else {\n core.warning(`Ignoring unset value for parameter \"${parameterName}\" (GitHub Actions does not support unsetting).`);\n }\n }\n}\nasync function resolve_project_id(project_name_or_id, api) {\n if ((0, uuid_1.validate)(project_name_or_id)) {\n // we look it up to make sure the id is good and we have permission to use it\n try {\n const response = await api.projectsRetrieve(project_name_or_id);\n return response.data.id;\n }\n catch (error) {\n throw new Error(`Project \"${project_name_or_id}\": ${error.error.detail}`);\n }\n }\n const response = await api.projectsList({ name: project_name_or_id });\n if (response.data.count == 1) {\n const result = response.data.results;\n return result[0].id;\n }\n throw new Error(`Project \"${project_name_or_id}\": Not found.`);\n}\nasync function run() {\n try {\n const client = api();\n const project_id = await resolve_project_id(core.getInput('project', { required: true }), client);\n const environment = core.getInput('environment', { required: true });\n const tag = core.getInput('tag') || undefined;\n for (let page = 1;; ++page) {\n core.debug(`Requesting parameter values for project='${project_id}' environment='${environment}' tag='${tag}' page=${page}`);\n let page_size = undefined;\n if (process.env.TESTING_REST_API_PAGE_SIZE) {\n page_size = parseInt(process.env.TESTING_REST_API_PAGE_SIZE);\n }\n const response = await client.projectsParametersList({\n projectPk: project_id,\n environment: environment,\n tag: tag,\n page: page,\n page_size: page_size\n });\n inject(response);\n if (response.data.next == null) {\n if (page == 1 && response.data.count == 0) {\n core.warning(`Project ${core.getInput('project')} has no parameters.`);\n }\n break;\n }\n }\n }\n catch (error) {\n core.setFailed(error.message || error.error.detail);\n }\n}\nexports.run = run;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LIB_VERSION = void 0;\nexports.LIB_VERSION = \"2.2.0\";\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.issue = exports.issueCommand = void 0;\nconst os = __importStar(require(\"os\"));\nconst utils_1 = require(\"./utils\");\n/**\n * Commands\n *\n * Command Format:\n * ::name key=value,key=value::message\n *\n * Examples:\n * ::warning::This is the message\n * ::set-env name=MY_VAR::some value\n */\nfunction issueCommand(command, properties, message) {\n const cmd = new Command(command, properties, message);\n process.stdout.write(cmd.toString() + os.EOL);\n}\nexports.issueCommand = issueCommand;\nfunction issue(name, message = '') {\n issueCommand(name, {}, message);\n}\nexports.issue = issue;\nconst CMD_STRING = '::';\nclass Command {\n constructor(command, properties, message) {\n if (!command) {\n command = 'missing.command';\n }\n this.command = command;\n this.properties = properties;\n this.message = message;\n }\n toString() {\n let cmdStr = CMD_STRING + this.command;\n if (this.properties && Object.keys(this.properties).length > 0) {\n cmdStr += ' ';\n let first = true;\n for (const key in this.properties) {\n if (this.properties.hasOwnProperty(key)) {\n const val = this.properties[key];\n if (val) {\n if (first) {\n first = false;\n }\n else {\n cmdStr += ',';\n }\n cmdStr += `${key}=${escapeProperty(val)}`;\n }\n }\n }\n }\n cmdStr += `${CMD_STRING}${escapeData(this.message)}`;\n return cmdStr;\n }\n}\nfunction escapeData(s) {\n return utils_1.toCommandValue(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A');\n}\nfunction escapeProperty(s) {\n return utils_1.toCommandValue(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A')\n .replace(/:/g, '%3A')\n .replace(/,/g, '%2C');\n}\n//# sourceMappingURL=command.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0;\nconst command_1 = require(\"./command\");\nconst file_command_1 = require(\"./file-command\");\nconst utils_1 = require(\"./utils\");\nconst os = __importStar(require(\"os\"));\nconst path = __importStar(require(\"path\"));\nconst oidc_utils_1 = require(\"./oidc-utils\");\n/**\n * The code to exit an action\n */\nvar ExitCode;\n(function (ExitCode) {\n /**\n * A code indicating that the action was successful\n */\n ExitCode[ExitCode[\"Success\"] = 0] = \"Success\";\n /**\n * A code indicating that the action was a failure\n */\n ExitCode[ExitCode[\"Failure\"] = 1] = \"Failure\";\n})(ExitCode = exports.ExitCode || (exports.ExitCode = {}));\n//-----------------------------------------------------------------------\n// Variables\n//-----------------------------------------------------------------------\n/**\n * Sets env variable for this action and future actions in the job\n * @param name the name of the variable to set\n * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction exportVariable(name, val) {\n const convertedVal = utils_1.toCommandValue(val);\n process.env[name] = convertedVal;\n const filePath = process.env['GITHUB_ENV'] || '';\n if (filePath) {\n const delimiter = '_GitHubActionsFileCommandDelimeter_';\n const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;\n file_command_1.issueCommand('ENV', commandValue);\n }\n else {\n command_1.issueCommand('set-env', { name }, convertedVal);\n }\n}\nexports.exportVariable = exportVariable;\n/**\n * Registers a secret which will get masked from logs\n * @param secret value of the secret\n */\nfunction setSecret(secret) {\n command_1.issueCommand('add-mask', {}, secret);\n}\nexports.setSecret = setSecret;\n/**\n * Prepends inputPath to the PATH (for this action and future actions)\n * @param inputPath\n */\nfunction addPath(inputPath) {\n const filePath = process.env['GITHUB_PATH'] || '';\n if (filePath) {\n file_command_1.issueCommand('PATH', inputPath);\n }\n else {\n command_1.issueCommand('add-path', {}, inputPath);\n }\n process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;\n}\nexports.addPath = addPath;\n/**\n * Gets the value of an input.\n * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed.\n * Returns an empty string if the value is not defined.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string\n */\nfunction getInput(name, options) {\n const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';\n if (options && options.required && !val) {\n throw new Error(`Input required and not supplied: ${name}`);\n }\n if (options && options.trimWhitespace === false) {\n return val;\n }\n return val.trim();\n}\nexports.getInput = getInput;\n/**\n * Gets the values of an multiline input. Each value is also trimmed.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string[]\n *\n */\nfunction getMultilineInput(name, options) {\n const inputs = getInput(name, options)\n .split('\\n')\n .filter(x => x !== '');\n return inputs;\n}\nexports.getMultilineInput = getMultilineInput;\n/**\n * Gets the input value of the boolean type in the YAML 1.2 \"core schema\" specification.\n * Support boolean input list: `true | True | TRUE | false | False | FALSE` .\n * The return value is also in boolean type.\n * ref: https://yaml.org/spec/1.2/spec.html#id2804923\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns boolean\n */\nfunction getBooleanInput(name, options) {\n const trueValue = ['true', 'True', 'TRUE'];\n const falseValue = ['false', 'False', 'FALSE'];\n const val = getInput(name, options);\n if (trueValue.includes(val))\n return true;\n if (falseValue.includes(val))\n return false;\n throw new TypeError(`Input does not meet YAML 1.2 \"Core Schema\" specification: ${name}\\n` +\n `Support boolean input list: \\`true | True | TRUE | false | False | FALSE\\``);\n}\nexports.getBooleanInput = getBooleanInput;\n/**\n * Sets the value of an output.\n *\n * @param name name of the output to set\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction setOutput(name, value) {\n process.stdout.write(os.EOL);\n command_1.issueCommand('set-output', { name }, value);\n}\nexports.setOutput = setOutput;\n/**\n * Enables or disables the echoing of commands into stdout for the rest of the step.\n * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set.\n *\n */\nfunction setCommandEcho(enabled) {\n command_1.issue('echo', enabled ? 'on' : 'off');\n}\nexports.setCommandEcho = setCommandEcho;\n//-----------------------------------------------------------------------\n// Results\n//-----------------------------------------------------------------------\n/**\n * Sets the action status to failed.\n * When the action exits it will be with an exit code of 1\n * @param message add error issue message\n */\nfunction setFailed(message) {\n process.exitCode = ExitCode.Failure;\n error(message);\n}\nexports.setFailed = setFailed;\n//-----------------------------------------------------------------------\n// Logging Commands\n//-----------------------------------------------------------------------\n/**\n * Gets whether Actions Step Debug is on or not\n */\nfunction isDebug() {\n return process.env['RUNNER_DEBUG'] === '1';\n}\nexports.isDebug = isDebug;\n/**\n * Writes debug message to user log\n * @param message debug message\n */\nfunction debug(message) {\n command_1.issueCommand('debug', {}, message);\n}\nexports.debug = debug;\n/**\n * Adds an error issue\n * @param message error issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction error(message, properties = {}) {\n command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.error = error;\n/**\n * Adds a warning issue\n * @param message warning issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction warning(message, properties = {}) {\n command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.warning = warning;\n/**\n * Adds a notice issue\n * @param message notice issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction notice(message, properties = {}) {\n command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.notice = notice;\n/**\n * Writes info to log with console.log.\n * @param message info message\n */\nfunction info(message) {\n process.stdout.write(message + os.EOL);\n}\nexports.info = info;\n/**\n * Begin an output group.\n *\n * Output until the next `groupEnd` will be foldable in this group\n *\n * @param name The name of the output group\n */\nfunction startGroup(name) {\n command_1.issue('group', name);\n}\nexports.startGroup = startGroup;\n/**\n * End an output group.\n */\nfunction endGroup() {\n command_1.issue('endgroup');\n}\nexports.endGroup = endGroup;\n/**\n * Wrap an asynchronous function call in a group.\n *\n * Returns the same type as the function itself.\n *\n * @param name The name of the group\n * @param fn The function to wrap in the group\n */\nfunction group(name, fn) {\n return __awaiter(this, void 0, void 0, function* () {\n startGroup(name);\n let result;\n try {\n result = yield fn();\n }\n finally {\n endGroup();\n }\n return result;\n });\n}\nexports.group = group;\n//-----------------------------------------------------------------------\n// Wrapper action state\n//-----------------------------------------------------------------------\n/**\n * Saves state for current action, the state can only be retrieved by this action's post job execution.\n *\n * @param name name of the state to store\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction saveState(name, value) {\n command_1.issueCommand('save-state', { name }, value);\n}\nexports.saveState = saveState;\n/**\n * Gets the value of an state set by this action's main execution.\n *\n * @param name name of the state to get\n * @returns string\n */\nfunction getState(name) {\n return process.env[`STATE_${name}`] || '';\n}\nexports.getState = getState;\nfunction getIDToken(aud) {\n return __awaiter(this, void 0, void 0, function* () {\n return yield oidc_utils_1.OidcClient.getIDToken(aud);\n });\n}\nexports.getIDToken = getIDToken;\n//# sourceMappingURL=core.js.map","\"use strict\";\n// For internal use, subject to change.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.issueCommand = void 0;\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst fs = __importStar(require(\"fs\"));\nconst os = __importStar(require(\"os\"));\nconst utils_1 = require(\"./utils\");\nfunction issueCommand(command, message) {\n const filePath = process.env[`GITHUB_${command}`];\n if (!filePath) {\n throw new Error(`Unable to find environment variable for file command ${command}`);\n }\n if (!fs.existsSync(filePath)) {\n throw new Error(`Missing file at path: ${filePath}`);\n }\n fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, {\n encoding: 'utf8'\n });\n}\nexports.issueCommand = issueCommand;\n//# sourceMappingURL=file-command.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OidcClient = void 0;\nconst http_client_1 = require(\"@actions/http-client\");\nconst auth_1 = require(\"@actions/http-client/auth\");\nconst core_1 = require(\"./core\");\nclass OidcClient {\n static createHttpClient(allowRetry = true, maxRetry = 10) {\n const requestOptions = {\n allowRetries: allowRetry,\n maxRetries: maxRetry\n };\n return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions);\n }\n static getRequestToken() {\n const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN'];\n if (!token) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable');\n }\n return token;\n }\n static getIDTokenUrl() {\n const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL'];\n if (!runtimeUrl) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable');\n }\n return runtimeUrl;\n }\n static getCall(id_token_url) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const httpclient = OidcClient.createHttpClient();\n const res = yield httpclient\n .getJson(id_token_url)\n .catch(error => {\n throw new Error(`Failed to get ID Token. \\n \n Error Code : ${error.statusCode}\\n \n Error Message: ${error.result.message}`);\n });\n const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value;\n if (!id_token) {\n throw new Error('Response json body do not have ID Token field');\n }\n return id_token;\n });\n }\n static getIDToken(audience) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n // New ID Token is requested from action service\n let id_token_url = OidcClient.getIDTokenUrl();\n if (audience) {\n const encodedAudience = encodeURIComponent(audience);\n id_token_url = `${id_token_url}&audience=${encodedAudience}`;\n }\n core_1.debug(`ID token url is ${id_token_url}`);\n const id_token = yield OidcClient.getCall(id_token_url);\n core_1.setSecret(id_token);\n return id_token;\n }\n catch (error) {\n throw new Error(`Error message: ${error.message}`);\n }\n });\n }\n}\nexports.OidcClient = OidcClient;\n//# sourceMappingURL=oidc-utils.js.map","\"use strict\";\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toCommandProperties = exports.toCommandValue = void 0;\n/**\n * Sanitizes an input into a string so it can be passed into issueCommand safely\n * @param input input to sanitize into a string\n */\nfunction toCommandValue(input) {\n if (input === null || input === undefined) {\n return '';\n }\n else if (typeof input === 'string' || input instanceof String) {\n return input;\n }\n return JSON.stringify(input);\n}\nexports.toCommandValue = toCommandValue;\n/**\n *\n * @param annotationProperties\n * @returns The command properties to send with the actual annotation command\n * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646\n */\nfunction toCommandProperties(annotationProperties) {\n if (!Object.keys(annotationProperties).length) {\n return {};\n }\n return {\n title: annotationProperties.title,\n file: annotationProperties.file,\n line: annotationProperties.startLine,\n endLine: annotationProperties.endLine,\n col: annotationProperties.startColumn,\n endColumn: annotationProperties.endColumn\n };\n}\nexports.toCommandProperties = toCommandProperties;\n//# sourceMappingURL=utils.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass BasicCredentialHandler {\n constructor(username, password) {\n this.username = username;\n this.password = password;\n }\n prepareRequest(options) {\n options.headers['Authorization'] =\n 'Basic ' +\n Buffer.from(this.username + ':' + this.password).toString('base64');\n }\n // This handler cannot handle 401\n canHandleAuthentication(response) {\n return false;\n }\n handleAuthentication(httpClient, requestInfo, objs) {\n return null;\n }\n}\nexports.BasicCredentialHandler = BasicCredentialHandler;\nclass BearerCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n options.headers['Authorization'] = 'Bearer ' + this.token;\n }\n // This handler cannot handle 401\n canHandleAuthentication(response) {\n return false;\n }\n handleAuthentication(httpClient, requestInfo, objs) {\n return null;\n }\n}\nexports.BearerCredentialHandler = BearerCredentialHandler;\nclass PersonalAccessTokenCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n options.headers['Authorization'] =\n 'Basic ' + Buffer.from('PAT:' + this.token).toString('base64');\n }\n // This handler cannot handle 401\n canHandleAuthentication(response) {\n return false;\n }\n handleAuthentication(httpClient, requestInfo, objs) {\n return null;\n }\n}\nexports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst http = require(\"http\");\nconst https = require(\"https\");\nconst pm = require(\"./proxy\");\nlet tunnel;\nvar HttpCodes;\n(function (HttpCodes) {\n HttpCodes[HttpCodes[\"OK\"] = 200] = \"OK\";\n HttpCodes[HttpCodes[\"MultipleChoices\"] = 300] = \"MultipleChoices\";\n HttpCodes[HttpCodes[\"MovedPermanently\"] = 301] = \"MovedPermanently\";\n HttpCodes[HttpCodes[\"ResourceMoved\"] = 302] = \"ResourceMoved\";\n HttpCodes[HttpCodes[\"SeeOther\"] = 303] = \"SeeOther\";\n HttpCodes[HttpCodes[\"NotModified\"] = 304] = \"NotModified\";\n HttpCodes[HttpCodes[\"UseProxy\"] = 305] = \"UseProxy\";\n HttpCodes[HttpCodes[\"SwitchProxy\"] = 306] = \"SwitchProxy\";\n HttpCodes[HttpCodes[\"TemporaryRedirect\"] = 307] = \"TemporaryRedirect\";\n HttpCodes[HttpCodes[\"PermanentRedirect\"] = 308] = \"PermanentRedirect\";\n HttpCodes[HttpCodes[\"BadRequest\"] = 400] = \"BadRequest\";\n HttpCodes[HttpCodes[\"Unauthorized\"] = 401] = \"Unauthorized\";\n HttpCodes[HttpCodes[\"PaymentRequired\"] = 402] = \"PaymentRequired\";\n HttpCodes[HttpCodes[\"Forbidden\"] = 403] = \"Forbidden\";\n HttpCodes[HttpCodes[\"NotFound\"] = 404] = \"NotFound\";\n HttpCodes[HttpCodes[\"MethodNotAllowed\"] = 405] = \"MethodNotAllowed\";\n HttpCodes[HttpCodes[\"NotAcceptable\"] = 406] = \"NotAcceptable\";\n HttpCodes[HttpCodes[\"ProxyAuthenticationRequired\"] = 407] = \"ProxyAuthenticationRequired\";\n HttpCodes[HttpCodes[\"RequestTimeout\"] = 408] = \"RequestTimeout\";\n HttpCodes[HttpCodes[\"Conflict\"] = 409] = \"Conflict\";\n HttpCodes[HttpCodes[\"Gone\"] = 410] = \"Gone\";\n HttpCodes[HttpCodes[\"TooManyRequests\"] = 429] = \"TooManyRequests\";\n HttpCodes[HttpCodes[\"InternalServerError\"] = 500] = \"InternalServerError\";\n HttpCodes[HttpCodes[\"NotImplemented\"] = 501] = \"NotImplemented\";\n HttpCodes[HttpCodes[\"BadGateway\"] = 502] = \"BadGateway\";\n HttpCodes[HttpCodes[\"ServiceUnavailable\"] = 503] = \"ServiceUnavailable\";\n HttpCodes[HttpCodes[\"GatewayTimeout\"] = 504] = \"GatewayTimeout\";\n})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {}));\nvar Headers;\n(function (Headers) {\n Headers[\"Accept\"] = \"accept\";\n Headers[\"ContentType\"] = \"content-type\";\n})(Headers = exports.Headers || (exports.Headers = {}));\nvar MediaTypes;\n(function (MediaTypes) {\n MediaTypes[\"ApplicationJson\"] = \"application/json\";\n})(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {}));\n/**\n * Returns the proxy URL, depending upon the supplied url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\nfunction getProxyUrl(serverUrl) {\n let proxyUrl = pm.getProxyUrl(new URL(serverUrl));\n return proxyUrl ? proxyUrl.href : '';\n}\nexports.getProxyUrl = getProxyUrl;\nconst HttpRedirectCodes = [\n HttpCodes.MovedPermanently,\n HttpCodes.ResourceMoved,\n HttpCodes.SeeOther,\n HttpCodes.TemporaryRedirect,\n HttpCodes.PermanentRedirect\n];\nconst HttpResponseRetryCodes = [\n HttpCodes.BadGateway,\n HttpCodes.ServiceUnavailable,\n HttpCodes.GatewayTimeout\n];\nconst RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD'];\nconst ExponentialBackoffCeiling = 10;\nconst ExponentialBackoffTimeSlice = 5;\nclass HttpClientError extends Error {\n constructor(message, statusCode) {\n super(message);\n this.name = 'HttpClientError';\n this.statusCode = statusCode;\n Object.setPrototypeOf(this, HttpClientError.prototype);\n }\n}\nexports.HttpClientError = HttpClientError;\nclass HttpClientResponse {\n constructor(message) {\n this.message = message;\n }\n readBody() {\n return new Promise(async (resolve, reject) => {\n let output = Buffer.alloc(0);\n this.message.on('data', (chunk) => {\n output = Buffer.concat([output, chunk]);\n });\n this.message.on('end', () => {\n resolve(output.toString());\n });\n });\n }\n}\nexports.HttpClientResponse = HttpClientResponse;\nfunction isHttps(requestUrl) {\n let parsedUrl = new URL(requestUrl);\n return parsedUrl.protocol === 'https:';\n}\nexports.isHttps = isHttps;\nclass HttpClient {\n constructor(userAgent, handlers, requestOptions) {\n this._ignoreSslError = false;\n this._allowRedirects = true;\n this._allowRedirectDowngrade = false;\n this._maxRedirects = 50;\n this._allowRetries = false;\n this._maxRetries = 1;\n this._keepAlive = false;\n this._disposed = false;\n this.userAgent = userAgent;\n this.handlers = handlers || [];\n this.requestOptions = requestOptions;\n if (requestOptions) {\n if (requestOptions.ignoreSslError != null) {\n this._ignoreSslError = requestOptions.ignoreSslError;\n }\n this._socketTimeout = requestOptions.socketTimeout;\n if (requestOptions.allowRedirects != null) {\n this._allowRedirects = requestOptions.allowRedirects;\n }\n if (requestOptions.allowRedirectDowngrade != null) {\n this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade;\n }\n if (requestOptions.maxRedirects != null) {\n this._maxRedirects = Math.max(requestOptions.maxRedirects, 0);\n }\n if (requestOptions.keepAlive != null) {\n this._keepAlive = requestOptions.keepAlive;\n }\n if (requestOptions.allowRetries != null) {\n this._allowRetries = requestOptions.allowRetries;\n }\n if (requestOptions.maxRetries != null) {\n this._maxRetries = requestOptions.maxRetries;\n }\n }\n }\n options(requestUrl, additionalHeaders) {\n return this.request('OPTIONS', requestUrl, null, additionalHeaders || {});\n }\n get(requestUrl, additionalHeaders) {\n return this.request('GET', requestUrl, null, additionalHeaders || {});\n }\n del(requestUrl, additionalHeaders) {\n return this.request('DELETE', requestUrl, null, additionalHeaders || {});\n }\n post(requestUrl, data, additionalHeaders) {\n return this.request('POST', requestUrl, data, additionalHeaders || {});\n }\n patch(requestUrl, data, additionalHeaders) {\n return this.request('PATCH', requestUrl, data, additionalHeaders || {});\n }\n put(requestUrl, data, additionalHeaders) {\n return this.request('PUT', requestUrl, data, additionalHeaders || {});\n }\n head(requestUrl, additionalHeaders) {\n return this.request('HEAD', requestUrl, null, additionalHeaders || {});\n }\n sendStream(verb, requestUrl, stream, additionalHeaders) {\n return this.request(verb, requestUrl, stream, additionalHeaders);\n }\n /**\n * Gets a typed object from an endpoint\n * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise\n */\n async getJson(requestUrl, additionalHeaders = {}) {\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n let res = await this.get(requestUrl, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n }\n async postJson(requestUrl, obj, additionalHeaders = {}) {\n let data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n let res = await this.post(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n }\n async putJson(requestUrl, obj, additionalHeaders = {}) {\n let data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n let res = await this.put(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n }\n async patchJson(requestUrl, obj, additionalHeaders = {}) {\n let data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n let res = await this.patch(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n }\n /**\n * Makes a raw http request.\n * All other methods such as get, post, patch, and request ultimately call this.\n * Prefer get, del, post and patch\n */\n async request(verb, requestUrl, data, headers) {\n if (this._disposed) {\n throw new Error('Client has already been disposed.');\n }\n let parsedUrl = new URL(requestUrl);\n let info = this._prepareRequest(verb, parsedUrl, headers);\n // Only perform retries on reads since writes may not be idempotent.\n let maxTries = this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1\n ? this._maxRetries + 1\n : 1;\n let numTries = 0;\n let response;\n while (numTries < maxTries) {\n response = await this.requestRaw(info, data);\n // Check if it's an authentication challenge\n if (response &&\n response.message &&\n response.message.statusCode === HttpCodes.Unauthorized) {\n let authenticationHandler;\n for (let i = 0; i < this.handlers.length; i++) {\n if (this.handlers[i].canHandleAuthentication(response)) {\n authenticationHandler = this.handlers[i];\n break;\n }\n }\n if (authenticationHandler) {\n return authenticationHandler.handleAuthentication(this, info, data);\n }\n else {\n // We have received an unauthorized response but have no handlers to handle it.\n // Let the response return to the caller.\n return response;\n }\n }\n let redirectsRemaining = this._maxRedirects;\n while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1 &&\n this._allowRedirects &&\n redirectsRemaining > 0) {\n const redirectUrl = response.message.headers['location'];\n if (!redirectUrl) {\n // if there's no location to redirect to, we won't\n break;\n }\n let parsedRedirectUrl = new URL(redirectUrl);\n if (parsedUrl.protocol == 'https:' &&\n parsedUrl.protocol != parsedRedirectUrl.protocol &&\n !this._allowRedirectDowngrade) {\n throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.');\n }\n // we need to finish reading the response before reassigning response\n // which will leak the open socket.\n await response.readBody();\n // strip authorization header if redirected to a different hostname\n if (parsedRedirectUrl.hostname !== parsedUrl.hostname) {\n for (let header in headers) {\n // header names are case insensitive\n if (header.toLowerCase() === 'authorization') {\n delete headers[header];\n }\n }\n }\n // let's make the request with the new redirectUrl\n info = this._prepareRequest(verb, parsedRedirectUrl, headers);\n response = await this.requestRaw(info, data);\n redirectsRemaining--;\n }\n if (HttpResponseRetryCodes.indexOf(response.message.statusCode) == -1) {\n // If not a retry code, return immediately instead of retrying\n return response;\n }\n numTries += 1;\n if (numTries < maxTries) {\n await response.readBody();\n await this._performExponentialBackoff(numTries);\n }\n }\n return response;\n }\n /**\n * Needs to be called if keepAlive is set to true in request options.\n */\n dispose() {\n if (this._agent) {\n this._agent.destroy();\n }\n this._disposed = true;\n }\n /**\n * Raw request.\n * @param info\n * @param data\n */\n requestRaw(info, data) {\n return new Promise((resolve, reject) => {\n let callbackForResult = function (err, res) {\n if (err) {\n reject(err);\n }\n resolve(res);\n };\n this.requestRawWithCallback(info, data, callbackForResult);\n });\n }\n /**\n * Raw request with callback.\n * @param info\n * @param data\n * @param onResult\n */\n requestRawWithCallback(info, data, onResult) {\n let socket;\n if (typeof data === 'string') {\n info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8');\n }\n let callbackCalled = false;\n let handleResult = (err, res) => {\n if (!callbackCalled) {\n callbackCalled = true;\n onResult(err, res);\n }\n };\n let req = info.httpModule.request(info.options, (msg) => {\n let res = new HttpClientResponse(msg);\n handleResult(null, res);\n });\n req.on('socket', sock => {\n socket = sock;\n });\n // If we ever get disconnected, we want the socket to timeout eventually\n req.setTimeout(this._socketTimeout || 3 * 60000, () => {\n if (socket) {\n socket.end();\n }\n handleResult(new Error('Request timeout: ' + info.options.path), null);\n });\n req.on('error', function (err) {\n // err has statusCode property\n // res should have headers\n handleResult(err, null);\n });\n if (data && typeof data === 'string') {\n req.write(data, 'utf8');\n }\n if (data && typeof data !== 'string') {\n data.on('close', function () {\n req.end();\n });\n data.pipe(req);\n }\n else {\n req.end();\n }\n }\n /**\n * Gets an http agent. This function is useful when you need an http agent that handles\n * routing through a proxy server - depending upon the url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\n getAgent(serverUrl) {\n let parsedUrl = new URL(serverUrl);\n return this._getAgent(parsedUrl);\n }\n _prepareRequest(method, requestUrl, headers) {\n const info = {};\n info.parsedUrl = requestUrl;\n const usingSsl = info.parsedUrl.protocol === 'https:';\n info.httpModule = usingSsl ? https : http;\n const defaultPort = usingSsl ? 443 : 80;\n info.options = {};\n info.options.host = info.parsedUrl.hostname;\n info.options.port = info.parsedUrl.port\n ? parseInt(info.parsedUrl.port)\n : defaultPort;\n info.options.path =\n (info.parsedUrl.pathname || '') + (info.parsedUrl.search || '');\n info.options.method = method;\n info.options.headers = this._mergeHeaders(headers);\n if (this.userAgent != null) {\n info.options.headers['user-agent'] = this.userAgent;\n }\n info.options.agent = this._getAgent(info.parsedUrl);\n // gives handlers an opportunity to participate\n if (this.handlers) {\n this.handlers.forEach(handler => {\n handler.prepareRequest(info.options);\n });\n }\n return info;\n }\n _mergeHeaders(headers) {\n const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});\n if (this.requestOptions && this.requestOptions.headers) {\n return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers));\n }\n return lowercaseKeys(headers || {});\n }\n _getExistingOrDefaultHeader(additionalHeaders, header, _default) {\n const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});\n let clientHeader;\n if (this.requestOptions && this.requestOptions.headers) {\n clientHeader = lowercaseKeys(this.requestOptions.headers)[header];\n }\n return additionalHeaders[header] || clientHeader || _default;\n }\n _getAgent(parsedUrl) {\n let agent;\n let proxyUrl = pm.getProxyUrl(parsedUrl);\n let useProxy = proxyUrl && proxyUrl.hostname;\n if (this._keepAlive && useProxy) {\n agent = this._proxyAgent;\n }\n if (this._keepAlive && !useProxy) {\n agent = this._agent;\n }\n // if agent is already assigned use that agent.\n if (!!agent) {\n return agent;\n }\n const usingSsl = parsedUrl.protocol === 'https:';\n let maxSockets = 100;\n if (!!this.requestOptions) {\n maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets;\n }\n if (useProxy) {\n // If using proxy, need tunnel\n if (!tunnel) {\n tunnel = require('tunnel');\n }\n const agentOptions = {\n maxSockets: maxSockets,\n keepAlive: this._keepAlive,\n proxy: {\n ...((proxyUrl.username || proxyUrl.password) && {\n proxyAuth: `${proxyUrl.username}:${proxyUrl.password}`\n }),\n host: proxyUrl.hostname,\n port: proxyUrl.port\n }\n };\n let tunnelAgent;\n const overHttps = proxyUrl.protocol === 'https:';\n if (usingSsl) {\n tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp;\n }\n else {\n tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp;\n }\n agent = tunnelAgent(agentOptions);\n this._proxyAgent = agent;\n }\n // if reusing agent across request and tunneling agent isn't assigned create a new agent\n if (this._keepAlive && !agent) {\n const options = { keepAlive: this._keepAlive, maxSockets: maxSockets };\n agent = usingSsl ? new https.Agent(options) : new http.Agent(options);\n this._agent = agent;\n }\n // if not using private agent and tunnel agent isn't setup then use global agent\n if (!agent) {\n agent = usingSsl ? https.globalAgent : http.globalAgent;\n }\n if (usingSsl && this._ignoreSslError) {\n // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process\n // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options\n // we have to cast it to any and change it directly\n agent.options = Object.assign(agent.options || {}, {\n rejectUnauthorized: false\n });\n }\n return agent;\n }\n _performExponentialBackoff(retryNumber) {\n retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber);\n const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber);\n return new Promise(resolve => setTimeout(() => resolve(), ms));\n }\n static dateTimeDeserializer(key, value) {\n if (typeof value === 'string') {\n let a = new Date(value);\n if (!isNaN(a.valueOf())) {\n return a;\n }\n }\n return value;\n }\n async _processResponse(res, options) {\n return new Promise(async (resolve, reject) => {\n const statusCode = res.message.statusCode;\n const response = {\n statusCode: statusCode,\n result: null,\n headers: {}\n };\n // not found leads to null obj returned\n if (statusCode == HttpCodes.NotFound) {\n resolve(response);\n }\n let obj;\n let contents;\n // get the result from the body\n try {\n contents = await res.readBody();\n if (contents && contents.length > 0) {\n if (options && options.deserializeDates) {\n obj = JSON.parse(contents, HttpClient.dateTimeDeserializer);\n }\n else {\n obj = JSON.parse(contents);\n }\n response.result = obj;\n }\n response.headers = res.message.headers;\n }\n catch (err) {\n // Invalid resource (contents not json); leaving result obj null\n }\n // note that 3xx redirects are handled by the http layer.\n if (statusCode > 299) {\n let msg;\n // if exception/error in body, attempt to get better error\n if (obj && obj.message) {\n msg = obj.message;\n }\n else if (contents && contents.length > 0) {\n // it may be the case that the exception is in the body message as string\n msg = contents;\n }\n else {\n msg = 'Failed request: (' + statusCode + ')';\n }\n let err = new HttpClientError(msg, statusCode);\n err.result = response.result;\n reject(err);\n }\n else {\n resolve(response);\n }\n });\n }\n}\nexports.HttpClient = HttpClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction getProxyUrl(reqUrl) {\n let usingSsl = reqUrl.protocol === 'https:';\n let proxyUrl;\n if (checkBypass(reqUrl)) {\n return proxyUrl;\n }\n let proxyVar;\n if (usingSsl) {\n proxyVar = process.env['https_proxy'] || process.env['HTTPS_PROXY'];\n }\n else {\n proxyVar = process.env['http_proxy'] || process.env['HTTP_PROXY'];\n }\n if (proxyVar) {\n proxyUrl = new URL(proxyVar);\n }\n return proxyUrl;\n}\nexports.getProxyUrl = getProxyUrl;\nfunction checkBypass(reqUrl) {\n if (!reqUrl.hostname) {\n return false;\n }\n let noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || '';\n if (!noProxy) {\n return false;\n }\n // Determine the request port\n let reqPort;\n if (reqUrl.port) {\n reqPort = Number(reqUrl.port);\n }\n else if (reqUrl.protocol === 'http:') {\n reqPort = 80;\n }\n else if (reqUrl.protocol === 'https:') {\n reqPort = 443;\n }\n // Format the request hostname and hostname with port\n let upperReqHosts = [reqUrl.hostname.toUpperCase()];\n if (typeof reqPort === 'number') {\n upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`);\n }\n // Compare request host against noproxy\n for (let upperNoProxyItem of noProxy\n .split(',')\n .map(x => x.trim().toUpperCase())\n .filter(x => x)) {\n if (upperReqHosts.some(x => x === upperNoProxyItem)) {\n return true;\n }\n }\n return false;\n}\nexports.checkBypass = checkBypass;\n","\"use strict\";\n\nvar realFetch = require('node-fetch');\nmodule.exports = function(url, options) {\n\tif (/^\\/\\//.test(url)) {\n\t\turl = 'https:' + url;\n\t}\n\treturn realFetch.call(this, url, options);\n};\n\nif (!global.fetch) {\n\tglobal.fetch = module.exports;\n\tglobal.Response = realFetch.Response;\n\tglobal.Headers = realFetch.Headers;\n\tglobal.Request = realFetch.Request;\n}\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar Stream = _interopDefault(require('stream'));\nvar http = _interopDefault(require('http'));\nvar Url = _interopDefault(require('url'));\nvar whatwgUrl = _interopDefault(require('whatwg-url'));\nvar https = _interopDefault(require('https'));\nvar zlib = _interopDefault(require('zlib'));\n\n// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js\n\n// fix for \"Readable\" isn't a named export issue\nconst Readable = Stream.Readable;\n\nconst BUFFER = Symbol('buffer');\nconst TYPE = Symbol('type');\n\nclass Blob {\n\tconstructor() {\n\t\tthis[TYPE] = '';\n\n\t\tconst blobParts = arguments[0];\n\t\tconst options = arguments[1];\n\n\t\tconst buffers = [];\n\t\tlet size = 0;\n\n\t\tif (blobParts) {\n\t\t\tconst a = blobParts;\n\t\t\tconst length = Number(a.length);\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tconst element = a[i];\n\t\t\t\tlet buffer;\n\t\t\t\tif (element instanceof Buffer) {\n\t\t\t\t\tbuffer = element;\n\t\t\t\t} else if (ArrayBuffer.isView(element)) {\n\t\t\t\t\tbuffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength);\n\t\t\t\t} else if (element instanceof ArrayBuffer) {\n\t\t\t\t\tbuffer = Buffer.from(element);\n\t\t\t\t} else if (element instanceof Blob) {\n\t\t\t\t\tbuffer = element[BUFFER];\n\t\t\t\t} else {\n\t\t\t\t\tbuffer = Buffer.from(typeof element === 'string' ? element : String(element));\n\t\t\t\t}\n\t\t\t\tsize += buffer.length;\n\t\t\t\tbuffers.push(buffer);\n\t\t\t}\n\t\t}\n\n\t\tthis[BUFFER] = Buffer.concat(buffers);\n\n\t\tlet type = options && options.type !== undefined && String(options.type).toLowerCase();\n\t\tif (type && !/[^\\u0020-\\u007E]/.test(type)) {\n\t\t\tthis[TYPE] = type;\n\t\t}\n\t}\n\tget size() {\n\t\treturn this[BUFFER].length;\n\t}\n\tget type() {\n\t\treturn this[TYPE];\n\t}\n\ttext() {\n\t\treturn Promise.resolve(this[BUFFER].toString());\n\t}\n\tarrayBuffer() {\n\t\tconst buf = this[BUFFER];\n\t\tconst ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n\t\treturn Promise.resolve(ab);\n\t}\n\tstream() {\n\t\tconst readable = new Readable();\n\t\treadable._read = function () {};\n\t\treadable.push(this[BUFFER]);\n\t\treadable.push(null);\n\t\treturn readable;\n\t}\n\ttoString() {\n\t\treturn '[object Blob]';\n\t}\n\tslice() {\n\t\tconst size = this.size;\n\n\t\tconst start = arguments[0];\n\t\tconst end = arguments[1];\n\t\tlet relativeStart, relativeEnd;\n\t\tif (start === undefined) {\n\t\t\trelativeStart = 0;\n\t\t} else if (start < 0) {\n\t\t\trelativeStart = Math.max(size + start, 0);\n\t\t} else {\n\t\t\trelativeStart = Math.min(start, size);\n\t\t}\n\t\tif (end === undefined) {\n\t\t\trelativeEnd = size;\n\t\t} else if (end < 0) {\n\t\t\trelativeEnd = Math.max(size + end, 0);\n\t\t} else {\n\t\t\trelativeEnd = Math.min(end, size);\n\t\t}\n\t\tconst span = Math.max(relativeEnd - relativeStart, 0);\n\n\t\tconst buffer = this[BUFFER];\n\t\tconst slicedBuffer = buffer.slice(relativeStart, relativeStart + span);\n\t\tconst blob = new Blob([], { type: arguments[2] });\n\t\tblob[BUFFER] = slicedBuffer;\n\t\treturn blob;\n\t}\n}\n\nObject.defineProperties(Blob.prototype, {\n\tsize: { enumerable: true },\n\ttype: { enumerable: true },\n\tslice: { enumerable: true }\n});\n\nObject.defineProperty(Blob.prototype, Symbol.toStringTag, {\n\tvalue: 'Blob',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\n/**\n * fetch-error.js\n *\n * FetchError interface for operational errors\n */\n\n/**\n * Create FetchError instance\n *\n * @param String message Error message for human\n * @param String type Error type for machine\n * @param String systemError For Node.js system error\n * @return FetchError\n */\nfunction FetchError(message, type, systemError) {\n Error.call(this, message);\n\n this.message = message;\n this.type = type;\n\n // when err.type is `system`, err.code contains system error code\n if (systemError) {\n this.code = this.errno = systemError.code;\n }\n\n // hide custom error implementation details from end-users\n Error.captureStackTrace(this, this.constructor);\n}\n\nFetchError.prototype = Object.create(Error.prototype);\nFetchError.prototype.constructor = FetchError;\nFetchError.prototype.name = 'FetchError';\n\nlet convert;\ntry {\n\tconvert = require('encoding').convert;\n} catch (e) {}\n\nconst INTERNALS = Symbol('Body internals');\n\n// fix an issue where \"PassThrough\" isn't a named export for node <10\nconst PassThrough = Stream.PassThrough;\n\n/**\n * Body mixin\n *\n * Ref: https://fetch.spec.whatwg.org/#body\n *\n * @param Stream body Readable stream\n * @param Object opts Response options\n * @return Void\n */\nfunction Body(body) {\n\tvar _this = this;\n\n\tvar _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n\t _ref$size = _ref.size;\n\n\tlet size = _ref$size === undefined ? 0 : _ref$size;\n\tvar _ref$timeout = _ref.timeout;\n\tlet timeout = _ref$timeout === undefined ? 0 : _ref$timeout;\n\n\tif (body == null) {\n\t\t// body is undefined or null\n\t\tbody = null;\n\t} else if (isURLSearchParams(body)) {\n\t\t// body is a URLSearchParams\n\t\tbody = Buffer.from(body.toString());\n\t} else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {\n\t\t// body is ArrayBuffer\n\t\tbody = Buffer.from(body);\n\t} else if (ArrayBuffer.isView(body)) {\n\t\t// body is ArrayBufferView\n\t\tbody = Buffer.from(body.buffer, body.byteOffset, body.byteLength);\n\t} else if (body instanceof Stream) ; else {\n\t\t// none of the above\n\t\t// coerce to string then buffer\n\t\tbody = Buffer.from(String(body));\n\t}\n\tthis[INTERNALS] = {\n\t\tbody,\n\t\tdisturbed: false,\n\t\terror: null\n\t};\n\tthis.size = size;\n\tthis.timeout = timeout;\n\n\tif (body instanceof Stream) {\n\t\tbody.on('error', function (err) {\n\t\t\tconst error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err);\n\t\t\t_this[INTERNALS].error = error;\n\t\t});\n\t}\n}\n\nBody.prototype = {\n\tget body() {\n\t\treturn this[INTERNALS].body;\n\t},\n\n\tget bodyUsed() {\n\t\treturn this[INTERNALS].disturbed;\n\t},\n\n\t/**\n * Decode response as ArrayBuffer\n *\n * @return Promise\n */\n\tarrayBuffer() {\n\t\treturn consumeBody.call(this).then(function (buf) {\n\t\t\treturn buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n\t\t});\n\t},\n\n\t/**\n * Return raw response as Blob\n *\n * @return Promise\n */\n\tblob() {\n\t\tlet ct = this.headers && this.headers.get('content-type') || '';\n\t\treturn consumeBody.call(this).then(function (buf) {\n\t\t\treturn Object.assign(\n\t\t\t// Prevent copying\n\t\t\tnew Blob([], {\n\t\t\t\ttype: ct.toLowerCase()\n\t\t\t}), {\n\t\t\t\t[BUFFER]: buf\n\t\t\t});\n\t\t});\n\t},\n\n\t/**\n * Decode response as json\n *\n * @return Promise\n */\n\tjson() {\n\t\tvar _this2 = this;\n\n\t\treturn consumeBody.call(this).then(function (buffer) {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(buffer.toString());\n\t\t\t} catch (err) {\n\t\t\t\treturn Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n * Decode response as text\n *\n * @return Promise\n */\n\ttext() {\n\t\treturn consumeBody.call(this).then(function (buffer) {\n\t\t\treturn buffer.toString();\n\t\t});\n\t},\n\n\t/**\n * Decode response as buffer (non-spec api)\n *\n * @return Promise\n */\n\tbuffer() {\n\t\treturn consumeBody.call(this);\n\t},\n\n\t/**\n * Decode response as text, while automatically detecting the encoding and\n * trying to decode to UTF-8 (non-spec api)\n *\n * @return Promise\n */\n\ttextConverted() {\n\t\tvar _this3 = this;\n\n\t\treturn consumeBody.call(this).then(function (buffer) {\n\t\t\treturn convertBody(buffer, _this3.headers);\n\t\t});\n\t}\n};\n\n// In browsers, all properties are enumerable.\nObject.defineProperties(Body.prototype, {\n\tbody: { enumerable: true },\n\tbodyUsed: { enumerable: true },\n\tarrayBuffer: { enumerable: true },\n\tblob: { enumerable: true },\n\tjson: { enumerable: true },\n\ttext: { enumerable: true }\n});\n\nBody.mixIn = function (proto) {\n\tfor (const name of Object.getOwnPropertyNames(Body.prototype)) {\n\t\t// istanbul ignore else: future proof\n\t\tif (!(name in proto)) {\n\t\t\tconst desc = Object.getOwnPropertyDescriptor(Body.prototype, name);\n\t\t\tObject.defineProperty(proto, name, desc);\n\t\t}\n\t}\n};\n\n/**\n * Consume and convert an entire Body to a Buffer.\n *\n * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body\n *\n * @return Promise\n */\nfunction consumeBody() {\n\tvar _this4 = this;\n\n\tif (this[INTERNALS].disturbed) {\n\t\treturn Body.Promise.reject(new TypeError(`body used already for: ${this.url}`));\n\t}\n\n\tthis[INTERNALS].disturbed = true;\n\n\tif (this[INTERNALS].error) {\n\t\treturn Body.Promise.reject(this[INTERNALS].error);\n\t}\n\n\tlet body = this.body;\n\n\t// body is null\n\tif (body === null) {\n\t\treturn Body.Promise.resolve(Buffer.alloc(0));\n\t}\n\n\t// body is blob\n\tif (isBlob(body)) {\n\t\tbody = body.stream();\n\t}\n\n\t// body is buffer\n\tif (Buffer.isBuffer(body)) {\n\t\treturn Body.Promise.resolve(body);\n\t}\n\n\t// istanbul ignore if: should never happen\n\tif (!(body instanceof Stream)) {\n\t\treturn Body.Promise.resolve(Buffer.alloc(0));\n\t}\n\n\t// body is stream\n\t// get ready to actually consume the body\n\tlet accum = [];\n\tlet accumBytes = 0;\n\tlet abort = false;\n\n\treturn new Body.Promise(function (resolve, reject) {\n\t\tlet resTimeout;\n\n\t\t// allow timeout on slow response body\n\t\tif (_this4.timeout) {\n\t\t\tresTimeout = setTimeout(function () {\n\t\t\t\tabort = true;\n\t\t\t\treject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout'));\n\t\t\t}, _this4.timeout);\n\t\t}\n\n\t\t// handle stream errors\n\t\tbody.on('error', function (err) {\n\t\t\tif (err.name === 'AbortError') {\n\t\t\t\t// if the request was aborted, reject with this Error\n\t\t\t\tabort = true;\n\t\t\t\treject(err);\n\t\t\t} else {\n\t\t\t\t// other errors, such as incorrect content-encoding\n\t\t\t\treject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err));\n\t\t\t}\n\t\t});\n\n\t\tbody.on('data', function (chunk) {\n\t\t\tif (abort || chunk === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (_this4.size && accumBytes + chunk.length > _this4.size) {\n\t\t\t\tabort = true;\n\t\t\t\treject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size'));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\taccumBytes += chunk.length;\n\t\t\taccum.push(chunk);\n\t\t});\n\n\t\tbody.on('end', function () {\n\t\t\tif (abort) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tclearTimeout(resTimeout);\n\n\t\t\ttry {\n\t\t\t\tresolve(Buffer.concat(accum, accumBytes));\n\t\t\t} catch (err) {\n\t\t\t\t// handle streams that have accumulated too much data (issue #414)\n\t\t\t\treject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err));\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Detect buffer encoding and convert to target encoding\n * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding\n *\n * @param Buffer buffer Incoming buffer\n * @param String encoding Target encoding\n * @return String\n */\nfunction convertBody(buffer, headers) {\n\tif (typeof convert !== 'function') {\n\t\tthrow new Error('The package `encoding` must be installed to use the textConverted() function');\n\t}\n\n\tconst ct = headers.get('content-type');\n\tlet charset = 'utf-8';\n\tlet res, str;\n\n\t// header\n\tif (ct) {\n\t\tres = /charset=([^;]*)/i.exec(ct);\n\t}\n\n\t// no charset in content type, peek at response body for at most 1024 bytes\n\tstr = buffer.slice(0, 1024).toString();\n\n\t// html5\n\tif (!res && str) {\n\t\tres = / 0 && arguments[0] !== undefined ? arguments[0] : undefined;\n\n\t\tthis[MAP] = Object.create(null);\n\n\t\tif (init instanceof Headers) {\n\t\t\tconst rawHeaders = init.raw();\n\t\t\tconst headerNames = Object.keys(rawHeaders);\n\n\t\t\tfor (const headerName of headerNames) {\n\t\t\t\tfor (const value of rawHeaders[headerName]) {\n\t\t\t\t\tthis.append(headerName, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// We don't worry about converting prop to ByteString here as append()\n\t\t// will handle it.\n\t\tif (init == null) ; else if (typeof init === 'object') {\n\t\t\tconst method = init[Symbol.iterator];\n\t\t\tif (method != null) {\n\t\t\t\tif (typeof method !== 'function') {\n\t\t\t\t\tthrow new TypeError('Header pairs must be iterable');\n\t\t\t\t}\n\n\t\t\t\t// sequence>\n\t\t\t\t// Note: per spec we have to first exhaust the lists then process them\n\t\t\t\tconst pairs = [];\n\t\t\t\tfor (const pair of init) {\n\t\t\t\t\tif (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') {\n\t\t\t\t\t\tthrow new TypeError('Each header pair must be iterable');\n\t\t\t\t\t}\n\t\t\t\t\tpairs.push(Array.from(pair));\n\t\t\t\t}\n\n\t\t\t\tfor (const pair of pairs) {\n\t\t\t\t\tif (pair.length !== 2) {\n\t\t\t\t\t\tthrow new TypeError('Each header pair must be a name/value tuple');\n\t\t\t\t\t}\n\t\t\t\t\tthis.append(pair[0], pair[1]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// record\n\t\t\t\tfor (const key of Object.keys(init)) {\n\t\t\t\t\tconst value = init[key];\n\t\t\t\t\tthis.append(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('Provided initializer must be an object');\n\t\t}\n\t}\n\n\t/**\n * Return combined header value given name\n *\n * @param String name Header name\n * @return Mixed\n */\n\tget(name) {\n\t\tname = `${name}`;\n\t\tvalidateName(name);\n\t\tconst key = find(this[MAP], name);\n\t\tif (key === undefined) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this[MAP][key].join(', ');\n\t}\n\n\t/**\n * Iterate over all headers\n *\n * @param Function callback Executed for each item with parameters (value, name, thisArg)\n * @param Boolean thisArg `this` context for callback function\n * @return Void\n */\n\tforEach(callback) {\n\t\tlet thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;\n\n\t\tlet pairs = getHeaders(this);\n\t\tlet i = 0;\n\t\twhile (i < pairs.length) {\n\t\t\tvar _pairs$i = pairs[i];\n\t\t\tconst name = _pairs$i[0],\n\t\t\t value = _pairs$i[1];\n\n\t\t\tcallback.call(thisArg, value, name, this);\n\t\t\tpairs = getHeaders(this);\n\t\t\ti++;\n\t\t}\n\t}\n\n\t/**\n * Overwrite header values given name\n *\n * @param String name Header name\n * @param String value Header value\n * @return Void\n */\n\tset(name, value) {\n\t\tname = `${name}`;\n\t\tvalue = `${value}`;\n\t\tvalidateName(name);\n\t\tvalidateValue(value);\n\t\tconst key = find(this[MAP], name);\n\t\tthis[MAP][key !== undefined ? key : name] = [value];\n\t}\n\n\t/**\n * Append a value onto existing header\n *\n * @param String name Header name\n * @param String value Header value\n * @return Void\n */\n\tappend(name, value) {\n\t\tname = `${name}`;\n\t\tvalue = `${value}`;\n\t\tvalidateName(name);\n\t\tvalidateValue(value);\n\t\tconst key = find(this[MAP], name);\n\t\tif (key !== undefined) {\n\t\t\tthis[MAP][key].push(value);\n\t\t} else {\n\t\t\tthis[MAP][name] = [value];\n\t\t}\n\t}\n\n\t/**\n * Check for header name existence\n *\n * @param String name Header name\n * @return Boolean\n */\n\thas(name) {\n\t\tname = `${name}`;\n\t\tvalidateName(name);\n\t\treturn find(this[MAP], name) !== undefined;\n\t}\n\n\t/**\n * Delete all header values given name\n *\n * @param String name Header name\n * @return Void\n */\n\tdelete(name) {\n\t\tname = `${name}`;\n\t\tvalidateName(name);\n\t\tconst key = find(this[MAP], name);\n\t\tif (key !== undefined) {\n\t\t\tdelete this[MAP][key];\n\t\t}\n\t}\n\n\t/**\n * Return raw headers (non-spec api)\n *\n * @return Object\n */\n\traw() {\n\t\treturn this[MAP];\n\t}\n\n\t/**\n * Get an iterator on keys.\n *\n * @return Iterator\n */\n\tkeys() {\n\t\treturn createHeadersIterator(this, 'key');\n\t}\n\n\t/**\n * Get an iterator on values.\n *\n * @return Iterator\n */\n\tvalues() {\n\t\treturn createHeadersIterator(this, 'value');\n\t}\n\n\t/**\n * Get an iterator on entries.\n *\n * This is the default iterator of the Headers object.\n *\n * @return Iterator\n */\n\t[Symbol.iterator]() {\n\t\treturn createHeadersIterator(this, 'key+value');\n\t}\n}\nHeaders.prototype.entries = Headers.prototype[Symbol.iterator];\n\nObject.defineProperty(Headers.prototype, Symbol.toStringTag, {\n\tvalue: 'Headers',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\nObject.defineProperties(Headers.prototype, {\n\tget: { enumerable: true },\n\tforEach: { enumerable: true },\n\tset: { enumerable: true },\n\tappend: { enumerable: true },\n\thas: { enumerable: true },\n\tdelete: { enumerable: true },\n\tkeys: { enumerable: true },\n\tvalues: { enumerable: true },\n\tentries: { enumerable: true }\n});\n\nfunction getHeaders(headers) {\n\tlet kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value';\n\n\tconst keys = Object.keys(headers[MAP]).sort();\n\treturn keys.map(kind === 'key' ? function (k) {\n\t\treturn k.toLowerCase();\n\t} : kind === 'value' ? function (k) {\n\t\treturn headers[MAP][k].join(', ');\n\t} : function (k) {\n\t\treturn [k.toLowerCase(), headers[MAP][k].join(', ')];\n\t});\n}\n\nconst INTERNAL = Symbol('internal');\n\nfunction createHeadersIterator(target, kind) {\n\tconst iterator = Object.create(HeadersIteratorPrototype);\n\titerator[INTERNAL] = {\n\t\ttarget,\n\t\tkind,\n\t\tindex: 0\n\t};\n\treturn iterator;\n}\n\nconst HeadersIteratorPrototype = Object.setPrototypeOf({\n\tnext() {\n\t\t// istanbul ignore if\n\t\tif (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {\n\t\t\tthrow new TypeError('Value of `this` is not a HeadersIterator');\n\t\t}\n\n\t\tvar _INTERNAL = this[INTERNAL];\n\t\tconst target = _INTERNAL.target,\n\t\t kind = _INTERNAL.kind,\n\t\t index = _INTERNAL.index;\n\n\t\tconst values = getHeaders(target, kind);\n\t\tconst len = values.length;\n\t\tif (index >= len) {\n\t\t\treturn {\n\t\t\t\tvalue: undefined,\n\t\t\t\tdone: true\n\t\t\t};\n\t\t}\n\n\t\tthis[INTERNAL].index = index + 1;\n\n\t\treturn {\n\t\t\tvalue: values[index],\n\t\t\tdone: false\n\t\t};\n\t}\n}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));\n\nObject.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {\n\tvalue: 'HeadersIterator',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\n/**\n * Export the Headers object in a form that Node.js can consume.\n *\n * @param Headers headers\n * @return Object\n */\nfunction exportNodeCompatibleHeaders(headers) {\n\tconst obj = Object.assign({ __proto__: null }, headers[MAP]);\n\n\t// http.request() only supports string as Host header. This hack makes\n\t// specifying custom Host header possible.\n\tconst hostHeaderKey = find(headers[MAP], 'Host');\n\tif (hostHeaderKey !== undefined) {\n\t\tobj[hostHeaderKey] = obj[hostHeaderKey][0];\n\t}\n\n\treturn obj;\n}\n\n/**\n * Create a Headers object from an object of headers, ignoring those that do\n * not conform to HTTP grammar productions.\n *\n * @param Object obj Object of headers\n * @return Headers\n */\nfunction createHeadersLenient(obj) {\n\tconst headers = new Headers();\n\tfor (const name of Object.keys(obj)) {\n\t\tif (invalidTokenRegex.test(name)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (Array.isArray(obj[name])) {\n\t\t\tfor (const val of obj[name]) {\n\t\t\t\tif (invalidHeaderCharRegex.test(val)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (headers[MAP][name] === undefined) {\n\t\t\t\t\theaders[MAP][name] = [val];\n\t\t\t\t} else {\n\t\t\t\t\theaders[MAP][name].push(val);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (!invalidHeaderCharRegex.test(obj[name])) {\n\t\t\theaders[MAP][name] = [obj[name]];\n\t\t}\n\t}\n\treturn headers;\n}\n\nconst INTERNALS$1 = Symbol('Response internals');\n\n// fix an issue where \"STATUS_CODES\" aren't a named export for node <10\nconst STATUS_CODES = http.STATUS_CODES;\n\n/**\n * Response class\n *\n * @param Stream body Readable stream\n * @param Object opts Response options\n * @return Void\n */\nclass Response {\n\tconstructor() {\n\t\tlet body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\t\tlet opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tBody.call(this, body, opts);\n\n\t\tconst status = opts.status || 200;\n\t\tconst headers = new Headers(opts.headers);\n\n\t\tif (body != null && !headers.has('Content-Type')) {\n\t\t\tconst contentType = extractContentType(body);\n\t\t\tif (contentType) {\n\t\t\t\theaders.append('Content-Type', contentType);\n\t\t\t}\n\t\t}\n\n\t\tthis[INTERNALS$1] = {\n\t\t\turl: opts.url,\n\t\t\tstatus,\n\t\t\tstatusText: opts.statusText || STATUS_CODES[status],\n\t\t\theaders,\n\t\t\tcounter: opts.counter\n\t\t};\n\t}\n\n\tget url() {\n\t\treturn this[INTERNALS$1].url || '';\n\t}\n\n\tget status() {\n\t\treturn this[INTERNALS$1].status;\n\t}\n\n\t/**\n * Convenience property representing if the request ended normally\n */\n\tget ok() {\n\t\treturn this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300;\n\t}\n\n\tget redirected() {\n\t\treturn this[INTERNALS$1].counter > 0;\n\t}\n\n\tget statusText() {\n\t\treturn this[INTERNALS$1].statusText;\n\t}\n\n\tget headers() {\n\t\treturn this[INTERNALS$1].headers;\n\t}\n\n\t/**\n * Clone this response\n *\n * @return Response\n */\n\tclone() {\n\t\treturn new Response(clone(this), {\n\t\t\turl: this.url,\n\t\t\tstatus: this.status,\n\t\t\tstatusText: this.statusText,\n\t\t\theaders: this.headers,\n\t\t\tok: this.ok,\n\t\t\tredirected: this.redirected\n\t\t});\n\t}\n}\n\nBody.mixIn(Response.prototype);\n\nObject.defineProperties(Response.prototype, {\n\turl: { enumerable: true },\n\tstatus: { enumerable: true },\n\tok: { enumerable: true },\n\tredirected: { enumerable: true },\n\tstatusText: { enumerable: true },\n\theaders: { enumerable: true },\n\tclone: { enumerable: true }\n});\n\nObject.defineProperty(Response.prototype, Symbol.toStringTag, {\n\tvalue: 'Response',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\nconst INTERNALS$2 = Symbol('Request internals');\nconst URL = Url.URL || whatwgUrl.URL;\n\n// fix an issue where \"format\", \"parse\" aren't a named export for node <10\nconst parse_url = Url.parse;\nconst format_url = Url.format;\n\n/**\n * Wrapper around `new URL` to handle arbitrary URLs\n *\n * @param {string} urlStr\n * @return {void}\n */\nfunction parseURL(urlStr) {\n\t/*\n \tCheck whether the URL is absolute or not\n \t\tScheme: https://tools.ietf.org/html/rfc3986#section-3.1\n \tAbsolute URL: https://tools.ietf.org/html/rfc3986#section-4.3\n */\n\tif (/^[a-zA-Z][a-zA-Z\\d+\\-.]*:/.exec(urlStr)) {\n\t\turlStr = new URL(urlStr).toString();\n\t}\n\n\t// Fallback to old implementation for arbitrary URLs\n\treturn parse_url(urlStr);\n}\n\nconst streamDestructionSupported = 'destroy' in Stream.Readable.prototype;\n\n/**\n * Check if a value is an instance of Request.\n *\n * @param Mixed input\n * @return Boolean\n */\nfunction isRequest(input) {\n\treturn typeof input === 'object' && typeof input[INTERNALS$2] === 'object';\n}\n\nfunction isAbortSignal(signal) {\n\tconst proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal);\n\treturn !!(proto && proto.constructor.name === 'AbortSignal');\n}\n\n/**\n * Request class\n *\n * @param Mixed input Url or Request instance\n * @param Object init Custom options\n * @return Void\n */\nclass Request {\n\tconstructor(input) {\n\t\tlet init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tlet parsedURL;\n\n\t\t// normalize input\n\t\tif (!isRequest(input)) {\n\t\t\tif (input && input.href) {\n\t\t\t\t// in order to support Node.js' Url objects; though WHATWG's URL objects\n\t\t\t\t// will fall into this branch also (since their `toString()` will return\n\t\t\t\t// `href` property anyway)\n\t\t\t\tparsedURL = parseURL(input.href);\n\t\t\t} else {\n\t\t\t\t// coerce input to a string before attempting to parse\n\t\t\t\tparsedURL = parseURL(`${input}`);\n\t\t\t}\n\t\t\tinput = {};\n\t\t} else {\n\t\t\tparsedURL = parseURL(input.url);\n\t\t}\n\n\t\tlet method = init.method || input.method || 'GET';\n\t\tmethod = method.toUpperCase();\n\n\t\tif ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) {\n\t\t\tthrow new TypeError('Request with GET/HEAD method cannot have body');\n\t\t}\n\n\t\tlet inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null;\n\n\t\tBody.call(this, inputBody, {\n\t\t\ttimeout: init.timeout || input.timeout || 0,\n\t\t\tsize: init.size || input.size || 0\n\t\t});\n\n\t\tconst headers = new Headers(init.headers || input.headers || {});\n\n\t\tif (inputBody != null && !headers.has('Content-Type')) {\n\t\t\tconst contentType = extractContentType(inputBody);\n\t\t\tif (contentType) {\n\t\t\t\theaders.append('Content-Type', contentType);\n\t\t\t}\n\t\t}\n\n\t\tlet signal = isRequest(input) ? input.signal : null;\n\t\tif ('signal' in init) signal = init.signal;\n\n\t\tif (signal != null && !isAbortSignal(signal)) {\n\t\t\tthrow new TypeError('Expected signal to be an instanceof AbortSignal');\n\t\t}\n\n\t\tthis[INTERNALS$2] = {\n\t\t\tmethod,\n\t\t\tredirect: init.redirect || input.redirect || 'follow',\n\t\t\theaders,\n\t\t\tparsedURL,\n\t\t\tsignal\n\t\t};\n\n\t\t// node-fetch-only options\n\t\tthis.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20;\n\t\tthis.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true;\n\t\tthis.counter = init.counter || input.counter || 0;\n\t\tthis.agent = init.agent || input.agent;\n\t}\n\n\tget method() {\n\t\treturn this[INTERNALS$2].method;\n\t}\n\n\tget url() {\n\t\treturn format_url(this[INTERNALS$2].parsedURL);\n\t}\n\n\tget headers() {\n\t\treturn this[INTERNALS$2].headers;\n\t}\n\n\tget redirect() {\n\t\treturn this[INTERNALS$2].redirect;\n\t}\n\n\tget signal() {\n\t\treturn this[INTERNALS$2].signal;\n\t}\n\n\t/**\n * Clone this request\n *\n * @return Request\n */\n\tclone() {\n\t\treturn new Request(this);\n\t}\n}\n\nBody.mixIn(Request.prototype);\n\nObject.defineProperty(Request.prototype, Symbol.toStringTag, {\n\tvalue: 'Request',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\nObject.defineProperties(Request.prototype, {\n\tmethod: { enumerable: true },\n\turl: { enumerable: true },\n\theaders: { enumerable: true },\n\tredirect: { enumerable: true },\n\tclone: { enumerable: true },\n\tsignal: { enumerable: true }\n});\n\n/**\n * Convert a Request to Node.js http request options.\n *\n * @param Request A Request instance\n * @return Object The options object to be passed to http.request\n */\nfunction getNodeRequestOptions(request) {\n\tconst parsedURL = request[INTERNALS$2].parsedURL;\n\tconst headers = new Headers(request[INTERNALS$2].headers);\n\n\t// fetch step 1.3\n\tif (!headers.has('Accept')) {\n\t\theaders.set('Accept', '*/*');\n\t}\n\n\t// Basic fetch\n\tif (!parsedURL.protocol || !parsedURL.hostname) {\n\t\tthrow new TypeError('Only absolute URLs are supported');\n\t}\n\n\tif (!/^https?:$/.test(parsedURL.protocol)) {\n\t\tthrow new TypeError('Only HTTP(S) protocols are supported');\n\t}\n\n\tif (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) {\n\t\tthrow new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8');\n\t}\n\n\t// HTTP-network-or-cache fetch steps 2.4-2.7\n\tlet contentLengthValue = null;\n\tif (request.body == null && /^(POST|PUT)$/i.test(request.method)) {\n\t\tcontentLengthValue = '0';\n\t}\n\tif (request.body != null) {\n\t\tconst totalBytes = getTotalBytes(request);\n\t\tif (typeof totalBytes === 'number') {\n\t\t\tcontentLengthValue = String(totalBytes);\n\t\t}\n\t}\n\tif (contentLengthValue) {\n\t\theaders.set('Content-Length', contentLengthValue);\n\t}\n\n\t// HTTP-network-or-cache fetch step 2.11\n\tif (!headers.has('User-Agent')) {\n\t\theaders.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)');\n\t}\n\n\t// HTTP-network-or-cache fetch step 2.15\n\tif (request.compress && !headers.has('Accept-Encoding')) {\n\t\theaders.set('Accept-Encoding', 'gzip,deflate');\n\t}\n\n\tlet agent = request.agent;\n\tif (typeof agent === 'function') {\n\t\tagent = agent(parsedURL);\n\t}\n\n\tif (!headers.has('Connection') && !agent) {\n\t\theaders.set('Connection', 'close');\n\t}\n\n\t// HTTP-network fetch step 4.2\n\t// chunked encoding is handled by Node.js\n\n\treturn Object.assign({}, parsedURL, {\n\t\tmethod: request.method,\n\t\theaders: exportNodeCompatibleHeaders(headers),\n\t\tagent\n\t});\n}\n\n/**\n * abort-error.js\n *\n * AbortError interface for cancelled requests\n */\n\n/**\n * Create AbortError instance\n *\n * @param String message Error message for human\n * @return AbortError\n */\nfunction AbortError(message) {\n Error.call(this, message);\n\n this.type = 'aborted';\n this.message = message;\n\n // hide custom error implementation details from end-users\n Error.captureStackTrace(this, this.constructor);\n}\n\nAbortError.prototype = Object.create(Error.prototype);\nAbortError.prototype.constructor = AbortError;\nAbortError.prototype.name = 'AbortError';\n\nconst URL$1 = Url.URL || whatwgUrl.URL;\n\n// fix an issue where \"PassThrough\", \"resolve\" aren't a named export for node <10\nconst PassThrough$1 = Stream.PassThrough;\n\nconst isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) {\n\tconst orig = new URL$1(original).hostname;\n\tconst dest = new URL$1(destination).hostname;\n\n\treturn orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest);\n};\n\n/**\n * Fetch function\n *\n * @param Mixed url Absolute url or Request instance\n * @param Object opts Fetch options\n * @return Promise\n */\nfunction fetch(url, opts) {\n\n\t// allow custom promise\n\tif (!fetch.Promise) {\n\t\tthrow new Error('native promise missing, set fetch.Promise to your favorite alternative');\n\t}\n\n\tBody.Promise = fetch.Promise;\n\n\t// wrap http.request into fetch\n\treturn new fetch.Promise(function (resolve, reject) {\n\t\t// build request object\n\t\tconst request = new Request(url, opts);\n\t\tconst options = getNodeRequestOptions(request);\n\n\t\tconst send = (options.protocol === 'https:' ? https : http).request;\n\t\tconst signal = request.signal;\n\n\t\tlet response = null;\n\n\t\tconst abort = function abort() {\n\t\t\tlet error = new AbortError('The user aborted a request.');\n\t\t\treject(error);\n\t\t\tif (request.body && request.body instanceof Stream.Readable) {\n\t\t\t\trequest.body.destroy(error);\n\t\t\t}\n\t\t\tif (!response || !response.body) return;\n\t\t\tresponse.body.emit('error', error);\n\t\t};\n\n\t\tif (signal && signal.aborted) {\n\t\t\tabort();\n\t\t\treturn;\n\t\t}\n\n\t\tconst abortAndFinalize = function abortAndFinalize() {\n\t\t\tabort();\n\t\t\tfinalize();\n\t\t};\n\n\t\t// send request\n\t\tconst req = send(options);\n\t\tlet reqTimeout;\n\n\t\tif (signal) {\n\t\t\tsignal.addEventListener('abort', abortAndFinalize);\n\t\t}\n\n\t\tfunction finalize() {\n\t\t\treq.abort();\n\t\t\tif (signal) signal.removeEventListener('abort', abortAndFinalize);\n\t\t\tclearTimeout(reqTimeout);\n\t\t}\n\n\t\tif (request.timeout) {\n\t\t\treq.once('socket', function (socket) {\n\t\t\t\treqTimeout = setTimeout(function () {\n\t\t\t\t\treject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout'));\n\t\t\t\t\tfinalize();\n\t\t\t\t}, request.timeout);\n\t\t\t});\n\t\t}\n\n\t\treq.on('error', function (err) {\n\t\t\treject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));\n\t\t\tfinalize();\n\t\t});\n\n\t\treq.on('response', function (res) {\n\t\t\tclearTimeout(reqTimeout);\n\n\t\t\tconst headers = createHeadersLenient(res.headers);\n\n\t\t\t// HTTP fetch step 5\n\t\t\tif (fetch.isRedirect(res.statusCode)) {\n\t\t\t\t// HTTP fetch step 5.2\n\t\t\t\tconst location = headers.get('Location');\n\n\t\t\t\t// HTTP fetch step 5.3\n\t\t\t\tlet locationURL = null;\n\t\t\t\ttry {\n\t\t\t\t\tlocationURL = location === null ? null : new URL$1(location, request.url).toString();\n\t\t\t\t} catch (err) {\n\t\t\t\t\t// error here can only be invalid URL in Location: header\n\t\t\t\t\t// do not throw when options.redirect == manual\n\t\t\t\t\t// let the user extract the errorneous redirect URL\n\t\t\t\t\tif (request.redirect !== 'manual') {\n\t\t\t\t\t\treject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect'));\n\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// HTTP fetch step 5.5\n\t\t\t\tswitch (request.redirect) {\n\t\t\t\t\tcase 'error':\n\t\t\t\t\t\treject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect'));\n\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\treturn;\n\t\t\t\t\tcase 'manual':\n\t\t\t\t\t\t// node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL.\n\t\t\t\t\t\tif (locationURL !== null) {\n\t\t\t\t\t\t\t// handle corrupted header\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\theaders.set('Location', locationURL);\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t// istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'follow':\n\t\t\t\t\t\t// HTTP-redirect fetch step 2\n\t\t\t\t\t\tif (locationURL === null) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 5\n\t\t\t\t\t\tif (request.counter >= request.follow) {\n\t\t\t\t\t\t\treject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect'));\n\t\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 6 (counter increment)\n\t\t\t\t\t\t// Create a new Request object.\n\t\t\t\t\t\tconst requestOpts = {\n\t\t\t\t\t\t\theaders: new Headers(request.headers),\n\t\t\t\t\t\t\tfollow: request.follow,\n\t\t\t\t\t\t\tcounter: request.counter + 1,\n\t\t\t\t\t\t\tagent: request.agent,\n\t\t\t\t\t\t\tcompress: request.compress,\n\t\t\t\t\t\t\tmethod: request.method,\n\t\t\t\t\t\t\tbody: request.body,\n\t\t\t\t\t\t\tsignal: request.signal,\n\t\t\t\t\t\t\ttimeout: request.timeout,\n\t\t\t\t\t\t\tsize: request.size\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (!isDomainOrSubdomain(request.url, locationURL)) {\n\t\t\t\t\t\t\tfor (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) {\n\t\t\t\t\t\t\t\trequestOpts.headers.delete(name);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 9\n\t\t\t\t\t\tif (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {\n\t\t\t\t\t\t\treject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));\n\t\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 11\n\t\t\t\t\t\tif (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') {\n\t\t\t\t\t\t\trequestOpts.method = 'GET';\n\t\t\t\t\t\t\trequestOpts.body = undefined;\n\t\t\t\t\t\t\trequestOpts.headers.delete('content-length');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 15\n\t\t\t\t\t\tresolve(fetch(new Request(locationURL, requestOpts)));\n\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// prepare response\n\t\t\tres.once('end', function () {\n\t\t\t\tif (signal) signal.removeEventListener('abort', abortAndFinalize);\n\t\t\t});\n\t\t\tlet body = res.pipe(new PassThrough$1());\n\n\t\t\tconst response_options = {\n\t\t\t\turl: request.url,\n\t\t\t\tstatus: res.statusCode,\n\t\t\t\tstatusText: res.statusMessage,\n\t\t\t\theaders: headers,\n\t\t\t\tsize: request.size,\n\t\t\t\ttimeout: request.timeout,\n\t\t\t\tcounter: request.counter\n\t\t\t};\n\n\t\t\t// HTTP-network fetch step 12.1.1.3\n\t\t\tconst codings = headers.get('Content-Encoding');\n\n\t\t\t// HTTP-network fetch step 12.1.1.4: handle content codings\n\n\t\t\t// in following scenarios we ignore compression support\n\t\t\t// 1. compression support is disabled\n\t\t\t// 2. HEAD request\n\t\t\t// 3. no Content-Encoding header\n\t\t\t// 4. no content response (204)\n\t\t\t// 5. content not modified response (304)\n\t\t\tif (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) {\n\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\tresolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// For Node v6+\n\t\t\t// Be less strict when decoding compressed responses, since sometimes\n\t\t\t// servers send slightly invalid responses that are still accepted\n\t\t\t// by common browsers.\n\t\t\t// Always using Z_SYNC_FLUSH is what cURL does.\n\t\t\tconst zlibOptions = {\n\t\t\t\tflush: zlib.Z_SYNC_FLUSH,\n\t\t\t\tfinishFlush: zlib.Z_SYNC_FLUSH\n\t\t\t};\n\n\t\t\t// for gzip\n\t\t\tif (codings == 'gzip' || codings == 'x-gzip') {\n\t\t\t\tbody = body.pipe(zlib.createGunzip(zlibOptions));\n\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\tresolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// for deflate\n\t\t\tif (codings == 'deflate' || codings == 'x-deflate') {\n\t\t\t\t// handle the infamous raw deflate response from old servers\n\t\t\t\t// a hack for old IIS and Apache servers\n\t\t\t\tconst raw = res.pipe(new PassThrough$1());\n\t\t\t\traw.once('data', function (chunk) {\n\t\t\t\t\t// see http://stackoverflow.com/questions/37519828\n\t\t\t\t\tif ((chunk[0] & 0x0F) === 0x08) {\n\t\t\t\t\t\tbody = body.pipe(zlib.createInflate());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbody = body.pipe(zlib.createInflateRaw());\n\t\t\t\t\t}\n\t\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\t\tresolve(response);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// for br\n\t\t\tif (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') {\n\t\t\t\tbody = body.pipe(zlib.createBrotliDecompress());\n\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\tresolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// otherwise, use response as-is\n\t\t\tresponse = new Response(body, response_options);\n\t\t\tresolve(response);\n\t\t});\n\n\t\twriteToStream(req, request);\n\t});\n}\n/**\n * Redirect code matching\n *\n * @param Number code Status code\n * @return Boolean\n */\nfetch.isRedirect = function (code) {\n\treturn code === 301 || code === 302 || code === 303 || code === 307 || code === 308;\n};\n\n// expose Promise\nfetch.Promise = global.Promise;\n\nmodule.exports = exports = fetch;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = exports;\nexports.Headers = Headers;\nexports.Request = Request;\nexports.Response = Response;\nexports.FetchError = FetchError;\n","\"use strict\";\n\nvar punycode = require(\"punycode\");\nvar mappingTable = require(\"./lib/mappingTable.json\");\n\nvar PROCESSING_OPTIONS = {\n TRANSITIONAL: 0,\n NONTRANSITIONAL: 1\n};\n\nfunction normalize(str) { // fix bug in v8\n return str.split('\\u0000').map(function (s) { return s.normalize('NFC'); }).join('\\u0000');\n}\n\nfunction findStatus(val) {\n var start = 0;\n var end = mappingTable.length - 1;\n\n while (start <= end) {\n var mid = Math.floor((start + end) / 2);\n\n var target = mappingTable[mid];\n if (target[0][0] <= val && target[0][1] >= val) {\n return target;\n } else if (target[0][0] > val) {\n end = mid - 1;\n } else {\n start = mid + 1;\n }\n }\n\n return null;\n}\n\nvar regexAstralSymbols = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n\nfunction countSymbols(string) {\n return string\n // replace every surrogate pair with a BMP symbol\n .replace(regexAstralSymbols, '_')\n // then get the length\n .length;\n}\n\nfunction mapChars(domain_name, useSTD3, processing_option) {\n var hasError = false;\n var processed = \"\";\n\n var len = countSymbols(domain_name);\n for (var i = 0; i < len; ++i) {\n var codePoint = domain_name.codePointAt(i);\n var status = findStatus(codePoint);\n\n switch (status[1]) {\n case \"disallowed\":\n hasError = true;\n processed += String.fromCodePoint(codePoint);\n break;\n case \"ignored\":\n break;\n case \"mapped\":\n processed += String.fromCodePoint.apply(String, status[2]);\n break;\n case \"deviation\":\n if (processing_option === PROCESSING_OPTIONS.TRANSITIONAL) {\n processed += String.fromCodePoint.apply(String, status[2]);\n } else {\n processed += String.fromCodePoint(codePoint);\n }\n break;\n case \"valid\":\n processed += String.fromCodePoint(codePoint);\n break;\n case \"disallowed_STD3_mapped\":\n if (useSTD3) {\n hasError = true;\n processed += String.fromCodePoint(codePoint);\n } else {\n processed += String.fromCodePoint.apply(String, status[2]);\n }\n break;\n case \"disallowed_STD3_valid\":\n if (useSTD3) {\n hasError = true;\n }\n\n processed += String.fromCodePoint(codePoint);\n break;\n }\n }\n\n return {\n string: processed,\n error: hasError\n };\n}\n\nvar combiningMarksRegex = /[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08E4-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFC-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2D]|\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC00-\\uDC02\\uDC38-\\uDC46\\uDC7F-\\uDC82\\uDCB0-\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD34\\uDD73\\uDD80-\\uDD82\\uDDB3-\\uDDC0\\uDE2C-\\uDE37\\uDEDF-\\uDEEA\\uDF01-\\uDF03\\uDF3C\\uDF3E-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDCB0-\\uDCC3\\uDDAF-\\uDDB5\\uDDB8-\\uDDC0\\uDE30-\\uDE40\\uDEAB-\\uDEB7]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF51-\\uDF7E\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD83A[\\uDCD0-\\uDCD6]|\\uDB40[\\uDD00-\\uDDEF]/;\n\nfunction validateLabel(label, processing_option) {\n if (label.substr(0, 4) === \"xn--\") {\n label = punycode.toUnicode(label);\n processing_option = PROCESSING_OPTIONS.NONTRANSITIONAL;\n }\n\n var error = false;\n\n if (normalize(label) !== label ||\n (label[3] === \"-\" && label[4] === \"-\") ||\n label[0] === \"-\" || label[label.length - 1] === \"-\" ||\n label.indexOf(\".\") !== -1 ||\n label.search(combiningMarksRegex) === 0) {\n error = true;\n }\n\n var len = countSymbols(label);\n for (var i = 0; i < len; ++i) {\n var status = findStatus(label.codePointAt(i));\n if ((processing === PROCESSING_OPTIONS.TRANSITIONAL && status[1] !== \"valid\") ||\n (processing === PROCESSING_OPTIONS.NONTRANSITIONAL &&\n status[1] !== \"valid\" && status[1] !== \"deviation\")) {\n error = true;\n break;\n }\n }\n\n return {\n label: label,\n error: error\n };\n}\n\nfunction processing(domain_name, useSTD3, processing_option) {\n var result = mapChars(domain_name, useSTD3, processing_option);\n result.string = normalize(result.string);\n\n var labels = result.string.split(\".\");\n for (var i = 0; i < labels.length; ++i) {\n try {\n var validation = validateLabel(labels[i]);\n labels[i] = validation.label;\n result.error = result.error || validation.error;\n } catch(e) {\n result.error = true;\n }\n }\n\n return {\n string: labels.join(\".\"),\n error: result.error\n };\n}\n\nmodule.exports.toASCII = function(domain_name, useSTD3, processing_option, verifyDnsLength) {\n var result = processing(domain_name, useSTD3, processing_option);\n var labels = result.string.split(\".\");\n labels = labels.map(function(l) {\n try {\n return punycode.toASCII(l);\n } catch(e) {\n result.error = true;\n return l;\n }\n });\n\n if (verifyDnsLength) {\n var total = labels.slice(0, labels.length - 1).join(\".\").length;\n if (total.length > 253 || total.length === 0) {\n result.error = true;\n }\n\n for (var i=0; i < labels.length; ++i) {\n if (labels.length > 63 || labels.length === 0) {\n result.error = true;\n break;\n }\n }\n }\n\n if (result.error) return null;\n return labels.join(\".\");\n};\n\nmodule.exports.toUnicode = function(domain_name, useSTD3) {\n var result = processing(domain_name, useSTD3, PROCESSING_OPTIONS.NONTRANSITIONAL);\n\n return {\n domain: result.string,\n error: result.error\n };\n};\n\nmodule.exports.PROCESSING_OPTIONS = PROCESSING_OPTIONS;\n","\"use strict\";\n\nvar conversions = {};\nmodule.exports = conversions;\n\nfunction sign(x) {\n return x < 0 ? -1 : 1;\n}\n\nfunction evenRound(x) {\n // Round x to the nearest integer, choosing the even integer if it lies halfway between two.\n if ((x % 1) === 0.5 && (x & 1) === 0) { // [even number].5; round down (i.e. floor)\n return Math.floor(x);\n } else {\n return Math.round(x);\n }\n}\n\nfunction createNumberConversion(bitLength, typeOpts) {\n if (!typeOpts.unsigned) {\n --bitLength;\n }\n const lowerBound = typeOpts.unsigned ? 0 : -Math.pow(2, bitLength);\n const upperBound = Math.pow(2, bitLength) - 1;\n\n const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength);\n const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1);\n\n return function(V, opts) {\n if (!opts) opts = {};\n\n let x = +V;\n\n if (opts.enforceRange) {\n if (!Number.isFinite(x)) {\n throw new TypeError(\"Argument is not a finite number\");\n }\n\n x = sign(x) * Math.floor(Math.abs(x));\n if (x < lowerBound || x > upperBound) {\n throw new TypeError(\"Argument is not in byte range\");\n }\n\n return x;\n }\n\n if (!isNaN(x) && opts.clamp) {\n x = evenRound(x);\n\n if (x < lowerBound) x = lowerBound;\n if (x > upperBound) x = upperBound;\n return x;\n }\n\n if (!Number.isFinite(x) || x === 0) {\n return 0;\n }\n\n x = sign(x) * Math.floor(Math.abs(x));\n x = x % moduloVal;\n\n if (!typeOpts.unsigned && x >= moduloBound) {\n return x - moduloVal;\n } else if (typeOpts.unsigned) {\n if (x < 0) {\n x += moduloVal;\n } else if (x === -0) { // don't return negative zero\n return 0;\n }\n }\n\n return x;\n }\n}\n\nconversions[\"void\"] = function () {\n return undefined;\n};\n\nconversions[\"boolean\"] = function (val) {\n return !!val;\n};\n\nconversions[\"byte\"] = createNumberConversion(8, { unsigned: false });\nconversions[\"octet\"] = createNumberConversion(8, { unsigned: true });\n\nconversions[\"short\"] = createNumberConversion(16, { unsigned: false });\nconversions[\"unsigned short\"] = createNumberConversion(16, { unsigned: true });\n\nconversions[\"long\"] = createNumberConversion(32, { unsigned: false });\nconversions[\"unsigned long\"] = createNumberConversion(32, { unsigned: true });\n\nconversions[\"long long\"] = createNumberConversion(32, { unsigned: false, moduloBitLength: 64 });\nconversions[\"unsigned long long\"] = createNumberConversion(32, { unsigned: true, moduloBitLength: 64 });\n\nconversions[\"double\"] = function (V) {\n const x = +V;\n\n if (!Number.isFinite(x)) {\n throw new TypeError(\"Argument is not a finite floating-point value\");\n }\n\n return x;\n};\n\nconversions[\"unrestricted double\"] = function (V) {\n const x = +V;\n\n if (isNaN(x)) {\n throw new TypeError(\"Argument is NaN\");\n }\n\n return x;\n};\n\n// not quite valid, but good enough for JS\nconversions[\"float\"] = conversions[\"double\"];\nconversions[\"unrestricted float\"] = conversions[\"unrestricted double\"];\n\nconversions[\"DOMString\"] = function (V, opts) {\n if (!opts) opts = {};\n\n if (opts.treatNullAsEmptyString && V === null) {\n return \"\";\n }\n\n return String(V);\n};\n\nconversions[\"ByteString\"] = function (V, opts) {\n const x = String(V);\n let c = undefined;\n for (let i = 0; (c = x.codePointAt(i)) !== undefined; ++i) {\n if (c > 255) {\n throw new TypeError(\"Argument is not a valid bytestring\");\n }\n }\n\n return x;\n};\n\nconversions[\"USVString\"] = function (V) {\n const S = String(V);\n const n = S.length;\n const U = [];\n for (let i = 0; i < n; ++i) {\n const c = S.charCodeAt(i);\n if (c < 0xD800 || c > 0xDFFF) {\n U.push(String.fromCodePoint(c));\n } else if (0xDC00 <= c && c <= 0xDFFF) {\n U.push(String.fromCodePoint(0xFFFD));\n } else {\n if (i === n - 1) {\n U.push(String.fromCodePoint(0xFFFD));\n } else {\n const d = S.charCodeAt(i + 1);\n if (0xDC00 <= d && d <= 0xDFFF) {\n const a = c & 0x3FF;\n const b = d & 0x3FF;\n U.push(String.fromCodePoint((2 << 15) + (2 << 9) * a + b));\n ++i;\n } else {\n U.push(String.fromCodePoint(0xFFFD));\n }\n }\n }\n }\n\n return U.join('');\n};\n\nconversions[\"Date\"] = function (V, opts) {\n if (!(V instanceof Date)) {\n throw new TypeError(\"Argument is not a Date object\");\n }\n if (isNaN(V)) {\n return undefined;\n }\n\n return V;\n};\n\nconversions[\"RegExp\"] = function (V, opts) {\n if (!(V instanceof RegExp)) {\n V = new RegExp(V);\n }\n\n return V;\n};\n","\"use strict\";\nconst usm = require(\"./url-state-machine\");\n\nexports.implementation = class URLImpl {\n constructor(constructorArgs) {\n const url = constructorArgs[0];\n const base = constructorArgs[1];\n\n let parsedBase = null;\n if (base !== undefined) {\n parsedBase = usm.basicURLParse(base);\n if (parsedBase === \"failure\") {\n throw new TypeError(\"Invalid base URL\");\n }\n }\n\n const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase });\n if (parsedURL === \"failure\") {\n throw new TypeError(\"Invalid URL\");\n }\n\n this._url = parsedURL;\n\n // TODO: query stuff\n }\n\n get href() {\n return usm.serializeURL(this._url);\n }\n\n set href(v) {\n const parsedURL = usm.basicURLParse(v);\n if (parsedURL === \"failure\") {\n throw new TypeError(\"Invalid URL\");\n }\n\n this._url = parsedURL;\n }\n\n get origin() {\n return usm.serializeURLOrigin(this._url);\n }\n\n get protocol() {\n return this._url.scheme + \":\";\n }\n\n set protocol(v) {\n usm.basicURLParse(v + \":\", { url: this._url, stateOverride: \"scheme start\" });\n }\n\n get username() {\n return this._url.username;\n }\n\n set username(v) {\n if (usm.cannotHaveAUsernamePasswordPort(this._url)) {\n return;\n }\n\n usm.setTheUsername(this._url, v);\n }\n\n get password() {\n return this._url.password;\n }\n\n set password(v) {\n if (usm.cannotHaveAUsernamePasswordPort(this._url)) {\n return;\n }\n\n usm.setThePassword(this._url, v);\n }\n\n get host() {\n const url = this._url;\n\n if (url.host === null) {\n return \"\";\n }\n\n if (url.port === null) {\n return usm.serializeHost(url.host);\n }\n\n return usm.serializeHost(url.host) + \":\" + usm.serializeInteger(url.port);\n }\n\n set host(v) {\n if (this._url.cannotBeABaseURL) {\n return;\n }\n\n usm.basicURLParse(v, { url: this._url, stateOverride: \"host\" });\n }\n\n get hostname() {\n if (this._url.host === null) {\n return \"\";\n }\n\n return usm.serializeHost(this._url.host);\n }\n\n set hostname(v) {\n if (this._url.cannotBeABaseURL) {\n return;\n }\n\n usm.basicURLParse(v, { url: this._url, stateOverride: \"hostname\" });\n }\n\n get port() {\n if (this._url.port === null) {\n return \"\";\n }\n\n return usm.serializeInteger(this._url.port);\n }\n\n set port(v) {\n if (usm.cannotHaveAUsernamePasswordPort(this._url)) {\n return;\n }\n\n if (v === \"\") {\n this._url.port = null;\n } else {\n usm.basicURLParse(v, { url: this._url, stateOverride: \"port\" });\n }\n }\n\n get pathname() {\n if (this._url.cannotBeABaseURL) {\n return this._url.path[0];\n }\n\n if (this._url.path.length === 0) {\n return \"\";\n }\n\n return \"/\" + this._url.path.join(\"/\");\n }\n\n set pathname(v) {\n if (this._url.cannotBeABaseURL) {\n return;\n }\n\n this._url.path = [];\n usm.basicURLParse(v, { url: this._url, stateOverride: \"path start\" });\n }\n\n get search() {\n if (this._url.query === null || this._url.query === \"\") {\n return \"\";\n }\n\n return \"?\" + this._url.query;\n }\n\n set search(v) {\n // TODO: query stuff\n\n const url = this._url;\n\n if (v === \"\") {\n url.query = null;\n return;\n }\n\n const input = v[0] === \"?\" ? v.substring(1) : v;\n url.query = \"\";\n usm.basicURLParse(input, { url, stateOverride: \"query\" });\n }\n\n get hash() {\n if (this._url.fragment === null || this._url.fragment === \"\") {\n return \"\";\n }\n\n return \"#\" + this._url.fragment;\n }\n\n set hash(v) {\n if (v === \"\") {\n this._url.fragment = null;\n return;\n }\n\n const input = v[0] === \"#\" ? v.substring(1) : v;\n this._url.fragment = \"\";\n usm.basicURLParse(input, { url: this._url, stateOverride: \"fragment\" });\n }\n\n toJSON() {\n return this.href;\n }\n};\n","\"use strict\";\n\nconst conversions = require(\"webidl-conversions\");\nconst utils = require(\"./utils.js\");\nconst Impl = require(\".//URL-impl.js\");\n\nconst impl = utils.implSymbol;\n\nfunction URL(url) {\n if (!this || this[impl] || !(this instanceof URL)) {\n throw new TypeError(\"Failed to construct 'URL': Please use the 'new' operator, this DOM object constructor cannot be called as a function.\");\n }\n if (arguments.length < 1) {\n throw new TypeError(\"Failed to construct 'URL': 1 argument required, but only \" + arguments.length + \" present.\");\n }\n const args = [];\n for (let i = 0; i < arguments.length && i < 2; ++i) {\n args[i] = arguments[i];\n }\n args[0] = conversions[\"USVString\"](args[0]);\n if (args[1] !== undefined) {\n args[1] = conversions[\"USVString\"](args[1]);\n }\n\n module.exports.setup(this, args);\n}\n\nURL.prototype.toJSON = function toJSON() {\n if (!this || !module.exports.is(this)) {\n throw new TypeError(\"Illegal invocation\");\n }\n const args = [];\n for (let i = 0; i < arguments.length && i < 0; ++i) {\n args[i] = arguments[i];\n }\n return this[impl].toJSON.apply(this[impl], args);\n};\nObject.defineProperty(URL.prototype, \"href\", {\n get() {\n return this[impl].href;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].href = V;\n },\n enumerable: true,\n configurable: true\n});\n\nURL.prototype.toString = function () {\n if (!this || !module.exports.is(this)) {\n throw new TypeError(\"Illegal invocation\");\n }\n return this.href;\n};\n\nObject.defineProperty(URL.prototype, \"origin\", {\n get() {\n return this[impl].origin;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"protocol\", {\n get() {\n return this[impl].protocol;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].protocol = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"username\", {\n get() {\n return this[impl].username;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].username = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"password\", {\n get() {\n return this[impl].password;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].password = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"host\", {\n get() {\n return this[impl].host;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].host = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"hostname\", {\n get() {\n return this[impl].hostname;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].hostname = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"port\", {\n get() {\n return this[impl].port;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].port = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"pathname\", {\n get() {\n return this[impl].pathname;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].pathname = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"search\", {\n get() {\n return this[impl].search;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].search = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"hash\", {\n get() {\n return this[impl].hash;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].hash = V;\n },\n enumerable: true,\n configurable: true\n});\n\n\nmodule.exports = {\n is(obj) {\n return !!obj && obj[impl] instanceof Impl.implementation;\n },\n create(constructorArgs, privateData) {\n let obj = Object.create(URL.prototype);\n this.setup(obj, constructorArgs, privateData);\n return obj;\n },\n setup(obj, constructorArgs, privateData) {\n if (!privateData) privateData = {};\n privateData.wrapper = obj;\n\n obj[impl] = new Impl.implementation(constructorArgs, privateData);\n obj[impl][utils.wrapperSymbol] = obj;\n },\n interface: URL,\n expose: {\n Window: { URL: URL },\n Worker: { URL: URL }\n }\n};\n\n","\"use strict\";\n\nexports.URL = require(\"./URL\").interface;\nexports.serializeURL = require(\"./url-state-machine\").serializeURL;\nexports.serializeURLOrigin = require(\"./url-state-machine\").serializeURLOrigin;\nexports.basicURLParse = require(\"./url-state-machine\").basicURLParse;\nexports.setTheUsername = require(\"./url-state-machine\").setTheUsername;\nexports.setThePassword = require(\"./url-state-machine\").setThePassword;\nexports.serializeHost = require(\"./url-state-machine\").serializeHost;\nexports.serializeInteger = require(\"./url-state-machine\").serializeInteger;\nexports.parseURL = require(\"./url-state-machine\").parseURL;\n","\"use strict\";\r\nconst punycode = require(\"punycode\");\r\nconst tr46 = require(\"tr46\");\r\n\r\nconst specialSchemes = {\r\n ftp: 21,\r\n file: null,\r\n gopher: 70,\r\n http: 80,\r\n https: 443,\r\n ws: 80,\r\n wss: 443\r\n};\r\n\r\nconst failure = Symbol(\"failure\");\r\n\r\nfunction countSymbols(str) {\r\n return punycode.ucs2.decode(str).length;\r\n}\r\n\r\nfunction at(input, idx) {\r\n const c = input[idx];\r\n return isNaN(c) ? undefined : String.fromCodePoint(c);\r\n}\r\n\r\nfunction isASCIIDigit(c) {\r\n return c >= 0x30 && c <= 0x39;\r\n}\r\n\r\nfunction isASCIIAlpha(c) {\r\n return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A);\r\n}\r\n\r\nfunction isASCIIAlphanumeric(c) {\r\n return isASCIIAlpha(c) || isASCIIDigit(c);\r\n}\r\n\r\nfunction isASCIIHex(c) {\r\n return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66);\r\n}\r\n\r\nfunction isSingleDot(buffer) {\r\n return buffer === \".\" || buffer.toLowerCase() === \"%2e\";\r\n}\r\n\r\nfunction isDoubleDot(buffer) {\r\n buffer = buffer.toLowerCase();\r\n return buffer === \"..\" || buffer === \"%2e.\" || buffer === \".%2e\" || buffer === \"%2e%2e\";\r\n}\r\n\r\nfunction isWindowsDriveLetterCodePoints(cp1, cp2) {\r\n return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124);\r\n}\r\n\r\nfunction isWindowsDriveLetterString(string) {\r\n return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === \":\" || string[1] === \"|\");\r\n}\r\n\r\nfunction isNormalizedWindowsDriveLetterString(string) {\r\n return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === \":\";\r\n}\r\n\r\nfunction containsForbiddenHostCodePoint(string) {\r\n return string.search(/\\u0000|\\u0009|\\u000A|\\u000D|\\u0020|#|%|\\/|:|\\?|@|\\[|\\\\|\\]/) !== -1;\r\n}\r\n\r\nfunction containsForbiddenHostCodePointExcludingPercent(string) {\r\n return string.search(/\\u0000|\\u0009|\\u000A|\\u000D|\\u0020|#|\\/|:|\\?|@|\\[|\\\\|\\]/) !== -1;\r\n}\r\n\r\nfunction isSpecialScheme(scheme) {\r\n return specialSchemes[scheme] !== undefined;\r\n}\r\n\r\nfunction isSpecial(url) {\r\n return isSpecialScheme(url.scheme);\r\n}\r\n\r\nfunction defaultPort(scheme) {\r\n return specialSchemes[scheme];\r\n}\r\n\r\nfunction percentEncode(c) {\r\n let hex = c.toString(16).toUpperCase();\r\n if (hex.length === 1) {\r\n hex = \"0\" + hex;\r\n }\r\n\r\n return \"%\" + hex;\r\n}\r\n\r\nfunction utf8PercentEncode(c) {\r\n const buf = new Buffer(c);\r\n\r\n let str = \"\";\r\n\r\n for (let i = 0; i < buf.length; ++i) {\r\n str += percentEncode(buf[i]);\r\n }\r\n\r\n return str;\r\n}\r\n\r\nfunction utf8PercentDecode(str) {\r\n const input = new Buffer(str);\r\n const output = [];\r\n for (let i = 0; i < input.length; ++i) {\r\n if (input[i] !== 37) {\r\n output.push(input[i]);\r\n } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) {\r\n output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16));\r\n i += 2;\r\n } else {\r\n output.push(input[i]);\r\n }\r\n }\r\n return new Buffer(output).toString();\r\n}\r\n\r\nfunction isC0ControlPercentEncode(c) {\r\n return c <= 0x1F || c > 0x7E;\r\n}\r\n\r\nconst extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]);\r\nfunction isPathPercentEncode(c) {\r\n return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c);\r\n}\r\n\r\nconst extraUserinfoPercentEncodeSet =\r\n new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]);\r\nfunction isUserinfoPercentEncode(c) {\r\n return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c);\r\n}\r\n\r\nfunction percentEncodeChar(c, encodeSetPredicate) {\r\n const cStr = String.fromCodePoint(c);\r\n\r\n if (encodeSetPredicate(c)) {\r\n return utf8PercentEncode(cStr);\r\n }\r\n\r\n return cStr;\r\n}\r\n\r\nfunction parseIPv4Number(input) {\r\n let R = 10;\r\n\r\n if (input.length >= 2 && input.charAt(0) === \"0\" && input.charAt(1).toLowerCase() === \"x\") {\r\n input = input.substring(2);\r\n R = 16;\r\n } else if (input.length >= 2 && input.charAt(0) === \"0\") {\r\n input = input.substring(1);\r\n R = 8;\r\n }\r\n\r\n if (input === \"\") {\r\n return 0;\r\n }\r\n\r\n const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/);\r\n if (regex.test(input)) {\r\n return failure;\r\n }\r\n\r\n return parseInt(input, R);\r\n}\r\n\r\nfunction parseIPv4(input) {\r\n const parts = input.split(\".\");\r\n if (parts[parts.length - 1] === \"\") {\r\n if (parts.length > 1) {\r\n parts.pop();\r\n }\r\n }\r\n\r\n if (parts.length > 4) {\r\n return input;\r\n }\r\n\r\n const numbers = [];\r\n for (const part of parts) {\r\n if (part === \"\") {\r\n return input;\r\n }\r\n const n = parseIPv4Number(part);\r\n if (n === failure) {\r\n return input;\r\n }\r\n\r\n numbers.push(n);\r\n }\r\n\r\n for (let i = 0; i < numbers.length - 1; ++i) {\r\n if (numbers[i] > 255) {\r\n return failure;\r\n }\r\n }\r\n if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) {\r\n return failure;\r\n }\r\n\r\n let ipv4 = numbers.pop();\r\n let counter = 0;\r\n\r\n for (const n of numbers) {\r\n ipv4 += n * Math.pow(256, 3 - counter);\r\n ++counter;\r\n }\r\n\r\n return ipv4;\r\n}\r\n\r\nfunction serializeIPv4(address) {\r\n let output = \"\";\r\n let n = address;\r\n\r\n for (let i = 1; i <= 4; ++i) {\r\n output = String(n % 256) + output;\r\n if (i !== 4) {\r\n output = \".\" + output;\r\n }\r\n n = Math.floor(n / 256);\r\n }\r\n\r\n return output;\r\n}\r\n\r\nfunction parseIPv6(input) {\r\n const address = [0, 0, 0, 0, 0, 0, 0, 0];\r\n let pieceIndex = 0;\r\n let compress = null;\r\n let pointer = 0;\r\n\r\n input = punycode.ucs2.decode(input);\r\n\r\n if (input[pointer] === 58) {\r\n if (input[pointer + 1] !== 58) {\r\n return failure;\r\n }\r\n\r\n pointer += 2;\r\n ++pieceIndex;\r\n compress = pieceIndex;\r\n }\r\n\r\n while (pointer < input.length) {\r\n if (pieceIndex === 8) {\r\n return failure;\r\n }\r\n\r\n if (input[pointer] === 58) {\r\n if (compress !== null) {\r\n return failure;\r\n }\r\n ++pointer;\r\n ++pieceIndex;\r\n compress = pieceIndex;\r\n continue;\r\n }\r\n\r\n let value = 0;\r\n let length = 0;\r\n\r\n while (length < 4 && isASCIIHex(input[pointer])) {\r\n value = value * 0x10 + parseInt(at(input, pointer), 16);\r\n ++pointer;\r\n ++length;\r\n }\r\n\r\n if (input[pointer] === 46) {\r\n if (length === 0) {\r\n return failure;\r\n }\r\n\r\n pointer -= length;\r\n\r\n if (pieceIndex > 6) {\r\n return failure;\r\n }\r\n\r\n let numbersSeen = 0;\r\n\r\n while (input[pointer] !== undefined) {\r\n let ipv4Piece = null;\r\n\r\n if (numbersSeen > 0) {\r\n if (input[pointer] === 46 && numbersSeen < 4) {\r\n ++pointer;\r\n } else {\r\n return failure;\r\n }\r\n }\r\n\r\n if (!isASCIIDigit(input[pointer])) {\r\n return failure;\r\n }\r\n\r\n while (isASCIIDigit(input[pointer])) {\r\n const number = parseInt(at(input, pointer));\r\n if (ipv4Piece === null) {\r\n ipv4Piece = number;\r\n } else if (ipv4Piece === 0) {\r\n return failure;\r\n } else {\r\n ipv4Piece = ipv4Piece * 10 + number;\r\n }\r\n if (ipv4Piece > 255) {\r\n return failure;\r\n }\r\n ++pointer;\r\n }\r\n\r\n address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece;\r\n\r\n ++numbersSeen;\r\n\r\n if (numbersSeen === 2 || numbersSeen === 4) {\r\n ++pieceIndex;\r\n }\r\n }\r\n\r\n if (numbersSeen !== 4) {\r\n return failure;\r\n }\r\n\r\n break;\r\n } else if (input[pointer] === 58) {\r\n ++pointer;\r\n if (input[pointer] === undefined) {\r\n return failure;\r\n }\r\n } else if (input[pointer] !== undefined) {\r\n return failure;\r\n }\r\n\r\n address[pieceIndex] = value;\r\n ++pieceIndex;\r\n }\r\n\r\n if (compress !== null) {\r\n let swaps = pieceIndex - compress;\r\n pieceIndex = 7;\r\n while (pieceIndex !== 0 && swaps > 0) {\r\n const temp = address[compress + swaps - 1];\r\n address[compress + swaps - 1] = address[pieceIndex];\r\n address[pieceIndex] = temp;\r\n --pieceIndex;\r\n --swaps;\r\n }\r\n } else if (compress === null && pieceIndex !== 8) {\r\n return failure;\r\n }\r\n\r\n return address;\r\n}\r\n\r\nfunction serializeIPv6(address) {\r\n let output = \"\";\r\n const seqResult = findLongestZeroSequence(address);\r\n const compress = seqResult.idx;\r\n let ignore0 = false;\r\n\r\n for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) {\r\n if (ignore0 && address[pieceIndex] === 0) {\r\n continue;\r\n } else if (ignore0) {\r\n ignore0 = false;\r\n }\r\n\r\n if (compress === pieceIndex) {\r\n const separator = pieceIndex === 0 ? \"::\" : \":\";\r\n output += separator;\r\n ignore0 = true;\r\n continue;\r\n }\r\n\r\n output += address[pieceIndex].toString(16);\r\n\r\n if (pieceIndex !== 7) {\r\n output += \":\";\r\n }\r\n }\r\n\r\n return output;\r\n}\r\n\r\nfunction parseHost(input, isSpecialArg) {\r\n if (input[0] === \"[\") {\r\n if (input[input.length - 1] !== \"]\") {\r\n return failure;\r\n }\r\n\r\n return parseIPv6(input.substring(1, input.length - 1));\r\n }\r\n\r\n if (!isSpecialArg) {\r\n return parseOpaqueHost(input);\r\n }\r\n\r\n const domain = utf8PercentDecode(input);\r\n const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false);\r\n if (asciiDomain === null) {\r\n return failure;\r\n }\r\n\r\n if (containsForbiddenHostCodePoint(asciiDomain)) {\r\n return failure;\r\n }\r\n\r\n const ipv4Host = parseIPv4(asciiDomain);\r\n if (typeof ipv4Host === \"number\" || ipv4Host === failure) {\r\n return ipv4Host;\r\n }\r\n\r\n return asciiDomain;\r\n}\r\n\r\nfunction parseOpaqueHost(input) {\r\n if (containsForbiddenHostCodePointExcludingPercent(input)) {\r\n return failure;\r\n }\r\n\r\n let output = \"\";\r\n const decoded = punycode.ucs2.decode(input);\r\n for (let i = 0; i < decoded.length; ++i) {\r\n output += percentEncodeChar(decoded[i], isC0ControlPercentEncode);\r\n }\r\n return output;\r\n}\r\n\r\nfunction findLongestZeroSequence(arr) {\r\n let maxIdx = null;\r\n let maxLen = 1; // only find elements > 1\r\n let currStart = null;\r\n let currLen = 0;\r\n\r\n for (let i = 0; i < arr.length; ++i) {\r\n if (arr[i] !== 0) {\r\n if (currLen > maxLen) {\r\n maxIdx = currStart;\r\n maxLen = currLen;\r\n }\r\n\r\n currStart = null;\r\n currLen = 0;\r\n } else {\r\n if (currStart === null) {\r\n currStart = i;\r\n }\r\n ++currLen;\r\n }\r\n }\r\n\r\n // if trailing zeros\r\n if (currLen > maxLen) {\r\n maxIdx = currStart;\r\n maxLen = currLen;\r\n }\r\n\r\n return {\r\n idx: maxIdx,\r\n len: maxLen\r\n };\r\n}\r\n\r\nfunction serializeHost(host) {\r\n if (typeof host === \"number\") {\r\n return serializeIPv4(host);\r\n }\r\n\r\n // IPv6 serializer\r\n if (host instanceof Array) {\r\n return \"[\" + serializeIPv6(host) + \"]\";\r\n }\r\n\r\n return host;\r\n}\r\n\r\nfunction trimControlChars(url) {\r\n return url.replace(/^[\\u0000-\\u001F\\u0020]+|[\\u0000-\\u001F\\u0020]+$/g, \"\");\r\n}\r\n\r\nfunction trimTabAndNewline(url) {\r\n return url.replace(/\\u0009|\\u000A|\\u000D/g, \"\");\r\n}\r\n\r\nfunction shortenPath(url) {\r\n const path = url.path;\r\n if (path.length === 0) {\r\n return;\r\n }\r\n if (url.scheme === \"file\" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) {\r\n return;\r\n }\r\n\r\n path.pop();\r\n}\r\n\r\nfunction includesCredentials(url) {\r\n return url.username !== \"\" || url.password !== \"\";\r\n}\r\n\r\nfunction cannotHaveAUsernamePasswordPort(url) {\r\n return url.host === null || url.host === \"\" || url.cannotBeABaseURL || url.scheme === \"file\";\r\n}\r\n\r\nfunction isNormalizedWindowsDriveLetter(string) {\r\n return /^[A-Za-z]:$/.test(string);\r\n}\r\n\r\nfunction URLStateMachine(input, base, encodingOverride, url, stateOverride) {\r\n this.pointer = 0;\r\n this.input = input;\r\n this.base = base || null;\r\n this.encodingOverride = encodingOverride || \"utf-8\";\r\n this.stateOverride = stateOverride;\r\n this.url = url;\r\n this.failure = false;\r\n this.parseError = false;\r\n\r\n if (!this.url) {\r\n this.url = {\r\n scheme: \"\",\r\n username: \"\",\r\n password: \"\",\r\n host: null,\r\n port: null,\r\n path: [],\r\n query: null,\r\n fragment: null,\r\n\r\n cannotBeABaseURL: false\r\n };\r\n\r\n const res = trimControlChars(this.input);\r\n if (res !== this.input) {\r\n this.parseError = true;\r\n }\r\n this.input = res;\r\n }\r\n\r\n const res = trimTabAndNewline(this.input);\r\n if (res !== this.input) {\r\n this.parseError = true;\r\n }\r\n this.input = res;\r\n\r\n this.state = stateOverride || \"scheme start\";\r\n\r\n this.buffer = \"\";\r\n this.atFlag = false;\r\n this.arrFlag = false;\r\n this.passwordTokenSeenFlag = false;\r\n\r\n this.input = punycode.ucs2.decode(this.input);\r\n\r\n for (; this.pointer <= this.input.length; ++this.pointer) {\r\n const c = this.input[this.pointer];\r\n const cStr = isNaN(c) ? undefined : String.fromCodePoint(c);\r\n\r\n // exec state machine\r\n const ret = this[\"parse \" + this.state](c, cStr);\r\n if (!ret) {\r\n break; // terminate algorithm\r\n } else if (ret === failure) {\r\n this.failure = true;\r\n break;\r\n }\r\n }\r\n}\r\n\r\nURLStateMachine.prototype[\"parse scheme start\"] = function parseSchemeStart(c, cStr) {\r\n if (isASCIIAlpha(c)) {\r\n this.buffer += cStr.toLowerCase();\r\n this.state = \"scheme\";\r\n } else if (!this.stateOverride) {\r\n this.state = \"no scheme\";\r\n --this.pointer;\r\n } else {\r\n this.parseError = true;\r\n return failure;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse scheme\"] = function parseScheme(c, cStr) {\r\n if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) {\r\n this.buffer += cStr.toLowerCase();\r\n } else if (c === 58) {\r\n if (this.stateOverride) {\r\n if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) {\r\n return false;\r\n }\r\n\r\n if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) {\r\n return false;\r\n }\r\n\r\n if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === \"file\") {\r\n return false;\r\n }\r\n\r\n if (this.url.scheme === \"file\" && (this.url.host === \"\" || this.url.host === null)) {\r\n return false;\r\n }\r\n }\r\n this.url.scheme = this.buffer;\r\n this.buffer = \"\";\r\n if (this.stateOverride) {\r\n return false;\r\n }\r\n if (this.url.scheme === \"file\") {\r\n if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) {\r\n this.parseError = true;\r\n }\r\n this.state = \"file\";\r\n } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) {\r\n this.state = \"special relative or authority\";\r\n } else if (isSpecial(this.url)) {\r\n this.state = \"special authority slashes\";\r\n } else if (this.input[this.pointer + 1] === 47) {\r\n this.state = \"path or authority\";\r\n ++this.pointer;\r\n } else {\r\n this.url.cannotBeABaseURL = true;\r\n this.url.path.push(\"\");\r\n this.state = \"cannot-be-a-base-URL path\";\r\n }\r\n } else if (!this.stateOverride) {\r\n this.buffer = \"\";\r\n this.state = \"no scheme\";\r\n this.pointer = -1;\r\n } else {\r\n this.parseError = true;\r\n return failure;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse no scheme\"] = function parseNoScheme(c) {\r\n if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) {\r\n return failure;\r\n } else if (this.base.cannotBeABaseURL && c === 35) {\r\n this.url.scheme = this.base.scheme;\r\n this.url.path = this.base.path.slice();\r\n this.url.query = this.base.query;\r\n this.url.fragment = \"\";\r\n this.url.cannotBeABaseURL = true;\r\n this.state = \"fragment\";\r\n } else if (this.base.scheme === \"file\") {\r\n this.state = \"file\";\r\n --this.pointer;\r\n } else {\r\n this.state = \"relative\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse special relative or authority\"] = function parseSpecialRelativeOrAuthority(c) {\r\n if (c === 47 && this.input[this.pointer + 1] === 47) {\r\n this.state = \"special authority ignore slashes\";\r\n ++this.pointer;\r\n } else {\r\n this.parseError = true;\r\n this.state = \"relative\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse path or authority\"] = function parsePathOrAuthority(c) {\r\n if (c === 47) {\r\n this.state = \"authority\";\r\n } else {\r\n this.state = \"path\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse relative\"] = function parseRelative(c) {\r\n this.url.scheme = this.base.scheme;\r\n if (isNaN(c)) {\r\n this.url.username = this.base.username;\r\n this.url.password = this.base.password;\r\n this.url.host = this.base.host;\r\n this.url.port = this.base.port;\r\n this.url.path = this.base.path.slice();\r\n this.url.query = this.base.query;\r\n } else if (c === 47) {\r\n this.state = \"relative slash\";\r\n } else if (c === 63) {\r\n this.url.username = this.base.username;\r\n this.url.password = this.base.password;\r\n this.url.host = this.base.host;\r\n this.url.port = this.base.port;\r\n this.url.path = this.base.path.slice();\r\n this.url.query = \"\";\r\n this.state = \"query\";\r\n } else if (c === 35) {\r\n this.url.username = this.base.username;\r\n this.url.password = this.base.password;\r\n this.url.host = this.base.host;\r\n this.url.port = this.base.port;\r\n this.url.path = this.base.path.slice();\r\n this.url.query = this.base.query;\r\n this.url.fragment = \"\";\r\n this.state = \"fragment\";\r\n } else if (isSpecial(this.url) && c === 92) {\r\n this.parseError = true;\r\n this.state = \"relative slash\";\r\n } else {\r\n this.url.username = this.base.username;\r\n this.url.password = this.base.password;\r\n this.url.host = this.base.host;\r\n this.url.port = this.base.port;\r\n this.url.path = this.base.path.slice(0, this.base.path.length - 1);\r\n\r\n this.state = \"path\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse relative slash\"] = function parseRelativeSlash(c) {\r\n if (isSpecial(this.url) && (c === 47 || c === 92)) {\r\n if (c === 92) {\r\n this.parseError = true;\r\n }\r\n this.state = \"special authority ignore slashes\";\r\n } else if (c === 47) {\r\n this.state = \"authority\";\r\n } else {\r\n this.url.username = this.base.username;\r\n this.url.password = this.base.password;\r\n this.url.host = this.base.host;\r\n this.url.port = this.base.port;\r\n this.state = \"path\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse special authority slashes\"] = function parseSpecialAuthoritySlashes(c) {\r\n if (c === 47 && this.input[this.pointer + 1] === 47) {\r\n this.state = \"special authority ignore slashes\";\r\n ++this.pointer;\r\n } else {\r\n this.parseError = true;\r\n this.state = \"special authority ignore slashes\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse special authority ignore slashes\"] = function parseSpecialAuthorityIgnoreSlashes(c) {\r\n if (c !== 47 && c !== 92) {\r\n this.state = \"authority\";\r\n --this.pointer;\r\n } else {\r\n this.parseError = true;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse authority\"] = function parseAuthority(c, cStr) {\r\n if (c === 64) {\r\n this.parseError = true;\r\n if (this.atFlag) {\r\n this.buffer = \"%40\" + this.buffer;\r\n }\r\n this.atFlag = true;\r\n\r\n // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars\r\n const len = countSymbols(this.buffer);\r\n for (let pointer = 0; pointer < len; ++pointer) {\r\n const codePoint = this.buffer.codePointAt(pointer);\r\n\r\n if (codePoint === 58 && !this.passwordTokenSeenFlag) {\r\n this.passwordTokenSeenFlag = true;\r\n continue;\r\n }\r\n const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode);\r\n if (this.passwordTokenSeenFlag) {\r\n this.url.password += encodedCodePoints;\r\n } else {\r\n this.url.username += encodedCodePoints;\r\n }\r\n }\r\n this.buffer = \"\";\r\n } else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||\r\n (isSpecial(this.url) && c === 92)) {\r\n if (this.atFlag && this.buffer === \"\") {\r\n this.parseError = true;\r\n return failure;\r\n }\r\n this.pointer -= countSymbols(this.buffer) + 1;\r\n this.buffer = \"\";\r\n this.state = \"host\";\r\n } else {\r\n this.buffer += cStr;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse hostname\"] =\r\nURLStateMachine.prototype[\"parse host\"] = function parseHostName(c, cStr) {\r\n if (this.stateOverride && this.url.scheme === \"file\") {\r\n --this.pointer;\r\n this.state = \"file host\";\r\n } else if (c === 58 && !this.arrFlag) {\r\n if (this.buffer === \"\") {\r\n this.parseError = true;\r\n return failure;\r\n }\r\n\r\n const host = parseHost(this.buffer, isSpecial(this.url));\r\n if (host === failure) {\r\n return failure;\r\n }\r\n\r\n this.url.host = host;\r\n this.buffer = \"\";\r\n this.state = \"port\";\r\n if (this.stateOverride === \"hostname\") {\r\n return false;\r\n }\r\n } else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||\r\n (isSpecial(this.url) && c === 92)) {\r\n --this.pointer;\r\n if (isSpecial(this.url) && this.buffer === \"\") {\r\n this.parseError = true;\r\n return failure;\r\n } else if (this.stateOverride && this.buffer === \"\" &&\r\n (includesCredentials(this.url) || this.url.port !== null)) {\r\n this.parseError = true;\r\n return false;\r\n }\r\n\r\n const host = parseHost(this.buffer, isSpecial(this.url));\r\n if (host === failure) {\r\n return failure;\r\n }\r\n\r\n this.url.host = host;\r\n this.buffer = \"\";\r\n this.state = \"path start\";\r\n if (this.stateOverride) {\r\n return false;\r\n }\r\n } else {\r\n if (c === 91) {\r\n this.arrFlag = true;\r\n } else if (c === 93) {\r\n this.arrFlag = false;\r\n }\r\n this.buffer += cStr;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse port\"] = function parsePort(c, cStr) {\r\n if (isASCIIDigit(c)) {\r\n this.buffer += cStr;\r\n } else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||\r\n (isSpecial(this.url) && c === 92) ||\r\n this.stateOverride) {\r\n if (this.buffer !== \"\") {\r\n const port = parseInt(this.buffer);\r\n if (port > Math.pow(2, 16) - 1) {\r\n this.parseError = true;\r\n return failure;\r\n }\r\n this.url.port = port === defaultPort(this.url.scheme) ? null : port;\r\n this.buffer = \"\";\r\n }\r\n if (this.stateOverride) {\r\n return false;\r\n }\r\n this.state = \"path start\";\r\n --this.pointer;\r\n } else {\r\n this.parseError = true;\r\n return failure;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nconst fileOtherwiseCodePoints = new Set([47, 92, 63, 35]);\r\n\r\nURLStateMachine.prototype[\"parse file\"] = function parseFile(c) {\r\n this.url.scheme = \"file\";\r\n\r\n if (c === 47 || c === 92) {\r\n if (c === 92) {\r\n this.parseError = true;\r\n }\r\n this.state = \"file slash\";\r\n } else if (this.base !== null && this.base.scheme === \"file\") {\r\n if (isNaN(c)) {\r\n this.url.host = this.base.host;\r\n this.url.path = this.base.path.slice();\r\n this.url.query = this.base.query;\r\n } else if (c === 63) {\r\n this.url.host = this.base.host;\r\n this.url.path = this.base.path.slice();\r\n this.url.query = \"\";\r\n this.state = \"query\";\r\n } else if (c === 35) {\r\n this.url.host = this.base.host;\r\n this.url.path = this.base.path.slice();\r\n this.url.query = this.base.query;\r\n this.url.fragment = \"\";\r\n this.state = \"fragment\";\r\n } else {\r\n if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points\r\n !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) ||\r\n (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points\r\n !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) {\r\n this.url.host = this.base.host;\r\n this.url.path = this.base.path.slice();\r\n shortenPath(this.url);\r\n } else {\r\n this.parseError = true;\r\n }\r\n\r\n this.state = \"path\";\r\n --this.pointer;\r\n }\r\n } else {\r\n this.state = \"path\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse file slash\"] = function parseFileSlash(c) {\r\n if (c === 47 || c === 92) {\r\n if (c === 92) {\r\n this.parseError = true;\r\n }\r\n this.state = \"file host\";\r\n } else {\r\n if (this.base !== null && this.base.scheme === \"file\") {\r\n if (isNormalizedWindowsDriveLetterString(this.base.path[0])) {\r\n this.url.path.push(this.base.path[0]);\r\n } else {\r\n this.url.host = this.base.host;\r\n }\r\n }\r\n this.state = \"path\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse file host\"] = function parseFileHost(c, cStr) {\r\n if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) {\r\n --this.pointer;\r\n if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) {\r\n this.parseError = true;\r\n this.state = \"path\";\r\n } else if (this.buffer === \"\") {\r\n this.url.host = \"\";\r\n if (this.stateOverride) {\r\n return false;\r\n }\r\n this.state = \"path start\";\r\n } else {\r\n let host = parseHost(this.buffer, isSpecial(this.url));\r\n if (host === failure) {\r\n return failure;\r\n }\r\n if (host === \"localhost\") {\r\n host = \"\";\r\n }\r\n this.url.host = host;\r\n\r\n if (this.stateOverride) {\r\n return false;\r\n }\r\n\r\n this.buffer = \"\";\r\n this.state = \"path start\";\r\n }\r\n } else {\r\n this.buffer += cStr;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse path start\"] = function parsePathStart(c) {\r\n if (isSpecial(this.url)) {\r\n if (c === 92) {\r\n this.parseError = true;\r\n }\r\n this.state = \"path\";\r\n\r\n if (c !== 47 && c !== 92) {\r\n --this.pointer;\r\n }\r\n } else if (!this.stateOverride && c === 63) {\r\n this.url.query = \"\";\r\n this.state = \"query\";\r\n } else if (!this.stateOverride && c === 35) {\r\n this.url.fragment = \"\";\r\n this.state = \"fragment\";\r\n } else if (c !== undefined) {\r\n this.state = \"path\";\r\n if (c !== 47) {\r\n --this.pointer;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse path\"] = function parsePath(c) {\r\n if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) ||\r\n (!this.stateOverride && (c === 63 || c === 35))) {\r\n if (isSpecial(this.url) && c === 92) {\r\n this.parseError = true;\r\n }\r\n\r\n if (isDoubleDot(this.buffer)) {\r\n shortenPath(this.url);\r\n if (c !== 47 && !(isSpecial(this.url) && c === 92)) {\r\n this.url.path.push(\"\");\r\n }\r\n } else if (isSingleDot(this.buffer) && c !== 47 &&\r\n !(isSpecial(this.url) && c === 92)) {\r\n this.url.path.push(\"\");\r\n } else if (!isSingleDot(this.buffer)) {\r\n if (this.url.scheme === \"file\" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) {\r\n if (this.url.host !== \"\" && this.url.host !== null) {\r\n this.parseError = true;\r\n this.url.host = \"\";\r\n }\r\n this.buffer = this.buffer[0] + \":\";\r\n }\r\n this.url.path.push(this.buffer);\r\n }\r\n this.buffer = \"\";\r\n if (this.url.scheme === \"file\" && (c === undefined || c === 63 || c === 35)) {\r\n while (this.url.path.length > 1 && this.url.path[0] === \"\") {\r\n this.parseError = true;\r\n this.url.path.shift();\r\n }\r\n }\r\n if (c === 63) {\r\n this.url.query = \"\";\r\n this.state = \"query\";\r\n }\r\n if (c === 35) {\r\n this.url.fragment = \"\";\r\n this.state = \"fragment\";\r\n }\r\n } else {\r\n // TODO: If c is not a URL code point and not \"%\", parse error.\r\n\r\n if (c === 37 &&\r\n (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n !isASCIIHex(this.input[this.pointer + 2]))) {\r\n this.parseError = true;\r\n }\r\n\r\n this.buffer += percentEncodeChar(c, isPathPercentEncode);\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse cannot-be-a-base-URL path\"] = function parseCannotBeABaseURLPath(c) {\r\n if (c === 63) {\r\n this.url.query = \"\";\r\n this.state = \"query\";\r\n } else if (c === 35) {\r\n this.url.fragment = \"\";\r\n this.state = \"fragment\";\r\n } else {\r\n // TODO: Add: not a URL code point\r\n if (!isNaN(c) && c !== 37) {\r\n this.parseError = true;\r\n }\r\n\r\n if (c === 37 &&\r\n (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n !isASCIIHex(this.input[this.pointer + 2]))) {\r\n this.parseError = true;\r\n }\r\n\r\n if (!isNaN(c)) {\r\n this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode);\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse query\"] = function parseQuery(c, cStr) {\r\n if (isNaN(c) || (!this.stateOverride && c === 35)) {\r\n if (!isSpecial(this.url) || this.url.scheme === \"ws\" || this.url.scheme === \"wss\") {\r\n this.encodingOverride = \"utf-8\";\r\n }\r\n\r\n const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead\r\n for (let i = 0; i < buffer.length; ++i) {\r\n if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 ||\r\n buffer[i] === 0x3C || buffer[i] === 0x3E) {\r\n this.url.query += percentEncode(buffer[i]);\r\n } else {\r\n this.url.query += String.fromCodePoint(buffer[i]);\r\n }\r\n }\r\n\r\n this.buffer = \"\";\r\n if (c === 35) {\r\n this.url.fragment = \"\";\r\n this.state = \"fragment\";\r\n }\r\n } else {\r\n // TODO: If c is not a URL code point and not \"%\", parse error.\r\n if (c === 37 &&\r\n (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n !isASCIIHex(this.input[this.pointer + 2]))) {\r\n this.parseError = true;\r\n }\r\n\r\n this.buffer += cStr;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse fragment\"] = function parseFragment(c) {\r\n if (isNaN(c)) { // do nothing\r\n } else if (c === 0x0) {\r\n this.parseError = true;\r\n } else {\r\n // TODO: If c is not a URL code point and not \"%\", parse error.\r\n if (c === 37 &&\r\n (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n !isASCIIHex(this.input[this.pointer + 2]))) {\r\n this.parseError = true;\r\n }\r\n\r\n this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode);\r\n }\r\n\r\n return true;\r\n};\r\n\r\nfunction serializeURL(url, excludeFragment) {\r\n let output = url.scheme + \":\";\r\n if (url.host !== null) {\r\n output += \"//\";\r\n\r\n if (url.username !== \"\" || url.password !== \"\") {\r\n output += url.username;\r\n if (url.password !== \"\") {\r\n output += \":\" + url.password;\r\n }\r\n output += \"@\";\r\n }\r\n\r\n output += serializeHost(url.host);\r\n\r\n if (url.port !== null) {\r\n output += \":\" + url.port;\r\n }\r\n } else if (url.host === null && url.scheme === \"file\") {\r\n output += \"//\";\r\n }\r\n\r\n if (url.cannotBeABaseURL) {\r\n output += url.path[0];\r\n } else {\r\n for (const string of url.path) {\r\n output += \"/\" + string;\r\n }\r\n }\r\n\r\n if (url.query !== null) {\r\n output += \"?\" + url.query;\r\n }\r\n\r\n if (!excludeFragment && url.fragment !== null) {\r\n output += \"#\" + url.fragment;\r\n }\r\n\r\n return output;\r\n}\r\n\r\nfunction serializeOrigin(tuple) {\r\n let result = tuple.scheme + \"://\";\r\n result += serializeHost(tuple.host);\r\n\r\n if (tuple.port !== null) {\r\n result += \":\" + tuple.port;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nmodule.exports.serializeURL = serializeURL;\r\n\r\nmodule.exports.serializeURLOrigin = function (url) {\r\n // https://url.spec.whatwg.org/#concept-url-origin\r\n switch (url.scheme) {\r\n case \"blob\":\r\n try {\r\n return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0]));\r\n } catch (e) {\r\n // serializing an opaque origin returns \"null\"\r\n return \"null\";\r\n }\r\n case \"ftp\":\r\n case \"gopher\":\r\n case \"http\":\r\n case \"https\":\r\n case \"ws\":\r\n case \"wss\":\r\n return serializeOrigin({\r\n scheme: url.scheme,\r\n host: url.host,\r\n port: url.port\r\n });\r\n case \"file\":\r\n // spec says \"exercise to the reader\", chrome says \"file://\"\r\n return \"file://\";\r\n default:\r\n // serializing an opaque origin returns \"null\"\r\n return \"null\";\r\n }\r\n};\r\n\r\nmodule.exports.basicURLParse = function (input, options) {\r\n if (options === undefined) {\r\n options = {};\r\n }\r\n\r\n const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride);\r\n if (usm.failure) {\r\n return \"failure\";\r\n }\r\n\r\n return usm.url;\r\n};\r\n\r\nmodule.exports.setTheUsername = function (url, username) {\r\n url.username = \"\";\r\n const decoded = punycode.ucs2.decode(username);\r\n for (let i = 0; i < decoded.length; ++i) {\r\n url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode);\r\n }\r\n};\r\n\r\nmodule.exports.setThePassword = function (url, password) {\r\n url.password = \"\";\r\n const decoded = punycode.ucs2.decode(password);\r\n for (let i = 0; i < decoded.length; ++i) {\r\n url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode);\r\n }\r\n};\r\n\r\nmodule.exports.serializeHost = serializeHost;\r\n\r\nmodule.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort;\r\n\r\nmodule.exports.serializeInteger = function (integer) {\r\n return String(integer);\r\n};\r\n\r\nmodule.exports.parseURL = function (input, options) {\r\n if (options === undefined) {\r\n options = {};\r\n }\r\n\r\n // We don't handle blobs, so this just delegates:\r\n return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride });\r\n};\r\n","\"use strict\";\n\nmodule.exports.mixin = function mixin(target, source) {\n const keys = Object.getOwnPropertyNames(source);\n for (let i = 0; i < keys.length; ++i) {\n Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i]));\n }\n};\n\nmodule.exports.wrapperSymbol = Symbol(\"wrapper\");\nmodule.exports.implSymbol = Symbol(\"impl\");\n\nmodule.exports.wrapperForImpl = function (impl) {\n return impl[module.exports.wrapperSymbol];\n};\n\nmodule.exports.implForWrapper = function (wrapper) {\n return wrapper[module.exports.implSymbol];\n};\n\n","module.exports = require('./lib/tunnel');\n","'use strict';\n\nvar net = require('net');\nvar tls = require('tls');\nvar http = require('http');\nvar https = require('https');\nvar events = require('events');\nvar assert = require('assert');\nvar util = require('util');\n\n\nexports.httpOverHttp = httpOverHttp;\nexports.httpsOverHttp = httpsOverHttp;\nexports.httpOverHttps = httpOverHttps;\nexports.httpsOverHttps = httpsOverHttps;\n\n\nfunction httpOverHttp(options) {\n var agent = new TunnelingAgent(options);\n agent.request = http.request;\n return agent;\n}\n\nfunction httpsOverHttp(options) {\n var agent = new TunnelingAgent(options);\n agent.request = http.request;\n agent.createSocket = createSecureSocket;\n agent.defaultPort = 443;\n return agent;\n}\n\nfunction httpOverHttps(options) {\n var agent = new TunnelingAgent(options);\n agent.request = https.request;\n return agent;\n}\n\nfunction httpsOverHttps(options) {\n var agent = new TunnelingAgent(options);\n agent.request = https.request;\n agent.createSocket = createSecureSocket;\n agent.defaultPort = 443;\n return agent;\n}\n\n\nfunction TunnelingAgent(options) {\n var self = this;\n self.options = options || {};\n self.proxyOptions = self.options.proxy || {};\n self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets;\n self.requests = [];\n self.sockets = [];\n\n self.on('free', function onFree(socket, host, port, localAddress) {\n var options = toOptions(host, port, localAddress);\n for (var i = 0, len = self.requests.length; i < len; ++i) {\n var pending = self.requests[i];\n if (pending.host === options.host && pending.port === options.port) {\n // Detect the request to connect same origin server,\n // reuse the connection.\n self.requests.splice(i, 1);\n pending.request.onSocket(socket);\n return;\n }\n }\n socket.destroy();\n self.removeSocket(socket);\n });\n}\nutil.inherits(TunnelingAgent, events.EventEmitter);\n\nTunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) {\n var self = this;\n var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress));\n\n if (self.sockets.length >= this.maxSockets) {\n // We are over limit so we'll add it to the queue.\n self.requests.push(options);\n return;\n }\n\n // If we are under maxSockets create a new one.\n self.createSocket(options, function(socket) {\n socket.on('free', onFree);\n socket.on('close', onCloseOrRemove);\n socket.on('agentRemove', onCloseOrRemove);\n req.onSocket(socket);\n\n function onFree() {\n self.emit('free', socket, options);\n }\n\n function onCloseOrRemove(err) {\n self.removeSocket(socket);\n socket.removeListener('free', onFree);\n socket.removeListener('close', onCloseOrRemove);\n socket.removeListener('agentRemove', onCloseOrRemove);\n }\n });\n};\n\nTunnelingAgent.prototype.createSocket = function createSocket(options, cb) {\n var self = this;\n var placeholder = {};\n self.sockets.push(placeholder);\n\n var connectOptions = mergeOptions({}, self.proxyOptions, {\n method: 'CONNECT',\n path: options.host + ':' + options.port,\n agent: false,\n headers: {\n host: options.host + ':' + options.port\n }\n });\n if (options.localAddress) {\n connectOptions.localAddress = options.localAddress;\n }\n if (connectOptions.proxyAuth) {\n connectOptions.headers = connectOptions.headers || {};\n connectOptions.headers['Proxy-Authorization'] = 'Basic ' +\n new Buffer(connectOptions.proxyAuth).toString('base64');\n }\n\n debug('making CONNECT request');\n var connectReq = self.request(connectOptions);\n connectReq.useChunkedEncodingByDefault = false; // for v0.6\n connectReq.once('response', onResponse); // for v0.6\n connectReq.once('upgrade', onUpgrade); // for v0.6\n connectReq.once('connect', onConnect); // for v0.7 or later\n connectReq.once('error', onError);\n connectReq.end();\n\n function onResponse(res) {\n // Very hacky. This is necessary to avoid http-parser leaks.\n res.upgrade = true;\n }\n\n function onUpgrade(res, socket, head) {\n // Hacky.\n process.nextTick(function() {\n onConnect(res, socket, head);\n });\n }\n\n function onConnect(res, socket, head) {\n connectReq.removeAllListeners();\n socket.removeAllListeners();\n\n if (res.statusCode !== 200) {\n debug('tunneling socket could not be established, statusCode=%d',\n res.statusCode);\n socket.destroy();\n var error = new Error('tunneling socket could not be established, ' +\n 'statusCode=' + res.statusCode);\n error.code = 'ECONNRESET';\n options.request.emit('error', error);\n self.removeSocket(placeholder);\n return;\n }\n if (head.length > 0) {\n debug('got illegal response body from proxy');\n socket.destroy();\n var error = new Error('got illegal response body from proxy');\n error.code = 'ECONNRESET';\n options.request.emit('error', error);\n self.removeSocket(placeholder);\n return;\n }\n debug('tunneling connection has established');\n self.sockets[self.sockets.indexOf(placeholder)] = socket;\n return cb(socket);\n }\n\n function onError(cause) {\n connectReq.removeAllListeners();\n\n debug('tunneling socket could not be established, cause=%s\\n',\n cause.message, cause.stack);\n var error = new Error('tunneling socket could not be established, ' +\n 'cause=' + cause.message);\n error.code = 'ECONNRESET';\n options.request.emit('error', error);\n self.removeSocket(placeholder);\n }\n};\n\nTunnelingAgent.prototype.removeSocket = function removeSocket(socket) {\n var pos = this.sockets.indexOf(socket)\n if (pos === -1) {\n return;\n }\n this.sockets.splice(pos, 1);\n\n var pending = this.requests.shift();\n if (pending) {\n // If we have pending requests and a socket gets closed a new one\n // needs to be created to take over in the pool for the one that closed.\n this.createSocket(pending, function(socket) {\n pending.request.onSocket(socket);\n });\n }\n};\n\nfunction createSecureSocket(options, cb) {\n var self = this;\n TunnelingAgent.prototype.createSocket.call(self, options, function(socket) {\n var hostHeader = options.request.getHeader('host');\n var tlsOptions = mergeOptions({}, self.options, {\n socket: socket,\n servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host\n });\n\n // 0 is dummy port for v0.6\n var secureSocket = tls.connect(0, tlsOptions);\n self.sockets[self.sockets.indexOf(socket)] = secureSocket;\n cb(secureSocket);\n });\n}\n\n\nfunction toOptions(host, port, localAddress) {\n if (typeof host === 'string') { // since v0.10\n return {\n host: host,\n port: port,\n localAddress: localAddress\n };\n }\n return host; // for v0.11 or later\n}\n\nfunction mergeOptions(target) {\n for (var i = 1, len = arguments.length; i < len; ++i) {\n var overrides = arguments[i];\n if (typeof overrides === 'object') {\n var keys = Object.keys(overrides);\n for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {\n var k = keys[j];\n if (overrides[k] !== undefined) {\n target[k] = overrides[k];\n }\n }\n }\n }\n return target;\n}\n\n\nvar debug;\nif (process.env.NODE_DEBUG && /\\btunnel\\b/.test(process.env.NODE_DEBUG)) {\n debug = function() {\n var args = Array.prototype.slice.call(arguments);\n if (typeof args[0] === 'string') {\n args[0] = 'TUNNEL: ' + args[0];\n } else {\n args.unshift('TUNNEL:');\n }\n console.error.apply(console, args);\n }\n} else {\n debug = function() {};\n}\nexports.debug = debug; // for test\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"v1\", {\n enumerable: true,\n get: function () {\n return _v.default;\n }\n});\nObject.defineProperty(exports, \"v3\", {\n enumerable: true,\n get: function () {\n return _v2.default;\n }\n});\nObject.defineProperty(exports, \"v4\", {\n enumerable: true,\n get: function () {\n return _v3.default;\n }\n});\nObject.defineProperty(exports, \"v5\", {\n enumerable: true,\n get: function () {\n return _v4.default;\n }\n});\nObject.defineProperty(exports, \"NIL\", {\n enumerable: true,\n get: function () {\n return _nil.default;\n }\n});\nObject.defineProperty(exports, \"version\", {\n enumerable: true,\n get: function () {\n return _version.default;\n }\n});\nObject.defineProperty(exports, \"validate\", {\n enumerable: true,\n get: function () {\n return _validate.default;\n }\n});\nObject.defineProperty(exports, \"stringify\", {\n enumerable: true,\n get: function () {\n return _stringify.default;\n }\n});\nObject.defineProperty(exports, \"parse\", {\n enumerable: true,\n get: function () {\n return _parse.default;\n }\n});\n\nvar _v = _interopRequireDefault(require(\"./v1.js\"));\n\nvar _v2 = _interopRequireDefault(require(\"./v3.js\"));\n\nvar _v3 = _interopRequireDefault(require(\"./v4.js\"));\n\nvar _v4 = _interopRequireDefault(require(\"./v5.js\"));\n\nvar _nil = _interopRequireDefault(require(\"./nil.js\"));\n\nvar _version = _interopRequireDefault(require(\"./version.js\"));\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nvar _parse = _interopRequireDefault(require(\"./parse.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _crypto = _interopRequireDefault(require(\"crypto\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction md5(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n } else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n\n return _crypto.default.createHash('md5').update(bytes).digest();\n}\n\nvar _default = md5;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _default = '00000000-0000-0000-0000-000000000000';\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction parse(uuid) {\n if (!(0, _validate.default)(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n let v;\n const arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nvar _default = parse;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = rng;\n\nvar _crypto = _interopRequireDefault(require(\"crypto\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\n\nfunction rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n _crypto.default.randomFillSync(rnds8Pool);\n\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _crypto = _interopRequireDefault(require(\"crypto\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction sha1(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n } else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n\n return _crypto.default.createHash('sha1').update(bytes).digest();\n}\n\nvar _default = sha1;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!(0, _validate.default)(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nvar _default = stringify;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _rng = _interopRequireDefault(require(\"./rng.js\"));\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\nlet _nodeId;\n\nlet _clockseq; // Previous uuid creation time\n\n\nlet _lastMSecs = 0;\nlet _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n let i = buf && offset || 0;\n const b = buf || new Array(16);\n options = options || {};\n let node = options.node || _nodeId;\n let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n const seedBytes = options.random || (options.rng || _rng.default)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (let n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || (0, _stringify.default)(b);\n}\n\nvar _default = v1;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _v = _interopRequireDefault(require(\"./v35.js\"));\n\nvar _md = _interopRequireDefault(require(\"./md5.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst v3 = (0, _v.default)('v3', 0x30, _md.default);\nvar _default = v3;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = _default;\nexports.URL = exports.DNS = void 0;\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nvar _parse = _interopRequireDefault(require(\"./parse.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n const bytes = [];\n\n for (let i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nconst DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexports.DNS = DNS;\nconst URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexports.URL = URL;\n\nfunction _default(name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = (0, _parse.default)(namespace);\n }\n\n if (namespace.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n let bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return (0, _stringify.default)(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _rng = _interopRequireDefault(require(\"./rng.js\"));\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction v4(options, buf, offset) {\n options = options || {};\n\n const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return (0, _stringify.default)(rnds);\n}\n\nvar _default = v4;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _v = _interopRequireDefault(require(\"./v35.js\"));\n\nvar _sha = _interopRequireDefault(require(\"./sha1.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst v5 = (0, _v.default)('v5', 0x50, _sha.default);\nvar _default = v5;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _regex = _interopRequireDefault(require(\"./regex.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && _regex.default.test(uuid);\n}\n\nvar _default = validate;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction version(uuid) {\n if (!(0, _validate.default)(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.substr(14, 1), 16);\n}\n\nvar _default = version;\nexports.default = _default;",null,"module.exports = require(\"assert\");","module.exports = require(\"crypto\");","module.exports = require(\"events\");","module.exports = require(\"fs\");","module.exports = require(\"http\");","module.exports = require(\"https\");","module.exports = require(\"net\");","module.exports = require(\"os\");","module.exports = require(\"path\");","module.exports = require(\"punycode\");","module.exports = require(\"stream\");","module.exports = require(\"tls\");","module.exports = require(\"url\");","module.exports = require(\"util\");","module.exports = require(\"zlib\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tvar threw = true;\n\ttry {\n\t\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\t\tthrew = false;\n\t} finally {\n\t\tif(threw) delete __webpack_module_cache__[moduleId];\n\t}\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","\nif (typeof __webpack_require__ !== 'undefined') __webpack_require__.ab = __dirname + \"/\";","\"use strict\";\n//\n// Copyright (C) 2021 CloudTruth, Inc.\n//\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst run_1 = require(\"./run\");\n(0, run_1.run)();\n"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"index.js","mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxkFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACpJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzLA;AACA;AACA;AACA;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxhBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChqDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AC5LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACnMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;AChxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACnBA;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACvQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpBA;;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;ACAA;;;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC7BA;AACA;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA","sources":["../webpack://configure-action/./lib/gen/Api.js","../webpack://configure-action/./lib/gen/http-client.js","../webpack://configure-action/./lib/run.js","../webpack://configure-action/./lib/version.js","../webpack://configure-action/./node_modules/@actions/core/lib/command.js","../webpack://configure-action/./node_modules/@actions/core/lib/core.js","../webpack://configure-action/./node_modules/@actions/core/lib/file-command.js","../webpack://configure-action/./node_modules/@actions/core/lib/oidc-utils.js","../webpack://configure-action/./node_modules/@actions/core/lib/utils.js","../webpack://configure-action/./node_modules/@actions/http-client/auth.js","../webpack://configure-action/./node_modules/@actions/http-client/index.js","../webpack://configure-action/./node_modules/@actions/http-client/proxy.js","../webpack://configure-action/./node_modules/isomorphic-fetch/fetch-npm-node.js","../webpack://configure-action/./node_modules/node-fetch/lib/index.js","../webpack://configure-action/./node_modules/node-fetch/node_modules/tr46/index.js","../webpack://configure-action/./node_modules/node-fetch/node_modules/webidl-conversions/lib/index.js","../webpack://configure-action/./node_modules/node-fetch/node_modules/whatwg-url/lib/URL-impl.js","../webpack://configure-action/./node_modules/node-fetch/node_modules/whatwg-url/lib/URL.js","../webpack://configure-action/./node_modules/node-fetch/node_modules/whatwg-url/lib/public-api.js","../webpack://configure-action/./node_modules/node-fetch/node_modules/whatwg-url/lib/url-state-machine.js","../webpack://configure-action/./node_modules/node-fetch/node_modules/whatwg-url/lib/utils.js","../webpack://configure-action/./node_modules/tunnel/index.js","../webpack://configure-action/./node_modules/tunnel/lib/tunnel.js","../webpack://configure-action/./node_modules/uuid/dist/index.js","../webpack://configure-action/./node_modules/uuid/dist/md5.js","../webpack://configure-action/./node_modules/uuid/dist/nil.js","../webpack://configure-action/./node_modules/uuid/dist/parse.js","../webpack://configure-action/./node_modules/uuid/dist/regex.js","../webpack://configure-action/./node_modules/uuid/dist/rng.js","../webpack://configure-action/./node_modules/uuid/dist/sha1.js","../webpack://configure-action/./node_modules/uuid/dist/stringify.js","../webpack://configure-action/./node_modules/uuid/dist/v1.js","../webpack://configure-action/./node_modules/uuid/dist/v3.js","../webpack://configure-action/./node_modules/uuid/dist/v35.js","../webpack://configure-action/./node_modules/uuid/dist/v4.js","../webpack://configure-action/./node_modules/uuid/dist/v5.js","../webpack://configure-action/./node_modules/uuid/dist/validate.js","../webpack://configure-action/./node_modules/uuid/dist/version.js","../webpack://configure-action/./node_modules/@vercel/ncc/dist/ncc/@@notfound.js","../webpack://configure-action/external node-commonjs \"assert\"","../webpack://configure-action/external node-commonjs \"crypto\"","../webpack://configure-action/external node-commonjs \"events\"","../webpack://configure-action/external node-commonjs \"fs\"","../webpack://configure-action/external node-commonjs \"http\"","../webpack://configure-action/external node-commonjs \"https\"","../webpack://configure-action/external node-commonjs \"net\"","../webpack://configure-action/external node-commonjs \"os\"","../webpack://configure-action/external node-commonjs \"path\"","../webpack://configure-action/external node-commonjs \"punycode\"","../webpack://configure-action/external node-commonjs \"stream\"","../webpack://configure-action/external node-commonjs \"tls\"","../webpack://configure-action/external node-commonjs \"url\"","../webpack://configure-action/external node-commonjs \"util\"","../webpack://configure-action/external node-commonjs \"zlib\"","../webpack://configure-action/webpack/bootstrap","../webpack://configure-action/webpack/runtime/compat","../webpack://configure-action/./lib/main.js"],"sourcesContent":["\"use strict\";\n/* eslint-disable */\n/* tslint:disable */\n/*\n * ---------------------------------------------------------------\n * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ##\n * ## ##\n * ## AUTHOR: acacode ##\n * ## SOURCE: https://github.com/acacode/swagger-typescript-api ##\n * ---------------------------------------------------------------\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Api = void 0;\nconst http_client_1 = require(\"./http-client\");\nclass Api extends http_client_1.HttpClient {\n constructor() {\n super(...arguments);\n /**\n * @description OpenApi3 schema for this API. Format can be selected via content negotiation. - YAML: application/vnd.oai.openapi - JSON: application/vnd.oai.openapi+json\n *\n * @tags api\n * @name ApiSchemaRetrieve\n * @request GET:/api/schema/\n * @secure\n * @response `200` `Record`\n */\n this.apiSchemaRetrieve = (query, params = {}) => this.request({\n path: `/api/schema/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description A searchable log of all the actions taken by users and service accounts within the organization.\n *\n * @tags audit\n * @name AuditList\n * @request GET:/api/v1/audit/\n * @secure\n * @response `200` `PaginatedAuditTrailList`\n */\n this.auditList = (query, params = {}) => this.request({\n path: `/api/v1/audit/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Retrieve one record from the audit log.\n *\n * @tags audit\n * @name AuditRetrieve\n * @request GET:/api/v1/audit/{id}/\n * @secure\n * @response `200` `AuditTrail`\n */\n this.auditRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/audit/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Summary information about the organization's audit trail.\n *\n * @tags audit\n * @name AuditSummaryRetrieve\n * @request GET:/api/v1/audit/summary/\n * @secure\n * @response `200` `AuditTrailSummary`\n */\n this.auditSummaryRetrieve = (params = {}) => this.request({\n path: `/api/v1/audit/summary/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags backup\n * @name BackupSnapshotCreate\n * @summary Get a snapshot of all Projects with parameters\n * @request POST:/api/v1/backup/snapshot/\n * @secure\n * @response `200` `BackupDataSnapshot`\n */\n this.backupSnapshotCreate = (params = {}) => this.request({\n path: `/api/v1/backup/snapshot/`,\n method: 'POST',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags environments\n * @name EnvironmentsList\n * @request GET:/api/v1/environments/\n * @secure\n * @response `200` `PaginatedEnvironmentList`\n */\n this.environmentsList = (query, params = {}) => this.request({\n path: `/api/v1/environments/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags environments\n * @name EnvironmentsCreate\n * @request POST:/api/v1/environments/\n * @secure\n * @response `201` `Environment`\n */\n this.environmentsCreate = (data, params = {}) => this.request({\n path: `/api/v1/environments/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description The push operations that this environment was involved in.\n *\n * @tags environments\n * @name EnvironmentsPushesList\n * @summary List push operations.\n * @request GET:/api/v1/environments/{environment_pk}/pushes/\n * @secure\n * @response `200` `PaginatedTaskStepList`\n */\n this.environmentsPushesList = ({ environmentPk, ...query }, params = {}) => this.request({\n path: `/api/v1/environments/${environmentPk}/pushes/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Tags allow you to name stable points in time for your configuration. Any query API that accepts an `as_of` option will also accept a `tag` option however they are mutually exclusive.\n *\n * @tags environments\n * @name EnvironmentsTagsList\n * @request GET:/api/v1/environments/{environment_pk}/tags/\n * @secure\n * @response `200` `PaginatedTagList`\n */\n this.environmentsTagsList = ({ environmentPk, ...query }, params = {}) => this.request({\n path: `/api/v1/environments/${environmentPk}/tags/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Tags allow you to name stable points in time for your configuration. Any query API that accepts an `as_of` option will also accept a `tag` option however they are mutually exclusive.\n *\n * @tags environments\n * @name EnvironmentsTagsCreate\n * @request POST:/api/v1/environments/{environment_pk}/tags/\n * @secure\n * @response `201` `Tag`\n */\n this.environmentsTagsCreate = (environmentPk, data, params = {}) => this.request({\n path: `/api/v1/environments/${environmentPk}/tags/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Tags allow you to name stable points in time for your configuration. Any query API that accepts an `as_of` option will also accept a `tag` option however they are mutually exclusive.\n *\n * @tags environments\n * @name EnvironmentsTagsRetrieve\n * @request GET:/api/v1/environments/{environment_pk}/tags/{id}/\n * @secure\n * @response `200` `Tag`\n */\n this.environmentsTagsRetrieve = (environmentPk, id, params = {}) => this.request({\n path: `/api/v1/environments/${environmentPk}/tags/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Tags allow you to name stable points in time for your configuration. Any query API that accepts an `as_of` option will also accept a `tag` option however they are mutually exclusive.\n *\n * @tags environments\n * @name EnvironmentsTagsUpdate\n * @request PUT:/api/v1/environments/{environment_pk}/tags/{id}/\n * @secure\n * @response `200` `TagUpdate`\n */\n this.environmentsTagsUpdate = (environmentPk, id, data, params = {}) => this.request({\n path: `/api/v1/environments/${environmentPk}/tags/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Tags allow you to name stable points in time for your configuration. Any query API that accepts an `as_of` option will also accept a `tag` option however they are mutually exclusive.\n *\n * @tags environments\n * @name EnvironmentsTagsPartialUpdate\n * @request PATCH:/api/v1/environments/{environment_pk}/tags/{id}/\n * @secure\n * @response `200` `TagUpdate`\n */\n this.environmentsTagsPartialUpdate = (environmentPk, id, data, params = {}) => this.request({\n path: `/api/v1/environments/${environmentPk}/tags/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Tags allow you to name stable points in time for your configuration. Any query API that accepts an `as_of` option will also accept a `tag` option however they are mutually exclusive.\n *\n * @tags environments\n * @name EnvironmentsTagsDestroy\n * @request DELETE:/api/v1/environments/{environment_pk}/tags/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.environmentsTagsDestroy = (environmentPk, id, params = {}) => this.request({\n path: `/api/v1/environments/${environmentPk}/tags/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags environments\n * @name EnvironmentsRetrieve\n * @request GET:/api/v1/environments/{id}/\n * @secure\n * @response `200` `Environment`\n */\n this.environmentsRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/environments/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags environments\n * @name EnvironmentsUpdate\n * @request PUT:/api/v1/environments/{id}/\n * @secure\n * @response `200` `Environment`\n */\n this.environmentsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/environments/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags environments\n * @name EnvironmentsPartialUpdate\n * @request PATCH:/api/v1/environments/{id}/\n * @secure\n * @response `200` `Environment`\n */\n this.environmentsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/environments/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags environments\n * @name EnvironmentsDestroy\n * @request DELETE:/api/v1/environments/{id}/\n * @secure\n * @response `204` `void` Environment destroyed.\n * @response `409` `void` The environment has children and cannot be removed.\n */\n this.environmentsDestroy = (id, params = {}) => this.request({\n path: `/api/v1/environments/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Grants allow you to enable access control on Environments and Projects. Grants are part of the role-based access control feature set, so if your subscription does not have support for it, these paths will return a 403 Forbidden error.\n *\n * @tags grants\n * @name GrantsList\n * @request GET:/api/v1/grants/\n * @secure\n * @response `200` `PaginatedGrantList`\n * @response `403` `void` Forbidden: see response for further details.\n */\n this.grantsList = (query, params = {}) => this.request({\n path: `/api/v1/grants/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Grants allow you to enable access control on Environments and Projects. Grants are part of the role-based access control feature set, so if your subscription does not have support for it, these paths will return a 403 Forbidden error.\n *\n * @tags grants\n * @name GrantsCreate\n * @request POST:/api/v1/grants/\n * @secure\n * @response `201` `Grant`\n * @response `403` `void` Forbidden: see response for further details.\n */\n this.grantsCreate = (data, params = {}) => this.request({\n path: `/api/v1/grants/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Grants allow you to enable access control on Environments and Projects. Grants are part of the role-based access control feature set, so if your subscription does not have support for it, these paths will return a 403 Forbidden error.\n *\n * @tags grants\n * @name GrantsRetrieve\n * @request GET:/api/v1/grants/{id}/\n * @secure\n * @response `200` `Grant`\n * @response `403` `void` Forbidden: see response for further details.\n */\n this.grantsRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/grants/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Grants allow you to enable access control on Environments and Projects. Grants are part of the role-based access control feature set, so if your subscription does not have support for it, these paths will return a 403 Forbidden error.\n *\n * @tags grants\n * @name GrantsUpdate\n * @request PUT:/api/v1/grants/{id}/\n * @secure\n * @response `200` `Grant`\n * @response `403` `void` Forbidden: see response for further details.\n */\n this.grantsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/grants/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Grants allow you to enable access control on Environments and Projects. Grants are part of the role-based access control feature set, so if your subscription does not have support for it, these paths will return a 403 Forbidden error.\n *\n * @tags grants\n * @name GrantsPartialUpdate\n * @request PATCH:/api/v1/grants/{id}/\n * @secure\n * @response `200` `Grant`\n * @response `403` `void` Forbidden: see response for further details.\n */\n this.grantsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/grants/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Grants allow you to enable access control on Environments and Projects. Grants are part of the role-based access control feature set, so if your subscription does not have support for it, these paths will return a 403 Forbidden error.\n *\n * @tags grants\n * @name GrantsDestroy\n * @request DELETE:/api/v1/grants/{id}/\n * @secure\n * @response `204` `void` Deleted.\n * @response `403` `void` Forbidden: see response for further details.\n */\n this.grantsDestroy = (id, params = {}) => this.request({\n path: `/api/v1/grants/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Removes grants matching the query parameters atomically. Use this technique to disable access control on a scope, or remove all grants for a user.\n *\n * @tags grants\n * @name GrantsMultiDestroy\n * @request DELETE:/api/v1/grants/multi/\n * @secure\n * @response `200` `Grant`\n * @response `403` `void` Forbidden: see response for further details.\n */\n this.grantsMultiDestroy = (params = {}) => this.request({\n path: `/api/v1/grants/multi/`,\n method: 'DELETE',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Import parameters from the provided data.\n *\n * @tags import\n * @name ImportCreate\n * @request POST:/api/v1/import/\n * @secure\n * @response `201` `ImportCreateResponse`\n */\n this.importCreate = (query, data, params = {}) => this.request({\n path: `/api/v1/import/`,\n method: 'POST',\n query: query,\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsList\n * @request GET:/api/v1/integrations/aws/\n * @secure\n * @response `200` `PaginatedAwsIntegrationList`\n */\n this.integrationsAwsList = (query, params = {}) => this.request({\n path: `/api/v1/integrations/aws/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description ### Description ### Establishes an AWS Integration for your CloudTruth organization. ### Pre-Conditions ### - An AWS Integration for the account and role cannot already exist. ### Post-Conditions ### - You must establish an IAM role and trust relationship based on the Role Name and the External ID.\n *\n * @tags integrations\n * @name IntegrationsAwsCreate\n * @summary Establishes an AWS Integration.\n * @request POST:/api/v1/integrations/aws/\n * @secure\n * @response `201` `AwsIntegration`\n */\n this.integrationsAwsCreate = (data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsList\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pulls/\n * @secure\n * @response `200` `PaginatedAwsPullList`\n */\n this.integrationsAwsPullsList = ({ awsintegrationPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsCreate\n * @request POST:/api/v1/integrations/aws/{awsintegration_pk}/pulls/\n * @secure\n * @response `201` `AwsPull`\n */\n this.integrationsAwsPullsCreate = (awsintegrationPk, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsTasksList\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/\n * @secure\n * @response `200` `PaginatedAwsPullTaskList`\n */\n this.integrationsAwsPullsTasksList = ({ awsintegrationPk, awspullPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${awspullPk}/tasks/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsTasksStepsList\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/{awspulltask_pk}/steps/\n * @secure\n * @response `200` `PaginatedAwsPullTaskStepList`\n */\n this.integrationsAwsPullsTasksStepsList = ({ awsintegrationPk, awspullPk, awspulltaskPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${awspullPk}/tasks/${awspulltaskPk}/steps/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsTasksStepsRetrieve\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/{awspulltask_pk}/steps/{id}/\n * @secure\n * @response `200` `AwsPullTaskStep`\n */\n this.integrationsAwsPullsTasksStepsRetrieve = (awsintegrationPk, awspullPk, awspulltaskPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${awspullPk}/tasks/${awspulltaskPk}/steps/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsTasksRetrieve\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/{id}/\n * @secure\n * @response `200` `AwsPullTask`\n */\n this.integrationsAwsPullsTasksRetrieve = (awsintegrationPk, awspullPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${awspullPk}/tasks/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsRetrieve\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{id}/\n * @secure\n * @response `200` `AwsPull`\n */\n this.integrationsAwsPullsRetrieve = (awsintegrationPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsUpdate\n * @request PUT:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{id}/\n * @secure\n * @response `200` `AwsPull`\n */\n this.integrationsAwsPullsUpdate = (awsintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsPartialUpdate\n * @request PATCH:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{id}/\n * @secure\n * @response `200` `AwsPull`\n */\n this.integrationsAwsPullsPartialUpdate = (awsintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPullsDestroy\n * @request DELETE:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{id}/\n * @secure\n * @response `403` `void` Cannot destroy innate mapped pull of a data integration.\n */\n this.integrationsAwsPullsDestroy = (awsintegrationPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Enqueue a pull synchronization task for mapped external values accessible with this integration.\n *\n * @tags integrations\n * @name IntegrationsAwsPullsSyncCreate\n * @request POST:/api/v1/integrations/aws/{awsintegration_pk}/pulls/{id}/sync/\n * @secure\n * @response `202` `void` Synchronization task enqueued.\n */\n this.integrationsAwsPullsSyncCreate = (awsintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pulls/${id}/sync/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesList\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pushes/\n * @secure\n * @response `200` `PaginatedAwsPushList`\n */\n this.integrationsAwsPushesList = ({ awsintegrationPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesCreate\n * @request POST:/api/v1/integrations/aws/{awsintegration_pk}/pushes/\n * @secure\n * @response `201` `AwsPush`\n */\n this.integrationsAwsPushesCreate = (awsintegrationPk, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesTasksList\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{awspush_pk}/tasks/\n * @secure\n * @response `200` `PaginatedAwsPushTaskList`\n */\n this.integrationsAwsPushesTasksList = ({ awsintegrationPk, awspushPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${awspushPk}/tasks/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesTasksStepsList\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{awspush_pk}/tasks/{awspushtask_pk}/steps/\n * @secure\n * @response `200` `PaginatedAwsPushTaskStepList`\n */\n this.integrationsAwsPushesTasksStepsList = ({ awsintegrationPk, awspushPk, awspushtaskPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${awspushPk}/tasks/${awspushtaskPk}/steps/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesTasksStepsRetrieve\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{awspush_pk}/tasks/{awspushtask_pk}/steps/{id}/\n * @secure\n * @response `200` `AwsPushTaskStep`\n */\n this.integrationsAwsPushesTasksStepsRetrieve = (awsintegrationPk, awspushPk, awspushtaskPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${awspushPk}/tasks/${awspushtaskPk}/steps/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesTasksRetrieve\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{awspush_pk}/tasks/{id}/\n * @secure\n * @response `200` `AwsPushTask`\n */\n this.integrationsAwsPushesTasksRetrieve = (awsintegrationPk, awspushPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${awspushPk}/tasks/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesRetrieve\n * @request GET:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{id}/\n * @secure\n * @response `200` `AwsPush`\n */\n this.integrationsAwsPushesRetrieve = (awsintegrationPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesUpdate\n * @request PUT:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{id}/\n * @secure\n * @response `200` `AwsPushUpdate`\n */\n this.integrationsAwsPushesUpdate = (awsintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesPartialUpdate\n * @request PATCH:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{id}/\n * @secure\n * @response `200` `AwsPushUpdate`\n */\n this.integrationsAwsPushesPartialUpdate = (awsintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPushesDestroy\n * @request DELETE:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.integrationsAwsPushesDestroy = (awsintegrationPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Enqueue a push synchronization task.\n *\n * @tags integrations\n * @name IntegrationsAwsPushesSyncCreate\n * @request POST:/api/v1/integrations/aws/{awsintegration_pk}/pushes/{id}/sync/\n * @secure\n * @response `202` `void` Synchronization task enqueued.\n */\n this.integrationsAwsPushesSyncCreate = (awsintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${awsintegrationPk}/pushes/${id}/sync/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsRetrieve\n * @summary Get details of an AWS Integration.\n * @request GET:/api/v1/integrations/aws/{id}/\n * @secure\n * @response `200` `AwsIntegration`\n */\n this.integrationsAwsRetrieve = ({ id, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${id}/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsUpdate\n * @request PUT:/api/v1/integrations/aws/{id}/\n * @secure\n * @response `200` `AwsIntegration`\n */\n this.integrationsAwsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsPartialUpdate\n * @request PATCH:/api/v1/integrations/aws/{id}/\n * @secure\n * @response `200` `AwsIntegration`\n */\n this.integrationsAwsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsAwsDestroy\n * @summary Delete an AWS integration.\n * @request DELETE:/api/v1/integrations/aws/{id}/\n * @secure\n * @response `204` `void` Integration removed.\n * @response `409` `void` The integration is used by one (or more) Value(s) and cannot be removed.\n */\n this.integrationsAwsDestroy = ({ id, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${id}/`,\n method: 'DELETE',\n query: query,\n secure: true,\n ...params\n });\n /**\n * @description Probe a region and service using a pattern matching string that can be used in pull actions. This allows the pattern match to be checked for correctness and preview what will match during creation of the string.\n *\n * @tags integrations\n * @name IntegrationsAwsScanCreate\n * @summary Evaluate a potential pull pattern and understand what it will match.\n * @request POST:/api/v1/integrations/aws/{id}/scan/\n * @secure\n * @response `200` `DiscoveryResult`\n */\n this.integrationsAwsScanCreate = (id, data, params = {}) => this.request({\n path: `/api/v1/integrations/aws/${id}/scan/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description ### Description ### Queries a third-party integration to retrieve the data specified by the FQN. You can start exploring by not specifying an 'fqn', which will return a list of FQNs for the existing third-party integrations. Third-party integrations can be configured via the Integrations section of the web application.\n *\n * @tags integrations\n * @name IntegrationsExploreList\n * @summary Retrieve third-party integration data for the specified FQN.\n * @request GET:/api/v1/integrations/explore/\n * @secure\n * @response `200` `PaginatedIntegrationNodeList` The content at the FQN.\n * @response `400` `void` Invalid FQN requested.\n * @response `403` `void` Unable to contact the third-party integration.\n * @response `415` `void` Unsupported content type (usually this means it is binary).\n * @response `507` `void` Content exceeds internal size limit of 1MB.\n */\n this.integrationsExploreList = (query, params = {}) => this.request({\n path: `/api/v1/integrations/explore/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubList\n * @request GET:/api/v1/integrations/github/\n * @secure\n * @response `200` `PaginatedGitHubIntegrationList`\n */\n this.integrationsGithubList = (query, params = {}) => this.request({\n path: `/api/v1/integrations/github/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description ### Description ### Establishes a GitHub Integration in your CloudTruth organization. ### Pre-Conditions ### - The user must be an Administrator or Owner of your organization. - A GitHub Integration with the `installation_id` cannot already exist in this organization. - The user must first install the CloudTruth GitHub Application in their GitHub organization and obtain the `installation_id` of the application in order to create the integration. ### Initiating the GitHub Application Installation ### - Go to `https://github.com/apps/GITHUB_APP_NAME/installations/new?state=` - On successful installation the browser will return to `https://APP_URL/app_setup/github` (configured in ctops/bin/github*) and provide the `installation_id` in the URI. - POST to this api to verify and establish the integration.\n *\n * @tags integrations\n * @name IntegrationsGithubCreate\n * @summary Establishes a GitHub Integration.\n * @request POST:/api/v1/integrations/github/\n * @secure\n * @response `201` `GitHubIntegration`\n */\n this.integrationsGithubCreate = (data, params = {}) => this.request({\n path: `/api/v1/integrations/github/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsList\n * @request GET:/api/v1/integrations/github/{githubintegration_pk}/pulls/\n * @secure\n * @response `200` `PaginatedGitHubPullList`\n */\n this.integrationsGithubPullsList = ({ githubintegrationPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsTasksList\n * @request GET:/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/\n * @secure\n * @response `200` `PaginatedGitHubPullTaskList`\n */\n this.integrationsGithubPullsTasksList = ({ githubintegrationPk, githubpullPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${githubpullPk}/tasks/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsTasksStepsList\n * @request GET:/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/{githubpulltask_pk}/steps/\n * @secure\n * @response `200` `PaginatedGitHubPullTaskStepList`\n */\n this.integrationsGithubPullsTasksStepsList = ({ githubintegrationPk, githubpullPk, githubpulltaskPk, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${githubpullPk}/tasks/${githubpulltaskPk}/steps/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsTasksStepsRetrieve\n * @request GET:/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/{githubpulltask_pk}/steps/{id}/\n * @secure\n * @response `200` `GitHubPullTaskStep`\n */\n this.integrationsGithubPullsTasksStepsRetrieve = (githubintegrationPk, githubpullPk, githubpulltaskPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${githubpullPk}/tasks/${githubpulltaskPk}/steps/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsTasksRetrieve\n * @request GET:/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/{id}/\n * @secure\n * @response `200` `GitHubPullTask`\n */\n this.integrationsGithubPullsTasksRetrieve = (githubintegrationPk, githubpullPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${githubpullPk}/tasks/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsRetrieve\n * @request GET:/api/v1/integrations/github/{githubintegration_pk}/pulls/{id}/\n * @secure\n * @response `200` `GitHubPull`\n */\n this.integrationsGithubPullsRetrieve = (githubintegrationPk, id, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsUpdate\n * @request PUT:/api/v1/integrations/github/{githubintegration_pk}/pulls/{id}/\n * @secure\n * @response `200` `GitHubPull`\n */\n this.integrationsGithubPullsUpdate = (githubintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubPullsPartialUpdate\n * @request PATCH:/api/v1/integrations/github/{githubintegration_pk}/pulls/{id}/\n * @secure\n * @response `200` `GitHubPull`\n */\n this.integrationsGithubPullsPartialUpdate = (githubintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Enqueue a pull synchronization task for mapped external values accessible with this integration.\n *\n * @tags integrations\n * @name IntegrationsGithubPullsSyncCreate\n * @request POST:/api/v1/integrations/github/{githubintegration_pk}/pulls/{id}/sync/\n * @secure\n * @response `202` `void` Synchronization task enqueued.\n */\n this.integrationsGithubPullsSyncCreate = (githubintegrationPk, id, data, params = {}) => this.request({\n path: `/api/v1/integrations/github/${githubintegrationPk}/pulls/${id}/sync/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubRetrieve\n * @summary Get details of a GitHub Integration.\n * @request GET:/api/v1/integrations/github/{id}/\n * @secure\n * @response `200` `GitHubIntegration`\n */\n this.integrationsGithubRetrieve = ({ id, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/github/${id}/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags integrations\n * @name IntegrationsGithubDestroy\n * @summary Delete a GitHub integration.\n * @request DELETE:/api/v1/integrations/github/{id}/\n * @secure\n * @response `204` `void` Integration removed.\n * @response `409` `void` The integration is used by one (or more) Value(s) and cannot be removed.\n */\n this.integrationsGithubDestroy = ({ id, ...query }, params = {}) => this.request({\n path: `/api/v1/integrations/github/${id}/`,\n method: 'DELETE',\n query: query,\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags invitations\n * @name InvitationsList\n * @request GET:/api/v1/invitations/\n * @secure\n * @response `200` `PaginatedInvitationList`\n */\n this.invitationsList = (query, params = {}) => this.request({\n path: `/api/v1/invitations/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Extend an invitation for someone else to join your organization.\n *\n * @tags invitations\n * @name InvitationsCreate\n * @summary Create an invitation.\n * @request POST:/api/v1/invitations/\n * @secure\n * @response `201` `Invitation`\n * @response `403` `void` Permission denied. Is the invitation role more permissive than your own?\n * @response `404` `void` Bad Request. Is there already an invitation for that email?\n */\n this.invitationsCreate = (data, params = {}) => this.request({\n path: `/api/v1/invitations/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags invitations\n * @name InvitationsRetrieve\n * @request GET:/api/v1/invitations/{id}/\n * @secure\n * @response `200` `Invitation`\n */\n this.invitationsRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/invitations/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags invitations\n * @name InvitationsUpdate\n * @request PUT:/api/v1/invitations/{id}/\n * @secure\n * @response `200` `Invitation`\n */\n this.invitationsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/invitations/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags invitations\n * @name InvitationsPartialUpdate\n * @request PATCH:/api/v1/invitations/{id}/\n * @secure\n * @response `200` `Invitation`\n */\n this.invitationsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/invitations/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags invitations\n * @name InvitationsDestroy\n * @request DELETE:/api/v1/invitations/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.invitationsDestroy = (id, params = {}) => this.request({\n path: `/api/v1/invitations/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Accept an invitation to join an organization. The email address used to log in and accept the invitation must match the email address specified by the inviting user when creating the invitation. On success the client receives the invitation record as it was updated. The client should then regenerate the JWT with the organization scope and proceed to the default landing page.\n *\n * @tags invitations\n * @name InvitationsAcceptCreate\n * @summary Accept an invitation.\n * @request POST:/api/v1/invitations/{id}/accept/\n * @secure\n * @response `200` `Invitation` The invitation was accepted. The client should obtain an organization scope token and proceed to the landing page.\n * @response `403` `void` Permission denied. The accepting user's email may not match the invitation?\n * @response `404` `void` Bad Request. The invitation does not exist or has already been accepted?\n */\n this.invitationsAcceptCreate = (id, params = {}) => this.request({\n path: `/api/v1/invitations/${id}/accept/`,\n method: 'POST',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Re-send an invitation to the recipient.\n *\n * @tags invitations\n * @name InvitationsResendCreate\n * @summary Resend an invitation.\n * @request POST:/api/v1/invitations/{id}/resend/\n * @secure\n * @response `200` `Invitation` The invitation state was reset to `pending`, which causes it to get sent again. The most recent state is returned. Clients should check the state.\n * @response `404` `void` Bad Request. Was the invitation already accepted?\n */\n this.invitationsResendCreate = (id, params = {}) => this.request({\n path: `/api/v1/invitations/${id}/resend/`,\n method: 'POST',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags memberships\n * @name MembershipsList\n * @request GET:/api/v1/memberships/\n * @secure\n * @response `200` `PaginatedMembershipList`\n */\n this.membershipsList = (query, params = {}) => this.request({\n path: `/api/v1/memberships/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags memberships\n * @name MembershipsCreate\n * @request POST:/api/v1/memberships/\n * @secure\n * @response `201` `Membership`\n */\n this.membershipsCreate = (data, params = {}) => this.request({\n path: `/api/v1/memberships/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags memberships\n * @name MembershipsRetrieve\n * @request GET:/api/v1/memberships/{id}/\n * @secure\n * @response `200` `Membership`\n */\n this.membershipsRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/memberships/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags memberships\n * @name MembershipsUpdate\n * @request PUT:/api/v1/memberships/{id}/\n * @secure\n * @response `200` `Membership`\n */\n this.membershipsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/memberships/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags memberships\n * @name MembershipsPartialUpdate\n * @request PATCH:/api/v1/memberships/{id}/\n * @secure\n * @response `200` `Membership`\n */\n this.membershipsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/memberships/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags memberships\n * @name MembershipsDestroy\n * @request DELETE:/api/v1/memberships/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.membershipsDestroy = (id, params = {}) => this.request({\n path: `/api/v1/memberships/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags organizations\n * @name OrganizationsList\n * @request GET:/api/v1/organizations/\n * @secure\n * @response `200` `PaginatedOrganizationList`\n */\n this.organizationsList = (query, params = {}) => this.request({\n path: `/api/v1/organizations/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags organizations\n * @name OrganizationsCreate\n * @request POST:/api/v1/organizations/\n * @secure\n * @response `201` `Organization`\n */\n this.organizationsCreate = (data, params = {}) => this.request({\n path: `/api/v1/organizations/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags organizations\n * @name OrganizationsRetrieve\n * @request GET:/api/v1/organizations/{id}/\n * @secure\n * @response `200` `Organization`\n */\n this.organizationsRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/organizations/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags organizations\n * @name OrganizationsUpdate\n * @request PUT:/api/v1/organizations/{id}/\n * @secure\n * @response `200` `Organization`\n */\n this.organizationsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/organizations/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags organizations\n * @name OrganizationsPartialUpdate\n * @request PATCH:/api/v1/organizations/{id}/\n * @secure\n * @response `200` `Organization`\n */\n this.organizationsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/organizations/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags organizations\n * @name OrganizationsDestroy\n * @request DELETE:/api/v1/organizations/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.organizationsDestroy = (id, params = {}) => this.request({\n path: `/api/v1/organizations/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsList\n * @request GET:/api/v1/projects/\n * @secure\n * @response `200` `PaginatedProjectList`\n */\n this.projectsList = (query, params = {}) => this.request({\n path: `/api/v1/projects/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsCreate\n * @request POST:/api/v1/projects/\n * @secure\n * @response `201` `Project`\n */\n this.projectsCreate = (data, params = {}) => this.request({\n path: `/api/v1/projects/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsRetrieve\n * @request GET:/api/v1/projects/{id}/\n * @secure\n * @response `200` `Project`\n */\n this.projectsRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/projects/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsUpdate\n * @request PUT:/api/v1/projects/{id}/\n * @secure\n * @response `200` `Project`\n */\n this.projectsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/projects/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsPartialUpdate\n * @request PATCH:/api/v1/projects/{id}/\n * @secure\n * @response `200` `Project`\n */\n this.projectsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/projects/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsDestroy\n * @request DELETE:/api/v1/projects/{id}/\n * @secure\n * @response `204` `void` Project destroyed.\n * @response `409` `void` The project has dependents and cannot be removed.\n */\n this.projectsDestroy = (id, params = {}) => this.request({\n path: `/api/v1/projects/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Exports all parameters in this project in the requested format. Parameter names and values will be coerced to the proper format (e.g. for a dotenv export, my_parameter will be capitalized to MY_PARAMETER and its value will be in a quoted string). Note that capitalization is the only name coercion that will be performed on parameter names, names that are invalid for a given format will be omitted.\n *\n * @tags projects\n * @name ProjectsParameterExportList\n * @request GET:/api/v1/projects/{project_pk}/parameter-export/\n * @secure\n * @response `200` `ParameterExport`\n * @response `422` `TemplateLookupError`\n */\n this.projectsParameterExportList = ({ projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameter-export/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersList\n * @request GET:/api/v1/projects/{project_pk}/parameters/\n * @secure\n * @response `200` `PaginatedParameterList`\n */\n this.projectsParametersList = ({ projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersCreate\n * @request POST:/api/v1/projects/{project_pk}/parameters/\n * @secure\n * @response `201` `Parameter`\n */\n this.projectsParametersCreate = (projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description The push operations that this parameter was involved in.\n *\n * @tags projects\n * @name ProjectsParametersPushesList\n * @summary List push operations.\n * @request GET:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/pushes/\n * @secure\n * @response `200` `PaginatedTaskStepList`\n */\n this.projectsParametersPushesList = ({ parameterPk, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/pushes/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersRulesList\n * @request GET:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/\n * @secure\n * @response `200` `PaginatedParameterRuleList`\n */\n this.projectsParametersRulesList = ({ parameterPk, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/rules/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersRulesCreate\n * @request POST:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/\n * @secure\n * @response `201` `ParameterRule`\n */\n this.projectsParametersRulesCreate = (parameterPk, projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/rules/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersRulesRetrieve\n * @request GET:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/{id}/\n * @secure\n * @response `200` `ParameterRule`\n */\n this.projectsParametersRulesRetrieve = (id, parameterPk, projectPk, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/rules/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersRulesUpdate\n * @request PUT:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/{id}/\n * @secure\n * @response `200` `ParameterRule`\n */\n this.projectsParametersRulesUpdate = (id, parameterPk, projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/rules/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersRulesPartialUpdate\n * @request PATCH:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/{id}/\n * @secure\n * @response `200` `ParameterRule`\n */\n this.projectsParametersRulesPartialUpdate = (id, parameterPk, projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/rules/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersRulesDestroy\n * @request DELETE:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.projectsParametersRulesDestroy = (id, parameterPk, projectPk, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/rules/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Retrieve previously set values of a parameter in one or all environments. To see all the _effective_ values for a parameter across every environment, use the Parameters API (see the `values` field).\n *\n * @tags projects\n * @name ProjectsParametersValuesList\n * @summary Retrieve values.\n * @request GET:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/\n * @secure\n * @response `200` `PaginatedValueList`\n */\n this.projectsParametersValuesList = ({ parameterPk, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/values/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Set the value of a parameter in an environment.\n *\n * @tags projects\n * @name ProjectsParametersValuesCreate\n * @summary Set a value.\n * @request POST:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/\n * @secure\n * @response `201` `Value`\n */\n this.projectsParametersValuesCreate = ({ parameterPk, projectPk, ...query }, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/values/`,\n method: 'POST',\n query: query,\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Retrieve the value of a parameter in an environment.\n *\n * @tags projects\n * @name ProjectsParametersValuesRetrieve\n * @summary Retrieve a value.\n * @request GET:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/{id}/\n * @secure\n * @response `200` `Value`\n */\n this.projectsParametersValuesRetrieve = ({ id, parameterPk, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/values/${id}/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Update the value of a parameter in an environment.\n *\n * @tags projects\n * @name ProjectsParametersValuesUpdate\n * @summary Update a value.\n * @request PUT:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/{id}/\n * @secure\n * @response `200` `Value`\n */\n this.projectsParametersValuesUpdate = ({ id, parameterPk, projectPk, ...query }, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/values/${id}/`,\n method: 'PUT',\n query: query,\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Update the value of a parameter in an environment.\n *\n * @tags projects\n * @name ProjectsParametersValuesPartialUpdate\n * @summary Update a value.\n * @request PATCH:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/{id}/\n * @secure\n * @response `200` `Value`\n */\n this.projectsParametersValuesPartialUpdate = ({ id, parameterPk, projectPk, ...query }, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/values/${id}/`,\n method: 'PATCH',\n query: query,\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * @description Destroy the value of a parameter in an environment.\n *\n * @tags projects\n * @name ProjectsParametersValuesDestroy\n * @summary Destroy a value.\n * @request DELETE:/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.projectsParametersValuesDestroy = ({ id, parameterPk, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${parameterPk}/values/${id}/`,\n method: 'DELETE',\n query: query,\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersRetrieve\n * @request GET:/api/v1/projects/{project_pk}/parameters/{id}/\n * @secure\n * @response `200` `Parameter`\n */\n this.projectsParametersRetrieve = ({ id, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${id}/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersUpdate\n * @request PUT:/api/v1/projects/{project_pk}/parameters/{id}/\n * @secure\n * @response `200` `Parameter`\n * @response `400` `void` While checking pre-conditions, an external value was encountered that could not be resolved.\n * @response `404` `void` The given project id could not be found, or while checking pre-conditions, an external value was encountered that could not be resolved.\n * @response `415` `void` While checking pre-conditions, an external value was encountered that has an invalid content type.\n * @response `422` `void` A pre-condition to modifying the `secret` setting of the parameter failed, for example setting `secret: false` and having an external value that resolves to a value that is a secret. In this case it would be unsafe to allow the `secret` setting to change.\n * @response `507` `void` While checking pre-conditions, an external value was encountered that was too large to process.\n */\n this.projectsParametersUpdate = (id, projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersPartialUpdate\n * @request PATCH:/api/v1/projects/{project_pk}/parameters/{id}/\n * @secure\n * @response `200` `Parameter`\n * @response `400` `void` While checking pre-conditions, an external value was encountered that could not be resolved.\n * @response `404` `void` The given project id could not be found, or while checking pre-conditions, an external value was encountered that could not be resolved.\n * @response `415` `void` While checking pre-conditions, an external value was encountered that has an invalid content type.\n * @response `422` `void` A pre-condition to modifying the `secret` setting of the parameter failed, for example setting `secret: false` and having an external value that resolves to a value that is a secret. In this case it would be unsafe to allow the `secret` setting to change.\n * @response `507` `void` While checking pre-conditions, an external value was encountered that was too large to process.\n */\n this.projectsParametersPartialUpdate = (id, projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsParametersDestroy\n * @request DELETE:/api/v1/projects/{project_pk}/parameters/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.projectsParametersDestroy = (id, projectPk, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Summary information about how a parameter has changed over time. The time range of historical information available depends on your subscription. Any changes to the parameter itself, including rules and values, is included.\n *\n * @tags projects\n * @name ProjectsParametersTimelineRetrieve\n * @request GET:/api/v1/projects/{project_pk}/parameters/{id}/timeline/\n * @secure\n * @response `200` `ParameterTimeline`\n */\n this.projectsParametersTimelineRetrieve = ({ id, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/${id}/timeline/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Retrieve parameters at dual timepoints for comparison. Results are aligned by parameter name. This means if a parameter is created, then deleted, then created again with the same name the two records with different parameter IDs will show up in the same result entry. If t1 is not specified then it will point to a time in the past where nothing existed. If t2 is not specified then it is assumed to be \"now\".\n *\n * @tags projects\n * @name ProjectsParametersDualityList\n * @request GET:/api/v1/projects/{project_pk}/parameters/duality/\n * @secure\n * @response `200` `PaginatedParameterDualityList`\n */\n this.projectsParametersDualityList = ({ projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/duality/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Information about how the parameters of a project have changed over time. The time range of historical information available depends on your subscription. Any changes to the project's parameters, including rules and values, is included.\n *\n * @tags projects\n * @name ProjectsParametersTimelinesRetrieve\n * @request GET:/api/v1/projects/{project_pk}/parameters/timelines/\n * @secure\n * @response `200` `ParameterTimeline`\n */\n this.projectsParametersTimelinesRetrieve = ({ projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/parameters/timelines/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Endpoint for previewing a template. Post the template content in the request body.\n *\n * @tags projects\n * @name ProjectsTemplatePreviewCreate\n * @request POST:/api/v1/projects/{project_pk}/template-preview/\n * @secure\n * @response `200` `TemplatePreview`\n * @response `422` `TemplateLookupError`\n */\n this.projectsTemplatePreviewCreate = ({ projectPk, ...query }, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/template-preview/`,\n method: 'POST',\n query: query,\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsTemplatesList\n * @request GET:/api/v1/projects/{project_pk}/templates/\n * @secure\n * @response `200` `PaginatedTemplateList`\n * @response `422` `TemplateLookupError`\n */\n this.projectsTemplatesList = ({ projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsTemplatesCreate\n * @request POST:/api/v1/projects/{project_pk}/templates/\n * @secure\n * @response `201` `Template`\n * @response `422` `TemplateLookupError`\n */\n this.projectsTemplatesCreate = (projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsTemplatesRetrieve\n * @request GET:/api/v1/projects/{project_pk}/templates/{id}/\n * @secure\n * @response `200` `Template`\n * @response `422` `TemplateLookupError`\n */\n this.projectsTemplatesRetrieve = ({ id, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/${id}/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsTemplatesUpdate\n * @request PUT:/api/v1/projects/{project_pk}/templates/{id}/\n * @secure\n * @response `200` `Template`\n * @response `422` `TemplateLookupError`\n */\n this.projectsTemplatesUpdate = (id, projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsTemplatesPartialUpdate\n * @request PATCH:/api/v1/projects/{project_pk}/templates/{id}/\n * @secure\n * @response `200` `Template`\n * @response `422` `TemplateLookupError`\n */\n this.projectsTemplatesPartialUpdate = (id, projectPk, data, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags projects\n * @name ProjectsTemplatesDestroy\n * @request DELETE:/api/v1/projects/{project_pk}/templates/{id}/\n * @secure\n * @response `204` `void` Template destroyed.\n * @response `409` `void` The template is referenced by another template or value and cannot be removed.\n */\n this.projectsTemplatesDestroy = (id, projectPk, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Information about how a template has changed over time. The time range of historical information available depends on your subscription. Any changes to the template itself is included.\n *\n * @tags projects\n * @name ProjectsTemplatesTimelineRetrieve\n * @request GET:/api/v1/projects/{project_pk}/templates/{id}/timeline/\n * @secure\n * @response `200` `TemplateTimeline`\n */\n this.projectsTemplatesTimelineRetrieve = ({ id, projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/${id}/timeline/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Information about how the templates of a project have changed over time. The time range of historical information available depends on your subscription. Any changes to the project's templates is included.\n *\n * @tags projects\n * @name ProjectsTemplatesTimelinesRetrieve\n * @request GET:/api/v1/projects/{project_pk}/templates/timelines/\n * @secure\n * @response `200` `TemplateTimeline`\n */\n this.projectsTemplatesTimelinesRetrieve = ({ projectPk, ...query }, params = {}) => this.request({\n path: `/api/v1/projects/${projectPk}/templates/timelines/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags serviceaccounts\n * @name ServiceaccountsList\n * @request GET:/api/v1/serviceaccounts/\n * @secure\n * @response `200` `PaginatedServiceAccountList`\n */\n this.serviceaccountsList = (query, params = {}) => this.request({\n path: `/api/v1/serviceaccounts/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Creates a new ServiceAccount. A ServiceAccount is a user record intended for machine use (such as a build system). It does not have a username/password but is instead accessed using an API key. On creation, the API key will be returned. This key will only be shown once, is not stored on any CloudTruth system, and should be treated as a secret. Should the key be lost, you will need to delete and recreate the ServiceAccount in order to generate a new API key.\n *\n * @tags serviceaccounts\n * @name ServiceaccountsCreate\n * @summary Create a ServiceAccount user.\n * @request POST:/api/v1/serviceaccounts/\n * @secure\n * @response `201` `ServiceAccountCreateResponse`\n */\n this.serviceaccountsCreate = (data, params = {}) => this.request({\n path: `/api/v1/serviceaccounts/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags serviceaccounts\n * @name ServiceaccountsRetrieve\n * @request GET:/api/v1/serviceaccounts/{id}/\n * @secure\n * @response `200` `ServiceAccount`\n */\n this.serviceaccountsRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/serviceaccounts/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags serviceaccounts\n * @name ServiceaccountsUpdate\n * @request PUT:/api/v1/serviceaccounts/{id}/\n * @secure\n * @response `200` `ServiceAccount`\n */\n this.serviceaccountsUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/serviceaccounts/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags serviceaccounts\n * @name ServiceaccountsPartialUpdate\n * @request PATCH:/api/v1/serviceaccounts/{id}/\n * @secure\n * @response `200` `ServiceAccount`\n */\n this.serviceaccountsPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/serviceaccounts/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags serviceaccounts\n * @name ServiceaccountsDestroy\n * @request DELETE:/api/v1/serviceaccounts/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.serviceaccountsDestroy = (id, params = {}) => this.request({\n path: `/api/v1/serviceaccounts/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesList\n * @request GET:/api/v1/types/\n * @secure\n * @response `200` `PaginatedParameterTypeList`\n */\n this.typesList = (query, params = {}) => this.request({\n path: `/api/v1/types/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesCreate\n * @request POST:/api/v1/types/\n * @secure\n * @response `201` `ParameterType`\n */\n this.typesCreate = (data, params = {}) => this.request({\n path: `/api/v1/types/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesRulesList\n * @request GET:/api/v1/types/{parametertype_pk}/rules/\n * @secure\n * @response `200` `PaginatedParameterTypeRuleList`\n */\n this.typesRulesList = ({ parametertypePk, ...query }, params = {}) => this.request({\n path: `/api/v1/types/${parametertypePk}/rules/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesRulesCreate\n * @request POST:/api/v1/types/{parametertype_pk}/rules/\n * @secure\n * @response `201` `ParameterTypeRule`\n */\n this.typesRulesCreate = (parametertypePk, data, params = {}) => this.request({\n path: `/api/v1/types/${parametertypePk}/rules/`,\n method: 'POST',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesRulesRetrieve\n * @request GET:/api/v1/types/{parametertype_pk}/rules/{id}/\n * @secure\n * @response `200` `ParameterTypeRule`\n */\n this.typesRulesRetrieve = (id, parametertypePk, params = {}) => this.request({\n path: `/api/v1/types/${parametertypePk}/rules/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesRulesUpdate\n * @request PUT:/api/v1/types/{parametertype_pk}/rules/{id}/\n * @secure\n * @response `200` `ParameterTypeRule`\n */\n this.typesRulesUpdate = (id, parametertypePk, data, params = {}) => this.request({\n path: `/api/v1/types/${parametertypePk}/rules/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesRulesPartialUpdate\n * @request PATCH:/api/v1/types/{parametertype_pk}/rules/{id}/\n * @secure\n * @response `200` `ParameterTypeRule`\n */\n this.typesRulesPartialUpdate = (id, parametertypePk, data, params = {}) => this.request({\n path: `/api/v1/types/${parametertypePk}/rules/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesRulesDestroy\n * @request DELETE:/api/v1/types/{parametertype_pk}/rules/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.typesRulesDestroy = (id, parametertypePk, params = {}) => this.request({\n path: `/api/v1/types/${parametertypePk}/rules/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesRetrieve\n * @request GET:/api/v1/types/{id}/\n * @secure\n * @response `200` `ParameterType`\n */\n this.typesRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/types/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesUpdate\n * @request PUT:/api/v1/types/{id}/\n * @secure\n * @response `200` `ParameterType`\n */\n this.typesUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/types/${id}/`,\n method: 'PUT',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesPartialUpdate\n * @request PATCH:/api/v1/types/{id}/\n * @secure\n * @response `200` `ParameterType`\n */\n this.typesPartialUpdate = (id, data, params = {}) => this.request({\n path: `/api/v1/types/${id}/`,\n method: 'PATCH',\n body: data,\n secure: true,\n type: http_client_1.ContentType.Json,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags types\n * @name TypesDestroy\n * @request DELETE:/api/v1/types/{id}/\n * @secure\n * @response `204` `void` No response body\n */\n this.typesDestroy = (id, params = {}) => this.request({\n path: `/api/v1/types/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * No description\n *\n * @tags users\n * @name UsersList\n * @request GET:/api/v1/users/\n * @secure\n * @response `200` `PaginatedUserList`\n */\n this.usersList = (query, params = {}) => this.request({\n path: `/api/v1/users/`,\n method: 'GET',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * No description\n *\n * @tags users\n * @name UsersRetrieve\n * @request GET:/api/v1/users/{id}/\n * @secure\n * @response `200` `User`\n */\n this.usersRetrieve = (id, params = {}) => this.request({\n path: `/api/v1/users/${id}/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description ### Description ### Delete the specified user. This removes all access the User may have to any Organization. ### Pre-Conditions ### - The user cannot be the only owner of any Organization. - The bearer token must belong to the user being deleted. - All of the memberships related to the User will be deleted, so all the membership deletion pre-conditions must also be met.\n *\n * @tags users\n * @name UsersDestroy\n * @summary Delete the specified user.\n * @request DELETE:/api/v1/users/{id}/\n * @secure\n * @response `204` `void` User deleted. The client should behave as if the user logged out.\n * @response `400` `void` Bad Request - Is the user the only owner of any organization? - Were all required fields provided?\n * @response `403` `void` Forbidden - Did the Bearer token belong to the User being deleted?\n */\n this.usersDestroy = (id, params = {}) => this.request({\n path: `/api/v1/users/${id}/`,\n method: 'DELETE',\n secure: true,\n ...params\n });\n /**\n * @description Get user information about the current user.\n *\n * @tags users\n * @name UsersCurrentRetrieve\n * @summary Current user information\n * @request GET:/api/v1/users/current/\n * @secure\n * @response `200` `User` User information\n */\n this.usersCurrentRetrieve = (params = {}) => this.request({\n path: `/api/v1/users/current/`,\n method: 'GET',\n secure: true,\n format: 'json',\n ...params\n });\n /**\n * @description Endpoint for accessing utility functions\n *\n * @tags utils\n * @name UtilsGeneratePasswordCreate\n * @summary Get a randomly generated password using AWS Secrets Manager, with fallback to /dev/urandom.\n * @request POST:/api/v1/utils/generate_password/\n * @secure\n * @response `201` `GeneratedPasswordResponse`\n */\n this.utilsGeneratePasswordCreate = (query, params = {}) => this.request({\n path: `/api/v1/utils/generate_password/`,\n method: 'POST',\n query: query,\n secure: true,\n format: 'json',\n ...params\n });\n }\n}\nexports.Api = Api;\n","\"use strict\";\n/* eslint-disable */\n/* tslint:disable */\n/*\n * ---------------------------------------------------------------\n * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ##\n * ## ##\n * ## AUTHOR: acacode ##\n * ## SOURCE: https://github.com/acacode/swagger-typescript-api ##\n * ---------------------------------------------------------------\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpClient = exports.ContentType = void 0;\nvar ContentType;\n(function (ContentType) {\n ContentType[\"Json\"] = \"application/json\";\n ContentType[\"FormData\"] = \"multipart/form-data\";\n ContentType[\"UrlEncoded\"] = \"application/x-www-form-urlencoded\";\n})(ContentType = exports.ContentType || (exports.ContentType = {}));\nclass HttpClient {\n constructor(apiConfig = {}) {\n this.baseUrl = '';\n this.securityData = null;\n this.abortControllers = new Map();\n this.customFetch = (...fetchParams) => fetch(...fetchParams);\n this.baseApiParams = {\n credentials: 'same-origin',\n headers: {},\n redirect: 'follow',\n referrerPolicy: 'no-referrer'\n };\n this.setSecurityData = (data) => {\n this.securityData = data;\n };\n this.contentFormatters = {\n [ContentType.Json]: (input) => input !== null && (typeof input === 'object' || typeof input === 'string') ? JSON.stringify(input) : input,\n [ContentType.FormData]: (input) => Object.keys(input || {}).reduce((formData, key) => {\n const property = input[key];\n formData.append(key, property instanceof Blob\n ? property\n : typeof property === 'object' && property !== null\n ? JSON.stringify(property)\n : `${property}`);\n return formData;\n }, new FormData()),\n [ContentType.UrlEncoded]: (input) => this.toQueryString(input)\n };\n this.createAbortSignal = (cancelToken) => {\n if (this.abortControllers.has(cancelToken)) {\n const abortController = this.abortControllers.get(cancelToken);\n if (abortController) {\n return abortController.signal;\n }\n return void 0;\n }\n const abortController = new AbortController();\n this.abortControllers.set(cancelToken, abortController);\n return abortController.signal;\n };\n this.abortRequest = (cancelToken) => {\n const abortController = this.abortControllers.get(cancelToken);\n if (abortController) {\n abortController.abort();\n this.abortControllers.delete(cancelToken);\n }\n };\n this.request = async ({ body, secure, path, type, query, format, baseUrl, cancelToken, ...params }) => {\n const secureParams = ((typeof secure === 'boolean' ? secure : this.baseApiParams.secure) &&\n this.securityWorker &&\n (await this.securityWorker(this.securityData))) ||\n {};\n const requestParams = this.mergeRequestParams(params, secureParams);\n const queryString = query && this.toQueryString(query);\n const payloadFormatter = this.contentFormatters[type || ContentType.Json];\n const responseFormat = format || requestParams.format;\n return this.customFetch(`${baseUrl || this.baseUrl || ''}${path}${queryString ? `?${queryString}` : ''}`, {\n ...requestParams,\n headers: {\n ...(type && type !== ContentType.FormData ? { 'Content-Type': type } : {}),\n ...(requestParams.headers || {})\n },\n signal: cancelToken ? this.createAbortSignal(cancelToken) : void 0,\n body: typeof body === 'undefined' || body === null ? null : payloadFormatter(body)\n }).then(async (response) => {\n const r = response;\n r.data = null;\n r.error = null;\n const data = !responseFormat\n ? r\n : await response[responseFormat]()\n .then(data => {\n if (r.ok) {\n r.data = data;\n }\n else {\n r.error = data;\n }\n return r;\n })\n .catch(e => {\n r.error = e;\n return r;\n });\n if (cancelToken) {\n this.abortControllers.delete(cancelToken);\n }\n if (!response.ok)\n throw data;\n return data;\n });\n };\n Object.assign(this, apiConfig);\n }\n encodeQueryParam(key, value) {\n const encodedKey = encodeURIComponent(key);\n return `${encodedKey}=${encodeURIComponent(typeof value === 'number' ? value : `${value}`)}`;\n }\n addQueryParam(query, key) {\n return this.encodeQueryParam(key, query[key]);\n }\n addArrayQueryParam(query, key) {\n const value = query[key];\n return value.map((v) => this.encodeQueryParam(key, v)).join('&');\n }\n toQueryString(rawQuery) {\n const query = rawQuery || {};\n const keys = Object.keys(query).filter(key => 'undefined' !== typeof query[key]);\n return keys\n .map(key => (Array.isArray(query[key]) ? this.addArrayQueryParam(query, key) : this.addQueryParam(query, key)))\n .join('&');\n }\n addQueryParams(rawQuery) {\n const queryString = this.toQueryString(rawQuery);\n return queryString ? `?${queryString}` : '';\n }\n mergeRequestParams(params1, params2) {\n return {\n ...this.baseApiParams,\n ...params1,\n ...(params2 || {}),\n headers: {\n ...(this.baseApiParams.headers || {}),\n ...(params1.headers || {}),\n ...((params2 && params2.headers) || {})\n }\n };\n }\n}\nexports.HttpClient = HttpClient;\n","\"use strict\";\n//\n// Copyright (C) 2021 CloudTruth, Inc.\n//\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.run = exports.api = exports.configurefetch = exports.fetchWithRetry = void 0;\nconst core = __importStar(require(\"@actions/core\"));\nconst Api_1 = require(\"./gen/Api\");\nconst version_1 = require(\"./version\");\nconst uuid_1 = require(\"uuid\");\nconst isomorphic_fetch_1 = __importDefault(require(\"isomorphic-fetch\"));\nconst USER_AGENT = `configure-action/${version_1.LIB_VERSION}`;\nasync function fetchWithRetry(url, { headers, ...options } = {}, init, { timeoutInSeconds, tries } = { timeoutInSeconds: 10, tries: 1 }) {\n let response;\n let controller;\n core.debug(`Fetching ${url} with ${timeoutInSeconds} seconds timeout and will try ${tries} time(s).`);\n for (let tryCount = 0; tryCount < tries; tryCount++) {\n core.debug(`Try ${tryCount + 1} of ${tries}.`);\n let timeoutId;\n try {\n controller = new AbortController();\n timeoutId = setTimeout(() => controller.abort(), timeoutInSeconds * 1000);\n response = await (0, isomorphic_fetch_1.default)(url, {\n signal: controller.signal,\n headers: {\n 'User-Agent': USER_AGENT,\n ...headers\n },\n ...init\n });\n clearTimeout(timeoutId);\n return response;\n }\n catch (error) {\n core.debug(`Caught error ${error}`);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if (!(error instanceof DOMException) || error.name !== 'AbortError') {\n throw error;\n }\n }\n }\n throw new Error(`Failed to fetch ${url} after ${tries} tries.`);\n}\nexports.fetchWithRetry = fetchWithRetry;\nconst configurefetch = (url, \n/* istanbul ignore next */\n{ headers, ...options } = {}) => {\n return (0, isomorphic_fetch_1.default)(url, {\n headers: {\n 'User-Agent': USER_AGENT,\n ...headers\n },\n ...options\n });\n};\nexports.configurefetch = configurefetch;\nfunction api() {\n const api = new Api_1.Api({\n baseUrl: core.getInput('server') || 'https://api.cloudtruth.io',\n customFetch: fetchWithRetry,\n securityWorker: (securityData) => {\n return {\n headers: {\n ['Authorization']: 'Api-Key ' + securityData.apikey\n },\n keepalive: true\n };\n }\n });\n api.setSecurityData({ apikey: core.getInput('apikey') });\n core.debug(`Using API server ${JSON.stringify(api)}`);\n return api;\n}\nexports.api = api;\nfunction inject(response) {\n const overwrite = core.getInput('overwrite') || false;\n for (const entry of response.data.results) {\n const values = Object.values(entry.values);\n const valueRecord = values[0];\n const effectiveValue = valueRecord?.value;\n const isSecret = entry.secret;\n const parameterName = entry.name;\n if (effectiveValue != null) {\n if (parameterName in process.env && !overwrite) {\n throw new Error(`The environment variable \"${parameterName}\" already exists and cannot be overwritten.`);\n }\n if (isSecret) {\n core.info(`Declaring \"${parameterName}\" as a secret.`);\n core.setSecret(effectiveValue);\n }\n core.info(`Setting environment variable \"${parameterName}\"`);\n core.exportVariable(parameterName, effectiveValue);\n }\n else {\n core.warning(`Ignoring unset value for parameter \"${parameterName}\" (GitHub Actions does not support unsetting).`);\n }\n }\n}\nasync function resolve_project_id(project_name_or_id, api) {\n if ((0, uuid_1.validate)(project_name_or_id)) {\n // we look it up to make sure the id is good and we have permission to use it\n try {\n const response = await api.projectsRetrieve(project_name_or_id);\n return response.data.id;\n }\n catch (error) {\n throw new Error(`Project \"${project_name_or_id}\": ${error.error.detail}`);\n }\n }\n const response = await api.projectsList({ name: project_name_or_id });\n if (response.data.count == 1) {\n const result = response.data.results;\n return result[0].id;\n }\n throw new Error(`Project \"${project_name_or_id}\": Not found.`);\n}\nasync function run() {\n try {\n const client = api();\n const project_id = await resolve_project_id(core.getInput('project', { required: true }), client);\n const environment = core.getInput('environment', { required: true });\n const tag = core.getInput('tag') || undefined;\n for (let page = 1;; ++page) {\n let page_size = undefined;\n if (process.env.TESTING_REST_API_PAGE_SIZE) {\n page_size = parseInt(process.env.TESTING_REST_API_PAGE_SIZE);\n }\n const payload = {\n projectPk: project_id,\n environment: environment,\n page: page,\n page_size: page_size\n };\n if (tag) {\n payload.tag = tag;\n core.debug(`Requesting parameter values for project='${project_id}' environment='${environment}' tag='${tag}' page=${page}`);\n }\n else {\n core.debug(`Requesting parameter values for project='${project_id}' environment='${environment}' page=${page}`);\n }\n core.debug(`Payload ${JSON.stringify(payload)}`);\n const response = await client.projectsParametersList(payload);\n core.debug(`Received ${response.data.results.length} parameters.`);\n core.debug(`Data: ${JSON.stringify(response.data)}`);\n inject(response);\n if (response.data.next == null) {\n if (page == 1 && response.data.count == 0) {\n core.warning(`Project ${core.getInput('project')} has no parameters.`);\n }\n break;\n }\n }\n }\n catch (error) {\n core.setFailed(error.message || error.error.detail);\n }\n}\nexports.run = run;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LIB_VERSION = void 0;\nexports.LIB_VERSION = \"2.2.1\";\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.issue = exports.issueCommand = void 0;\nconst os = __importStar(require(\"os\"));\nconst utils_1 = require(\"./utils\");\n/**\n * Commands\n *\n * Command Format:\n * ::name key=value,key=value::message\n *\n * Examples:\n * ::warning::This is the message\n * ::set-env name=MY_VAR::some value\n */\nfunction issueCommand(command, properties, message) {\n const cmd = new Command(command, properties, message);\n process.stdout.write(cmd.toString() + os.EOL);\n}\nexports.issueCommand = issueCommand;\nfunction issue(name, message = '') {\n issueCommand(name, {}, message);\n}\nexports.issue = issue;\nconst CMD_STRING = '::';\nclass Command {\n constructor(command, properties, message) {\n if (!command) {\n command = 'missing.command';\n }\n this.command = command;\n this.properties = properties;\n this.message = message;\n }\n toString() {\n let cmdStr = CMD_STRING + this.command;\n if (this.properties && Object.keys(this.properties).length > 0) {\n cmdStr += ' ';\n let first = true;\n for (const key in this.properties) {\n if (this.properties.hasOwnProperty(key)) {\n const val = this.properties[key];\n if (val) {\n if (first) {\n first = false;\n }\n else {\n cmdStr += ',';\n }\n cmdStr += `${key}=${escapeProperty(val)}`;\n }\n }\n }\n }\n cmdStr += `${CMD_STRING}${escapeData(this.message)}`;\n return cmdStr;\n }\n}\nfunction escapeData(s) {\n return utils_1.toCommandValue(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A');\n}\nfunction escapeProperty(s) {\n return utils_1.toCommandValue(s)\n .replace(/%/g, '%25')\n .replace(/\\r/g, '%0D')\n .replace(/\\n/g, '%0A')\n .replace(/:/g, '%3A')\n .replace(/,/g, '%2C');\n}\n//# sourceMappingURL=command.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0;\nconst command_1 = require(\"./command\");\nconst file_command_1 = require(\"./file-command\");\nconst utils_1 = require(\"./utils\");\nconst os = __importStar(require(\"os\"));\nconst path = __importStar(require(\"path\"));\nconst oidc_utils_1 = require(\"./oidc-utils\");\n/**\n * The code to exit an action\n */\nvar ExitCode;\n(function (ExitCode) {\n /**\n * A code indicating that the action was successful\n */\n ExitCode[ExitCode[\"Success\"] = 0] = \"Success\";\n /**\n * A code indicating that the action was a failure\n */\n ExitCode[ExitCode[\"Failure\"] = 1] = \"Failure\";\n})(ExitCode = exports.ExitCode || (exports.ExitCode = {}));\n//-----------------------------------------------------------------------\n// Variables\n//-----------------------------------------------------------------------\n/**\n * Sets env variable for this action and future actions in the job\n * @param name the name of the variable to set\n * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction exportVariable(name, val) {\n const convertedVal = utils_1.toCommandValue(val);\n process.env[name] = convertedVal;\n const filePath = process.env['GITHUB_ENV'] || '';\n if (filePath) {\n const delimiter = '_GitHubActionsFileCommandDelimeter_';\n const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;\n file_command_1.issueCommand('ENV', commandValue);\n }\n else {\n command_1.issueCommand('set-env', { name }, convertedVal);\n }\n}\nexports.exportVariable = exportVariable;\n/**\n * Registers a secret which will get masked from logs\n * @param secret value of the secret\n */\nfunction setSecret(secret) {\n command_1.issueCommand('add-mask', {}, secret);\n}\nexports.setSecret = setSecret;\n/**\n * Prepends inputPath to the PATH (for this action and future actions)\n * @param inputPath\n */\nfunction addPath(inputPath) {\n const filePath = process.env['GITHUB_PATH'] || '';\n if (filePath) {\n file_command_1.issueCommand('PATH', inputPath);\n }\n else {\n command_1.issueCommand('add-path', {}, inputPath);\n }\n process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;\n}\nexports.addPath = addPath;\n/**\n * Gets the value of an input.\n * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed.\n * Returns an empty string if the value is not defined.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string\n */\nfunction getInput(name, options) {\n const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';\n if (options && options.required && !val) {\n throw new Error(`Input required and not supplied: ${name}`);\n }\n if (options && options.trimWhitespace === false) {\n return val;\n }\n return val.trim();\n}\nexports.getInput = getInput;\n/**\n * Gets the values of an multiline input. Each value is also trimmed.\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns string[]\n *\n */\nfunction getMultilineInput(name, options) {\n const inputs = getInput(name, options)\n .split('\\n')\n .filter(x => x !== '');\n return inputs;\n}\nexports.getMultilineInput = getMultilineInput;\n/**\n * Gets the input value of the boolean type in the YAML 1.2 \"core schema\" specification.\n * Support boolean input list: `true | True | TRUE | false | False | FALSE` .\n * The return value is also in boolean type.\n * ref: https://yaml.org/spec/1.2/spec.html#id2804923\n *\n * @param name name of the input to get\n * @param options optional. See InputOptions.\n * @returns boolean\n */\nfunction getBooleanInput(name, options) {\n const trueValue = ['true', 'True', 'TRUE'];\n const falseValue = ['false', 'False', 'FALSE'];\n const val = getInput(name, options);\n if (trueValue.includes(val))\n return true;\n if (falseValue.includes(val))\n return false;\n throw new TypeError(`Input does not meet YAML 1.2 \"Core Schema\" specification: ${name}\\n` +\n `Support boolean input list: \\`true | True | TRUE | false | False | FALSE\\``);\n}\nexports.getBooleanInput = getBooleanInput;\n/**\n * Sets the value of an output.\n *\n * @param name name of the output to set\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction setOutput(name, value) {\n process.stdout.write(os.EOL);\n command_1.issueCommand('set-output', { name }, value);\n}\nexports.setOutput = setOutput;\n/**\n * Enables or disables the echoing of commands into stdout for the rest of the step.\n * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set.\n *\n */\nfunction setCommandEcho(enabled) {\n command_1.issue('echo', enabled ? 'on' : 'off');\n}\nexports.setCommandEcho = setCommandEcho;\n//-----------------------------------------------------------------------\n// Results\n//-----------------------------------------------------------------------\n/**\n * Sets the action status to failed.\n * When the action exits it will be with an exit code of 1\n * @param message add error issue message\n */\nfunction setFailed(message) {\n process.exitCode = ExitCode.Failure;\n error(message);\n}\nexports.setFailed = setFailed;\n//-----------------------------------------------------------------------\n// Logging Commands\n//-----------------------------------------------------------------------\n/**\n * Gets whether Actions Step Debug is on or not\n */\nfunction isDebug() {\n return process.env['RUNNER_DEBUG'] === '1';\n}\nexports.isDebug = isDebug;\n/**\n * Writes debug message to user log\n * @param message debug message\n */\nfunction debug(message) {\n command_1.issueCommand('debug', {}, message);\n}\nexports.debug = debug;\n/**\n * Adds an error issue\n * @param message error issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction error(message, properties = {}) {\n command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.error = error;\n/**\n * Adds a warning issue\n * @param message warning issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction warning(message, properties = {}) {\n command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.warning = warning;\n/**\n * Adds a notice issue\n * @param message notice issue message. Errors will be converted to string via toString()\n * @param properties optional properties to add to the annotation.\n */\nfunction notice(message, properties = {}) {\n command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message);\n}\nexports.notice = notice;\n/**\n * Writes info to log with console.log.\n * @param message info message\n */\nfunction info(message) {\n process.stdout.write(message + os.EOL);\n}\nexports.info = info;\n/**\n * Begin an output group.\n *\n * Output until the next `groupEnd` will be foldable in this group\n *\n * @param name The name of the output group\n */\nfunction startGroup(name) {\n command_1.issue('group', name);\n}\nexports.startGroup = startGroup;\n/**\n * End an output group.\n */\nfunction endGroup() {\n command_1.issue('endgroup');\n}\nexports.endGroup = endGroup;\n/**\n * Wrap an asynchronous function call in a group.\n *\n * Returns the same type as the function itself.\n *\n * @param name The name of the group\n * @param fn The function to wrap in the group\n */\nfunction group(name, fn) {\n return __awaiter(this, void 0, void 0, function* () {\n startGroup(name);\n let result;\n try {\n result = yield fn();\n }\n finally {\n endGroup();\n }\n return result;\n });\n}\nexports.group = group;\n//-----------------------------------------------------------------------\n// Wrapper action state\n//-----------------------------------------------------------------------\n/**\n * Saves state for current action, the state can only be retrieved by this action's post job execution.\n *\n * @param name name of the state to store\n * @param value value to store. Non-string values will be converted to a string via JSON.stringify\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction saveState(name, value) {\n command_1.issueCommand('save-state', { name }, value);\n}\nexports.saveState = saveState;\n/**\n * Gets the value of an state set by this action's main execution.\n *\n * @param name name of the state to get\n * @returns string\n */\nfunction getState(name) {\n return process.env[`STATE_${name}`] || '';\n}\nexports.getState = getState;\nfunction getIDToken(aud) {\n return __awaiter(this, void 0, void 0, function* () {\n return yield oidc_utils_1.OidcClient.getIDToken(aud);\n });\n}\nexports.getIDToken = getIDToken;\n//# sourceMappingURL=core.js.map","\"use strict\";\n// For internal use, subject to change.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.issueCommand = void 0;\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst fs = __importStar(require(\"fs\"));\nconst os = __importStar(require(\"os\"));\nconst utils_1 = require(\"./utils\");\nfunction issueCommand(command, message) {\n const filePath = process.env[`GITHUB_${command}`];\n if (!filePath) {\n throw new Error(`Unable to find environment variable for file command ${command}`);\n }\n if (!fs.existsSync(filePath)) {\n throw new Error(`Missing file at path: ${filePath}`);\n }\n fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, {\n encoding: 'utf8'\n });\n}\nexports.issueCommand = issueCommand;\n//# sourceMappingURL=file-command.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OidcClient = void 0;\nconst http_client_1 = require(\"@actions/http-client\");\nconst auth_1 = require(\"@actions/http-client/auth\");\nconst core_1 = require(\"./core\");\nclass OidcClient {\n static createHttpClient(allowRetry = true, maxRetry = 10) {\n const requestOptions = {\n allowRetries: allowRetry,\n maxRetries: maxRetry\n };\n return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions);\n }\n static getRequestToken() {\n const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN'];\n if (!token) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable');\n }\n return token;\n }\n static getIDTokenUrl() {\n const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL'];\n if (!runtimeUrl) {\n throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable');\n }\n return runtimeUrl;\n }\n static getCall(id_token_url) {\n var _a;\n return __awaiter(this, void 0, void 0, function* () {\n const httpclient = OidcClient.createHttpClient();\n const res = yield httpclient\n .getJson(id_token_url)\n .catch(error => {\n throw new Error(`Failed to get ID Token. \\n \n Error Code : ${error.statusCode}\\n \n Error Message: ${error.result.message}`);\n });\n const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value;\n if (!id_token) {\n throw new Error('Response json body do not have ID Token field');\n }\n return id_token;\n });\n }\n static getIDToken(audience) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n // New ID Token is requested from action service\n let id_token_url = OidcClient.getIDTokenUrl();\n if (audience) {\n const encodedAudience = encodeURIComponent(audience);\n id_token_url = `${id_token_url}&audience=${encodedAudience}`;\n }\n core_1.debug(`ID token url is ${id_token_url}`);\n const id_token = yield OidcClient.getCall(id_token_url);\n core_1.setSecret(id_token);\n return id_token;\n }\n catch (error) {\n throw new Error(`Error message: ${error.message}`);\n }\n });\n }\n}\nexports.OidcClient = OidcClient;\n//# sourceMappingURL=oidc-utils.js.map","\"use strict\";\n// We use any as a valid input type\n/* eslint-disable @typescript-eslint/no-explicit-any */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toCommandProperties = exports.toCommandValue = void 0;\n/**\n * Sanitizes an input into a string so it can be passed into issueCommand safely\n * @param input input to sanitize into a string\n */\nfunction toCommandValue(input) {\n if (input === null || input === undefined) {\n return '';\n }\n else if (typeof input === 'string' || input instanceof String) {\n return input;\n }\n return JSON.stringify(input);\n}\nexports.toCommandValue = toCommandValue;\n/**\n *\n * @param annotationProperties\n * @returns The command properties to send with the actual annotation command\n * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646\n */\nfunction toCommandProperties(annotationProperties) {\n if (!Object.keys(annotationProperties).length) {\n return {};\n }\n return {\n title: annotationProperties.title,\n file: annotationProperties.file,\n line: annotationProperties.startLine,\n endLine: annotationProperties.endLine,\n col: annotationProperties.startColumn,\n endColumn: annotationProperties.endColumn\n };\n}\nexports.toCommandProperties = toCommandProperties;\n//# sourceMappingURL=utils.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nclass BasicCredentialHandler {\n constructor(username, password) {\n this.username = username;\n this.password = password;\n }\n prepareRequest(options) {\n options.headers['Authorization'] =\n 'Basic ' +\n Buffer.from(this.username + ':' + this.password).toString('base64');\n }\n // This handler cannot handle 401\n canHandleAuthentication(response) {\n return false;\n }\n handleAuthentication(httpClient, requestInfo, objs) {\n return null;\n }\n}\nexports.BasicCredentialHandler = BasicCredentialHandler;\nclass BearerCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n options.headers['Authorization'] = 'Bearer ' + this.token;\n }\n // This handler cannot handle 401\n canHandleAuthentication(response) {\n return false;\n }\n handleAuthentication(httpClient, requestInfo, objs) {\n return null;\n }\n}\nexports.BearerCredentialHandler = BearerCredentialHandler;\nclass PersonalAccessTokenCredentialHandler {\n constructor(token) {\n this.token = token;\n }\n // currently implements pre-authorization\n // TODO: support preAuth = false where it hooks on 401\n prepareRequest(options) {\n options.headers['Authorization'] =\n 'Basic ' + Buffer.from('PAT:' + this.token).toString('base64');\n }\n // This handler cannot handle 401\n canHandleAuthentication(response) {\n return false;\n }\n handleAuthentication(httpClient, requestInfo, objs) {\n return null;\n }\n}\nexports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst http = require(\"http\");\nconst https = require(\"https\");\nconst pm = require(\"./proxy\");\nlet tunnel;\nvar HttpCodes;\n(function (HttpCodes) {\n HttpCodes[HttpCodes[\"OK\"] = 200] = \"OK\";\n HttpCodes[HttpCodes[\"MultipleChoices\"] = 300] = \"MultipleChoices\";\n HttpCodes[HttpCodes[\"MovedPermanently\"] = 301] = \"MovedPermanently\";\n HttpCodes[HttpCodes[\"ResourceMoved\"] = 302] = \"ResourceMoved\";\n HttpCodes[HttpCodes[\"SeeOther\"] = 303] = \"SeeOther\";\n HttpCodes[HttpCodes[\"NotModified\"] = 304] = \"NotModified\";\n HttpCodes[HttpCodes[\"UseProxy\"] = 305] = \"UseProxy\";\n HttpCodes[HttpCodes[\"SwitchProxy\"] = 306] = \"SwitchProxy\";\n HttpCodes[HttpCodes[\"TemporaryRedirect\"] = 307] = \"TemporaryRedirect\";\n HttpCodes[HttpCodes[\"PermanentRedirect\"] = 308] = \"PermanentRedirect\";\n HttpCodes[HttpCodes[\"BadRequest\"] = 400] = \"BadRequest\";\n HttpCodes[HttpCodes[\"Unauthorized\"] = 401] = \"Unauthorized\";\n HttpCodes[HttpCodes[\"PaymentRequired\"] = 402] = \"PaymentRequired\";\n HttpCodes[HttpCodes[\"Forbidden\"] = 403] = \"Forbidden\";\n HttpCodes[HttpCodes[\"NotFound\"] = 404] = \"NotFound\";\n HttpCodes[HttpCodes[\"MethodNotAllowed\"] = 405] = \"MethodNotAllowed\";\n HttpCodes[HttpCodes[\"NotAcceptable\"] = 406] = \"NotAcceptable\";\n HttpCodes[HttpCodes[\"ProxyAuthenticationRequired\"] = 407] = \"ProxyAuthenticationRequired\";\n HttpCodes[HttpCodes[\"RequestTimeout\"] = 408] = \"RequestTimeout\";\n HttpCodes[HttpCodes[\"Conflict\"] = 409] = \"Conflict\";\n HttpCodes[HttpCodes[\"Gone\"] = 410] = \"Gone\";\n HttpCodes[HttpCodes[\"TooManyRequests\"] = 429] = \"TooManyRequests\";\n HttpCodes[HttpCodes[\"InternalServerError\"] = 500] = \"InternalServerError\";\n HttpCodes[HttpCodes[\"NotImplemented\"] = 501] = \"NotImplemented\";\n HttpCodes[HttpCodes[\"BadGateway\"] = 502] = \"BadGateway\";\n HttpCodes[HttpCodes[\"ServiceUnavailable\"] = 503] = \"ServiceUnavailable\";\n HttpCodes[HttpCodes[\"GatewayTimeout\"] = 504] = \"GatewayTimeout\";\n})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {}));\nvar Headers;\n(function (Headers) {\n Headers[\"Accept\"] = \"accept\";\n Headers[\"ContentType\"] = \"content-type\";\n})(Headers = exports.Headers || (exports.Headers = {}));\nvar MediaTypes;\n(function (MediaTypes) {\n MediaTypes[\"ApplicationJson\"] = \"application/json\";\n})(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {}));\n/**\n * Returns the proxy URL, depending upon the supplied url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\nfunction getProxyUrl(serverUrl) {\n let proxyUrl = pm.getProxyUrl(new URL(serverUrl));\n return proxyUrl ? proxyUrl.href : '';\n}\nexports.getProxyUrl = getProxyUrl;\nconst HttpRedirectCodes = [\n HttpCodes.MovedPermanently,\n HttpCodes.ResourceMoved,\n HttpCodes.SeeOther,\n HttpCodes.TemporaryRedirect,\n HttpCodes.PermanentRedirect\n];\nconst HttpResponseRetryCodes = [\n HttpCodes.BadGateway,\n HttpCodes.ServiceUnavailable,\n HttpCodes.GatewayTimeout\n];\nconst RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD'];\nconst ExponentialBackoffCeiling = 10;\nconst ExponentialBackoffTimeSlice = 5;\nclass HttpClientError extends Error {\n constructor(message, statusCode) {\n super(message);\n this.name = 'HttpClientError';\n this.statusCode = statusCode;\n Object.setPrototypeOf(this, HttpClientError.prototype);\n }\n}\nexports.HttpClientError = HttpClientError;\nclass HttpClientResponse {\n constructor(message) {\n this.message = message;\n }\n readBody() {\n return new Promise(async (resolve, reject) => {\n let output = Buffer.alloc(0);\n this.message.on('data', (chunk) => {\n output = Buffer.concat([output, chunk]);\n });\n this.message.on('end', () => {\n resolve(output.toString());\n });\n });\n }\n}\nexports.HttpClientResponse = HttpClientResponse;\nfunction isHttps(requestUrl) {\n let parsedUrl = new URL(requestUrl);\n return parsedUrl.protocol === 'https:';\n}\nexports.isHttps = isHttps;\nclass HttpClient {\n constructor(userAgent, handlers, requestOptions) {\n this._ignoreSslError = false;\n this._allowRedirects = true;\n this._allowRedirectDowngrade = false;\n this._maxRedirects = 50;\n this._allowRetries = false;\n this._maxRetries = 1;\n this._keepAlive = false;\n this._disposed = false;\n this.userAgent = userAgent;\n this.handlers = handlers || [];\n this.requestOptions = requestOptions;\n if (requestOptions) {\n if (requestOptions.ignoreSslError != null) {\n this._ignoreSslError = requestOptions.ignoreSslError;\n }\n this._socketTimeout = requestOptions.socketTimeout;\n if (requestOptions.allowRedirects != null) {\n this._allowRedirects = requestOptions.allowRedirects;\n }\n if (requestOptions.allowRedirectDowngrade != null) {\n this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade;\n }\n if (requestOptions.maxRedirects != null) {\n this._maxRedirects = Math.max(requestOptions.maxRedirects, 0);\n }\n if (requestOptions.keepAlive != null) {\n this._keepAlive = requestOptions.keepAlive;\n }\n if (requestOptions.allowRetries != null) {\n this._allowRetries = requestOptions.allowRetries;\n }\n if (requestOptions.maxRetries != null) {\n this._maxRetries = requestOptions.maxRetries;\n }\n }\n }\n options(requestUrl, additionalHeaders) {\n return this.request('OPTIONS', requestUrl, null, additionalHeaders || {});\n }\n get(requestUrl, additionalHeaders) {\n return this.request('GET', requestUrl, null, additionalHeaders || {});\n }\n del(requestUrl, additionalHeaders) {\n return this.request('DELETE', requestUrl, null, additionalHeaders || {});\n }\n post(requestUrl, data, additionalHeaders) {\n return this.request('POST', requestUrl, data, additionalHeaders || {});\n }\n patch(requestUrl, data, additionalHeaders) {\n return this.request('PATCH', requestUrl, data, additionalHeaders || {});\n }\n put(requestUrl, data, additionalHeaders) {\n return this.request('PUT', requestUrl, data, additionalHeaders || {});\n }\n head(requestUrl, additionalHeaders) {\n return this.request('HEAD', requestUrl, null, additionalHeaders || {});\n }\n sendStream(verb, requestUrl, stream, additionalHeaders) {\n return this.request(verb, requestUrl, stream, additionalHeaders);\n }\n /**\n * Gets a typed object from an endpoint\n * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise\n */\n async getJson(requestUrl, additionalHeaders = {}) {\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n let res = await this.get(requestUrl, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n }\n async postJson(requestUrl, obj, additionalHeaders = {}) {\n let data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n let res = await this.post(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n }\n async putJson(requestUrl, obj, additionalHeaders = {}) {\n let data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n let res = await this.put(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n }\n async patchJson(requestUrl, obj, additionalHeaders = {}) {\n let data = JSON.stringify(obj, null, 2);\n additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);\n additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);\n let res = await this.patch(requestUrl, data, additionalHeaders);\n return this._processResponse(res, this.requestOptions);\n }\n /**\n * Makes a raw http request.\n * All other methods such as get, post, patch, and request ultimately call this.\n * Prefer get, del, post and patch\n */\n async request(verb, requestUrl, data, headers) {\n if (this._disposed) {\n throw new Error('Client has already been disposed.');\n }\n let parsedUrl = new URL(requestUrl);\n let info = this._prepareRequest(verb, parsedUrl, headers);\n // Only perform retries on reads since writes may not be idempotent.\n let maxTries = this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1\n ? this._maxRetries + 1\n : 1;\n let numTries = 0;\n let response;\n while (numTries < maxTries) {\n response = await this.requestRaw(info, data);\n // Check if it's an authentication challenge\n if (response &&\n response.message &&\n response.message.statusCode === HttpCodes.Unauthorized) {\n let authenticationHandler;\n for (let i = 0; i < this.handlers.length; i++) {\n if (this.handlers[i].canHandleAuthentication(response)) {\n authenticationHandler = this.handlers[i];\n break;\n }\n }\n if (authenticationHandler) {\n return authenticationHandler.handleAuthentication(this, info, data);\n }\n else {\n // We have received an unauthorized response but have no handlers to handle it.\n // Let the response return to the caller.\n return response;\n }\n }\n let redirectsRemaining = this._maxRedirects;\n while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1 &&\n this._allowRedirects &&\n redirectsRemaining > 0) {\n const redirectUrl = response.message.headers['location'];\n if (!redirectUrl) {\n // if there's no location to redirect to, we won't\n break;\n }\n let parsedRedirectUrl = new URL(redirectUrl);\n if (parsedUrl.protocol == 'https:' &&\n parsedUrl.protocol != parsedRedirectUrl.protocol &&\n !this._allowRedirectDowngrade) {\n throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.');\n }\n // we need to finish reading the response before reassigning response\n // which will leak the open socket.\n await response.readBody();\n // strip authorization header if redirected to a different hostname\n if (parsedRedirectUrl.hostname !== parsedUrl.hostname) {\n for (let header in headers) {\n // header names are case insensitive\n if (header.toLowerCase() === 'authorization') {\n delete headers[header];\n }\n }\n }\n // let's make the request with the new redirectUrl\n info = this._prepareRequest(verb, parsedRedirectUrl, headers);\n response = await this.requestRaw(info, data);\n redirectsRemaining--;\n }\n if (HttpResponseRetryCodes.indexOf(response.message.statusCode) == -1) {\n // If not a retry code, return immediately instead of retrying\n return response;\n }\n numTries += 1;\n if (numTries < maxTries) {\n await response.readBody();\n await this._performExponentialBackoff(numTries);\n }\n }\n return response;\n }\n /**\n * Needs to be called if keepAlive is set to true in request options.\n */\n dispose() {\n if (this._agent) {\n this._agent.destroy();\n }\n this._disposed = true;\n }\n /**\n * Raw request.\n * @param info\n * @param data\n */\n requestRaw(info, data) {\n return new Promise((resolve, reject) => {\n let callbackForResult = function (err, res) {\n if (err) {\n reject(err);\n }\n resolve(res);\n };\n this.requestRawWithCallback(info, data, callbackForResult);\n });\n }\n /**\n * Raw request with callback.\n * @param info\n * @param data\n * @param onResult\n */\n requestRawWithCallback(info, data, onResult) {\n let socket;\n if (typeof data === 'string') {\n info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8');\n }\n let callbackCalled = false;\n let handleResult = (err, res) => {\n if (!callbackCalled) {\n callbackCalled = true;\n onResult(err, res);\n }\n };\n let req = info.httpModule.request(info.options, (msg) => {\n let res = new HttpClientResponse(msg);\n handleResult(null, res);\n });\n req.on('socket', sock => {\n socket = sock;\n });\n // If we ever get disconnected, we want the socket to timeout eventually\n req.setTimeout(this._socketTimeout || 3 * 60000, () => {\n if (socket) {\n socket.end();\n }\n handleResult(new Error('Request timeout: ' + info.options.path), null);\n });\n req.on('error', function (err) {\n // err has statusCode property\n // res should have headers\n handleResult(err, null);\n });\n if (data && typeof data === 'string') {\n req.write(data, 'utf8');\n }\n if (data && typeof data !== 'string') {\n data.on('close', function () {\n req.end();\n });\n data.pipe(req);\n }\n else {\n req.end();\n }\n }\n /**\n * Gets an http agent. This function is useful when you need an http agent that handles\n * routing through a proxy server - depending upon the url and proxy environment variables.\n * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com\n */\n getAgent(serverUrl) {\n let parsedUrl = new URL(serverUrl);\n return this._getAgent(parsedUrl);\n }\n _prepareRequest(method, requestUrl, headers) {\n const info = {};\n info.parsedUrl = requestUrl;\n const usingSsl = info.parsedUrl.protocol === 'https:';\n info.httpModule = usingSsl ? https : http;\n const defaultPort = usingSsl ? 443 : 80;\n info.options = {};\n info.options.host = info.parsedUrl.hostname;\n info.options.port = info.parsedUrl.port\n ? parseInt(info.parsedUrl.port)\n : defaultPort;\n info.options.path =\n (info.parsedUrl.pathname || '') + (info.parsedUrl.search || '');\n info.options.method = method;\n info.options.headers = this._mergeHeaders(headers);\n if (this.userAgent != null) {\n info.options.headers['user-agent'] = this.userAgent;\n }\n info.options.agent = this._getAgent(info.parsedUrl);\n // gives handlers an opportunity to participate\n if (this.handlers) {\n this.handlers.forEach(handler => {\n handler.prepareRequest(info.options);\n });\n }\n return info;\n }\n _mergeHeaders(headers) {\n const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});\n if (this.requestOptions && this.requestOptions.headers) {\n return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers));\n }\n return lowercaseKeys(headers || {});\n }\n _getExistingOrDefaultHeader(additionalHeaders, header, _default) {\n const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});\n let clientHeader;\n if (this.requestOptions && this.requestOptions.headers) {\n clientHeader = lowercaseKeys(this.requestOptions.headers)[header];\n }\n return additionalHeaders[header] || clientHeader || _default;\n }\n _getAgent(parsedUrl) {\n let agent;\n let proxyUrl = pm.getProxyUrl(parsedUrl);\n let useProxy = proxyUrl && proxyUrl.hostname;\n if (this._keepAlive && useProxy) {\n agent = this._proxyAgent;\n }\n if (this._keepAlive && !useProxy) {\n agent = this._agent;\n }\n // if agent is already assigned use that agent.\n if (!!agent) {\n return agent;\n }\n const usingSsl = parsedUrl.protocol === 'https:';\n let maxSockets = 100;\n if (!!this.requestOptions) {\n maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets;\n }\n if (useProxy) {\n // If using proxy, need tunnel\n if (!tunnel) {\n tunnel = require('tunnel');\n }\n const agentOptions = {\n maxSockets: maxSockets,\n keepAlive: this._keepAlive,\n proxy: {\n ...((proxyUrl.username || proxyUrl.password) && {\n proxyAuth: `${proxyUrl.username}:${proxyUrl.password}`\n }),\n host: proxyUrl.hostname,\n port: proxyUrl.port\n }\n };\n let tunnelAgent;\n const overHttps = proxyUrl.protocol === 'https:';\n if (usingSsl) {\n tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp;\n }\n else {\n tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp;\n }\n agent = tunnelAgent(agentOptions);\n this._proxyAgent = agent;\n }\n // if reusing agent across request and tunneling agent isn't assigned create a new agent\n if (this._keepAlive && !agent) {\n const options = { keepAlive: this._keepAlive, maxSockets: maxSockets };\n agent = usingSsl ? new https.Agent(options) : new http.Agent(options);\n this._agent = agent;\n }\n // if not using private agent and tunnel agent isn't setup then use global agent\n if (!agent) {\n agent = usingSsl ? https.globalAgent : http.globalAgent;\n }\n if (usingSsl && this._ignoreSslError) {\n // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process\n // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options\n // we have to cast it to any and change it directly\n agent.options = Object.assign(agent.options || {}, {\n rejectUnauthorized: false\n });\n }\n return agent;\n }\n _performExponentialBackoff(retryNumber) {\n retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber);\n const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber);\n return new Promise(resolve => setTimeout(() => resolve(), ms));\n }\n static dateTimeDeserializer(key, value) {\n if (typeof value === 'string') {\n let a = new Date(value);\n if (!isNaN(a.valueOf())) {\n return a;\n }\n }\n return value;\n }\n async _processResponse(res, options) {\n return new Promise(async (resolve, reject) => {\n const statusCode = res.message.statusCode;\n const response = {\n statusCode: statusCode,\n result: null,\n headers: {}\n };\n // not found leads to null obj returned\n if (statusCode == HttpCodes.NotFound) {\n resolve(response);\n }\n let obj;\n let contents;\n // get the result from the body\n try {\n contents = await res.readBody();\n if (contents && contents.length > 0) {\n if (options && options.deserializeDates) {\n obj = JSON.parse(contents, HttpClient.dateTimeDeserializer);\n }\n else {\n obj = JSON.parse(contents);\n }\n response.result = obj;\n }\n response.headers = res.message.headers;\n }\n catch (err) {\n // Invalid resource (contents not json); leaving result obj null\n }\n // note that 3xx redirects are handled by the http layer.\n if (statusCode > 299) {\n let msg;\n // if exception/error in body, attempt to get better error\n if (obj && obj.message) {\n msg = obj.message;\n }\n else if (contents && contents.length > 0) {\n // it may be the case that the exception is in the body message as string\n msg = contents;\n }\n else {\n msg = 'Failed request: (' + statusCode + ')';\n }\n let err = new HttpClientError(msg, statusCode);\n err.result = response.result;\n reject(err);\n }\n else {\n resolve(response);\n }\n });\n }\n}\nexports.HttpClient = HttpClient;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction getProxyUrl(reqUrl) {\n let usingSsl = reqUrl.protocol === 'https:';\n let proxyUrl;\n if (checkBypass(reqUrl)) {\n return proxyUrl;\n }\n let proxyVar;\n if (usingSsl) {\n proxyVar = process.env['https_proxy'] || process.env['HTTPS_PROXY'];\n }\n else {\n proxyVar = process.env['http_proxy'] || process.env['HTTP_PROXY'];\n }\n if (proxyVar) {\n proxyUrl = new URL(proxyVar);\n }\n return proxyUrl;\n}\nexports.getProxyUrl = getProxyUrl;\nfunction checkBypass(reqUrl) {\n if (!reqUrl.hostname) {\n return false;\n }\n let noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || '';\n if (!noProxy) {\n return false;\n }\n // Determine the request port\n let reqPort;\n if (reqUrl.port) {\n reqPort = Number(reqUrl.port);\n }\n else if (reqUrl.protocol === 'http:') {\n reqPort = 80;\n }\n else if (reqUrl.protocol === 'https:') {\n reqPort = 443;\n }\n // Format the request hostname and hostname with port\n let upperReqHosts = [reqUrl.hostname.toUpperCase()];\n if (typeof reqPort === 'number') {\n upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`);\n }\n // Compare request host against noproxy\n for (let upperNoProxyItem of noProxy\n .split(',')\n .map(x => x.trim().toUpperCase())\n .filter(x => x)) {\n if (upperReqHosts.some(x => x === upperNoProxyItem)) {\n return true;\n }\n }\n return false;\n}\nexports.checkBypass = checkBypass;\n","\"use strict\";\n\nvar realFetch = require('node-fetch');\nmodule.exports = function(url, options) {\n\tif (/^\\/\\//.test(url)) {\n\t\turl = 'https:' + url;\n\t}\n\treturn realFetch.call(this, url, options);\n};\n\nif (!global.fetch) {\n\tglobal.fetch = module.exports;\n\tglobal.Response = realFetch.Response;\n\tglobal.Headers = realFetch.Headers;\n\tglobal.Request = realFetch.Request;\n}\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar Stream = _interopDefault(require('stream'));\nvar http = _interopDefault(require('http'));\nvar Url = _interopDefault(require('url'));\nvar whatwgUrl = _interopDefault(require('whatwg-url'));\nvar https = _interopDefault(require('https'));\nvar zlib = _interopDefault(require('zlib'));\n\n// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js\n\n// fix for \"Readable\" isn't a named export issue\nconst Readable = Stream.Readable;\n\nconst BUFFER = Symbol('buffer');\nconst TYPE = Symbol('type');\n\nclass Blob {\n\tconstructor() {\n\t\tthis[TYPE] = '';\n\n\t\tconst blobParts = arguments[0];\n\t\tconst options = arguments[1];\n\n\t\tconst buffers = [];\n\t\tlet size = 0;\n\n\t\tif (blobParts) {\n\t\t\tconst a = blobParts;\n\t\t\tconst length = Number(a.length);\n\t\t\tfor (let i = 0; i < length; i++) {\n\t\t\t\tconst element = a[i];\n\t\t\t\tlet buffer;\n\t\t\t\tif (element instanceof Buffer) {\n\t\t\t\t\tbuffer = element;\n\t\t\t\t} else if (ArrayBuffer.isView(element)) {\n\t\t\t\t\tbuffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength);\n\t\t\t\t} else if (element instanceof ArrayBuffer) {\n\t\t\t\t\tbuffer = Buffer.from(element);\n\t\t\t\t} else if (element instanceof Blob) {\n\t\t\t\t\tbuffer = element[BUFFER];\n\t\t\t\t} else {\n\t\t\t\t\tbuffer = Buffer.from(typeof element === 'string' ? element : String(element));\n\t\t\t\t}\n\t\t\t\tsize += buffer.length;\n\t\t\t\tbuffers.push(buffer);\n\t\t\t}\n\t\t}\n\n\t\tthis[BUFFER] = Buffer.concat(buffers);\n\n\t\tlet type = options && options.type !== undefined && String(options.type).toLowerCase();\n\t\tif (type && !/[^\\u0020-\\u007E]/.test(type)) {\n\t\t\tthis[TYPE] = type;\n\t\t}\n\t}\n\tget size() {\n\t\treturn this[BUFFER].length;\n\t}\n\tget type() {\n\t\treturn this[TYPE];\n\t}\n\ttext() {\n\t\treturn Promise.resolve(this[BUFFER].toString());\n\t}\n\tarrayBuffer() {\n\t\tconst buf = this[BUFFER];\n\t\tconst ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n\t\treturn Promise.resolve(ab);\n\t}\n\tstream() {\n\t\tconst readable = new Readable();\n\t\treadable._read = function () {};\n\t\treadable.push(this[BUFFER]);\n\t\treadable.push(null);\n\t\treturn readable;\n\t}\n\ttoString() {\n\t\treturn '[object Blob]';\n\t}\n\tslice() {\n\t\tconst size = this.size;\n\n\t\tconst start = arguments[0];\n\t\tconst end = arguments[1];\n\t\tlet relativeStart, relativeEnd;\n\t\tif (start === undefined) {\n\t\t\trelativeStart = 0;\n\t\t} else if (start < 0) {\n\t\t\trelativeStart = Math.max(size + start, 0);\n\t\t} else {\n\t\t\trelativeStart = Math.min(start, size);\n\t\t}\n\t\tif (end === undefined) {\n\t\t\trelativeEnd = size;\n\t\t} else if (end < 0) {\n\t\t\trelativeEnd = Math.max(size + end, 0);\n\t\t} else {\n\t\t\trelativeEnd = Math.min(end, size);\n\t\t}\n\t\tconst span = Math.max(relativeEnd - relativeStart, 0);\n\n\t\tconst buffer = this[BUFFER];\n\t\tconst slicedBuffer = buffer.slice(relativeStart, relativeStart + span);\n\t\tconst blob = new Blob([], { type: arguments[2] });\n\t\tblob[BUFFER] = slicedBuffer;\n\t\treturn blob;\n\t}\n}\n\nObject.defineProperties(Blob.prototype, {\n\tsize: { enumerable: true },\n\ttype: { enumerable: true },\n\tslice: { enumerable: true }\n});\n\nObject.defineProperty(Blob.prototype, Symbol.toStringTag, {\n\tvalue: 'Blob',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\n/**\n * fetch-error.js\n *\n * FetchError interface for operational errors\n */\n\n/**\n * Create FetchError instance\n *\n * @param String message Error message for human\n * @param String type Error type for machine\n * @param String systemError For Node.js system error\n * @return FetchError\n */\nfunction FetchError(message, type, systemError) {\n Error.call(this, message);\n\n this.message = message;\n this.type = type;\n\n // when err.type is `system`, err.code contains system error code\n if (systemError) {\n this.code = this.errno = systemError.code;\n }\n\n // hide custom error implementation details from end-users\n Error.captureStackTrace(this, this.constructor);\n}\n\nFetchError.prototype = Object.create(Error.prototype);\nFetchError.prototype.constructor = FetchError;\nFetchError.prototype.name = 'FetchError';\n\nlet convert;\ntry {\n\tconvert = require('encoding').convert;\n} catch (e) {}\n\nconst INTERNALS = Symbol('Body internals');\n\n// fix an issue where \"PassThrough\" isn't a named export for node <10\nconst PassThrough = Stream.PassThrough;\n\n/**\n * Body mixin\n *\n * Ref: https://fetch.spec.whatwg.org/#body\n *\n * @param Stream body Readable stream\n * @param Object opts Response options\n * @return Void\n */\nfunction Body(body) {\n\tvar _this = this;\n\n\tvar _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n\t _ref$size = _ref.size;\n\n\tlet size = _ref$size === undefined ? 0 : _ref$size;\n\tvar _ref$timeout = _ref.timeout;\n\tlet timeout = _ref$timeout === undefined ? 0 : _ref$timeout;\n\n\tif (body == null) {\n\t\t// body is undefined or null\n\t\tbody = null;\n\t} else if (isURLSearchParams(body)) {\n\t\t// body is a URLSearchParams\n\t\tbody = Buffer.from(body.toString());\n\t} else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {\n\t\t// body is ArrayBuffer\n\t\tbody = Buffer.from(body);\n\t} else if (ArrayBuffer.isView(body)) {\n\t\t// body is ArrayBufferView\n\t\tbody = Buffer.from(body.buffer, body.byteOffset, body.byteLength);\n\t} else if (body instanceof Stream) ; else {\n\t\t// none of the above\n\t\t// coerce to string then buffer\n\t\tbody = Buffer.from(String(body));\n\t}\n\tthis[INTERNALS] = {\n\t\tbody,\n\t\tdisturbed: false,\n\t\terror: null\n\t};\n\tthis.size = size;\n\tthis.timeout = timeout;\n\n\tif (body instanceof Stream) {\n\t\tbody.on('error', function (err) {\n\t\t\tconst error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err);\n\t\t\t_this[INTERNALS].error = error;\n\t\t});\n\t}\n}\n\nBody.prototype = {\n\tget body() {\n\t\treturn this[INTERNALS].body;\n\t},\n\n\tget bodyUsed() {\n\t\treturn this[INTERNALS].disturbed;\n\t},\n\n\t/**\n * Decode response as ArrayBuffer\n *\n * @return Promise\n */\n\tarrayBuffer() {\n\t\treturn consumeBody.call(this).then(function (buf) {\n\t\t\treturn buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n\t\t});\n\t},\n\n\t/**\n * Return raw response as Blob\n *\n * @return Promise\n */\n\tblob() {\n\t\tlet ct = this.headers && this.headers.get('content-type') || '';\n\t\treturn consumeBody.call(this).then(function (buf) {\n\t\t\treturn Object.assign(\n\t\t\t// Prevent copying\n\t\t\tnew Blob([], {\n\t\t\t\ttype: ct.toLowerCase()\n\t\t\t}), {\n\t\t\t\t[BUFFER]: buf\n\t\t\t});\n\t\t});\n\t},\n\n\t/**\n * Decode response as json\n *\n * @return Promise\n */\n\tjson() {\n\t\tvar _this2 = this;\n\n\t\treturn consumeBody.call(this).then(function (buffer) {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(buffer.toString());\n\t\t\t} catch (err) {\n\t\t\t\treturn Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n * Decode response as text\n *\n * @return Promise\n */\n\ttext() {\n\t\treturn consumeBody.call(this).then(function (buffer) {\n\t\t\treturn buffer.toString();\n\t\t});\n\t},\n\n\t/**\n * Decode response as buffer (non-spec api)\n *\n * @return Promise\n */\n\tbuffer() {\n\t\treturn consumeBody.call(this);\n\t},\n\n\t/**\n * Decode response as text, while automatically detecting the encoding and\n * trying to decode to UTF-8 (non-spec api)\n *\n * @return Promise\n */\n\ttextConverted() {\n\t\tvar _this3 = this;\n\n\t\treturn consumeBody.call(this).then(function (buffer) {\n\t\t\treturn convertBody(buffer, _this3.headers);\n\t\t});\n\t}\n};\n\n// In browsers, all properties are enumerable.\nObject.defineProperties(Body.prototype, {\n\tbody: { enumerable: true },\n\tbodyUsed: { enumerable: true },\n\tarrayBuffer: { enumerable: true },\n\tblob: { enumerable: true },\n\tjson: { enumerable: true },\n\ttext: { enumerable: true }\n});\n\nBody.mixIn = function (proto) {\n\tfor (const name of Object.getOwnPropertyNames(Body.prototype)) {\n\t\t// istanbul ignore else: future proof\n\t\tif (!(name in proto)) {\n\t\t\tconst desc = Object.getOwnPropertyDescriptor(Body.prototype, name);\n\t\t\tObject.defineProperty(proto, name, desc);\n\t\t}\n\t}\n};\n\n/**\n * Consume and convert an entire Body to a Buffer.\n *\n * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body\n *\n * @return Promise\n */\nfunction consumeBody() {\n\tvar _this4 = this;\n\n\tif (this[INTERNALS].disturbed) {\n\t\treturn Body.Promise.reject(new TypeError(`body used already for: ${this.url}`));\n\t}\n\n\tthis[INTERNALS].disturbed = true;\n\n\tif (this[INTERNALS].error) {\n\t\treturn Body.Promise.reject(this[INTERNALS].error);\n\t}\n\n\tlet body = this.body;\n\n\t// body is null\n\tif (body === null) {\n\t\treturn Body.Promise.resolve(Buffer.alloc(0));\n\t}\n\n\t// body is blob\n\tif (isBlob(body)) {\n\t\tbody = body.stream();\n\t}\n\n\t// body is buffer\n\tif (Buffer.isBuffer(body)) {\n\t\treturn Body.Promise.resolve(body);\n\t}\n\n\t// istanbul ignore if: should never happen\n\tif (!(body instanceof Stream)) {\n\t\treturn Body.Promise.resolve(Buffer.alloc(0));\n\t}\n\n\t// body is stream\n\t// get ready to actually consume the body\n\tlet accum = [];\n\tlet accumBytes = 0;\n\tlet abort = false;\n\n\treturn new Body.Promise(function (resolve, reject) {\n\t\tlet resTimeout;\n\n\t\t// allow timeout on slow response body\n\t\tif (_this4.timeout) {\n\t\t\tresTimeout = setTimeout(function () {\n\t\t\t\tabort = true;\n\t\t\t\treject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout'));\n\t\t\t}, _this4.timeout);\n\t\t}\n\n\t\t// handle stream errors\n\t\tbody.on('error', function (err) {\n\t\t\tif (err.name === 'AbortError') {\n\t\t\t\t// if the request was aborted, reject with this Error\n\t\t\t\tabort = true;\n\t\t\t\treject(err);\n\t\t\t} else {\n\t\t\t\t// other errors, such as incorrect content-encoding\n\t\t\t\treject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err));\n\t\t\t}\n\t\t});\n\n\t\tbody.on('data', function (chunk) {\n\t\t\tif (abort || chunk === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (_this4.size && accumBytes + chunk.length > _this4.size) {\n\t\t\t\tabort = true;\n\t\t\t\treject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size'));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\taccumBytes += chunk.length;\n\t\t\taccum.push(chunk);\n\t\t});\n\n\t\tbody.on('end', function () {\n\t\t\tif (abort) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tclearTimeout(resTimeout);\n\n\t\t\ttry {\n\t\t\t\tresolve(Buffer.concat(accum, accumBytes));\n\t\t\t} catch (err) {\n\t\t\t\t// handle streams that have accumulated too much data (issue #414)\n\t\t\t\treject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err));\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Detect buffer encoding and convert to target encoding\n * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding\n *\n * @param Buffer buffer Incoming buffer\n * @param String encoding Target encoding\n * @return String\n */\nfunction convertBody(buffer, headers) {\n\tif (typeof convert !== 'function') {\n\t\tthrow new Error('The package `encoding` must be installed to use the textConverted() function');\n\t}\n\n\tconst ct = headers.get('content-type');\n\tlet charset = 'utf-8';\n\tlet res, str;\n\n\t// header\n\tif (ct) {\n\t\tres = /charset=([^;]*)/i.exec(ct);\n\t}\n\n\t// no charset in content type, peek at response body for at most 1024 bytes\n\tstr = buffer.slice(0, 1024).toString();\n\n\t// html5\n\tif (!res && str) {\n\t\tres = / 0 && arguments[0] !== undefined ? arguments[0] : undefined;\n\n\t\tthis[MAP] = Object.create(null);\n\n\t\tif (init instanceof Headers) {\n\t\t\tconst rawHeaders = init.raw();\n\t\t\tconst headerNames = Object.keys(rawHeaders);\n\n\t\t\tfor (const headerName of headerNames) {\n\t\t\t\tfor (const value of rawHeaders[headerName]) {\n\t\t\t\t\tthis.append(headerName, value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// We don't worry about converting prop to ByteString here as append()\n\t\t// will handle it.\n\t\tif (init == null) ; else if (typeof init === 'object') {\n\t\t\tconst method = init[Symbol.iterator];\n\t\t\tif (method != null) {\n\t\t\t\tif (typeof method !== 'function') {\n\t\t\t\t\tthrow new TypeError('Header pairs must be iterable');\n\t\t\t\t}\n\n\t\t\t\t// sequence>\n\t\t\t\t// Note: per spec we have to first exhaust the lists then process them\n\t\t\t\tconst pairs = [];\n\t\t\t\tfor (const pair of init) {\n\t\t\t\t\tif (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') {\n\t\t\t\t\t\tthrow new TypeError('Each header pair must be iterable');\n\t\t\t\t\t}\n\t\t\t\t\tpairs.push(Array.from(pair));\n\t\t\t\t}\n\n\t\t\t\tfor (const pair of pairs) {\n\t\t\t\t\tif (pair.length !== 2) {\n\t\t\t\t\t\tthrow new TypeError('Each header pair must be a name/value tuple');\n\t\t\t\t\t}\n\t\t\t\t\tthis.append(pair[0], pair[1]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// record\n\t\t\t\tfor (const key of Object.keys(init)) {\n\t\t\t\t\tconst value = init[key];\n\t\t\t\t\tthis.append(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('Provided initializer must be an object');\n\t\t}\n\t}\n\n\t/**\n * Return combined header value given name\n *\n * @param String name Header name\n * @return Mixed\n */\n\tget(name) {\n\t\tname = `${name}`;\n\t\tvalidateName(name);\n\t\tconst key = find(this[MAP], name);\n\t\tif (key === undefined) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this[MAP][key].join(', ');\n\t}\n\n\t/**\n * Iterate over all headers\n *\n * @param Function callback Executed for each item with parameters (value, name, thisArg)\n * @param Boolean thisArg `this` context for callback function\n * @return Void\n */\n\tforEach(callback) {\n\t\tlet thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;\n\n\t\tlet pairs = getHeaders(this);\n\t\tlet i = 0;\n\t\twhile (i < pairs.length) {\n\t\t\tvar _pairs$i = pairs[i];\n\t\t\tconst name = _pairs$i[0],\n\t\t\t value = _pairs$i[1];\n\n\t\t\tcallback.call(thisArg, value, name, this);\n\t\t\tpairs = getHeaders(this);\n\t\t\ti++;\n\t\t}\n\t}\n\n\t/**\n * Overwrite header values given name\n *\n * @param String name Header name\n * @param String value Header value\n * @return Void\n */\n\tset(name, value) {\n\t\tname = `${name}`;\n\t\tvalue = `${value}`;\n\t\tvalidateName(name);\n\t\tvalidateValue(value);\n\t\tconst key = find(this[MAP], name);\n\t\tthis[MAP][key !== undefined ? key : name] = [value];\n\t}\n\n\t/**\n * Append a value onto existing header\n *\n * @param String name Header name\n * @param String value Header value\n * @return Void\n */\n\tappend(name, value) {\n\t\tname = `${name}`;\n\t\tvalue = `${value}`;\n\t\tvalidateName(name);\n\t\tvalidateValue(value);\n\t\tconst key = find(this[MAP], name);\n\t\tif (key !== undefined) {\n\t\t\tthis[MAP][key].push(value);\n\t\t} else {\n\t\t\tthis[MAP][name] = [value];\n\t\t}\n\t}\n\n\t/**\n * Check for header name existence\n *\n * @param String name Header name\n * @return Boolean\n */\n\thas(name) {\n\t\tname = `${name}`;\n\t\tvalidateName(name);\n\t\treturn find(this[MAP], name) !== undefined;\n\t}\n\n\t/**\n * Delete all header values given name\n *\n * @param String name Header name\n * @return Void\n */\n\tdelete(name) {\n\t\tname = `${name}`;\n\t\tvalidateName(name);\n\t\tconst key = find(this[MAP], name);\n\t\tif (key !== undefined) {\n\t\t\tdelete this[MAP][key];\n\t\t}\n\t}\n\n\t/**\n * Return raw headers (non-spec api)\n *\n * @return Object\n */\n\traw() {\n\t\treturn this[MAP];\n\t}\n\n\t/**\n * Get an iterator on keys.\n *\n * @return Iterator\n */\n\tkeys() {\n\t\treturn createHeadersIterator(this, 'key');\n\t}\n\n\t/**\n * Get an iterator on values.\n *\n * @return Iterator\n */\n\tvalues() {\n\t\treturn createHeadersIterator(this, 'value');\n\t}\n\n\t/**\n * Get an iterator on entries.\n *\n * This is the default iterator of the Headers object.\n *\n * @return Iterator\n */\n\t[Symbol.iterator]() {\n\t\treturn createHeadersIterator(this, 'key+value');\n\t}\n}\nHeaders.prototype.entries = Headers.prototype[Symbol.iterator];\n\nObject.defineProperty(Headers.prototype, Symbol.toStringTag, {\n\tvalue: 'Headers',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\nObject.defineProperties(Headers.prototype, {\n\tget: { enumerable: true },\n\tforEach: { enumerable: true },\n\tset: { enumerable: true },\n\tappend: { enumerable: true },\n\thas: { enumerable: true },\n\tdelete: { enumerable: true },\n\tkeys: { enumerable: true },\n\tvalues: { enumerable: true },\n\tentries: { enumerable: true }\n});\n\nfunction getHeaders(headers) {\n\tlet kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value';\n\n\tconst keys = Object.keys(headers[MAP]).sort();\n\treturn keys.map(kind === 'key' ? function (k) {\n\t\treturn k.toLowerCase();\n\t} : kind === 'value' ? function (k) {\n\t\treturn headers[MAP][k].join(', ');\n\t} : function (k) {\n\t\treturn [k.toLowerCase(), headers[MAP][k].join(', ')];\n\t});\n}\n\nconst INTERNAL = Symbol('internal');\n\nfunction createHeadersIterator(target, kind) {\n\tconst iterator = Object.create(HeadersIteratorPrototype);\n\titerator[INTERNAL] = {\n\t\ttarget,\n\t\tkind,\n\t\tindex: 0\n\t};\n\treturn iterator;\n}\n\nconst HeadersIteratorPrototype = Object.setPrototypeOf({\n\tnext() {\n\t\t// istanbul ignore if\n\t\tif (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {\n\t\t\tthrow new TypeError('Value of `this` is not a HeadersIterator');\n\t\t}\n\n\t\tvar _INTERNAL = this[INTERNAL];\n\t\tconst target = _INTERNAL.target,\n\t\t kind = _INTERNAL.kind,\n\t\t index = _INTERNAL.index;\n\n\t\tconst values = getHeaders(target, kind);\n\t\tconst len = values.length;\n\t\tif (index >= len) {\n\t\t\treturn {\n\t\t\t\tvalue: undefined,\n\t\t\t\tdone: true\n\t\t\t};\n\t\t}\n\n\t\tthis[INTERNAL].index = index + 1;\n\n\t\treturn {\n\t\t\tvalue: values[index],\n\t\t\tdone: false\n\t\t};\n\t}\n}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));\n\nObject.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {\n\tvalue: 'HeadersIterator',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\n/**\n * Export the Headers object in a form that Node.js can consume.\n *\n * @param Headers headers\n * @return Object\n */\nfunction exportNodeCompatibleHeaders(headers) {\n\tconst obj = Object.assign({ __proto__: null }, headers[MAP]);\n\n\t// http.request() only supports string as Host header. This hack makes\n\t// specifying custom Host header possible.\n\tconst hostHeaderKey = find(headers[MAP], 'Host');\n\tif (hostHeaderKey !== undefined) {\n\t\tobj[hostHeaderKey] = obj[hostHeaderKey][0];\n\t}\n\n\treturn obj;\n}\n\n/**\n * Create a Headers object from an object of headers, ignoring those that do\n * not conform to HTTP grammar productions.\n *\n * @param Object obj Object of headers\n * @return Headers\n */\nfunction createHeadersLenient(obj) {\n\tconst headers = new Headers();\n\tfor (const name of Object.keys(obj)) {\n\t\tif (invalidTokenRegex.test(name)) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (Array.isArray(obj[name])) {\n\t\t\tfor (const val of obj[name]) {\n\t\t\t\tif (invalidHeaderCharRegex.test(val)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (headers[MAP][name] === undefined) {\n\t\t\t\t\theaders[MAP][name] = [val];\n\t\t\t\t} else {\n\t\t\t\t\theaders[MAP][name].push(val);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (!invalidHeaderCharRegex.test(obj[name])) {\n\t\t\theaders[MAP][name] = [obj[name]];\n\t\t}\n\t}\n\treturn headers;\n}\n\nconst INTERNALS$1 = Symbol('Response internals');\n\n// fix an issue where \"STATUS_CODES\" aren't a named export for node <10\nconst STATUS_CODES = http.STATUS_CODES;\n\n/**\n * Response class\n *\n * @param Stream body Readable stream\n * @param Object opts Response options\n * @return Void\n */\nclass Response {\n\tconstructor() {\n\t\tlet body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\t\tlet opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tBody.call(this, body, opts);\n\n\t\tconst status = opts.status || 200;\n\t\tconst headers = new Headers(opts.headers);\n\n\t\tif (body != null && !headers.has('Content-Type')) {\n\t\t\tconst contentType = extractContentType(body);\n\t\t\tif (contentType) {\n\t\t\t\theaders.append('Content-Type', contentType);\n\t\t\t}\n\t\t}\n\n\t\tthis[INTERNALS$1] = {\n\t\t\turl: opts.url,\n\t\t\tstatus,\n\t\t\tstatusText: opts.statusText || STATUS_CODES[status],\n\t\t\theaders,\n\t\t\tcounter: opts.counter\n\t\t};\n\t}\n\n\tget url() {\n\t\treturn this[INTERNALS$1].url || '';\n\t}\n\n\tget status() {\n\t\treturn this[INTERNALS$1].status;\n\t}\n\n\t/**\n * Convenience property representing if the request ended normally\n */\n\tget ok() {\n\t\treturn this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300;\n\t}\n\n\tget redirected() {\n\t\treturn this[INTERNALS$1].counter > 0;\n\t}\n\n\tget statusText() {\n\t\treturn this[INTERNALS$1].statusText;\n\t}\n\n\tget headers() {\n\t\treturn this[INTERNALS$1].headers;\n\t}\n\n\t/**\n * Clone this response\n *\n * @return Response\n */\n\tclone() {\n\t\treturn new Response(clone(this), {\n\t\t\turl: this.url,\n\t\t\tstatus: this.status,\n\t\t\tstatusText: this.statusText,\n\t\t\theaders: this.headers,\n\t\t\tok: this.ok,\n\t\t\tredirected: this.redirected\n\t\t});\n\t}\n}\n\nBody.mixIn(Response.prototype);\n\nObject.defineProperties(Response.prototype, {\n\turl: { enumerable: true },\n\tstatus: { enumerable: true },\n\tok: { enumerable: true },\n\tredirected: { enumerable: true },\n\tstatusText: { enumerable: true },\n\theaders: { enumerable: true },\n\tclone: { enumerable: true }\n});\n\nObject.defineProperty(Response.prototype, Symbol.toStringTag, {\n\tvalue: 'Response',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\nconst INTERNALS$2 = Symbol('Request internals');\nconst URL = Url.URL || whatwgUrl.URL;\n\n// fix an issue where \"format\", \"parse\" aren't a named export for node <10\nconst parse_url = Url.parse;\nconst format_url = Url.format;\n\n/**\n * Wrapper around `new URL` to handle arbitrary URLs\n *\n * @param {string} urlStr\n * @return {void}\n */\nfunction parseURL(urlStr) {\n\t/*\n \tCheck whether the URL is absolute or not\n \t\tScheme: https://tools.ietf.org/html/rfc3986#section-3.1\n \tAbsolute URL: https://tools.ietf.org/html/rfc3986#section-4.3\n */\n\tif (/^[a-zA-Z][a-zA-Z\\d+\\-.]*:/.exec(urlStr)) {\n\t\turlStr = new URL(urlStr).toString();\n\t}\n\n\t// Fallback to old implementation for arbitrary URLs\n\treturn parse_url(urlStr);\n}\n\nconst streamDestructionSupported = 'destroy' in Stream.Readable.prototype;\n\n/**\n * Check if a value is an instance of Request.\n *\n * @param Mixed input\n * @return Boolean\n */\nfunction isRequest(input) {\n\treturn typeof input === 'object' && typeof input[INTERNALS$2] === 'object';\n}\n\nfunction isAbortSignal(signal) {\n\tconst proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal);\n\treturn !!(proto && proto.constructor.name === 'AbortSignal');\n}\n\n/**\n * Request class\n *\n * @param Mixed input Url or Request instance\n * @param Object init Custom options\n * @return Void\n */\nclass Request {\n\tconstructor(input) {\n\t\tlet init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tlet parsedURL;\n\n\t\t// normalize input\n\t\tif (!isRequest(input)) {\n\t\t\tif (input && input.href) {\n\t\t\t\t// in order to support Node.js' Url objects; though WHATWG's URL objects\n\t\t\t\t// will fall into this branch also (since their `toString()` will return\n\t\t\t\t// `href` property anyway)\n\t\t\t\tparsedURL = parseURL(input.href);\n\t\t\t} else {\n\t\t\t\t// coerce input to a string before attempting to parse\n\t\t\t\tparsedURL = parseURL(`${input}`);\n\t\t\t}\n\t\t\tinput = {};\n\t\t} else {\n\t\t\tparsedURL = parseURL(input.url);\n\t\t}\n\n\t\tlet method = init.method || input.method || 'GET';\n\t\tmethod = method.toUpperCase();\n\n\t\tif ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) {\n\t\t\tthrow new TypeError('Request with GET/HEAD method cannot have body');\n\t\t}\n\n\t\tlet inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null;\n\n\t\tBody.call(this, inputBody, {\n\t\t\ttimeout: init.timeout || input.timeout || 0,\n\t\t\tsize: init.size || input.size || 0\n\t\t});\n\n\t\tconst headers = new Headers(init.headers || input.headers || {});\n\n\t\tif (inputBody != null && !headers.has('Content-Type')) {\n\t\t\tconst contentType = extractContentType(inputBody);\n\t\t\tif (contentType) {\n\t\t\t\theaders.append('Content-Type', contentType);\n\t\t\t}\n\t\t}\n\n\t\tlet signal = isRequest(input) ? input.signal : null;\n\t\tif ('signal' in init) signal = init.signal;\n\n\t\tif (signal != null && !isAbortSignal(signal)) {\n\t\t\tthrow new TypeError('Expected signal to be an instanceof AbortSignal');\n\t\t}\n\n\t\tthis[INTERNALS$2] = {\n\t\t\tmethod,\n\t\t\tredirect: init.redirect || input.redirect || 'follow',\n\t\t\theaders,\n\t\t\tparsedURL,\n\t\t\tsignal\n\t\t};\n\n\t\t// node-fetch-only options\n\t\tthis.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20;\n\t\tthis.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true;\n\t\tthis.counter = init.counter || input.counter || 0;\n\t\tthis.agent = init.agent || input.agent;\n\t}\n\n\tget method() {\n\t\treturn this[INTERNALS$2].method;\n\t}\n\n\tget url() {\n\t\treturn format_url(this[INTERNALS$2].parsedURL);\n\t}\n\n\tget headers() {\n\t\treturn this[INTERNALS$2].headers;\n\t}\n\n\tget redirect() {\n\t\treturn this[INTERNALS$2].redirect;\n\t}\n\n\tget signal() {\n\t\treturn this[INTERNALS$2].signal;\n\t}\n\n\t/**\n * Clone this request\n *\n * @return Request\n */\n\tclone() {\n\t\treturn new Request(this);\n\t}\n}\n\nBody.mixIn(Request.prototype);\n\nObject.defineProperty(Request.prototype, Symbol.toStringTag, {\n\tvalue: 'Request',\n\twritable: false,\n\tenumerable: false,\n\tconfigurable: true\n});\n\nObject.defineProperties(Request.prototype, {\n\tmethod: { enumerable: true },\n\turl: { enumerable: true },\n\theaders: { enumerable: true },\n\tredirect: { enumerable: true },\n\tclone: { enumerable: true },\n\tsignal: { enumerable: true }\n});\n\n/**\n * Convert a Request to Node.js http request options.\n *\n * @param Request A Request instance\n * @return Object The options object to be passed to http.request\n */\nfunction getNodeRequestOptions(request) {\n\tconst parsedURL = request[INTERNALS$2].parsedURL;\n\tconst headers = new Headers(request[INTERNALS$2].headers);\n\n\t// fetch step 1.3\n\tif (!headers.has('Accept')) {\n\t\theaders.set('Accept', '*/*');\n\t}\n\n\t// Basic fetch\n\tif (!parsedURL.protocol || !parsedURL.hostname) {\n\t\tthrow new TypeError('Only absolute URLs are supported');\n\t}\n\n\tif (!/^https?:$/.test(parsedURL.protocol)) {\n\t\tthrow new TypeError('Only HTTP(S) protocols are supported');\n\t}\n\n\tif (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) {\n\t\tthrow new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8');\n\t}\n\n\t// HTTP-network-or-cache fetch steps 2.4-2.7\n\tlet contentLengthValue = null;\n\tif (request.body == null && /^(POST|PUT)$/i.test(request.method)) {\n\t\tcontentLengthValue = '0';\n\t}\n\tif (request.body != null) {\n\t\tconst totalBytes = getTotalBytes(request);\n\t\tif (typeof totalBytes === 'number') {\n\t\t\tcontentLengthValue = String(totalBytes);\n\t\t}\n\t}\n\tif (contentLengthValue) {\n\t\theaders.set('Content-Length', contentLengthValue);\n\t}\n\n\t// HTTP-network-or-cache fetch step 2.11\n\tif (!headers.has('User-Agent')) {\n\t\theaders.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)');\n\t}\n\n\t// HTTP-network-or-cache fetch step 2.15\n\tif (request.compress && !headers.has('Accept-Encoding')) {\n\t\theaders.set('Accept-Encoding', 'gzip,deflate');\n\t}\n\n\tlet agent = request.agent;\n\tif (typeof agent === 'function') {\n\t\tagent = agent(parsedURL);\n\t}\n\n\tif (!headers.has('Connection') && !agent) {\n\t\theaders.set('Connection', 'close');\n\t}\n\n\t// HTTP-network fetch step 4.2\n\t// chunked encoding is handled by Node.js\n\n\treturn Object.assign({}, parsedURL, {\n\t\tmethod: request.method,\n\t\theaders: exportNodeCompatibleHeaders(headers),\n\t\tagent\n\t});\n}\n\n/**\n * abort-error.js\n *\n * AbortError interface for cancelled requests\n */\n\n/**\n * Create AbortError instance\n *\n * @param String message Error message for human\n * @return AbortError\n */\nfunction AbortError(message) {\n Error.call(this, message);\n\n this.type = 'aborted';\n this.message = message;\n\n // hide custom error implementation details from end-users\n Error.captureStackTrace(this, this.constructor);\n}\n\nAbortError.prototype = Object.create(Error.prototype);\nAbortError.prototype.constructor = AbortError;\nAbortError.prototype.name = 'AbortError';\n\nconst URL$1 = Url.URL || whatwgUrl.URL;\n\n// fix an issue where \"PassThrough\", \"resolve\" aren't a named export for node <10\nconst PassThrough$1 = Stream.PassThrough;\n\nconst isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) {\n\tconst orig = new URL$1(original).hostname;\n\tconst dest = new URL$1(destination).hostname;\n\n\treturn orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest);\n};\n\n/**\n * Fetch function\n *\n * @param Mixed url Absolute url or Request instance\n * @param Object opts Fetch options\n * @return Promise\n */\nfunction fetch(url, opts) {\n\n\t// allow custom promise\n\tif (!fetch.Promise) {\n\t\tthrow new Error('native promise missing, set fetch.Promise to your favorite alternative');\n\t}\n\n\tBody.Promise = fetch.Promise;\n\n\t// wrap http.request into fetch\n\treturn new fetch.Promise(function (resolve, reject) {\n\t\t// build request object\n\t\tconst request = new Request(url, opts);\n\t\tconst options = getNodeRequestOptions(request);\n\n\t\tconst send = (options.protocol === 'https:' ? https : http).request;\n\t\tconst signal = request.signal;\n\n\t\tlet response = null;\n\n\t\tconst abort = function abort() {\n\t\t\tlet error = new AbortError('The user aborted a request.');\n\t\t\treject(error);\n\t\t\tif (request.body && request.body instanceof Stream.Readable) {\n\t\t\t\trequest.body.destroy(error);\n\t\t\t}\n\t\t\tif (!response || !response.body) return;\n\t\t\tresponse.body.emit('error', error);\n\t\t};\n\n\t\tif (signal && signal.aborted) {\n\t\t\tabort();\n\t\t\treturn;\n\t\t}\n\n\t\tconst abortAndFinalize = function abortAndFinalize() {\n\t\t\tabort();\n\t\t\tfinalize();\n\t\t};\n\n\t\t// send request\n\t\tconst req = send(options);\n\t\tlet reqTimeout;\n\n\t\tif (signal) {\n\t\t\tsignal.addEventListener('abort', abortAndFinalize);\n\t\t}\n\n\t\tfunction finalize() {\n\t\t\treq.abort();\n\t\t\tif (signal) signal.removeEventListener('abort', abortAndFinalize);\n\t\t\tclearTimeout(reqTimeout);\n\t\t}\n\n\t\tif (request.timeout) {\n\t\t\treq.once('socket', function (socket) {\n\t\t\t\treqTimeout = setTimeout(function () {\n\t\t\t\t\treject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout'));\n\t\t\t\t\tfinalize();\n\t\t\t\t}, request.timeout);\n\t\t\t});\n\t\t}\n\n\t\treq.on('error', function (err) {\n\t\t\treject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));\n\t\t\tfinalize();\n\t\t});\n\n\t\treq.on('response', function (res) {\n\t\t\tclearTimeout(reqTimeout);\n\n\t\t\tconst headers = createHeadersLenient(res.headers);\n\n\t\t\t// HTTP fetch step 5\n\t\t\tif (fetch.isRedirect(res.statusCode)) {\n\t\t\t\t// HTTP fetch step 5.2\n\t\t\t\tconst location = headers.get('Location');\n\n\t\t\t\t// HTTP fetch step 5.3\n\t\t\t\tlet locationURL = null;\n\t\t\t\ttry {\n\t\t\t\t\tlocationURL = location === null ? null : new URL$1(location, request.url).toString();\n\t\t\t\t} catch (err) {\n\t\t\t\t\t// error here can only be invalid URL in Location: header\n\t\t\t\t\t// do not throw when options.redirect == manual\n\t\t\t\t\t// let the user extract the errorneous redirect URL\n\t\t\t\t\tif (request.redirect !== 'manual') {\n\t\t\t\t\t\treject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect'));\n\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// HTTP fetch step 5.5\n\t\t\t\tswitch (request.redirect) {\n\t\t\t\t\tcase 'error':\n\t\t\t\t\t\treject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect'));\n\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\treturn;\n\t\t\t\t\tcase 'manual':\n\t\t\t\t\t\t// node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL.\n\t\t\t\t\t\tif (locationURL !== null) {\n\t\t\t\t\t\t\t// handle corrupted header\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\theaders.set('Location', locationURL);\n\t\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\t\t// istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request\n\t\t\t\t\t\t\t\treject(err);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'follow':\n\t\t\t\t\t\t// HTTP-redirect fetch step 2\n\t\t\t\t\t\tif (locationURL === null) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 5\n\t\t\t\t\t\tif (request.counter >= request.follow) {\n\t\t\t\t\t\t\treject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect'));\n\t\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 6 (counter increment)\n\t\t\t\t\t\t// Create a new Request object.\n\t\t\t\t\t\tconst requestOpts = {\n\t\t\t\t\t\t\theaders: new Headers(request.headers),\n\t\t\t\t\t\t\tfollow: request.follow,\n\t\t\t\t\t\t\tcounter: request.counter + 1,\n\t\t\t\t\t\t\tagent: request.agent,\n\t\t\t\t\t\t\tcompress: request.compress,\n\t\t\t\t\t\t\tmethod: request.method,\n\t\t\t\t\t\t\tbody: request.body,\n\t\t\t\t\t\t\tsignal: request.signal,\n\t\t\t\t\t\t\ttimeout: request.timeout,\n\t\t\t\t\t\t\tsize: request.size\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (!isDomainOrSubdomain(request.url, locationURL)) {\n\t\t\t\t\t\t\tfor (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) {\n\t\t\t\t\t\t\t\trequestOpts.headers.delete(name);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 9\n\t\t\t\t\t\tif (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {\n\t\t\t\t\t\t\treject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));\n\t\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 11\n\t\t\t\t\t\tif (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') {\n\t\t\t\t\t\t\trequestOpts.method = 'GET';\n\t\t\t\t\t\t\trequestOpts.body = undefined;\n\t\t\t\t\t\t\trequestOpts.headers.delete('content-length');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// HTTP-redirect fetch step 15\n\t\t\t\t\t\tresolve(fetch(new Request(locationURL, requestOpts)));\n\t\t\t\t\t\tfinalize();\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// prepare response\n\t\t\tres.once('end', function () {\n\t\t\t\tif (signal) signal.removeEventListener('abort', abortAndFinalize);\n\t\t\t});\n\t\t\tlet body = res.pipe(new PassThrough$1());\n\n\t\t\tconst response_options = {\n\t\t\t\turl: request.url,\n\t\t\t\tstatus: res.statusCode,\n\t\t\t\tstatusText: res.statusMessage,\n\t\t\t\theaders: headers,\n\t\t\t\tsize: request.size,\n\t\t\t\ttimeout: request.timeout,\n\t\t\t\tcounter: request.counter\n\t\t\t};\n\n\t\t\t// HTTP-network fetch step 12.1.1.3\n\t\t\tconst codings = headers.get('Content-Encoding');\n\n\t\t\t// HTTP-network fetch step 12.1.1.4: handle content codings\n\n\t\t\t// in following scenarios we ignore compression support\n\t\t\t// 1. compression support is disabled\n\t\t\t// 2. HEAD request\n\t\t\t// 3. no Content-Encoding header\n\t\t\t// 4. no content response (204)\n\t\t\t// 5. content not modified response (304)\n\t\t\tif (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) {\n\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\tresolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// For Node v6+\n\t\t\t// Be less strict when decoding compressed responses, since sometimes\n\t\t\t// servers send slightly invalid responses that are still accepted\n\t\t\t// by common browsers.\n\t\t\t// Always using Z_SYNC_FLUSH is what cURL does.\n\t\t\tconst zlibOptions = {\n\t\t\t\tflush: zlib.Z_SYNC_FLUSH,\n\t\t\t\tfinishFlush: zlib.Z_SYNC_FLUSH\n\t\t\t};\n\n\t\t\t// for gzip\n\t\t\tif (codings == 'gzip' || codings == 'x-gzip') {\n\t\t\t\tbody = body.pipe(zlib.createGunzip(zlibOptions));\n\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\tresolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// for deflate\n\t\t\tif (codings == 'deflate' || codings == 'x-deflate') {\n\t\t\t\t// handle the infamous raw deflate response from old servers\n\t\t\t\t// a hack for old IIS and Apache servers\n\t\t\t\tconst raw = res.pipe(new PassThrough$1());\n\t\t\t\traw.once('data', function (chunk) {\n\t\t\t\t\t// see http://stackoverflow.com/questions/37519828\n\t\t\t\t\tif ((chunk[0] & 0x0F) === 0x08) {\n\t\t\t\t\t\tbody = body.pipe(zlib.createInflate());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbody = body.pipe(zlib.createInflateRaw());\n\t\t\t\t\t}\n\t\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\t\tresolve(response);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// for br\n\t\t\tif (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') {\n\t\t\t\tbody = body.pipe(zlib.createBrotliDecompress());\n\t\t\t\tresponse = new Response(body, response_options);\n\t\t\t\tresolve(response);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// otherwise, use response as-is\n\t\t\tresponse = new Response(body, response_options);\n\t\t\tresolve(response);\n\t\t});\n\n\t\twriteToStream(req, request);\n\t});\n}\n/**\n * Redirect code matching\n *\n * @param Number code Status code\n * @return Boolean\n */\nfetch.isRedirect = function (code) {\n\treturn code === 301 || code === 302 || code === 303 || code === 307 || code === 308;\n};\n\n// expose Promise\nfetch.Promise = global.Promise;\n\nmodule.exports = exports = fetch;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = exports;\nexports.Headers = Headers;\nexports.Request = Request;\nexports.Response = Response;\nexports.FetchError = FetchError;\n","\"use strict\";\n\nvar punycode = require(\"punycode\");\nvar mappingTable = require(\"./lib/mappingTable.json\");\n\nvar PROCESSING_OPTIONS = {\n TRANSITIONAL: 0,\n NONTRANSITIONAL: 1\n};\n\nfunction normalize(str) { // fix bug in v8\n return str.split('\\u0000').map(function (s) { return s.normalize('NFC'); }).join('\\u0000');\n}\n\nfunction findStatus(val) {\n var start = 0;\n var end = mappingTable.length - 1;\n\n while (start <= end) {\n var mid = Math.floor((start + end) / 2);\n\n var target = mappingTable[mid];\n if (target[0][0] <= val && target[0][1] >= val) {\n return target;\n } else if (target[0][0] > val) {\n end = mid - 1;\n } else {\n start = mid + 1;\n }\n }\n\n return null;\n}\n\nvar regexAstralSymbols = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n\nfunction countSymbols(string) {\n return string\n // replace every surrogate pair with a BMP symbol\n .replace(regexAstralSymbols, '_')\n // then get the length\n .length;\n}\n\nfunction mapChars(domain_name, useSTD3, processing_option) {\n var hasError = false;\n var processed = \"\";\n\n var len = countSymbols(domain_name);\n for (var i = 0; i < len; ++i) {\n var codePoint = domain_name.codePointAt(i);\n var status = findStatus(codePoint);\n\n switch (status[1]) {\n case \"disallowed\":\n hasError = true;\n processed += String.fromCodePoint(codePoint);\n break;\n case \"ignored\":\n break;\n case \"mapped\":\n processed += String.fromCodePoint.apply(String, status[2]);\n break;\n case \"deviation\":\n if (processing_option === PROCESSING_OPTIONS.TRANSITIONAL) {\n processed += String.fromCodePoint.apply(String, status[2]);\n } else {\n processed += String.fromCodePoint(codePoint);\n }\n break;\n case \"valid\":\n processed += String.fromCodePoint(codePoint);\n break;\n case \"disallowed_STD3_mapped\":\n if (useSTD3) {\n hasError = true;\n processed += String.fromCodePoint(codePoint);\n } else {\n processed += String.fromCodePoint.apply(String, status[2]);\n }\n break;\n case \"disallowed_STD3_valid\":\n if (useSTD3) {\n hasError = true;\n }\n\n processed += String.fromCodePoint(codePoint);\n break;\n }\n }\n\n return {\n string: processed,\n error: hasError\n };\n}\n\nvar combiningMarksRegex = /[\\u0300-\\u036F\\u0483-\\u0489\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0859-\\u085B\\u08E4-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962\\u0963\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CD\\u09D7\\u09E2\\u09E3\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2\\u0AE3\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B62\\u0B63\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0C00-\\u0C03\\u0C3E-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0C81-\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2\\u0CE3\\u0D01-\\u0D03\\u0D3E-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4D\\u0D57\\u0D62\\u0D63\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F3E\\u0F3F\\u0F71-\\u0F84\\u0F86\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102B-\\u103E\\u1056-\\u1059\\u105E-\\u1060\\u1062-\\u1064\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F\\u109A-\\u109D\\u135D-\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B4-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u192B\\u1930-\\u193B\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A17-\\u1A1B\\u1A55-\\u1A5E\\u1A60-\\u1A7C\\u1A7F\\u1AB0-\\u1ABE\\u1B00-\\u1B04\\u1B34-\\u1B44\\u1B6B-\\u1B73\\u1B80-\\u1B82\\u1BA1-\\u1BAD\\u1BE6-\\u1BF3\\u1C24-\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE8\\u1CED\\u1CF2-\\u1CF4\\u1CF8\\u1CF9\\u1DC0-\\u1DF5\\u1DFC-\\u1DFF\\u20D0-\\u20F0\\u2CEF-\\u2CF1\\u2D7F\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F-\\uA672\\uA674-\\uA67D\\uA69F\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA823-\\uA827\\uA880\\uA881\\uA8B4-\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA953\\uA980-\\uA983\\uA9B3-\\uA9C0\\uA9E5\\uAA29-\\uAA36\\uAA43\\uAA4C\\uAA4D\\uAA7B-\\uAA7D\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uAAEB-\\uAAEF\\uAAF5\\uAAF6\\uABE3-\\uABEA\\uABEC\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE2D]|\\uD800[\\uDDFD\\uDEE0\\uDF76-\\uDF7A]|\\uD802[\\uDE01-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE0F\\uDE38-\\uDE3A\\uDE3F\\uDEE5\\uDEE6]|\\uD804[\\uDC00-\\uDC02\\uDC38-\\uDC46\\uDC7F-\\uDC82\\uDCB0-\\uDCBA\\uDD00-\\uDD02\\uDD27-\\uDD34\\uDD73\\uDD80-\\uDD82\\uDDB3-\\uDDC0\\uDE2C-\\uDE37\\uDEDF-\\uDEEA\\uDF01-\\uDF03\\uDF3C\\uDF3E-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF62\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDCB0-\\uDCC3\\uDDAF-\\uDDB5\\uDDB8-\\uDDC0\\uDE30-\\uDE40\\uDEAB-\\uDEB7]|\\uD81A[\\uDEF0-\\uDEF4\\uDF30-\\uDF36]|\\uD81B[\\uDF51-\\uDF7E\\uDF8F-\\uDF92]|\\uD82F[\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD83A[\\uDCD0-\\uDCD6]|\\uDB40[\\uDD00-\\uDDEF]/;\n\nfunction validateLabel(label, processing_option) {\n if (label.substr(0, 4) === \"xn--\") {\n label = punycode.toUnicode(label);\n processing_option = PROCESSING_OPTIONS.NONTRANSITIONAL;\n }\n\n var error = false;\n\n if (normalize(label) !== label ||\n (label[3] === \"-\" && label[4] === \"-\") ||\n label[0] === \"-\" || label[label.length - 1] === \"-\" ||\n label.indexOf(\".\") !== -1 ||\n label.search(combiningMarksRegex) === 0) {\n error = true;\n }\n\n var len = countSymbols(label);\n for (var i = 0; i < len; ++i) {\n var status = findStatus(label.codePointAt(i));\n if ((processing === PROCESSING_OPTIONS.TRANSITIONAL && status[1] !== \"valid\") ||\n (processing === PROCESSING_OPTIONS.NONTRANSITIONAL &&\n status[1] !== \"valid\" && status[1] !== \"deviation\")) {\n error = true;\n break;\n }\n }\n\n return {\n label: label,\n error: error\n };\n}\n\nfunction processing(domain_name, useSTD3, processing_option) {\n var result = mapChars(domain_name, useSTD3, processing_option);\n result.string = normalize(result.string);\n\n var labels = result.string.split(\".\");\n for (var i = 0; i < labels.length; ++i) {\n try {\n var validation = validateLabel(labels[i]);\n labels[i] = validation.label;\n result.error = result.error || validation.error;\n } catch(e) {\n result.error = true;\n }\n }\n\n return {\n string: labels.join(\".\"),\n error: result.error\n };\n}\n\nmodule.exports.toASCII = function(domain_name, useSTD3, processing_option, verifyDnsLength) {\n var result = processing(domain_name, useSTD3, processing_option);\n var labels = result.string.split(\".\");\n labels = labels.map(function(l) {\n try {\n return punycode.toASCII(l);\n } catch(e) {\n result.error = true;\n return l;\n }\n });\n\n if (verifyDnsLength) {\n var total = labels.slice(0, labels.length - 1).join(\".\").length;\n if (total.length > 253 || total.length === 0) {\n result.error = true;\n }\n\n for (var i=0; i < labels.length; ++i) {\n if (labels.length > 63 || labels.length === 0) {\n result.error = true;\n break;\n }\n }\n }\n\n if (result.error) return null;\n return labels.join(\".\");\n};\n\nmodule.exports.toUnicode = function(domain_name, useSTD3) {\n var result = processing(domain_name, useSTD3, PROCESSING_OPTIONS.NONTRANSITIONAL);\n\n return {\n domain: result.string,\n error: result.error\n };\n};\n\nmodule.exports.PROCESSING_OPTIONS = PROCESSING_OPTIONS;\n","\"use strict\";\n\nvar conversions = {};\nmodule.exports = conversions;\n\nfunction sign(x) {\n return x < 0 ? -1 : 1;\n}\n\nfunction evenRound(x) {\n // Round x to the nearest integer, choosing the even integer if it lies halfway between two.\n if ((x % 1) === 0.5 && (x & 1) === 0) { // [even number].5; round down (i.e. floor)\n return Math.floor(x);\n } else {\n return Math.round(x);\n }\n}\n\nfunction createNumberConversion(bitLength, typeOpts) {\n if (!typeOpts.unsigned) {\n --bitLength;\n }\n const lowerBound = typeOpts.unsigned ? 0 : -Math.pow(2, bitLength);\n const upperBound = Math.pow(2, bitLength) - 1;\n\n const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength);\n const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1);\n\n return function(V, opts) {\n if (!opts) opts = {};\n\n let x = +V;\n\n if (opts.enforceRange) {\n if (!Number.isFinite(x)) {\n throw new TypeError(\"Argument is not a finite number\");\n }\n\n x = sign(x) * Math.floor(Math.abs(x));\n if (x < lowerBound || x > upperBound) {\n throw new TypeError(\"Argument is not in byte range\");\n }\n\n return x;\n }\n\n if (!isNaN(x) && opts.clamp) {\n x = evenRound(x);\n\n if (x < lowerBound) x = lowerBound;\n if (x > upperBound) x = upperBound;\n return x;\n }\n\n if (!Number.isFinite(x) || x === 0) {\n return 0;\n }\n\n x = sign(x) * Math.floor(Math.abs(x));\n x = x % moduloVal;\n\n if (!typeOpts.unsigned && x >= moduloBound) {\n return x - moduloVal;\n } else if (typeOpts.unsigned) {\n if (x < 0) {\n x += moduloVal;\n } else if (x === -0) { // don't return negative zero\n return 0;\n }\n }\n\n return x;\n }\n}\n\nconversions[\"void\"] = function () {\n return undefined;\n};\n\nconversions[\"boolean\"] = function (val) {\n return !!val;\n};\n\nconversions[\"byte\"] = createNumberConversion(8, { unsigned: false });\nconversions[\"octet\"] = createNumberConversion(8, { unsigned: true });\n\nconversions[\"short\"] = createNumberConversion(16, { unsigned: false });\nconversions[\"unsigned short\"] = createNumberConversion(16, { unsigned: true });\n\nconversions[\"long\"] = createNumberConversion(32, { unsigned: false });\nconversions[\"unsigned long\"] = createNumberConversion(32, { unsigned: true });\n\nconversions[\"long long\"] = createNumberConversion(32, { unsigned: false, moduloBitLength: 64 });\nconversions[\"unsigned long long\"] = createNumberConversion(32, { unsigned: true, moduloBitLength: 64 });\n\nconversions[\"double\"] = function (V) {\n const x = +V;\n\n if (!Number.isFinite(x)) {\n throw new TypeError(\"Argument is not a finite floating-point value\");\n }\n\n return x;\n};\n\nconversions[\"unrestricted double\"] = function (V) {\n const x = +V;\n\n if (isNaN(x)) {\n throw new TypeError(\"Argument is NaN\");\n }\n\n return x;\n};\n\n// not quite valid, but good enough for JS\nconversions[\"float\"] = conversions[\"double\"];\nconversions[\"unrestricted float\"] = conversions[\"unrestricted double\"];\n\nconversions[\"DOMString\"] = function (V, opts) {\n if (!opts) opts = {};\n\n if (opts.treatNullAsEmptyString && V === null) {\n return \"\";\n }\n\n return String(V);\n};\n\nconversions[\"ByteString\"] = function (V, opts) {\n const x = String(V);\n let c = undefined;\n for (let i = 0; (c = x.codePointAt(i)) !== undefined; ++i) {\n if (c > 255) {\n throw new TypeError(\"Argument is not a valid bytestring\");\n }\n }\n\n return x;\n};\n\nconversions[\"USVString\"] = function (V) {\n const S = String(V);\n const n = S.length;\n const U = [];\n for (let i = 0; i < n; ++i) {\n const c = S.charCodeAt(i);\n if (c < 0xD800 || c > 0xDFFF) {\n U.push(String.fromCodePoint(c));\n } else if (0xDC00 <= c && c <= 0xDFFF) {\n U.push(String.fromCodePoint(0xFFFD));\n } else {\n if (i === n - 1) {\n U.push(String.fromCodePoint(0xFFFD));\n } else {\n const d = S.charCodeAt(i + 1);\n if (0xDC00 <= d && d <= 0xDFFF) {\n const a = c & 0x3FF;\n const b = d & 0x3FF;\n U.push(String.fromCodePoint((2 << 15) + (2 << 9) * a + b));\n ++i;\n } else {\n U.push(String.fromCodePoint(0xFFFD));\n }\n }\n }\n }\n\n return U.join('');\n};\n\nconversions[\"Date\"] = function (V, opts) {\n if (!(V instanceof Date)) {\n throw new TypeError(\"Argument is not a Date object\");\n }\n if (isNaN(V)) {\n return undefined;\n }\n\n return V;\n};\n\nconversions[\"RegExp\"] = function (V, opts) {\n if (!(V instanceof RegExp)) {\n V = new RegExp(V);\n }\n\n return V;\n};\n","\"use strict\";\nconst usm = require(\"./url-state-machine\");\n\nexports.implementation = class URLImpl {\n constructor(constructorArgs) {\n const url = constructorArgs[0];\n const base = constructorArgs[1];\n\n let parsedBase = null;\n if (base !== undefined) {\n parsedBase = usm.basicURLParse(base);\n if (parsedBase === \"failure\") {\n throw new TypeError(\"Invalid base URL\");\n }\n }\n\n const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase });\n if (parsedURL === \"failure\") {\n throw new TypeError(\"Invalid URL\");\n }\n\n this._url = parsedURL;\n\n // TODO: query stuff\n }\n\n get href() {\n return usm.serializeURL(this._url);\n }\n\n set href(v) {\n const parsedURL = usm.basicURLParse(v);\n if (parsedURL === \"failure\") {\n throw new TypeError(\"Invalid URL\");\n }\n\n this._url = parsedURL;\n }\n\n get origin() {\n return usm.serializeURLOrigin(this._url);\n }\n\n get protocol() {\n return this._url.scheme + \":\";\n }\n\n set protocol(v) {\n usm.basicURLParse(v + \":\", { url: this._url, stateOverride: \"scheme start\" });\n }\n\n get username() {\n return this._url.username;\n }\n\n set username(v) {\n if (usm.cannotHaveAUsernamePasswordPort(this._url)) {\n return;\n }\n\n usm.setTheUsername(this._url, v);\n }\n\n get password() {\n return this._url.password;\n }\n\n set password(v) {\n if (usm.cannotHaveAUsernamePasswordPort(this._url)) {\n return;\n }\n\n usm.setThePassword(this._url, v);\n }\n\n get host() {\n const url = this._url;\n\n if (url.host === null) {\n return \"\";\n }\n\n if (url.port === null) {\n return usm.serializeHost(url.host);\n }\n\n return usm.serializeHost(url.host) + \":\" + usm.serializeInteger(url.port);\n }\n\n set host(v) {\n if (this._url.cannotBeABaseURL) {\n return;\n }\n\n usm.basicURLParse(v, { url: this._url, stateOverride: \"host\" });\n }\n\n get hostname() {\n if (this._url.host === null) {\n return \"\";\n }\n\n return usm.serializeHost(this._url.host);\n }\n\n set hostname(v) {\n if (this._url.cannotBeABaseURL) {\n return;\n }\n\n usm.basicURLParse(v, { url: this._url, stateOverride: \"hostname\" });\n }\n\n get port() {\n if (this._url.port === null) {\n return \"\";\n }\n\n return usm.serializeInteger(this._url.port);\n }\n\n set port(v) {\n if (usm.cannotHaveAUsernamePasswordPort(this._url)) {\n return;\n }\n\n if (v === \"\") {\n this._url.port = null;\n } else {\n usm.basicURLParse(v, { url: this._url, stateOverride: \"port\" });\n }\n }\n\n get pathname() {\n if (this._url.cannotBeABaseURL) {\n return this._url.path[0];\n }\n\n if (this._url.path.length === 0) {\n return \"\";\n }\n\n return \"/\" + this._url.path.join(\"/\");\n }\n\n set pathname(v) {\n if (this._url.cannotBeABaseURL) {\n return;\n }\n\n this._url.path = [];\n usm.basicURLParse(v, { url: this._url, stateOverride: \"path start\" });\n }\n\n get search() {\n if (this._url.query === null || this._url.query === \"\") {\n return \"\";\n }\n\n return \"?\" + this._url.query;\n }\n\n set search(v) {\n // TODO: query stuff\n\n const url = this._url;\n\n if (v === \"\") {\n url.query = null;\n return;\n }\n\n const input = v[0] === \"?\" ? v.substring(1) : v;\n url.query = \"\";\n usm.basicURLParse(input, { url, stateOverride: \"query\" });\n }\n\n get hash() {\n if (this._url.fragment === null || this._url.fragment === \"\") {\n return \"\";\n }\n\n return \"#\" + this._url.fragment;\n }\n\n set hash(v) {\n if (v === \"\") {\n this._url.fragment = null;\n return;\n }\n\n const input = v[0] === \"#\" ? v.substring(1) : v;\n this._url.fragment = \"\";\n usm.basicURLParse(input, { url: this._url, stateOverride: \"fragment\" });\n }\n\n toJSON() {\n return this.href;\n }\n};\n","\"use strict\";\n\nconst conversions = require(\"webidl-conversions\");\nconst utils = require(\"./utils.js\");\nconst Impl = require(\".//URL-impl.js\");\n\nconst impl = utils.implSymbol;\n\nfunction URL(url) {\n if (!this || this[impl] || !(this instanceof URL)) {\n throw new TypeError(\"Failed to construct 'URL': Please use the 'new' operator, this DOM object constructor cannot be called as a function.\");\n }\n if (arguments.length < 1) {\n throw new TypeError(\"Failed to construct 'URL': 1 argument required, but only \" + arguments.length + \" present.\");\n }\n const args = [];\n for (let i = 0; i < arguments.length && i < 2; ++i) {\n args[i] = arguments[i];\n }\n args[0] = conversions[\"USVString\"](args[0]);\n if (args[1] !== undefined) {\n args[1] = conversions[\"USVString\"](args[1]);\n }\n\n module.exports.setup(this, args);\n}\n\nURL.prototype.toJSON = function toJSON() {\n if (!this || !module.exports.is(this)) {\n throw new TypeError(\"Illegal invocation\");\n }\n const args = [];\n for (let i = 0; i < arguments.length && i < 0; ++i) {\n args[i] = arguments[i];\n }\n return this[impl].toJSON.apply(this[impl], args);\n};\nObject.defineProperty(URL.prototype, \"href\", {\n get() {\n return this[impl].href;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].href = V;\n },\n enumerable: true,\n configurable: true\n});\n\nURL.prototype.toString = function () {\n if (!this || !module.exports.is(this)) {\n throw new TypeError(\"Illegal invocation\");\n }\n return this.href;\n};\n\nObject.defineProperty(URL.prototype, \"origin\", {\n get() {\n return this[impl].origin;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"protocol\", {\n get() {\n return this[impl].protocol;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].protocol = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"username\", {\n get() {\n return this[impl].username;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].username = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"password\", {\n get() {\n return this[impl].password;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].password = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"host\", {\n get() {\n return this[impl].host;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].host = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"hostname\", {\n get() {\n return this[impl].hostname;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].hostname = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"port\", {\n get() {\n return this[impl].port;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].port = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"pathname\", {\n get() {\n return this[impl].pathname;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].pathname = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"search\", {\n get() {\n return this[impl].search;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].search = V;\n },\n enumerable: true,\n configurable: true\n});\n\nObject.defineProperty(URL.prototype, \"hash\", {\n get() {\n return this[impl].hash;\n },\n set(V) {\n V = conversions[\"USVString\"](V);\n this[impl].hash = V;\n },\n enumerable: true,\n configurable: true\n});\n\n\nmodule.exports = {\n is(obj) {\n return !!obj && obj[impl] instanceof Impl.implementation;\n },\n create(constructorArgs, privateData) {\n let obj = Object.create(URL.prototype);\n this.setup(obj, constructorArgs, privateData);\n return obj;\n },\n setup(obj, constructorArgs, privateData) {\n if (!privateData) privateData = {};\n privateData.wrapper = obj;\n\n obj[impl] = new Impl.implementation(constructorArgs, privateData);\n obj[impl][utils.wrapperSymbol] = obj;\n },\n interface: URL,\n expose: {\n Window: { URL: URL },\n Worker: { URL: URL }\n }\n};\n\n","\"use strict\";\n\nexports.URL = require(\"./URL\").interface;\nexports.serializeURL = require(\"./url-state-machine\").serializeURL;\nexports.serializeURLOrigin = require(\"./url-state-machine\").serializeURLOrigin;\nexports.basicURLParse = require(\"./url-state-machine\").basicURLParse;\nexports.setTheUsername = require(\"./url-state-machine\").setTheUsername;\nexports.setThePassword = require(\"./url-state-machine\").setThePassword;\nexports.serializeHost = require(\"./url-state-machine\").serializeHost;\nexports.serializeInteger = require(\"./url-state-machine\").serializeInteger;\nexports.parseURL = require(\"./url-state-machine\").parseURL;\n","\"use strict\";\r\nconst punycode = require(\"punycode\");\r\nconst tr46 = require(\"tr46\");\r\n\r\nconst specialSchemes = {\r\n ftp: 21,\r\n file: null,\r\n gopher: 70,\r\n http: 80,\r\n https: 443,\r\n ws: 80,\r\n wss: 443\r\n};\r\n\r\nconst failure = Symbol(\"failure\");\r\n\r\nfunction countSymbols(str) {\r\n return punycode.ucs2.decode(str).length;\r\n}\r\n\r\nfunction at(input, idx) {\r\n const c = input[idx];\r\n return isNaN(c) ? undefined : String.fromCodePoint(c);\r\n}\r\n\r\nfunction isASCIIDigit(c) {\r\n return c >= 0x30 && c <= 0x39;\r\n}\r\n\r\nfunction isASCIIAlpha(c) {\r\n return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A);\r\n}\r\n\r\nfunction isASCIIAlphanumeric(c) {\r\n return isASCIIAlpha(c) || isASCIIDigit(c);\r\n}\r\n\r\nfunction isASCIIHex(c) {\r\n return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66);\r\n}\r\n\r\nfunction isSingleDot(buffer) {\r\n return buffer === \".\" || buffer.toLowerCase() === \"%2e\";\r\n}\r\n\r\nfunction isDoubleDot(buffer) {\r\n buffer = buffer.toLowerCase();\r\n return buffer === \"..\" || buffer === \"%2e.\" || buffer === \".%2e\" || buffer === \"%2e%2e\";\r\n}\r\n\r\nfunction isWindowsDriveLetterCodePoints(cp1, cp2) {\r\n return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124);\r\n}\r\n\r\nfunction isWindowsDriveLetterString(string) {\r\n return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === \":\" || string[1] === \"|\");\r\n}\r\n\r\nfunction isNormalizedWindowsDriveLetterString(string) {\r\n return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === \":\";\r\n}\r\n\r\nfunction containsForbiddenHostCodePoint(string) {\r\n return string.search(/\\u0000|\\u0009|\\u000A|\\u000D|\\u0020|#|%|\\/|:|\\?|@|\\[|\\\\|\\]/) !== -1;\r\n}\r\n\r\nfunction containsForbiddenHostCodePointExcludingPercent(string) {\r\n return string.search(/\\u0000|\\u0009|\\u000A|\\u000D|\\u0020|#|\\/|:|\\?|@|\\[|\\\\|\\]/) !== -1;\r\n}\r\n\r\nfunction isSpecialScheme(scheme) {\r\n return specialSchemes[scheme] !== undefined;\r\n}\r\n\r\nfunction isSpecial(url) {\r\n return isSpecialScheme(url.scheme);\r\n}\r\n\r\nfunction defaultPort(scheme) {\r\n return specialSchemes[scheme];\r\n}\r\n\r\nfunction percentEncode(c) {\r\n let hex = c.toString(16).toUpperCase();\r\n if (hex.length === 1) {\r\n hex = \"0\" + hex;\r\n }\r\n\r\n return \"%\" + hex;\r\n}\r\n\r\nfunction utf8PercentEncode(c) {\r\n const buf = new Buffer(c);\r\n\r\n let str = \"\";\r\n\r\n for (let i = 0; i < buf.length; ++i) {\r\n str += percentEncode(buf[i]);\r\n }\r\n\r\n return str;\r\n}\r\n\r\nfunction utf8PercentDecode(str) {\r\n const input = new Buffer(str);\r\n const output = [];\r\n for (let i = 0; i < input.length; ++i) {\r\n if (input[i] !== 37) {\r\n output.push(input[i]);\r\n } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) {\r\n output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16));\r\n i += 2;\r\n } else {\r\n output.push(input[i]);\r\n }\r\n }\r\n return new Buffer(output).toString();\r\n}\r\n\r\nfunction isC0ControlPercentEncode(c) {\r\n return c <= 0x1F || c > 0x7E;\r\n}\r\n\r\nconst extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]);\r\nfunction isPathPercentEncode(c) {\r\n return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c);\r\n}\r\n\r\nconst extraUserinfoPercentEncodeSet =\r\n new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]);\r\nfunction isUserinfoPercentEncode(c) {\r\n return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c);\r\n}\r\n\r\nfunction percentEncodeChar(c, encodeSetPredicate) {\r\n const cStr = String.fromCodePoint(c);\r\n\r\n if (encodeSetPredicate(c)) {\r\n return utf8PercentEncode(cStr);\r\n }\r\n\r\n return cStr;\r\n}\r\n\r\nfunction parseIPv4Number(input) {\r\n let R = 10;\r\n\r\n if (input.length >= 2 && input.charAt(0) === \"0\" && input.charAt(1).toLowerCase() === \"x\") {\r\n input = input.substring(2);\r\n R = 16;\r\n } else if (input.length >= 2 && input.charAt(0) === \"0\") {\r\n input = input.substring(1);\r\n R = 8;\r\n }\r\n\r\n if (input === \"\") {\r\n return 0;\r\n }\r\n\r\n const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/);\r\n if (regex.test(input)) {\r\n return failure;\r\n }\r\n\r\n return parseInt(input, R);\r\n}\r\n\r\nfunction parseIPv4(input) {\r\n const parts = input.split(\".\");\r\n if (parts[parts.length - 1] === \"\") {\r\n if (parts.length > 1) {\r\n parts.pop();\r\n }\r\n }\r\n\r\n if (parts.length > 4) {\r\n return input;\r\n }\r\n\r\n const numbers = [];\r\n for (const part of parts) {\r\n if (part === \"\") {\r\n return input;\r\n }\r\n const n = parseIPv4Number(part);\r\n if (n === failure) {\r\n return input;\r\n }\r\n\r\n numbers.push(n);\r\n }\r\n\r\n for (let i = 0; i < numbers.length - 1; ++i) {\r\n if (numbers[i] > 255) {\r\n return failure;\r\n }\r\n }\r\n if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) {\r\n return failure;\r\n }\r\n\r\n let ipv4 = numbers.pop();\r\n let counter = 0;\r\n\r\n for (const n of numbers) {\r\n ipv4 += n * Math.pow(256, 3 - counter);\r\n ++counter;\r\n }\r\n\r\n return ipv4;\r\n}\r\n\r\nfunction serializeIPv4(address) {\r\n let output = \"\";\r\n let n = address;\r\n\r\n for (let i = 1; i <= 4; ++i) {\r\n output = String(n % 256) + output;\r\n if (i !== 4) {\r\n output = \".\" + output;\r\n }\r\n n = Math.floor(n / 256);\r\n }\r\n\r\n return output;\r\n}\r\n\r\nfunction parseIPv6(input) {\r\n const address = [0, 0, 0, 0, 0, 0, 0, 0];\r\n let pieceIndex = 0;\r\n let compress = null;\r\n let pointer = 0;\r\n\r\n input = punycode.ucs2.decode(input);\r\n\r\n if (input[pointer] === 58) {\r\n if (input[pointer + 1] !== 58) {\r\n return failure;\r\n }\r\n\r\n pointer += 2;\r\n ++pieceIndex;\r\n compress = pieceIndex;\r\n }\r\n\r\n while (pointer < input.length) {\r\n if (pieceIndex === 8) {\r\n return failure;\r\n }\r\n\r\n if (input[pointer] === 58) {\r\n if (compress !== null) {\r\n return failure;\r\n }\r\n ++pointer;\r\n ++pieceIndex;\r\n compress = pieceIndex;\r\n continue;\r\n }\r\n\r\n let value = 0;\r\n let length = 0;\r\n\r\n while (length < 4 && isASCIIHex(input[pointer])) {\r\n value = value * 0x10 + parseInt(at(input, pointer), 16);\r\n ++pointer;\r\n ++length;\r\n }\r\n\r\n if (input[pointer] === 46) {\r\n if (length === 0) {\r\n return failure;\r\n }\r\n\r\n pointer -= length;\r\n\r\n if (pieceIndex > 6) {\r\n return failure;\r\n }\r\n\r\n let numbersSeen = 0;\r\n\r\n while (input[pointer] !== undefined) {\r\n let ipv4Piece = null;\r\n\r\n if (numbersSeen > 0) {\r\n if (input[pointer] === 46 && numbersSeen < 4) {\r\n ++pointer;\r\n } else {\r\n return failure;\r\n }\r\n }\r\n\r\n if (!isASCIIDigit(input[pointer])) {\r\n return failure;\r\n }\r\n\r\n while (isASCIIDigit(input[pointer])) {\r\n const number = parseInt(at(input, pointer));\r\n if (ipv4Piece === null) {\r\n ipv4Piece = number;\r\n } else if (ipv4Piece === 0) {\r\n return failure;\r\n } else {\r\n ipv4Piece = ipv4Piece * 10 + number;\r\n }\r\n if (ipv4Piece > 255) {\r\n return failure;\r\n }\r\n ++pointer;\r\n }\r\n\r\n address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece;\r\n\r\n ++numbersSeen;\r\n\r\n if (numbersSeen === 2 || numbersSeen === 4) {\r\n ++pieceIndex;\r\n }\r\n }\r\n\r\n if (numbersSeen !== 4) {\r\n return failure;\r\n }\r\n\r\n break;\r\n } else if (input[pointer] === 58) {\r\n ++pointer;\r\n if (input[pointer] === undefined) {\r\n return failure;\r\n }\r\n } else if (input[pointer] !== undefined) {\r\n return failure;\r\n }\r\n\r\n address[pieceIndex] = value;\r\n ++pieceIndex;\r\n }\r\n\r\n if (compress !== null) {\r\n let swaps = pieceIndex - compress;\r\n pieceIndex = 7;\r\n while (pieceIndex !== 0 && swaps > 0) {\r\n const temp = address[compress + swaps - 1];\r\n address[compress + swaps - 1] = address[pieceIndex];\r\n address[pieceIndex] = temp;\r\n --pieceIndex;\r\n --swaps;\r\n }\r\n } else if (compress === null && pieceIndex !== 8) {\r\n return failure;\r\n }\r\n\r\n return address;\r\n}\r\n\r\nfunction serializeIPv6(address) {\r\n let output = \"\";\r\n const seqResult = findLongestZeroSequence(address);\r\n const compress = seqResult.idx;\r\n let ignore0 = false;\r\n\r\n for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) {\r\n if (ignore0 && address[pieceIndex] === 0) {\r\n continue;\r\n } else if (ignore0) {\r\n ignore0 = false;\r\n }\r\n\r\n if (compress === pieceIndex) {\r\n const separator = pieceIndex === 0 ? \"::\" : \":\";\r\n output += separator;\r\n ignore0 = true;\r\n continue;\r\n }\r\n\r\n output += address[pieceIndex].toString(16);\r\n\r\n if (pieceIndex !== 7) {\r\n output += \":\";\r\n }\r\n }\r\n\r\n return output;\r\n}\r\n\r\nfunction parseHost(input, isSpecialArg) {\r\n if (input[0] === \"[\") {\r\n if (input[input.length - 1] !== \"]\") {\r\n return failure;\r\n }\r\n\r\n return parseIPv6(input.substring(1, input.length - 1));\r\n }\r\n\r\n if (!isSpecialArg) {\r\n return parseOpaqueHost(input);\r\n }\r\n\r\n const domain = utf8PercentDecode(input);\r\n const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false);\r\n if (asciiDomain === null) {\r\n return failure;\r\n }\r\n\r\n if (containsForbiddenHostCodePoint(asciiDomain)) {\r\n return failure;\r\n }\r\n\r\n const ipv4Host = parseIPv4(asciiDomain);\r\n if (typeof ipv4Host === \"number\" || ipv4Host === failure) {\r\n return ipv4Host;\r\n }\r\n\r\n return asciiDomain;\r\n}\r\n\r\nfunction parseOpaqueHost(input) {\r\n if (containsForbiddenHostCodePointExcludingPercent(input)) {\r\n return failure;\r\n }\r\n\r\n let output = \"\";\r\n const decoded = punycode.ucs2.decode(input);\r\n for (let i = 0; i < decoded.length; ++i) {\r\n output += percentEncodeChar(decoded[i], isC0ControlPercentEncode);\r\n }\r\n return output;\r\n}\r\n\r\nfunction findLongestZeroSequence(arr) {\r\n let maxIdx = null;\r\n let maxLen = 1; // only find elements > 1\r\n let currStart = null;\r\n let currLen = 0;\r\n\r\n for (let i = 0; i < arr.length; ++i) {\r\n if (arr[i] !== 0) {\r\n if (currLen > maxLen) {\r\n maxIdx = currStart;\r\n maxLen = currLen;\r\n }\r\n\r\n currStart = null;\r\n currLen = 0;\r\n } else {\r\n if (currStart === null) {\r\n currStart = i;\r\n }\r\n ++currLen;\r\n }\r\n }\r\n\r\n // if trailing zeros\r\n if (currLen > maxLen) {\r\n maxIdx = currStart;\r\n maxLen = currLen;\r\n }\r\n\r\n return {\r\n idx: maxIdx,\r\n len: maxLen\r\n };\r\n}\r\n\r\nfunction serializeHost(host) {\r\n if (typeof host === \"number\") {\r\n return serializeIPv4(host);\r\n }\r\n\r\n // IPv6 serializer\r\n if (host instanceof Array) {\r\n return \"[\" + serializeIPv6(host) + \"]\";\r\n }\r\n\r\n return host;\r\n}\r\n\r\nfunction trimControlChars(url) {\r\n return url.replace(/^[\\u0000-\\u001F\\u0020]+|[\\u0000-\\u001F\\u0020]+$/g, \"\");\r\n}\r\n\r\nfunction trimTabAndNewline(url) {\r\n return url.replace(/\\u0009|\\u000A|\\u000D/g, \"\");\r\n}\r\n\r\nfunction shortenPath(url) {\r\n const path = url.path;\r\n if (path.length === 0) {\r\n return;\r\n }\r\n if (url.scheme === \"file\" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) {\r\n return;\r\n }\r\n\r\n path.pop();\r\n}\r\n\r\nfunction includesCredentials(url) {\r\n return url.username !== \"\" || url.password !== \"\";\r\n}\r\n\r\nfunction cannotHaveAUsernamePasswordPort(url) {\r\n return url.host === null || url.host === \"\" || url.cannotBeABaseURL || url.scheme === \"file\";\r\n}\r\n\r\nfunction isNormalizedWindowsDriveLetter(string) {\r\n return /^[A-Za-z]:$/.test(string);\r\n}\r\n\r\nfunction URLStateMachine(input, base, encodingOverride, url, stateOverride) {\r\n this.pointer = 0;\r\n this.input = input;\r\n this.base = base || null;\r\n this.encodingOverride = encodingOverride || \"utf-8\";\r\n this.stateOverride = stateOverride;\r\n this.url = url;\r\n this.failure = false;\r\n this.parseError = false;\r\n\r\n if (!this.url) {\r\n this.url = {\r\n scheme: \"\",\r\n username: \"\",\r\n password: \"\",\r\n host: null,\r\n port: null,\r\n path: [],\r\n query: null,\r\n fragment: null,\r\n\r\n cannotBeABaseURL: false\r\n };\r\n\r\n const res = trimControlChars(this.input);\r\n if (res !== this.input) {\r\n this.parseError = true;\r\n }\r\n this.input = res;\r\n }\r\n\r\n const res = trimTabAndNewline(this.input);\r\n if (res !== this.input) {\r\n this.parseError = true;\r\n }\r\n this.input = res;\r\n\r\n this.state = stateOverride || \"scheme start\";\r\n\r\n this.buffer = \"\";\r\n this.atFlag = false;\r\n this.arrFlag = false;\r\n this.passwordTokenSeenFlag = false;\r\n\r\n this.input = punycode.ucs2.decode(this.input);\r\n\r\n for (; this.pointer <= this.input.length; ++this.pointer) {\r\n const c = this.input[this.pointer];\r\n const cStr = isNaN(c) ? undefined : String.fromCodePoint(c);\r\n\r\n // exec state machine\r\n const ret = this[\"parse \" + this.state](c, cStr);\r\n if (!ret) {\r\n break; // terminate algorithm\r\n } else if (ret === failure) {\r\n this.failure = true;\r\n break;\r\n }\r\n }\r\n}\r\n\r\nURLStateMachine.prototype[\"parse scheme start\"] = function parseSchemeStart(c, cStr) {\r\n if (isASCIIAlpha(c)) {\r\n this.buffer += cStr.toLowerCase();\r\n this.state = \"scheme\";\r\n } else if (!this.stateOverride) {\r\n this.state = \"no scheme\";\r\n --this.pointer;\r\n } else {\r\n this.parseError = true;\r\n return failure;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse scheme\"] = function parseScheme(c, cStr) {\r\n if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) {\r\n this.buffer += cStr.toLowerCase();\r\n } else if (c === 58) {\r\n if (this.stateOverride) {\r\n if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) {\r\n return false;\r\n }\r\n\r\n if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) {\r\n return false;\r\n }\r\n\r\n if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === \"file\") {\r\n return false;\r\n }\r\n\r\n if (this.url.scheme === \"file\" && (this.url.host === \"\" || this.url.host === null)) {\r\n return false;\r\n }\r\n }\r\n this.url.scheme = this.buffer;\r\n this.buffer = \"\";\r\n if (this.stateOverride) {\r\n return false;\r\n }\r\n if (this.url.scheme === \"file\") {\r\n if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) {\r\n this.parseError = true;\r\n }\r\n this.state = \"file\";\r\n } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) {\r\n this.state = \"special relative or authority\";\r\n } else if (isSpecial(this.url)) {\r\n this.state = \"special authority slashes\";\r\n } else if (this.input[this.pointer + 1] === 47) {\r\n this.state = \"path or authority\";\r\n ++this.pointer;\r\n } else {\r\n this.url.cannotBeABaseURL = true;\r\n this.url.path.push(\"\");\r\n this.state = \"cannot-be-a-base-URL path\";\r\n }\r\n } else if (!this.stateOverride) {\r\n this.buffer = \"\";\r\n this.state = \"no scheme\";\r\n this.pointer = -1;\r\n } else {\r\n this.parseError = true;\r\n return failure;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse no scheme\"] = function parseNoScheme(c) {\r\n if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) {\r\n return failure;\r\n } else if (this.base.cannotBeABaseURL && c === 35) {\r\n this.url.scheme = this.base.scheme;\r\n this.url.path = this.base.path.slice();\r\n this.url.query = this.base.query;\r\n this.url.fragment = \"\";\r\n this.url.cannotBeABaseURL = true;\r\n this.state = \"fragment\";\r\n } else if (this.base.scheme === \"file\") {\r\n this.state = \"file\";\r\n --this.pointer;\r\n } else {\r\n this.state = \"relative\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse special relative or authority\"] = function parseSpecialRelativeOrAuthority(c) {\r\n if (c === 47 && this.input[this.pointer + 1] === 47) {\r\n this.state = \"special authority ignore slashes\";\r\n ++this.pointer;\r\n } else {\r\n this.parseError = true;\r\n this.state = \"relative\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse path or authority\"] = function parsePathOrAuthority(c) {\r\n if (c === 47) {\r\n this.state = \"authority\";\r\n } else {\r\n this.state = \"path\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse relative\"] = function parseRelative(c) {\r\n this.url.scheme = this.base.scheme;\r\n if (isNaN(c)) {\r\n this.url.username = this.base.username;\r\n this.url.password = this.base.password;\r\n this.url.host = this.base.host;\r\n this.url.port = this.base.port;\r\n this.url.path = this.base.path.slice();\r\n this.url.query = this.base.query;\r\n } else if (c === 47) {\r\n this.state = \"relative slash\";\r\n } else if (c === 63) {\r\n this.url.username = this.base.username;\r\n this.url.password = this.base.password;\r\n this.url.host = this.base.host;\r\n this.url.port = this.base.port;\r\n this.url.path = this.base.path.slice();\r\n this.url.query = \"\";\r\n this.state = \"query\";\r\n } else if (c === 35) {\r\n this.url.username = this.base.username;\r\n this.url.password = this.base.password;\r\n this.url.host = this.base.host;\r\n this.url.port = this.base.port;\r\n this.url.path = this.base.path.slice();\r\n this.url.query = this.base.query;\r\n this.url.fragment = \"\";\r\n this.state = \"fragment\";\r\n } else if (isSpecial(this.url) && c === 92) {\r\n this.parseError = true;\r\n this.state = \"relative slash\";\r\n } else {\r\n this.url.username = this.base.username;\r\n this.url.password = this.base.password;\r\n this.url.host = this.base.host;\r\n this.url.port = this.base.port;\r\n this.url.path = this.base.path.slice(0, this.base.path.length - 1);\r\n\r\n this.state = \"path\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse relative slash\"] = function parseRelativeSlash(c) {\r\n if (isSpecial(this.url) && (c === 47 || c === 92)) {\r\n if (c === 92) {\r\n this.parseError = true;\r\n }\r\n this.state = \"special authority ignore slashes\";\r\n } else if (c === 47) {\r\n this.state = \"authority\";\r\n } else {\r\n this.url.username = this.base.username;\r\n this.url.password = this.base.password;\r\n this.url.host = this.base.host;\r\n this.url.port = this.base.port;\r\n this.state = \"path\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse special authority slashes\"] = function parseSpecialAuthoritySlashes(c) {\r\n if (c === 47 && this.input[this.pointer + 1] === 47) {\r\n this.state = \"special authority ignore slashes\";\r\n ++this.pointer;\r\n } else {\r\n this.parseError = true;\r\n this.state = \"special authority ignore slashes\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse special authority ignore slashes\"] = function parseSpecialAuthorityIgnoreSlashes(c) {\r\n if (c !== 47 && c !== 92) {\r\n this.state = \"authority\";\r\n --this.pointer;\r\n } else {\r\n this.parseError = true;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse authority\"] = function parseAuthority(c, cStr) {\r\n if (c === 64) {\r\n this.parseError = true;\r\n if (this.atFlag) {\r\n this.buffer = \"%40\" + this.buffer;\r\n }\r\n this.atFlag = true;\r\n\r\n // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars\r\n const len = countSymbols(this.buffer);\r\n for (let pointer = 0; pointer < len; ++pointer) {\r\n const codePoint = this.buffer.codePointAt(pointer);\r\n\r\n if (codePoint === 58 && !this.passwordTokenSeenFlag) {\r\n this.passwordTokenSeenFlag = true;\r\n continue;\r\n }\r\n const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode);\r\n if (this.passwordTokenSeenFlag) {\r\n this.url.password += encodedCodePoints;\r\n } else {\r\n this.url.username += encodedCodePoints;\r\n }\r\n }\r\n this.buffer = \"\";\r\n } else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||\r\n (isSpecial(this.url) && c === 92)) {\r\n if (this.atFlag && this.buffer === \"\") {\r\n this.parseError = true;\r\n return failure;\r\n }\r\n this.pointer -= countSymbols(this.buffer) + 1;\r\n this.buffer = \"\";\r\n this.state = \"host\";\r\n } else {\r\n this.buffer += cStr;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse hostname\"] =\r\nURLStateMachine.prototype[\"parse host\"] = function parseHostName(c, cStr) {\r\n if (this.stateOverride && this.url.scheme === \"file\") {\r\n --this.pointer;\r\n this.state = \"file host\";\r\n } else if (c === 58 && !this.arrFlag) {\r\n if (this.buffer === \"\") {\r\n this.parseError = true;\r\n return failure;\r\n }\r\n\r\n const host = parseHost(this.buffer, isSpecial(this.url));\r\n if (host === failure) {\r\n return failure;\r\n }\r\n\r\n this.url.host = host;\r\n this.buffer = \"\";\r\n this.state = \"port\";\r\n if (this.stateOverride === \"hostname\") {\r\n return false;\r\n }\r\n } else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||\r\n (isSpecial(this.url) && c === 92)) {\r\n --this.pointer;\r\n if (isSpecial(this.url) && this.buffer === \"\") {\r\n this.parseError = true;\r\n return failure;\r\n } else if (this.stateOverride && this.buffer === \"\" &&\r\n (includesCredentials(this.url) || this.url.port !== null)) {\r\n this.parseError = true;\r\n return false;\r\n }\r\n\r\n const host = parseHost(this.buffer, isSpecial(this.url));\r\n if (host === failure) {\r\n return failure;\r\n }\r\n\r\n this.url.host = host;\r\n this.buffer = \"\";\r\n this.state = \"path start\";\r\n if (this.stateOverride) {\r\n return false;\r\n }\r\n } else {\r\n if (c === 91) {\r\n this.arrFlag = true;\r\n } else if (c === 93) {\r\n this.arrFlag = false;\r\n }\r\n this.buffer += cStr;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse port\"] = function parsePort(c, cStr) {\r\n if (isASCIIDigit(c)) {\r\n this.buffer += cStr;\r\n } else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||\r\n (isSpecial(this.url) && c === 92) ||\r\n this.stateOverride) {\r\n if (this.buffer !== \"\") {\r\n const port = parseInt(this.buffer);\r\n if (port > Math.pow(2, 16) - 1) {\r\n this.parseError = true;\r\n return failure;\r\n }\r\n this.url.port = port === defaultPort(this.url.scheme) ? null : port;\r\n this.buffer = \"\";\r\n }\r\n if (this.stateOverride) {\r\n return false;\r\n }\r\n this.state = \"path start\";\r\n --this.pointer;\r\n } else {\r\n this.parseError = true;\r\n return failure;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nconst fileOtherwiseCodePoints = new Set([47, 92, 63, 35]);\r\n\r\nURLStateMachine.prototype[\"parse file\"] = function parseFile(c) {\r\n this.url.scheme = \"file\";\r\n\r\n if (c === 47 || c === 92) {\r\n if (c === 92) {\r\n this.parseError = true;\r\n }\r\n this.state = \"file slash\";\r\n } else if (this.base !== null && this.base.scheme === \"file\") {\r\n if (isNaN(c)) {\r\n this.url.host = this.base.host;\r\n this.url.path = this.base.path.slice();\r\n this.url.query = this.base.query;\r\n } else if (c === 63) {\r\n this.url.host = this.base.host;\r\n this.url.path = this.base.path.slice();\r\n this.url.query = \"\";\r\n this.state = \"query\";\r\n } else if (c === 35) {\r\n this.url.host = this.base.host;\r\n this.url.path = this.base.path.slice();\r\n this.url.query = this.base.query;\r\n this.url.fragment = \"\";\r\n this.state = \"fragment\";\r\n } else {\r\n if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points\r\n !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) ||\r\n (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points\r\n !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) {\r\n this.url.host = this.base.host;\r\n this.url.path = this.base.path.slice();\r\n shortenPath(this.url);\r\n } else {\r\n this.parseError = true;\r\n }\r\n\r\n this.state = \"path\";\r\n --this.pointer;\r\n }\r\n } else {\r\n this.state = \"path\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse file slash\"] = function parseFileSlash(c) {\r\n if (c === 47 || c === 92) {\r\n if (c === 92) {\r\n this.parseError = true;\r\n }\r\n this.state = \"file host\";\r\n } else {\r\n if (this.base !== null && this.base.scheme === \"file\") {\r\n if (isNormalizedWindowsDriveLetterString(this.base.path[0])) {\r\n this.url.path.push(this.base.path[0]);\r\n } else {\r\n this.url.host = this.base.host;\r\n }\r\n }\r\n this.state = \"path\";\r\n --this.pointer;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse file host\"] = function parseFileHost(c, cStr) {\r\n if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) {\r\n --this.pointer;\r\n if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) {\r\n this.parseError = true;\r\n this.state = \"path\";\r\n } else if (this.buffer === \"\") {\r\n this.url.host = \"\";\r\n if (this.stateOverride) {\r\n return false;\r\n }\r\n this.state = \"path start\";\r\n } else {\r\n let host = parseHost(this.buffer, isSpecial(this.url));\r\n if (host === failure) {\r\n return failure;\r\n }\r\n if (host === \"localhost\") {\r\n host = \"\";\r\n }\r\n this.url.host = host;\r\n\r\n if (this.stateOverride) {\r\n return false;\r\n }\r\n\r\n this.buffer = \"\";\r\n this.state = \"path start\";\r\n }\r\n } else {\r\n this.buffer += cStr;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse path start\"] = function parsePathStart(c) {\r\n if (isSpecial(this.url)) {\r\n if (c === 92) {\r\n this.parseError = true;\r\n }\r\n this.state = \"path\";\r\n\r\n if (c !== 47 && c !== 92) {\r\n --this.pointer;\r\n }\r\n } else if (!this.stateOverride && c === 63) {\r\n this.url.query = \"\";\r\n this.state = \"query\";\r\n } else if (!this.stateOverride && c === 35) {\r\n this.url.fragment = \"\";\r\n this.state = \"fragment\";\r\n } else if (c !== undefined) {\r\n this.state = \"path\";\r\n if (c !== 47) {\r\n --this.pointer;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse path\"] = function parsePath(c) {\r\n if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) ||\r\n (!this.stateOverride && (c === 63 || c === 35))) {\r\n if (isSpecial(this.url) && c === 92) {\r\n this.parseError = true;\r\n }\r\n\r\n if (isDoubleDot(this.buffer)) {\r\n shortenPath(this.url);\r\n if (c !== 47 && !(isSpecial(this.url) && c === 92)) {\r\n this.url.path.push(\"\");\r\n }\r\n } else if (isSingleDot(this.buffer) && c !== 47 &&\r\n !(isSpecial(this.url) && c === 92)) {\r\n this.url.path.push(\"\");\r\n } else if (!isSingleDot(this.buffer)) {\r\n if (this.url.scheme === \"file\" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) {\r\n if (this.url.host !== \"\" && this.url.host !== null) {\r\n this.parseError = true;\r\n this.url.host = \"\";\r\n }\r\n this.buffer = this.buffer[0] + \":\";\r\n }\r\n this.url.path.push(this.buffer);\r\n }\r\n this.buffer = \"\";\r\n if (this.url.scheme === \"file\" && (c === undefined || c === 63 || c === 35)) {\r\n while (this.url.path.length > 1 && this.url.path[0] === \"\") {\r\n this.parseError = true;\r\n this.url.path.shift();\r\n }\r\n }\r\n if (c === 63) {\r\n this.url.query = \"\";\r\n this.state = \"query\";\r\n }\r\n if (c === 35) {\r\n this.url.fragment = \"\";\r\n this.state = \"fragment\";\r\n }\r\n } else {\r\n // TODO: If c is not a URL code point and not \"%\", parse error.\r\n\r\n if (c === 37 &&\r\n (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n !isASCIIHex(this.input[this.pointer + 2]))) {\r\n this.parseError = true;\r\n }\r\n\r\n this.buffer += percentEncodeChar(c, isPathPercentEncode);\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse cannot-be-a-base-URL path\"] = function parseCannotBeABaseURLPath(c) {\r\n if (c === 63) {\r\n this.url.query = \"\";\r\n this.state = \"query\";\r\n } else if (c === 35) {\r\n this.url.fragment = \"\";\r\n this.state = \"fragment\";\r\n } else {\r\n // TODO: Add: not a URL code point\r\n if (!isNaN(c) && c !== 37) {\r\n this.parseError = true;\r\n }\r\n\r\n if (c === 37 &&\r\n (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n !isASCIIHex(this.input[this.pointer + 2]))) {\r\n this.parseError = true;\r\n }\r\n\r\n if (!isNaN(c)) {\r\n this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode);\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse query\"] = function parseQuery(c, cStr) {\r\n if (isNaN(c) || (!this.stateOverride && c === 35)) {\r\n if (!isSpecial(this.url) || this.url.scheme === \"ws\" || this.url.scheme === \"wss\") {\r\n this.encodingOverride = \"utf-8\";\r\n }\r\n\r\n const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead\r\n for (let i = 0; i < buffer.length; ++i) {\r\n if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 ||\r\n buffer[i] === 0x3C || buffer[i] === 0x3E) {\r\n this.url.query += percentEncode(buffer[i]);\r\n } else {\r\n this.url.query += String.fromCodePoint(buffer[i]);\r\n }\r\n }\r\n\r\n this.buffer = \"\";\r\n if (c === 35) {\r\n this.url.fragment = \"\";\r\n this.state = \"fragment\";\r\n }\r\n } else {\r\n // TODO: If c is not a URL code point and not \"%\", parse error.\r\n if (c === 37 &&\r\n (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n !isASCIIHex(this.input[this.pointer + 2]))) {\r\n this.parseError = true;\r\n }\r\n\r\n this.buffer += cStr;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nURLStateMachine.prototype[\"parse fragment\"] = function parseFragment(c) {\r\n if (isNaN(c)) { // do nothing\r\n } else if (c === 0x0) {\r\n this.parseError = true;\r\n } else {\r\n // TODO: If c is not a URL code point and not \"%\", parse error.\r\n if (c === 37 &&\r\n (!isASCIIHex(this.input[this.pointer + 1]) ||\r\n !isASCIIHex(this.input[this.pointer + 2]))) {\r\n this.parseError = true;\r\n }\r\n\r\n this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode);\r\n }\r\n\r\n return true;\r\n};\r\n\r\nfunction serializeURL(url, excludeFragment) {\r\n let output = url.scheme + \":\";\r\n if (url.host !== null) {\r\n output += \"//\";\r\n\r\n if (url.username !== \"\" || url.password !== \"\") {\r\n output += url.username;\r\n if (url.password !== \"\") {\r\n output += \":\" + url.password;\r\n }\r\n output += \"@\";\r\n }\r\n\r\n output += serializeHost(url.host);\r\n\r\n if (url.port !== null) {\r\n output += \":\" + url.port;\r\n }\r\n } else if (url.host === null && url.scheme === \"file\") {\r\n output += \"//\";\r\n }\r\n\r\n if (url.cannotBeABaseURL) {\r\n output += url.path[0];\r\n } else {\r\n for (const string of url.path) {\r\n output += \"/\" + string;\r\n }\r\n }\r\n\r\n if (url.query !== null) {\r\n output += \"?\" + url.query;\r\n }\r\n\r\n if (!excludeFragment && url.fragment !== null) {\r\n output += \"#\" + url.fragment;\r\n }\r\n\r\n return output;\r\n}\r\n\r\nfunction serializeOrigin(tuple) {\r\n let result = tuple.scheme + \"://\";\r\n result += serializeHost(tuple.host);\r\n\r\n if (tuple.port !== null) {\r\n result += \":\" + tuple.port;\r\n }\r\n\r\n return result;\r\n}\r\n\r\nmodule.exports.serializeURL = serializeURL;\r\n\r\nmodule.exports.serializeURLOrigin = function (url) {\r\n // https://url.spec.whatwg.org/#concept-url-origin\r\n switch (url.scheme) {\r\n case \"blob\":\r\n try {\r\n return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0]));\r\n } catch (e) {\r\n // serializing an opaque origin returns \"null\"\r\n return \"null\";\r\n }\r\n case \"ftp\":\r\n case \"gopher\":\r\n case \"http\":\r\n case \"https\":\r\n case \"ws\":\r\n case \"wss\":\r\n return serializeOrigin({\r\n scheme: url.scheme,\r\n host: url.host,\r\n port: url.port\r\n });\r\n case \"file\":\r\n // spec says \"exercise to the reader\", chrome says \"file://\"\r\n return \"file://\";\r\n default:\r\n // serializing an opaque origin returns \"null\"\r\n return \"null\";\r\n }\r\n};\r\n\r\nmodule.exports.basicURLParse = function (input, options) {\r\n if (options === undefined) {\r\n options = {};\r\n }\r\n\r\n const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride);\r\n if (usm.failure) {\r\n return \"failure\";\r\n }\r\n\r\n return usm.url;\r\n};\r\n\r\nmodule.exports.setTheUsername = function (url, username) {\r\n url.username = \"\";\r\n const decoded = punycode.ucs2.decode(username);\r\n for (let i = 0; i < decoded.length; ++i) {\r\n url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode);\r\n }\r\n};\r\n\r\nmodule.exports.setThePassword = function (url, password) {\r\n url.password = \"\";\r\n const decoded = punycode.ucs2.decode(password);\r\n for (let i = 0; i < decoded.length; ++i) {\r\n url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode);\r\n }\r\n};\r\n\r\nmodule.exports.serializeHost = serializeHost;\r\n\r\nmodule.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort;\r\n\r\nmodule.exports.serializeInteger = function (integer) {\r\n return String(integer);\r\n};\r\n\r\nmodule.exports.parseURL = function (input, options) {\r\n if (options === undefined) {\r\n options = {};\r\n }\r\n\r\n // We don't handle blobs, so this just delegates:\r\n return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride });\r\n};\r\n","\"use strict\";\n\nmodule.exports.mixin = function mixin(target, source) {\n const keys = Object.getOwnPropertyNames(source);\n for (let i = 0; i < keys.length; ++i) {\n Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i]));\n }\n};\n\nmodule.exports.wrapperSymbol = Symbol(\"wrapper\");\nmodule.exports.implSymbol = Symbol(\"impl\");\n\nmodule.exports.wrapperForImpl = function (impl) {\n return impl[module.exports.wrapperSymbol];\n};\n\nmodule.exports.implForWrapper = function (wrapper) {\n return wrapper[module.exports.implSymbol];\n};\n\n","module.exports = require('./lib/tunnel');\n","'use strict';\n\nvar net = require('net');\nvar tls = require('tls');\nvar http = require('http');\nvar https = require('https');\nvar events = require('events');\nvar assert = require('assert');\nvar util = require('util');\n\n\nexports.httpOverHttp = httpOverHttp;\nexports.httpsOverHttp = httpsOverHttp;\nexports.httpOverHttps = httpOverHttps;\nexports.httpsOverHttps = httpsOverHttps;\n\n\nfunction httpOverHttp(options) {\n var agent = new TunnelingAgent(options);\n agent.request = http.request;\n return agent;\n}\n\nfunction httpsOverHttp(options) {\n var agent = new TunnelingAgent(options);\n agent.request = http.request;\n agent.createSocket = createSecureSocket;\n agent.defaultPort = 443;\n return agent;\n}\n\nfunction httpOverHttps(options) {\n var agent = new TunnelingAgent(options);\n agent.request = https.request;\n return agent;\n}\n\nfunction httpsOverHttps(options) {\n var agent = new TunnelingAgent(options);\n agent.request = https.request;\n agent.createSocket = createSecureSocket;\n agent.defaultPort = 443;\n return agent;\n}\n\n\nfunction TunnelingAgent(options) {\n var self = this;\n self.options = options || {};\n self.proxyOptions = self.options.proxy || {};\n self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets;\n self.requests = [];\n self.sockets = [];\n\n self.on('free', function onFree(socket, host, port, localAddress) {\n var options = toOptions(host, port, localAddress);\n for (var i = 0, len = self.requests.length; i < len; ++i) {\n var pending = self.requests[i];\n if (pending.host === options.host && pending.port === options.port) {\n // Detect the request to connect same origin server,\n // reuse the connection.\n self.requests.splice(i, 1);\n pending.request.onSocket(socket);\n return;\n }\n }\n socket.destroy();\n self.removeSocket(socket);\n });\n}\nutil.inherits(TunnelingAgent, events.EventEmitter);\n\nTunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) {\n var self = this;\n var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress));\n\n if (self.sockets.length >= this.maxSockets) {\n // We are over limit so we'll add it to the queue.\n self.requests.push(options);\n return;\n }\n\n // If we are under maxSockets create a new one.\n self.createSocket(options, function(socket) {\n socket.on('free', onFree);\n socket.on('close', onCloseOrRemove);\n socket.on('agentRemove', onCloseOrRemove);\n req.onSocket(socket);\n\n function onFree() {\n self.emit('free', socket, options);\n }\n\n function onCloseOrRemove(err) {\n self.removeSocket(socket);\n socket.removeListener('free', onFree);\n socket.removeListener('close', onCloseOrRemove);\n socket.removeListener('agentRemove', onCloseOrRemove);\n }\n });\n};\n\nTunnelingAgent.prototype.createSocket = function createSocket(options, cb) {\n var self = this;\n var placeholder = {};\n self.sockets.push(placeholder);\n\n var connectOptions = mergeOptions({}, self.proxyOptions, {\n method: 'CONNECT',\n path: options.host + ':' + options.port,\n agent: false,\n headers: {\n host: options.host + ':' + options.port\n }\n });\n if (options.localAddress) {\n connectOptions.localAddress = options.localAddress;\n }\n if (connectOptions.proxyAuth) {\n connectOptions.headers = connectOptions.headers || {};\n connectOptions.headers['Proxy-Authorization'] = 'Basic ' +\n new Buffer(connectOptions.proxyAuth).toString('base64');\n }\n\n debug('making CONNECT request');\n var connectReq = self.request(connectOptions);\n connectReq.useChunkedEncodingByDefault = false; // for v0.6\n connectReq.once('response', onResponse); // for v0.6\n connectReq.once('upgrade', onUpgrade); // for v0.6\n connectReq.once('connect', onConnect); // for v0.7 or later\n connectReq.once('error', onError);\n connectReq.end();\n\n function onResponse(res) {\n // Very hacky. This is necessary to avoid http-parser leaks.\n res.upgrade = true;\n }\n\n function onUpgrade(res, socket, head) {\n // Hacky.\n process.nextTick(function() {\n onConnect(res, socket, head);\n });\n }\n\n function onConnect(res, socket, head) {\n connectReq.removeAllListeners();\n socket.removeAllListeners();\n\n if (res.statusCode !== 200) {\n debug('tunneling socket could not be established, statusCode=%d',\n res.statusCode);\n socket.destroy();\n var error = new Error('tunneling socket could not be established, ' +\n 'statusCode=' + res.statusCode);\n error.code = 'ECONNRESET';\n options.request.emit('error', error);\n self.removeSocket(placeholder);\n return;\n }\n if (head.length > 0) {\n debug('got illegal response body from proxy');\n socket.destroy();\n var error = new Error('got illegal response body from proxy');\n error.code = 'ECONNRESET';\n options.request.emit('error', error);\n self.removeSocket(placeholder);\n return;\n }\n debug('tunneling connection has established');\n self.sockets[self.sockets.indexOf(placeholder)] = socket;\n return cb(socket);\n }\n\n function onError(cause) {\n connectReq.removeAllListeners();\n\n debug('tunneling socket could not be established, cause=%s\\n',\n cause.message, cause.stack);\n var error = new Error('tunneling socket could not be established, ' +\n 'cause=' + cause.message);\n error.code = 'ECONNRESET';\n options.request.emit('error', error);\n self.removeSocket(placeholder);\n }\n};\n\nTunnelingAgent.prototype.removeSocket = function removeSocket(socket) {\n var pos = this.sockets.indexOf(socket)\n if (pos === -1) {\n return;\n }\n this.sockets.splice(pos, 1);\n\n var pending = this.requests.shift();\n if (pending) {\n // If we have pending requests and a socket gets closed a new one\n // needs to be created to take over in the pool for the one that closed.\n this.createSocket(pending, function(socket) {\n pending.request.onSocket(socket);\n });\n }\n};\n\nfunction createSecureSocket(options, cb) {\n var self = this;\n TunnelingAgent.prototype.createSocket.call(self, options, function(socket) {\n var hostHeader = options.request.getHeader('host');\n var tlsOptions = mergeOptions({}, self.options, {\n socket: socket,\n servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host\n });\n\n // 0 is dummy port for v0.6\n var secureSocket = tls.connect(0, tlsOptions);\n self.sockets[self.sockets.indexOf(socket)] = secureSocket;\n cb(secureSocket);\n });\n}\n\n\nfunction toOptions(host, port, localAddress) {\n if (typeof host === 'string') { // since v0.10\n return {\n host: host,\n port: port,\n localAddress: localAddress\n };\n }\n return host; // for v0.11 or later\n}\n\nfunction mergeOptions(target) {\n for (var i = 1, len = arguments.length; i < len; ++i) {\n var overrides = arguments[i];\n if (typeof overrides === 'object') {\n var keys = Object.keys(overrides);\n for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {\n var k = keys[j];\n if (overrides[k] !== undefined) {\n target[k] = overrides[k];\n }\n }\n }\n }\n return target;\n}\n\n\nvar debug;\nif (process.env.NODE_DEBUG && /\\btunnel\\b/.test(process.env.NODE_DEBUG)) {\n debug = function() {\n var args = Array.prototype.slice.call(arguments);\n if (typeof args[0] === 'string') {\n args[0] = 'TUNNEL: ' + args[0];\n } else {\n args.unshift('TUNNEL:');\n }\n console.error.apply(console, args);\n }\n} else {\n debug = function() {};\n}\nexports.debug = debug; // for test\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"v1\", {\n enumerable: true,\n get: function () {\n return _v.default;\n }\n});\nObject.defineProperty(exports, \"v3\", {\n enumerable: true,\n get: function () {\n return _v2.default;\n }\n});\nObject.defineProperty(exports, \"v4\", {\n enumerable: true,\n get: function () {\n return _v3.default;\n }\n});\nObject.defineProperty(exports, \"v5\", {\n enumerable: true,\n get: function () {\n return _v4.default;\n }\n});\nObject.defineProperty(exports, \"NIL\", {\n enumerable: true,\n get: function () {\n return _nil.default;\n }\n});\nObject.defineProperty(exports, \"version\", {\n enumerable: true,\n get: function () {\n return _version.default;\n }\n});\nObject.defineProperty(exports, \"validate\", {\n enumerable: true,\n get: function () {\n return _validate.default;\n }\n});\nObject.defineProperty(exports, \"stringify\", {\n enumerable: true,\n get: function () {\n return _stringify.default;\n }\n});\nObject.defineProperty(exports, \"parse\", {\n enumerable: true,\n get: function () {\n return _parse.default;\n }\n});\n\nvar _v = _interopRequireDefault(require(\"./v1.js\"));\n\nvar _v2 = _interopRequireDefault(require(\"./v3.js\"));\n\nvar _v3 = _interopRequireDefault(require(\"./v4.js\"));\n\nvar _v4 = _interopRequireDefault(require(\"./v5.js\"));\n\nvar _nil = _interopRequireDefault(require(\"./nil.js\"));\n\nvar _version = _interopRequireDefault(require(\"./version.js\"));\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nvar _parse = _interopRequireDefault(require(\"./parse.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _crypto = _interopRequireDefault(require(\"crypto\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction md5(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n } else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n\n return _crypto.default.createHash('md5').update(bytes).digest();\n}\n\nvar _default = md5;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _default = '00000000-0000-0000-0000-000000000000';\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction parse(uuid) {\n if (!(0, _validate.default)(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n let v;\n const arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nvar _default = parse;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = rng;\n\nvar _crypto = _interopRequireDefault(require(\"crypto\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate\n\nlet poolPtr = rnds8Pool.length;\n\nfunction rng() {\n if (poolPtr > rnds8Pool.length - 16) {\n _crypto.default.randomFillSync(rnds8Pool);\n\n poolPtr = 0;\n }\n\n return rnds8Pool.slice(poolPtr, poolPtr += 16);\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _crypto = _interopRequireDefault(require(\"crypto\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction sha1(bytes) {\n if (Array.isArray(bytes)) {\n bytes = Buffer.from(bytes);\n } else if (typeof bytes === 'string') {\n bytes = Buffer.from(bytes, 'utf8');\n }\n\n return _crypto.default.createHash('sha1').update(bytes).digest();\n}\n\nvar _default = sha1;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!(0, _validate.default)(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nvar _default = stringify;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _rng = _interopRequireDefault(require(\"./rng.js\"));\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\nlet _nodeId;\n\nlet _clockseq; // Previous uuid creation time\n\n\nlet _lastMSecs = 0;\nlet _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n let i = buf && offset || 0;\n const b = buf || new Array(16);\n options = options || {};\n let node = options.node || _nodeId;\n let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n const seedBytes = options.random || (options.rng || _rng.default)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (let n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || (0, _stringify.default)(b);\n}\n\nvar _default = v1;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _v = _interopRequireDefault(require(\"./v35.js\"));\n\nvar _md = _interopRequireDefault(require(\"./md5.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst v3 = (0, _v.default)('v3', 0x30, _md.default);\nvar _default = v3;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = _default;\nexports.URL = exports.DNS = void 0;\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nvar _parse = _interopRequireDefault(require(\"./parse.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n const bytes = [];\n\n for (let i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nconst DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexports.DNS = DNS;\nconst URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexports.URL = URL;\n\nfunction _default(name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = (0, _parse.default)(namespace);\n }\n\n if (namespace.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n let bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return (0, _stringify.default)(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _rng = _interopRequireDefault(require(\"./rng.js\"));\n\nvar _stringify = _interopRequireDefault(require(\"./stringify.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction v4(options, buf, offset) {\n options = options || {};\n\n const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return (0, _stringify.default)(rnds);\n}\n\nvar _default = v4;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _v = _interopRequireDefault(require(\"./v35.js\"));\n\nvar _sha = _interopRequireDefault(require(\"./sha1.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst v5 = (0, _v.default)('v5', 0x50, _sha.default);\nvar _default = v5;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _regex = _interopRequireDefault(require(\"./regex.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && _regex.default.test(uuid);\n}\n\nvar _default = validate;\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _validate = _interopRequireDefault(require(\"./validate.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction version(uuid) {\n if (!(0, _validate.default)(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.substr(14, 1), 16);\n}\n\nvar _default = version;\nexports.default = _default;",null,"module.exports = require(\"assert\");","module.exports = require(\"crypto\");","module.exports = require(\"events\");","module.exports = require(\"fs\");","module.exports = require(\"http\");","module.exports = require(\"https\");","module.exports = require(\"net\");","module.exports = require(\"os\");","module.exports = require(\"path\");","module.exports = require(\"punycode\");","module.exports = require(\"stream\");","module.exports = require(\"tls\");","module.exports = require(\"url\");","module.exports = require(\"util\");","module.exports = require(\"zlib\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tvar threw = true;\n\ttry {\n\t\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\t\tthrew = false;\n\t} finally {\n\t\tif(threw) delete __webpack_module_cache__[moduleId];\n\t}\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","\nif (typeof __webpack_require__ !== 'undefined') __webpack_require__.ab = __dirname + \"/\";","\"use strict\";\n//\n// Copyright (C) 2021 CloudTruth, Inc.\n//\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst run_1 = require(\"./run\");\n(0, run_1.run)();\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/jest.config.js b/jest.config.js index 260f676..1df793d 100644 --- a/jest.config.js +++ b/jest.config.js @@ -6,6 +6,7 @@ module.exports = { testEnvironment: 'setup-polly-jest/jest-environment-jsdom', testMatch: ['**/*.test.ts'], testRunner: "jest-jasmine2", + testTimeout: 40000, transform: { '^.+\\.ts$': 'ts-jest' }, diff --git a/openapi.json b/openapi.json index 41606a4..8095bd4 100644 --- a/openapi.json +++ b/openapi.json @@ -185,6 +185,7 @@ "enum": [ "create", "delete", + "expired", "pull", "push", "update" @@ -293,6 +294,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -334,6 +338,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -363,6 +370,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -392,6 +402,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -459,20 +472,6 @@ "schema": { "type": "integer" } - }, - { - "in": "query", - "name": "parent__name", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "parent__name__icontains", - "schema": { - "type": "string" - } } ], "tags": [ @@ -484,6 +483,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -530,6 +532,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -598,6 +603,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -710,6 +718,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -768,6 +779,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -818,6 +832,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -886,6 +903,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -953,6 +973,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1001,6 +1024,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1019,9 +1045,9 @@ "name": "id", "schema": { "type": "string", - "format": "uuid", - "description": "A unique identifier for the environment." + "format": "uuid" }, + "description": "A UUID string identifying this environment ledger.", "required": true } ], @@ -1034,6 +1060,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1070,17 +1099,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Environment" + "$ref": "#/components/schemas/EnvironmentUpdate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/Environment" + "$ref": "#/components/schemas/EnvironmentUpdate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/Environment" + "$ref": "#/components/schemas/EnvironmentUpdate" } } }, @@ -1092,6 +1121,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1099,7 +1131,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Environment" + "$ref": "#/components/schemas/EnvironmentUpdate" } } }, @@ -1128,17 +1160,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PatchedEnvironment" + "$ref": "#/components/schemas/PatchedEnvironmentUpdate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/PatchedEnvironment" + "$ref": "#/components/schemas/PatchedEnvironmentUpdate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/PatchedEnvironment" + "$ref": "#/components/schemas/PatchedEnvironmentUpdate" } } } @@ -1149,6 +1181,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1156,7 +1191,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Environment" + "$ref": "#/components/schemas/EnvironmentUpdate" } } }, @@ -1187,6 +1222,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1199,6 +1237,131 @@ } } }, + "/api/v1/environments/{id}/copy/": { + "post": { + "operationId": "environments_copy_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique identifier for the environment." + }, + "required": true + } + ], + "tags": [ + "environments" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EnvironmentCopy" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/EnvironmentCopy" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/EnvironmentCopy" + } + } + }, + "required": true + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Environment" + } + } + }, + "description": "Environment copied" + }, + "400": { + "description": "The Environment copy failed." + }, + "403": { + "description": "Permission denied." + } + } + } + }, + "/api/v1/features/": { + "get": { + "operationId": "features_retrieve", + "description": "Returns a dictionary of features and whether or not they are enabled", + "tags": [ + "features" + ], + "security": [ + {} + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeaturesResponse" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/features/aichat/": { + "get": { + "operationId": "features_aichat_retrieve", + "description": "Returns details about enabled features for AI Chat", + "tags": [ + "features" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FeaturesAiChatResponse" + } + } + }, + "description": "" + } + } + } + }, "/api/v1/grants/": { "get": { "operationId": "grants_list", @@ -1238,7 +1401,7 @@ "type": "string", "format": "uri" }, - "description": "Filter by principal (User)." + "description": "Filter by principal (User, Group). Returns direct grant assignments, not indirect (user via group)." }, { "in": "query", @@ -1273,6 +1436,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1323,6 +1489,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1367,6 +1536,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1407,17 +1579,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Grant" + "$ref": "#/components/schemas/GrantUpdate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/Grant" + "$ref": "#/components/schemas/GrantUpdate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/Grant" + "$ref": "#/components/schemas/GrantUpdate" } } }, @@ -1429,6 +1601,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1469,17 +1644,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PatchedGrant" + "$ref": "#/components/schemas/PatchedGrantUpdate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/PatchedGrant" + "$ref": "#/components/schemas/PatchedGrantUpdate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/PatchedGrant" + "$ref": "#/components/schemas/PatchedGrantUpdate" } } } @@ -1490,6 +1665,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1532,6 +1710,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1557,6 +1738,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1576,48 +1760,103 @@ } } }, - "/api/v1/import/": { - "post": { - "operationId": "import_create", - "description": "Import parameters from the provided data.", + "/api/v1/groups/": { + "get": { + "operationId": "groups_list", + "description": "Groups allow you to aggregate users for purposes of assigning\ngrants more easily.", "parameters": [ { "in": "query", - "name": "mask_secrets", + "name": "name", "schema": { - "type": "boolean", - "default": false - }, - "description": "Mask secrets in the response" + "type": "string" + } }, { + "name": "ordering", + "required": false, "in": "query", - "name": "preview", + "description": "Which field to use when ordering the results.", "schema": { - "type": "boolean", - "default": false + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "user", + "schema": { + "type": "string", + "format": "uri" }, - "description": "Do not create any objects" + "description": "Filter by user." } ], "tags": [ - "import" + "groups" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedGroupList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "groups_create", + "description": "Groups allow you to aggregate users for purposes of assigning\ngrants more easily.", + "tags": [ + "groups" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ImportCreateRequest" + "$ref": "#/components/schemas/Group" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/ImportCreateRequest" + "$ref": "#/components/schemas/Group" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/ImportCreateRequest" + "$ref": "#/components/schemas/Group" } } }, @@ -1629,6 +1868,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1636,7 +1878,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ImportCreateResponse" + "$ref": "#/components/schemas/Group" } } }, @@ -1645,61 +1887,96 @@ } } }, - "/api/v1/integrations/aws/": { + "/api/v1/groups/{id}/": { "get": { - "operationId": "integrations_aws_list", + "operationId": "groups_retrieve", + "description": "Groups allow you to aggregate users for purposes of assigning\ngrants more easily.", "parameters": [ { - "in": "query", - "name": "aws_account_id", + "in": "path", + "name": "id", "schema": { - "type": "string" - } - }, + "type": "string", + "format": "uuid", + "description": "The unique identifier of a group." + }, + "required": true + } + ], + "tags": [ + "groups" + ], + "security": [ { - "in": "query", - "name": "aws_role_name", - "schema": { - "type": "string" - } + "JWTAuth": [] }, { - "name": "ordering", - "required": false, - "in": "query", - "description": "Which field to use when ordering the results.", - "schema": { - "type": "string" - } + "ApiKeyAuth": [] }, { - "name": "page", - "required": false, - "in": "query", - "description": "A page number within the paginated result set.", - "schema": { - "type": "integer" - } - }, + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "groups_update", + "description": "Groups allow you to aggregate users for purposes of assigning\ngrants more easily.", + "parameters": [ { - "name": "page_size", - "required": false, - "in": "query", - "description": "Number of results to return per page.", + "in": "path", + "name": "id", "schema": { - "type": "integer" - } + "type": "string", + "format": "uuid", + "description": "The unique identifier of a group." + }, + "required": true } ], "tags": [ - "integrations" + "groups" ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Group" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Group" + } + } + }, + "required": true + }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1707,7 +1984,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedAwsIntegrationList" + "$ref": "#/components/schemas/Group" } } }, @@ -1715,32 +1992,42 @@ } } }, - "post": { - "operationId": "integrations_aws_create", - "description": "### Description ###\n\nEstablishes an AWS Integration for your CloudTruth organization.\n\n### Pre-Conditions ###\n\n- An AWS Integration for the account and role cannot already exist.\n### Post-Conditions ###\n\n- You must establish an IAM role and trust relationship based on the Role Name and the External ID.", - "summary": "Establishes an AWS Integration.", + "patch": { + "operationId": "groups_partial_update", + "description": "Groups allow you to aggregate users for purposes of assigning\ngrants more easily.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "The unique identifier of a group." + }, + "required": true + } + ], "tags": [ - "integrations" + "groups" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AwsIntegrationCreate" + "$ref": "#/components/schemas/PatchedGroup" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/AwsIntegrationCreate" + "$ref": "#/components/schemas/PatchedGroup" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/AwsIntegrationCreate" + "$ref": "#/components/schemas/PatchedGroup" } } - }, - "required": true + } }, "security": [ { @@ -1748,93 +2035,118 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "201": { + "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AwsIntegration" + "$ref": "#/components/schemas/Group" } } }, "description": "" } } - } - }, - "/api/v1/integrations/aws/{awsintegration_pk}/pulls/": { - "get": { - "operationId": "integrations_aws_pulls_list", + }, + "delete": { + "operationId": "groups_destroy", + "description": "Groups allow you to aggregate users for purposes of assigning\ngrants more easily.", "parameters": [ { "in": "path", - "name": "awsintegration_pk", + "name": "id", "schema": { "type": "string", - "format": "uuid" + "format": "uuid", + "description": "The unique identifier of a group." }, "required": true - }, - { - "in": "query", - "name": "description__icontains", - "schema": { - "type": "string" - } - }, + } + ], + "tags": [ + "groups" + ], + "security": [ { - "in": "query", - "name": "name", - "schema": { - "type": "string" - } + "JWTAuth": [] }, { - "in": "query", - "name": "name__icontains", - "schema": { - "type": "string" - } + "ApiKeyAuth": [] }, { - "name": "ordering", - "required": false, - "in": "query", - "description": "Which field to use when ordering the results.", - "schema": { - "type": "string" - } - }, + "tokenAuth": [] + } + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v1/groups/{id}/add/": { + "post": { + "operationId": "groups_add_create", + "description": "Add a user to the group.", + "parameters": [ { - "name": "page", - "required": false, - "in": "query", - "description": "A page number within the paginated result set.", + "in": "path", + "name": "id", "schema": { - "type": "integer" - } + "type": "string", + "format": "uuid", + "description": "The unique identifier of a group." + }, + "required": true }, { - "name": "page_size", - "required": false, "in": "query", - "description": "Number of results to return per page.", + "name": "user", "schema": { - "type": "integer" - } + "type": "string", + "format": "uri", + "minLength": 1 + }, + "required": true } ], "tags": [ - "integrations" + "groups" ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Group" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/Group" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Group" + } + } + }, + "required": true + }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -1842,45 +2154,59 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedAwsPullList" + "$ref": "#/components/schemas/Group" } } }, "description": "" } } - }, + } + }, + "/api/v1/groups/{id}/remove/": { "post": { - "operationId": "integrations_aws_pulls_create", + "operationId": "groups_remove_create", + "description": "Remove a user from the group.", "parameters": [ { "in": "path", - "name": "awsintegration_pk", + "name": "id", "schema": { "type": "string", - "format": "uuid" + "format": "uuid", + "description": "The unique identifier of a group." + }, + "required": true + }, + { + "in": "query", + "name": "user", + "schema": { + "type": "string", + "format": "uri", + "minLength": 1 }, "required": true } ], "tags": [ - "integrations" + "groups" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AwsPull" + "$ref": "#/components/schemas/Group" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/AwsPull" + "$ref": "#/components/schemas/Group" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/AwsPull" + "$ref": "#/components/schemas/Group" } } }, @@ -1892,14 +2218,17 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "201": { + "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AwsPull" + "$ref": "#/components/schemas/Group" } } }, @@ -1908,50 +2237,94 @@ } } }, - "/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/": { - "get": { - "operationId": "integrations_aws_pulls_tasks_list", + "/api/v1/import/": { + "post": { + "operationId": "import_create", + "description": "Import parameters from the provided data.", "parameters": [ { - "in": "path", - "name": "awsintegration_pk", + "in": "query", + "name": "mask_secrets", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false }, - "required": true + "description": "Mask secrets in the response" }, { - "in": "path", - "name": "awspull_pk", + "in": "query", + "name": "preview", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean", + "default": false }, - "required": true + "description": "Do not create any objects" + } + ], + "tags": [ + "import" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImportCreateRequest" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ImportCreateRequest" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ImportCreateRequest" + } + } }, + "required": true + }, + "security": [ { - "in": "query", - "name": "modified_at", - "schema": { - "type": "string", - "format": "date-time" - } + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] }, + { + "tokenAuth": [] + } + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImportCreateResponse" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/integrations/aws/": { + "get": { + "operationId": "integrations_aws_list", + "parameters": [ { "in": "query", - "name": "modified_at__gte", + "name": "aws_account_id", "schema": { - "type": "string", - "format": "date-time" + "type": "string" } }, { "in": "query", - "name": "modified_at__lte", + "name": "aws_role_name", "schema": { - "type": "string", - "format": "date-time" + "type": "string" } }, { @@ -1980,40 +2353,79 @@ "schema": { "type": "integer" } + } + ], + "tags": [ + "integrations" + ], + "security": [ + { + "JWTAuth": [] }, { - "in": "query", - "name": "state", - "schema": { - "type": "string", - "enum": [ - "failure", - "queued", - "running", - "skipped", - "success" - ] - }, - "description": "The current state of this task." + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedAwsIntegrationList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "integrations_aws_create", + "description": "### Description ###\n\nEstablishes an AWS Integration for your CloudTruth organization.\n\n### Pre-Conditions ###\n\n- An AWS Integration for the account and role cannot already exist.\n### Post-Conditions ###\n\n- You must establish an IAM role and trust relationship based on the Role Name and the External ID.", + "summary": "Establishes an AWS Integration.", "tags": [ "integrations" ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AwsIntegrationCreate" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/AwsIntegrationCreate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/AwsIntegrationCreate" + } + } + }, + "required": true + }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "200": { + "201": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedAwsPullTaskList" + "$ref": "#/components/schemas/AwsIntegration" } } }, @@ -2022,9 +2434,9 @@ } } }, - "/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/{awspulltask_pk}/steps/": { + "/api/v1/integrations/aws/{awsintegration_pk}/pulls/": { "get": { - "operationId": "integrations_aws_pulls_tasks_steps_list", + "operationId": "integrations_aws_pulls_list", "parameters": [ { "in": "path", @@ -2035,70 +2447,27 @@ }, "required": true }, - { - "in": "path", - "name": "awspull_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "required": true - }, - { - "in": "path", - "name": "awspulltask_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "required": true - }, { "in": "query", - "name": "fqn", + "name": "description__icontains", "schema": { "type": "string" } }, { "in": "query", - "name": "modified_at", - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "in": "query", - "name": "modified_at__gte", + "name": "name", "schema": { - "type": "string", - "format": "date-time" + "type": "string" } }, { "in": "query", - "name": "modified_at__lte", + "name": "name__icontains", "schema": { - "type": "string", - "format": "date-time" + "type": "string" } }, - { - "in": "query", - "name": "operation", - "schema": { - "type": "string", - "nullable": true, - "enum": [ - "create", - "delete", - "read", - "update" - ] - }, - "description": "The operation performed, if any.\n\nWhen the operation is an update, there may be additional details in the success_detail field to describe the change.\n\nWhen the project is filled in but the environment and parameterare not, the operation is on the project. When the environmentis filled in but the project and parameter are not, the operationis on the environment. When the project and parameter are filledin but the environment is not, the operation is on the parameter.When all three are filled in, the operation is on the value ofthe parameter of the project in the specified environment." - }, { "name": "ordering", "required": false, @@ -2125,41 +2494,6 @@ "schema": { "type": "integer" } - }, - { - "in": "query", - "name": "success", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "venue_id", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "venue_id__icontains", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "venue_name", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "venue_name__icontains", - "schema": { - "type": "string" - } } ], "tags": [ @@ -2171,6 +2505,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -2178,18 +2515,16 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedAwsPullTaskStepList" + "$ref": "#/components/schemas/PaginatedAwsPullList" } } }, "description": "" } } - } - }, - "/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/{awspulltask_pk}/steps/{id}/": { - "get": { - "operationId": "integrations_aws_pulls_tasks_steps_retrieve", + }, + "post": { + "operationId": "integrations_aws_pulls_create", "parameters": [ { "in": "path", @@ -2199,53 +2534,48 @@ "format": "uuid" }, "required": true - }, - { - "in": "path", - "name": "awspull_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "required": true - }, - { - "in": "path", - "name": "awspulltask_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "required": true - }, - { - "in": "path", - "name": "id", - "schema": { - "type": "string", - "format": "uuid", - "description": "Unique identifier for a task step." - }, - "required": true } ], "tags": [ "integrations" ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AwsPull" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/AwsPull" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/AwsPull" + } + } + }, + "required": true + }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "200": { + "201": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AwsPullTaskStep" + "$ref": "#/components/schemas/AwsPull" } } }, @@ -2254,9 +2584,9 @@ } } }, - "/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/{id}/": { + "/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/": { "get": { - "operationId": "integrations_aws_pulls_tasks_retrieve", + "operationId": "integrations_aws_pulls_tasks_list", "parameters": [ { "in": "path", @@ -2277,14 +2607,70 @@ "required": true }, { - "in": "path", - "name": "id", + "in": "query", + "name": "modified_at", "schema": { "type": "string", - "format": "uuid", - "description": "The unique identifier for the task." + "format": "date-time" + } + }, + { + "in": "query", + "name": "modified_at__gte", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "in": "query", + "name": "modified_at__lte", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "ordering", + "required": false, + "in": "query", + "description": "Which field to use when ordering the results.", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "state", + "schema": { + "type": "string", + "enum": [ + "failure", + "queued", + "running", + "skipped", + "success" + ] }, - "required": true + "description": "The current state of this task." } ], "tags": [ @@ -2296,6 +2682,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -2303,7 +2692,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AwsPullTask" + "$ref": "#/components/schemas/PaginatedAwsPullTaskList" } } }, @@ -2312,9 +2701,9 @@ } } }, - "/api/v1/integrations/aws/{awsintegration_pk}/pulls/{id}/": { + "/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/{awspulltask_pk}/steps/": { "get": { - "operationId": "integrations_aws_pulls_retrieve", + "operationId": "integrations_aws_pulls_tasks_steps_list", "parameters": [ { "in": "path", @@ -2327,13 +2716,129 @@ }, { "in": "path", - "name": "id", + "name": "awspull_pk", "schema": { "type": "string", - "format": "uuid", - "description": "Unique identifier for the action." + "format": "uuid" + }, + "required": true + }, + { + "in": "path", + "name": "awspulltask_pk", + "schema": { + "type": "string", + "format": "uuid" }, "required": true + }, + { + "in": "query", + "name": "fqn", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "modified_at", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "in": "query", + "name": "modified_at__gte", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "in": "query", + "name": "modified_at__lte", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "in": "query", + "name": "operation", + "schema": { + "type": "string", + "nullable": true, + "enum": [ + "create", + "delete", + "read", + "update" + ] + }, + "description": "The operation performed, if any.\n\nWhen the operation is an update, there may be additional details in the success_detail field to describe the change.\n\nWhen the project is filled in but the environment and parameterare not, the operation is on the project. When the environmentis filled in but the project and parameter are not, the operationis on the environment. When the project and parameter are filledin but the environment is not, the operation is on the parameter.When all three are filled in, the operation is on the value ofthe parameter of the project in the specified environment." + }, + { + "name": "ordering", + "required": false, + "in": "query", + "description": "Which field to use when ordering the results.", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "success", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "venue_id", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "venue_id__icontains", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "venue_name", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "venue_name__icontains", + "schema": { + "type": "string" + } } ], "tags": [ @@ -2345,6 +2850,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -2352,16 +2860,18 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/AwsPull" + "$ref": "#/components/schemas/PaginatedAwsPullTaskStepList" } } }, "description": "" } } - }, - "put": { - "operationId": "integrations_aws_pulls_update", + } + }, + "/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/{awspulltask_pk}/steps/{id}/": { + "get": { + "operationId": "integrations_aws_pulls_tasks_steps_retrieve", "parameters": [ { "in": "path", @@ -2374,10 +2884,191 @@ }, { "in": "path", - "name": "id", + "name": "awspull_pk", "schema": { "type": "string", - "format": "uuid", + "format": "uuid" + }, + "required": true + }, + { + "in": "path", + "name": "awspulltask_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "Unique identifier for a task step." + }, + "required": true + } + ], + "tags": [ + "integrations" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AwsPullTaskStep" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/integrations/aws/{awsintegration_pk}/pulls/{awspull_pk}/tasks/{id}/": { + "get": { + "operationId": "integrations_aws_pulls_tasks_retrieve", + "parameters": [ + { + "in": "path", + "name": "awsintegration_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "path", + "name": "awspull_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "The unique identifier for the task." + }, + "required": true + } + ], + "tags": [ + "integrations" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AwsPullTask" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/integrations/aws/{awsintegration_pk}/pulls/{id}/": { + "get": { + "operationId": "integrations_aws_pulls_retrieve", + "parameters": [ + { + "in": "path", + "name": "awsintegration_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "Unique identifier for the action." + }, + "required": true + } + ], + "tags": [ + "integrations" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AwsPull" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "integrations_aws_pulls_update", + "parameters": [ + { + "in": "path", + "name": "awsintegration_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", "description": "Unique identifier for the action." }, "required": true @@ -2412,6 +3103,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -2478,6 +3172,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -2525,6 +3222,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -2587,6 +3287,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -2616,6 +3319,15 @@ "type": "string" } }, + { + "in": "query", + "name": "environment", + "schema": { + "type": "string", + "format": "uri" + }, + "description": "Filter results to pushes that operate on a tag in the given environment." + }, { "in": "query", "name": "name", @@ -2656,6 +3368,24 @@ "schema": { "type": "integer" } + }, + { + "in": "query", + "name": "project", + "schema": { + "type": "string", + "format": "uri" + }, + "description": "Filter results to pushes that operate on the given project." + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "string", + "format": "uri" + }, + "description": "Filter results to pushes that operate on the given tag." } ], "tags": [ @@ -2667,6 +3397,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -2724,6 +3457,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -2838,6 +3574,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3003,6 +3742,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3070,6 +3812,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3128,6 +3873,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3177,6 +3925,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3244,6 +3995,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3310,6 +4064,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3357,6 +4114,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3420,6 +4180,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3462,6 +4225,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3520,6 +4286,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3577,6 +4346,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3629,6 +4401,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3686,6 +4461,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3702,37 +4480,18 @@ } } }, - "/api/v1/integrations/explore/": { + "/api/v1/integrations/azure/key_vault/": { "get": { - "operationId": "integrations_explore_list", - "description": "### Description ###\n\nQueries a third-party integration to retrieve the data specified by the FQN.\n\nYou can start exploring by not specifying an 'fqn', which will return a list of FQNs for the existing third-party integrations. Third-party integrations can be configured via the Integrations section of the web application.\n", - "summary": "Retrieve third-party integration data for the specified FQN.", + "operationId": "integrations_azure_key_vault_list", "parameters": [ { + "name": "ordering", + "required": false, "in": "query", - "name": "fqn", + "description": "Which field to use when ordering the results.", "schema": { - "type": "string", - "format": "uri" - }, - "description": "FQN (URL-like) for third-party integration." - }, - { - "in": "query", - "name": "jmes", - "schema": { - "type": "string" - }, - "description": "JMES-path qualifier (key within file)" - }, - { - "name": "ordering", - "required": false, - "in": "query", - "description": "Which field to use when ordering the results.", - "schema": { - "type": "string" - } + "type": "string" + } }, { "name": "page", @@ -3751,83 +4510,21 @@ "schema": { "type": "integer" } - } - ], - "tags": [ - "integrations" - ], - "security": [ - { - "JWTAuth": [] - }, - { - "ApiKeyAuth": [] - }, - {} - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PaginatedIntegrationNodeList" - } - } - }, - "description": "The content at the FQN." - }, - "400": { - "description": "Invalid FQN requested." - }, - "403": { - "description": "Unable to contact the third-party integration." - }, - "415": { - "description": "Unsupported content type (usually this means it is binary)." }, - "507": { - "description": "Content exceeds internal size limit of 1MB." - } - } - } - }, - "/api/v1/integrations/github/": { - "get": { - "operationId": "integrations_github_list", - "parameters": [ { "in": "query", - "name": "gh_organization_slug", + "name": "tenant_id", "schema": { - "type": "string" + "type": "string", + "format": "uuid" } }, { - "name": "ordering", - "required": false, "in": "query", - "description": "Which field to use when ordering the results.", + "name": "vault_name", "schema": { "type": "string" } - }, - { - "name": "page", - "required": false, - "in": "query", - "description": "A page number within the paginated result set.", - "schema": { - "type": "integer" - } - }, - { - "name": "page_size", - "required": false, - "in": "query", - "description": "Number of results to return per page.", - "schema": { - "type": "integer" - } } ], "tags": [ @@ -3839,6 +4536,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3846,7 +4546,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedGitHubIntegrationList" + "$ref": "#/components/schemas/PaginatedAzureKeyVaultIntegrationList" } } }, @@ -3855,9 +4555,9 @@ } }, "post": { - "operationId": "integrations_github_create", - "description": "### Description ###\n\nEstablishes a GitHub Integration in your CloudTruth organization.\n\n### Pre-Conditions ###\n\n- The user must be an Administrator or Owner of your organization.\n- A GitHub Integration with the `installation_id` cannot \nalready exist in this organization.\n- The user must first install the CloudTruth GitHub Application in \ntheir GitHub organization and obtain the `installation_id` of the \napplication in order to create the integration.\n\n### Initiating the GitHub Application Installation ###\n\n- Go to `https://github.com/apps/GITHUB_APP_NAME/installations/new?state=`\n- On successful installation the browser will return to \n`https://APP_URL/app_setup/github` (configured in ctops/bin/github*) \nand provide the `installation_id` in the URI.\n- POST to this api to verify and establish the integration.", - "summary": "Establishes a GitHub Integration.", + "operationId": "integrations_azure_key_vault_create", + "description": "### Description ###\n\nEstablishes an Azure Key Vault Integration for your CloudTruth organization.\n\n### Pre-Conditions ###\n\n- An OAuth2 request to install the CloudTruth application in your Azure Tenant must acquire your consent. The resulting JWT access key will contain a `tid` claim that is your Tenant ID. Use this Tenant ID to set up your integration.\n\n### Post-Conditions ###\n\n- You must then grant the CloudTruth service principal rights to access the key vault as a Secrets Manager role (read and write access - purge is not required).", + "summary": "Establishes an Azure Key Vault Integration.", "tags": [ "integrations" ], @@ -3865,17 +4565,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GitHubIntegrationCreate" + "$ref": "#/components/schemas/AzureKeyVaultIntegrationCreate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/GitHubIntegrationCreate" + "$ref": "#/components/schemas/AzureKeyVaultIntegrationCreate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/GitHubIntegrationCreate" + "$ref": "#/components/schemas/AzureKeyVaultIntegrationCreate" } } }, @@ -3887,6 +4587,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3894,7 +4597,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GitHubIntegration" + "$ref": "#/components/schemas/AzureKeyVaultIntegration" } } }, @@ -3903,26 +4606,26 @@ } } }, - "/api/v1/integrations/github/{githubintegration_pk}/pulls/": { + "/api/v1/integrations/azure/key_vault/{akvintegration_pk}/pulls/": { "get": { - "operationId": "integrations_github_pulls_list", + "operationId": "integrations_azure_key_vault_pulls_list", "parameters": [ - { - "in": "query", - "name": "description__icontains", - "schema": { - "type": "string" - } - }, { "in": "path", - "name": "githubintegration_pk", + "name": "akvintegration_pk", "schema": { "type": "string", "format": "uuid" }, "required": true }, + { + "in": "query", + "name": "description__icontains", + "schema": { + "type": "string" + } + }, { "in": "query", "name": "name", @@ -3974,6 +4677,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -3981,7 +4687,67 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedGitHubPullList" + "$ref": "#/components/schemas/PaginatedAzureKeyVaultPullList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "integrations_azure_key_vault_pulls_create", + "parameters": [ + { + "in": "path", + "name": "akvintegration_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + } + ], + "tags": [ + "integrations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AzureKeyVaultPull" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/AzureKeyVaultPull" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/AzureKeyVaultPull" + } + } + }, + "required": true + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AzureKeyVaultPull" } } }, @@ -3990,13 +4756,13 @@ } } }, - "/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/": { + "/api/v1/integrations/azure/key_vault/{akvintegration_pk}/pulls/{akvpull_pk}/tasks/": { "get": { - "operationId": "integrations_github_pulls_tasks_list", + "operationId": "integrations_azure_key_vault_pulls_tasks_list", "parameters": [ { "in": "path", - "name": "githubintegration_pk", + "name": "akvintegration_pk", "schema": { "type": "string", "format": "uuid" @@ -4005,7 +4771,7 @@ }, { "in": "path", - "name": "githubpull_pk", + "name": "akvpull_pk", "schema": { "type": "string", "format": "uuid" @@ -4088,6 +4854,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -4095,7 +4864,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedGitHubPullTaskList" + "$ref": "#/components/schemas/PaginatedAzureKeyVaultPullTaskList" } } }, @@ -4104,20 +4873,13 @@ } } }, - "/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/{githubpulltask_pk}/steps/": { + "/api/v1/integrations/azure/key_vault/{akvintegration_pk}/pulls/{akvpull_pk}/tasks/{akvpulltask_pk}/steps/": { "get": { - "operationId": "integrations_github_pulls_tasks_steps_list", + "operationId": "integrations_azure_key_vault_pulls_tasks_steps_list", "parameters": [ - { - "in": "query", - "name": "fqn", - "schema": { - "type": "string" - } - }, { "in": "path", - "name": "githubintegration_pk", + "name": "akvintegration_pk", "schema": { "type": "string", "format": "uuid" @@ -4126,7 +4888,7 @@ }, { "in": "path", - "name": "githubpull_pk", + "name": "akvpull_pk", "schema": { "type": "string", "format": "uuid" @@ -4135,13 +4897,20 @@ }, { "in": "path", - "name": "githubpulltask_pk", + "name": "akvpulltask_pk", "schema": { "type": "string", "format": "uuid" }, "required": true }, + { + "in": "query", + "name": "fqn", + "schema": { + "type": "string" + } + }, { "in": "query", "name": "modified_at", @@ -4253,6 +5022,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -4260,7 +5032,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedGitHubPullTaskStepList" + "$ref": "#/components/schemas/PaginatedAzureKeyVaultPullTaskStepList" } } }, @@ -4269,13 +5041,13 @@ } } }, - "/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/{githubpulltask_pk}/steps/{id}/": { + "/api/v1/integrations/azure/key_vault/{akvintegration_pk}/pulls/{akvpull_pk}/tasks/{akvpulltask_pk}/steps/{id}/": { "get": { - "operationId": "integrations_github_pulls_tasks_steps_retrieve", + "operationId": "integrations_azure_key_vault_pulls_tasks_steps_retrieve", "parameters": [ { "in": "path", - "name": "githubintegration_pk", + "name": "akvintegration_pk", "schema": { "type": "string", "format": "uuid" @@ -4284,7 +5056,7 @@ }, { "in": "path", - "name": "githubpull_pk", + "name": "akvpull_pk", "schema": { "type": "string", "format": "uuid" @@ -4293,7 +5065,7 @@ }, { "in": "path", - "name": "githubpulltask_pk", + "name": "akvpulltask_pk", "schema": { "type": "string", "format": "uuid" @@ -4320,6 +5092,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -4327,7 +5102,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GitHubPullTaskStep" + "$ref": "#/components/schemas/AzureKeyVaultPullTaskStep" } } }, @@ -4336,13 +5111,13 @@ } } }, - "/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/{id}/": { + "/api/v1/integrations/azure/key_vault/{akvintegration_pk}/pulls/{akvpull_pk}/tasks/{id}/": { "get": { - "operationId": "integrations_github_pulls_tasks_retrieve", + "operationId": "integrations_azure_key_vault_pulls_tasks_retrieve", "parameters": [ { "in": "path", - "name": "githubintegration_pk", + "name": "akvintegration_pk", "schema": { "type": "string", "format": "uuid" @@ -4351,7 +5126,7 @@ }, { "in": "path", - "name": "githubpull_pk", + "name": "akvpull_pk", "schema": { "type": "string", "format": "uuid" @@ -4378,6 +5153,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -4385,7 +5163,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GitHubPullTask" + "$ref": "#/components/schemas/AzureKeyVaultPullTask" } } }, @@ -4394,13 +5172,13 @@ } } }, - "/api/v1/integrations/github/{githubintegration_pk}/pulls/{id}/": { + "/api/v1/integrations/azure/key_vault/{akvintegration_pk}/pulls/{id}/": { "get": { - "operationId": "integrations_github_pulls_retrieve", + "operationId": "integrations_azure_key_vault_pulls_retrieve", "parameters": [ { "in": "path", - "name": "githubintegration_pk", + "name": "akvintegration_pk", "schema": { "type": "string", "format": "uuid" @@ -4427,6 +5205,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -4434,7 +5215,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GitHubPull" + "$ref": "#/components/schemas/AzureKeyVaultPull" } } }, @@ -4443,11 +5224,11 @@ } }, "put": { - "operationId": "integrations_github_pulls_update", + "operationId": "integrations_azure_key_vault_pulls_update", "parameters": [ { "in": "path", - "name": "githubintegration_pk", + "name": "akvintegration_pk", "schema": { "type": "string", "format": "uuid" @@ -4472,17 +5253,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GitHubPull" + "$ref": "#/components/schemas/AzureKeyVaultPull" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/GitHubPull" + "$ref": "#/components/schemas/AzureKeyVaultPull" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/GitHubPull" + "$ref": "#/components/schemas/AzureKeyVaultPull" } } }, @@ -4494,6 +5275,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -4501,7 +5285,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GitHubPull" + "$ref": "#/components/schemas/AzureKeyVaultPull" } } }, @@ -4510,11 +5294,11 @@ } }, "patch": { - "operationId": "integrations_github_pulls_partial_update", + "operationId": "integrations_azure_key_vault_pulls_partial_update", "parameters": [ { "in": "path", - "name": "githubintegration_pk", + "name": "akvintegration_pk", "schema": { "type": "string", "format": "uuid" @@ -4539,17 +5323,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PatchedGitHubPull" + "$ref": "#/components/schemas/PatchedAzureKeyVaultPull" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/PatchedGitHubPull" + "$ref": "#/components/schemas/PatchedAzureKeyVaultPull" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/PatchedGitHubPull" + "$ref": "#/components/schemas/PatchedAzureKeyVaultPull" } } } @@ -4560,6 +5344,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -4567,23 +5354,20 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GitHubPull" + "$ref": "#/components/schemas/AzureKeyVaultPull" } } }, "description": "" } } - } - }, - "/api/v1/integrations/github/{githubintegration_pk}/pulls/{id}/sync/": { - "post": { - "operationId": "integrations_github_pulls_sync_create", - "description": "Enqueue a pull synchronization task for mapped external values accessible with this integration.", + }, + "delete": { + "operationId": "integrations_azure_key_vault_pulls_destroy", "parameters": [ { "in": "path", - "name": "githubintegration_pk", + "name": "akvintegration_pk", "schema": { "type": "string", "format": "uuid" @@ -4604,145 +5388,128 @@ "tags": [ "integrations" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GitHubPull" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/GitHubPull" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/GitHubPull" - } - } - }, - "required": true - }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "202": { - "description": "Synchronization task enqueued." + "403": { + "description": "Cannot destroy innate mapped pull of a data integration." } } } }, - "/api/v1/integrations/github/{id}/": { - "get": { - "operationId": "integrations_github_retrieve", - "summary": "Get details of a GitHub Integration.", + "/api/v1/integrations/azure/key_vault/{akvintegration_pk}/pulls/{id}/sync/": { + "post": { + "operationId": "integrations_azure_key_vault_pulls_sync_create", + "description": "Enqueue a pull synchronization task for mapped external values accessible with this integration.", "parameters": [ { "in": "path", - "name": "id", + "name": "akvintegration_pk", "schema": { "type": "string", - "format": "uuid", - "description": "The unique identifier for the integration." + "format": "uuid" }, "required": true }, { - "in": "query", - "name": "refresh_status", + "in": "path", + "name": "id", "schema": { - "type": "boolean" + "type": "string", + "format": "uuid", + "description": "Unique identifier for the action." }, - "description": "Refresh the integration status before returning the details." + "required": true } ], "tags": [ "integrations" ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AzureKeyVaultPullSyncActionRequest" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/AzureKeyVaultPullSyncActionRequest" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/AzureKeyVaultPullSyncActionRequest" + } + } + } + }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GitHubIntegration" - } - } - }, - "description": "" + "202": { + "description": "Synchronization task enqueued." } } - }, - "delete": { - "operationId": "integrations_github_destroy", - "summary": "Delete a GitHub integration.", + } + }, + "/api/v1/integrations/azure/key_vault/{akvintegration_pk}/pushes/": { + "get": { + "operationId": "integrations_azure_key_vault_pushes_list", "parameters": [ { "in": "path", - "name": "id", + "name": "akvintegration_pk", "schema": { "type": "string", - "format": "uuid", - "description": "The unique identifier for the integration." + "format": "uuid" }, "required": true }, { "in": "query", - "name": "in_use", + "name": "description__icontains", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "environment", "schema": { "type": "string", - "enum": [ - "fail", - "leave", - "remove" - ] + "format": "uri" }, - "description": "(Optional) Desired behavior if the integration has in-use values.\n\n- `fail` will return HTTP error 409 if there are any values using the integration.\n- `leave` (default) will leave values in place and future queries may fail; you can control future value query behavior with the `lookup_error` query parameter on those requests.\n- `remove` will remove the all values using the integration when the integration is removed." - } - ], - "tags": [ - "integrations" - ], - "security": [ - { - "JWTAuth": [] + "description": "Filter results to pushes that operate on a tag in the given environment." }, { - "ApiKeyAuth": [] - } - ], - "responses": { - "204": { - "description": "Integration removed." + "in": "query", + "name": "name", + "schema": { + "type": "string" + } }, - "409": { - "description": "The integration is used by one (or more) Value(s) and cannot be removed." - } - } - } - }, - "/api/v1/invitations/": { - "get": { - "operationId": "invitations_list", - "parameters": [ { "in": "query", - "name": "email", + "name": "name__icontains", "schema": { "type": "string" } @@ -4776,35 +5543,25 @@ }, { "in": "query", - "name": "role", + "name": "project", "schema": { "type": "string", - "enum": [ - "ADMIN", - "CONTRIB", - "OWNER", - "VIEWER" - ] + "format": "uri" }, - "description": "The role that the user will have in the organization, should the user accept." + "description": "Filter results to pushes that operate on the given project." }, { "in": "query", - "name": "state", + "name": "tag", "schema": { "type": "string", - "enum": [ - "accepted", - "bounced", - "pending", - "sent" - ] + "format": "uri" }, - "description": "The current state of the invitation." + "description": "Filter results to pushes that operate on the given tag." } ], "tags": [ - "invitations" + "integrations" ], "security": [ { @@ -4812,6 +5569,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -4819,7 +5579,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedInvitationList" + "$ref": "#/components/schemas/PaginatedAzureKeyVaultPushList" } } }, @@ -4828,27 +5588,36 @@ } }, "post": { - "operationId": "invitations_create", - "description": "Extend an invitation for someone else to join your organization.", - "summary": "Create an invitation.", + "operationId": "integrations_azure_key_vault_pushes_create", + "parameters": [ + { + "in": "path", + "name": "akvintegration_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + } + ], "tags": [ - "invitations" + "integrations" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/InvitationCreate" + "$ref": "#/components/schemas/AzureKeyVaultPush" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/InvitationCreate" + "$ref": "#/components/schemas/AzureKeyVaultPush" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/InvitationCreate" + "$ref": "#/components/schemas/AzureKeyVaultPush" } } }, @@ -4860,6 +5629,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -4867,160 +5639,116 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Invitation" + "$ref": "#/components/schemas/AzureKeyVaultPush" } } }, "description": "" - }, - "403": { - "description": "Permission denied. Is the invitation role more permissive than your own?" - }, - "404": { - "description": "Bad Request. Is there already an invitation for that email?" } } } }, - "/api/v1/invitations/{id}/": { + "/api/v1/integrations/azure/key_vault/{akvintegration_pk}/pushes/{akvpush_pk}/tasks/": { "get": { - "operationId": "invitations_retrieve", + "operationId": "integrations_azure_key_vault_pushes_tasks_list", "parameters": [ { "in": "path", - "name": "id", + "name": "akvintegration_pk", "schema": { "type": "string", - "format": "uuid", - "description": "The unique identifier of an invitation." + "format": "uuid" }, "required": true - } - ], - "tags": [ - "invitations" - ], - "security": [ - { - "JWTAuth": [] }, - { - "ApiKeyAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Invitation" - } - } - }, - "description": "" - } - } - }, - "put": { - "operationId": "invitations_update", - "parameters": [ { "in": "path", - "name": "id", + "name": "akvpush_pk", "schema": { "type": "string", - "format": "uuid", - "description": "The unique identifier of an invitation." + "format": "uuid" }, "required": true - } - ], - "tags": [ - "invitations" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Invitation" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/Invitation" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/Invitation" - } + }, + { + "in": "query", + "name": "modified_at", + "schema": { + "type": "string", + "format": "date-time" } }, - "required": true - }, - "security": [ { - "JWTAuth": [] + "in": "query", + "name": "modified_at__gte", + "schema": { + "type": "string", + "format": "date-time" + } }, { - "ApiKeyAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Invitation" - } - } - }, - "description": "" - } - } - }, - "patch": { - "operationId": "invitations_partial_update", - "parameters": [ + "in": "query", + "name": "modified_at__lte", + "schema": { + "type": "string", + "format": "date-time" + } + }, { - "in": "path", - "name": "id", + "name": "ordering", + "required": false, + "in": "query", + "description": "Which field to use when ordering the results.", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "state", "schema": { "type": "string", - "format": "uuid", - "description": "The unique identifier of an invitation." + "enum": [ + "failure", + "queued", + "running", + "skipped", + "success" + ] }, - "required": true + "description": "The current state of this task." } ], "tags": [ - "invitations" + "integrations" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PatchedInvitation" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/PatchedInvitation" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/PatchedInvitation" - } - } - } - }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -5028,144 +5756,92 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Invitation" + "$ref": "#/components/schemas/PaginatedAzureKeyVaultPushTaskList" } } }, "description": "" } } - }, - "delete": { - "operationId": "invitations_destroy", + } + }, + "/api/v1/integrations/azure/key_vault/{akvintegration_pk}/pushes/{akvpush_pk}/tasks/{akvpushtask_pk}/steps/": { + "get": { + "operationId": "integrations_azure_key_vault_pushes_tasks_steps_list", "parameters": [ { "in": "path", - "name": "id", + "name": "akvintegration_pk", "schema": { "type": "string", - "format": "uuid", - "description": "The unique identifier of an invitation." + "format": "uuid" }, "required": true - } - ], - "tags": [ - "invitations" - ], - "security": [ - { - "JWTAuth": [] }, - { - "ApiKeyAuth": [] - } - ], - "responses": { - "204": { - "description": "No response body" - } - } - } - }, - "/api/v1/invitations/{id}/accept/": { - "post": { - "operationId": "invitations_accept_create", - "description": "Accept an invitation to join an organization.\n\nThe email address used to log in and accept the invitation must match\nthe email address specified by the inviting user when creating the invitation.\n\nOn success the client receives the invitation record as it was updated.\nThe client should then regenerate the JWT with the organization scope and\nproceed to the default landing page.", - "summary": "Accept an invitation.", - "parameters": [ { "in": "path", - "name": "id", + "name": "akvpush_pk", "schema": { "type": "string", "format": "uuid" }, - "description": "The invitation ID.", "required": true - } - ], - "tags": [ - "invitations" - ], - "security": [ - { - "JWTAuth": [] - }, - { - "ApiKeyAuth": [] - }, - {} - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Invitation" - } - } - }, - "description": "The invitation was accepted. The client should obtain an organization scope token and proceed to the landing page." - }, - "403": { - "description": "Permission denied. The accepting user's email may not match the invitation?" }, - "404": { - "description": "Bad Request. The invitation does not exist or has already been accepted?" - } - } - } - }, - "/api/v1/invitations/{id}/resend/": { - "post": { - "operationId": "invitations_resend_create", - "description": "Re-send an invitation to the recipient.", - "summary": "Resend an invitation.", - "parameters": [ { "in": "path", - "name": "id", + "name": "akvpushtask_pk", "schema": { "type": "string", "format": "uuid" }, - "description": "The invitation ID.", "required": true - } - ], - "tags": [ - "invitations" - ], - "security": [ + }, { - "JWTAuth": [] + "in": "query", + "name": "fqn", + "schema": { + "type": "string" + } }, { - "ApiKeyAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Invitation" - } - } + "in": "query", + "name": "modified_at", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "in": "query", + "name": "modified_at__gte", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "in": "query", + "name": "modified_at__lte", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "in": "query", + "name": "operation", + "schema": { + "type": "string", + "nullable": true, + "enum": [ + "create", + "delete", + "read", + "update" + ] }, - "description": "The invitation state was reset to `pending`, which causes it to get sent again. The most recent state is returned. Clients should check the state." + "description": "The operation performed, if any.\n\nWhen the operation is an update, there may be additional details in the success_detail field to describe the change.\n\nWhen the project is filled in but the environment and parameterare not, the operation is on the project. When the environmentis filled in but the project and parameter are not, the operationis on the environment. When the project and parameter are filledin but the environment is not, the operation is on the parameter.When all three are filled in, the operation is on the value ofthe parameter of the project in the specified environment." }, - "404": { - "description": "Bad Request. Was the invitation already accepted?" - } - } - } - }, - "/api/v1/memberships/": { - "get": { - "operationId": "memberships_list", - "parameters": [ { "name": "ordering", "required": false, @@ -5195,36 +5871,52 @@ }, { "in": "query", - "name": "role", + "name": "success", "schema": { - "type": "string", - "enum": [ - "ADMIN", - "CONTRIB", - "OWNER", - "VIEWER" - ] - }, - "description": "The role that the user has in the organization." + "type": "boolean" + } }, { "in": "query", - "name": "user", + "name": "venue_id", "schema": { "type": "string" - }, - "description": "The unique identifier of a user." - } - ], - "tags": [ - "memberships" - ], + } + }, + { + "in": "query", + "name": "venue_id__icontains", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "venue_name", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "venue_name__icontains", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "integrations" + ], "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -5232,53 +5924,138 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedMembershipList" + "$ref": "#/components/schemas/PaginatedAzureKeyVaultPushTaskStepList" } } }, "description": "" } } - }, - "post": { - "operationId": "memberships_create", + } + }, + "/api/v1/integrations/azure/key_vault/{akvintegration_pk}/pushes/{akvpush_pk}/tasks/{akvpushtask_pk}/steps/{id}/": { + "get": { + "operationId": "integrations_azure_key_vault_pushes_tasks_steps_retrieve", + "parameters": [ + { + "in": "path", + "name": "akvintegration_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "path", + "name": "akvpush_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "path", + "name": "akvpushtask_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "Unique identifier for a task step." + }, + "required": true + } + ], "tags": [ - "memberships" + "integrations" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MembershipCreate" + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AzureKeyVaultPushTaskStep" + } } }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/MembershipCreate" - } + "description": "" + } + } + } + }, + "/api/v1/integrations/azure/key_vault/{akvintegration_pk}/pushes/{akvpush_pk}/tasks/{id}/": { + "get": { + "operationId": "integrations_azure_key_vault_pushes_tasks_retrieve", + "parameters": [ + { + "in": "path", + "name": "akvintegration_pk", + "schema": { + "type": "string", + "format": "uuid" }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/MembershipCreate" - } - } + "required": true }, - "required": true - }, + { + "in": "path", + "name": "akvpush_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "The unique identifier for the task." + }, + "required": true + } + ], + "tags": [ + "integrations" + ], "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "201": { + "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Membership" + "$ref": "#/components/schemas/AzureKeyVaultPushTask" } } }, @@ -5287,23 +6064,32 @@ } } }, - "/api/v1/memberships/{id}/": { + "/api/v1/integrations/azure/key_vault/{akvintegration_pk}/pushes/{id}/": { "get": { - "operationId": "memberships_retrieve", + "operationId": "integrations_azure_key_vault_pushes_retrieve", "parameters": [ + { + "in": "path", + "name": "akvintegration_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, { "in": "path", "name": "id", "schema": { "type": "string", "format": "uuid", - "description": "A unique identifier for the membership." + "description": "Unique identifier for the action." }, "required": true } ], "tags": [ - "memberships" + "integrations" ], "security": [ { @@ -5311,6 +6097,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -5318,7 +6107,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Membership" + "$ref": "#/components/schemas/AzureKeyVaultPush" } } }, @@ -5327,37 +6116,46 @@ } }, "put": { - "operationId": "memberships_update", + "operationId": "integrations_azure_key_vault_pushes_update", "parameters": [ + { + "in": "path", + "name": "akvintegration_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, { "in": "path", "name": "id", "schema": { "type": "string", "format": "uuid", - "description": "A unique identifier for the membership." + "description": "Unique identifier for the action." }, "required": true } ], "tags": [ - "memberships" + "integrations" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Membership" + "$ref": "#/components/schemas/AzureKeyVaultPushUpdate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/Membership" + "$ref": "#/components/schemas/AzureKeyVaultPushUpdate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/Membership" + "$ref": "#/components/schemas/AzureKeyVaultPushUpdate" } } }, @@ -5369,6 +6167,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -5376,7 +6177,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Membership" + "$ref": "#/components/schemas/AzureKeyVaultPushUpdate" } } }, @@ -5385,37 +6186,46 @@ } }, "patch": { - "operationId": "memberships_partial_update", + "operationId": "integrations_azure_key_vault_pushes_partial_update", "parameters": [ + { + "in": "path", + "name": "akvintegration_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, { "in": "path", "name": "id", "schema": { "type": "string", "format": "uuid", - "description": "A unique identifier for the membership." + "description": "Unique identifier for the action." }, "required": true } ], "tags": [ - "memberships" + "integrations" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PatchedMembership" + "$ref": "#/components/schemas/PatchedAzureKeyVaultPushUpdate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/PatchedMembership" + "$ref": "#/components/schemas/PatchedAzureKeyVaultPushUpdate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/PatchedMembership" + "$ref": "#/components/schemas/PatchedAzureKeyVaultPushUpdate" } } } @@ -5426,6 +6236,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -5433,7 +6246,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Membership" + "$ref": "#/components/schemas/AzureKeyVaultPushUpdate" } } }, @@ -5442,21 +6255,30 @@ } }, "delete": { - "operationId": "memberships_destroy", + "operationId": "integrations_azure_key_vault_pushes_destroy", "parameters": [ + { + "in": "path", + "name": "akvintegration_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, { "in": "path", "name": "id", "schema": { "type": "string", "format": "uuid", - "description": "A unique identifier for the membership." + "description": "Unique identifier for the action." }, "required": true } ], "tags": [ - "memberships" + "integrations" ], "security": [ { @@ -5464,6 +6286,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -5473,89 +6298,49 @@ } } }, - "/api/v1/organizations/": { - "get": { - "operationId": "organizations_list", + "/api/v1/integrations/azure/key_vault/{akvintegration_pk}/pushes/{id}/sync/": { + "post": { + "operationId": "integrations_azure_key_vault_pushes_sync_create", + "description": "Enqueue a push synchronization task.", "parameters": [ { - "in": "query", - "name": "name", - "schema": { - "type": "string" - } - }, - { - "name": "ordering", - "required": false, - "in": "query", - "description": "Which field to use when ordering the results.", - "schema": { - "type": "string" - } - }, - { - "name": "page", - "required": false, - "in": "query", - "description": "A page number within the paginated result set.", + "in": "path", + "name": "akvintegration_pk", "schema": { - "type": "integer" - } + "type": "string", + "format": "uuid" + }, + "required": true }, { - "name": "page_size", - "required": false, - "in": "query", - "description": "Number of results to return per page.", + "in": "path", + "name": "id", "schema": { - "type": "integer" - } - } - ], - "tags": [ - "organizations" - ], - "security": [ - { - "JWTAuth": [] - }, - { - "ApiKeyAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PaginatedOrganizationList" - } - } + "type": "string", + "format": "uuid", + "description": "Unique identifier for the action." }, - "description": "" + "required": true } - } - }, - "post": { - "operationId": "organizations_create", + ], "tags": [ - "organizations" + "integrations" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OrganizationCreate" + "$ref": "#/components/schemas/AzureKeyVaultPush" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/OrganizationCreate" + "$ref": "#/components/schemas/AzureKeyVaultPush" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/OrganizationCreate" + "$ref": "#/components/schemas/AzureKeyVaultPush" } } }, @@ -5567,38 +6352,44 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Organization" - } - } - }, - "description": "" + "202": { + "description": "Synchronization task enqueued." } } } }, - "/api/v1/organizations/{id}/": { + "/api/v1/integrations/azure/key_vault/{id}/": { "get": { - "operationId": "organizations_retrieve", + "operationId": "integrations_azure_key_vault_retrieve", + "summary": "Get details of an Azure Key Vault Integration.", "parameters": [ { "in": "path", "name": "id", "schema": { "type": "string", - "description": "A unique identifier for the organization." + "format": "uuid", + "description": "The unique identifier for the integration." }, "required": true + }, + { + "in": "query", + "name": "refresh_status", + "schema": { + "type": "boolean" + }, + "description": "Trigger a refresh of the integration status before returning the details." } ], "tags": [ - "organizations" + "integrations" ], "security": [ { @@ -5606,6 +6397,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -5613,7 +6407,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Organization" + "$ref": "#/components/schemas/AzureKeyVaultIntegration" } } }, @@ -5622,40 +6416,40 @@ } }, "put": { - "operationId": "organizations_update", + "operationId": "integrations_azure_key_vault_update", "parameters": [ { "in": "path", "name": "id", "schema": { "type": "string", - "description": "A unique identifier for the organization." + "format": "uuid", + "description": "The unique identifier for the integration." }, "required": true } ], "tags": [ - "organizations" + "integrations" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Organization" + "$ref": "#/components/schemas/AzureKeyVaultIntegration" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/Organization" + "$ref": "#/components/schemas/AzureKeyVaultIntegration" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/Organization" + "$ref": "#/components/schemas/AzureKeyVaultIntegration" } } - }, - "required": true + } }, "security": [ { @@ -5663,6 +6457,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -5670,7 +6467,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Organization" + "$ref": "#/components/schemas/AzureKeyVaultIntegration" } } }, @@ -5679,36 +6476,37 @@ } }, "patch": { - "operationId": "organizations_partial_update", + "operationId": "integrations_azure_key_vault_partial_update", "parameters": [ { "in": "path", "name": "id", "schema": { "type": "string", - "description": "A unique identifier for the organization." + "format": "uuid", + "description": "The unique identifier for the integration." }, "required": true } ], "tags": [ - "organizations" + "integrations" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PatchedOrganization" + "$ref": "#/components/schemas/PatchedAzureKeyVaultIntegration" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/PatchedOrganization" + "$ref": "#/components/schemas/PatchedAzureKeyVaultIntegration" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/PatchedOrganization" + "$ref": "#/components/schemas/PatchedAzureKeyVaultIntegration" } } } @@ -5719,6 +6517,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -5726,7 +6527,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Organization" + "$ref": "#/components/schemas/AzureKeyVaultIntegration" } } }, @@ -5735,20 +6536,35 @@ } }, "delete": { - "operationId": "organizations_destroy", + "operationId": "integrations_azure_key_vault_destroy", + "summary": "Delete an Azure Key Vault integration.", "parameters": [ { "in": "path", "name": "id", "schema": { "type": "string", - "description": "A unique identifier for the organization." + "format": "uuid", + "description": "The unique identifier for the integration." }, "required": true + }, + { + "in": "query", + "name": "in_use", + "schema": { + "type": "string", + "enum": [ + "fail", + "leave", + "remove" + ] + }, + "description": "(Optional) Desired behavior if the integration has in-use values.\n\n- `fail` will return HTTP error 409 if there are any values using the integration.\n- `leave` (default) will leave values in place and future queries may fail; you can control future value query behavior with the `lookup_error` query parameter on those requests.\n- `remove` will remove the all values using the integration when the integration is removed." } ], "tags": [ - "organizations" + "integrations" ], "security": [ { @@ -5756,39 +6572,107 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { "204": { - "description": "No response body" + "description": "Integration removed." + }, + "409": { + "description": "The integration is used by one (or more) Value(s) and cannot be removed." } } } }, - "/api/v1/projects/": { - "get": { - "operationId": "projects_list", + "/api/v1/integrations/azure/key_vault/{id}/scan/": { + "post": { + "operationId": "integrations_azure_key_vault_scan_create", + "description": "Probe a region and service using a pattern matching string that can be used in pull actions. This allows the pattern match to be checked for correctness and preview what will match during creation of the string.", + "summary": "Evaluate a potential pull pattern and understand what it will match.", "parameters": [ { - "in": "query", - "name": "description__icontains", + "in": "path", + "name": "id", "schema": { - "type": "string" + "type": "string", + "format": "uuid" + }, + "required": true + } + ], + "tags": [ + "integrations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AzureKeyVaultIntegrationScan" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/AzureKeyVaultIntegrationScan" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/AzureKeyVaultIntegrationScan" + } } }, + "required": true + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DiscoveryResult" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/integrations/explore/": { + "get": { + "operationId": "integrations_explore_list", + "description": "### Description ###\n\nQueries a third-party integration to retrieve the data specified by the FQN.\n\nYou can start exploring by not specifying an 'fqn', which will return a list of FQNs for the existing third-party integrations. Third-party integrations can be configured via the Integrations section of the web application.\n", + "summary": "Retrieve third-party integration data for the specified FQN.", + "parameters": [ { "in": "query", - "name": "name", + "name": "fqn", "schema": { - "type": "string" - } + "type": "string", + "format": "uri" + }, + "description": "FQN (URL-like) for third-party integration." }, { "in": "query", - "name": "name__icontains", + "name": "jmes", "schema": { "type": "string" - } + }, + "description": "JMES-path qualifier (key within file)" }, { "name": "ordering", @@ -5816,10 +6700,18 @@ "schema": { "type": "integer" } + }, + { + "in": "query", + "name": "page_token", + "schema": { + "type": "string" + }, + "description": "When paginating, this is the value that came back in the last page's next" } ], "tags": [ - "projects" + "integrations" ], "security": [ { @@ -5827,6 +6719,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -5834,78 +6729,68 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedProjectList" + "$ref": "#/components/schemas/PaginatedIntegrationNodeList" } } }, - "description": "" - } - } - }, - "post": { - "operationId": "projects_create", - "tags": [ - "projects" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ProjectCreate" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/ProjectCreate" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/ProjectCreate" - } - } + "description": "The content at the FQN." }, - "required": true - }, - "security": [ - { - "JWTAuth": [] + "400": { + "description": "Invalid FQN requested." }, - { - "ApiKeyAuth": [] - } - ], - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Project" - } - } - }, - "description": "" + "403": { + "description": "Unable to contact the third-party integration." + }, + "415": { + "description": "Unsupported content type (usually this means it is binary)." + }, + "507": { + "description": "Content exceeds internal size limit of 1MB." } } } }, - "/api/v1/projects/{id}/": { + "/api/v1/integrations/github/": { "get": { - "operationId": "projects_retrieve", + "operationId": "integrations_github_list", "parameters": [ { - "in": "path", - "name": "id", + "in": "query", + "name": "gh_organization_slug", "schema": { - "type": "string", - "format": "uuid", - "description": "A unique identifier for the project." - }, - "required": true + "type": "string" + } + }, + { + "name": "ordering", + "required": false, + "in": "query", + "description": "Which field to use when ordering the results.", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } } ], "tags": [ - "projects" + "integrations" ], "security": [ { @@ -5913,6 +6798,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -5920,7 +6808,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Project" + "$ref": "#/components/schemas/PaginatedGitHubIntegrationList" } } }, @@ -5928,38 +6816,28 @@ } } }, - "put": { - "operationId": "projects_update", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "string", - "format": "uuid", - "description": "A unique identifier for the project." - }, - "required": true - } - ], + "post": { + "operationId": "integrations_github_create", + "description": "### Description ###\n\nEstablishes a GitHub Integration in your CloudTruth organization.\n\n### Pre-Conditions ###\n\n- The user must be an Administrator or Owner of your organization.\n- A GitHub Integration with the `installation_id` cannot \nalready exist in this organization.\n- The user must first install the CloudTruth GitHub Application in \ntheir GitHub organization and obtain the `installation_id` of the \napplication in order to create the integration.\n\n### Initiating the GitHub Application Installation ###\n\n- Go to `https://github.com/apps/GITHUB_APP_NAME/installations/new?state=`\n- On successful installation the browser will return to \n`https://APP_URL/app_setup/github` (configured in ctops/bin/github*) \nand provide the `installation_id` in the URI.\n- POST to this api to verify and establish the integration.", + "summary": "Establishes a GitHub Integration.", "tags": [ - "projects" + "integrations" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Project" + "$ref": "#/components/schemas/GitHubIntegrationCreate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/Project" + "$ref": "#/components/schemas/GitHubIntegrationCreate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/Project" + "$ref": "#/components/schemas/GitHubIntegrationCreate" } } }, @@ -5971,63 +6849,99 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "200": { + "201": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Project" + "$ref": "#/components/schemas/GitHubIntegration" } } }, "description": "" } } - }, - "patch": { - "operationId": "projects_partial_update", + } + }, + "/api/v1/integrations/github/{githubintegration_pk}/pulls/": { + "get": { + "operationId": "integrations_github_pulls_list", "parameters": [ + { + "in": "query", + "name": "description__icontains", + "schema": { + "type": "string" + } + }, { "in": "path", - "name": "id", + "name": "githubintegration_pk", "schema": { "type": "string", - "format": "uuid", - "description": "A unique identifier for the project." + "format": "uuid" }, "required": true + }, + { + "in": "query", + "name": "name", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "name__icontains", + "schema": { + "type": "string" + } + }, + { + "name": "ordering", + "required": false, + "in": "query", + "description": "Which field to use when ordering the results.", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } } ], "tags": [ - "projects" + "integrations" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PatchedProject" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/PatchedProject" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/PatchedProject" - } - } - } - }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -6035,159 +6949,106 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Project" + "$ref": "#/components/schemas/PaginatedGitHubPullList" } } }, "description": "" } } - }, - "delete": { - "operationId": "projects_destroy", + } + }, + "/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/": { + "get": { + "operationId": "integrations_github_pulls_tasks_list", "parameters": [ { "in": "path", - "name": "id", + "name": "githubintegration_pk", "schema": { "type": "string", - "format": "uuid", - "description": "A unique identifier for the project." + "format": "uuid" }, "required": true - } - ], - "tags": [ - "projects" - ], - "security": [ - { - "JWTAuth": [] }, { - "ApiKeyAuth": [] - } - ], - "responses": { - "204": { - "description": "Project destroyed." + "in": "path", + "name": "githubpull_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true }, - "409": { - "description": "The project has dependents and cannot be removed." - } - } - } - }, - "/api/v1/projects/{project_pk}/parameter-export/": { - "get": { - "operationId": "projects_parameter_export_list", - "description": "Exports all parameters in this project in the requested format.\n\nParameter names and values will be coerced to the proper format (e.g. for a\ndotenv export, my_parameter will be capitalized to MY_PARAMETER and its value\nwill be in a quoted string). Note that capitalization is the only name coercion\nthat will be performed on parameter names, names that are invalid for a given\nformat will be omitted.", - "parameters": [ { "in": "query", - "name": "as_of", + "name": "modified_at", "schema": { "type": "string", "format": "date-time" - }, - "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." + } }, { "in": "query", - "name": "contains", + "name": "modified_at__gte", "schema": { - "type": "string" - }, - "description": "Only include parameters with names that contain the provided string." + "type": "string", + "format": "date-time" + } }, { "in": "query", - "name": "endswith", + "name": "modified_at__lte", "schema": { - "type": "string" - }, - "description": "Only include parameters with names that end with the provided string." + "type": "string", + "format": "date-time" + } }, { + "name": "ordering", + "required": false, "in": "query", - "name": "environment", + "description": "Which field to use when ordering the results.", "schema": { "type": "string" - }, - "description": "Name or id of the environment to use to retrieve parameter values." + } }, { + "name": "page", + "required": false, "in": "query", - "name": "explicit_export", + "description": "A page number within the paginated result set.", "schema": { - "type": "boolean", - "default": false - }, - "description": "Explicitly marks parameters with export, e.g. `export FOO=bar`." + "type": "integer" + } }, { + "name": "page_size", + "required": false, "in": "query", - "name": "mask_secrets", - "schema": { - "type": "boolean", - "default": false - }, - "description": "Masks all secrets in the template with `*****`." - }, - { - "name": "ordering", - "required": false, - "in": "query", - "description": "Which field to use when ordering the results.", + "description": "Number of results to return per page.", "schema": { - "type": "string" + "type": "integer" } }, { "in": "query", - "name": "output", - "schema": { - "type": "string" - }, - "description": "Format to output: One of 'docker', 'dotenv', 'shell'." - }, - { - "in": "path", - "name": "project_pk", + "name": "state", "schema": { "type": "string", - "format": "uuid" - }, - "required": true - }, - { - "in": "query", - "name": "startswith", - "schema": { - "type": "string" - }, - "description": "Only include parameters with names that start with the provided string." - }, - { - "in": "query", - "name": "tag", - "schema": { - "type": "string" - }, - "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." - }, - { - "in": "query", - "name": "wrap", - "schema": { - "type": "boolean", - "default": false + "enum": [ + "failure", + "queued", + "running", + "skipped", + "success" + ] }, - "description": "Indicates all secrets are wrapped. For more information on secret wrapping, see the documentation." + "description": "The current state of this task." } ], "tags": [ - "projects" + "integrations" ], "security": [ { @@ -6195,6 +7056,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -6202,17 +7066,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterExport" - } - } - }, - "description": "" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TemplateLookupError" + "$ref": "#/components/schemas/PaginatedGitHubPullTaskList" } } }, @@ -6221,115 +7075,82 @@ } } }, - "/api/v1/projects/{project_pk}/parameters/": { + "/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/{githubpulltask_pk}/steps/": { "get": { - "operationId": "projects_parameters_list", + "operationId": "integrations_github_pulls_tasks_steps_list", "parameters": [ { "in": "query", - "name": "as_of", - "schema": { - "type": "string", - "format": "date-time" - }, - "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." - }, - { - "in": "query", - "name": "description__icontains", + "name": "fqn", "schema": { "type": "string" } }, { - "in": "query", - "name": "difference", - "schema": { - "type": "string" - }, - "description": "Specify a list of comma-separated environment names or ids (uuid) to compare values. Only returns a parameter if there is a difference. Cannot be used with `environment`, `wrap` or `values`. If used with `mask_secrets` then no secret parameters will be included in the result." - }, - { - "in": "query", - "name": "environment", - "schema": { - "type": "string" - }, - "description": "Name or id (uuid) of the environment to get parameter values for. Cannot be used with `values`." - }, - { - "in": "query", - "name": "evaluate", + "in": "path", + "name": "githubintegration_pk", "schema": { - "type": "boolean", - "default": true + "type": "string", + "format": "uuid" }, - "description": "If `true`, runs template evaluation on this parameter's values. If `false`, returns the value's template.\nHas no effect on values that are not interpolated." + "required": true }, { - "in": "query", - "name": "id__in", + "in": "path", + "name": "githubpull_pk", "schema": { - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } + "type": "string", + "format": "uuid" }, - "description": "Multiple values may be separated by commas.", - "explode": false, - "style": "form" + "required": true }, { - "in": "query", - "name": "mask_secrets", + "in": "path", + "name": "githubpulltask_pk", "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" }, - "description": "If true, replaces all secrets with `*****`." - }, - { - "in": "query", - "name": "name", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "name__contains", - "schema": { - "type": "string" - } + "required": true }, { "in": "query", - "name": "name__icontains", + "name": "modified_at", "schema": { - "type": "string" + "type": "string", + "format": "date-time" } }, { "in": "query", - "name": "name__iexact", + "name": "modified_at__gte", "schema": { - "type": "string" + "type": "string", + "format": "date-time" } }, { "in": "query", - "name": "name__istartswith", + "name": "modified_at__lte", "schema": { - "type": "string" + "type": "string", + "format": "date-time" } }, { "in": "query", - "name": "name__startswith", + "name": "operation", "schema": { - "type": "string" - } + "type": "string", + "nullable": true, + "enum": [ + "create", + "delete", + "read", + "update" + ] + }, + "description": "The operation performed, if any.\n\nWhen the operation is an update, there may be additional details in the success_detail field to describe the change.\n\nWhen the project is filled in but the environment and parameterare not, the operation is on the project. When the environmentis filled in but the project and parameter are not, the operationis on the environment. When the project and parameter are filledin but the environment is not, the operation is on the parameter.When all three are filled in, the operation is on the value ofthe parameter of the project in the specified environment." }, { "name": "ordering", @@ -6359,50 +7180,43 @@ } }, { - "in": "path", - "name": "project_pk", + "in": "query", + "name": "success", "schema": { - "type": "string", - "format": "uuid" - }, - "required": true + "type": "boolean" + } }, { "in": "query", - "name": "secret", + "name": "venue_id", "schema": { - "type": "boolean" + "type": "string" } }, { "in": "query", - "name": "tag", + "name": "venue_id__icontains", "schema": { "type": "string" - }, - "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." + } }, { "in": "query", - "name": "values", + "name": "venue_name", "schema": { - "type": "boolean", - "default": true - }, - "description": "If false, values are not returned: the `values` array will have no entries. This speeds up retrieval if value content is not needed. Cannot be used with `environment`." + "type": "string" + } }, { "in": "query", - "name": "wrap", + "name": "venue_name__icontains", "schema": { - "type": "boolean", - "default": false - }, - "description": "Wrap secrets." + "type": "string" + } } ], "tags": [ - "projects" + "integrations" ], "security": [ { @@ -6410,6 +7224,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -6417,64 +7234,77 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedParameterList" + "$ref": "#/components/schemas/PaginatedGitHubPullTaskStepList" } } }, "description": "" } } - }, - "post": { - "operationId": "projects_parameters_create", + } + }, + "/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/{githubpulltask_pk}/steps/{id}/": { + "get": { + "operationId": "integrations_github_pulls_tasks_steps_retrieve", "parameters": [ { "in": "path", - "name": "project_pk", + "name": "githubintegration_pk", "schema": { "type": "string", "format": "uuid" }, "required": true - } - ], - "tags": [ - "projects" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ParameterCreate" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/ParameterCreate" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/ParameterCreate" - } - } }, - "required": true - }, - "security": [ { - "JWTAuth": [] + "in": "path", + "name": "githubpull_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "path", + "name": "githubpulltask_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "Unique identifier for a task step." + }, + "required": true + } + ], + "tags": [ + "integrations" + ], + "security": [ + { + "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "201": { + "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Parameter" + "$ref": "#/components/schemas/GitHubPullTaskStep" } } }, @@ -6483,51 +7313,13 @@ } } }, - "/api/v1/projects/{project_pk}/parameters/{parameter_pk}/pushes/": { + "/api/v1/integrations/github/{githubintegration_pk}/pulls/{githubpull_pk}/tasks/{id}/": { "get": { - "operationId": "projects_parameters_pushes_list", - "description": "The push operations that this parameter was involved in.", - "summary": "List push operations.", + "operationId": "integrations_github_pulls_tasks_retrieve", "parameters": [ - { - "in": "query", - "name": "as_of", - "schema": { - "type": "string", - "format": "date-time" - }, - "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." - }, - { - "name": "ordering", - "required": false, - "in": "query", - "description": "Which field to use when ordering the results.", - "schema": { - "type": "string" - } - }, - { - "name": "page", - "required": false, - "in": "query", - "description": "A page number within the paginated result set.", - "schema": { - "type": "integer" - } - }, - { - "name": "page_size", - "required": false, - "in": "query", - "description": "Number of results to return per page.", - "schema": { - "type": "integer" - } - }, { "in": "path", - "name": "parameter_pk", + "name": "githubintegration_pk", "schema": { "type": "string", "format": "uuid" @@ -6536,7 +7328,7 @@ }, { "in": "path", - "name": "project_pk", + "name": "githubpull_pk", "schema": { "type": "string", "format": "uuid" @@ -6544,16 +7336,18 @@ "required": true }, { - "in": "query", - "name": "tag", + "in": "path", + "name": "id", "schema": { - "type": "string" + "type": "string", + "format": "uuid", + "description": "The unique identifier for the task." }, - "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." + "required": true } ], "tags": [ - "projects" + "integrations" ], "security": [ { @@ -6561,6 +7355,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -6568,7 +7365,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedTaskStepList" + "$ref": "#/components/schemas/GitHubPullTask" } } }, @@ -6577,74 +7374,32 @@ } } }, - "/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/": { + "/api/v1/integrations/github/{githubintegration_pk}/pulls/{id}/": { "get": { - "operationId": "projects_parameters_rules_list", + "operationId": "integrations_github_pulls_retrieve", "parameters": [ - { - "name": "ordering", - "required": false, - "in": "query", - "description": "Which field to use when ordering the results.", - "schema": { - "type": "string" - } - }, - { - "name": "page", - "required": false, - "in": "query", - "description": "A page number within the paginated result set.", - "schema": { - "type": "integer" - } - }, - { - "name": "page_size", - "required": false, - "in": "query", - "description": "Number of results to return per page.", - "schema": { - "type": "integer" - } - }, { "in": "path", - "name": "parameter_pk", + "name": "githubintegration_pk", "schema": { "type": "string", "format": "uuid" }, - "description": "The parameter id.", "required": true }, { "in": "path", - "name": "project_pk", + "name": "id", "schema": { "type": "string", - "format": "uuid" + "format": "uuid", + "description": "Unique identifier for the action." }, - "description": "The project id.", "required": true - }, - { - "in": "query", - "name": "type", - "schema": { - "type": "string", - "enum": [ - "max", - "max_len", - "min", - "min_len", - "regex" - ] - } } ], "tags": [ - "projects" + "integrations" ], "security": [ { @@ -6652,6 +7407,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -6659,7 +7417,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedParameterRuleList" + "$ref": "#/components/schemas/GitHubPull" } } }, @@ -6667,48 +7425,47 @@ } } }, - "post": { - "operationId": "projects_parameters_rules_create", + "put": { + "operationId": "integrations_github_pulls_update", "parameters": [ { "in": "path", - "name": "parameter_pk", + "name": "githubintegration_pk", "schema": { "type": "string", "format": "uuid" }, - "description": "The parameter id.", "required": true }, { "in": "path", - "name": "project_pk", + "name": "id", "schema": { "type": "string", - "format": "uuid" + "format": "uuid", + "description": "Unique identifier for the action." }, - "description": "The project id.", "required": true } ], "tags": [ - "projects" + "integrations" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterRuleCreate" + "$ref": "#/components/schemas/GitHubPull" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/ParameterRuleCreate" + "$ref": "#/components/schemas/GitHubPull" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/ParameterRuleCreate" + "$ref": "#/components/schemas/GitHubPull" } } }, @@ -6720,66 +7477,78 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "201": { + "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterRule" + "$ref": "#/components/schemas/GitHubPull" } } }, "description": "" } } - } - }, - "/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/{id}/": { - "get": { - "operationId": "projects_parameters_rules_retrieve", + }, + "patch": { + "operationId": "integrations_github_pulls_partial_update", "parameters": [ { "in": "path", - "name": "id", - "schema": { - "type": "string", - "format": "uuid" - }, - "description": "A UUID string identifying this parameter rule.", - "required": true - }, - { - "in": "path", - "name": "parameter_pk", + "name": "githubintegration_pk", "schema": { "type": "string", "format": "uuid" }, - "description": "The parameter id.", "required": true }, { "in": "path", - "name": "project_pk", + "name": "id", "schema": { "type": "string", - "format": "uuid" + "format": "uuid", + "description": "Unique identifier for the action." }, - "description": "The project id.", "required": true } ], "tags": [ - "projects" + "integrations" ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedGitHubPull" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/PatchedGitHubPull" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/PatchedGitHubPull" + } + } + } + }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -6787,66 +7556,58 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterRule" + "$ref": "#/components/schemas/GitHubPull" } } }, "description": "" } } - }, - "put": { - "operationId": "projects_parameters_rules_update", + } + }, + "/api/v1/integrations/github/{githubintegration_pk}/pulls/{id}/sync/": { + "post": { + "operationId": "integrations_github_pulls_sync_create", + "description": "Enqueue a pull synchronization task for mapped external values accessible with this integration.", "parameters": [ { "in": "path", - "name": "id", + "name": "githubintegration_pk", "schema": { "type": "string", "format": "uuid" }, - "description": "A UUID string identifying this parameter rule.", "required": true }, { "in": "path", - "name": "parameter_pk", + "name": "id", "schema": { "type": "string", - "format": "uuid" + "format": "uuid", + "description": "Unique identifier for the action." }, - "description": "The parameter id.", - "required": true - }, - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "description": "The project id.", "required": true } ], "tags": [ - "projects" + "integrations" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterRule" + "$ref": "#/components/schemas/GitHubPull" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/ParameterRule" + "$ref": "#/components/schemas/GitHubPull" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/ParameterRule" + "$ref": "#/components/schemas/GitHubPull" } } }, @@ -6858,83 +7619,54 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ParameterRule" - } - } - }, - "description": "" + "202": { + "description": "Synchronization task enqueued." } } - }, - "patch": { - "operationId": "projects_parameters_rules_partial_update", + } + }, + "/api/v1/integrations/github/{id}/": { + "get": { + "operationId": "integrations_github_retrieve", + "summary": "Get details of a GitHub Integration.", "parameters": [ { "in": "path", "name": "id", "schema": { "type": "string", - "format": "uuid" - }, - "description": "A UUID string identifying this parameter rule.", - "required": true - }, - { - "in": "path", - "name": "parameter_pk", - "schema": { - "type": "string", - "format": "uuid" + "format": "uuid", + "description": "The unique identifier for the integration." }, - "description": "The parameter id.", "required": true }, { - "in": "path", - "name": "project_pk", + "in": "query", + "name": "refresh_status", "schema": { - "type": "string", - "format": "uuid" + "type": "boolean" }, - "description": "The project id.", - "required": true + "description": "Refresh the integration status before returning the details." } ], "tags": [ - "projects" + "integrations" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PatchedParameterRule" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/PatchedParameterRule" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/PatchedParameterRule" - } - } - } - }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -6942,7 +7674,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterRule" + "$ref": "#/components/schemas/GitHubIntegration" } } }, @@ -6951,41 +7683,35 @@ } }, "delete": { - "operationId": "projects_parameters_rules_destroy", + "operationId": "integrations_github_destroy", + "summary": "Delete a GitHub integration.", "parameters": [ { "in": "path", "name": "id", "schema": { "type": "string", - "format": "uuid" - }, - "description": "A UUID string identifying this parameter rule.", - "required": true - }, - { - "in": "path", - "name": "parameter_pk", - "schema": { - "type": "string", - "format": "uuid" + "format": "uuid", + "description": "The unique identifier for the integration." }, - "description": "The parameter id.", "required": true }, { - "in": "path", - "name": "project_pk", + "in": "query", + "name": "in_use", "schema": { "type": "string", - "format": "uuid" + "enum": [ + "fail", + "leave", + "remove" + ] }, - "description": "The project id.", - "required": true + "description": "(Optional) Desired behavior if the integration has in-use values.\n\n- `fail` will return HTTP error 409 if there are any values using the integration.\n- `leave` (default) will leave values in place and future queries may fail; you can control future value query behavior with the `lookup_error` query parameter on those requests.\n- `remove` will remove the all values using the integration when the integration is removed." } ], "tags": [ - "projects" + "integrations" ], "security": [ { @@ -6993,71 +7719,40 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { "204": { - "description": "No response body" + "description": "Integration removed." + }, + "409": { + "description": "The integration is used by one (or more) Value(s) and cannot be removed." } } } }, - "/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/": { + "/api/v1/invitations/": { "get": { - "operationId": "projects_parameters_values_list", - "description": "\n Retrieve previously set values of a parameter in one or all environments.\n To see all the _effective_ values for a parameter across every environment,\n use the Parameters API (see the `values` field).\n ", - "summary": "Retrieve values.", + "operationId": "invitations_list", "parameters": [ { "in": "query", - "name": "as_of", - "schema": { - "type": "string", - "format": "date-time" - }, - "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." - }, - { - "in": "query", - "name": "environment", - "schema": { - "type": "string" - }, - "description": "Name or id of the environment to limit the result to. If this is not specified then the result will contain a value for any environment in which it is set. You cannot use this option to retrieve the _effective_ value of a parameter in an environment for which is is not explicitly set. To see _effective_ values use the Parameters API (see the `values` field)." - }, - { - "in": "query", - "name": "evaluate", - "schema": { - "type": "boolean", - "default": true - }, - "description": "If `true`, runs template evaluation on this parameter. If `false`, returns the value's template.\nNo effect on values that are not interpolated." - }, - { - "in": "query", - "name": "exclude", + "name": "email", "schema": { "type": "string" - }, - "description": "A comma-separated list of field names to exclude from the response." + } }, { + "name": "ordering", + "required": false, "in": "query", - "name": "include", + "description": "Which field to use when ordering the results.", "schema": { "type": "string" - }, - "description": "A comma-separated list of field names to include in the response." - }, - { - "in": "query", - "name": "mask_secrets", - "schema": { - "type": "boolean", - "default": false - }, - "description": "Mask secret values in responses with `*****`." + } }, { "name": "page", @@ -7077,46 +7772,37 @@ "type": "integer" } }, - { - "in": "path", - "name": "parameter_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "description": "The parameter id.", - "required": true - }, - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "description": "The project id.", - "required": true - }, { "in": "query", - "name": "tag", + "name": "role", "schema": { - "type": "string" + "type": "string", + "enum": [ + "ADMIN", + "CONTRIB", + "OWNER", + "VIEWER" + ] }, - "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." + "description": "The role that the user will have in the organization, should the user accept." }, { "in": "query", - "name": "wrap", + "name": "state", "schema": { - "type": "boolean", - "default": false + "type": "string", + "enum": [ + "accepted", + "bounced", + "pending", + "sent" + ] }, - "description": "For writes, indicates `internal_value` is wrapped; for reads, indicates `value` is wrapped. For more information on secret wrapping, see the documentation. " + "description": "The current state of the invitation." } ], "tags": [ - "projects" + "invitations" ], "security": [ { @@ -7124,6 +7810,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -7131,7 +7820,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedValueList" + "$ref": "#/components/schemas/PaginatedInvitationList" } } }, @@ -7140,77 +7829,41 @@ } }, "post": { - "operationId": "projects_parameters_values_create", - "description": "Set the value of a parameter in an environment.", - "summary": "Set a value.", - "parameters": [ - { - "in": "query", - "name": "evaluate", - "schema": { - "type": "boolean", - "default": true + "operationId": "invitations_create", + "description": "Extend an invitation for someone else to join your organization.", + "summary": "Create an invitation.", + "tags": [ + "invitations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvitationCreate" + } }, - "description": "If `true`, runs template evaluation on this parameter. If `false`, returns the value's template.\nNo effect on values that are not interpolated." + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/InvitationCreate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/InvitationCreate" + } + } }, - { - "in": "path", - "name": "parameter_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "description": "The parameter id.", - "required": true - }, - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "description": "The project id.", - "required": true - }, - { - "in": "query", - "name": "wrap", - "schema": { - "type": "boolean" - }, - "description": "Indicates the `internal_value` is a wrapped secret. For more information on secret wrapping, see the documentation. " - } - ], - "tags": [ - "projects" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ValueCreate" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/ValueCreate" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/ValueCreate" - } - } - }, - "required": true - }, - "security": [ + "required": true + }, + "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -7218,114 +7871,38 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Value" + "$ref": "#/components/schemas/Invitation" } } }, "description": "" + }, + "403": { + "description": "Permission denied. Is the invitation role more permissive than your own?" + }, + "404": { + "description": "Bad Request. Is there already an invitation for that email?" } } } }, - "/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/{id}/": { + "/api/v1/invitations/{id}/": { "get": { - "operationId": "projects_parameters_values_retrieve", - "description": "Retrieve the value of a parameter in an environment.", - "summary": "Retrieve a value.", + "operationId": "invitations_retrieve", "parameters": [ - { - "in": "query", - "name": "as_of", - "schema": { - "type": "string", - "format": "date-time" - }, - "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." - }, - { - "in": "query", - "name": "evaluate", - "schema": { - "type": "boolean", - "default": true - }, - "description": "If `true`, runs template evaluation on this parameter. If `false`, returns the value's template.\nNo effect on values that are not interpolated." - }, - { - "in": "query", - "name": "exclude", - "schema": { - "type": "string" - }, - "description": "A comma-separated list of field names to exclude from the response." - }, { "in": "path", "name": "id", "schema": { "type": "string", "format": "uuid", - "description": "A unique identifier for the value." - }, - "required": true - }, - { - "in": "query", - "name": "include", - "schema": { - "type": "string" - }, - "description": "A comma-separated list of field names to include in the response." - }, - { - "in": "query", - "name": "mask_secrets", - "schema": { - "type": "boolean", - "default": false - }, - "description": "Mask secret values in responses with `*****`." - }, - { - "in": "path", - "name": "parameter_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "description": "The parameter id.", - "required": true - }, - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" + "description": "The unique identifier of an invitation." }, - "description": "The project id.", "required": true - }, - { - "in": "query", - "name": "tag", - "schema": { - "type": "string" - }, - "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." - }, - { - "in": "query", - "name": "wrap", - "schema": { - "type": "boolean", - "default": false - }, - "description": "For writes, indicates `internal_value` is wrapped; for reads, indicates `value` is wrapped. For more information on secret wrapping, see the documentation. " } ], "tags": [ - "projects" + "invitations" ], "security": [ { @@ -7333,6 +7910,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -7340,7 +7920,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Value" + "$ref": "#/components/schemas/Invitation" } } }, @@ -7349,79 +7929,41 @@ } }, "put": { - "operationId": "projects_parameters_values_update", - "description": "Update the value of a parameter in an environment.", - "summary": "Update a value.", + "operationId": "invitations_update", "parameters": [ - { - "in": "query", - "name": "evaluate", - "schema": { - "type": "boolean", - "default": true - }, - "description": "If `true`, runs template evaluation on this parameter. If `false`, returns the value's template.\nNo effect on values that are not interpolated." - }, { "in": "path", "name": "id", "schema": { "type": "string", "format": "uuid", - "description": "A unique identifier for the value." - }, - "required": true - }, - { - "in": "path", - "name": "parameter_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "description": "The parameter id.", - "required": true - }, - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" + "description": "The unique identifier of an invitation." }, - "description": "The project id.", "required": true - }, - { - "in": "query", - "name": "wrap", - "schema": { - "type": "boolean" - }, - "description": "Indicates the `internal_value` is a wrapped secret. For more information on secret wrapping, see the documentation. " } ], "tags": [ - "projects" + "invitations" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Value" + "$ref": "#/components/schemas/Invitation" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/Value" + "$ref": "#/components/schemas/Invitation" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/Value" + "$ref": "#/components/schemas/Invitation" } } - } + }, + "required": true }, "security": [ { @@ -7429,6 +7971,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -7436,7 +7981,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Value" + "$ref": "#/components/schemas/Invitation" } } }, @@ -7445,76 +7990,37 @@ } }, "patch": { - "operationId": "projects_parameters_values_partial_update", - "description": "Update the value of a parameter in an environment.", - "summary": "Update a value.", + "operationId": "invitations_partial_update", "parameters": [ - { - "in": "query", - "name": "evaluate", - "schema": { - "type": "boolean", - "default": true - }, - "description": "If `true`, runs template evaluation on this parameter. If `false`, returns the value's template.\nNo effect on values that are not interpolated." - }, { "in": "path", "name": "id", "schema": { "type": "string", "format": "uuid", - "description": "A unique identifier for the value." - }, - "required": true - }, - { - "in": "path", - "name": "parameter_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "description": "The parameter id.", - "required": true - }, - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" + "description": "The unique identifier of an invitation." }, - "description": "The project id.", "required": true - }, - { - "in": "query", - "name": "wrap", - "schema": { - "type": "boolean" - }, - "description": "Indicates the `internal_value` is a wrapped secret. For more information on secret wrapping, see the documentation. " } ], "tags": [ - "projects" + "invitations" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PatchedValue" + "$ref": "#/components/schemas/PatchedInvitation" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/PatchedValue" + "$ref": "#/components/schemas/PatchedInvitation" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/PatchedValue" + "$ref": "#/components/schemas/PatchedInvitation" } } } @@ -7525,6 +8031,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -7532,7 +8041,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Value" + "$ref": "#/components/schemas/Invitation" } } }, @@ -7541,52 +8050,21 @@ } }, "delete": { - "operationId": "projects_parameters_values_destroy", - "description": "Destroy the value of a parameter in an environment.", - "summary": "Destroy a value.", + "operationId": "invitations_destroy", "parameters": [ - { - "in": "query", - "name": "evaluate", - "schema": { - "type": "boolean", - "default": true - }, - "description": "If `true`, runs template evaluation on this parameter. If `false`, returns the value's template.\nNo effect on values that are not interpolated." - }, { "in": "path", "name": "id", "schema": { "type": "string", "format": "uuid", - "description": "A unique identifier for the value." - }, - "required": true - }, - { - "in": "path", - "name": "parameter_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "description": "The parameter id.", - "required": true - }, - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" + "description": "The unique identifier of an invitation." }, - "description": "The project id.", "required": true } ], "tags": [ - "projects" + "invitations" ], "security": [ { @@ -7594,6 +8072,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -7603,93 +8084,162 @@ } } }, - "/api/v1/projects/{project_pk}/parameters/{id}/": { - "get": { - "operationId": "projects_parameters_retrieve", + "/api/v1/invitations/{id}/accept/": { + "post": { + "operationId": "invitations_accept_create", + "description": "Accept an invitation to join an organization.\n\nThe email address used to log in and accept the invitation must match\nthe email address specified by the inviting user when creating the invitation.\n\nOn success the client receives the invitation record as it was updated.\nThe client should then regenerate the JWT with the organization scope and\nproceed to the default landing page.", + "summary": "Accept an invitation.", "parameters": [ { - "in": "query", - "name": "as_of", + "in": "path", + "name": "id", "schema": { "type": "string", - "format": "date-time" + "format": "uuid" }, - "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." + "description": "The invitation ID.", + "required": true + } + ], + "tags": [ + "invitations" + ], + "security": [ + { + "JWTAuth": [] }, { - "in": "query", - "name": "environment", - "schema": { - "type": "string" - }, - "description": "Name or id (uuid) of the environment to get parameter values for. Cannot be used with `values`." + "ApiKeyAuth": [] }, { - "in": "query", - "name": "evaluate", - "schema": { - "type": "boolean", - "default": true + "tokenAuth": [] + }, + {} + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Invitation" + } + } }, - "description": "If `true`, runs template evaluation on this parameter's values. If `false`, returns the value's template.\nHas no effect on values that are not interpolated." + "description": "The invitation was accepted. The client should obtain an organization scope token and proceed to the landing page." + }, + "403": { + "description": "Permission denied. The accepting user's email may not match the invitation?" }, + "404": { + "description": "Bad Request. The invitation does not exist or has already been accepted?" + } + } + } + }, + "/api/v1/invitations/{id}/resend/": { + "post": { + "operationId": "invitations_resend_create", + "description": "Re-send an invitation to the recipient.", + "summary": "Resend an invitation.", + "parameters": [ { "in": "path", "name": "id", "schema": { "type": "string", - "format": "uuid", - "description": "A unique identifier for the parameter." + "format": "uuid" }, + "description": "The invitation ID.", "required": true + } + ], + "tags": [ + "invitations" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Invitation" + } + } + }, + "description": "The invitation state was reset to `pending`, which causes it to get sent again. The most recent state is returned. Clients should check the state." }, + "404": { + "description": "Bad Request. Was the invitation already accepted?" + } + } + } + }, + "/api/v1/memberships/": { + "get": { + "operationId": "memberships_list", + "parameters": [ { + "name": "ordering", + "required": false, "in": "query", - "name": "mask_secrets", + "description": "Which field to use when ordering the results.", "schema": { - "type": "boolean", - "default": false - }, - "description": "If true, replaces all secrets with `*****`." + "type": "string" + } }, { - "in": "path", - "name": "project_pk", + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", "schema": { - "type": "string", - "format": "uuid" - }, - "required": true + "type": "integer" + } }, { + "name": "page_size", + "required": false, "in": "query", - "name": "tag", + "description": "Number of results to return per page.", "schema": { - "type": "string" - }, - "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." + "type": "integer" + } }, { "in": "query", - "name": "values", + "name": "role", "schema": { - "type": "boolean", - "default": true + "type": "string", + "enum": [ + "ADMIN", + "CONTRIB", + "OWNER", + "VIEWER" + ] }, - "description": "If false, values are not returned: the `values` array will have no entries. This speeds up retrieval if value content is not needed. Cannot be used with `environment`." + "description": "The role that the user has in the organization." }, { "in": "query", - "name": "wrap", + "name": "user", "schema": { - "type": "boolean", - "default": false + "type": "string" }, - "description": "Wrap secrets." + "description": "The unique identifier of a user." } ], "tags": [ - "projects" + "memberships" ], "security": [ { @@ -7697,6 +8247,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -7704,7 +8257,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Parameter" + "$ref": "#/components/schemas/PaginatedMembershipList" } } }, @@ -7712,47 +8265,26 @@ } } }, - "put": { - "operationId": "projects_parameters_update", - "parameters": [ - { - "in": "path", - "name": "id", - "schema": { - "type": "string", - "format": "uuid", - "description": "A unique identifier for the parameter." - }, - "required": true - }, - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "required": true - } - ], + "post": { + "operationId": "memberships_create", "tags": [ - "projects" + "memberships" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Parameter" + "$ref": "#/components/schemas/MembershipCreate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/Parameter" + "$ref": "#/components/schemas/MembershipCreate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/Parameter" + "$ref": "#/components/schemas/MembershipCreate" } } }, @@ -7764,80 +8296,103 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "200": { + "201": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Parameter" + "$ref": "#/components/schemas/Membership" } } }, "description": "" - }, - "400": { - "description": "While checking pre-conditions, an external value was encountered that could not be resolved." - }, - "404": { - "description": "The given project id could not be found, or while checking pre-conditions, an external value was encountered that could not be resolved." - }, - "415": { - "description": "While checking pre-conditions, an external value was encountered that has an invalid content type." - }, - "422": { - "description": "A pre-condition to modifying the `secret` setting of the parameter failed, for example setting `secret: false` and having an external value that resolves to a value that is a secret. In this case it would be unsafe to allow the `secret` setting to change." - }, - "507": { - "description": "While checking pre-conditions, an external value was encountered that was too large to process." } } - }, - "patch": { - "operationId": "projects_parameters_partial_update", - "parameters": [ - { - "in": "path", + } + }, + "/api/v1/memberships/{id}/": { + "get": { + "operationId": "memberships_retrieve", + "parameters": [ + { + "in": "path", "name": "id", "schema": { "type": "string", "format": "uuid", - "description": "A unique identifier for the parameter." + "description": "A unique identifier for the membership." }, "required": true + } + ], + "tags": [ + "memberships" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Membership" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "memberships_update", + "parameters": [ { "in": "path", - "name": "project_pk", + "name": "id", "schema": { "type": "string", - "format": "uuid" + "format": "uuid", + "description": "A unique identifier for the membership." }, "required": true } ], "tags": [ - "projects" + "memberships" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PatchedParameter" + "$ref": "#/components/schemas/Membership" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/PatchedParameter" + "$ref": "#/components/schemas/Membership" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/PatchedParameter" + "$ref": "#/components/schemas/Membership" } } - } + }, + "required": true }, "security": [ { @@ -7845,6 +8400,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -7852,31 +8410,16 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Parameter" + "$ref": "#/components/schemas/Membership" } } }, "description": "" - }, - "400": { - "description": "While checking pre-conditions, an external value was encountered that could not be resolved." - }, - "404": { - "description": "The given project id could not be found, or while checking pre-conditions, an external value was encountered that could not be resolved." - }, - "415": { - "description": "While checking pre-conditions, an external value was encountered that has an invalid content type." - }, - "422": { - "description": "A pre-condition to modifying the `secret` setting of the parameter failed, for example setting `secret: false` and having an external value that resolves to a value that is a secret. In this case it would be unsafe to allow the `secret` setting to change." - }, - "507": { - "description": "While checking pre-conditions, an external value was encountered that was too large to process." } } }, - "delete": { - "operationId": "projects_parameters_destroy", + "patch": { + "operationId": "memberships_partial_update", "parameters": [ { "in": "path", @@ -7884,82 +8427,73 @@ "schema": { "type": "string", "format": "uuid", - "description": "A unique identifier for the parameter." - }, - "required": true - }, - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" + "description": "A unique identifier for the membership." }, "required": true } ], "tags": [ - "projects" + "memberships" ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedMembership" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/PatchedMembership" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/PatchedMembership" + } + } + } + }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "204": { - "description": "No response body" + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Membership" + } + } + }, + "description": "" } } - } - }, - "/api/v1/projects/{project_pk}/parameters/{id}/timeline/": { - "get": { - "operationId": "projects_parameters_timeline_retrieve", - "description": "Summary information about how a parameter has changed over time.\n\nThe time range of historical information available depends on your subscription.\nAny changes to the parameter itself, including rules and values, is included.", + }, + "delete": { + "operationId": "memberships_destroy", "parameters": [ - { - "in": "query", - "name": "as_of", - "schema": { - "type": "string", - "format": "date-time" - }, - "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." - }, { "in": "path", "name": "id", "schema": { "type": "string", "format": "uuid", - "description": "A unique identifier for the parameter." - }, - "required": true - }, - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" + "description": "A unique identifier for the membership." }, "required": true - }, - { - "in": "query", - "name": "tag", - "schema": { - "type": "string" - }, - "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." } ], "tags": [ - "projects" + "memberships" ], "security": [ { @@ -7967,61 +8501,22 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ParameterTimeline" - } - } - }, - "description": "" + "204": { + "description": "No response body" } } } }, - "/api/v1/projects/{project_pk}/parameters/duality/": { + "/api/v1/organizations/": { "get": { - "operationId": "projects_parameters_duality_list", - "description": "Retrieve parameters at dual timepoints for comparison.\n\nResults are aligned by parameter name. This means if a parameter is\ncreated, then deleted, then created again with the same name the two\nrecords with different parameter IDs will show up in the same result\nentry.\n\nIf t1 is not specified then it will point to a time in the past where\nnothing existed. If t2 is not specified then it is assumed to be \"now\".", + "operationId": "organizations_list", "parameters": [ - { - "in": "query", - "name": "difference", - "schema": { - "type": "boolean" - }, - "description": "Compare the values at `t1` and `t2` and if they are the same, omit the parameter from the result." - }, - { - "in": "query", - "name": "environment", - "schema": { - "type": "string" - }, - "description": "Name or id (uuid) of the environment to get parameter values for. Cannot be used with `values`." - }, - { - "in": "query", - "name": "evaluate", - "schema": { - "type": "boolean", - "default": true - }, - "description": "If `true`, runs template evaluation on this parameter's values. If `false`, returns the value's template.\nHas no effect on values that are not interpolated." - }, - { - "in": "query", - "name": "mask_secrets", - "schema": { - "type": "boolean", - "default": false - }, - "description": "If true, replaces all secrets with `*****`." - }, { "in": "query", "name": "name", @@ -8029,41 +8524,6 @@ "type": "string" } }, - { - "in": "query", - "name": "name__contains", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "name__icontains", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "name__iexact", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "name__istartswith", - "schema": { - "type": "string" - } - }, - { - "in": "query", - "name": "name__startswith", - "schema": { - "type": "string" - } - }, { "name": "ordering", "required": false, @@ -8090,93 +8550,77 @@ "schema": { "type": "integer" } + } + ], + "tags": [ + "organizations" + ], + "security": [ + { + "JWTAuth": [] }, { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "required": true - }, - { - "in": "query", - "name": "secret", - "schema": { - "type": "boolean" - } - }, - { - "in": "query", - "name": "t1_as_of", - "schema": { - "type": "string", - "format": "date-time" - }, - "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `t1_tag`." - }, - { - "in": "query", - "name": "t1_tag", - "schema": { - "type": "string" - }, - "description": "Specify a tag to retrieve configuration from. Cannot be specified with `t1_as_of`. Requires `environment`." - }, - { - "in": "query", - "name": "t2_as_of", - "schema": { - "type": "string", - "format": "date-time" - }, - "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `t2_tag`." - }, - { - "in": "query", - "name": "t2_tag", - "schema": { - "type": "string" - }, - "description": "Specify a tag to retrieve configuration from. Cannot be specified with `t2_as_of`. Requires `environment`." - }, - { - "in": "query", - "name": "values", - "schema": { - "type": "boolean", - "default": true - }, - "description": "If false, values are not returned: the `values` array will have no entries. This speeds up retrieval if value content is not needed. Cannot be used with `environment`." + "ApiKeyAuth": [] }, { - "in": "query", - "name": "wrap", - "schema": { - "type": "boolean", - "default": false - }, - "description": "Wrap secrets." + "tokenAuth": [] } ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedOrganizationList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "organizations_create", "tags": [ - "projects" + "organizations" ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OrganizationCreate" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/OrganizationCreate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/OrganizationCreate" + } + } + }, + "required": true + }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "200": { + "201": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedParameterDualityList" + "$ref": "#/components/schemas/Organization" } } }, @@ -8185,40 +8629,22 @@ } } }, - "/api/v1/projects/{project_pk}/parameters/timelines/": { + "/api/v1/organizations/{id}/": { "get": { - "operationId": "projects_parameters_timelines_retrieve", - "description": "Information about how the parameters of a project have changed over time.\n\nThe time range of historical information available depends on your subscription.\nAny changes to the project's parameters, including rules and values, is included.", + "operationId": "organizations_retrieve", "parameters": [ - { - "in": "query", - "name": "as_of", - "schema": { - "type": "string", - "format": "date-time" - }, - "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." - }, { "in": "path", - "name": "project_pk", + "name": "id", "schema": { "type": "string", - "format": "uuid" + "description": "A unique identifier for the organization." }, "required": true - }, - { - "in": "query", - "name": "tag", - "schema": { - "type": "string" - }, - "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." } ], "tags": [ - "projects" + "organizations" ], "security": [ { @@ -8226,6 +8652,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -8233,90 +8662,45 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterTimeline" + "$ref": "#/components/schemas/Organization" } } }, "description": "" } } - } - }, - "/api/v1/projects/{project_pk}/template-preview/": { - "post": { - "operationId": "projects_template_preview_create", - "description": "Endpoint for previewing a template. Post the template content in the request body.", + }, + "put": { + "operationId": "organizations_update", "parameters": [ - { - "in": "query", - "name": "as_of", - "schema": { - "type": "string", - "format": "date-time" - }, - "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." - }, - { - "in": "query", - "name": "environment", - "schema": { - "type": "string" - }, - "description": "Name or id of the environment to use to instantiate this template. If not specified then the default environment is used." - }, - { - "in": "query", - "name": "mask_secrets", - "schema": { - "type": "boolean", - "default": false - }, - "description": "Masks all secrets in the template with `*****`." - }, { "in": "path", - "name": "project_pk", + "name": "id", "schema": { "type": "string", - "format": "uuid" + "description": "A unique identifier for the organization." }, "required": true - }, - { - "in": "query", - "name": "tag", - "schema": { - "type": "string" - }, - "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." - }, - { - "in": "query", - "name": "template", - "schema": { - "type": "string" - }, - "description": "ID of the template parameter being previewed. If not specified, this is assumed to be a not-yet-created parameter." } ], "tags": [ - "projects" + "organizations" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TemplatePreview" + "$ref": "#/components/schemas/Organization" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/TemplatePreview" + "$ref": "#/components/schemas/Organization" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/TemplatePreview" + "$ref": "#/components/schemas/Organization" } } }, @@ -8328,6 +8712,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -8335,67 +8722,128 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TemplatePreview" + "$ref": "#/components/schemas/Organization" } } }, "description": "" + } + } + }, + "patch": { + "operationId": "organizations_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "description": "A unique identifier for the organization." + }, + "required": true + } + ], + "tags": [ + "organizations" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedOrganization" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/PatchedOrganization" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/PatchedOrganization" + } + } + } + }, + "security": [ + { + "JWTAuth": [] }, - "422": { + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TemplateLookupError" + "$ref": "#/components/schemas/Organization" } } }, "description": "" } } - } - }, - "/api/v1/projects/{project_pk}/templates/": { - "get": { - "operationId": "projects_templates_list", + }, + "delete": { + "operationId": "organizations_destroy", "parameters": [ { - "in": "query", - "name": "as_of", + "in": "path", + "name": "id", "schema": { "type": "string", - "format": "date-time" + "description": "A unique identifier for the organization." }, - "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." + "required": true + } + ], + "tags": [ + "organizations" + ], + "security": [ + { + "JWTAuth": [] }, { - "in": "query", - "name": "environment", - "schema": { - "type": "string" - }, - "description": "Name or id of the environment to use to evaluate this template. If not specified then the original content is returned in the body." + "ApiKeyAuth": [] }, + { + "tokenAuth": [] + } + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v1/projects/": { + "get": { + "operationId": "projects_list", + "parameters": [ { "in": "query", - "name": "evaluate", + "name": "description__icontains", "schema": { - "type": "boolean", - "default": false - }, - "description": "If `true`, evaluates the template's body. If `false`, returns the unevaluated template body.\n" + "type": "string" + } }, { "in": "query", - "name": "mask_secrets", + "name": "name", "schema": { - "type": "boolean", - "default": false - }, - "description": "Masks all secrets in the template with `*****`." + "type": "string" + } }, { "in": "query", - "name": "name", + "name": "name__icontains", "schema": { "type": "string" } @@ -8426,23 +8874,6 @@ "schema": { "type": "integer" } - }, - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "required": true - }, - { - "in": "query", - "name": "tag", - "schema": { - "type": "string" - }, - "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." } ], "tags": [ @@ -8454,6 +8885,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -8461,17 +8895,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedTemplateList" - } - } - }, - "description": "" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TemplateLookupError" + "$ref": "#/components/schemas/PaginatedProjectList" } } }, @@ -8480,18 +8904,7 @@ } }, "post": { - "operationId": "projects_templates_create", - "parameters": [ - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" - }, - "required": true - } - ], + "operationId": "projects_create", "tags": [ "projects" ], @@ -8499,17 +8912,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TemplateCreate" + "$ref": "#/components/schemas/ProjectCreate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/TemplateCreate" + "$ref": "#/components/schemas/ProjectCreate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/TemplateCreate" + "$ref": "#/components/schemas/ProjectCreate" } } }, @@ -8521,6 +8934,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -8528,17 +8944,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Template" - } - } - }, - "description": "" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TemplateLookupError" + "$ref": "#/components/schemas/Project" } } }, @@ -8547,71 +8953,19 @@ } } }, - "/api/v1/projects/{project_pk}/templates/{id}/": { + "/api/v1/projects/{id}/": { "get": { - "operationId": "projects_templates_retrieve", + "operationId": "projects_retrieve", "parameters": [ - { - "in": "query", - "name": "as_of", - "schema": { - "type": "string", - "format": "date-time" - }, - "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." - }, - { - "in": "query", - "name": "environment", - "schema": { - "type": "string" - }, - "description": "Name or id of the environment to use to evaluate this template. If not specified then the original content is returned in the body." - }, - { - "in": "query", - "name": "evaluate", - "schema": { - "type": "boolean", - "default": true - }, - "description": "If `true`, evaluates the template's body. If `false`, returns the unevaluated template body.\n" - }, { "in": "path", "name": "id", - "schema": { - "type": "string", - "format": "uuid", - "description": "A unique identifier for the parameter." - }, - "required": true - }, - { - "in": "query", - "name": "mask_secrets", - "schema": { - "type": "boolean", - "default": false - }, - "description": "Masks all secrets in the template with `*****`." - }, - { - "in": "path", - "name": "project_pk", "schema": { "type": "string", "format": "uuid" }, + "description": "A UUID string identifying this project ledger.", "required": true - }, - { - "in": "query", - "name": "tag", - "schema": { - "type": "string" - }, - "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." } ], "tags": [ @@ -8623,6 +8977,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -8630,17 +8987,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Template" - } - } - }, - "description": "" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TemplateLookupError" + "$ref": "#/components/schemas/Project" } } }, @@ -8649,7 +8996,7 @@ } }, "put": { - "operationId": "projects_templates_update", + "operationId": "projects_update", "parameters": [ { "in": "path", @@ -8657,16 +9004,7 @@ "schema": { "type": "string", "format": "uuid", - "description": "A unique identifier for the parameter." - }, - "required": true - }, - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" + "description": "A unique identifier for the project." }, "required": true } @@ -8678,17 +9016,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Template" + "$ref": "#/components/schemas/ProjectUpdate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/Template" + "$ref": "#/components/schemas/ProjectUpdate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/Template" + "$ref": "#/components/schemas/ProjectUpdate" } } }, @@ -8700,6 +9038,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -8707,17 +9048,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Template" - } - } - }, - "description": "" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TemplateLookupError" + "$ref": "#/components/schemas/ProjectUpdate" } } }, @@ -8726,7 +9057,7 @@ } }, "patch": { - "operationId": "projects_templates_partial_update", + "operationId": "projects_partial_update", "parameters": [ { "in": "path", @@ -8734,16 +9065,7 @@ "schema": { "type": "string", "format": "uuid", - "description": "A unique identifier for the parameter." - }, - "required": true - }, - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" + "description": "A unique identifier for the project." }, "required": true } @@ -8755,17 +9077,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PatchedTemplate" + "$ref": "#/components/schemas/PatchedProjectUpdate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/PatchedTemplate" + "$ref": "#/components/schemas/PatchedProjectUpdate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/PatchedTemplate" + "$ref": "#/components/schemas/PatchedProjectUpdate" } } } @@ -8776,6 +9098,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -8783,17 +9108,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Template" - } - } - }, - "description": "" - }, - "422": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TemplateLookupError" + "$ref": "#/components/schemas/ProjectUpdate" } } }, @@ -8802,7 +9117,7 @@ } }, "delete": { - "operationId": "projects_templates_destroy", + "operationId": "projects_destroy", "parameters": [ { "in": "path", @@ -8810,16 +9125,7 @@ "schema": { "type": "string", "format": "uuid", - "description": "A unique identifier for the parameter." - }, - "required": true - }, - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" + "description": "A unique identifier for the project." }, "required": true } @@ -8833,97 +9139,94 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { "204": { - "description": "Template destroyed." + "description": "Project destroyed." }, "409": { - "description": "The template is referenced by another template or value and cannot be removed." + "description": "The project has dependents and cannot be removed." + }, + "403": { + "description": "Permission denied." } } } }, - "/api/v1/projects/{project_pk}/templates/{id}/timeline/": { - "get": { - "operationId": "projects_templates_timeline_retrieve", - "description": "Information about how a template has changed over time.\n\nThe time range of historical information available depends on your subscription.\nAny changes to the template itself is included.", + "/api/v1/projects/{id}/copy/": { + "post": { + "operationId": "projects_copy_create", "parameters": [ - { - "in": "query", - "name": "as_of", - "schema": { - "type": "string", - "format": "date-time" - }, - "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." - }, - { - "in": "query", - "name": "environment", - "schema": { - "type": "string" - }, - "description": "Name or id of the environment to use to evaluate this template. If not specified then the original content is returned in the body." - }, { "in": "path", "name": "id", "schema": { "type": "string", "format": "uuid", - "description": "A unique identifier for the parameter." - }, - "required": true - }, - { - "in": "path", - "name": "project_pk", - "schema": { - "type": "string", - "format": "uuid" + "description": "A unique identifier for the project." }, "required": true - }, - { - "in": "query", - "name": "tag", - "schema": { - "type": "string" - }, - "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." } ], "tags": [ "projects" ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectCopy" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ProjectCopy" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ProjectCopy" + } + } + }, + "required": true + }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "200": { + "201": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/TemplateTimeline" + "$ref": "#/components/schemas/Project" } } }, - "description": "" + "description": "Project copied" + }, + "400": { + "description": "The Project copy failed." } } } }, - "/api/v1/projects/{project_pk}/templates/timelines/": { + "/api/v1/projects/{project_pk}/parameter-export/": { "get": { - "operationId": "projects_templates_timelines_retrieve", - "description": "Information about how the templates of a project have changed over time.\n\nThe time range of historical information available depends on your subscription.\nAny changes to the project's templates is included.", + "operationId": "projects_parameter_export_list", + "description": "Exports all parameters in this project in the requested format.\n\nParameter names and values will be coerced to the proper format (e.g. for a\ndotenv export, my_parameter will be capitalized to MY_PARAMETER and its value\nwill be in a quoted string). Note that capitalization is the only name coercion\nthat will be performed on parameter names, names that are invalid for a given\nformat will be omitted.", "parameters": [ { "in": "query", @@ -8936,59 +9239,46 @@ }, { "in": "query", - "name": "environment", + "name": "contains", "schema": { "type": "string" }, - "description": "Name or id of the environment to use to evaluate this template. If not specified then the original content is returned in the body." + "description": "Only include parameters with names that contain the provided string." }, { - "in": "path", - "name": "project_pk", + "in": "query", + "name": "endswith", "schema": { - "type": "string", - "format": "uuid" + "type": "string" }, - "required": true + "description": "Only include parameters with names that end with the provided string." }, { "in": "query", - "name": "tag", + "name": "environment", "schema": { "type": "string" }, - "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." - } - ], - "tags": [ - "projects" - ], - "security": [ + "description": "Name or id of the environment to use to retrieve parameter values." + }, { - "JWTAuth": [] + "in": "query", + "name": "explicit_export", + "schema": { + "type": "boolean", + "default": false + }, + "description": "Explicitly marks parameters with export, e.g. `export FOO=bar`." }, { - "ApiKeyAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TemplateTimeline" - } - } + "in": "query", + "name": "mask_secrets", + "schema": { + "type": "boolean", + "default": false }, - "description": "" - } - } - } - }, - "/api/v1/serviceaccounts/": { - "get": { - "operationId": "serviceaccounts_list", - "parameters": [ + "description": "Masks all secrets in the template with `*****`." + }, { "name": "ordering", "required": false, @@ -8999,26 +9289,41 @@ } }, { - "name": "page", - "required": false, "in": "query", - "description": "A page number within the paginated result set.", + "name": "output", "schema": { - "type": "integer" - } + "type": "string" + }, + "description": "Format to output: One of 'docker', 'dotenv', 'shell'." + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true }, { - "name": "page_size", - "required": false, "in": "query", - "description": "Number of results to return per page.", + "name": "startswith", "schema": { - "type": "integer" - } + "type": "string" + }, + "description": "Only include parameters with names that start with the provided string." + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "string" + }, + "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." } ], "tags": [ - "serviceaccounts" + "projects" ], "security": [ { @@ -9026,6 +9331,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -9033,55 +9341,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedServiceAccountList" + "$ref": "#/components/schemas/ParameterExport" } } }, "description": "" - } - } - }, - "post": { - "operationId": "serviceaccounts_create", - "description": "\n Creates a new ServiceAccount. A ServiceAccount is a user record intended\n for machine use (such as a build system). It does not have a username/password\n but is instead accessed using an API key.\n\n On creation, the API key will be returned. This key will only be shown once,\n is not stored on any CloudTruth system, and should be treated as a secret. Should\n the key be lost, you will need to delete and recreate the ServiceAccount in order\n to generate a new API key.\n ", - "summary": "Create a ServiceAccount user.", - "tags": [ - "serviceaccounts" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceAccountCreateRequest" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/ServiceAccountCreateRequest" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/ServiceAccountCreateRequest" - } - } - }, - "required": true - }, - "security": [ - { - "JWTAuth": [] }, - { - "ApiKeyAuth": [] - } - ], - "responses": { - "201": { + "422": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ServiceAccountCreateResponse" + "$ref": "#/components/schemas/TemplateLookupError" } } }, @@ -9090,194 +9360,79 @@ } } }, - "/api/v1/serviceaccounts/{id}/": { + "/api/v1/projects/{project_pk}/parameters/": { "get": { - "operationId": "serviceaccounts_retrieve", + "operationId": "projects_parameters_list", "parameters": [ { - "in": "path", - "name": "id", + "in": "query", + "name": "as_of", "schema": { - "type": "string" + "type": "string", + "format": "date-time" }, - "description": "A unique value identifying this service account.", - "required": true - } - ], - "tags": [ - "serviceaccounts" - ], - "security": [ + "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." + }, { - "JWTAuth": [] + "in": "query", + "name": "description__icontains", + "schema": { + "type": "string" + } }, { - "ApiKeyAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceAccount" - } - } + "in": "query", + "name": "difference", + "schema": { + "type": "string" }, - "description": "" - } - } - }, - "put": { - "operationId": "serviceaccounts_update", - "parameters": [ + "description": "Specify a list of comma-separated environment names or ids (uuid) to compare values. Only returns a parameter if there is a difference. Cannot be used with `environment` or `values`. If used with `mask_secrets` then no secret parameters will be included in the result." + }, { - "in": "path", - "name": "id", + "in": "query", + "name": "environment", "schema": { "type": "string" }, - "description": "A unique value identifying this service account.", - "required": true - } - ], - "tags": [ - "serviceaccounts" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceAccount" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/ServiceAccount" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/ServiceAccount" - } - } - } - }, - "security": [ - { - "JWTAuth": [] + "description": "Name or id (uuid) of the environment(s) to get parameter values for. Cannot be used with `values`." }, { - "ApiKeyAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceAccount" - } - } + "in": "query", + "name": "evaluate", + "schema": { + "type": "boolean", + "default": true }, - "description": "" - } - } - }, - "patch": { - "operationId": "serviceaccounts_partial_update", - "parameters": [ + "description": "If `true`, runs template evaluation on this parameter's values. If `false`, returns the value's template.\nHas no effect on values that are not interpolated." + }, { - "in": "path", - "name": "id", + "in": "query", + "name": "immediate_parameters", "schema": { - "type": "string" - }, - "description": "A unique value identifying this service account.", - "required": true - } - ], - "tags": [ - "serviceaccounts" - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PatchedServiceAccount" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/PatchedServiceAccount" - } + "type": "boolean", + "default": false }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/PatchedServiceAccount" - } - } - } - }, - "security": [ - { - "JWTAuth": [] + "description": "If true, filter by current project parameters only. Otherwise, include both of the inherited and current project parameters." }, { - "ApiKeyAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceAccount" - } - } + "in": "query", + "name": "mask_secrets", + "schema": { + "type": "boolean", + "default": false }, - "description": "" - } - } - }, - "delete": { - "operationId": "serviceaccounts_destroy", - "parameters": [ + "description": "If true, replaces all secrets with `*****`." + }, { - "in": "path", - "name": "id", + "in": "query", + "name": "name", "schema": { "type": "string" - }, - "description": "A unique value identifying this service account.", - "required": true - } - ], - "tags": [ - "serviceaccounts" - ], - "security": [ - { - "JWTAuth": [] + } }, - { - "ApiKeyAuth": [] - } - ], - "responses": { - "204": { - "description": "No response body" - } - } - } - }, - "/api/v1/types/": { - "get": { - "operationId": "types_list", - "parameters": [ { "in": "query", - "name": "description__icontains", + "name": "name__contains", "schema": { "type": "string" } @@ -9296,6 +9451,20 @@ "type": "string" } }, + { + "in": "query", + "name": "name__istartswith", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "name__startswith", + "schema": { + "type": "string" + } + }, { "name": "ordering", "required": false, @@ -9323,23 +9492,42 @@ "type": "integer" } }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, { "in": "query", - "name": "parent__name__icontains", + "name": "secret", "schema": { - "type": "string" + "type": "boolean" } }, { "in": "query", - "name": "parent__name__iexact", + "name": "tag", "schema": { "type": "string" - } + }, + "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." + }, + { + "in": "query", + "name": "values", + "schema": { + "type": "boolean", + "default": true + }, + "description": "If false, values are not returned: the `values` array will have no entries. This speeds up retrieval if value content is not needed. Cannot be used with `environment`." } ], "tags": [ - "types" + "projects" ], "security": [ { @@ -9347,6 +9535,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -9354,7 +9545,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedParameterTypeList" + "$ref": "#/components/schemas/PaginatedParameterList" } } }, @@ -9363,25 +9554,36 @@ } }, "post": { - "operationId": "types_create", + "operationId": "projects_parameters_create", + "parameters": [ + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + } + ], "tags": [ - "types" + "projects" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterTypeCreate" + "$ref": "#/components/schemas/ParameterCreate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/ParameterTypeCreate" + "$ref": "#/components/schemas/ParameterCreate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/ParameterTypeCreate" + "$ref": "#/components/schemas/ParameterCreate" } } }, @@ -9393,6 +9595,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -9400,7 +9605,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterType" + "$ref": "#/components/schemas/Parameter" } } }, @@ -9409,10 +9614,21 @@ } } }, - "/api/v1/types/{parametertype_pk}/rules/": { + "/api/v1/projects/{project_pk}/parameters/{parameter_pk}/pushes/": { "get": { - "operationId": "types_rules_list", + "operationId": "projects_parameters_pushes_list", + "description": "The push operations that this parameter was involved in.", + "summary": "List push operations.", "parameters": [ + { + "in": "query", + "name": "as_of", + "schema": { + "type": "string", + "format": "date-time" + }, + "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." + }, { "name": "ordering", "required": false, @@ -9442,12 +9658,108 @@ }, { "in": "path", - "name": "parametertype_pk", + "name": "parameter_pk", "schema": { "type": "string", "format": "uuid" }, - "description": "The parameter type id.", + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "string" + }, + "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." + } + ], + "tags": [ + "projects" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedTaskStepList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/": { + "get": { + "operationId": "projects_parameters_rules_list", + "parameters": [ + { + "name": "ordering", + "required": false, + "in": "query", + "description": "Which field to use when ordering the results.", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "in": "path", + "name": "parameter_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The parameter id.", + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The project id.", "required": true }, { @@ -9466,7 +9778,7 @@ } ], "tags": [ - "types" + "projects" ], "security": [ { @@ -9474,6 +9786,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -9481,7 +9796,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PaginatedParameterTypeRuleList" + "$ref": "#/components/schemas/PaginatedParameterRuleList" } } }, @@ -9490,37 +9805,47 @@ } }, "post": { - "operationId": "types_rules_create", + "operationId": "projects_parameters_rules_create", "parameters": [ { "in": "path", - "name": "parametertype_pk", + "name": "parameter_pk", "schema": { "type": "string", "format": "uuid" }, - "description": "The parameter type id.", + "description": "The parameter id.", + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The project id.", "required": true } ], "tags": [ - "types" + "projects" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterTypeRuleCreate" + "$ref": "#/components/schemas/ParameterRuleCreate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/ParameterTypeRuleCreate" + "$ref": "#/components/schemas/ParameterRuleCreate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/ParameterTypeRuleCreate" + "$ref": "#/components/schemas/ParameterRuleCreate" } } }, @@ -9532,6 +9857,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -9539,7 +9867,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterTypeRule" + "$ref": "#/components/schemas/ParameterRule" } } }, @@ -9548,9 +9876,9 @@ } } }, - "/api/v1/types/{parametertype_pk}/rules/{id}/": { + "/api/v1/projects/{project_pk}/parameters/{parameter_pk}/rules/{id}/": { "get": { - "operationId": "types_rules_retrieve", + "operationId": "projects_parameters_rules_retrieve", "parameters": [ { "in": "path", @@ -9559,22 +9887,32 @@ "type": "string", "format": "uuid" }, - "description": "A UUID string identifying this parameter type rule.", + "description": "A UUID string identifying this parameter rule.", "required": true }, { "in": "path", - "name": "parametertype_pk", + "name": "parameter_pk", "schema": { "type": "string", "format": "uuid" }, - "description": "The parameter type id.", + "description": "The parameter id.", + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The project id.", "required": true } ], "tags": [ - "types" + "projects" ], "security": [ { @@ -9582,6 +9920,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -9589,7 +9930,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterTypeRule" + "$ref": "#/components/schemas/ParameterRule" } } }, @@ -9598,7 +9939,7 @@ } }, "put": { - "operationId": "types_rules_update", + "operationId": "projects_parameters_rules_update", "parameters": [ { "in": "path", @@ -9607,38 +9948,48 @@ "type": "string", "format": "uuid" }, - "description": "A UUID string identifying this parameter type rule.", + "description": "A UUID string identifying this parameter rule.", "required": true }, { "in": "path", - "name": "parametertype_pk", + "name": "parameter_pk", "schema": { "type": "string", "format": "uuid" }, - "description": "The parameter type id.", + "description": "The parameter id.", + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The project id.", "required": true } ], "tags": [ - "types" + "projects" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterTypeRule" + "$ref": "#/components/schemas/ParameterRuleUpdate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/ParameterTypeRule" + "$ref": "#/components/schemas/ParameterRuleUpdate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/ParameterTypeRule" + "$ref": "#/components/schemas/ParameterRuleUpdate" } } }, @@ -9650,6 +10001,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -9657,7 +10011,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterTypeRule" + "$ref": "#/components/schemas/ParameterRuleUpdate" } } }, @@ -9666,7 +10020,7 @@ } }, "patch": { - "operationId": "types_rules_partial_update", + "operationId": "projects_parameters_rules_partial_update", "parameters": [ { "in": "path", @@ -9675,38 +10029,48 @@ "type": "string", "format": "uuid" }, - "description": "A UUID string identifying this parameter type rule.", + "description": "A UUID string identifying this parameter rule.", "required": true }, { "in": "path", - "name": "parametertype_pk", + "name": "parameter_pk", "schema": { "type": "string", "format": "uuid" }, - "description": "The parameter type id.", + "description": "The parameter id.", + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The project id.", "required": true } ], "tags": [ - "types" + "projects" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PatchedParameterTypeRule" + "$ref": "#/components/schemas/PatchedParameterRuleUpdate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/PatchedParameterTypeRule" + "$ref": "#/components/schemas/PatchedParameterRuleUpdate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/PatchedParameterTypeRule" + "$ref": "#/components/schemas/PatchedParameterRuleUpdate" } } } @@ -9717,6 +10081,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -9724,7 +10091,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterTypeRule" + "$ref": "#/components/schemas/ParameterRuleUpdate" } } }, @@ -9733,7 +10100,7 @@ } }, "delete": { - "operationId": "types_rules_destroy", + "operationId": "projects_parameters_rules_destroy", "parameters": [ { "in": "path", @@ -9742,22 +10109,32 @@ "type": "string", "format": "uuid" }, - "description": "A UUID string identifying this parameter type rule.", + "description": "A UUID string identifying this parameter rule.", "required": true }, { "in": "path", - "name": "parametertype_pk", + "name": "parameter_pk", "schema": { "type": "string", "format": "uuid" }, - "description": "The parameter type id.", + "description": "The parameter id.", + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The project id.", "required": true } ], "tags": [ - "types" + "projects" ], "security": [ { @@ -9765,6 +10142,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -9774,88 +10154,122 @@ } } }, - "/api/v1/types/{id}/": { + "/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/": { "get": { - "operationId": "types_retrieve", + "operationId": "projects_parameters_values_list", + "description": "\n Retrieve previously set values of a parameter in one or all environments.\n To see all the _effective_ values for a parameter across every environment,\n use the Parameters API (see the `values` field).\n ", + "summary": "Retrieve values.", "parameters": [ { - "in": "path", - "name": "id", + "in": "query", + "name": "as_of", "schema": { "type": "string", - "format": "uuid", - "description": "A unique identifier for the parameter type." + "format": "date-time" }, - "required": true - } - ], - "tags": [ - "types" - ], - "security": [ + "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." + }, { - "JWTAuth": [] + "in": "query", + "name": "environment", + "schema": { + "type": "string" + }, + "description": "When fetching a single value, if that value is dynamic and evaluate is true, uses this environment for template evaluation. If none is specified, uses the value's environment. Note that the value must be active in the specified environment.\nNo effect on values that are not dynamic." }, { - "ApiKeyAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ParameterType" - } - } + "in": "query", + "name": "evaluate", + "schema": { + "type": "boolean", + "default": true }, - "description": "" - } - } - }, - "put": { - "operationId": "types_update", - "parameters": [ + "description": "If `true`, runs template evaluation on this parameter. If `false`, returns the value's template.\nNo effect on values that are not interpolated." + }, + { + "in": "query", + "name": "exclude", + "schema": { + "type": "string" + }, + "description": "A comma-separated list of field names to exclude from the response." + }, + { + "in": "query", + "name": "include", + "schema": { + "type": "string" + }, + "description": "A comma-separated list of field names to include in the response." + }, + { + "in": "query", + "name": "mask_secrets", + "schema": { + "type": "boolean", + "default": false + }, + "description": "Mask secret values in responses with `*****`." + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, { "in": "path", - "name": "id", + "name": "parameter_pk", "schema": { "type": "string", - "format": "uuid", - "description": "A unique identifier for the parameter type." + "format": "uuid" + }, + "description": "The parameter id.", + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" }, + "description": "The project id.", "required": true + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "string" + }, + "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." } ], "tags": [ - "types" + "projects" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ParameterType" - } - }, - "application/x-www-form-urlencoded": { - "schema": { - "$ref": "#/components/schemas/ParameterType" - } - }, - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/ParameterType" - } - } - }, - "required": true - }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -9863,7 +10277,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterType" + "$ref": "#/components/schemas/PaginatedValueList" } } }, @@ -9871,41 +10285,71 @@ } } }, - "patch": { - "operationId": "types_partial_update", + "post": { + "operationId": "projects_parameters_values_create", + "description": "Set the value of a parameter in an environment.", + "summary": "Set a value.", "parameters": [ + { + "in": "query", + "name": "environment", + "schema": { + "type": "string" + }, + "description": "When fetching a single value, if that value is dynamic and evaluate is true, uses this environment for template evaluation. If none is specified, uses the value's environment. Note that the value must be active in the specified environment.\nNo effect on values that are not dynamic." + }, + { + "in": "query", + "name": "evaluate", + "schema": { + "type": "boolean", + "default": true + }, + "description": "If `true`, runs template evaluation on this parameter. If `false`, returns the value's template.\nNo effect on values that are not interpolated." + }, { "in": "path", - "name": "id", + "name": "parameter_pk", "schema": { "type": "string", - "format": "uuid", - "description": "A unique identifier for the parameter type." + "format": "uuid" + }, + "description": "The parameter id.", + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" }, + "description": "The project id.", "required": true } ], "tags": [ - "types" + "projects" ], "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PatchedParameterType" + "$ref": "#/components/schemas/ValueCreate" } }, "application/x-www-form-urlencoded": { "schema": { - "$ref": "#/components/schemas/PatchedParameterType" + "$ref": "#/components/schemas/ValueCreate" } }, "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/PatchedParameterType" + "$ref": "#/components/schemas/ValueCreate" } } - } + }, + "required": true }, "security": [ { @@ -9913,133 +10357,123 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "200": { + "201": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ParameterType" + "$ref": "#/components/schemas/Value" } } }, "description": "" } } - }, - "delete": { - "operationId": "types_destroy", + } + }, + "/api/v1/projects/{project_pk}/parameters/{parameter_pk}/values/{id}/": { + "get": { + "operationId": "projects_parameters_values_retrieve", + "description": "Retrieve the value of a parameter in an environment.", + "summary": "Retrieve a value.", "parameters": [ { - "in": "path", - "name": "id", + "in": "query", + "name": "as_of", "schema": { "type": "string", - "format": "uuid", - "description": "A unique identifier for the parameter type." + "format": "date-time" }, - "required": true - } - ], - "tags": [ - "types" - ], - "security": [ - { - "JWTAuth": [] + "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." }, { - "ApiKeyAuth": [] - } - ], - "responses": { - "204": { - "description": "No response body" - } - } - } - }, - "/api/v1/users/": { - "get": { - "operationId": "users_list", - "parameters": [ - { - "name": "ordering", - "required": false, "in": "query", - "description": "Which field to use when ordering the results.", + "name": "environment", "schema": { "type": "string" - } + }, + "description": "When fetching a single value, if that value is dynamic and evaluate is true, uses this environment for template evaluation. If none is specified, uses the value's environment. Note that the value must be active in the specified environment.\nNo effect on values that are not dynamic." }, { - "name": "page", - "required": false, "in": "query", - "description": "A page number within the paginated result set.", + "name": "evaluate", "schema": { - "type": "integer" - } + "type": "boolean", + "default": true + }, + "description": "If `true`, runs template evaluation on this parameter. If `false`, returns the value's template.\nNo effect on values that are not interpolated." }, { - "name": "page_size", - "required": false, "in": "query", - "description": "Number of results to return per page.", + "name": "exclude", "schema": { - "type": "integer" - } + "type": "string" + }, + "description": "A comma-separated list of field names to exclude from the response." + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "A UUID string identifying this value ledger.", + "required": true }, { "in": "query", - "name": "type", + "name": "include", "schema": { "type": "string" - } - } - ], - "tags": [ - "users" - ], - "security": [ - { - "JWTAuth": [] + }, + "description": "A comma-separated list of field names to include in the response." }, { - "ApiKeyAuth": [] - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PaginatedUserList" - } - } + "in": "query", + "name": "mask_secrets", + "schema": { + "type": "boolean", + "default": false }, - "description": "" - } - } - } - }, - "/api/v1/users/{id}/": { - "get": { - "operationId": "users_retrieve", - "parameters": [ + "description": "Mask secret values in responses with `*****`." + }, { "in": "path", - "name": "id", + "name": "parameter_pk", "schema": { "type": "string", - "description": "The unique identifier of a user." + "format": "uuid" + }, + "description": "The parameter id.", + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" }, + "description": "The project id.", "required": true + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "string" + }, + "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." } ], "tags": [ - "users" + "projects" ], "security": [ { @@ -10047,6 +10481,9 @@ }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -10054,7 +10491,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/User" + "$ref": "#/components/schemas/Value" } } }, @@ -10062,59 +10499,90 @@ } } }, - "delete": { - "operationId": "users_destroy", - "description": "### Description ###\n\nDelete the specified user. This removes all access the User may have to any Organization.\n\n### Pre-Conditions ###\n\n- The user cannot be the only owner of any Organization.\n- The bearer token must belong to the user being deleted.\n- All of the memberships related to the User will be deleted, so all the membership deletion pre-conditions must also be met.\n", - "summary": "Delete the specified user.", + "put": { + "operationId": "projects_parameters_values_update", + "description": "Update the value of a parameter in an environment.", + "summary": "Update a value.", "parameters": [ + { + "in": "query", + "name": "environment", + "schema": { + "type": "string" + }, + "description": "When fetching a single value, if that value is dynamic and evaluate is true, uses this environment for template evaluation. If none is specified, uses the value's environment. Note that the value must be active in the specified environment.\nNo effect on values that are not dynamic." + }, + { + "in": "query", + "name": "evaluate", + "schema": { + "type": "boolean", + "default": true + }, + "description": "If `true`, runs template evaluation on this parameter. If `false`, returns the value's template.\nNo effect on values that are not interpolated." + }, { "in": "path", "name": "id", "schema": { "type": "string", - "description": "The unique identifier of a user." + "format": "uuid", + "description": "A unique identifier for the value." }, "required": true - } - ], - "tags": [ - "users" - ], - "security": [ + }, { - "JWTAuth": [] + "in": "path", + "name": "parameter_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The parameter id.", + "required": true }, { - "ApiKeyAuth": [] + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The project id.", + "required": true } ], - "responses": { - "204": { - "description": "User deleted. The client should behave as if the user logged out." - }, - "400": { - "description": "Bad Request\n\n- Is the user the only owner of any organization?\n- Were all required fields provided?" - }, - "403": { - "description": "Forbidden\n\n- Did the Bearer token belong to the User being deleted?" - } - } - } - }, - "/api/v1/users/current/": { - "get": { - "operationId": "users_current_retrieve", - "description": "Get user information about the current user.", - "summary": "Current user information", "tags": [ - "users" + "projects" ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ValueUpdate" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ValueUpdate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ValueUpdate" + } + } + } + }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { @@ -10122,124 +10590,4432 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/User" + "$ref": "#/components/schemas/ValueUpdate" } } }, - "description": "User information" + "description": "" } } - } - }, - "/api/v1/utils/generate_password/": { - "post": { - "operationId": "utils_generate_password_create", - "description": "Endpoint for accessing utility functions", - "summary": "Get a randomly generated password using AWS Secrets Manager, with fallback to /dev/urandom.", + }, + "patch": { + "operationId": "projects_parameters_values_partial_update", + "description": "Update the value of a parameter in an environment.", + "summary": "Update a value.", "parameters": [ { "in": "query", - "name": "length", - "schema": { - "type": "integer" - }, - "description": "The length of the password to generate. Minimum of 8, maximum of 4095.", - "required": true - }, - { - "in": "query", - "name": "require_hardware_generation", - "schema": { - "type": "boolean", - "default": false - }, - "description": "Default behavior is to fallback to /dev/urandom if we fail to get a random password from AWS Secrets Manager. If set to 'True', we will not fallback to local password generation using /dev/urandom. Default: False" - }, - { - "in": "query", - "name": "require_lowercase", + "name": "environment", "schema": { - "type": "boolean", - "default": true + "type": "string" }, - "description": "The password must include lowercase letters [a-z]. Default: True." + "description": "When fetching a single value, if that value is dynamic and evaluate is true, uses this environment for template evaluation. If none is specified, uses the value's environment. Note that the value must be active in the specified environment.\nNo effect on values that are not dynamic." }, { "in": "query", - "name": "require_numbers", + "name": "evaluate", "schema": { "type": "boolean", "default": true }, - "description": "The password must include numbers [0-9]. Default: True." + "description": "If `true`, runs template evaluation on this parameter. If `false`, returns the value's template.\nNo effect on values that are not interpolated." }, { - "in": "query", - "name": "require_spaces", + "in": "path", + "name": "id", "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid", + "description": "A unique identifier for the value." }, - "description": "The password must include spaces [ ]. Default: False." + "required": true }, { - "in": "query", - "name": "require_symbols", + "in": "path", + "name": "parameter_pk", "schema": { - "type": "boolean", - "default": false + "type": "string", + "format": "uuid" }, - "description": "The password must include symbols [!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~]. Default: False." + "description": "The parameter id.", + "required": true }, { - "in": "query", - "name": "require_uppercase", + "in": "path", + "name": "project_pk", "schema": { - "type": "boolean", - "default": true + "type": "string", + "format": "uuid" }, - "description": "The password must include uppercase letters [A-Z]. Default: True." + "description": "The project id.", + "required": true } ], "tags": [ - "utils" + "projects" ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedValueUpdate" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/PatchedValueUpdate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/PatchedValueUpdate" + } + } + } + }, "security": [ { "JWTAuth": [] }, { "ApiKeyAuth": [] + }, + { + "tokenAuth": [] } ], "responses": { - "201": { + "200": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/GeneratedPasswordResponse" - }, - "examples": { - "GenerateAPassword": { - "value": { - "value": "S*f4wg8lR$7gfwefhuL>UIuyg4efb" - }, - "summary": "Generate a password", - "description": "Successfully generated random password." - } + "$ref": "#/components/schemas/ValueUpdate" } } }, "description": "" } } - } - } - }, - "components": { - "schemas": { - "AuditTrail": { + }, + "delete": { + "operationId": "projects_parameters_values_destroy", + "description": "Destroy the value of a parameter in an environment.", + "summary": "Destroy a value.", + "parameters": [ + { + "in": "query", + "name": "environment", + "schema": { + "type": "string" + }, + "description": "When fetching a single value, if that value is dynamic and evaluate is true, uses this environment for template evaluation. If none is specified, uses the value's environment. Note that the value must be active in the specified environment.\nNo effect on values that are not dynamic." + }, + { + "in": "query", + "name": "evaluate", + "schema": { + "type": "boolean", + "default": true + }, + "description": "If `true`, runs template evaluation on this parameter. If `false`, returns the value's template.\nNo effect on values that are not interpolated." + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique identifier for the value." + }, + "required": true + }, + { + "in": "path", + "name": "parameter_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The parameter id.", + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The project id.", + "required": true + } + ], + "tags": [ + "projects" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v1/projects/{project_pk}/parameters/{id}/": { + "get": { + "operationId": "projects_parameters_retrieve", + "parameters": [ + { + "in": "query", + "name": "as_of", + "schema": { + "type": "string", + "format": "date-time" + }, + "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." + }, + { + "in": "query", + "name": "environment", + "schema": { + "type": "string" + }, + "description": "Name or id (uuid) of the environment(s) to get parameter values for. Cannot be used with `values`." + }, + { + "in": "query", + "name": "evaluate", + "schema": { + "type": "boolean", + "default": true + }, + "description": "If `true`, runs template evaluation on this parameter's values. If `false`, returns the value's template.\nHas no effect on values that are not interpolated." + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "A UUID string identifying this parameter ledger.", + "required": true + }, + { + "in": "query", + "name": "immediate_parameters", + "schema": { + "type": "boolean", + "default": false + }, + "description": "If true, filter by current project parameters only. Otherwise, include both of the inherited and current project parameters." + }, + { + "in": "query", + "name": "mask_secrets", + "schema": { + "type": "boolean", + "default": false + }, + "description": "If true, replaces all secrets with `*****`." + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "string" + }, + "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." + }, + { + "in": "query", + "name": "values", + "schema": { + "type": "boolean", + "default": true + }, + "description": "If false, values are not returned: the `values` array will have no entries. This speeds up retrieval if value content is not needed. Cannot be used with `environment`." + } + ], + "tags": [ + "projects" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Parameter" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "projects_parameters_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique identifier for the parameter." + }, + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterUpdate" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ParameterUpdate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ParameterUpdate" + } + } + }, + "required": true + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Parameter" + } + } + }, + "description": "" + }, + "400": { + "description": "While checking pre-conditions, an external value was encountered that could not be resolved." + }, + "404": { + "description": "The given project id could not be found, or while checking pre-conditions, an external value was encountered that could not be resolved." + }, + "415": { + "description": "While checking pre-conditions, an external value was encountered that has an invalid content type." + }, + "422": { + "description": "A pre-condition to modifying the `secret` setting of the parameter failed, for example setting `secret: false` and having an external value that resolves to a value that is a secret. In this case it would be unsafe to allow the `secret` setting to change." + }, + "507": { + "description": "While checking pre-conditions, an external value was encountered that was too large to process." + } + } + }, + "patch": { + "operationId": "projects_parameters_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique identifier for the parameter." + }, + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedParameterUpdate" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/PatchedParameterUpdate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/PatchedParameterUpdate" + } + } + } + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Parameter" + } + } + }, + "description": "" + }, + "400": { + "description": "While checking pre-conditions, an external value was encountered that could not be resolved." + }, + "404": { + "description": "The given project id could not be found, or while checking pre-conditions, an external value was encountered that could not be resolved." + }, + "415": { + "description": "While checking pre-conditions, an external value was encountered that has an invalid content type." + }, + "422": { + "description": "A pre-condition to modifying the `secret` setting of the parameter failed, for example setting `secret: false` and having an external value that resolves to a value that is a secret. In this case it would be unsafe to allow the `secret` setting to change." + }, + "507": { + "description": "While checking pre-conditions, an external value was encountered that was too large to process." + } + } + }, + "delete": { + "operationId": "projects_parameters_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique identifier for the parameter." + }, + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v1/projects/{project_pk}/parameters/{id}/copy/": { + "post": { + "operationId": "projects_parameters_copy_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique identifier for the parameter." + }, + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid", + "description": "The project that the parameter is within." + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterCopy" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ParameterCopy" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ParameterCopy" + } + } + }, + "required": true + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Parameter" + } + } + }, + "description": "Parameter copied" + }, + "400": { + "description": "The parameter copy failed." + } + } + } + }, + "/api/v1/projects/{project_pk}/parameters/{id}/timeline/": { + "get": { + "operationId": "projects_parameters_timeline_retrieve", + "description": "Summary information about how a parameter has changed over time.\n\nThe time range of historical information available depends on your subscription.\nAny changes to the parameter itself, including rules and values, is included.", + "parameters": [ + { + "in": "query", + "name": "as_of", + "schema": { + "type": "string", + "format": "date-time" + }, + "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "A UUID string identifying this parameter ledger.", + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "string" + }, + "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." + } + ], + "tags": [ + "projects" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterTimeline" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/projects/{project_pk}/parameters/duality/": { + "get": { + "operationId": "projects_parameters_duality_list", + "description": "Retrieve parameters at dual timepoints for comparison.\n\nResults are aligned by parameter name. This means if a parameter is\ncreated, then deleted, then created again with the same name the two\nrecords with different parameter IDs will show up in the same result\nentry.\n\nIf t1 is not specified then it will point to a time in the past where\nnothing existed. If t2 is not specified then it is assumed to be \"now\".", + "parameters": [ + { + "in": "query", + "name": "difference", + "schema": { + "type": "boolean" + }, + "description": "Compare the values at `t1` and `t2` and if they are the same, omit the parameter from the result." + }, + { + "in": "query", + "name": "environment", + "schema": { + "type": "string" + }, + "description": "Name or id (uuid) of the environment(s) to get parameter values for. Cannot be used with `values`." + }, + { + "in": "query", + "name": "evaluate", + "schema": { + "type": "boolean", + "default": true + }, + "description": "If `true`, runs template evaluation on this parameter's values. If `false`, returns the value's template.\nHas no effect on values that are not interpolated." + }, + { + "in": "query", + "name": "immediate_parameters", + "schema": { + "type": "boolean", + "default": false + }, + "description": "If true, filter by current project parameters only. Otherwise, include both of the inherited and current project parameters." + }, + { + "in": "query", + "name": "mask_secrets", + "schema": { + "type": "boolean", + "default": false + }, + "description": "If true, replaces all secrets with `*****`." + }, + { + "in": "query", + "name": "name", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "name__contains", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "name__icontains", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "name__iexact", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "name__istartswith", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "name__startswith", + "schema": { + "type": "string" + } + }, + { + "name": "ordering", + "required": false, + "in": "query", + "description": "Which field to use when ordering the results.", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "query", + "name": "secret", + "schema": { + "type": "boolean" + } + }, + { + "in": "query", + "name": "t1_as_of", + "schema": { + "type": "string", + "format": "date-time" + }, + "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `t1_tag`." + }, + { + "in": "query", + "name": "t1_tag", + "schema": { + "type": "string" + }, + "description": "Specify a tag to retrieve configuration from. Cannot be specified with `t1_as_of`. Requires `environment`." + }, + { + "in": "query", + "name": "t2_as_of", + "schema": { + "type": "string", + "format": "date-time" + }, + "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `t2_tag`." + }, + { + "in": "query", + "name": "t2_tag", + "schema": { + "type": "string" + }, + "description": "Specify a tag to retrieve configuration from. Cannot be specified with `t2_as_of`. Requires `environment`." + }, + { + "in": "query", + "name": "values", + "schema": { + "type": "boolean", + "default": true + }, + "description": "If false, values are not returned: the `values` array will have no entries. This speeds up retrieval if value content is not needed. Cannot be used with `environment`." + } + ], + "tags": [ + "projects" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedParameterDualityList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/projects/{project_pk}/parameters/timelines/": { + "get": { + "operationId": "projects_parameters_timelines_retrieve", + "description": "Information about how the parameters of a project have changed over time.\n\nThe time range of historical information available depends on your subscription.\nAny changes to the project's parameters, including rules and values, is included.", + "parameters": [ + { + "in": "query", + "name": "as_of", + "schema": { + "type": "string", + "format": "date-time" + }, + "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "string" + }, + "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." + } + ], + "tags": [ + "projects" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterTimeline" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/projects/{project_pk}/template-preview/": { + "post": { + "operationId": "projects_template_preview_create", + "description": "Endpoint for previewing a template. Post the template content in the request body.", + "parameters": [ + { + "in": "query", + "name": "as_of", + "schema": { + "type": "string", + "format": "date-time" + }, + "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." + }, + { + "in": "query", + "name": "environment", + "schema": { + "type": "string" + }, + "description": "Name or id of the environment to use to instantiate this template. If not specified then the default environment is used." + }, + { + "in": "query", + "name": "mask_secrets", + "schema": { + "type": "boolean", + "default": false + }, + "description": "Masks all secrets in the template with `*****`." + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "string" + }, + "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." + }, + { + "in": "query", + "name": "template", + "schema": { + "type": "string" + }, + "description": "ID of the template parameter being previewed. If not specified, this is assumed to be a not-yet-created parameter." + } + ], + "tags": [ + "projects" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TemplatePreviewCreateRequest" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/TemplatePreviewCreateRequest" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/TemplatePreviewCreateRequest" + } + } + }, + "required": true + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TemplatePreview" + } + } + }, + "description": "" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TemplateLookupError" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/projects/{project_pk}/templates/": { + "get": { + "operationId": "projects_templates_list", + "parameters": [ + { + "in": "query", + "name": "as_of", + "schema": { + "type": "string", + "format": "date-time" + }, + "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." + }, + { + "in": "query", + "name": "environment", + "schema": { + "type": "string" + }, + "description": "Name or id of the environment to use to evaluate this template. If not specified then the original content is returned in the body." + }, + { + "in": "query", + "name": "evaluate", + "schema": { + "type": "boolean", + "default": false + }, + "description": "If `true`, evaluates the template's body. If `false`, returns the unevaluated template body.\n" + }, + { + "in": "query", + "name": "mask_secrets", + "schema": { + "type": "boolean", + "default": false + }, + "description": "Masks all secrets in the template with `*****`." + }, + { + "in": "query", + "name": "name", + "schema": { + "type": "string" + } + }, + { + "name": "ordering", + "required": false, + "in": "query", + "description": "Which field to use when ordering the results.", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "string" + }, + "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." + } + ], + "tags": [ + "projects" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedTemplateList" + } + } + }, + "description": "" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TemplateLookupError" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "projects_templates_create", + "parameters": [ + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TemplateCreate" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/TemplateCreate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/TemplateCreate" + } + } + }, + "required": true + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Template" + } + } + }, + "description": "" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TemplateLookupError" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/projects/{project_pk}/templates/{id}/": { + "get": { + "operationId": "projects_templates_retrieve", + "parameters": [ + { + "in": "query", + "name": "as_of", + "schema": { + "type": "string", + "format": "date-time" + }, + "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." + }, + { + "in": "query", + "name": "environment", + "schema": { + "type": "string" + }, + "description": "Name or id of the environment to use to evaluate this template. If not specified then the original content is returned in the body." + }, + { + "in": "query", + "name": "evaluate", + "schema": { + "type": "boolean", + "default": true + }, + "description": "If `true`, evaluates the template's body. If `false`, returns the unevaluated template body.\n" + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "A UUID string identifying this parameter ledger.", + "required": true + }, + { + "in": "query", + "name": "mask_secrets", + "schema": { + "type": "boolean", + "default": false + }, + "description": "Masks all secrets in the template with `*****`." + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "string" + }, + "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." + } + ], + "tags": [ + "projects" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Template" + } + } + }, + "description": "" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TemplateLookupError" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "projects_templates_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique identifier for the parameter." + }, + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TemplateUpdate" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/TemplateUpdate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/TemplateUpdate" + } + } + }, + "required": true + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Template" + } + } + }, + "description": "" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TemplateLookupError" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "projects_templates_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique identifier for the parameter." + }, + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedTemplateUpdate" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/PatchedTemplateUpdate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/PatchedTemplateUpdate" + } + } + } + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Template" + } + } + }, + "description": "" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TemplateLookupError" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "projects_templates_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique identifier for the parameter." + }, + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + } + ], + "tags": [ + "projects" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "204": { + "description": "Template destroyed." + }, + "409": { + "description": "The template is referenced by another template or value and cannot be removed." + } + } + } + }, + "/api/v1/projects/{project_pk}/templates/{id}/timeline/": { + "get": { + "operationId": "projects_templates_timeline_retrieve", + "description": "Information about how a template has changed over time.\n\nThe time range of historical information available depends on your subscription.\nAny changes to the template itself is included.", + "parameters": [ + { + "in": "query", + "name": "as_of", + "schema": { + "type": "string", + "format": "date-time" + }, + "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." + }, + { + "in": "query", + "name": "environment", + "schema": { + "type": "string" + }, + "description": "Name or id of the environment to use to evaluate this template. If not specified then the original content is returned in the body." + }, + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "A UUID string identifying this parameter ledger.", + "required": true + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "string" + }, + "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." + } + ], + "tags": [ + "projects" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TemplateTimeline" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/projects/{project_pk}/templates/timelines/": { + "get": { + "operationId": "projects_templates_timelines_retrieve", + "description": "Information about how the templates of a project have changed over time.\n\nThe time range of historical information available depends on your subscription.\nAny changes to the project's templates is included.", + "parameters": [ + { + "in": "query", + "name": "as_of", + "schema": { + "type": "string", + "format": "date-time" + }, + "description": "Specify a point in time to retrieve configuration from. Cannot be specified with `tag`." + }, + { + "in": "query", + "name": "environment", + "schema": { + "type": "string" + }, + "description": "Name or id of the environment to use to evaluate this template. If not specified then the original content is returned in the body." + }, + { + "in": "path", + "name": "project_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + { + "in": "query", + "name": "tag", + "schema": { + "type": "string" + }, + "description": "Specify a tag to retrieve configuration from. Cannot be specified with `as_of`. Requires `environment`." + } + ], + "tags": [ + "projects" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TemplateTimeline" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/serviceaccounts/": { + "get": { + "operationId": "serviceaccounts_list", + "parameters": [ + { + "name": "ordering", + "required": false, + "in": "query", + "description": "Which field to use when ordering the results.", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + } + ], + "tags": [ + "serviceaccounts" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedServiceAccountList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "serviceaccounts_create", + "description": "\n Creates a new ServiceAccount. A ServiceAccount is a user record intended\n for machine use (such as a build system). It does not have a username/password\n but is instead accessed using an API key.\n\n On creation, the API key will be returned. This key will only be shown once,\n is not stored on any CloudTruth system, and should be treated as a secret. Should\n the key be lost, you will need to delete and recreate the ServiceAccount in order\n to generate a new API key.\n ", + "summary": "Create a ServiceAccount user.", + "tags": [ + "serviceaccounts" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountCreateRequest" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountCreateRequest" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountCreateRequest" + } + } + }, + "required": true + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountCreateResponse" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/serviceaccounts/{id}/": { + "get": { + "operationId": "serviceaccounts_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string" + }, + "description": "A unique value identifying this service account.", + "required": true + } + ], + "tags": [ + "serviceaccounts" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccount" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "serviceaccounts_update", + "description": "\n Updates a ServiceAccount. A ServiceAccount is a user record intended\n for machine use (such as a build system). It does not have a username/password\n but is instead accessed using an API key.\n ", + "summary": "Update a ServiceAccount user.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string" + }, + "description": "A unique value identifying this service account.", + "required": true + } + ], + "tags": [ + "serviceaccounts" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountUpdateRequest" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountUpdateRequest" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountUpdateRequest" + } + } + } + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountUpdateRequest" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "serviceaccounts_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string" + }, + "description": "A unique value identifying this service account.", + "required": true + } + ], + "tags": [ + "serviceaccounts" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedServiceAccount" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/PatchedServiceAccount" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/PatchedServiceAccount" + } + } + } + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccount" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "serviceaccounts_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string" + }, + "description": "A unique value identifying this service account.", + "required": true + } + ], + "tags": [ + "serviceaccounts" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v1/serviceaccounts/{id}/rekey/": { + "post": { + "operationId": "serviceaccounts_rekey_create", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string" + }, + "description": "A unique value identifying this service account.", + "required": true + } + ], + "tags": [ + "serviceaccounts" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountRekeyRequest" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountRekeyRequest" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountRekeyRequest" + } + } + } + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ServiceAccountRekeyRequest" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/types/": { + "get": { + "operationId": "types_list", + "parameters": [ + { + "in": "query", + "name": "description__icontains", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "name__icontains", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "name__iexact", + "schema": { + "type": "string" + } + }, + { + "name": "ordering", + "required": false, + "in": "query", + "description": "Which field to use when ordering the results.", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + } + ], + "tags": [ + "types" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedParameterTypeList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "types_create", + "tags": [ + "types" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeCreate" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeCreate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeCreate" + } + } + }, + "required": true + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterType" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/types/{parametertype_pk}/rules/": { + "get": { + "operationId": "types_rules_list", + "parameters": [ + { + "name": "ordering", + "required": false, + "in": "query", + "description": "Which field to use when ordering the results.", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "in": "path", + "name": "parametertype_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The parameter type id.", + "required": true + }, + { + "in": "query", + "name": "type", + "schema": { + "type": "string", + "enum": [ + "max", + "max_len", + "min", + "min_len", + "regex" + ] + } + } + ], + "tags": [ + "types" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedParameterTypeRuleList" + } + } + }, + "description": "" + } + } + }, + "post": { + "operationId": "types_rules_create", + "parameters": [ + { + "in": "path", + "name": "parametertype_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The parameter type id.", + "required": true + } + ], + "tags": [ + "types" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeRuleCreate" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeRuleCreate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeRuleCreate" + } + } + }, + "required": true + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeRule" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/types/{parametertype_pk}/rules/{id}/": { + "get": { + "operationId": "types_rules_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "A UUID string identifying this parameter type rule.", + "required": true + }, + { + "in": "path", + "name": "parametertype_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The parameter type id.", + "required": true + } + ], + "tags": [ + "types" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeRule" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "types_rules_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "A UUID string identifying this parameter type rule.", + "required": true + }, + { + "in": "path", + "name": "parametertype_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The parameter type id.", + "required": true + } + ], + "tags": [ + "types" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeRuleUpdate" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeRuleUpdate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeRuleUpdate" + } + } + }, + "required": true + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeRuleUpdate" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "types_rules_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "A UUID string identifying this parameter type rule.", + "required": true + }, + { + "in": "path", + "name": "parametertype_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The parameter type id.", + "required": true + } + ], + "tags": [ + "types" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedParameterTypeRuleUpdate" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/PatchedParameterTypeRuleUpdate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/PatchedParameterTypeRuleUpdate" + } + } + } + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeRuleUpdate" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "types_rules_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "A UUID string identifying this parameter type rule.", + "required": true + }, + { + "in": "path", + "name": "parametertype_pk", + "schema": { + "type": "string", + "format": "uuid" + }, + "description": "The parameter type id.", + "required": true + } + ], + "tags": [ + "types" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v1/types/{id}/": { + "get": { + "operationId": "types_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique identifier for the parameter type." + }, + "required": true + } + ], + "tags": [ + "types" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterType" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "types_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique identifier for the parameter type." + }, + "required": true + } + ], + "tags": [ + "types" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeUpdate" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeUpdate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeUpdate" + } + } + }, + "required": true + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeUpdate" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "types_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique identifier for the parameter type." + }, + "required": true + } + ], + "tags": [ + "types" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedParameterTypeUpdate" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/PatchedParameterTypeUpdate" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/PatchedParameterTypeUpdate" + } + } + } + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParameterTypeUpdate" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "types_destroy", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "format": "uuid", + "description": "A unique identifier for the parameter type." + }, + "required": true + } + ], + "tags": [ + "types" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "204": { + "description": "No response body" + } + } + } + }, + "/api/v1/users/": { + "get": { + "operationId": "users_list", + "parameters": [ + { + "name": "ordering", + "required": false, + "in": "query", + "description": "Which field to use when ordering the results.", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "required": false, + "in": "query", + "description": "A page number within the paginated result set.", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "required": false, + "in": "query", + "description": "Number of results to return per page.", + "schema": { + "type": "integer" + } + }, + { + "in": "query", + "name": "type", + "schema": { + "type": "string" + } + } + ], + "tags": [ + "users" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaginatedUserList" + } + } + }, + "description": "" + } + } + } + }, + "/api/v1/users/{id}/": { + "get": { + "operationId": "users_retrieve", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "description": "The unique identifier of a user." + }, + "required": true + } + ], + "tags": [ + "users" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + }, + "description": "" + } + } + }, + "put": { + "operationId": "users_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "description": "The unique identifier of a user." + }, + "required": true + } + ], + "tags": [ + "users" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateUser" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/UpdateUser" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/UpdateUser" + } + } + }, + "required": true + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateUser" + } + } + }, + "description": "" + } + } + }, + "patch": { + "operationId": "users_partial_update", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "description": "The unique identifier of a user." + }, + "required": true + } + ], + "tags": [ + "users" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchedUpdateUser" + } + }, + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/PatchedUpdateUser" + } + }, + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/PatchedUpdateUser" + } + } + } + }, + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateUser" + } + } + }, + "description": "" + } + } + }, + "delete": { + "operationId": "users_destroy", + "description": "### Description ###\n\nDelete the specified user. This removes all access the User may have to any Organization.\n\n### Pre-Conditions ###\n\n- The user cannot be the only owner of any Organization.\n- The bearer token must belong to the user being deleted.\n- All of the memberships related to the User will be deleted, so all the membership deletion pre-conditions must also be met.\n", + "summary": "Delete the specified user.", + "parameters": [ + { + "in": "path", + "name": "id", + "schema": { + "type": "string", + "description": "The unique identifier of a user." + }, + "required": true + } + ], + "tags": [ + "users" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "204": { + "description": "User deleted. The client should behave as if the user logged out." + }, + "400": { + "description": "Bad Request\n\n- Is the user the only owner of any organization?\n- Were all required fields provided?" + }, + "403": { + "description": "Forbidden\n\n- Did the Bearer token belong to the User being deleted?" + } + } + } + }, + "/api/v1/users/current/": { + "get": { + "operationId": "users_current_retrieve", + "description": "Get user information about the current user.", + "summary": "Current user information", + "tags": [ + "users" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + }, + "description": "User information" + } + } + } + }, + "/api/v1/utils/generate_password/": { + "post": { + "operationId": "utils_generate_password_create", + "description": "Endpoint for accessing utility functions", + "summary": "Get a randomly generated password using AWS Secrets Manager, with fallback to /dev/urandom.", + "parameters": [ + { + "in": "query", + "name": "length", + "schema": { + "type": "integer" + }, + "description": "The length of the password to generate. Minimum of 8, maximum of 4095.", + "required": true + }, + { + "in": "query", + "name": "require_hardware_generation", + "schema": { + "type": "boolean", + "default": false + }, + "description": "Default behavior is to fallback to /dev/urandom if we fail to get a random password from AWS Secrets Manager. If set to 'True', we will not fallback to local password generation using /dev/urandom. Default: False" + }, + { + "in": "query", + "name": "require_lowercase", + "schema": { + "type": "boolean", + "default": true + }, + "description": "The password must include lowercase letters [a-z]. Default: True." + }, + { + "in": "query", + "name": "require_numbers", + "schema": { + "type": "boolean", + "default": true + }, + "description": "The password must include numbers [0-9]. Default: True." + }, + { + "in": "query", + "name": "require_spaces", + "schema": { + "type": "boolean", + "default": false + }, + "description": "The password must include spaces [ ]. Default: False." + }, + { + "in": "query", + "name": "require_symbols", + "schema": { + "type": "boolean", + "default": false + }, + "description": "The password must include symbols [!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~]. Default: False." + }, + { + "in": "query", + "name": "require_uppercase", + "schema": { + "type": "boolean", + "default": true + }, + "description": "The password must include uppercase letters [A-Z]. Default: True." + } + ], + "tags": [ + "utils" + ], + "security": [ + { + "JWTAuth": [] + }, + { + "ApiKeyAuth": [] + }, + { + "tokenAuth": [] + } + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GeneratedPasswordResponse" + }, + "examples": { + "GenerateAPassword": { + "value": { + "value": "S*f4wg8lR$7gfwefhuL>UIuyg4efb" + }, + "summary": "Generate a password", + "description": "Successfully generated random password." + } + } + } + }, + "description": "" + } + } + } + } + }, + "components": { + "schemas": { + "AuditTrail": { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "A unique identifier for the audit record." + }, + "action": { + "type": "string", + "readOnly": true, + "description": "The action that was taken." + }, + "object_id": { + "type": "string", + "readOnly": true, + "description": "The id of the object associated with the action." + }, + "object_name": { + "type": "string", + "readOnly": true, + "description": "The name of the object associated with the action, if applicable." + }, + "object_type": { + "allOf": [ + { + "$ref": "#/components/schemas/ObjectTypeEnum" + } + ], + "readOnly": true, + "description": "The type of object associated with the action." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "readOnly": true, + "description": "The timestamp of the activity that was audited." + }, + "user": { + "allOf": [ + { + "$ref": "#/components/schemas/User" + } + ], + "readOnly": true, + "description": "Details of the user associated with this change." + } + }, + "required": [ + "action", + "id", + "object_id", + "object_name", + "object_type", + "timestamp", + "url", + "user" + ] + }, + "AuditTrailSummary": { + "type": "object", + "properties": { + "earliest": { + "type": "string", + "format": "date-time", + "nullable": true, + "readOnly": true, + "description": "The earliest audit record timestamp available." + }, + "max_days": { + "type": "integer", + "readOnly": true, + "description": "The maximum number of days the system will save auditing records, based on your subscription." + }, + "max_records": { + "type": "integer", + "readOnly": true, + "description": "The maximum number of auditing records the system will save based on your subscription." + }, + "total": { + "type": "integer", + "readOnly": true, + "description": "The total number of audit records available." + } + }, + "required": [ + "earliest", + "max_days", + "max_records", + "total" + ] + }, + "AwsIntegration": { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "The unique identifier for the integration." + }, + "name": { + "type": "string", + "readOnly": true + }, + "description": { + "type": "string", + "description": "An optional description for the integration." + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/StatusEnum" + } + ], + "readOnly": true, + "description": "The status of the integration connection with the third-party provider as of the `status_last_checked_at` field. The status is updated automatically by the server when the integration is modified." + }, + "status_detail": { + "type": "string", + "readOnly": true, + "description": "If an error occurs, more details will be available in this field." + }, + "status_last_checked_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The last time the status was evaluated." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "fqn": { + "type": "string", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of integration." + }, + "writable": { + "type": "boolean", + "description": "Allow actions to write to the integration." + }, + "aws_account_id": { + "type": "string", + "description": "The AWS Account ID.", + "pattern": "^[0-9]+$", + "maxLength": 12, + "minLength": 12 + }, + "aws_enabled_regions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AwsRegionEnum" + }, + "description": "The AWS regions to integrate with." + }, + "aws_enabled_services": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AwsServiceEnum" + }, + "description": "The AWS services to integrate with." + }, + "aws_external_id": { + "type": "string", + "readOnly": true, + "description": "This is a shared secret between the AWS Administrator who set up your IAM trust relationship and your CloudTruth AWS Integration. CloudTruth will generate a random value for you to give to your AWS Administrator in order to create the necessary IAM role for proper access." + }, + "aws_kms_key_id": { + "type": "string", + "nullable": true, + "description": "If present, this is the KMS Key Id that is used to push values. This key must be accessible in the AWS account (it cannot be an ARN to a key in another AWS account). ", + "pattern": "^[a-zA-Z0-9:/_\\-]+$", + "maxLength": 256 + }, + "aws_role_name": { + "type": "string", + "description": "The role that CloudTruth will assume when interacting with your AWS Account through this integration. The role is configured by your AWS Account Administrator. If your AWS Administrator provided you with a value use it, otherwise make your own role name and give it to your AWS Administrator.", + "pattern": "^[\\w+=,.@\\-]+$", + "maxLength": 64, + "minLength": 2 + }, + "resource_tags": { + "type": "object", + "additionalProperties": {}, + "description": "A list of tags to be set on all integration resources." + } + }, + "required": [ + "aws_account_id", + "aws_enabled_regions", + "aws_enabled_services", + "aws_external_id", + "aws_role_name", + "created_at", + "fqn", + "id", + "modified_at", + "name", + "status", + "status_detail", + "status_last_checked_at", + "type", + "url" + ] + }, + "AwsIntegrationCreate": { + "type": "object", + "properties": { + "description": { + "type": "string", + "description": "An optional description for the integration." + }, + "writable": { + "type": "boolean", + "description": "Allow actions to write to the integration." + }, + "aws_account_id": { + "type": "string", + "description": "The AWS Account ID.", + "pattern": "^[0-9]+$", + "maxLength": 12, + "minLength": 12 + }, + "aws_enabled_regions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AwsRegionEnum" + }, + "description": "The AWS regions to integrate with." + }, + "aws_enabled_services": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AwsServiceEnum" + }, + "description": "The AWS services to integrate with." + }, + "aws_external_id": { + "type": "string", + "description": "This is a shared secret between the AWS Administrator who set up your IAM trust relationship and your CloudTruth AWS Integration. CloudTruth will generate a random value for you to give to your AWS Administrator in order to create the necessary IAM role for proper access.", + "minLength": 2, + "pattern": "^[\\w+=,.@:/\\-]*$", + "maxLength": 1224 + }, + "aws_kms_key_id": { + "type": "string", + "nullable": true, + "description": "If present, this is the KMS Key Id that is used to push values. This key must be accessible in the AWS account (it cannot be an ARN to a key in another AWS account). ", + "pattern": "^[a-zA-Z0-9:/_\\-]+$", + "maxLength": 256 + }, + "aws_role_name": { + "type": "string", + "description": "The role that CloudTruth will assume when interacting with your AWS Account through this integration. The role is configured by your AWS Account Administrator. If your AWS Administrator provided you with a value use it, otherwise make your own role name and give it to your AWS Administrator.", + "pattern": "^[\\w+=,.@\\-]+$", + "maxLength": 64, + "minLength": 2 + }, + "resource_tags": { + "type": "object", + "additionalProperties": {}, + "description": "A list of tags to be set on all integration resources." + } + }, + "required": [ + "aws_account_id", + "aws_enabled_regions", + "aws_enabled_services", + "aws_role_name" + ] + }, + "AwsIntegrationScan": { + "type": "object", + "properties": { + "region": { + "allOf": [ + { + "$ref": "#/components/schemas/AwsRegionEnum" + } + ], + "description": "The AWS region to use. This region must be enabled in the integration." + }, + "service": { + "allOf": [ + { + "$ref": "#/components/schemas/AwsServiceEnum" + } + ], + "description": "The AWS service to use. This service must be enabled in the integration." + }, + "resource": { + "type": "string", + "nullable": true, + "description": "Defines a pattern matching string that contains either mustache or regular expression syntax (with named capture groups) that locate the environment, project, and parameter name of the content you are looking for.\n\nIf you are using mustache pattern matching, use:\n\n - ``{{ environment }}`` to identify the environment name\n - ``{{ parameter }}`` to identify the parameter name\n - ``{{ project }}`` to identify the project name\n\nIf you are using a regular expression, use Python syntax with named capture groups that locate the `environment`, `project`, and `parameter`.", + "maxLength": 1024 + } + }, + "required": [ + "region", + "resource", + "service" + ] + }, + "AwsPull": { + "type": "object", + "description": "Pull actions can be configured to get configuration and secrets from\nintegrations on demand.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier for the action." + }, + "name": { + "type": "string", + "description": "The action name.", + "maxLength": 256 + }, + "description": { + "type": "string", + "description": "The optional description for the action." + }, + "latest_task": { + "allOf": [ + { + "$ref": "#/components/schemas/AwsPullTask" + } + ], + "readOnly": true, + "nullable": true, + "description": "The most recent task run for this action." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "create_environments": { + "type": "boolean", + "description": "Allow the pull to create environments. Any automatically created environments will be children of the `default` environment. If an environment needs to be created but the action does not allow it, a task step will be added with a null operation, and success_detail will indicate the action did not allow it." + }, + "create_projects": { + "type": "boolean", + "description": "Allow the pull to create projects. If a project needs to be created but the action does not allow it, a task step will be added with a null operation, and success_detail will indicate the action did not allow it." + }, + "dry_run": { + "type": "boolean", + "description": "When set to dry-run mode an action will report the changes that it would have made in task steps, however those changes are not actually performed." + }, + "mapped_values": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ValueCreate" + }, + "readOnly": true, + "description": "Values being managed by a mapped pull." + }, + "mode": { + "allOf": [ + { + "$ref": "#/components/schemas/ModeEnum" + } + ], + "readOnly": true, + "description": "The pull mode used.\n\nA pattern pull uses a pattern-matching resource string with mustache-style markers to identify the project, parameter, and environment names, or with a Python regular expression that uses named capture groups that define the same three concepts.\n\nA mapped pull uses a specific resource and JMESpath expression to deliver a value to a specific project, parameter, and environment. This leverages external value linkages made in the value editor, and there is one mapped pull per integration provided by the system so that you can trigger external value pull synchronizations." + }, + "region": { + "allOf": [ + { + "$ref": "#/components/schemas/AwsRegionEnum" + } + ], + "description": "The AWS region to use. This region must be enabled in the integration." + }, + "service": { + "allOf": [ + { + "$ref": "#/components/schemas/AwsServiceEnum" + } + ], + "description": "The AWS service to use. This service must be enabled in the integration." + }, + "resource": { + "type": "string", + "nullable": true, + "description": "Defines a pattern matching string that contains either mustache or regular expression syntax (with named capture groups) that locate the environment, project, and parameter name of the content you are looking for.\n\nIf you are using mustache pattern matching, use:\n\n - ``{{ environment }}`` to identify the environment name\n - ``{{ parameter }}`` to identify the parameter name\n - ``{{ project }}`` to identify the project name\n\nIf you are using a regular expression, use Python syntax with named capture groups that locate the `environment`, `project`, and `parameter`.", + "maxLength": 1024 + } + }, + "required": [ + "created_at", + "id", + "latest_task", + "mapped_values", + "mode", + "modified_at", + "name", + "region", + "resource", + "service", + "url" + ] + }, + "AwsPullSyncActionRequest": { + "type": "object", + "properties": { + "dry_run": { + "type": "boolean", + "writeOnly": true, + "description": "Allows you to set the dry_run flag on the pull action before triggering a sync." + } + } + }, + "AwsPullTask": { + "type": "object", + "description": "Pull task for an AWS integration.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "The unique identifier for the task." + }, + "reason": { + "type": "string", + "nullable": true, + "description": "The reason why this task was triggered.", + "maxLength": 256 + }, + "dry_run": { + "type": "boolean", + "description": "Indicates task steps were only simulated, not actually performed." + }, + "state": { + "allOf": [ + { + "$ref": "#/components/schemas/StateEnum" + } + ], + "description": "The current state of this task." + }, + "error_code": { + "type": "string", + "nullable": true, + "description": "If an error occurs early during processing, before attempting to process values, this code may be helpful in determining the problem.", + "maxLength": 256 + }, + "error_detail": { + "type": "string", + "nullable": true, + "description": "If an error occurs early during processing, before attempting to process values, this detail may be helpful in determining the problem." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + } + }, + "required": [ + "created_at", + "id", + "modified_at", + "url" + ] + }, + "AwsPullTaskStep": { + "type": "object", + "description": "Pull task step for an AWS integration.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier for a task step." + }, + "operation": { + "allOf": [ + { + "$ref": "#/components/schemas/OperationEnum" + } + ], + "nullable": true, + "description": "The operation performed, if any.\n\nWhen the operation is an update, there may be additional details in the success_detail field to describe the change.\n\nWhen the project is filled in but the environment and parameterare not, the operation is on the project. When the environmentis filled in but the project and parameter are not, the operationis on the environment. When the project and parameter are filledin but the environment is not, the operation is on the parameter.When all three are filled in, the operation is on the value ofthe parameter of the project in the specified environment." + }, + "success": { + "type": "boolean", + "description": "Indicates if the operation was successful." + }, + "success_detail": { + "type": "string", + "nullable": true, + "description": "Additional details about the successful operation, if any." + }, + "fqn": { + "type": "string", + "nullable": true, + "description": "The fully-qualified name (FQN) this of the value that was changed.", + "maxLength": 1024 + }, + "environment": { + "type": "string", + "format": "uri", + "readOnly": true, + "nullable": true, + "description": "The environment affected by this step." + }, + "environment_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "The environment id involved in the operation." + }, + "environment_name": { + "type": "string", + "nullable": true, + "description": "The environment name involved in the operation.", + "maxLength": 256 + }, + "project": { + "type": "string", + "format": "uri", + "readOnly": true, + "nullable": true, + "description": "The project affected by this step." + }, + "project_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "The project id involved in the operation." + }, + "project_name": { + "type": "string", + "nullable": true, + "description": "The project name involved in the operation.", + "maxLength": 256 + }, + "parameter": { + "type": "string", + "format": "uri", + "readOnly": true, + "nullable": true, + "description": "The parameter affected by this step." + }, + "parameter_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "The parameter id involved in the operation." + }, + "parameter_name": { + "type": "string", + "nullable": true, + "description": "The parameter name involved in the operation.", + "maxLength": 256 + }, + "venue_id": { + "type": "string", + "nullable": true, + "description": "The integration-native id for the resource.", + "maxLength": 2048 + }, + "venue_name": { + "type": "string", + "nullable": true, + "description": "The name of the item or resource as known by the integration.", + "maxLength": 1024 + }, + "summary": { + "type": "string", + "nullable": true, + "description": "The summary of this step (what it was trying to do)." + }, + "error_code": { + "type": "string", + "nullable": true, + "description": "An error code, if not successful.", + "maxLength": 256 + }, + "error_detail": { + "type": "string", + "nullable": true, + "description": "Details on the error that occurred during processing." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + } + }, + "required": [ + "created_at", + "environment", + "id", + "modified_at", + "parameter", + "project", + "success", + "url" + ] + }, + "AwsPush": { + "type": "object", + "description": "Push actions can be configured to send configuration and secrets to\nintegrations when tags are updated.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier for the action." + }, + "name": { + "type": "string", + "description": "The action name.", + "maxLength": 256 + }, + "description": { + "type": "string", + "description": "The optional description for the action." + }, + "latest_task": { + "allOf": [ + { + "$ref": "#/components/schemas/AwsPushTask" + } + ], + "readOnly": true, + "nullable": true, + "description": "The most recent task run for this action." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "coerce_parameters": { + "type": "boolean", + "description": "This setting allows parameters (non-secrets) to be pushed to a destination that only supports storing secrets. This may increase your overall cost from the cloud provider as some cloud providers charge a premium for secrets-only storage." + }, + "include_parameters": { + "type": "boolean", + "description": "Include parameters (non-secrets) in the values being pushed. This setting requires the destination to support parameters or for the `coerce_parameters` flag to be enabled, otherwise the push will fail." + }, + "include_secrets": { + "type": "boolean", + "description": "Include secrets in the values being pushed. This setting requires the destination to support secrets, otherwise the push will fail." + }, + "include_templates": { + "type": "boolean", + "description": "Include templates in the values being pushed." + }, + "dry_run": { + "type": "boolean", + "description": "When set to dry-run mode an action will report the changes that it would have made in task steps, however those changes are not actually performed." + }, + "force": { + "type": "boolean", + "description": "Normally, push will check to see if it originated the values in the destination before making changes to them. Forcing a push disables the ownership check." + }, + "local": { + "type": "boolean", + "description": "Normally, push will process all parameters including those that flow in from project dependencies. Declaring a push as `local` will cause it to only process the parameters defined in the selected projects." + }, + "projects": { + "type": "array", + "items": { + "type": "string", + "format": "uri" + }, + "description": "Projects that are included in the push." + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "format": "uri" + }, + "description": "Tags are used to select parameters by environment from the projects included in the push. You cannot have two tags from the same environment in the same push." + }, + "region": { + "allOf": [ + { + "$ref": "#/components/schemas/AwsRegionEnum" + } + ], + "description": "The AWS region this push targets. This region must be enabled in the integration." + }, + "service": { + "allOf": [ + { + "$ref": "#/components/schemas/AwsServiceEnum" + } + ], + "description": "The AWS service this push targets. This service must be enabled in the integration." + }, + "resource": { + "type": "string", + "nullable": true, + "description": "Defines a path through the integration to the location where values will be pushed.\n\nThe following mustache-style substitutions can be used in the string:\n\n - ``{{ environment }}`` to insert the environment name\n - ``{{ parameter }}`` to insert the parameter name\n - ``{{ project }}`` to insert the project name\n - ``{{ push }}`` to insert the push name\n - ``{{ tag }}`` to insert the tag name\n\nWe recommend that you use project, environment, and parameter at a minimum to disambiguate your pushed resource identifiers.\n\nIf you include multiple projects in the push, the `project` substitution is required. If you include multiple tags from different environments in the push, the `environment` substitution is required. If you include multiple tags from the same environment in the push, the `tag` substitution is required. In all cases, the `parameter` substitution is always required.", + "maxLength": 1024 + } + }, + "required": [ + "created_at", + "id", + "latest_task", + "modified_at", + "name", + "projects", + "region", + "resource", + "service", + "tags", + "url" + ] + }, + "AwsPushTask": { + "type": "object", + "description": "Push task for an AWS integration.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "The unique identifier for the task." + }, + "reason": { + "type": "string", + "nullable": true, + "description": "The reason why this task was triggered.", + "maxLength": 256 + }, + "dry_run": { + "type": "boolean", + "description": "Indicates task steps were only simulated, not actually performed." + }, + "state": { + "allOf": [ + { + "$ref": "#/components/schemas/StateEnum" + } + ], + "description": "The current state of this task." + }, + "error_code": { + "type": "string", + "nullable": true, + "description": "If an error occurs early during processing, before attempting to process values, this code may be helpful in determining the problem.", + "maxLength": 256 + }, + "error_detail": { + "type": "string", + "nullable": true, + "description": "If an error occurs early during processing, before attempting to process values, this detail may be helpful in determining the problem." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + } + }, + "required": [ + "created_at", + "id", + "modified_at", + "url" + ] + }, + "AwsPushTaskStep": { + "type": "object", + "description": "Push task step for an AWS integration.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier for a task step." + }, + "operation": { + "allOf": [ + { + "$ref": "#/components/schemas/OperationEnum" + } + ], + "nullable": true, + "description": "The operation performed, if any.\n\nWhen the operation is an update, there may be additional details in the success_detail field to describe the change.\n\nWhen the project is filled in but the environment and parameterare not, the operation is on the project. When the environmentis filled in but the project and parameter are not, the operationis on the environment. When the project and parameter are filledin but the environment is not, the operation is on the parameter.When all three are filled in, the operation is on the value ofthe parameter of the project in the specified environment." + }, + "success": { + "type": "boolean", + "description": "Indicates if the operation was successful." + }, + "success_detail": { + "type": "string", + "nullable": true, + "description": "Additional details about the successful operation, if any." + }, + "fqn": { + "type": "string", + "nullable": true, + "description": "The fully-qualified name (FQN) this of the value that was changed.", + "maxLength": 1024 + }, + "environment": { + "type": "string", + "format": "uri", + "readOnly": true, + "nullable": true, + "description": "The environment affected by this step." + }, + "environment_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "The environment id involved in the operation." + }, + "environment_name": { + "type": "string", + "nullable": true, + "description": "The environment name involved in the operation.", + "maxLength": 256 + }, + "project": { + "type": "string", + "format": "uri", + "readOnly": true, + "nullable": true, + "description": "The project affected by this step." + }, + "project_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "The project id involved in the operation." + }, + "project_name": { + "type": "string", + "nullable": true, + "description": "The project name involved in the operation.", + "maxLength": 256 + }, + "parameter": { + "type": "string", + "format": "uri", + "readOnly": true, + "nullable": true, + "description": "The parameter affected by this step." + }, + "parameter_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "The parameter id involved in the operation." + }, + "parameter_name": { + "type": "string", + "nullable": true, + "description": "The parameter name involved in the operation.", + "maxLength": 256 + }, + "venue_id": { + "type": "string", + "nullable": true, + "description": "The integration-native id for the resource.", + "maxLength": 2048 + }, + "venue_name": { + "type": "string", + "nullable": true, + "description": "The name of the item or resource as known by the integration.", + "maxLength": 1024 + }, + "summary": { + "type": "string", + "nullable": true, + "description": "The summary of this step (what it was trying to do)." + }, + "error_code": { + "type": "string", + "nullable": true, + "description": "An error code, if not successful.", + "maxLength": 256 + }, + "error_detail": { + "type": "string", + "nullable": true, + "description": "Details on the error that occurred during processing." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + } + }, + "required": [ + "created_at", + "environment", + "id", + "modified_at", + "parameter", + "project", + "success", + "url" + ] + }, + "AwsPushUpdate": { + "type": "object", + "description": "Update a push. The `region` and `service` cannot be changed on an existing push.", + "properties": { + "name": { + "type": "string", + "description": "The action name.", + "maxLength": 256 + }, + "description": { + "type": "string", + "description": "The optional description for the action." + }, + "projects": { + "type": "array", + "items": { + "type": "string", + "format": "uri" + }, + "description": "Projects that are included in the push." + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "format": "uri" + }, + "description": "Tags are used to select parameters by environment from the projects included in the push. You cannot have two tags from the same environment in the same push." + }, + "resource": { + "type": "string", + "nullable": true, + "description": "Defines a path through the integration to the location where values will be pushed.\n\nThe following mustache-style substitutions can be used in the string:\n\n - ``{{ environment }}`` to insert the environment name\n - ``{{ parameter }}`` to insert the parameter name\n - ``{{ project }}`` to insert the project name\n - ``{{ push }}`` to insert the push name\n - ``{{ tag }}`` to insert the tag name\n\nWe recommend that you use project, environment, and parameter at a minimum to disambiguate your pushed resource identifiers.\n\nIf you include multiple projects in the push, the `project` substitution is required. If you include multiple tags from different environments in the push, the `environment` substitution is required. If you include multiple tags from the same environment in the push, the `tag` substitution is required. In all cases, the `parameter` substitution is always required.", + "maxLength": 1024 + }, + "dry_run": { + "type": "boolean", + "description": "When set to dry-run mode an action will report the changes that it would have made in task steps, however those changes are not actually performed." + }, + "force": { + "type": "boolean", + "description": "Normally, push will check to see if it originated the values in the destination before making changes to them. Forcing a push disables the ownership check." + }, + "local": { + "type": "boolean", + "description": "Normally, push will process all parameters including those that flow in from project dependencies. Declaring a push as `local` will cause it to only process the parameters defined in the selected projects." + }, + "coerce_parameters": { + "type": "boolean", + "description": "This setting allows parameters (non-secrets) to be pushed to a destination that only supports storing secrets. This may increase your overall cost from the cloud provider as some cloud providers charge a premium for secrets-only storage." + }, + "include_parameters": { + "type": "boolean", + "description": "Include parameters (non-secrets) in the values being pushed. This setting requires the destination to support parameters or for the `coerce_parameters` flag to be enabled, otherwise the push will fail." + }, + "include_secrets": { + "type": "boolean", + "description": "Include secrets in the values being pushed. This setting requires the destination to support secrets, otherwise the push will fail." + }, + "include_templates": { + "type": "boolean", + "description": "Include templates in the values being pushed." + } + }, + "required": [ + "name", + "projects", + "resource", + "tags" + ] + }, + "AwsRegionEnum": { + "enum": [ + "af-south-1", + "ap-east-1", + "ap-northeast-1", + "ap-northeast-2", + "ap-northeast-3", + "ap-south-1", + "ap-southeast-1", + "ap-southeast-2", + "ca-central-1", + "cn-north-1", + "cn-northwest-1", + "eu-central-1", + "eu-north-1", + "eu-south-1", + "eu-west-1", + "eu-west-2", + "eu-west-3", + "me-south-1", + "sa-east-1", + "us-east-1", + "us-east-2", + "us-west-1", + "us-west-2" + ], + "type": "string" + }, + "AwsServiceEnum": { + "enum": [ + "s3", + "secretsmanager", + "ssm" + ], + "type": "string" + }, + "AzureKeyVaultIntegration": { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "The unique identifier for the integration." + }, + "name": { + "type": "string", + "readOnly": true + }, + "description": { + "type": "string", + "description": "An optional description for the integration." + }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/StatusEnum" + } + ], + "readOnly": true, + "description": "The status of the integration connection with the third-party provider as of the `status_last_checked_at` field. The status is updated automatically by the server when the integration is modified." + }, + "status_detail": { + "type": "string", + "readOnly": true, + "description": "If an error occurs, more details will be available in this field." + }, + "status_last_checked_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The last time the status was evaluated." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "fqn": { + "type": "string", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of integration." + }, + "writable": { + "type": "boolean", + "description": "Allow actions to write to the integration." + }, + "resource_tags": { + "type": "object", + "additionalProperties": {}, + "description": "A list of tags to be set on all integration resources." + }, + "vault_name": { + "type": "string", + "readOnly": true, + "description": "The Azure Key Vault name." + }, + "tenant_id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "The Azure Tenant ID." + } + }, + "required": [ + "created_at", + "fqn", + "id", + "modified_at", + "name", + "status", + "status_detail", + "status_last_checked_at", + "tenant_id", + "type", + "url", + "vault_name" + ] + }, + "AzureKeyVaultIntegrationCreate": { + "type": "object", + "properties": { + "description": { + "type": "string", + "description": "An optional description for the integration." + }, + "writable": { + "type": "boolean", + "description": "Allow actions to write to the integration." + }, + "resource_tags": { + "type": "object", + "additionalProperties": {}, + "description": "A list of tags to be set on all integration resources." + }, + "vault_name": { + "type": "string", + "description": "The Azure Key Vault name.", + "maxLength": 24 + }, + "tenant_id": { + "type": "string", + "format": "uuid", + "description": "The Azure Tenant ID." + } + }, + "required": [ + "tenant_id", + "vault_name" + ] + }, + "AzureKeyVaultIntegrationScan": { + "type": "object", + "properties": { + "resource": { + "type": "string", + "nullable": true, + "description": "Defines a pattern matching string that contains either mustache or regular expression syntax (with named capture groups) that locate the environment, project, and parameter name of the content you are looking for.\n\nIf you are using mustache pattern matching, use:\n\n - ``{{ environment }}`` to identify the environment name\n - ``{{ parameter }}`` to identify the parameter name\n - ``{{ project }}`` to identify the project name\n\nIf you are using a regular expression, use Python syntax with named capture groups that locate the `environment`, `project`, and `parameter`.", + "maxLength": 1024 + } + }, + "required": [ + "resource" + ] + }, + "AzureKeyVaultPull": { "type": "object", + "description": "Pull actions can be configured to get configuration and secrets from\nintegrations on demand.", "properties": { "url": { "type": "string", @@ -10250,94 +15026,99 @@ "type": "string", "format": "uuid", "readOnly": true, - "description": "A unique identifier for the audit record." - }, - "action": { - "type": "string", - "readOnly": true, - "description": "The action that was taken." + "description": "Unique identifier for the action." }, - "object_id": { + "name": { "type": "string", - "readOnly": true, - "description": "The id of the object associated with the action." + "description": "The action name.", + "maxLength": 256 }, - "object_name": { + "description": { "type": "string", - "readOnly": true, - "description": "The name of the object associated with the action, if applicable." + "description": "The optional description for the action." }, - "object_type": { + "latest_task": { "allOf": [ { - "$ref": "#/components/schemas/ObjectTypeEnum" + "$ref": "#/components/schemas/AzureKeyVaultPullTask" } ], "readOnly": true, - "description": "The type of object associated with the action." + "nullable": true, + "description": "The most recent task run for this action." }, - "timestamp": { + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { "type": "string", "format": "date-time", "readOnly": true, - "description": "The timestamp of the activity that was audited." + "nullable": true }, - "user": { + "create_environments": { + "type": "boolean", + "description": "Allow the pull to create environments. Any automatically created environments will be children of the `default` environment. If an environment needs to be created but the action does not allow it, a task step will be added with a null operation, and success_detail will indicate the action did not allow it." + }, + "create_projects": { + "type": "boolean", + "description": "Allow the pull to create projects. If a project needs to be created but the action does not allow it, a task step will be added with a null operation, and success_detail will indicate the action did not allow it." + }, + "dry_run": { + "type": "boolean", + "description": "When set to dry-run mode an action will report the changes that it would have made in task steps, however those changes are not actually performed." + }, + "mapped_values": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ValueCreate" + }, + "readOnly": true, + "description": "Values being managed by a mapped pull." + }, + "mode": { "allOf": [ { - "$ref": "#/components/schemas/User" + "$ref": "#/components/schemas/ModeEnum" } ], "readOnly": true, - "description": "Details of the user associated with this change." + "description": "The pull mode used.\n\nA pattern pull uses a pattern-matching resource string with mustache-style markers to identify the project, parameter, and environment names, or with a Python regular expression that uses named capture groups that define the same three concepts.\n\nA mapped pull uses a specific resource and JMESpath expression to deliver a value to a specific project, parameter, and environment. This leverages external value linkages made in the value editor, and there is one mapped pull per integration provided by the system so that you can trigger external value pull synchronizations." + }, + "resource": { + "type": "string", + "nullable": true, + "description": "Defines a pattern matching string that contains either mustache or regular expression syntax (with named capture groups) that locate the environment, project, and parameter name of the content you are looking for.\n\nIf you are using mustache pattern matching, use:\n\n - ``{{ environment }}`` to identify the environment name\n - ``{{ parameter }}`` to identify the parameter name\n - ``{{ project }}`` to identify the project name\n\nIf you are using a regular expression, use Python syntax with named capture groups that locate the `environment`, `project`, and `parameter`.", + "maxLength": 1024 } }, "required": [ - "action", + "created_at", "id", - "object_id", - "object_name", - "object_type", - "timestamp", - "url", - "user" + "latest_task", + "mapped_values", + "mode", + "modified_at", + "name", + "resource", + "url" ] }, - "AuditTrailSummary": { + "AzureKeyVaultPullSyncActionRequest": { "type": "object", "properties": { - "earliest": { - "type": "string", - "format": "date-time", - "nullable": true, - "readOnly": true, - "description": "The earliest audit record timestamp available." - }, - "max_days": { - "type": "integer", - "readOnly": true, - "description": "The maximum number of days the system will save auditing records, based on your subscription." - }, - "max_records": { - "type": "integer", - "readOnly": true, - "description": "The maximum number of auditing records the system will save based on your subscription." - }, - "total": { - "type": "integer", - "readOnly": true, - "description": "The total number of audit records available." + "dry_run": { + "type": "boolean", + "writeOnly": true, + "description": "Allows you to set the dry_run flag on the pull action before triggering a sync." } - }, - "required": [ - "earliest", - "max_days", - "max_records", - "total" - ] + } }, - "AwsIntegration": { + "AzureKeyVaultPullTask": { "type": "object", + "description": "Pull task for an Azure Key Vault integration.", "properties": { "url": { "type": "string", @@ -10348,211 +15129,206 @@ "type": "string", "format": "uuid", "readOnly": true, - "description": "The unique identifier for the integration." + "description": "The unique identifier for the task." }, - "name": { + "reason": { "type": "string", - "readOnly": true + "nullable": true, + "description": "The reason why this task was triggered.", + "maxLength": 256 }, - "description": { - "type": "string", - "description": "An optional description for the integration." + "dry_run": { + "type": "boolean", + "description": "Indicates task steps were only simulated, not actually performed." }, - "status": { + "state": { "allOf": [ { - "$ref": "#/components/schemas/StatusEnum" + "$ref": "#/components/schemas/StateEnum" } ], - "readOnly": true, - "description": "The status of the integration connection with the third-party provider as of the `status_last_checked_at` field. The status is updated automatically by the server when the integration is modified." + "description": "The current state of this task." }, - "status_detail": { + "error_code": { "type": "string", - "readOnly": true, - "description": "If an error occurs, more details will be available in this field." + "nullable": true, + "description": "If an error occurs early during processing, before attempting to process values, this code may be helpful in determining the problem.", + "maxLength": 256 }, - "status_last_checked_at": { + "error_detail": { + "type": "string", + "nullable": true, + "description": "If an error occurs early during processing, before attempting to process values, this detail may be helpful in determining the problem." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { "type": "string", "format": "date-time", "readOnly": true, - "description": "The last time the status was evaluated." + "nullable": true + } + }, + "required": [ + "created_at", + "id", + "modified_at", + "url" + ] + }, + "AzureKeyVaultPullTaskStep": { + "type": "object", + "description": "Pull task step for an Azure Key Vault integration.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier for a task step." }, - "created_at": { - "type": "string", - "format": "date-time", - "readOnly": true + "operation": { + "allOf": [ + { + "$ref": "#/components/schemas/OperationEnum" + } + ], + "nullable": true, + "description": "The operation performed, if any.\n\nWhen the operation is an update, there may be additional details in the success_detail field to describe the change.\n\nWhen the project is filled in but the environment and parameterare not, the operation is on the project. When the environmentis filled in but the project and parameter are not, the operationis on the environment. When the project and parameter are filledin but the environment is not, the operation is on the parameter.When all three are filled in, the operation is on the value ofthe parameter of the project in the specified environment." }, - "modified_at": { + "success": { + "type": "boolean", + "description": "Indicates if the operation was successful." + }, + "success_detail": { "type": "string", - "format": "date-time", - "readOnly": true + "nullable": true, + "description": "Additional details about the successful operation, if any." }, "fqn": { "type": "string", - "readOnly": true + "nullable": true, + "description": "The fully-qualified name (FQN) this of the value that was changed.", + "maxLength": 1024 }, - "type": { + "environment": { "type": "string", + "format": "uri", "readOnly": true, - "description": "The type of integration." - }, - "writable": { - "type": "boolean", - "description": "Allow actions to write to the integration." + "nullable": true, + "description": "The environment affected by this step." }, - "aws_account_id": { + "environment_id": { "type": "string", - "description": "The AWS Account ID.", - "pattern": "^[0-9]+$", - "maxLength": 12, - "minLength": 12 - }, - "aws_enabled_regions": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AwsRegionEnum" - }, - "description": "The AWS regions to integrate with." + "format": "uuid", + "nullable": true, + "description": "The environment id involved in the operation." }, - "aws_enabled_services": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AwsServiceEnum" - }, - "description": "The AWS services to integrate with." + "environment_name": { + "type": "string", + "nullable": true, + "description": "The environment name involved in the operation.", + "maxLength": 256 }, - "aws_external_id": { + "project": { "type": "string", + "format": "uri", "readOnly": true, - "description": "This is a shared secret between the AWS Administrator who set up your IAM trust relationship and your CloudTruth AWS Integration. CloudTruth will generate a random value for you to give to your AWS Administrator in order to create the necessary IAM role for proper access." + "nullable": true, + "description": "The project affected by this step." }, - "aws_kms_key_id": { + "project_id": { "type": "string", + "format": "uuid", "nullable": true, - "description": "If present, this is the KMS Key Id that is used to push values. This key must be accessible in the AWS account (it cannot be an ARN to a key in another AWS account). ", - "pattern": "^[a-zA-Z0-9:/_\\-]+$", - "maxLength": 256 + "description": "The project id involved in the operation." }, - "aws_role_name": { + "project_name": { "type": "string", - "description": "The role that CloudTruth will assume when interacting with your AWS Account through this integration. The role is configured by your AWS Account Administrator. If your AWS Administrator provided you with a value use it, otherwise make your own role name and give it to your AWS Administrator.", - "pattern": "^[\\w+=,.@\\-]+$", - "maxLength": 64 - } - }, - "required": [ - "aws_account_id", - "aws_enabled_regions", - "aws_enabled_services", - "aws_external_id", - "aws_role_name", - "created_at", - "fqn", - "id", - "modified_at", - "name", - "status", - "status_detail", - "status_last_checked_at", - "type", - "url" - ] - }, - "AwsIntegrationCreate": { - "type": "object", - "properties": { - "description": { + "nullable": true, + "description": "The project name involved in the operation.", + "maxLength": 256 + }, + "parameter": { "type": "string", - "description": "An optional description for the integration." + "format": "uri", + "readOnly": true, + "nullable": true, + "description": "The parameter affected by this step." }, - "writable": { - "type": "boolean", - "description": "Allow actions to write to the integration." + "parameter_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "The parameter id involved in the operation." }, - "aws_account_id": { + "parameter_name": { "type": "string", - "description": "The AWS Account ID.", - "pattern": "^[0-9]+$", - "maxLength": 12, - "minLength": 12 + "nullable": true, + "description": "The parameter name involved in the operation.", + "maxLength": 256 }, - "aws_enabled_regions": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AwsRegionEnum" - }, - "description": "The AWS regions to integrate with." + "venue_id": { + "type": "string", + "nullable": true, + "description": "The integration-native id for the resource.", + "maxLength": 2048 }, - "aws_enabled_services": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AwsServiceEnum" - }, - "description": "The AWS services to integrate with." + "venue_name": { + "type": "string", + "nullable": true, + "description": "The name of the item or resource as known by the integration.", + "maxLength": 1024 }, - "aws_external_id": { + "summary": { "type": "string", - "description": "This is a shared secret between the AWS Administrator who set up your IAM trust relationship and your CloudTruth AWS Integration. CloudTruth will generate a random value for you to give to your AWS Administrator in order to create the necessary IAM role for proper access.", - "minLength": 2, - "pattern": "^[\\w+=,.@:/\\-]*$", - "maxLength": 1224 + "nullable": true, + "description": "The summary of this step (what it was trying to do)." }, - "aws_kms_key_id": { + "error_code": { "type": "string", "nullable": true, - "description": "If present, this is the KMS Key Id that is used to push values. This key must be accessible in the AWS account (it cannot be an ARN to a key in another AWS account). ", - "pattern": "^[a-zA-Z0-9:/_\\-]+$", + "description": "An error code, if not successful.", "maxLength": 256 }, - "aws_role_name": { + "error_detail": { "type": "string", - "description": "The role that CloudTruth will assume when interacting with your AWS Account through this integration. The role is configured by your AWS Account Administrator. If your AWS Administrator provided you with a value use it, otherwise make your own role name and give it to your AWS Administrator.", - "pattern": "^[\\w+=,.@\\-]+$", - "maxLength": 64 - } - }, - "required": [ - "aws_account_id", - "aws_enabled_regions", - "aws_enabled_services", - "aws_role_name" - ] - }, - "AwsIntegrationScan": { - "type": "object", - "properties": { - "region": { - "allOf": [ - { - "$ref": "#/components/schemas/AwsRegionEnum" - } - ], - "description": "The AWS region to use. This region must be enabled in the integration." + "nullable": true, + "description": "Details on the error that occurred during processing." }, - "service": { - "allOf": [ - { - "$ref": "#/components/schemas/AwsServiceEnum" - } - ], - "description": "The AWS service to use. This service must be enabled in the integration." + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true }, - "resource": { + "modified_at": { "type": "string", - "description": "Defines a pattern matching string that contains either mustache or regular expression syntax (with named capture groups) that locate the environment, project, and parameter name of the content you are looking for.\n\nIf you are using mustache pattern matching, use:\n\n - ``{{ environment }}`` to identify the environment name\n - ``{{ parameter }}`` to identify the parameter name\n - ``{{ project }}`` to identify the project name\n\nIf you are using a regular expression, use Python syntax with named capture groups that locate the `environment`, `project`, and `parameter`.", - "maxLength": 1024 + "format": "date-time", + "readOnly": true, + "nullable": true } }, "required": [ - "region", - "resource", - "service" + "created_at", + "environment", + "id", + "modified_at", + "parameter", + "project", + "success", + "url" ] }, - "AwsPull": { + "AzureKeyVaultPush": { "type": "object", - "description": "Pull actions can be configured to get configuration and secrets from\nintegrations on demand.", + "description": "Push actions can be configured to send configuration and secrets to\nintegrations when tags are updated.", "properties": { "url": { "type": "string", @@ -10577,7 +15353,7 @@ "latest_task": { "allOf": [ { - "$ref": "#/components/schemas/AwsPullTask" + "$ref": "#/components/schemas/AzureKeyVaultPushTask" } ], "readOnly": true, @@ -10592,56 +15368,57 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true }, - "create_environments": { + "coerce_parameters": { "type": "boolean", - "description": "Allow the pull to create environments. Any automatically created environments will be children of the `default` environment. If an environment needs to be created but the action does not allow it, a task step will be added with a null operation, and success_detail will indicate the action did not allow it." + "description": "This setting allows parameters (non-secrets) to be pushed to a destination that only supports storing secrets. This may increase your overall cost from the cloud provider as some cloud providers charge a premium for secrets-only storage." }, - "create_projects": { + "include_parameters": { "type": "boolean", - "description": "Allow the pull to create projects. If a project needs to be created but the action does not allow it, a task step will be added with a null operation, and success_detail will indicate the action did not allow it." + "description": "Include parameters (non-secrets) in the values being pushed. This setting requires the destination to support parameters or for the `coerce_parameters` flag to be enabled, otherwise the push will fail." + }, + "include_secrets": { + "type": "boolean", + "description": "Include secrets in the values being pushed. This setting requires the destination to support secrets, otherwise the push will fail." + }, + "include_templates": { + "type": "boolean", + "description": "Include templates in the values being pushed." }, "dry_run": { "type": "boolean", "description": "When set to dry-run mode an action will report the changes that it would have made in task steps, however those changes are not actually performed." }, - "mapped_values": { + "force": { + "type": "boolean", + "description": "Normally, push will check to see if it originated the values in the destination before making changes to them. Forcing a push disables the ownership check." + }, + "local": { + "type": "boolean", + "description": "Normally, push will process all parameters including those that flow in from project dependencies. Declaring a push as `local` will cause it to only process the parameters defined in the selected projects." + }, + "projects": { "type": "array", "items": { - "$ref": "#/components/schemas/Value" + "type": "string", + "format": "uri" }, - "readOnly": true, - "description": "Values being managed by a mapped pull." - }, - "mode": { - "allOf": [ - { - "$ref": "#/components/schemas/ModeEnum" - } - ], - "readOnly": true, - "description": "The pull mode used.\n\nA pattern pull uses a pattern-matching resource string with mustache-style markers to identify the project, parameter, and environment names, or with a Python regular expression that uses named capture groups that define the same three concepts.\n\nA mapped pull uses a specific resource and JMESpath expression to deliver a value to a specific project, parameter, and environment. This leverages external value linkages made in the value editor, and there is one mapped pull per integration provided by the system so that you can trigger external value pull synchronizations." - }, - "region": { - "allOf": [ - { - "$ref": "#/components/schemas/AwsRegionEnum" - } - ], - "description": "The AWS region to use. This region must be enabled in the integration." + "description": "Projects that are included in the push." }, - "service": { - "allOf": [ - { - "$ref": "#/components/schemas/AwsServiceEnum" - } - ], - "description": "The AWS service to use. This service must be enabled in the integration." + "tags": { + "type": "array", + "items": { + "type": "string", + "format": "uri" + }, + "description": "Tags are used to select parameters by environment from the projects included in the push. You cannot have two tags from the same environment in the same push." }, "resource": { "type": "string", - "description": "Defines a pattern matching string that contains either mustache or regular expression syntax (with named capture groups) that locate the environment, project, and parameter name of the content you are looking for.\n\nIf you are using mustache pattern matching, use:\n\n - ``{{ environment }}`` to identify the environment name\n - ``{{ parameter }}`` to identify the parameter name\n - ``{{ project }}`` to identify the project name\n\nIf you are using a regular expression, use Python syntax with named capture groups that locate the `environment`, `project`, and `parameter`.", + "nullable": true, + "description": "Defines a path through the integration to the location where values will be pushed.\n\nThe following mustache-style substitutions can be used in the string:\n\n - ``{{ environment }}`` to insert the environment name\n - ``{{ parameter }}`` to insert the parameter name\n - ``{{ project }}`` to insert the project name\n - ``{{ push }}`` to insert the push name\n - ``{{ tag }}`` to insert the tag name\n\nWe recommend that you use project, environment, and parameter at a minimum to disambiguate your pushed resource identifiers.\n\nIf you include multiple projects in the push, the `project` substitution is required. If you include multiple tags from different environments in the push, the `environment` substitution is required. If you include multiple tags from the same environment in the push, the `tag` substitution is required. In all cases, the `parameter` substitution is always required.", "maxLength": 1024 } }, @@ -10649,29 +15426,17 @@ "created_at", "id", "latest_task", - "mapped_values", - "mode", "modified_at", "name", - "region", + "projects", "resource", - "service", + "tags", "url" ] }, - "AwsPullSyncActionRequest": { - "type": "object", - "properties": { - "dry_run": { - "type": "boolean", - "writeOnly": true, - "description": "Allows you to set the dry_run flag on the pull action before triggering a sync." - } - } - }, - "AwsPullTask": { + "AzureKeyVaultPushTask": { "type": "object", - "description": "Pull task for an AWS integration.", + "description": "Push task for an Azure Key Vault integration.", "properties": { "url": { "type": "string", @@ -10721,7 +15486,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } }, "required": [ @@ -10731,9 +15497,9 @@ "url" ] }, - "AwsPullTaskStep": { + "AzureKeyVaultPushTaskStep": { "type": "object", - "description": "Pull task step for an AWS integration.", + "description": "Push task step for an Azure Key Vault integration.", "properties": { "url": { "type": "string", @@ -10863,7 +15629,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } }, "required": [ @@ -10877,21 +15644,10 @@ "url" ] }, - "AwsPush": { + "AzureKeyVaultPushUpdate": { "type": "object", - "description": "Push actions can be configured to send configuration and secrets to\nintegrations when tags are updated.", + "description": "Update a push.", "properties": { - "url": { - "type": "string", - "format": "uri", - "readOnly": true - }, - "id": { - "type": "string", - "format": "uuid", - "readOnly": true, - "description": "Unique identifier for the action." - }, "name": { "type": "string", "description": "The action name.", @@ -10901,25 +15657,39 @@ "type": "string", "description": "The optional description for the action." }, - "latest_task": { - "allOf": [ - { - "$ref": "#/components/schemas/AwsPushTask" - } - ], - "readOnly": true, - "nullable": true, - "description": "The most recent task run for this action." + "projects": { + "type": "array", + "items": { + "type": "string", + "format": "uri" + }, + "description": "Projects that are included in the push." }, - "created_at": { - "type": "string", - "format": "date-time", - "readOnly": true + "tags": { + "type": "array", + "items": { + "type": "string", + "format": "uri" + }, + "description": "Tags are used to select parameters by environment from the projects included in the push. You cannot have two tags from the same environment in the same push." }, - "modified_at": { + "resource": { "type": "string", - "format": "date-time", - "readOnly": true + "nullable": true, + "description": "Defines a path through the integration to the location where values will be pushed.\n\nThe following mustache-style substitutions can be used in the string:\n\n - ``{{ environment }}`` to insert the environment name\n - ``{{ parameter }}`` to insert the parameter name\n - ``{{ project }}`` to insert the project name\n - ``{{ push }}`` to insert the push name\n - ``{{ tag }}`` to insert the tag name\n\nWe recommend that you use project, environment, and parameter at a minimum to disambiguate your pushed resource identifiers.\n\nIf you include multiple projects in the push, the `project` substitution is required. If you include multiple tags from different environments in the push, the `environment` substitution is required. If you include multiple tags from the same environment in the push, the `tag` substitution is required. In all cases, the `parameter` substitution is always required.", + "maxLength": 1024 + }, + "dry_run": { + "type": "boolean", + "description": "When set to dry-run mode an action will report the changes that it would have made in task steps, however those changes are not actually performed." + }, + "force": { + "type": "boolean", + "description": "Normally, push will check to see if it originated the values in the destination before making changes to them. Forcing a push disables the ownership check." + }, + "local": { + "type": "boolean", + "description": "Normally, push will process all parameters including those that flow in from project dependencies. Declaring a push as `local` will cause it to only process the parameters defined in the selected projects." }, "coerce_parameters": { "type": "boolean", @@ -10932,257 +15702,376 @@ "include_secrets": { "type": "boolean", "description": "Include secrets in the values being pushed. This setting requires the destination to support secrets, otherwise the push will fail." + } + }, + "required": [ + "name", + "projects", + "resource", + "tags" + ] + }, + "BackupDataSnapshot": { + "type": "object", + "description": "Environment, parameter-type, and project (including parameters and values) data at a point in time.", + "properties": { + "environments": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/BackupEnvironment" + } }, - "dry_run": { - "type": "boolean", - "description": "When set to dry-run mode an action will report the changes that it would have made in task steps, however those changes are not actually performed." + "types": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/BackupParameterType" + } }, - "force": { - "type": "boolean", - "description": "Normally, push will check to see if it originated the values in the destination before making changes to them. Forcing a push disables the ownership check." + "projects": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/BackupProject" + } }, - "local": { - "type": "boolean", - "description": "Normally, push will process all parameters including those that flow in from project dependencies. Declaring a push as `local` will cause it to only process the parameters defined in the selected projects." + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "environments", + "projects", + "timestamp", + "types" + ] + }, + "BackupEnvironment": { + "type": "object", + "description": "Basic environment data at a point in time.", + "properties": { + "name": { + "type": "string" }, - "projects": { - "type": "array", - "items": { - "type": "string", - "format": "uri" - }, - "description": "Projects that are included in the push." + "parent": { + "type": "string", + "nullable": true }, - "tags": { - "type": "array", - "items": { - "type": "string", - "format": "uri" - }, - "description": "Tags are used to select parameters by environment from the projects included in the push. You cannot have two tags from the same environment in the same push." + "description": { + "type": "string", + "nullable": true + } + }, + "required": [ + "name" + ] + }, + "BackupExternalReference": { + "type": "object", + "description": "External reference data at a point in time.", + "properties": { + "fqn": { + "type": "string" }, - "region": { - "allOf": [ - { - "$ref": "#/components/schemas/AwsRegionEnum" - } - ], - "description": "The AWS region this push targets. This region must be enabled in the integration." + "jmes_path": { + "type": "string", + "nullable": true + } + }, + "required": [ + "fqn" + ] + }, + "BackupParameter": { + "type": "object", + "description": "Parameter, rule, and value data at a point in time.", + "properties": { + "rules": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/BackupParameterRule" + } + }, + "values": { + "type": "object", + "additionalProperties": { + "allOf": [ + { + "$ref": "#/components/schemas/BackupParameterValue" + } + ], + "nullable": true + } + }, + "name": { + "type": "string" + }, + "param_type": { + "type": "string" + }, + "project": { + "type": "string" }, - "service": { - "allOf": [ - { - "$ref": "#/components/schemas/AwsServiceEnum" - } - ], - "description": "The AWS service this push targets. This service must be enabled in the integration." + "secret": { + "type": "boolean" }, - "resource": { + "description": { "type": "string", - "nullable": true, - "description": "Defines a path through the integration to the location where values will be pushed.\n\nThe following mustache-style substitutions can be used in the string:\n\n - ``{{ environment }}`` to insert the environment name\n - ``{{ parameter }}`` to insert the parameter name\n - ``{{ project }}`` to insert the project name\n - ``{{ push }}`` to insert the push name\n - ``{{ tag }}`` to insert the tag name\n\nWe recommend that you use project, environment, and parameter at a minimum to disambiguate your pushed resource identifiers.\n\nIf you include multiple projects in the push, the `project` substitution is required. If you include multiple tags from different environments in the push, the `environment` substitution is required. If you include multiple tags from the same environment in the push, the `tag` substitution is required. In all cases, the `parameter` substitution is always required.", - "maxLength": 1024 + "nullable": true } }, "required": [ - "created_at", - "id", - "latest_task", - "modified_at", "name", - "projects", - "region", - "resource", - "service", - "tags", - "url" + "param_type", + "project", + "rules", + "secret", + "values" ] }, - "AwsPushTask": { + "BackupParameterRule": { "type": "object", - "description": "Push task for an AWS integration.", + "description": "Rule that is applied to a parameter or parameter-type at a point in time.", "properties": { - "url": { - "type": "string", - "format": "uri", - "readOnly": true + "rule_type": { + "type": "string" }, - "id": { - "type": "string", - "format": "uuid", - "readOnly": true, - "description": "The unique identifier for the task." + "constraint": { + "type": "string" + } + }, + "required": [ + "constraint", + "rule_type" + ] + }, + "BackupParameterType": { + "type": "object", + "description": "Parameter type (and rule) data at a point in time.", + "properties": { + "rules": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/BackupParameterRule" + } }, - "reason": { - "type": "string", - "nullable": true, - "description": "The reason why this task was triggered.", - "maxLength": 256 + "name": { + "type": "string" }, - "dry_run": { - "type": "boolean", - "description": "Indicates task steps were only simulated, not actually performed." + "parent": { + "type": "string" }, - "state": { + "description": { + "type": "string", + "nullable": true + } + }, + "required": [ + "name", + "parent", + "rules" + ] + }, + "BackupParameterValue": { + "type": "object", + "description": "Parameter value data at a point in time.", + "properties": { + "external": { "allOf": [ { - "$ref": "#/components/schemas/StateEnum" + "$ref": "#/components/schemas/BackupExternalReference" } ], - "description": "The current state of this task." + "nullable": true }, - "error_code": { + "environment": { + "type": "string" + }, + "evaluated": { + "type": "boolean" + }, + "source": { "type": "string", - "nullable": true, - "description": "If an error occurs early during processing, before attempting to process values, this code may be helpful in determining the problem.", - "maxLength": 256 + "nullable": true }, - "error_detail": { + "project": { "type": "string", - "nullable": true, - "description": "If an error occurs early during processing, before attempting to process values, this detail may be helpful in determining the problem." + "nullable": true }, - "created_at": { + "value": { "type": "string", - "format": "date-time", - "readOnly": true + "nullable": true }, - "modified_at": { + "raw": { "type": "string", - "format": "date-time", - "readOnly": true + "nullable": true } }, "required": [ - "created_at", - "id", - "modified_at", - "url" + "environment", + "evaluated", + "external" ] }, - "AwsPushTaskStep": { + "BackupProject": { "type": "object", - "description": "Push task step for an AWS integration.", + "description": "Environment, parameter-type, and project (including parameters and values) data at a point in time.", "properties": { - "url": { - "type": "string", - "format": "uri", - "readOnly": true - }, - "id": { - "type": "string", - "format": "uuid", - "readOnly": true, - "description": "Unique identifier for a task step." - }, - "operation": { - "allOf": [ - { - "$ref": "#/components/schemas/OperationEnum" - } - ], - "nullable": true, - "description": "The operation performed, if any.\n\nWhen the operation is an update, there may be additional details in the success_detail field to describe the change.\n\nWhen the project is filled in but the environment and parameterare not, the operation is on the project. When the environmentis filled in but the project and parameter are not, the operationis on the environment. When the project and parameter are filledin but the environment is not, the operation is on the parameter.When all three are filled in, the operation is on the value ofthe parameter of the project in the specified environment." + "parameters": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/BackupParameter" + } }, - "success": { - "type": "boolean", - "description": "Indicates if the operation was successful." + "templates": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/BackupTemplate" + } }, - "success_detail": { - "type": "string", - "nullable": true, - "description": "Additional details about the successful operation, if any." + "name": { + "type": "string" }, - "fqn": { + "parent": { "type": "string", - "nullable": true, - "description": "The fully-qualified name (FQN) this of the value that was changed.", - "maxLength": 1024 + "nullable": true }, - "environment": { + "description": { "type": "string", - "format": "uri", - "readOnly": true, - "nullable": true, - "description": "The environment affected by this step." + "nullable": true + } + }, + "required": [ + "name", + "parameters", + "templates" + ] + }, + "BackupTemplate": { + "type": "object", + "description": "Template data at a given point in time.", + "properties": { + "name": { + "type": "string" }, - "environment_id": { - "type": "string", - "format": "uuid", - "nullable": true, - "description": "The environment id involved in the operation." + "text": { + "type": "string" }, - "environment_name": { + "description": { "type": "string", - "nullable": true, - "description": "The environment name involved in the operation.", - "maxLength": 256 + "nullable": true + } + }, + "required": [ + "description", + "name", + "text" + ] + }, + "DiscoveredContent": { + "type": "object", + "properties": { + "venue_id": { + "type": "string" }, - "project": { - "type": "string", - "format": "uri", - "readOnly": true, - "nullable": true, - "description": "The project affected by this step." + "venue_name": { + "type": "string" }, - "project_id": { - "type": "string", - "format": "uuid", - "nullable": true, - "description": "The project id involved in the operation." + "environment_name": { + "type": "string" }, "project_name": { - "type": "string", - "nullable": true, - "description": "The project name involved in the operation.", - "maxLength": 256 + "type": "string" + }, + "parameter_name": { + "type": "string" + } + }, + "required": [ + "environment_name", + "parameter_name", + "project_name", + "venue_id", + "venue_name" + ] + }, + "DiscoveryResult": { + "type": "object", + "properties": { + "matched": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DiscoveredContent" + } + } }, - "parameter": { + "skipped": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "required": [ + "matched", + "skipped" + ] + }, + "Environment": { + "type": "object", + "properties": { + "url": { "type": "string", "format": "uri", "readOnly": true, - "nullable": true, - "description": "The parameter affected by this step." + "description": "The URL for the environment." }, - "parameter_id": { + "id": { "type": "string", - "format": "uuid", - "nullable": true, - "description": "The parameter id involved in the operation." + "readOnly": true }, - "parameter_name": { + "ledger_id": { "type": "string", - "nullable": true, - "description": "The parameter name involved in the operation.", - "maxLength": 256 + "readOnly": true }, - "venue_id": { + "name": { "type": "string", - "nullable": true, - "description": "The integration-native id for the resource.", - "maxLength": 2048 + "description": "The environment name." }, - "venue_name": { + "description": { "type": "string", - "nullable": true, - "description": "The name of the item or resource as known by the integration.", - "maxLength": 1024 + "description": "A description of the environment. You may find it helpful to document how this environment is used to assist others when they need to maintain software that uses this content." }, - "summary": { + "parent": { "type": "string", + "format": "uri", + "readOnly": true, "nullable": true, - "description": "The summary of this step (what it was trying to do)." + "description": "Environments can inherit from a single parent environment which provides values for parameters when specific environments do not have a value set. Every organization has one default environment that cannot be removed." }, - "error_code": { - "type": "string", - "nullable": true, - "description": "An error code, if not successful.", - "maxLength": 256 + "children": { + "type": "array", + "items": { + "type": "string", + "format": "uri" + }, + "readOnly": true, + "description": "This is the opposite of `parent`, see that field for more details." }, - "error_detail": { - "type": "string", + "access_controlled": { + "type": "boolean", + "description": "Indicates if access control is being enforced through grants." + }, + "role": { + "allOf": [ + { + "$ref": "#/components/schemas/RoleEnum" + } + ], "nullable": true, - "description": "Details on the error that occurred during processing." + "readOnly": true, + "description": "Your role in the environment, if the environment is access-controlled." }, "created_at": { "type": "string", @@ -11192,428 +16081,712 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } }, "required": [ + "children", "created_at", - "environment", "id", + "ledger_id", "modified_at", - "parameter", - "project", - "success", + "name", + "parent", + "role", "url" ] }, - "AwsPushUpdate": { + "EnvironmentCopy": { "type": "object", - "description": "Update a push. The `region` and `service` cannot be changed on an existing push.", "properties": { "name": { "type": "string", - "description": "The action name.", + "description": "The environment name.", "maxLength": 256 }, "description": { "type": "string", - "description": "The optional description for the action." - }, - "projects": { - "type": "array", - "items": { - "type": "string", - "format": "uri" - }, - "description": "Projects that are included in the push." + "description": "A description of the environment. You may find it helpful to document how this environment is used to assist others when they need to maintain software that uses this content." }, - "tags": { - "type": "array", - "items": { + "child_environment_names": { + "type": "object", + "additionalProperties": { "type": "string", - "format": "uri" + "description": "The name to use for the copied child Environment." }, - "description": "Tags are used to select parameters by environment from the projects included in the push. You cannot have two tags from the same environment in the same push." - }, - "resource": { - "type": "string", "nullable": true, - "description": "Defines a path through the integration to the location where values will be pushed.\n\nThe following mustache-style substitutions can be used in the string:\n\n - ``{{ environment }}`` to insert the environment name\n - ``{{ parameter }}`` to insert the parameter name\n - ``{{ project }}`` to insert the project name\n - ``{{ push }}`` to insert the push name\n - ``{{ tag }}`` to insert the tag name\n\nWe recommend that you use project, environment, and parameter at a minimum to disambiguate your pushed resource identifiers.\n\nIf you include multiple projects in the push, the `project` substitution is required. If you include multiple tags from different environments in the push, the `environment` substitution is required. If you include multiple tags from the same environment in the push, the `tag` substitution is required. In all cases, the `parameter` substitution is always required.", - "maxLength": 1024 - }, - "dry_run": { - "type": "boolean", - "description": "When set to dry-run mode an action will report the changes that it would have made in task steps, however those changes are not actually performed." - }, - "force": { - "type": "boolean", - "description": "Normally, push will check to see if it originated the values in the destination before making changes to them. Forcing a push disables the ownership check." + "description": "When copying child Environments, this indicates what name to use for each Environment. If no name is provided for a given child Environment, a \"-1\" will be appended to its name. Note that this name mapping can be used for Environments of any level of depth in the parent-child hierarchy." }, - "local": { + "recursive": { "type": "boolean", - "description": "Normally, push will process all parameters including those that flow in from project dependencies. Declaring a push as `local` will cause it to only process the parameters defined in the selected projects." + "description": "If true, copy child environments recursively. If false, only copy the specified project." + } + }, + "required": [ + "name" + ] + }, + "EnvironmentCreate": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The environment name.", + "maxLength": 256 }, - "coerce_parameters": { - "type": "boolean", - "description": "This setting allows parameters (non-secrets) to be pushed to a destination that only supports storing secrets. This may increase your overall cost from the cloud provider as some cloud providers charge a premium for secrets-only storage." + "description": { + "type": "string", + "description": "A description of the environment. You may find it helpful to document how this environment is used to assist others when they need to maintain software that uses this content." }, - "include_parameters": { - "type": "boolean", - "description": "Include parameters (non-secrets) in the values being pushed. This setting requires the destination to support parameters or for the `coerce_parameters` flag to be enabled, otherwise the push will fail." + "parent": { + "type": "string", + "format": "uri", + "nullable": true, + "description": "Environments can inherit from a single parent environment which provides values for parameters when specific environments do not have a value set. Every organization has one default environment that cannot be removed." }, - "include_secrets": { + "copy_rbac": { "type": "boolean", - "description": "Include secrets in the values being pushed. This setting requires the destination to support secrets, otherwise the push will fail." + "writeOnly": true, + "default": false, + "description": "If parent has RBAC enabled and this field is True, RBAC will be enabled and grants from the parent are copied to this environment. If parent has RBAC enabled and this field is False, RBAC will be enabled but only the minimal necessary grants will be assigned to the newly created environment. Not used when RBAC is not enabled for the parent." } }, "required": [ - "name", - "projects", - "resource", - "tags" + "name" ] }, - "AwsRegionEnum": { - "enum": [ - "af-south-1", - "ap-east-1", - "ap-northeast-1", - "ap-northeast-2", - "ap-northeast-3", - "ap-south-1", - "ap-southeast-1", - "ap-southeast-2", - "ca-central-1", - "cn-north-1", - "cn-northwest-1", - "eu-central-1", - "eu-north-1", - "eu-south-1", - "eu-west-1", - "eu-west-2", - "eu-west-3", - "me-south-1", - "sa-east-1", - "us-east-1", - "us-east-2", - "us-west-1", - "us-west-2" - ], - "type": "string" - }, - "AwsServiceEnum": { - "enum": [ - "s3", - "secretsmanager", - "ssm" - ], - "type": "string" + "EnvironmentUpdate": { + "type": "object", + "properties": { + "id": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "description": "The environment name.", + "maxLength": 256 + }, + "description": { + "type": "string", + "description": "A description of the environment. You may find it helpful to document how this environment is used to assist others when they need to maintain software that uses this content." + }, + "parent": { + "type": "string", + "format": "uri", + "nullable": true, + "description": "Environments can inherit from a single parent environment which provides values for parameters when specific environments do not have a value set. Every organization has one default environment that cannot be removed." + }, + "children": { + "type": "array", + "items": { + "type": "string", + "format": "uri" + }, + "readOnly": true, + "description": "This is the opposite of `parent`, see that field for more details." + }, + "access_controlled": { + "type": "boolean", + "description": "Indicates if access control is being enforced through grants." + }, + "role": { + "allOf": [ + { + "$ref": "#/components/schemas/RoleEnum" + } + ], + "nullable": true, + "readOnly": true, + "description": "Your role in the environment, if the environment is access-controlled." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + } + }, + "required": [ + "children", + "created_at", + "id", + "modified_at", + "name", + "role" + ] }, - "BackupDataSnapshot": { + "FeaturesAiChatResponse": { "type": "object", - "description": "Environment, parameter-type, and project (including parameters and values) data at a point in time.", "properties": { - "environments": { - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/BackupEnvironment" - } - }, - "types": { - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/BackupParameterType" - } - }, - "projects": { + "chatgpt": { "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/BackupProject" - } - }, - "timestamp": { - "type": "string", - "format": "date-time" + "additionalProperties": {} } }, "required": [ - "environments", - "projects", - "timestamp", - "types" + "chatgpt" ] }, - "BackupEnvironment": { + "FeaturesResponse": { "type": "object", - "description": "Basic environment data at a point in time.", "properties": { - "name": { - "type": "string" + "self_hosted": { + "type": "boolean" }, - "parent": { - "type": "string", - "nullable": true + "aws_integration": { + "type": "boolean" }, - "description": { - "type": "string", - "nullable": true + "azure_integration": { + "type": "boolean" + }, + "github_integration": { + "type": "boolean" } }, "required": [ - "name" + "aws_integration", + "azure_integration", + "github_integration", + "self_hosted" ] }, - "BackupExternalReference": { + "GeneratedPasswordResponse": { "type": "object", - "description": "External reference data at a point in time.", "properties": { - "fqn": { - "type": "string" - }, - "jmes_path": { + "value": { "type": "string", - "nullable": true + "description": "The generated password value" } }, "required": [ - "fqn" + "value" ] }, - "BackupParameter": { + "GitHubIntegration": { "type": "object", - "description": "Parameter, rule, and value data at a point in time.", "properties": { - "rules": { - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/BackupParameterRule" - } + "url": { + "type": "string", + "format": "uri", + "readOnly": true }, - "values": { - "type": "object", - "additionalProperties": { - "allOf": [ - { - "$ref": "#/components/schemas/BackupParameterValue" - } - ], - "nullable": true - } + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "The unique identifier for the integration." }, "name": { - "type": "string" + "type": "string", + "readOnly": true }, - "param_type": { - "type": "string" + "description": { + "type": "string", + "description": "An optional description for the integration." }, - "project": { - "type": "string" + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/StatusEnum" + } + ], + "readOnly": true, + "description": "The status of the integration connection with the third-party provider as of the `status_last_checked_at` field. The status is updated automatically by the server when the integration is modified." }, - "secret": { - "type": "boolean" + "status_detail": { + "type": "string", + "readOnly": true, + "description": "If an error occurs, more details will be available in this field." }, - "description": { + "status_last_checked_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true, + "description": "The last time the status was evaluated." + }, + "created_at": { "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, "nullable": true + }, + "fqn": { + "type": "string", + "readOnly": true + }, + "type": { + "type": "string", + "readOnly": true, + "description": "The type of integration." + }, + "writable": { + "type": "boolean", + "description": "Allow actions to write to the integration." + }, + "gh_installation_id": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0 + }, + "gh_organization_slug": { + "type": "string", + "readOnly": true } }, "required": [ + "created_at", + "fqn", + "gh_installation_id", + "gh_organization_slug", + "id", + "modified_at", "name", - "param_type", - "project", - "rules", - "secret", - "values" + "status", + "status_detail", + "status_last_checked_at", + "type", + "url" ] }, - "BackupParameterRule": { + "GitHubIntegrationCreate": { "type": "object", - "description": "Rule that is applied to a parameter or parameter-type at a point in time.", "properties": { - "rule_type": { - "type": "string" + "description": { + "type": "string", + "description": "An optional description for the integration." + }, + "writable": { + "type": "boolean", + "description": "Allow actions to write to the integration." + }, + "gh_installation_id": { + "type": "integer", + "maximum": 2147483647, + "minimum": 0 + } + }, + "required": [ + "gh_installation_id" + ] + }, + "GitHubPull": { + "type": "object", + "description": "Pull actions can be configured to get configuration and secrets from\nintegrations on demand.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier for the action." + }, + "name": { + "type": "string", + "description": "The action name.", + "maxLength": 256 + }, + "description": { + "type": "string", + "description": "The optional description for the action." + }, + "latest_task": { + "allOf": [ + { + "$ref": "#/components/schemas/GitHubPullTask" + } + ], + "readOnly": true, + "nullable": true, + "description": "The most recent task run for this action." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "create_environments": { + "type": "boolean", + "description": "Allow the pull to create environments. Any automatically created environments will be children of the `default` environment. If an environment needs to be created but the action does not allow it, a task step will be added with a null operation, and success_detail will indicate the action did not allow it." + }, + "create_projects": { + "type": "boolean", + "description": "Allow the pull to create projects. If a project needs to be created but the action does not allow it, a task step will be added with a null operation, and success_detail will indicate the action did not allow it." + }, + "dry_run": { + "type": "boolean", + "description": "When set to dry-run mode an action will report the changes that it would have made in task steps, however those changes are not actually performed." + }, + "mapped_values": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ValueCreate" + }, + "readOnly": true, + "description": "Values being managed by a mapped pull." }, - "constraint": { - "type": "string" + "mode": { + "allOf": [ + { + "$ref": "#/components/schemas/ModeEnum" + } + ], + "readOnly": true, + "description": "The pull mode used.\n\nA pattern pull uses a pattern-matching resource string with mustache-style markers to identify the project, parameter, and environment names, or with a Python regular expression that uses named capture groups that define the same three concepts.\n\nA mapped pull uses a specific resource and JMESpath expression to deliver a value to a specific project, parameter, and environment. This leverages external value linkages made in the value editor, and there is one mapped pull per integration provided by the system so that you can trigger external value pull synchronizations." } }, "required": [ - "constraint", - "rule_type" + "created_at", + "id", + "latest_task", + "mapped_values", + "mode", + "modified_at", + "name", + "url" ] }, - "BackupParameterType": { + "GitHubPullTask": { "type": "object", - "description": "Parameter type (and rule) data at a point in time.", + "description": "Pull task for a GitHub integration.", "properties": { - "rules": { - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/BackupParameterRule" - } + "url": { + "type": "string", + "format": "uri", + "readOnly": true }, - "name": { - "type": "string" + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "The unique identifier for the task." }, - "parent": { - "type": "string" + "reason": { + "type": "string", + "nullable": true, + "description": "The reason why this task was triggered.", + "maxLength": 256 }, - "description": { + "dry_run": { + "type": "boolean", + "description": "Indicates task steps were only simulated, not actually performed." + }, + "state": { + "allOf": [ + { + "$ref": "#/components/schemas/StateEnum" + } + ], + "description": "The current state of this task." + }, + "error_code": { "type": "string", + "nullable": true, + "description": "If an error occurs early during processing, before attempting to process values, this code may be helpful in determining the problem.", + "maxLength": 256 + }, + "error_detail": { + "type": "string", + "nullable": true, + "description": "If an error occurs early during processing, before attempting to process values, this detail may be helpful in determining the problem." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, "nullable": true } }, "required": [ - "name", - "parent", - "rules" + "created_at", + "id", + "modified_at", + "url" ] }, - "BackupParameterValue": { + "GitHubPullTaskStep": { "type": "object", - "description": "Parameter value data at a point in time.", + "description": "Pull task step for a GitHub integration.", "properties": { - "external": { + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "Unique identifier for a task step." + }, + "operation": { "allOf": [ { - "$ref": "#/components/schemas/BackupExternalReference" + "$ref": "#/components/schemas/OperationEnum" } ], - "nullable": true + "nullable": true, + "description": "The operation performed, if any.\n\nWhen the operation is an update, there may be additional details in the success_detail field to describe the change.\n\nWhen the project is filled in but the environment and parameterare not, the operation is on the project. When the environmentis filled in but the project and parameter are not, the operationis on the environment. When the project and parameter are filledin but the environment is not, the operation is on the parameter.When all three are filled in, the operation is on the value ofthe parameter of the project in the specified environment." + }, + "success": { + "type": "boolean", + "description": "Indicates if the operation was successful." + }, + "success_detail": { + "type": "string", + "nullable": true, + "description": "Additional details about the successful operation, if any." + }, + "fqn": { + "type": "string", + "nullable": true, + "description": "The fully-qualified name (FQN) this of the value that was changed.", + "maxLength": 1024 }, "environment": { - "type": "string" + "type": "string", + "format": "uri", + "readOnly": true, + "nullable": true, + "description": "The environment affected by this step." }, - "evaluated": { - "type": "boolean" + "environment_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "The environment id involved in the operation." }, - "source": { + "environment_name": { "type": "string", - "nullable": true + "nullable": true, + "description": "The environment name involved in the operation.", + "maxLength": 256 }, "project": { "type": "string", - "nullable": true + "format": "uri", + "readOnly": true, + "nullable": true, + "description": "The project affected by this step." }, - "value": { + "project_id": { "type": "string", - "nullable": true + "format": "uuid", + "nullable": true, + "description": "The project id involved in the operation." }, - "raw": { + "project_name": { + "type": "string", + "nullable": true, + "description": "The project name involved in the operation.", + "maxLength": 256 + }, + "parameter": { + "type": "string", + "format": "uri", + "readOnly": true, + "nullable": true, + "description": "The parameter affected by this step." + }, + "parameter_id": { + "type": "string", + "format": "uuid", + "nullable": true, + "description": "The parameter id involved in the operation." + }, + "parameter_name": { + "type": "string", + "nullable": true, + "description": "The parameter name involved in the operation.", + "maxLength": 256 + }, + "venue_id": { + "type": "string", + "nullable": true, + "description": "The integration-native id for the resource.", + "maxLength": 2048 + }, + "venue_name": { + "type": "string", + "nullable": true, + "description": "The name of the item or resource as known by the integration.", + "maxLength": 1024 + }, + "summary": { + "type": "string", + "nullable": true, + "description": "The summary of this step (what it was trying to do)." + }, + "error_code": { + "type": "string", + "nullable": true, + "description": "An error code, if not successful.", + "maxLength": 256 + }, + "error_detail": { + "type": "string", + "nullable": true, + "description": "Details on the error that occurred during processing." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { "type": "string", + "format": "date-time", + "readOnly": true, "nullable": true } }, "required": [ + "created_at", "environment", - "evaluated", - "external" + "id", + "modified_at", + "parameter", + "project", + "success", + "url" ] }, - "BackupProject": { + "Grant": { "type": "object", - "description": "Environment, parameter-type, and project (including parameters and values) data at a point in time.", "properties": { - "parameters": { - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/BackupParameter" - } + "url": { + "type": "string", + "format": "uri", + "readOnly": true }, - "templates": { - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/BackupTemplate" - } + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "A unique identifier for the grant." + }, + "principal": { + "type": "string", + "format": "uri", + "description": "The URI of a principal for the grant; this must reference a user or group." + }, + "scope": { + "type": "string", + "format": "uri", + "description": "The URI of a scope for the grant; this must reference a project or environment." }, - "name": { - "type": "string" + "role": { + "allOf": [ + { + "$ref": "#/components/schemas/RoleEnum" + } + ], + "description": "The role that the principal has in the given scope." }, - "parent": { + "created_at": { "type": "string", - "nullable": true + "format": "date-time", + "readOnly": true }, - "description": { + "modified_at": { "type": "string", + "format": "date-time", + "readOnly": true, "nullable": true } }, "required": [ - "name", - "parameters", - "templates" + "created_at", + "id", + "modified_at", + "principal", + "role", + "scope", + "url" ] }, - "BackupTemplate": { + "GrantUpdate": { "type": "object", - "description": "Template data at a given point in time.", "properties": { - "name": { - "type": "string" - }, - "text": { - "type": "string" + "url": { + "type": "string", + "format": "uri", + "readOnly": true }, - "description": { + "id": { "type": "string", - "nullable": true - } - }, - "required": [ - "description", - "name", - "text" - ] - }, - "DiscoveredContent": { - "type": "object", - "properties": { - "venue_id": { - "type": "string" + "format": "uuid", + "readOnly": true, + "description": "A unique identifier for the grant." }, - "venue_name": { - "type": "string" + "principal": { + "type": "string", + "format": "uri", + "description": "The URI of a principal for the grant; this must reference a user or group." }, - "environment_name": { - "type": "string" + "scope": { + "type": "string", + "format": "uri", + "description": "The URI of a scope for the grant; this must reference a project or environment." }, - "project_name": { - "type": "string" + "role": { + "allOf": [ + { + "$ref": "#/components/schemas/RoleEnum" + } + ], + "description": "The role that the principal has in the given scope." }, - "parameter_name": { - "type": "string" - } - }, - "required": [ - "environment_name", - "parameter_name", - "project_name", - "venue_id", - "venue_name" - ] - }, - "DiscoveryResult": { - "type": "object", - "properties": { - "matched": { - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/DiscoveredContent" - } + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true }, - "skipped": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true } }, "required": [ - "matched", - "skipped" + "created_at", + "id", + "modified_at", + "principal", + "role", + "scope", + "url" ] }, - "Environment": { + "Group": { "type": "object", "properties": { "url": { @@ -11625,45 +16798,23 @@ "type": "string", "format": "uuid", "readOnly": true, - "description": "A unique identifier for the environment." + "description": "The unique identifier of a group." }, "name": { "type": "string", - "description": "The environment name.", - "maxLength": 256 + "description": "The group name.", + "maxLength": 150 }, "description": { "type": "string", - "description": "A description of the environment. You may find it helpful to document how this environment is used to assist others when they need to maintain software that uses this content." - }, - "parent": { - "type": "string", - "format": "uri", - "nullable": true, - "description": "Environments can inherit from a single parent environment which provides values for parameters when specific environments do not have a value set. Every organization has one default environment that cannot be removed." + "description": "A description of the group. You may find it helpful to document how this group is used to assist others when they need to maintain this organization." }, - "children": { + "users": { "type": "array", "items": { "type": "string", "format": "uri" - }, - "readOnly": true, - "description": "This is the opposite of `parent`, see that field for more details." - }, - "access_controlled": { - "type": "boolean", - "description": "Indicates if access control is being enforced through grants." - }, - "role": { - "allOf": [ - { - "$ref": "#/components/schemas/RoleEnum" - } - ], - "nullable": true, - "readOnly": true, - "description": "Your role in the environment, if the environment is access-controlled." + } }, "created_at": { "type": "string", @@ -11673,168 +16824,237 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } }, "required": [ - "children", "created_at", "id", "modified_at", "name", - "role", - "url" + "url", + "users" ] }, - "EnvironmentCreate": { + "HistoryModelEnum": { + "enum": [ + "Parameter", + "ParameterRule", + "Value" + ], + "type": "string" + }, + "HistoryTypeEnum": { + "enum": [ + "create", + "update", + "delete", + "nothing" + ], + "type": "string" + }, + "ImportCreateRequest": { "type": "object", "properties": { - "name": { + "project": { "type": "string", - "description": "The environment name.", - "maxLength": 256 + "description": "Project name or identifier" }, - "description": { + "environment": { "type": "string", - "description": "A description of the environment. You may find it helpful to document how this environment is used to assist others when they need to maintain software that uses this content." + "nullable": true, + "description": "Environment name or identifier" }, - "parent": { + "body": { "type": "string", - "format": "uri", - "nullable": true, - "description": "Environments can inherit from a single parent environment which provides values for parameters when specific environments do not have a value set. Every organization has one default environment that cannot be removed." + "description": "Text to turn into variables" + }, + "secrets": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Parameter names that should be secrets" + }, + "ignore": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Parameter names to be ignored" + }, + "add_project": { + "type": "boolean", + "default": true, + "description": "Create the project (if it does not exist)" + }, + "add_environment": { + "type": "boolean", + "default": true, + "description": "Create the environment (if it does not exist)" + }, + "add_parameters": { + "type": "boolean", + "default": true, + "description": "Create the parameters (if they do not exist)" + }, + "add_overrides": { + "type": "boolean", + "default": true, + "description": "Create the environment value override (if they do not exist)" + }, + "inherit_on_same": { + "type": "boolean", + "default": true, + "description": "Skip adding a parameter override if it is the same" } }, "required": [ - "name" + "body", + "ignore", + "project", + "secrets" ] }, - "GeneratedPasswordResponse": { + "ImportCreateResponse": { "type": "object", "properties": { - "value": { - "type": "string", - "description": "The generated password value" + "parameter": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ImportParameter" + }, + "description": "Project parameter values after import" } }, "required": [ - "value" + "parameter" ] }, - "GitHubIntegration": { + "ImportParameter": { "type": "object", + "description": "Describes an imported parameter.", "properties": { - "url": { + "project_name": { + "type": "string", + "description": "Project name" + }, + "project_id": { "type": "string", - "format": "uri", - "readOnly": true + "nullable": true, + "description": "Project identifier" }, - "id": { + "environment_name": { "type": "string", - "format": "uuid", - "readOnly": true, - "description": "The unique identifier for the integration." + "description": "Environment where parameter is defined" }, - "name": { + "environment_id": { "type": "string", - "readOnly": true + "nullable": true, + "description": "Environment identifier where value is set" }, - "description": { + "parameter_name": { "type": "string", - "description": "An optional description for the integration." + "description": "Parameter name" }, - "status": { - "allOf": [ - { - "$ref": "#/components/schemas/StatusEnum" - } - ], - "readOnly": true, - "description": "The status of the integration connection with the third-party provider as of the `status_last_checked_at` field. The status is updated automatically by the server when the integration is modified." + "parameter_id": { + "type": "string", + "nullable": true, + "description": "Parameter identifier" }, - "status_detail": { + "secret": { + "type": "boolean", + "default": false, + "description": "Whether to treat the parameter as a secret" + }, + "value": { "type": "string", - "readOnly": true, - "description": "If an error occurs, more details will be available in this field." + "description": "Parameter value in the specified environment" }, - "status_last_checked_at": { + "value_id": { "type": "string", - "format": "date-time", - "readOnly": true, - "description": "The last time the status was evaluated." + "nullable": true, + "description": "Parameter value identifier in the environment" }, "created_at": { "type": "string", "format": "date-time", - "readOnly": true + "nullable": true, + "description": "Date and time the parameter value was created" }, "modified_at": { "type": "string", "format": "date-time", - "readOnly": true - }, - "fqn": { - "type": "string", - "readOnly": true - }, - "type": { - "type": "string", - "readOnly": true, - "description": "The type of integration." - }, - "writable": { - "type": "boolean", - "description": "Allow actions to write to the integration." - }, - "gh_installation_id": { - "type": "integer", - "maximum": 2147483647, - "minimum": 0 + "nullable": true, + "description": "Date and time the parameter value was updated" }, - "gh_organization_slug": { + "action": { "type": "string", - "readOnly": true + "description": "Action taken on environment value for parameter" } }, "required": [ + "action", "created_at", - "fqn", - "gh_installation_id", - "gh_organization_slug", - "id", + "environment_name", "modified_at", - "name", - "status", - "status_detail", - "status_last_checked_at", - "type", - "url" + "parameter_name", + "project_name", + "value" ] }, - "GitHubIntegrationCreate": { + "IntegrationNode": { "type": "object", + "description": "Describes the content available at a given location.", "properties": { - "description": { + "fqn": { + "type": "string" + }, + "node_type": { + "$ref": "#/components/schemas/NodeTypeEnum" + }, + "secret": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "jmespath": { "type": "string", - "description": "An optional description for the integration." + "nullable": true }, - "writable": { - "type": "boolean", - "description": "Allow actions to write to the integration." + "content_type": { + "type": "string", + "nullable": true }, - "gh_installation_id": { + "content_data": { + "type": "string", + "nullable": true + }, + "content_size": { "type": "integer", - "maximum": 2147483647, - "minimum": 0 + "nullable": true + }, + "content_keys": { + "type": "array", + "items": { + "type": "string" + }, + "nullable": true + }, + "venue_id": { + "type": "string", + "nullable": true } }, "required": [ - "gh_installation_id" + "fqn", + "node_type" ] }, - "GitHubPull": { + "Invitation": { "type": "object", - "description": "Pull actions can be configured to get configuration and secrets from\nintegrations on demand.", "properties": { "url": { "type": "string", @@ -11845,81 +17065,95 @@ "type": "string", "format": "uuid", "readOnly": true, - "description": "Unique identifier for the action." - }, - "name": { - "type": "string", - "description": "The action name.", - "maxLength": 256 + "description": "The unique identifier of an invitation." }, - "description": { + "email": { "type": "string", - "description": "The optional description for the action." + "format": "email", + "description": "The email address of the user to be invited.", + "maxLength": 254 }, - "latest_task": { + "role": { "allOf": [ { - "$ref": "#/components/schemas/GitHubPullTask" + "$ref": "#/components/schemas/RoleEnum" } ], - "readOnly": true, - "nullable": true, - "description": "The most recent task run for this action." + "description": "The role that the user will have in the organization, should the user accept." }, - "created_at": { + "inviter": { "type": "string", - "format": "date-time", - "readOnly": true + "format": "uri", + "readOnly": true, + "description": "The user that created the invitation." }, - "modified_at": { + "inviter_name": { "type": "string", - "format": "date-time", - "readOnly": true + "readOnly": true, + "description": "The name of the user that created the invitation." }, - "create_environments": { - "type": "boolean", - "description": "Allow the pull to create environments. Any automatically created environments will be children of the `default` environment. If an environment needs to be created but the action does not allow it, a task step will be added with a null operation, and success_detail will indicate the action did not allow it." + "state": { + "type": "string", + "readOnly": true, + "description": "The current state of the invitation." }, - "create_projects": { - "type": "boolean", - "description": "Allow the pull to create projects. If a project needs to be created but the action does not allow it, a task step will be added with a null operation, and success_detail will indicate the action did not allow it." + "state_detail": { + "type": "string", + "readOnly": true, + "description": "Additional details about the state of the invitation." }, - "dry_run": { - "type": "boolean", - "description": "When set to dry-run mode an action will report the changes that it would have made in task steps, however those changes are not actually performed." + "membership": { + "type": "string", + "format": "uri", + "readOnly": true, + "nullable": true, + "description": "The resulting membership, should the user accept." }, - "mapped_values": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Value" - }, + "organization": { + "type": "string", + "format": "uri", "readOnly": true, - "description": "Values being managed by a mapped pull." + "description": "The organization that the user will become a member of, should the user accept." + } + }, + "required": [ + "email", + "id", + "inviter", + "inviter_name", + "membership", + "organization", + "role", + "state", + "state_detail", + "url" + ] + }, + "InvitationCreate": { + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email", + "description": "The email address of the user to be invited.", + "maxLength": 254 }, - "mode": { + "role": { "allOf": [ { - "$ref": "#/components/schemas/ModeEnum" + "$ref": "#/components/schemas/RoleEnum" } ], - "readOnly": true, - "description": "The pull mode used.\n\nA pattern pull uses a pattern-matching resource string with mustache-style markers to identify the project, parameter, and environment names, or with a Python regular expression that uses named capture groups that define the same three concepts.\n\nA mapped pull uses a specific resource and JMESpath expression to deliver a value to a specific project, parameter, and environment. This leverages external value linkages made in the value editor, and there is one mapped pull per integration provided by the system so that you can trigger external value pull synchronizations." + "description": "The role that the user will have in the organization, should the user accept." } }, "required": [ - "created_at", - "id", - "latest_task", - "mapped_values", - "mode", - "modified_at", - "name", - "url" + "email", + "role" ] }, - "GitHubPullTask": { + "Membership": { "type": "object", - "description": "Pull task for a GitHub integration.", "properties": { "url": { "type": "string", @@ -11930,36 +17164,25 @@ "type": "string", "format": "uuid", "readOnly": true, - "description": "The unique identifier for the task." + "description": "A unique identifier for the membership." }, - "reason": { + "user": { "type": "string", - "nullable": true, - "description": "The reason why this task was triggered.", - "maxLength": 256 + "format": "uri", + "description": "The user of the membership." }, - "dry_run": { - "type": "boolean", - "description": "Indicates task steps were only simulated, not actually performed." + "organization": { + "type": "string", + "format": "uri", + "description": "The organization that the user is a member of." }, - "state": { + "role": { "allOf": [ { - "$ref": "#/components/schemas/StateEnum" + "$ref": "#/components/schemas/RoleEnum" } ], - "description": "The current state of this task." - }, - "error_code": { - "type": "string", - "nullable": true, - "description": "If an error occurs early during processing, before attempting to process values, this code may be helpful in determining the problem.", - "maxLength": 256 - }, - "error_detail": { - "type": "string", - "nullable": true, - "description": "If an error occurs early during processing, before attempting to process values, this detail may be helpful in determining the problem." + "description": "The role that the user has in the organization." }, "created_at": { "type": "string", @@ -11969,193 +17192,176 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } }, "required": [ "created_at", "id", "modified_at", - "url" + "organization", + "role", + "url", + "user" ] }, - "GitHubPullTaskStep": { + "MembershipCreate": { "type": "object", - "description": "Pull task step for a GitHub integration.", "properties": { - "url": { + "user": { "type": "string", "format": "uri", - "readOnly": true - }, - "id": { - "type": "string", - "format": "uuid", - "readOnly": true, - "description": "Unique identifier for a task step." + "description": "The user of the membership." }, - "operation": { + "role": { "allOf": [ { - "$ref": "#/components/schemas/OperationEnum" + "$ref": "#/components/schemas/RoleEnum" } ], - "nullable": true, - "description": "The operation performed, if any.\n\nWhen the operation is an update, there may be additional details in the success_detail field to describe the change.\n\nWhen the project is filled in but the environment and parameterare not, the operation is on the project. When the environmentis filled in but the project and parameter are not, the operationis on the environment. When the project and parameter are filledin but the environment is not, the operation is on the parameter.When all three are filled in, the operation is on the value ofthe parameter of the project in the specified environment." - }, - "success": { - "type": "boolean", - "description": "Indicates if the operation was successful." - }, - "success_detail": { - "type": "string", - "nullable": true, - "description": "Additional details about the successful operation, if any." - }, - "fqn": { - "type": "string", - "nullable": true, - "description": "The fully-qualified name (FQN) this of the value that was changed.", - "maxLength": 1024 - }, - "environment": { + "description": "The role that the user has in the organization." + } + }, + "required": [ + "role", + "user" + ] + }, + "ModeEnum": { + "enum": [ + "mapped", + "pattern" + ], + "type": "string" + }, + "NodeTypeEnum": { + "enum": [ + "directory", + "file", + "value" + ], + "type": "string" + }, + "ObjectTypeEnum": { + "enum": [ + "AwsIntegration", + "Environment", + "GitHubIntegration", + "Grant", + "Invitation", + "Membership", + "Organization", + "Parameter", + "ParameterRule", + "ParameterType", + "ParameterTypeRule", + "Project", + "Pull", + "Push", + "ServiceAccount", + "Tag", + "Task", + "Template", + "Value" + ], + "type": "string" + }, + "OperationEnum": { + "enum": [ + "create", + "read", + "update", + "delete" + ], + "type": "string" + }, + "Organization": { + "type": "object", + "properties": { + "url": { "type": "string", "format": "uri", - "readOnly": true, - "nullable": true, - "description": "The environment affected by this step." - }, - "environment_id": { - "type": "string", - "format": "uuid", - "nullable": true, - "description": "The environment id involved in the operation." - }, - "environment_name": { - "type": "string", - "nullable": true, - "description": "The environment name involved in the operation.", - "maxLength": 256 + "readOnly": true }, - "project": { + "id": { "type": "string", - "format": "uri", "readOnly": true, - "nullable": true, - "description": "The project affected by this step." - }, - "project_id": { - "type": "string", - "format": "uuid", - "nullable": true, - "description": "The project id involved in the operation." + "description": "A unique identifier for the organization." }, - "project_name": { + "name": { "type": "string", - "nullable": true, - "description": "The project name involved in the operation.", + "description": "The organization name.", "maxLength": 256 }, - "parameter": { - "type": "string", - "format": "uri", - "readOnly": true, - "nullable": true, - "description": "The parameter affected by this step." - }, - "parameter_id": { + "project_name_pattern": { "type": "string", - "format": "uuid", - "nullable": true, - "description": "The parameter id involved in the operation." + "description": "A regular expression project names must match", + "maxLength": 255 }, - "parameter_name": { - "type": "string", - "nullable": true, - "description": "The parameter name involved in the operation.", - "maxLength": 256 + "maintenance": { + "type": "boolean", + "readOnly": true, + "description": "If set, we are performing maintenance on this organization and have disabled making changes" }, - "venue_id": { - "type": "string", - "nullable": true, - "description": "The integration-native id for the resource.", - "maxLength": 2048 + "mfa_enabled": { + "type": "boolean", + "description": "Multi-factor authentication for the organization" }, - "venue_name": { - "type": "string", - "nullable": true, - "description": "The name of the item or resource as known by the integration.", - "maxLength": 1024 + "version": { + "allOf": [ + { + "$ref": "#/components/schemas/VersionEnum" + } + ], + "readOnly": true, + "description": "The current version of this Organization" }, - "summary": { - "type": "string", - "nullable": true, - "description": "The summary of this step (what it was trying to do)." + "notification_config": { + "type": "object", + "additionalProperties": {} }, - "error_code": { - "type": "string", - "nullable": true, - "description": "An error code, if not successful.", - "maxLength": 256 + "current": { + "type": "boolean", + "readOnly": true, + "description": "Indicates if this Organization is the one currently targeted by the Bearer token used by the client to authorize." }, - "error_detail": { - "type": "string", - "nullable": true, - "description": "Details on the error that occurred during processing." + "role": { + "allOf": [ + { + "$ref": "#/components/schemas/RoleEnum" + } + ], + "readOnly": true, + "description": "Your role in the organization." }, - "created_at": { + "subscription_expires_at": { "type": "string", "format": "date-time", + "nullable": true, "readOnly": true }, - "modified_at": { - "type": "string", - "format": "date-time", - "readOnly": true - } - }, - "required": [ - "created_at", - "environment", - "id", - "modified_at", - "parameter", - "project", - "success", - "url" - ] - }, - "Grant": { - "type": "object", - "properties": { - "url": { - "type": "string", - "format": "uri", + "subscription_features": { + "type": "array", + "items": { + "type": "string" + }, "readOnly": true }, - "id": { + "subscription_id": { "type": "string", - "format": "uuid", - "readOnly": true, - "description": "A unique identifier for the grant." + "nullable": true, + "readOnly": true }, - "principal": { + "subscription_plan_id": { "type": "string", - "format": "uri", - "description": "The URI of a principal for the grant; this must describe a user." + "nullable": true, + "readOnly": true }, - "scope": { + "subscription_plan_name": { "type": "string", - "format": "uri", - "description": "The URI of a scope for the grant; this must describe a project or environment." - }, - "role": { - "allOf": [ - { - "$ref": "#/components/schemas/RoleEnum" - } - ], - "description": "The role that the principal has in the given scope." + "nullable": true, + "readOnly": true }, "created_at": { "type": "string", @@ -12165,557 +17371,585 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } }, "required": [ "created_at", + "current", "id", + "maintenance", "modified_at", - "principal", + "name", "role", - "scope", - "url" + "subscription_expires_at", + "subscription_features", + "subscription_id", + "subscription_plan_id", + "subscription_plan_name", + "url", + "version" ] }, - "HistoryModelEnum": { - "enum": [ - "Parameter", - "ParameterRule", - "Value" - ], - "type": "string" - }, - "HistoryTypeEnum": { - "enum": [ - "create", - "update", - "delete", - "nothing" - ], - "type": "string" - }, - "ImportCreateRequest": { + "OrganizationCreate": { "type": "object", "properties": { - "project": { + "name": { "type": "string", - "description": "Project name or identifier" + "description": "The organization name.", + "maxLength": 256 }, - "environment": { + "mfa_enabled": { + "type": "boolean", + "description": "Multi-factor authentication for the organization" + } + }, + "required": [ + "name" + ] + }, + "PaginatedAuditTrailList": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { "type": "string", "nullable": true, - "description": "Environment name or identifier" + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" }, - "body": { + "previous": { "type": "string", - "description": "Text to turn into variables" - }, - "secrets": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Parameter names that should be secrets" + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" }, - "ignore": { + "results": { "type": "array", "items": { - "type": "string" - }, - "description": "Parameter names to be ignored" - }, - "add_project": { - "type": "boolean", - "default": true, - "description": "Create the project (if it does not exist)" - }, - "add_environment": { - "type": "boolean", - "default": true, - "description": "Create the environment (if it does not exist)" - }, - "add_parameters": { - "type": "boolean", - "default": true, - "description": "Create the parameters (if they do not exist)" - }, - "add_overrides": { - "type": "boolean", - "default": true, - "description": "Create the environment value override (if they do not exist)" - }, - "inherit_on_same": { - "type": "boolean", - "default": true, - "description": "Skip adding a parameter override if it is the same" + "$ref": "#/components/schemas/AuditTrail" + } } - }, - "required": [ - "body", - "ignore", - "project", - "secrets" - ] + } }, - "ImportCreateResponse": { + "PaginatedAwsIntegrationList": { "type": "object", "properties": { - "parameter": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { "type": "array", "items": { - "$ref": "#/components/schemas/ImportParameter" - }, - "description": "Project parameter values after import" + "$ref": "#/components/schemas/AwsIntegration" + } } - }, - "required": [ - "parameter" - ] + } }, - "ImportParameter": { + "PaginatedAwsPullList": { "type": "object", - "description": "Describes an imported parameter.", "properties": { - "project_name": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { "type": "string", - "description": "Project name" + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" }, - "project_id": { + "previous": { "type": "string", "nullable": true, - "description": "Project identifier" + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" }, - "environment_name": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AwsPull" + } + } + } + }, + "PaginatedAwsPullTaskList": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { "type": "string", - "description": "Environment where parameter is defined" + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" }, - "environment_id": { + "previous": { "type": "string", "nullable": true, - "description": "Environment identifier where value is set" + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" }, - "parameter_name": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AwsPullTask" + } + } + } + }, + "PaginatedAwsPullTaskStepList": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { "type": "string", - "description": "Parameter name" + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" }, - "parameter_id": { + "previous": { "type": "string", "nullable": true, - "description": "Parameter identifier" + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" }, - "secret": { - "type": "boolean", - "default": false, - "description": "Whether to treat the parameter as a secret" + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AwsPullTaskStep" + } + } + } + }, + "PaginatedAwsPushList": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "example": 123 }, - "value": { + "next": { "type": "string", - "description": "Parameter value in the specified environment" + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" }, - "value_id": { + "previous": { "type": "string", "nullable": true, - "description": "Parameter value identifier in the environment" + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" }, - "created_at": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AwsPush" + } + } + } + }, + "PaginatedAwsPushTaskList": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { "type": "string", - "format": "date-time", "nullable": true, - "description": "Date and time the parameter value was created" + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" }, - "modified_at": { + "previous": { "type": "string", - "format": "date-time", "nullable": true, - "description": "Date and time the parameter value was updated" + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" }, - "action": { - "type": "string", - "description": "Action taken on environment value for parameter" + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AwsPushTask" + } } - }, - "required": [ - "action", - "created_at", - "environment_name", - "modified_at", - "parameter_name", - "project_name", - "value" - ] + } }, - "IntegrationNode": { + "PaginatedAwsPushTaskStepList": { "type": "object", - "description": "Describes the content available at a given location.", "properties": { - "fqn": { - "type": "string" - }, - "node_type": { - "$ref": "#/components/schemas/NodeTypeEnum" - }, - "secret": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "jmespath": { - "type": "string", - "nullable": true + "count": { + "type": "integer", + "example": 123 }, - "content_type": { + "next": { "type": "string", - "nullable": true + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" }, - "content_data": { + "previous": { "type": "string", - "nullable": true - }, - "content_size": { - "type": "integer", - "nullable": true + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" }, - "content_keys": { + "results": { "type": "array", "items": { - "type": "string" - }, - "nullable": true - }, - "venue_id": { - "type": "string", - "nullable": true + "$ref": "#/components/schemas/AwsPushTaskStep" + } } - }, - "required": [ - "fqn", - "node_type" - ] + } }, - "Invitation": { + "PaginatedAzureKeyVaultIntegrationList": { "type": "object", "properties": { - "url": { - "type": "string", - "format": "uri", - "readOnly": true + "count": { + "type": "integer", + "example": 123 }, - "id": { + "next": { "type": "string", - "format": "uuid", - "readOnly": true, - "description": "The unique identifier of an invitation." + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" }, - "email": { + "previous": { "type": "string", - "format": "email", - "description": "The email address of the user to be invited.", - "maxLength": 254 + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" }, - "role": { - "allOf": [ - { - "$ref": "#/components/schemas/RoleEnum" - } - ], - "description": "The role that the user will have in the organization, should the user accept." + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AzureKeyVaultIntegration" + } + } + } + }, + "PaginatedAzureKeyVaultPullList": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "example": 123 }, - "inviter": { + "next": { "type": "string", + "nullable": true, "format": "uri", - "readOnly": true, - "description": "The user that created the invitation." - }, - "inviter_name": { - "type": "string", - "readOnly": true, - "description": "The name of the user that created the invitation." + "example": "http://api.example.org/accounts/?page=4" }, - "state": { + "previous": { "type": "string", - "readOnly": true, - "description": "The current state of the invitation." + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" }, - "state_detail": { - "type": "string", - "readOnly": true, - "description": "Additional details about the state of the invitation." + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AzureKeyVaultPull" + } + } + } + }, + "PaginatedAzureKeyVaultPullTaskList": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "example": 123 }, - "membership": { + "next": { "type": "string", - "format": "uri", - "readOnly": true, "nullable": true, - "description": "The resulting membership, should the user accept." + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" }, - "organization": { + "previous": { "type": "string", + "nullable": true, "format": "uri", - "readOnly": true, - "description": "The organization that the user will become a member of, should the user accept." + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AzureKeyVaultPullTask" + } } - }, - "required": [ - "email", - "id", - "inviter", - "inviter_name", - "membership", - "organization", - "role", - "state", - "state_detail", - "url" - ] + } }, - "InvitationCreate": { + "PaginatedAzureKeyVaultPullTaskStepList": { "type": "object", "properties": { - "email": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { "type": "string", - "format": "email", - "description": "The email address of the user to be invited.", - "maxLength": 254 + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" }, - "role": { - "allOf": [ - { - "$ref": "#/components/schemas/RoleEnum" - } - ], - "description": "The role that the user will have in the organization, should the user accept." + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AzureKeyVaultPullTaskStep" + } } - }, - "required": [ - "email", - "role" - ] + } }, - "Membership": { + "PaginatedAzureKeyVaultPushList": { "type": "object", "properties": { - "url": { - "type": "string", - "format": "uri", - "readOnly": true - }, - "id": { - "type": "string", - "format": "uuid", - "readOnly": true, - "description": "A unique identifier for the membership." + "count": { + "type": "integer", + "example": 123 }, - "user": { + "next": { "type": "string", + "nullable": true, "format": "uri", - "description": "The user of the membership." + "example": "http://api.example.org/accounts/?page=4" }, - "organization": { + "previous": { "type": "string", + "nullable": true, "format": "uri", - "description": "The organization that the user is a member of." + "example": "http://api.example.org/accounts/?page=2" }, - "role": { - "allOf": [ - { - "$ref": "#/components/schemas/RoleEnum" - } - ], - "description": "The role that the user has in the organization." + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AzureKeyVaultPush" + } + } + } + }, + "PaginatedAzureKeyVaultPushTaskList": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "example": 123 }, - "created_at": { + "next": { "type": "string", - "format": "date-time", - "readOnly": true + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" }, - "modified_at": { + "previous": { "type": "string", - "format": "date-time", - "readOnly": true + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AzureKeyVaultPushTask" + } } - }, - "required": [ - "created_at", - "id", - "modified_at", - "organization", - "role", - "url", - "user" - ] + } }, - "MembershipCreate": { + "PaginatedAzureKeyVaultPushTaskStepList": { "type": "object", "properties": { - "user": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { "type": "string", + "nullable": true, "format": "uri", - "description": "The user of the membership." + "example": "http://api.example.org/accounts/?page=4" }, - "role": { - "allOf": [ - { - "$ref": "#/components/schemas/RoleEnum" - } - ], - "description": "The role that the user has in the organization." + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AzureKeyVaultPushTaskStep" + } } - }, - "required": [ - "role", - "user" - ] - }, - "ModeEnum": { - "enum": [ - "mapped", - "pattern" - ], - "type": "string" - }, - "NodeTypeEnum": { - "enum": [ - "directory", - "file", - "value" - ], - "type": "string" - }, - "ObjectTypeEnum": { - "enum": [ - "AwsIntegration", - "Environment", - "GitHubIntegration", - "Grant", - "Invitation", - "Membership", - "Organization", - "Parameter", - "ParameterRule", - "ParameterType", - "ParameterTypeRule", - "Project", - "Pull", - "Push", - "ServiceAccount", - "Tag", - "Task", - "Template", - "Value" - ], - "type": "string" - }, - "OperationEnum": { - "enum": [ - "create", - "read", - "update", - "delete" - ], - "type": "string" + } }, - "Organization": { + "PaginatedEnvironmentList": { "type": "object", "properties": { - "url": { - "type": "string", - "format": "uri", - "readOnly": true + "count": { + "type": "integer", + "example": 123 }, - "id": { + "next": { "type": "string", - "readOnly": true, - "description": "A unique identifier for the organization." + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" }, - "name": { + "previous": { "type": "string", - "description": "The organization name.", - "maxLength": 256 + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" }, - "current": { - "type": "boolean", - "readOnly": true, - "description": "Indicates if this Organization is the one currently targeted by the Bearer token used by the client to authorize." + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Environment" + } + } + } + }, + "PaginatedGitHubIntegrationList": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "example": 123 }, - "role": { - "allOf": [ - { - "$ref": "#/components/schemas/RoleEnum" - } - ], - "readOnly": true, - "description": "Your role in the organization." + "next": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" }, - "subscription_expires_at": { + "previous": { "type": "string", - "format": "date-time", "nullable": true, - "readOnly": true + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" }, - "subscription_features": { + "results": { "type": "array", "items": { - "type": "string" - }, - "readOnly": true + "$ref": "#/components/schemas/GitHubIntegration" + } + } + } + }, + "PaginatedGitHubPullList": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "example": 123 }, - "subscription_id": { + "next": { "type": "string", "nullable": true, - "readOnly": true + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" }, - "subscription_plan_id": { + "previous": { "type": "string", "nullable": true, - "readOnly": true + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" }, - "subscription_plan_name": { + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GitHubPull" + } + } + } + }, + "PaginatedGitHubPullTaskList": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { "type": "string", "nullable": true, - "readOnly": true + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" }, - "created_at": { + "previous": { "type": "string", - "format": "date-time", - "readOnly": true + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" }, - "modified_at": { - "type": "string", - "format": "date-time", - "readOnly": true + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GitHubPullTask" + } } - }, - "required": [ - "created_at", - "current", - "id", - "modified_at", - "name", - "role", - "subscription_expires_at", - "subscription_features", - "subscription_id", - "subscription_plan_id", - "subscription_plan_name", - "url" - ] + } }, - "OrganizationCreate": { + "PaginatedGitHubPullTaskStepList": { "type": "object", "properties": { - "name": { + "count": { + "type": "integer", + "example": 123 + }, + "next": { "type": "string", - "description": "The organization name.", - "maxLength": 256 + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=4" + }, + "previous": { + "type": "string", + "nullable": true, + "format": "uri", + "example": "http://api.example.org/accounts/?page=2" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GitHubPullTaskStep" + } } - }, - "required": [ - "name" - ] + } }, - "PaginatedAuditTrailList": { + "PaginatedGrantList": { "type": "object", "properties": { "count": { @@ -12737,12 +17971,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/AuditTrail" + "$ref": "#/components/schemas/Grant" } } } }, - "PaginatedAwsIntegrationList": { + "PaginatedGroupList": { "type": "object", "properties": { "count": { @@ -12764,12 +17998,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/AwsIntegration" + "$ref": "#/components/schemas/Group" } } } }, - "PaginatedAwsPullList": { + "PaginatedIntegrationNodeList": { "type": "object", "properties": { "count": { @@ -12791,12 +18025,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/AwsPull" + "$ref": "#/components/schemas/IntegrationNode" } } } }, - "PaginatedAwsPullTaskList": { + "PaginatedInvitationList": { "type": "object", "properties": { "count": { @@ -12818,12 +18052,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/AwsPullTask" + "$ref": "#/components/schemas/Invitation" } } } }, - "PaginatedAwsPullTaskStepList": { + "PaginatedMembershipList": { "type": "object", "properties": { "count": { @@ -12845,12 +18079,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/AwsPullTaskStep" + "$ref": "#/components/schemas/Membership" } } } }, - "PaginatedAwsPushList": { + "PaginatedOrganizationList": { "type": "object", "properties": { "count": { @@ -12872,12 +18106,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/AwsPush" + "$ref": "#/components/schemas/Organization" } } } }, - "PaginatedAwsPushTaskList": { + "PaginatedParameterDualityList": { "type": "object", "properties": { "count": { @@ -12899,12 +18133,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/AwsPushTask" + "$ref": "#/components/schemas/ParameterDuality" } } } }, - "PaginatedAwsPushTaskStepList": { + "PaginatedParameterList": { "type": "object", "properties": { "count": { @@ -12926,12 +18160,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/AwsPushTaskStep" + "$ref": "#/components/schemas/Parameter" } } } }, - "PaginatedEnvironmentList": { + "PaginatedParameterRuleList": { "type": "object", "properties": { "count": { @@ -12953,12 +18187,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/Environment" + "$ref": "#/components/schemas/ParameterRule" } } } }, - "PaginatedGitHubIntegrationList": { + "PaginatedParameterTypeList": { "type": "object", "properties": { "count": { @@ -12980,12 +18214,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/GitHubIntegration" + "$ref": "#/components/schemas/ParameterType" } } } }, - "PaginatedGitHubPullList": { + "PaginatedParameterTypeRuleList": { "type": "object", "properties": { "count": { @@ -13007,12 +18241,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/GitHubPull" + "$ref": "#/components/schemas/ParameterTypeRule" } } } }, - "PaginatedGitHubPullTaskList": { + "PaginatedProjectList": { "type": "object", "properties": { "count": { @@ -13034,12 +18268,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/GitHubPullTask" + "$ref": "#/components/schemas/Project" } } } }, - "PaginatedGitHubPullTaskStepList": { + "PaginatedServiceAccountList": { "type": "object", "properties": { "count": { @@ -13061,12 +18295,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/GitHubPullTaskStep" + "$ref": "#/components/schemas/ServiceAccount" } } } }, - "PaginatedGrantList": { + "PaginatedTagList": { "type": "object", "properties": { "count": { @@ -13088,12 +18322,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/Grant" + "$ref": "#/components/schemas/Tag" } } } }, - "PaginatedIntegrationNodeList": { + "PaginatedTaskStepList": { "type": "object", "properties": { "count": { @@ -13115,12 +18349,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/IntegrationNode" + "$ref": "#/components/schemas/TaskStep" } } } }, - "PaginatedInvitationList": { + "PaginatedTemplateList": { "type": "object", "properties": { "count": { @@ -13142,12 +18376,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/Invitation" + "$ref": "#/components/schemas/Template" } } } }, - "PaginatedMembershipList": { + "PaginatedUserList": { "type": "object", "properties": { "count": { @@ -13169,12 +18403,12 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/Membership" + "$ref": "#/components/schemas/User" } } } }, - "PaginatedOrganizationList": { + "PaginatedValueList": { "type": "object", "properties": { "count": { @@ -13196,422 +18430,548 @@ "results": { "type": "array", "items": { - "$ref": "#/components/schemas/Organization" + "$ref": "#/components/schemas/Value" } } } }, - "PaginatedParameterDualityList": { + "Parameter": { + "type": "object", + "description": "A single parameter inside of a project.", + "properties": { + "url": { + "type": "string", + "format": "uri", + "readOnly": true, + "description": "The parameter url." + }, + "id": { + "type": "string", + "readOnly": true + }, + "ledger_id": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "description": "The parameter name." + }, + "description": { + "type": "string" + }, + "secret": { + "type": "boolean", + "readOnly": true + }, + "type": { + "type": "string", + "description": "\n The type of this Parameter. If not provided, this will default to\n a string for Parameters that are not overrides or to the overridden\n Parameter's type for Parameters that are overrides.\n " + }, + "rules": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ParameterRule" + }, + "readOnly": true, + "description": "Rules applied to this parameter." + }, + "project": { + "type": "string", + "format": "uri", + "readOnly": true, + "description": "The project url." + }, + "project_name": { + "type": "string", + "readOnly": true, + "description": "The project name that the parameter is within." + }, + "referencing_templates": { + "type": "array", + "items": { + "type": "string" + }, + "readOnly": true, + "description": "Templates that reference this Parameter. This field is not valid for history requests." + }, + "referencing_values": { + "type": "array", + "items": { + "type": "string" + }, + "readOnly": true, + "description": "Dynamic values that reference this Parameter. This field is not valid for history requests." + }, + "values": { + "type": "object", + "additionalProperties": { + "allOf": [ + { + "$ref": "#/components/schemas/Value" + } + ], + "nullable": true + }, + "readOnly": true, + "description": "\n This dictionary has keys that correspond to environment urls, and values\n that correspond to the effective value for this parameter in that environment.\n Each parameter has an effective value in every environment based on\n project dependencies and environment inheritance.\n\n The effective value is found by looking (within the keyed environment) up\n the project dependencies by parameter name. If a value is not found, the\n parent environment is consulted with the same logic to locate a value. It\n is possible for there to be a `null` value record for an environment, which\n means there is no value set; it is also possible for there to be a value record\n with a `value` of `null`, which means the value was explicitly set to `null`.\n\n If the value's parameter does not match the enclosing parameter (holding the\n values array) then that value is flowing in through project dependencies.\n Clients must recognize this in case the user asks to modify the value; in this\n case the client must POST a new Value to the current parameter to override the\n value coming in from the project dependency.\n\n If the Value.environment matches the key, then it is an explicit value set for\n that environment. If they differ, the value was obtained from a parent\n environment (directly or indirectly). If the value is None then no value has\n ever been set in any environment for this parameter within all the project\n dependencies.\n " + }, + "values_flat": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Value" + }, + "readOnly": true, + "description": "\n Identical to values, except the dictionary is flattened to a list.\n Note that in this case, the environment in the Value is the environment\n asked for, not the environment where it was obtained.\n " + }, + "overrides": { + "type": "string", + "format": "uri", + "readOnly": true, + "nullable": true, + "description": "If this parameter's project depends on another project which provides a parameter of the same name, this parameter overrides the one provided by the dependee. You can use this field to determine if there will be side-effects the user should know about when deleting a parameter. Deleting a parameter that overrides another one due to an identical name will uncover the one from the dependee project." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + }, + "expires": { + "type": "string", + "nullable": true + }, + "expiration_action": { + "type": "object", + "additionalProperties": {}, + "nullable": true + }, + "expired_status": { + "type": "object", + "additionalProperties": {}, + "nullable": true, + "readOnly": true, + "description": "If this parameter expires, the status of the last attempt to handle its expiration" + } + }, + "required": [ + "created_at", + "expired_status", + "id", + "ledger_id", + "modified_at", + "name", + "overrides", + "project", + "project_name", + "referencing_templates", + "referencing_values", + "rules", + "secret", + "url", + "values", + "values_flat" + ] + }, + "ParameterCopy": { "type": "object", + "description": "A single parameter inside of a project.", "properties": { - "count": { - "type": "integer", - "example": 123 + "name": { + "type": "string", + "description": "The parameter name.", + "maxLength": 256 }, - "next": { + "description": { "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=4" + "description": "A description of the parameter. You may find it helpful to document how this parameter is used to assist others when they need to maintain software that uses this content." }, - "previous": { + "project": { "type": "string", - "nullable": true, "format": "uri", - "example": "http://api.example.org/accounts/?page=2" - }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ParameterDuality" - } + "description": "The project url." } - } + }, + "required": [ + "name", + "project" + ] }, - "PaginatedParameterList": { + "ParameterCreate": { "type": "object", + "description": "A single parameter inside of a project.", "properties": { - "count": { - "type": "integer", - "example": 123 - }, - "next": { + "name": { "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=4" + "description": "The parameter name.", + "maxLength": 256 }, - "previous": { + "description": { "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=2" + "description": "A description of the parameter. You may find it helpful to document how this parameter is used to assist others when they need to maintain software that uses this content." }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Parameter" - } - } - } - }, - "PaginatedParameterRuleList": { - "type": "object", - "properties": { - "count": { - "type": "integer", - "example": 123 + "secret": { + "type": "boolean", + "description": "Indicates if this content is secret or not. External values are inspected on-demand to ensure they align with the parameter's secret setting and if they do not, those external values are not allowed to be used." }, - "next": { + "type": { "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=4" + "description": "\n The type of this Parameter. If not provided, this will default to\n a string for Parameters that are not overrides or to the overridden\n Parameter's type for Parameters that are overrides.\n " }, - "previous": { + "expires": { "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=2" + "nullable": true }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ParameterRule" - } + "expiration_action": { + "type": "object", + "additionalProperties": {}, + "nullable": true } - } + }, + "required": [ + "name" + ] }, - "PaginatedParameterTypeList": { + "ParameterDuality": { "type": "object", + "description": "Details about a parameter at two timepoints.\n\nIf t1 or t2 is null then the parameter did not exist at that\ntimepoint.", "properties": { - "count": { - "type": "integer", - "example": 123 - }, - "next": { - "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=4" + "t1": { + "allOf": [ + { + "$ref": "#/components/schemas/Parameter" + } + ], + "nullable": true }, - "previous": { + "t2": { + "allOf": [ + { + "$ref": "#/components/schemas/Parameter" + } + ], + "nullable": true + } + }, + "required": [ + "t1", + "t2" + ] + }, + "ParameterExport": { + "type": "object", + "properties": { + "body": { "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=2" + "readOnly": true, + "description": "The exported parameter body." }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ParameterType" - } + "has_secret": { + "type": "boolean", + "readOnly": true, + "description": "If True, the exported parameters include one or more secrets." } - } + }, + "required": [ + "body", + "has_secret" + ] }, - "PaginatedParameterTypeRuleList": { + "ParameterRule": { "type": "object", + "description": "A type of `ModelSerializer` that uses hyperlinked relationships with compound keys instead\nof primary key relationships. Specifically:\n\n* A 'url' field is included instead of the 'id' field.\n* Relationships to other instances are hyperlinks, instead of primary keys.\n\nNOTE: this only works with DRF 3.1.0 and above.", "properties": { - "count": { - "type": "integer", - "example": 123 - }, - "next": { + "url": { "type": "string", - "nullable": true, "format": "uri", - "example": "http://api.example.org/accounts/?page=4" + "readOnly": true, + "description": "The URL for the parameter rule." }, - "previous": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true + }, + "parameter": { "type": "string", - "nullable": true, "format": "uri", - "example": "http://api.example.org/accounts/?page=2" + "readOnly": true, + "description": "The parameter this rule is for." }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ParameterTypeRule" - } - } - } - }, - "PaginatedProjectList": { - "type": "object", - "properties": { - "count": { - "type": "integer", - "example": 123 + "type": { + "$ref": "#/components/schemas/ParameterRuleTypeEnum" }, - "next": { + "constraint": { "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=4" + "maxLength": 1024 }, - "previous": { + "created_at": { "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=2" + "format": "date-time", + "readOnly": true }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Project" - } + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true } - } + }, + "required": [ + "constraint", + "created_at", + "id", + "modified_at", + "parameter", + "type", + "url" + ] }, - "PaginatedServiceAccountList": { + "ParameterRuleCreate": { "type": "object", + "description": "A type of `ModelSerializer` that uses hyperlinked relationships with compound keys instead\nof primary key relationships. Specifically:\n\n* A 'url' field is included instead of the 'id' field.\n* Relationships to other instances are hyperlinks, instead of primary keys.\n\nNOTE: this only works with DRF 3.1.0 and above.", "properties": { - "count": { - "type": "integer", - "example": 123 - }, - "next": { - "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=4" + "type": { + "$ref": "#/components/schemas/ParameterRuleTypeEnum" }, - "previous": { + "constraint": { "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=2" - }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ServiceAccount" - } + "maxLength": 1024 } - } + }, + "required": [ + "constraint", + "type" + ] + }, + "ParameterRuleTypeEnum": { + "enum": [ + "min", + "max", + "min_len", + "max_len", + "regex" + ], + "type": "string" }, - "PaginatedTagList": { + "ParameterRuleUpdate": { "type": "object", + "description": "A type of `ModelSerializer` that uses hyperlinked relationships with compound keys instead\nof primary key relationships. Specifically:\n\n* A 'url' field is included instead of the 'id' field.\n* Relationships to other instances are hyperlinks, instead of primary keys.\n\nNOTE: this only works with DRF 3.1.0 and above.", "properties": { - "count": { - "type": "integer", - "example": 123 + "id": { + "type": "string", + "format": "uuid", + "readOnly": true }, - "next": { + "parameter": { "type": "string", - "nullable": true, "format": "uri", - "example": "http://api.example.org/accounts/?page=4" + "readOnly": true, + "description": "The parameter this rule is for." }, - "previous": { + "type": { + "$ref": "#/components/schemas/ParameterRuleTypeEnum" + }, + "constraint": { "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=2" + "maxLength": 1024 }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Tag" - } + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true } - } + }, + "required": [ + "constraint", + "created_at", + "id", + "modified_at", + "parameter", + "type" + ] }, - "PaginatedTaskStepList": { + "ParameterTimeline": { "type": "object", "properties": { "count": { "type": "integer", - "example": 123 - }, - "next": { - "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=4" + "description": "The number of records in this response." }, - "previous": { + "next_as_of": { "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=2" + "format": "date-time", + "description": "If present, additional history can be retrieved using this timestamp in the next call for the as_of query parameter value." }, "results": { "type": "array", "items": { - "$ref": "#/components/schemas/TaskStep" + "$ref": "#/components/schemas/ParameterTimelineEntry" } } - } + }, + "required": [ + "count", + "results" + ] }, - "PaginatedTemplateList": { + "ParameterTimelineEntry": { "type": "object", + "description": "Details about a single change.", "properties": { - "count": { - "type": "integer", - "example": 123 + "history_type": { + "allOf": [ + { + "$ref": "#/components/schemas/HistoryTypeEnum" + } + ], + "readOnly": true }, - "next": { + "modified_at": { "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=4" + "format": "date-time", + "readOnly": true, + "nullable": true }, - "previous": { - "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=2" + "modified_by": { + "type": "string" }, - "results": { + "history_environments": { "type": "array", "items": { - "$ref": "#/components/schemas/Template" - } + "$ref": "#/components/schemas/ParameterTimelineEntryEnvironment" + }, + "readOnly": true, + "description": "The affected environment(s)." + }, + "history_model": { + "allOf": [ + { + "$ref": "#/components/schemas/HistoryModelEnum" + } + ], + "readOnly": true, + "description": "The component of the parameter that changed." + }, + "history_parameter": { + "allOf": [ + { + "$ref": "#/components/schemas/ParameterTimelineEntryParameter" + } + ], + "readOnly": true, + "description": "The affected parameter." } - } + }, + "required": [ + "history_environments", + "history_model", + "history_parameter", + "history_type", + "modified_at" + ] }, - "PaginatedUserList": { + "ParameterTimelineEntryEnvironment": { "type": "object", "properties": { - "count": { - "type": "integer", - "example": 123 - }, - "next": { + "environment_id": { "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=4" + "format": "uuid", + "description": "A unique identifier for the environment.", + "readOnly": true, + "nullable": true }, - "previous": { + "name": { "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=2" + "description": "The environment name." }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/User" - } + "override": { + "type": "boolean", + "readOnly": true, + "description": "Indicates if the value change was direct or if it flowed into the environment. If `true` then the value was actually set directly into this environment. If `false` then the environment has no value set directly so it inherited the value from its parent." } - } + }, + "required": [ + "environment_id", + "name", + "override" + ] }, - "PaginatedValueList": { + "ParameterTimelineEntryParameter": { "type": "object", "properties": { - "count": { - "type": "integer", - "example": 123 - }, - "next": { + "parameter_id": { "type": "string", + "format": "uuid", + "description": "A unique identifier for the parameter.", "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=4" + "readOnly": true }, - "previous": { + "name": { "type": "string", - "nullable": true, - "format": "uri", - "example": "http://api.example.org/accounts/?page=2" - }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Value" - } + "description": "The parameter name." } - } + }, + "required": [ + "name", + "parameter_id" + ] }, - "Parameter": { + "ParameterType": { "type": "object", - "description": "A single parameter inside of a project.", "properties": { "url": { "type": "string", "format": "uri", - "readOnly": true + "readOnly": true, + "description": "The URL for the parameter type." }, "id": { "type": "string", "format": "uuid", "readOnly": true, - "description": "A unique identifier for the parameter." + "description": "A unique identifier for the parameter type." }, "name": { "type": "string", - "description": "The parameter name.", + "description": "The parameter type name.", "maxLength": 256 }, "description": { "type": "string", - "description": "A description of the parameter. You may find it helpful to document how this parameter is used to assist others when they need to maintain software that uses this content." - }, - "secret": { - "type": "boolean", - "description": "Indicates if this content is secret or not. When a parameter is considered to be a secret, any internal values are stored in a dedicated vault for your organization for maximum security. External values are inspected on-demand to ensure they align with the parameter's secret setting and if they do not, those external values are not allowed to be used." - }, - "type": { - "type": "string", - "default": "string", - "description": "The type of this Parameter." + "description": "A description of the parameter type, provide documentation on how to use this type here." }, "rules": { "type": "array", "items": { - "$ref": "#/components/schemas/ParameterRule" + "$ref": "#/components/schemas/ParameterTypeRule" }, "readOnly": true, "description": "Rules applied to this parameter." }, - "project": { - "type": "string", - "format": "uri", - "readOnly": true, - "description": "The project that the parameter is within." - }, - "project_name": { + "parent": { "type": "string", + "format": "uri", "readOnly": true, - "description": "The project name that the parameter is within." - }, - "referencing_templates": { - "type": "array", - "items": { - "type": "string" - }, - "readOnly": true, - "description": "Templates that reference this Parameter." - }, - "referencing_values": { - "type": "array", - "items": { - "type": "string" - }, - "readOnly": true, - "description": "Dynamic values that reference this Parameter." - }, - "values": { - "type": "object", - "additionalProperties": { - "allOf": [ - { - "$ref": "#/components/schemas/Value" - } - ], - "nullable": true - }, - "readOnly": true, - "description": "\n This dictionary has keys that correspond to environment urls, and values\n that correspond to the effective value for this parameter in that environment.\n Each parameter has an effective value in every environment based on\n project dependencies and environment inheritance.\n\n The effective value is found by looking (within the keyed environment) up\n the project dependencies by parameter name. If a value is not found, the\n parent environment is consulted with the same logic to locate a value. It\n is possible for there to be a `null` value record for an environment, which\n means there is no value set; it is also possible for there to be a value record\n with a `value` of `null`, which means the value was explicitly set to `null`.\n\n If the value's parameter does not match the enclosing parameter (holding the\n values array) then that value is flowing in through project dependencies.\n Clients must recognize this in case the user asks to modify the value; in this\n case the client must POST a new Value to the current parameter to override the\n value coming in from the project dependency.\n\n If the Value.environment matches the key, then it is an explicit value set for\n that environment. If they differ, the value was obtained from a parent\n environment (directly or indirectly). If the value is None then no value has\n ever been set in any environment for this parameter within all the project\n dependencies.\n " + "nullable": true, + "description": "The URL for this parameter type's parent" }, - "overrides": { + "parent_name": { "type": "string", - "format": "uri", "readOnly": true, "nullable": true, - "description": "If this parameter's project depends on another project which provides a parameter of the same name, this parameter overrides the one provided by the dependee. You can use this field to determine if there will be side-effects the user should know about when deleting a parameter. Deleting a parameter that overrides another one due to an identical name will uncover the one from the dependee project." + "description": "Name of the parent ParameterType (if any)." }, "created_at": { "type": "string", @@ -13621,7 +18981,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } }, "required": [ @@ -13629,99 +18990,55 @@ "id", "modified_at", "name", - "overrides", - "project", - "project_name", - "referencing_templates", - "referencing_values", + "parent", + "parent_name", "rules", - "url", - "values" + "url" ] }, - "ParameterCreate": { + "ParameterTypeCreate": { "type": "object", - "description": "A single parameter inside of a project.", "properties": { "name": { "type": "string", - "description": "The parameter name.", + "description": "The parameter type name.", "maxLength": 256 }, "description": { "type": "string", - "description": "A description of the parameter. You may find it helpful to document how this parameter is used to assist others when they need to maintain software that uses this content." - }, - "secret": { - "type": "boolean", - "description": "Indicates if this content is secret or not. When a parameter is considered to be a secret, any internal values are stored in a dedicated vault for your organization for maximum security. External values are inspected on-demand to ensure they align with the parameter's secret setting and if they do not, those external values are not allowed to be used." + "description": "A description of the parameter type, provide documentation on how to use this type here." }, - "type": { + "parent": { "type": "string", - "default": "string", - "description": "The type of this Parameter." - } - }, - "required": [ - "name" - ] - }, - "ParameterDuality": { - "type": "object", - "description": "Details about a parameter at two timepoints.\n\nIf t1 or t2 is null then the parameter did not exist at that\ntimepoint.", - "properties": { - "t1": { - "allOf": [ - { - "$ref": "#/components/schemas/Parameter" - } - ], - "nullable": true - }, - "t2": { - "allOf": [ - { - "$ref": "#/components/schemas/Parameter" - } - ], - "nullable": true - } - }, - "required": [ - "t1", - "t2" - ] - }, - "ParameterExport": { - "type": "object", - "properties": { - "body": { - "type": "string" + "format": "uri", + "description": "The URL for this parameter type's parent" } }, "required": [ - "body" + "name", + "parent" ] }, - "ParameterRule": { + "ParameterTypeRule": { "type": "object", "description": "A type of `ModelSerializer` that uses hyperlinked relationships with compound keys instead\nof primary key relationships. Specifically:\n\n* A 'url' field is included instead of the 'id' field.\n* Relationships to other instances are hyperlinks, instead of primary keys.\n\nNOTE: this only works with DRF 3.1.0 and above.", "properties": { "url": { "type": "string", "format": "uri", - "readOnly": true + "readOnly": true, + "description": "The URL for the project." }, "id": { "type": "string", "format": "uuid", "readOnly": true }, - "parameter": { + "parameter_type": { "type": "string", "format": "uri", "readOnly": true, - "description": "The parameter this rule is for." + "description": "The type this rule is for." }, "type": { "$ref": "#/components/schemas/ParameterRuleTypeEnum" @@ -13738,7 +19055,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } }, "required": [ @@ -13746,12 +19064,12 @@ "created_at", "id", "modified_at", - "parameter", + "parameter_type", "type", "url" ] }, - "ParameterRuleCreate": { + "ParameterTypeRuleCreate": { "type": "object", "description": "A type of `ModelSerializer` that uses hyperlinked relationships with compound keys instead\nof primary key relationships. Specifically:\n\n* A 'url' field is included instead of the 'id' field.\n* Relationships to other instances are hyperlinks, instead of primary keys.\n\nNOTE: this only works with DRF 3.1.0 and above.", "properties": { @@ -13768,143 +19086,172 @@ "type" ] }, - "ParameterRuleTypeEnum": { - "enum": [ - "min", - "max", - "min_len", - "max_len", - "regex" - ], - "type": "string" - }, - "ParameterTimeline": { + "ParameterTypeRuleUpdate": { "type": "object", + "description": "A type of `ModelSerializer` that uses hyperlinked relationships with compound keys instead\nof primary key relationships. Specifically:\n\n* A 'url' field is included instead of the 'id' field.\n* Relationships to other instances are hyperlinks, instead of primary keys.\n\nNOTE: this only works with DRF 3.1.0 and above.", "properties": { - "count": { - "type": "integer", - "description": "The number of records in this response." + "id": { + "type": "string", + "format": "uuid", + "readOnly": true }, - "next_as_of": { + "parameter_type": { + "type": "string", + "format": "uri", + "readOnly": true, + "description": "The type this rule is for." + }, + "type": { + "$ref": "#/components/schemas/ParameterRuleTypeEnum" + }, + "constraint": { + "type": "string", + "maxLength": 1024 + }, + "created_at": { "type": "string", "format": "date-time", - "description": "If present, additional history can be retrieved using this timestamp in the next call for the as_of query parameter value." + "readOnly": true }, - "results": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ParameterTimelineEntry" - } + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true } }, "required": [ - "count", - "results" + "constraint", + "created_at", + "id", + "modified_at", + "parameter_type", + "type" ] }, - "ParameterTimelineEntry": { + "ParameterTypeUpdate": { "type": "object", - "description": "Details about a single change.", "properties": { - "history_date": { + "id": { "type": "string", - "format": "date-time" + "format": "uuid", + "readOnly": true, + "description": "A unique identifier for the parameter type." }, - "history_type": { - "allOf": [ - { - "$ref": "#/components/schemas/HistoryTypeEnum" - } - ], - "readOnly": true + "name": { + "type": "string", + "description": "The parameter type name.", + "maxLength": 256 }, - "history_user": { + "description": { "type": "string", - "description": "The unique identifier of a user.", - "nullable": true + "description": "A description of the parameter type, provide documentation on how to use this type here." }, - "history_environments": { + "parent": { + "type": "string", + "format": "uri", + "description": "The URL for this parameter type's parent" + }, + "rules": { "type": "array", "items": { - "$ref": "#/components/schemas/ParameterTimelineEntryEnvironment" + "$ref": "#/components/schemas/ParameterTypeRule" }, "readOnly": true, - "description": "The affected environment(s)." + "description": "Rules applied to this parameter." }, - "history_model": { - "allOf": [ - { - "$ref": "#/components/schemas/HistoryModelEnum" - } - ], - "readOnly": true, - "description": "The component of the parameter that changed." + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true }, - "history_parameter": { - "allOf": [ - { - "$ref": "#/components/schemas/ParameterTimelineEntryParameter" - } - ], + "modified_at": { + "type": "string", + "format": "date-time", "readOnly": true, - "description": "The affected parameter." + "nullable": true } }, "required": [ - "history_date", - "history_environments", - "history_model", - "history_parameter", - "history_type" + "created_at", + "id", + "modified_at", + "name", + "parent", + "rules" ] }, - "ParameterTimelineEntryEnvironment": { + "ParameterUpdate": { "type": "object", + "description": "A single parameter inside of a project.", "properties": { "id": { "type": "string", - "format": "uuid", - "readOnly": true, - "description": "A unique identifier for the environment." + "readOnly": true }, "name": { "type": "string", - "description": "The environment name.", + "description": "The parameter name.", "maxLength": 256 }, - "override": { + "description": { + "type": "string", + "description": "A description of the parameter. You may find it helpful to document how this parameter is used to assist others when they need to maintain software that uses this content." + }, + "secret": { "type": "boolean", "readOnly": true, - "description": "Indicates if the value change was direct or if it flowed into the environment. If `true` then the value was actually set directly into this environment. If `false` then the environment has no value set directly so it inherited the value from its parent." - } - }, - "required": [ - "id", - "name", - "override" - ] - }, - "ParameterTimelineEntryParameter": { - "type": "object", - "properties": { - "id": { + "description": "Indicates if this content is secret or not. External values are inspected on-demand to ensure they align with the parameter's secret setting and if they do not, those external values are not allowed to be used." + }, + "type": { "type": "string", - "format": "uuid", + "description": "\n The type of this Parameter. If not provided, this will default to\n a string for Parameters that are not overrides or to the overridden\n Parameter's type for Parameters that are overrides.\n " + }, + "project": { + "type": "string", + "format": "uri", + "readOnly": true, + "description": "The project url." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", "readOnly": true, - "description": "A unique identifier for the parameter." + "nullable": true + }, + "expires": { + "type": "string", + "nullable": true + }, + "expiration_action": { + "type": "object", + "additionalProperties": {}, + "nullable": true }, - "name": { - "type": "string", - "description": "The parameter name.", - "maxLength": 256 + "expired_status": { + "type": "object", + "additionalProperties": {}, + "nullable": true, + "readOnly": true, + "description": "If this parameter expires, the status of the last attempt to handle its expiration" } }, "required": [ + "created_at", + "expired_status", "id", - "name" + "modified_at", + "name", + "project", + "secret" ] }, - "ParameterType": { + "PatchedAwsIntegration": { "type": "object", "properties": { "url": { @@ -13916,36 +19263,36 @@ "type": "string", "format": "uuid", "readOnly": true, - "description": "A unique identifier for the parameter type." + "description": "The unique identifier for the integration." }, "name": { "type": "string", - "description": "The parameter type name.", - "maxLength": 256 + "readOnly": true }, "description": { "type": "string", - "description": "A description of the parameter type, provide documentation on how to use this type here." + "description": "An optional description for the integration." }, - "rules": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ParameterTypeRule" - }, + "status": { + "allOf": [ + { + "$ref": "#/components/schemas/StatusEnum" + } + ], "readOnly": true, - "description": "Rules applied to this parameter." + "description": "The status of the integration connection with the third-party provider as of the `status_last_checked_at` field. The status is updated automatically by the server when the integration is modified." }, - "parent": { + "status_detail": { "type": "string", - "format": "uri", - "nullable": true, - "description": "All types must derive, either directly or indirectly, from one of the CloudTruth built-in types. This is the ParameterType that this type is derived from." + "readOnly": true, + "description": "If an error occurs, more details will be available in this field." }, - "parent_name": { + "status_last_checked_at": { "type": "string", + "format": "date-time", "readOnly": true, "nullable": true, - "description": "Name of the parent ParameterType (if any)." + "description": "The last time the status was evaluated." }, "created_at": { "type": "string", @@ -13955,45 +19302,72 @@ "modified_at": { "type": "string", "format": "date-time", + "readOnly": true, + "nullable": true + }, + "fqn": { + "type": "string", "readOnly": true - } - }, - "required": [ - "created_at", - "id", - "modified_at", - "name", - "parent_name", - "rules", - "url" - ] - }, - "ParameterTypeCreate": { - "type": "object", - "properties": { - "name": { + }, + "type": { "type": "string", - "description": "The parameter type name.", - "maxLength": 256 + "readOnly": true, + "description": "The type of integration." }, - "description": { + "writable": { + "type": "boolean", + "description": "Allow actions to write to the integration." + }, + "aws_account_id": { "type": "string", - "description": "A description of the parameter type, provide documentation on how to use this type here." + "description": "The AWS Account ID.", + "pattern": "^[0-9]+$", + "maxLength": 12, + "minLength": 12 }, - "parent": { + "aws_enabled_regions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AwsRegionEnum" + }, + "description": "The AWS regions to integrate with." + }, + "aws_enabled_services": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AwsServiceEnum" + }, + "description": "The AWS services to integrate with." + }, + "aws_external_id": { + "type": "string", + "readOnly": true, + "description": "This is a shared secret between the AWS Administrator who set up your IAM trust relationship and your CloudTruth AWS Integration. CloudTruth will generate a random value for you to give to your AWS Administrator in order to create the necessary IAM role for proper access." + }, + "aws_kms_key_id": { "type": "string", - "format": "uri", "nullable": true, - "description": "All types must derive, either directly or indirectly, from one of the CloudTruth built-in types. This is the ParameterType that this type is derived from." + "description": "If present, this is the KMS Key Id that is used to push values. This key must be accessible in the AWS account (it cannot be an ARN to a key in another AWS account). ", + "pattern": "^[a-zA-Z0-9:/_\\-]+$", + "maxLength": 256 + }, + "aws_role_name": { + "type": "string", + "description": "The role that CloudTruth will assume when interacting with your AWS Account through this integration. The role is configured by your AWS Account Administrator. If your AWS Administrator provided you with a value use it, otherwise make your own role name and give it to your AWS Administrator.", + "pattern": "^[\\w+=,.@\\-]+$", + "maxLength": 64, + "minLength": 2 + }, + "resource_tags": { + "type": "object", + "additionalProperties": {}, + "description": "A list of tags to be set on all integration resources." } - }, - "required": [ - "name" - ] + } }, - "ParameterTypeRule": { + "PatchedAwsPull": { "type": "object", - "description": "A type of `ModelSerializer` that uses hyperlinked relationships with compound keys instead\nof primary key relationships. Specifically:\n\n* A 'url' field is included instead of the 'id' field.\n* Relationships to other instances are hyperlinks, instead of primary keys.\n\nNOTE: this only works with DRF 3.1.0 and above.", + "description": "Pull actions can be configured to get configuration and secrets from\nintegrations on demand.", "properties": { "url": { "type": "string", @@ -14003,20 +19377,27 @@ "id": { "type": "string", "format": "uuid", - "readOnly": true - }, - "parameter_type": { - "type": "string", - "format": "uri", "readOnly": true, - "description": "The type this rule is for." + "description": "Unique identifier for the action." }, - "type": { - "$ref": "#/components/schemas/ParameterRuleTypeEnum" + "name": { + "type": "string", + "description": "The action name.", + "maxLength": 256 }, - "constraint": { + "description": { "type": "string", - "maxLength": 1024 + "description": "The optional description for the action." + }, + "latest_task": { + "allOf": [ + { + "$ref": "#/components/schemas/AwsPullTask" + } + ], + "readOnly": true, + "nullable": true, + "description": "The most recent task run for this action." }, "created_at": { "type": "string", @@ -14026,37 +19407,128 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true + }, + "create_environments": { + "type": "boolean", + "description": "Allow the pull to create environments. Any automatically created environments will be children of the `default` environment. If an environment needs to be created but the action does not allow it, a task step will be added with a null operation, and success_detail will indicate the action did not allow it." + }, + "create_projects": { + "type": "boolean", + "description": "Allow the pull to create projects. If a project needs to be created but the action does not allow it, a task step will be added with a null operation, and success_detail will indicate the action did not allow it." + }, + "dry_run": { + "type": "boolean", + "description": "When set to dry-run mode an action will report the changes that it would have made in task steps, however those changes are not actually performed." + }, + "mapped_values": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ValueCreate" + }, + "readOnly": true, + "description": "Values being managed by a mapped pull." + }, + "mode": { + "allOf": [ + { + "$ref": "#/components/schemas/ModeEnum" + } + ], + "readOnly": true, + "description": "The pull mode used.\n\nA pattern pull uses a pattern-matching resource string with mustache-style markers to identify the project, parameter, and environment names, or with a Python regular expression that uses named capture groups that define the same three concepts.\n\nA mapped pull uses a specific resource and JMESpath expression to deliver a value to a specific project, parameter, and environment. This leverages external value linkages made in the value editor, and there is one mapped pull per integration provided by the system so that you can trigger external value pull synchronizations." + }, + "region": { + "allOf": [ + { + "$ref": "#/components/schemas/AwsRegionEnum" + } + ], + "description": "The AWS region to use. This region must be enabled in the integration." + }, + "service": { + "allOf": [ + { + "$ref": "#/components/schemas/AwsServiceEnum" + } + ], + "description": "The AWS service to use. This service must be enabled in the integration." + }, + "resource": { + "type": "string", + "nullable": true, + "description": "Defines a pattern matching string that contains either mustache or regular expression syntax (with named capture groups) that locate the environment, project, and parameter name of the content you are looking for.\n\nIf you are using mustache pattern matching, use:\n\n - ``{{ environment }}`` to identify the environment name\n - ``{{ parameter }}`` to identify the parameter name\n - ``{{ project }}`` to identify the project name\n\nIf you are using a regular expression, use Python syntax with named capture groups that locate the `environment`, `project`, and `parameter`.", + "maxLength": 1024 } - }, - "required": [ - "constraint", - "created_at", - "id", - "modified_at", - "parameter_type", - "type", - "url" - ] + } }, - "ParameterTypeRuleCreate": { + "PatchedAwsPushUpdate": { "type": "object", - "description": "A type of `ModelSerializer` that uses hyperlinked relationships with compound keys instead\nof primary key relationships. Specifically:\n\n* A 'url' field is included instead of the 'id' field.\n* Relationships to other instances are hyperlinks, instead of primary keys.\n\nNOTE: this only works with DRF 3.1.0 and above.", + "description": "Update a push. The `region` and `service` cannot be changed on an existing push.", "properties": { - "type": { - "$ref": "#/components/schemas/ParameterRuleTypeEnum" + "name": { + "type": "string", + "description": "The action name.", + "maxLength": 256 + }, + "description": { + "type": "string", + "description": "The optional description for the action." + }, + "projects": { + "type": "array", + "items": { + "type": "string", + "format": "uri" + }, + "description": "Projects that are included in the push." + }, + "tags": { + "type": "array", + "items": { + "type": "string", + "format": "uri" + }, + "description": "Tags are used to select parameters by environment from the projects included in the push. You cannot have two tags from the same environment in the same push." + }, + "resource": { + "type": "string", + "nullable": true, + "description": "Defines a path through the integration to the location where values will be pushed.\n\nThe following mustache-style substitutions can be used in the string:\n\n - ``{{ environment }}`` to insert the environment name\n - ``{{ parameter }}`` to insert the parameter name\n - ``{{ project }}`` to insert the project name\n - ``{{ push }}`` to insert the push name\n - ``{{ tag }}`` to insert the tag name\n\nWe recommend that you use project, environment, and parameter at a minimum to disambiguate your pushed resource identifiers.\n\nIf you include multiple projects in the push, the `project` substitution is required. If you include multiple tags from different environments in the push, the `environment` substitution is required. If you include multiple tags from the same environment in the push, the `tag` substitution is required. In all cases, the `parameter` substitution is always required.", + "maxLength": 1024 + }, + "dry_run": { + "type": "boolean", + "description": "When set to dry-run mode an action will report the changes that it would have made in task steps, however those changes are not actually performed." + }, + "force": { + "type": "boolean", + "description": "Normally, push will check to see if it originated the values in the destination before making changes to them. Forcing a push disables the ownership check." }, - "constraint": { - "type": "string", - "maxLength": 1024 + "local": { + "type": "boolean", + "description": "Normally, push will process all parameters including those that flow in from project dependencies. Declaring a push as `local` will cause it to only process the parameters defined in the selected projects." + }, + "coerce_parameters": { + "type": "boolean", + "description": "This setting allows parameters (non-secrets) to be pushed to a destination that only supports storing secrets. This may increase your overall cost from the cloud provider as some cloud providers charge a premium for secrets-only storage." + }, + "include_parameters": { + "type": "boolean", + "description": "Include parameters (non-secrets) in the values being pushed. This setting requires the destination to support parameters or for the `coerce_parameters` flag to be enabled, otherwise the push will fail." + }, + "include_secrets": { + "type": "boolean", + "description": "Include secrets in the values being pushed. This setting requires the destination to support secrets, otherwise the push will fail." + }, + "include_templates": { + "type": "boolean", + "description": "Include templates in the values being pushed." } - }, - "required": [ - "constraint", - "type" - ] + } }, - "PatchedAwsIntegration": { + "PatchedAzureKeyVaultIntegration": { "type": "object", "properties": { "url": { @@ -14096,6 +19568,7 @@ "type": "string", "format": "date-time", "readOnly": true, + "nullable": true, "description": "The last time the status was evaluated." }, "created_at": { @@ -14106,7 +19579,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true }, "fqn": { "type": "string", @@ -14121,48 +19595,25 @@ "type": "boolean", "description": "Allow actions to write to the integration." }, - "aws_account_id": { - "type": "string", - "description": "The AWS Account ID.", - "pattern": "^[0-9]+$", - "maxLength": 12, - "minLength": 12 - }, - "aws_enabled_regions": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AwsRegionEnum" - }, - "description": "The AWS regions to integrate with." - }, - "aws_enabled_services": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AwsServiceEnum" - }, - "description": "The AWS services to integrate with." + "resource_tags": { + "type": "object", + "additionalProperties": {}, + "description": "A list of tags to be set on all integration resources." }, - "aws_external_id": { + "vault_name": { "type": "string", "readOnly": true, - "description": "This is a shared secret between the AWS Administrator who set up your IAM trust relationship and your CloudTruth AWS Integration. CloudTruth will generate a random value for you to give to your AWS Administrator in order to create the necessary IAM role for proper access." - }, - "aws_kms_key_id": { - "type": "string", - "nullable": true, - "description": "If present, this is the KMS Key Id that is used to push values. This key must be accessible in the AWS account (it cannot be an ARN to a key in another AWS account). ", - "pattern": "^[a-zA-Z0-9:/_\\-]+$", - "maxLength": 256 + "description": "The Azure Key Vault name." }, - "aws_role_name": { + "tenant_id": { "type": "string", - "description": "The role that CloudTruth will assume when interacting with your AWS Account through this integration. The role is configured by your AWS Account Administrator. If your AWS Administrator provided you with a value use it, otherwise make your own role name and give it to your AWS Administrator.", - "pattern": "^[\\w+=,.@\\-]+$", - "maxLength": 64 + "format": "uuid", + "readOnly": true, + "description": "The Azure Tenant ID." } } }, - "PatchedAwsPull": { + "PatchedAzureKeyVaultPull": { "type": "object", "description": "Pull actions can be configured to get configuration and secrets from\nintegrations on demand.", "properties": { @@ -14189,7 +19640,7 @@ "latest_task": { "allOf": [ { - "$ref": "#/components/schemas/AwsPullTask" + "$ref": "#/components/schemas/AzureKeyVaultPullTask" } ], "readOnly": true, @@ -14204,7 +19655,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true }, "create_environments": { "type": "boolean", @@ -14221,7 +19673,7 @@ "mapped_values": { "type": "array", "items": { - "$ref": "#/components/schemas/Value" + "$ref": "#/components/schemas/ValueCreate" }, "readOnly": true, "description": "Values being managed by a mapped pull." @@ -14235,32 +19687,17 @@ "readOnly": true, "description": "The pull mode used.\n\nA pattern pull uses a pattern-matching resource string with mustache-style markers to identify the project, parameter, and environment names, or with a Python regular expression that uses named capture groups that define the same three concepts.\n\nA mapped pull uses a specific resource and JMESpath expression to deliver a value to a specific project, parameter, and environment. This leverages external value linkages made in the value editor, and there is one mapped pull per integration provided by the system so that you can trigger external value pull synchronizations." }, - "region": { - "allOf": [ - { - "$ref": "#/components/schemas/AwsRegionEnum" - } - ], - "description": "The AWS region to use. This region must be enabled in the integration." - }, - "service": { - "allOf": [ - { - "$ref": "#/components/schemas/AwsServiceEnum" - } - ], - "description": "The AWS service to use. This service must be enabled in the integration." - }, "resource": { "type": "string", + "nullable": true, "description": "Defines a pattern matching string that contains either mustache or regular expression syntax (with named capture groups) that locate the environment, project, and parameter name of the content you are looking for.\n\nIf you are using mustache pattern matching, use:\n\n - ``{{ environment }}`` to identify the environment name\n - ``{{ parameter }}`` to identify the parameter name\n - ``{{ project }}`` to identify the project name\n\nIf you are using a regular expression, use Python syntax with named capture groups that locate the `environment`, `project`, and `parameter`.", "maxLength": 1024 } } }, - "PatchedAwsPushUpdate": { + "PatchedAzureKeyVaultPushUpdate": { "type": "object", - "description": "Update a push. The `region` and `service` cannot be changed on an existing push.", + "description": "Update a push.", "properties": { "name": { "type": "string", @@ -14319,19 +19756,12 @@ } } }, - "PatchedEnvironment": { + "PatchedEnvironmentUpdate": { "type": "object", "properties": { - "url": { - "type": "string", - "format": "uri", - "readOnly": true - }, "id": { "type": "string", - "format": "uuid", - "readOnly": true, - "description": "A unique identifier for the environment." + "readOnly": true }, "name": { "type": "string", @@ -14379,7 +19809,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } } }, @@ -14425,7 +19856,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true }, "create_environments": { "type": "boolean", @@ -14442,7 +19874,7 @@ "mapped_values": { "type": "array", "items": { - "$ref": "#/components/schemas/Value" + "$ref": "#/components/schemas/ValueCreate" }, "readOnly": true, "description": "Values being managed by a mapped pull." @@ -14458,7 +19890,7 @@ } } }, - "PatchedGrant": { + "PatchedGrantUpdate": { "type": "object", "properties": { "url": { @@ -14475,12 +19907,12 @@ "principal": { "type": "string", "format": "uri", - "description": "The URI of a principal for the grant; this must describe a user." + "description": "The URI of a principal for the grant; this must reference a user or group." }, "scope": { "type": "string", "format": "uri", - "description": "The URI of a scope for the grant; this must describe a project or environment." + "description": "The URI of a scope for the grant; this must reference a project or environment." }, "role": { "allOf": [ @@ -14496,9 +19928,53 @@ "readOnly": true }, "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + } + } + }, + "PatchedGroup": { + "type": "object", + "properties": { + "url": { + "type": "string", + "format": "uri", + "readOnly": true + }, + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "description": "The unique identifier of a group." + }, + "name": { + "type": "string", + "description": "The group name.", + "maxLength": 150 + }, + "description": { + "type": "string", + "description": "A description of the group. You may find it helpful to document how this group is used to assist others when they need to maintain this organization." + }, + "users": { + "type": "array", + "items": { + "type": "string", + "format": "uri" + } + }, + "created_at": { "type": "string", "format": "date-time", "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true } } }, @@ -14606,7 +20082,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } } }, @@ -14628,147 +20105,74 @@ "description": "The organization name.", "maxLength": 256 }, - "current": { + "project_name_pattern": { + "type": "string", + "description": "A regular expression project names must match", + "maxLength": 255 + }, + "maintenance": { "type": "boolean", "readOnly": true, - "description": "Indicates if this Organization is the one currently targeted by the Bearer token used by the client to authorize." + "description": "If set, we are performing maintenance on this organization and have disabled making changes" }, - "role": { + "mfa_enabled": { + "type": "boolean", + "description": "Multi-factor authentication for the organization" + }, + "version": { "allOf": [ { - "$ref": "#/components/schemas/RoleEnum" + "$ref": "#/components/schemas/VersionEnum" } ], "readOnly": true, - "description": "Your role in the organization." - }, - "subscription_expires_at": { - "type": "string", - "format": "date-time", - "nullable": true, - "readOnly": true - }, - "subscription_features": { - "type": "array", - "items": { - "type": "string" - }, - "readOnly": true - }, - "subscription_id": { - "type": "string", - "nullable": true, - "readOnly": true - }, - "subscription_plan_id": { - "type": "string", - "nullable": true, - "readOnly": true - }, - "subscription_plan_name": { - "type": "string", - "nullable": true, - "readOnly": true - }, - "created_at": { - "type": "string", - "format": "date-time", - "readOnly": true - }, - "modified_at": { - "type": "string", - "format": "date-time", - "readOnly": true - } - } - }, - "PatchedParameter": { - "type": "object", - "description": "A single parameter inside of a project.", - "properties": { - "url": { - "type": "string", - "format": "uri", - "readOnly": true - }, - "id": { - "type": "string", - "format": "uuid", - "readOnly": true, - "description": "A unique identifier for the parameter." - }, - "name": { - "type": "string", - "description": "The parameter name.", - "maxLength": 256 + "description": "The current version of this Organization" }, - "description": { - "type": "string", - "description": "A description of the parameter. You may find it helpful to document how this parameter is used to assist others when they need to maintain software that uses this content." + "notification_config": { + "type": "object", + "additionalProperties": {} }, - "secret": { + "current": { "type": "boolean", - "description": "Indicates if this content is secret or not. When a parameter is considered to be a secret, any internal values are stored in a dedicated vault for your organization for maximum security. External values are inspected on-demand to ensure they align with the parameter's secret setting and if they do not, those external values are not allowed to be used." - }, - "type": { - "type": "string", - "default": "string", - "description": "The type of this Parameter." - }, - "rules": { - "type": "array", - "items": { - "$ref": "#/components/schemas/ParameterRule" - }, "readOnly": true, - "description": "Rules applied to this parameter." + "description": "Indicates if this Organization is the one currently targeted by the Bearer token used by the client to authorize." }, - "project": { - "type": "string", - "format": "uri", + "role": { + "allOf": [ + { + "$ref": "#/components/schemas/RoleEnum" + } + ], "readOnly": true, - "description": "The project that the parameter is within." + "description": "Your role in the organization." }, - "project_name": { + "subscription_expires_at": { "type": "string", - "readOnly": true, - "description": "The project name that the parameter is within." - }, - "referencing_templates": { - "type": "array", - "items": { - "type": "string" - }, - "readOnly": true, - "description": "Templates that reference this Parameter." + "format": "date-time", + "nullable": true, + "readOnly": true }, - "referencing_values": { + "subscription_features": { "type": "array", "items": { "type": "string" }, - "readOnly": true, - "description": "Dynamic values that reference this Parameter." + "readOnly": true }, - "values": { - "type": "object", - "additionalProperties": { - "allOf": [ - { - "$ref": "#/components/schemas/Value" - } - ], - "nullable": true - }, - "readOnly": true, - "description": "\n This dictionary has keys that correspond to environment urls, and values\n that correspond to the effective value for this parameter in that environment.\n Each parameter has an effective value in every environment based on\n project dependencies and environment inheritance.\n\n The effective value is found by looking (within the keyed environment) up\n the project dependencies by parameter name. If a value is not found, the\n parent environment is consulted with the same logic to locate a value. It\n is possible for there to be a `null` value record for an environment, which\n means there is no value set; it is also possible for there to be a value record\n with a `value` of `null`, which means the value was explicitly set to `null`.\n\n If the value's parameter does not match the enclosing parameter (holding the\n values array) then that value is flowing in through project dependencies.\n Clients must recognize this in case the user asks to modify the value; in this\n case the client must POST a new Value to the current parameter to override the\n value coming in from the project dependency.\n\n If the Value.environment matches the key, then it is an explicit value set for\n that environment. If they differ, the value was obtained from a parent\n environment (directly or indirectly). If the value is None then no value has\n ever been set in any environment for this parameter within all the project\n dependencies.\n " + "subscription_id": { + "type": "string", + "nullable": true, + "readOnly": true }, - "overrides": { + "subscription_plan_id": { "type": "string", - "format": "uri", - "readOnly": true, "nullable": true, - "description": "If this parameter's project depends on another project which provides a parameter of the same name, this parameter overrides the one provided by the dependee. You can use this field to determine if there will be side-effects the user should know about when deleting a parameter. Deleting a parameter that overrides another one due to an identical name will uncover the one from the dependee project." + "readOnly": true + }, + "subscription_plan_name": { + "type": "string", + "nullable": true, + "readOnly": true }, "created_at": { "type": "string", @@ -14778,19 +20182,15 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } } }, - "PatchedParameterRule": { + "PatchedParameterRuleUpdate": { "type": "object", "description": "A type of `ModelSerializer` that uses hyperlinked relationships with compound keys instead\nof primary key relationships. Specifically:\n\n* A 'url' field is included instead of the 'id' field.\n* Relationships to other instances are hyperlinks, instead of primary keys.\n\nNOTE: this only works with DRF 3.1.0 and above.", "properties": { - "url": { - "type": "string", - "format": "uri", - "readOnly": true - }, "id": { "type": "string", "format": "uuid", @@ -14817,18 +20217,49 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } } }, - "PatchedParameterType": { + "PatchedParameterTypeRuleUpdate": { "type": "object", + "description": "A type of `ModelSerializer` that uses hyperlinked relationships with compound keys instead\nof primary key relationships. Specifically:\n\n* A 'url' field is included instead of the 'id' field.\n* Relationships to other instances are hyperlinks, instead of primary keys.\n\nNOTE: this only works with DRF 3.1.0 and above.", "properties": { - "url": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true + }, + "parameter_type": { "type": "string", "format": "uri", + "readOnly": true, + "description": "The type this rule is for." + }, + "type": { + "$ref": "#/components/schemas/ParameterRuleTypeEnum" + }, + "constraint": { + "type": "string", + "maxLength": 1024 + }, + "created_at": { + "type": "string", + "format": "date-time", "readOnly": true }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + } + } + }, + "PatchedParameterTypeUpdate": { + "type": "object", + "properties": { "id": { "type": "string", "format": "uuid", @@ -14844,6 +20275,11 @@ "type": "string", "description": "A description of the parameter type, provide documentation on how to use this type here." }, + "parent": { + "type": "string", + "format": "uri", + "description": "The URL for this parameter type's parent" + }, "rules": { "type": "array", "items": { @@ -14852,18 +20288,6 @@ "readOnly": true, "description": "Rules applied to this parameter." }, - "parent": { - "type": "string", - "format": "uri", - "nullable": true, - "description": "All types must derive, either directly or indirectly, from one of the CloudTruth built-in types. This is the ParameterType that this type is derived from." - }, - "parent_name": { - "type": "string", - "readOnly": true, - "nullable": true, - "description": "Name of the parent ParameterType (if any)." - }, "created_at": { "type": "string", "format": "date-time", @@ -14872,36 +20296,42 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } } }, - "PatchedParameterTypeRule": { + "PatchedParameterUpdate": { "type": "object", - "description": "A type of `ModelSerializer` that uses hyperlinked relationships with compound keys instead\nof primary key relationships. Specifically:\n\n* A 'url' field is included instead of the 'id' field.\n* Relationships to other instances are hyperlinks, instead of primary keys.\n\nNOTE: this only works with DRF 3.1.0 and above.", + "description": "A single parameter inside of a project.", "properties": { - "url": { + "id": { "type": "string", - "format": "uri", "readOnly": true }, - "id": { + "name": { "type": "string", - "format": "uuid", - "readOnly": true + "description": "The parameter name.", + "maxLength": 256 }, - "parameter_type": { + "description": { "type": "string", - "format": "uri", + "description": "A description of the parameter. You may find it helpful to document how this parameter is used to assist others when they need to maintain software that uses this content." + }, + "secret": { + "type": "boolean", "readOnly": true, - "description": "The type this rule is for." + "description": "Indicates if this content is secret or not. External values are inspected on-demand to ensure they align with the parameter's secret setting and if they do not, those external values are not allowed to be used." }, "type": { - "$ref": "#/components/schemas/ParameterRuleTypeEnum" + "type": "string", + "description": "\n The type of this Parameter. If not provided, this will default to\n a string for Parameters that are not overrides or to the overridden\n Parameter's type for Parameters that are overrides.\n " }, - "constraint": { + "project": { "type": "string", - "maxLength": 1024 + "format": "uri", + "readOnly": true, + "description": "The project url." }, "created_at": { "type": "string", @@ -14911,23 +20341,33 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true + }, + "expires": { + "type": "string", + "nullable": true + }, + "expiration_action": { + "type": "object", + "additionalProperties": {}, + "nullable": true + }, + "expired_status": { + "type": "object", + "additionalProperties": {}, + "nullable": true, + "readOnly": true, + "description": "If this parameter expires, the status of the last attempt to handle its expiration" } } }, - "PatchedProject": { + "PatchedProjectUpdate": { "type": "object", "properties": { - "url": { - "type": "string", - "format": "uri", - "readOnly": true - }, "id": { "type": "string", - "format": "uuid", - "readOnly": true, - "description": "A unique identifier for the project." + "readOnly": true }, "name": { "type": "string", @@ -14938,14 +20378,10 @@ "type": "string", "description": "A description of the project. You may find it helpful to document how this project is used to assist others when they need to maintain software that uses this content." }, - "dependents": { - "type": "array", - "items": { - "type": "string", - "format": "uri" - }, - "readOnly": true, - "description": "This is the opposite of `depends_on`, see that field for more details." + "parameter_name_pattern": { + "type": "string", + "description": "A regular expression parameter names must match", + "maxLength": 256 }, "depends_on": { "type": "string", @@ -14967,13 +20403,6 @@ "readOnly": true, "description": "Your role in the project, if the project is access-controlled." }, - "pushes": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AwsPush" - }, - "readOnly": true - }, "created_at": { "type": "string", "format": "date-time", @@ -14982,7 +20411,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } } }, @@ -14998,6 +20428,11 @@ "type": "string", "readOnly": true }, + "owner": { + "type": "string", + "format": "uri", + "nullable": true + }, "user": { "allOf": [ { @@ -15010,6 +20445,13 @@ "type": "string", "description": "An optional description of the process or system using the service account." }, + "keys": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ServiceAccountAPIKey" + }, + "readOnly": true + }, "created_at": { "type": "string", "format": "date-time", @@ -15018,7 +20460,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true }, "last_used_at": { "type": "string", @@ -15054,24 +20497,20 @@ "format": "date-time", "nullable": true, "description": "The point in time this tag represents. If explicitly set to `null` then the current time will be used." + }, + "immutable": { + "type": "boolean", + "description": "If True, this tag cannot be modified once it is created." } } }, - "PatchedTemplate": { + "PatchedTemplateUpdate": { "type": "object", "description": "A parameter template in a given project, optionally instantiated against an environment.", "properties": { - "url": { - "type": "string", - "format": "uri", - "readOnly": true, - "description": "The templates this value references, if interpolated." - }, "id": { "type": "string", - "format": "uuid", - "readOnly": true, - "description": "A unique identifier for the template." + "readOnly": true }, "name": { "type": "string", @@ -15091,43 +20530,6 @@ "type": "string", "description": "The content of the template. Use mustache-style templating delimiters of `{{` and `}}` to reference parameter values by name for substitution into the template result." }, - "referenced_parameters": { - "type": "array", - "items": { - "type": "string" - }, - "readOnly": true, - "description": "Parameters that this template references." - }, - "referenced_templates": { - "type": "array", - "items": { - "type": "string" - }, - "readOnly": true, - "description": "Other templates that this template references." - }, - "referencing_templates": { - "type": "array", - "items": { - "type": "string" - }, - "readOnly": true, - "description": "Other templates that reference this template." - }, - "referencing_values": { - "type": "array", - "items": { - "type": "string" - }, - "readOnly": true, - "description": "The dynamic values that reference this template." - }, - "has_secret": { - "type": "boolean", - "readOnly": true, - "description": "If True, this template contains secrets." - }, "created_at": { "type": "string", "format": "date-time", @@ -15136,47 +20538,29 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } } }, - "PatchedValue": { + "PatchedUpdateUser": { "type": "object", - "description": "A value for a parameter in a given environment.", "properties": { - "url": { - "type": "string", - "format": "uri", - "readOnly": true - }, - "id": { - "type": "string", - "format": "uuid", - "readOnly": true, - "description": "A unique identifier for the value." - }, - "environment": { - "type": "string", - "format": "uri", - "readOnly": true, - "description": "The environment this value is set in." - }, - "environment_name": { - "type": "string", - "readOnly": true, - "description": "The environment name for this value. This is a convenience to avoid another query against the server to resolve the environment url into a name." - }, - "earliest_tag": { - "type": "string", + "chatgpt_threads": { + "type": "object", + "additionalProperties": {}, "nullable": true, - "readOnly": true, - "description": "The earliest tag name this value appears in (within the value's environment)." - }, - "parameter": { + "description": "The threads this user is participating in with ChatGPT." + } + } + }, + "PatchedValueUpdate": { + "type": "object", + "description": "Unlike other UpdateSerializers, we do not inherit from the CreateSerializer here\nbecause `environment` is not a required field for updates.", + "properties": { + "id": { "type": "string", - "format": "uri", - "readOnly": true, - "description": "The parameter this value is for." + "readOnly": true }, "external": { "type": "boolean", @@ -15192,66 +20576,27 @@ "description": "If the value is `external`, the content returned by the integration can be reduced by applying a JMESpath expression. This is valid as long as the content is structured and of a supported format. JMESpath expressions are supported on `json`, `yaml`, and `dotenv` content.", "maxLength": 1024 }, - "external_error": { - "type": "string", - "nullable": true, - "readOnly": true, - "description": "This field is deprecated and unused." - }, - "external_status": { - "allOf": [ - { - "$ref": "#/components/schemas/TaskStep" - } - ], - "readOnly": true, - "nullable": true, - "description": "The most recent mapped pull status for an external value." - }, "internal_value": { "type": "string", "nullable": true, - "description": "This is the content to use when resolving the Value for an internal non-secret, or when storing a secret. When storing a secret, this content is stored in your organization's dedicated vault and this field is cleared. This field is required if the value is being created or updated and is `internal`. This field cannot be specified when creating or updating an `external` value.", - "maxLength": 16384 + "description": "This is the content to use when resolving the Value for an internal non-secret, or when storing a secret. This field cannot be specified when creating or updating an `external` value.", + "maxLength": 65536 }, "interpolated": { "type": "boolean", "description": "If `true`, apply template substitution rules to this value. If `false`, this value is a literal value. Note: secrets cannot be interpolated." }, - "value": { - "type": "string", - "nullable": true, - "readOnly": true, - "description": "This is the actual content of the Value for the given parameter in the given environment.\n\nIf you request secret masking, no secret content will be included in the result and instead a series of asterisks will be used instead for the value. If you request wrapping, the secret content will be wrapped in an envelope that is bound to your JWT token. For more information about secret wrapping, see the docs.\n\nClients applying this value to a shell environment should set `=` even if `value` is the empty string. If `value` is `null`, the client should unset that shell environment variable." - }, - "evaluated": { - "type": "boolean", - "readOnly": true, - "description": "If true, the `value` field has undergone template evaluation." - }, "secret": { "type": "boolean", "nullable": true, "readOnly": true, - "description": "Indicates the value content is a secret. Normally this is `true` when the parameter is a secret, however it is possible for a parameter to be a secret with a external value that is not a secret. It is not possible to convert a parameter from a secret to a non-secret if any of the values are external and a secret. Clients can check this condition by leveraging this field." - }, - "referenced_parameters": { - "type": "array", - "items": { - "type": "string", - "format": "uri" - }, - "readOnly": true, - "description": "The parameters this value references, if interpolated." + "description": "Indicates the value content is a secret. Normally this is `true` when the parameter is a secret. It is possible for a parameter to be a secret with a external value that is not a secret. It is not possible to convert a parameter from a secret to a non-secret if any of the values are external and a secret. Clients can check this condition by leveraging this field. It is also possible for a parameter to not be a secret but for this value to be dynamic and reference a Parameter that is a secret. In this case, we indicate the value is a secret." }, - "referenced_templates": { - "type": "array", - "items": { - "type": "string", - "format": "uri" - }, + "value": { + "type": "string", + "nullable": true, "readOnly": true, - "description": "The templates this value references, if interpolated." + "description": "This is the actual content of the Value for the given parameter in the given environment.\n\nIf you request secret masking, no secret content will be included in the result and instead a series of asterisks will be used instead for the value.\n\nClients applying this value to a shell environment should set `=` even if `value` is the empty string. If `value` is `null`, the client should unset that shell environment variable." }, "created_at": { "type": "string", @@ -15261,7 +20606,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } } }, @@ -15271,17 +20617,24 @@ "url": { "type": "string", "format": "uri", - "readOnly": true + "readOnly": true, + "description": "The URL for the project." }, "id": { "type": "string", - "format": "uuid", - "readOnly": true, - "description": "A unique identifier for the project." + "readOnly": true + }, + "ledger_id": { + "type": "string", + "readOnly": true }, "name": { "type": "string", - "description": "The project name.", + "description": "The project name." + }, + "parameter_name_pattern": { + "type": "string", + "description": "A regular expression parameter names must match", "maxLength": 256 }, "description": { @@ -15300,6 +20653,7 @@ "depends_on": { "type": "string", "format": "uri", + "readOnly": true, "nullable": true, "description": "Project dependencies allow projects to be used for shared configuration, for example a database used by many applications needs to advertise its port number.\n\nProjects can depend on another project which will add the parameters from the parent project into the current project. All of the parameter names between the two projects must be unique. When retrieving values or rendering templates, all of the parameters from the parent project will also be available in the current project." }, @@ -15320,9 +20674,18 @@ "pushes": { "type": "array", "items": { - "$ref": "#/components/schemas/AwsPush" + "type": "string" }, - "readOnly": true + "readOnly": true, + "description": "Deprecated. Blank." + }, + "push_urls": { + "type": "array", + "items": { + "type": "string" + }, + "readOnly": true, + "description": "Deprecated. Blank." }, "created_at": { "type": "string", @@ -15332,20 +20695,60 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } }, "required": [ "created_at", "dependents", + "depends_on", "id", + "ledger_id", "modified_at", "name", + "push_urls", "pushes", "role", "url" ] }, + "ProjectCopy": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The project name.", + "maxLength": 256 + }, + "description": { + "type": "string", + "description": "A description of the project. You may find it helpful to document how this project is used to assist others when they need to maintain software that uses this content." + }, + "child_project_names": { + "type": "object", + "additionalProperties": { + "type": "string", + "description": "The name to use for the copied child Project." + }, + "nullable": true, + "description": "When copying child Project, this indicates what name to use for each Project. If no name is provided for a given child Project, a \"-1\" will be appended to its name. Note that this name mapping can be used for Projects of any level of depth in the parent-child hierarchy." + }, + "recursive": { + "type": "boolean", + "description": "If true, copy child projects recursively. If false, only copy the specified project." + }, + "depends_on": { + "type": "string", + "format": "uri", + "nullable": true, + "description": "Project dependencies allow projects to be used for shared configuration, for example a database used by many applications needs to advertise its port number.\n\nProjects can depend on another project which will add the parameters from the parent project into the current project. All of the parameter names between the two projects must be unique. When retrieving values or rendering templates, all of the parameters from the parent project will also be available in the current project." + } + }, + "required": [ + "name" + ] + }, "ProjectCreate": { "type": "object", "properties": { @@ -15358,17 +20761,89 @@ "type": "string", "description": "A description of the project. You may find it helpful to document how this project is used to assist others when they need to maintain software that uses this content." }, + "parameter_name_pattern": { + "type": "string", + "description": "A regular expression parameter names must match", + "maxLength": 256 + }, "depends_on": { "type": "string", "format": "uri", "nullable": true, "description": "Project dependencies allow projects to be used for shared configuration, for example a database used by many applications needs to advertise its port number.\n\nProjects can depend on another project which will add the parameters from the parent project into the current project. All of the parameter names between the two projects must be unique. When retrieving values or rendering templates, all of the parameters from the parent project will also be available in the current project." + }, + "copy_rbac": { + "type": "boolean", + "writeOnly": true, + "default": false, + "description": "If depends_on is set and has RBAC enabled and this field is True, RBAC will be enabled and grants from the dependency are copied to this project. If depends_on is set and has RBAC enabled and this field is False, RBAC will be enabled but only the minimal necessary grants will be assigned to the newly created project. Not used when depends_on is not set or RBAC is not enabled for the dependency." } }, "required": [ "name" ] }, + "ProjectUpdate": { + "type": "object", + "properties": { + "id": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "description": "The project name.", + "maxLength": 256 + }, + "description": { + "type": "string", + "description": "A description of the project. You may find it helpful to document how this project is used to assist others when they need to maintain software that uses this content." + }, + "parameter_name_pattern": { + "type": "string", + "description": "A regular expression parameter names must match", + "maxLength": 256 + }, + "depends_on": { + "type": "string", + "format": "uri", + "nullable": true, + "description": "Project dependencies allow projects to be used for shared configuration, for example a database used by many applications needs to advertise its port number.\n\nProjects can depend on another project which will add the parameters from the parent project into the current project. All of the parameter names between the two projects must be unique. When retrieving values or rendering templates, all of the parameters from the parent project will also be available in the current project." + }, + "access_controlled": { + "type": "boolean", + "description": "Indicates if access control is being enforced through grants." + }, + "role": { + "allOf": [ + { + "$ref": "#/components/schemas/RoleEnum" + } + ], + "nullable": true, + "readOnly": true, + "description": "Your role in the project, if the project is access-controlled." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + } + }, + "required": [ + "created_at", + "id", + "modified_at", + "name", + "role" + ] + }, "RoleEnum": { "enum": [ "OWNER", @@ -15390,6 +20865,11 @@ "type": "string", "readOnly": true }, + "owner": { + "type": "string", + "format": "uri", + "nullable": true + }, "user": { "allOf": [ { @@ -15402,6 +20882,13 @@ "type": "string", "description": "An optional description of the process or system using the service account." }, + "keys": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ServiceAccountAPIKey" + }, + "readOnly": true + }, "created_at": { "type": "string", "format": "date-time", @@ -15410,7 +20897,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true }, "last_used_at": { "type": "string", @@ -15423,12 +20911,52 @@ "required": [ "created_at", "id", + "keys", "last_used_at", "modified_at", "url", "user" ] }, + "ServiceAccountAPIKey": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "A free-form name for the API key. Need not be unique. 50 characters max.", + "maxLength": 50 + }, + "prefix": { + "type": "string", + "readOnly": true + }, + "revoked": { + "type": "boolean", + "description": "If the API key is revoked, clients cannot use it anymore. (This cannot be undone.)" + }, + "has_expired": { + "type": "boolean", + "readOnly": true + }, + "created": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "expiry_date": { + "type": "string", + "format": "date-time", + "nullable": true, + "title": "Expires", + "description": "Once API key expires, clients cannot use it anymore." + } + }, + "required": [ + "created", + "has_expired", + "prefix" + ] + }, "ServiceAccountCreateRequest": { "type": "object", "properties": { @@ -15440,6 +20968,16 @@ "description": { "type": "string", "description": "An optional description of the process or system using the service account." + }, + "role": { + "type": "string", + "writeOnly": true, + "description": "The role for the service acount" + }, + "owner": { + "type": "string", + "description": "The owner of the service account.", + "maxLength": 128 } }, "required": [ @@ -15458,6 +20996,11 @@ "type": "string", "readOnly": true }, + "owner": { + "type": "string", + "format": "uri", + "nullable": true + }, "user": { "allOf": [ { @@ -15470,6 +21013,13 @@ "type": "string", "description": "An optional description of the process or system using the service account." }, + "keys": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ServiceAccountAPIKey" + }, + "readOnly": true + }, "created_at": { "type": "string", "format": "date-time", @@ -15478,7 +21028,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true }, "last_used_at": { "type": "string", @@ -15494,13 +21045,47 @@ } }, "required": [ - "apikey", - "created_at", - "id", - "last_used_at", - "modified_at", - "url", - "user" + "apikey", + "created_at", + "id", + "keys", + "last_used_at", + "modified_at", + "url", + "user" + ] + }, + "ServiceAccountRekeyRequest": { + "type": "object", + "properties": { + "expire_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "The date and time the previous API key will expire." + } + } + }, + "ServiceAccountUpdateRequest": { + "type": "object", + "properties": { + "description": { + "type": "string", + "description": "An optional description of the process or system using the service account." + }, + "role": { + "type": "string", + "readOnly": true, + "description": "The role for the service acount" + }, + "owner": { + "type": "string", + "description": "The owner of the service account.", + "maxLength": 128 + } + }, + "required": [ + "role" ] }, "StateEnum": { @@ -15531,7 +21116,8 @@ "url": { "type": "string", "format": "uri", - "readOnly": true + "readOnly": true, + "description": "The URL for the tag." }, "id": { "type": "string", @@ -15554,12 +21140,26 @@ "format": "date-time", "description": "The point in time this tag represents." }, + "immutable": { + "type": "boolean", + "description": "If True, this tag cannot be modified once it is created." + }, "pushes": { "type": "array", "items": { "$ref": "#/components/schemas/AwsPush" }, - "readOnly": true + "readOnly": true, + "description": "Deprecated. Use `push_urls` instead." + }, + "push_urls": { + "type": "array", + "items": { + "type": "string", + "format": "uri" + }, + "readOnly": true, + "description": "Push actions associated with the tag." }, "usage": { "allOf": [ @@ -15573,6 +21173,7 @@ "required": [ "id", "name", + "push_urls", "pushes", "timestamp", "url", @@ -15598,6 +21199,10 @@ "format": "date-time", "nullable": true, "description": "The point in time this tag represents. If not specified then the current time will be used." + }, + "immutable": { + "type": "boolean", + "description": "If True, this tag cannot be modified once it is created." } }, "required": [ @@ -15656,6 +21261,10 @@ "format": "date-time", "nullable": true, "description": "The point in time this tag represents. If explicitly set to `null` then the current time will be used." + }, + "immutable": { + "type": "boolean", + "description": "If True, this tag cannot be modified once it is created." } }, "required": [ @@ -15795,7 +21404,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } }, "required": [ @@ -15821,14 +21431,15 @@ }, "id": { "type": "string", - "format": "uuid", - "readOnly": true, - "description": "A unique identifier for the template." + "readOnly": true + }, + "ledger_id": { + "type": "string", + "readOnly": true }, "name": { "type": "string", - "description": "The template name.", - "maxLength": 256 + "description": "The template name." }, "description": { "type": "string", @@ -15843,13 +21454,21 @@ "type": "string", "description": "The content of the template. Use mustache-style templating delimiters of `{{` and `}}` to reference parameter values by name for substitution into the template result." }, + "referenced_projects": { + "type": "array", + "items": { + "type": "string" + }, + "readOnly": true, + "description": "Projects (other than this template's project) that this template references. This field is not valid for history requests." + }, "referenced_parameters": { "type": "array", "items": { "type": "string" }, "readOnly": true, - "description": "Parameters that this template references." + "description": "Parameters that this template references. This field is not valid for history requests." }, "referenced_templates": { "type": "array", @@ -15857,7 +21476,7 @@ "type": "string" }, "readOnly": true, - "description": "Other templates that this template references." + "description": "Other templates that this template references. This field is not valid for history requests." }, "referencing_templates": { "type": "array", @@ -15865,7 +21484,7 @@ "type": "string" }, "readOnly": true, - "description": "Other templates that reference this template." + "description": "Other templates that reference this template. This field is not valid for history requests." }, "referencing_values": { "type": "array", @@ -15873,11 +21492,12 @@ "type": "string" }, "readOnly": true, - "description": "The dynamic values that reference this template." + "description": "The dynamic values that reference this template. This field is not valid for history requests." }, "has_secret": { "type": "boolean", "readOnly": true, + "default": false, "description": "If True, this template contains secrets." }, "created_at": { @@ -15888,7 +21508,8 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } }, "required": [ @@ -15896,9 +21517,11 @@ "evaluated", "has_secret", "id", + "ledger_id", "modified_at", "name", "referenced_parameters", + "referenced_projects", "referenced_templates", "referencing_templates", "referencing_values", @@ -15974,7 +21597,26 @@ "type": "object", "properties": { "body": { - "type": "string" + "type": "string", + "description": "The template body to instantiate on request, instantiated on response." + }, + "has_secret": { + "type": "boolean", + "readOnly": true, + "description": "If True, the instantiated template contains secrets." + } + }, + "required": [ + "body", + "has_secret" + ] + }, + "TemplatePreviewCreateRequest": { + "type": "object", + "properties": { + "body": { + "type": "string", + "description": "The template body to instantiate on request, instantiated on response." } }, "required": [ @@ -16009,10 +21651,6 @@ "type": "object", "description": "Details about a single change.", "properties": { - "history_date": { - "type": "string", - "format": "date-time" - }, "history_type": { "allOf": [ { @@ -16021,11 +21659,15 @@ ], "readOnly": true }, - "history_user": { + "modified_at": { "type": "string", - "description": "The unique identifier of a user.", + "format": "date-time", + "readOnly": true, "nullable": true }, + "modified_by": { + "type": "string" + }, "history_template": { "allOf": [ { @@ -16037,9 +21679,9 @@ } }, "required": [ - "history_date", "history_template", - "history_type" + "history_type", + "modified_at" ] }, "TemplateTimelineEntryTemplate": { @@ -16048,29 +21690,90 @@ "properties": { "id": { "type": "string", - "format": "uuid", - "readOnly": true, - "description": "A unique identifier for the parameter." + "readOnly": true + }, + "ledger_id": { + "type": "string", + "readOnly": true }, "name": { "type": "string", - "description": "The parameter name.", + "description": "The parameter name." + }, + "description": { + "type": "string" + }, + "body": { + "type": "string", + "description": "The content of the template. Use mustache-style templating delimiters of `{{` and `}}` to reference parameter values by name for substitution into the template result." + } + }, + "required": [ + "id", + "ledger_id", + "name" + ] + }, + "TemplateUpdate": { + "type": "object", + "description": "A parameter template in a given project, optionally instantiated against an environment.", + "properties": { + "id": { + "type": "string", + "readOnly": true + }, + "name": { + "type": "string", + "description": "The template name.", "maxLength": 256 }, "description": { "type": "string", - "description": "A description of the parameter. You may find it helpful to document how this parameter is used to assist others when they need to maintain software that uses this content." + "description": "('A description of the template. You may find it helpful to document how this template is used to assist others when they need to maintain software that uses this content.',)" + }, + "evaluated": { + "type": "boolean", + "readOnly": true, + "description": "If true, the `body` field has undergone evaluation." }, "body": { "type": "string", "description": "The content of the template. Use mustache-style templating delimiters of `{{` and `}}` to reference parameter values by name for substitution into the template result." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true } }, "required": [ + "created_at", + "evaluated", "id", + "modified_at", "name" ] }, + "UpdateUser": { + "type": "object", + "properties": { + "chatgpt_threads": { + "type": "object", + "additionalProperties": {}, + "nullable": true, + "description": "The threads this user is participating in with ChatGPT." + } + }, + "required": [ + "chatgpt_threads" + ] + }, "User": { "type": "object", "properties": { @@ -16106,6 +21809,12 @@ "readOnly": true, "description": "Membership identifier for user." }, + "chatgpt_threads": { + "type": "object", + "additionalProperties": {}, + "readOnly": true, + "description": "The threads this user is participating in with ChatGPT." + }, "role": { "type": "string", "nullable": true, @@ -16130,10 +21839,12 @@ "modified_at": { "type": "string", "format": "date-time", - "readOnly": true + "readOnly": true, + "nullable": true } }, "required": [ + "chatgpt_threads", "created_at", "email", "id", @@ -16153,13 +21864,31 @@ "url": { "type": "string", "format": "uri", - "readOnly": true + "readOnly": true, + "description": "The value url." }, "id": { "type": "string", - "format": "uuid", + "readOnly": true + }, + "ledger_id": { + "type": "string", + "readOnly": true + }, + "active_environment": { + "type": "string", + "readOnly": true, + "description": "The active environment this Value is viewed under" + }, + "active_environment_id": { + "type": "string", + "readOnly": true, + "description": "The active environment id this Value is viewed under" + }, + "active_environment_name": { + "type": "string", "readOnly": true, - "description": "A unique identifier for the value." + "description": "The name of the environment that this environment is viewed under" }, "environment": { "type": "string", @@ -16167,16 +21896,15 @@ "readOnly": true, "description": "The environment this value is set in." }, - "environment_name": { + "environment_id": { "type": "string", "readOnly": true, - "description": "The environment name for this value. This is a convenience to avoid another query against the server to resolve the environment url into a name." + "description": "The environment id for this value." }, - "earliest_tag": { + "environment_name": { "type": "string", - "nullable": true, "readOnly": true, - "description": "The earliest tag name this value appears in (within the value's environment)." + "description": "The environment name for this value. This is a convenience to avoid another query against the server to resolve the environment url into a name." }, "parameter": { "type": "string", @@ -16184,19 +21912,20 @@ "readOnly": true, "description": "The parameter this value is for." }, + "parameter_id": { + "type": "string", + "readOnly": true, + "description": "The parameter id for this value." + }, "external": { - "type": "boolean", - "description": "An external parameter leverages a CloudTruth integration to retrieve content on-demand from an external source. When this is `false` the value is stored by CloudTruth and considered to be _internal_. When this is `true`, the `external_fqn` field must be set." + "type": "boolean" }, "external_fqn": { - "type": "string", - "description": "The FQN, or Fully-Qualified Name, is the path through the integration to get to the desired content. This must be present and reference a valid integration when the value is `external`.", - "maxLength": 1024 + "type": "string" }, "external_filter": { "type": "string", - "description": "If the value is `external`, the content returned by the integration can be reduced by applying a JMESpath expression. This is valid as long as the content is structured and of a supported format. JMESpath expressions are supported on `json`, `yaml`, and `dotenv` content.", - "maxLength": 1024 + "nullable": true }, "external_error": { "type": "string", @@ -16216,19 +21945,16 @@ }, "internal_value": { "type": "string", - "nullable": true, - "description": "This is the content to use when resolving the Value for an internal non-secret, or when storing a secret. When storing a secret, this content is stored in your organization's dedicated vault and this field is cleared. This field is required if the value is being created or updated and is `internal`. This field cannot be specified when creating or updating an `external` value.", - "maxLength": 16384 + "nullable": true }, "interpolated": { - "type": "boolean", - "description": "If `true`, apply template substitution rules to this value. If `false`, this value is a literal value. Note: secrets cannot be interpolated." + "type": "boolean" }, "value": { "type": "string", "nullable": true, "readOnly": true, - "description": "This is the actual content of the Value for the given parameter in the given environment.\n\nIf you request secret masking, no secret content will be included in the result and instead a series of asterisks will be used instead for the value. If you request wrapping, the secret content will be wrapped in an envelope that is bound to your JWT token. For more information about secret wrapping, see the docs.\n\nClients applying this value to a shell environment should set `=` even if `value` is the empty string. If `value` is `null`, the client should unset that shell environment variable." + "description": "This is the actual content of the Value for the given parameter in the given environment.\n\nIf you request secret masking, no secret content will be included in the result and instead a series of asterisks will be used instead for the value.\n\nClients applying this value to a shell environment should set `=` even if `value` is the empty string. If `value` is `null`, the client should unset that shell environment variable." }, "evaluated": { "type": "boolean", @@ -16239,7 +21965,16 @@ "type": "boolean", "nullable": true, "readOnly": true, - "description": "Indicates the value content is a secret. Normally this is `true` when the parameter is a secret, however it is possible for a parameter to be a secret with a external value that is not a secret. It is not possible to convert a parameter from a secret to a non-secret if any of the values are external and a secret. Clients can check this condition by leveraging this field." + "description": "Indicates the value content is a secret. Normally this is `true` when the parameter is a secret. It is possible for a parameter to be a secret with a external value that is not a secret. It is not possible to convert a parameter from a secret to a non-secret if any of the values are external and a secret. Clients can check this condition by leveraging this field. It is also possible for a parameter to not be a secret but for this value to be dynamic and reference a Parameter that is a secret. In this case, we indicate the value is a secret." + }, + "referenced_projects": { + "type": "array", + "items": { + "type": "string", + "format": "uri" + }, + "readOnly": true, + "description": "The projects this value references, if dynamic. This field is not valid for history requests." }, "referenced_parameters": { "type": "array", @@ -16248,7 +21983,7 @@ "format": "uri" }, "readOnly": true, - "description": "The parameters this value references, if interpolated." + "description": "The parameters this value references, if dynamic. this field is not valid for history requests." }, "referenced_templates": { "type": "array", @@ -16257,7 +21992,7 @@ "format": "uri" }, "readOnly": true, - "description": "The templates this value references, if interpolated." + "description": "The templates this value references, if dynamic. This field is not valid for history requests." }, "created_at": { "type": "string", @@ -16267,21 +22002,35 @@ "modified_at": { "type": "string", "format": "date-time", + "readOnly": true, + "nullable": true + }, + "expires_at": { + "type": "string", + "format": "date-time", + "nullable": true, "readOnly": true } }, "required": [ + "active_environment", + "active_environment_id", + "active_environment_name", "created_at", - "earliest_tag", "environment", + "environment_id", "environment_name", "evaluated", + "expires_at", "external_error", "external_status", "id", + "ledger_id", "modified_at", "parameter", + "parameter_id", "referenced_parameters", + "referenced_projects", "referenced_templates", "secret", "url", @@ -16314,8 +22063,8 @@ "internal_value": { "type": "string", "nullable": true, - "description": "This is the content to use when resolving the Value for an internal non-secret, or when storing a secret. When storing a secret, this content is stored in your organization's dedicated vault and this field is cleared. This field is required if the value is being created or updated and is `internal`. This field cannot be specified when creating or updating an `external` value.", - "maxLength": 16384 + "description": "This is the content to use when resolving the Value for an internal non-secret, or when storing a secret. This field cannot be specified when creating or updating an `external` value.", + "maxLength": 65536 }, "interpolated": { "type": "boolean", @@ -16325,6 +22074,79 @@ "required": [ "environment" ] + }, + "ValueUpdate": { + "type": "object", + "description": "Unlike other UpdateSerializers, we do not inherit from the CreateSerializer here\nbecause `environment` is not a required field for updates.", + "properties": { + "id": { + "type": "string", + "readOnly": true + }, + "external": { + "type": "boolean", + "description": "An external parameter leverages a CloudTruth integration to retrieve content on-demand from an external source. When this is `false` the value is stored by CloudTruth and considered to be _internal_. When this is `true`, the `external_fqn` field must be set." + }, + "external_fqn": { + "type": "string", + "description": "The FQN, or Fully-Qualified Name, is the path through the integration to get to the desired content. This must be present and reference a valid integration when the value is `external`.", + "maxLength": 1024 + }, + "external_filter": { + "type": "string", + "description": "If the value is `external`, the content returned by the integration can be reduced by applying a JMESpath expression. This is valid as long as the content is structured and of a supported format. JMESpath expressions are supported on `json`, `yaml`, and `dotenv` content.", + "maxLength": 1024 + }, + "internal_value": { + "type": "string", + "nullable": true, + "description": "This is the content to use when resolving the Value for an internal non-secret, or when storing a secret. This field cannot be specified when creating or updating an `external` value.", + "maxLength": 65536 + }, + "interpolated": { + "type": "boolean", + "description": "If `true`, apply template substitution rules to this value. If `false`, this value is a literal value. Note: secrets cannot be interpolated." + }, + "secret": { + "type": "boolean", + "nullable": true, + "readOnly": true, + "description": "Indicates the value content is a secret. Normally this is `true` when the parameter is a secret. It is possible for a parameter to be a secret with a external value that is not a secret. It is not possible to convert a parameter from a secret to a non-secret if any of the values are external and a secret. Clients can check this condition by leveraging this field. It is also possible for a parameter to not be a secret but for this value to be dynamic and reference a Parameter that is a secret. In this case, we indicate the value is a secret." + }, + "value": { + "type": "string", + "nullable": true, + "readOnly": true, + "description": "This is the actual content of the Value for the given parameter in the given environment.\n\nIf you request secret masking, no secret content will be included in the result and instead a series of asterisks will be used instead for the value.\n\nClients applying this value to a shell environment should set `=` even if `value` is the empty string. If `value` is `null`, the client should unset that shell environment variable." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modified_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "nullable": true + } + }, + "required": [ + "created_at", + "id", + "modified_at", + "secret", + "value" + ] + }, + "VersionEnum": { + "enum": [ + 1, + 2, + 3, + 4 + ], + "type": "integer" } }, "securitySchemes": { @@ -16339,6 +22161,10 @@ "name": "Authorization", "type": "apiKey", "description": "\nUse your JWT to authenticate to the API. This is how the CloudTruth\nWeb UI authenticates to the backend. It requires a user to have already logged in\nand gotten a JWT from the login process. This is usually done by an Auth0 authentication\nflow from one of the Auth0 javascript libraries. Alternatively, you can pull the\nJWT from your browser if you have a logged in session with the CloudTruth UI.\n\nThis authentication mechanism is intended for deeper integrations into the CloudTruth\nsystem, where you want to handle the user logins directly in your application. For\nnormal API use, you likely want the Api-Key authentication header and not this one.\n\nTo use the JWT, place your JWT in the Authorization header as 'Bearer JWT', where\nJWT is your JWT. For example:\n\n Authorization: Bearer eyJhbGciOiJIkuydfy.eyJzdWIiOiIxMjM....\n " + }, + "tokenAuth": { + "type": "http", + "scheme": "bearer" } } }, diff --git a/package.json b/package.json index 8bb1a36..f10d309 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "generate-client": "npx swagger-typescript-api -p openapi.json -o ./src/gen --modular --responses --route-types --extract-request-params --extract-request-body", "lint": "eslint", "package": "ncc build --source-map --license licenses.txt", - "test": "jest -i --coverage --runInBand --detectOpenHandles", + "test": "jest -i --coverage --runInBand --detectOpenHandles --verbose", "all": "npm run build && npm run format && npm run lint && npm run package && npm test" }, "engines": { diff --git a/src/run.ts b/src/run.ts index 36aac81..c370eca 100644 --- a/src/run.ts +++ b/src/run.ts @@ -3,63 +3,57 @@ // import * as core from '@actions/core' -import * as github from '@actions/github' import {Api} from './gen/Api' import {LIB_VERSION} from './version' import {validate as uuidValidate} from 'uuid' import {PaginatedParameterList, Project, ProjectsParametersListParams} from './gen/data-contracts' import {HttpResponse} from './gen/http-client' - import fetch from 'isomorphic-fetch' -import {env} from 'process' -import { clear } from 'console' const USER_AGENT = `configure-action/${LIB_VERSION}` export async function fetchWithRetry( - url: RequestInfo, {headers, ...options}: RequestInit = {}, + url: RequestInfo, + {headers, ...options}: RequestInit = {}, init?: RequestInit, - {timeoutInSeconds, tries } = {timeoutInSeconds: 10, tries: 3}, -) : Promise { - let response: Response; - let controller: AbortController; + {timeoutInSeconds, tries} = {timeoutInSeconds: 10, tries: 1} +): Promise { + let response: Response + let controller: AbortController + core.debug(`Fetching ${url} with ${timeoutInSeconds} seconds timeout and will try ${tries} time(s).`) for (let tryCount = 0; tryCount < tries; tryCount++) { - let timeoutId; + core.debug(`Try ${tryCount + 1} of ${tries}.`) + let timeoutId try { - core.info(`Fetching ${url} with ${timeoutInSeconds} seconds timeout and will try ${tries} time(s).`); - controller = new AbortController(); - timeoutId = setTimeout(() => controller.abort(), timeoutInSeconds * 1000); - throw new Error(tryCount.toString()) + controller = new AbortController() + timeoutId = setTimeout(() => controller.abort(), timeoutInSeconds * 1000) response = await fetch(url, { signal: controller.signal, headers: { 'User-Agent': USER_AGENT, ...headers - }, ...init}); + }, + ...init + }) - core.info(`Response status: ${response.status}`); - core.info(`timeoutId: ${timeoutId}`); - clearTimeout(timeoutId); + clearTimeout(timeoutId) - if (response.ok) { - return response; - } - } catch (e) { + return response + } catch (error: any) { + core.debug(`Caught error ${error}`) if (timeoutId) { - clearTimeout(timeoutId); + clearTimeout(timeoutId) } - if (!(e instanceof DOMException) || e.name !== 'AbortError') { - throw e; + if (!(error instanceof DOMException) || error.name !== 'AbortError') { + throw error } } } - throw new Error( - `Failed to fetch ${url} after ${tries} tries with ${timeoutInSeconds} seconds timeout.` - ); + throw new Error(`Failed to fetch ${url} after ${tries} tries.`) } export const configurefetch = ( @@ -92,6 +86,7 @@ export function api(): Api { } }) api.setSecurityData({apikey: core.getInput('apikey')}) + core.debug(`Using API server ${JSON.stringify(api)}`) return api } @@ -149,20 +144,32 @@ export async function run(): Promise { const tag = core.getInput('tag') || undefined for (let page = 1; ; ++page) { - core.debug( - `Requesting parameter values for project='${project_id}' environment='${environment}' tag='${tag}' page=${page}` - ) let page_size = undefined if (process.env.TESTING_REST_API_PAGE_SIZE) { page_size = parseInt(process.env.TESTING_REST_API_PAGE_SIZE) } - const response = await client.projectsParametersList({ + + const payload = { projectPk: project_id, - environment: environment, // can be name or id - tag: tag, + environment: environment, page: page, page_size: page_size - }) + } as ProjectsParametersListParams + + if (tag) { + payload.tag = tag + core.debug( + `Requesting parameter values for project='${project_id}' environment='${environment}' tag='${tag}' page=${page}` + ) + } else { + core.debug(`Requesting parameter values for project='${project_id}' environment='${environment}' page=${page}`) + } + + core.debug(`Payload ${JSON.stringify(payload)}`) + const response = await client.projectsParametersList(payload) + core.debug(`Received ${response.data.results!.length} parameters.`) + core.debug(`Data: ${JSON.stringify(response.data)}`) + inject(response) if (response.data.next == null) { if (page == 1 && response.data.count == 0) { diff --git a/src/version.ts b/src/version.ts index 516d44c..33ab1fa 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const LIB_VERSION = '2.2.0' +export const LIB_VERSION = '2.2.1'