diff --git a/.circleci/config.yml b/.circleci/config.yml index 734db9fa4e..7de549c89a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,35 +1,14 @@ version: 2.1 orbs: - sdk: ory/sdk@0.1.23 - changelog: ory/changelog@0.0.6 - goreleaser: ory/goreleaser@0.0.27 - nancy: ory/nancy@0.0.8 + sdk: ory/sdk@0.1.33 + changelog: ory/changelog@0.0.9 + goreleaser: ory/goreleaser@0.0.29 + nancy: ory/nancy@0.0.9 + docs: ory/docs@0.0.4 + golangci: ory/golangci@0.0.4 jobs: - format: - docker: - - image: circleci/golang:1.13 - working_directory: /go/src/github.com/ory/oathkeeper - steps: - # This is disabled for now because goimports is really slow when go modules are used, see - # https://github.com/golang/go/issues/27287 - # - # - run: - # name: Enable go1.12 modules - # command: | - # echo 'export GO111MODULE=on' >> $BASH_ENV - # source $BASH_ENV - - checkout - - run: - name: Enable go1.13 modules - command: | - echo 'export GO111MODULE=on' >> $BASH_ENV - source $BASH_ENV - - run: curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin latest - - run: go mod download - - run: golangci-lint run ./... - test: docker: - image: circleci/golang:1.14 @@ -46,18 +25,6 @@ jobs: - run: ./test/e2e/run.sh - run: ./test/reload/run.sh - docs: - docker: - - image: circleci/golang:1.13 - working_directory: /go/src/github.com/ory/oathkeeper - steps: - - checkout - - run: git config --global user.email "hi@ory.am" - - run: git config --global user.name "ORY Continuous Integration" - - run: "git clone https://arekkas:$DOCS_TOKEN_PUSH@github.com/ory/docs.git ../docs" - - run: "cp ./.schemas/config.schema.json ../docs/schemas/oathkeeper.config.schema.json" - - run: "(cd ../docs && git add -A && git commit -a -m \"Update ORY Oathkeeper Swagger and JSON Schemas\" && git push origin) || exit 0" - workflows: "test, build, and relase": jobs: @@ -65,7 +32,7 @@ workflows: filters: tags: only: /.*/ - - format: + - golangci/lint: filters: tags: only: /.*/ @@ -73,14 +40,10 @@ workflows: filters: tags: only: /.*/ - - docs: - filters: - branches: - only: master - changelog/generate: requires: - test - - format + - golangci/lint filters: tags: only: /.*/ @@ -90,11 +53,11 @@ workflows: appname: Ory_Oathkeeper requires: - test - - format + - golangci/lint - sdk/release: requires: - test - - format + - golangci/lint - goreleaser/release filters: tags: @@ -109,9 +72,18 @@ workflows: requires: - goreleaser/test - test - - format + - golangci/lint filters: tags: only: /.*/ branches: ignore: /.*/ + - docs/build: + requires: + - test + - golangci/lint + filters: + tags: + only: /.*/ + branches: + only: master \ No newline at end of file diff --git a/docs/images/banner_oathkeeper.png b/.github/banner_oathkeeper.png similarity index 100% rename from docs/images/banner_oathkeeper.png rename to .github/banner_oathkeeper.png diff --git a/docs/api.swagger.json b/.schema/api.swagger.json similarity index 100% rename from docs/api.swagger.json rename to .schema/api.swagger.json diff --git a/.schemas/config.schema.json b/.schema/config.schema.json similarity index 97% rename from .schemas/config.schema.json rename to .schema/config.schema.json index 8afbadc927..7770171329 100644 --- a/.schemas/config.schema.json +++ b/.schema/config.schema.json @@ -1,5 +1,5 @@ { - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json", + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json", "$schema": "http://json-schema.org/draft-07/schema#", "title": "ORY Oathkeeper Configuration", "type": "object", @@ -314,7 +314,7 @@ "realm": { "type": "string", "title": "The WWW-Authenticate Realm", - "description": "This is a message that will be displayed by the browser. Most browsers show a message like \"The website says: \". Using a real message is thus more appropriate than a Realm identifier.", + "description": "This is a message that will be displayed by the browser. Most browsers show a message like \"The website says: `,`\". Using a real message is thus more appropriate than a Realm identifier.", "default": "Please authenticate." }, "when": { @@ -1044,12 +1044,12 @@ "authenticators": { "title": "Authenticators", "type": "object", - "description": "For more information on authenticators head over to: https://www.ory.sh/docs/oathkeeper/pipeline/authn", + "description": "For more information on authenticators head over to: https://www.ory.sh/oathkeeper/docs/pipeline/authn", "additionalProperties": false, "properties": { "anonymous": { "title": "Anonymous", - "description": "The [`anonymous` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#anonymous).", + "description": "The [`anonymous` authenticator](https://www.ory.sh/oathkeeper/docs/pipeline/authn#anonymous).", "type": "object", "additionalProperties": false, "properties": { @@ -1063,7 +1063,7 @@ }, "noop": { "title": "No Operation (noop)", - "description": "The [`noop` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#noop).", + "description": "The [`noop` authenticator](https://www.ory.sh/oathkeeper/docs/pipeline/authn#noop).", "type": "object", "additionalProperties": false, "properties": { @@ -1074,7 +1074,7 @@ }, "unauthorized": { "title": "Unauthorized", - "description": "The [`unauthorized` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#unauthorized).", + "description": "The [`unauthorized` authenticator](https://www.ory.sh/oathkeeper/docs/pipeline/authn#unauthorized).", "type": "object", "additionalProperties": false, "properties": { @@ -1085,7 +1085,7 @@ }, "cookie_session": { "title": "Cookie Session", - "description": "The [`cookie_session` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#cookie_session).", + "description": "The [`cookie_session` authenticator](https://www.ory.sh/oathkeeper/docs/pipeline/authn#cookie_session).", "type": "object", "properties": { "enabled": { @@ -1117,7 +1117,7 @@ }, "jwt": { "title": "JSON Web Token (jwt)", - "description": "The [`jwt` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#jwt).", + "description": "The [`jwt` authenticator](https://www.ory.sh/oathkeeper/docs/pipeline/authn#jwt).", "type": "object", "properties": { "enabled": { @@ -1149,7 +1149,7 @@ }, "oauth2_client_credentials": { "title": "OAuth 2.0 Client Credentials", - "description": "The [`oauth2_client_credentials` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#oauth2_client_credentials).", + "description": "The [`oauth2_client_credentials` authenticator](https://www.ory.sh/oathkeeper/docs/pipeline/authn#oauth2_client_credentials).", "type": "object", "properties": { "enabled": { @@ -1181,7 +1181,7 @@ }, "oauth2_introspection": { "title": "OAuth 2.0 Token Introspection", - "description": "The [`oauth2_introspection` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#oauth2_introspection).", + "description": "The [`oauth2_introspection` authenticator](https://www.ory.sh/oathkeeper/docs/pipeline/authn#oauth2_introspection).", "type": "object", "properties": { "enabled": { @@ -1345,12 +1345,12 @@ "authorizers": { "title": "Authorizers", "type": "object", - "description": "For more information on authorizers head over to: https://www.ory.sh/docs/oathkeeper/pipeline/authz", + "description": "For more information on authorizers head over to: https://www.ory.sh/oathkeeper/docs/pipeline/authz", "additionalProperties": false, "properties": { "allow": { "title": "Allow", - "description": "The [`allow` authorizer](https://www.ory.sh/docs/oathkeeper/pipeline/authz#allow).", + "description": "The [`allow` authorizer](https://www.ory.sh/oathkeeper/docs/pipeline/authz#allow).", "type": "object", "additionalProperties": false, "properties": { @@ -1361,7 +1361,7 @@ }, "deny": { "title": "Deny", - "description": "The [`deny` authorizer](https://www.ory.sh/docs/oathkeeper/pipeline/authz#allow).", + "description": "The [`deny` authorizer](https://www.ory.sh/oathkeeper/docs/pipeline/authz#allow).", "type": "object", "additionalProperties": false, "properties": { @@ -1372,7 +1372,7 @@ }, "keto_engine_acp_ory": { "title": "ORY Keto Access Control Policies Engine", - "description": "The [`keto_engine_acp_ory` authorizer](https://www.ory.sh/docs/oathkeeper/pipeline/authz#keto_engine_acp_ory).", + "description": "The [`keto_engine_acp_ory` authorizer](https://www.ory.sh/oathkeeper/docs/pipeline/authz#keto_engine_acp_ory).", "type": "object", "properties": { "enabled": { @@ -1404,7 +1404,7 @@ }, "remote_json": { "title": "Remote JSON", - "description": "The [`remote_json` authorizer](https://www.ory.sh/docs/oathkeeper/pipeline/authz#remote_json).", + "description": "The [`remote_json` authorizer](https://www.ory.sh/oathkeeper/docs/pipeline/authz#remote_json).", "type": "object", "properties": { "enabled": { @@ -1439,12 +1439,12 @@ "mutators": { "title": "Mutators", "type": "object", - "description": "For more information on mutators head over to: https://www.ory.sh/docs/oathkeeper/pipeline/mutator", + "description": "For more information on mutators head over to: https://www.ory.sh/oathkeeper/docs/pipeline/mutator", "additionalProperties": false, "properties": { "noop": { "title": "No Operation (noop)", - "description": "The [`noop` mutator](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#noop).", + "description": "The [`noop` mutator](https://www.ory.sh/oathkeeper/docs/pipeline/mutator#noop).", "type": "object", "additionalProperties": false, "properties": { @@ -1455,7 +1455,7 @@ }, "cookie": { "title": "HTTP Cookie", - "description": "The [`cookie` mutator](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#cookie).", + "description": "The [`cookie` mutator](https://www.ory.sh/oathkeeper/docs/pipeline/mutator#cookie).", "type": "object", "properties": { "enabled": { @@ -1487,7 +1487,7 @@ }, "header": { "title": "HTTP Header", - "description": "The [`header` mutator](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#header).", + "description": "The [`header` mutator](https://www.ory.sh/oathkeeper/docs/pipeline/mutator#header).", "type": "object", "properties": { "enabled": { @@ -1519,7 +1519,7 @@ }, "hydrator": { "title": "Hydrator", - "description": "The [`hydrator` mutator](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#hydrator).", + "description": "The [`hydrator` mutator](https://www.ory.sh/oathkeeper/docs/pipeline/mutator#hydrator).", "type": "object", "properties": { "enabled": { @@ -1551,7 +1551,7 @@ }, "id_token": { "title": "ID Token (JSON Web Token)", - "description": "The [`id_token` mutator](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#id_token).", + "description": "The [`id_token` mutator](https://www.ory.sh/oathkeeper/docs/pipeline/mutator#id_token).", "type": "object", "properties": { "enabled": { diff --git a/.schema/pipeline/authenticators.anonymous.schema.json b/.schema/pipeline/authenticators.anonymous.schema.json new file mode 100644 index 0000000000..a3f15e5528 --- /dev/null +++ b/.schema/pipeline/authenticators.anonymous.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/authenticators.anonymous.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configAuthenticatorsAnonymous" +} diff --git a/.schema/pipeline/authenticators.cookie_session.schema.json b/.schema/pipeline/authenticators.cookie_session.schema.json new file mode 100644 index 0000000000..34f3e62175 --- /dev/null +++ b/.schema/pipeline/authenticators.cookie_session.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/authenticators.cookie_session.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configAuthenticatorsCookieSession" +} diff --git a/.schema/pipeline/authenticators.jwt.schema.json b/.schema/pipeline/authenticators.jwt.schema.json new file mode 100644 index 0000000000..10c04d6f00 --- /dev/null +++ b/.schema/pipeline/authenticators.jwt.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/authenticators.jwt.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configAuthenticatorsJwt" +} diff --git a/.schema/pipeline/authenticators.noop.schema.json b/.schema/pipeline/authenticators.noop.schema.json new file mode 100644 index 0000000000..88f3e946ca --- /dev/null +++ b/.schema/pipeline/authenticators.noop.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/authenticators.noop.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configAuthenticatorsAnonymous" +} diff --git a/.schema/pipeline/authenticators.oauth2_client_credentials.schema.json b/.schema/pipeline/authenticators.oauth2_client_credentials.schema.json new file mode 100644 index 0000000000..343e0ada2b --- /dev/null +++ b/.schema/pipeline/authenticators.oauth2_client_credentials.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/authenticators.oauth2_client_credentials.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configAuthenticatorsOauth2ClientCredentials" +} diff --git a/.schema/pipeline/authenticators.oauth2_introspection.schema.json b/.schema/pipeline/authenticators.oauth2_introspection.schema.json new file mode 100644 index 0000000000..cf31f66459 --- /dev/null +++ b/.schema/pipeline/authenticators.oauth2_introspection.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/authenticators.oauth2_introspection.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configAuthenticatorsOauth2Introspection" +} diff --git a/.schema/pipeline/authenticators.unauthorized.schema.json b/.schema/pipeline/authenticators.unauthorized.schema.json new file mode 100644 index 0000000000..3f7946c332 --- /dev/null +++ b/.schema/pipeline/authenticators.unauthorized.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/authenticators.unauthorized.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configAuthenticatorsAnonymous" +} diff --git a/.schema/pipeline/authorizers.allow.schema.json b/.schema/pipeline/authorizers.allow.schema.json new file mode 100644 index 0000000000..0a14b36886 --- /dev/null +++ b/.schema/pipeline/authorizers.allow.schema.json @@ -0,0 +1,4 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/authorizers.allow.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#" +} diff --git a/.schema/pipeline/authorizers.deny.schema.json b/.schema/pipeline/authorizers.deny.schema.json new file mode 100644 index 0000000000..b92e87ad84 --- /dev/null +++ b/.schema/pipeline/authorizers.deny.schema.json @@ -0,0 +1,4 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/authorizers.deny.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#" +} diff --git a/.schema/pipeline/authorizers.keto_engine_acp_ory.schema.json b/.schema/pipeline/authorizers.keto_engine_acp_ory.schema.json new file mode 100644 index 0000000000..6e066df431 --- /dev/null +++ b/.schema/pipeline/authorizers.keto_engine_acp_ory.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/authorizers.keto_engine_acp_ory.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configAuthorizersKetoEngineAcpOry" +} diff --git a/.schema/pipeline/authorizers.remote_json.schema.json b/.schema/pipeline/authorizers.remote_json.schema.json new file mode 100644 index 0000000000..18bdc95970 --- /dev/null +++ b/.schema/pipeline/authorizers.remote_json.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/authorizers.remote_json.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configAuthorizersRemoteJSON" +} diff --git a/.schema/pipeline/errors.json.schema.json b/.schema/pipeline/errors.json.schema.json new file mode 100644 index 0000000000..bddd19eb5c --- /dev/null +++ b/.schema/pipeline/errors.json.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/mutators.cookie.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configErrorsJSON" +} diff --git a/.schema/pipeline/errors.redirect.schema.json b/.schema/pipeline/errors.redirect.schema.json new file mode 100644 index 0000000000..2bbb8d4beb --- /dev/null +++ b/.schema/pipeline/errors.redirect.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/mutators.cookie.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configErrorsRedirect" +} diff --git a/.schema/pipeline/errors.www_authenticate.schema.json b/.schema/pipeline/errors.www_authenticate.schema.json new file mode 100644 index 0000000000..78eed4bdda --- /dev/null +++ b/.schema/pipeline/errors.www_authenticate.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/mutators.cookie.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configErrorsWWWAuthenticate" +} diff --git a/.schema/pipeline/mutators.cookie.schema.json b/.schema/pipeline/mutators.cookie.schema.json new file mode 100644 index 0000000000..200b1fd1a6 --- /dev/null +++ b/.schema/pipeline/mutators.cookie.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/mutators.cookie.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configMutatorsCookie" +} diff --git a/.schema/pipeline/mutators.header.schema.json b/.schema/pipeline/mutators.header.schema.json new file mode 100644 index 0000000000..f052fe4eab --- /dev/null +++ b/.schema/pipeline/mutators.header.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/mutators.header.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configMutatorsHeader" +} diff --git a/.schema/pipeline/mutators.hydrator.schema.json b/.schema/pipeline/mutators.hydrator.schema.json new file mode 100644 index 0000000000..1c9b220c03 --- /dev/null +++ b/.schema/pipeline/mutators.hydrator.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/mutators.hydrator.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configMutatorsHydrator" +} diff --git a/.schema/pipeline/mutators.id_token.schema.json b/.schema/pipeline/mutators.id_token.schema.json new file mode 100644 index 0000000000..4a7113d9fd --- /dev/null +++ b/.schema/pipeline/mutators.id_token.schema.json @@ -0,0 +1,5 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/mutators.id_token.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/config.schema.json#/definitions/configMutatorsIdToken" +} diff --git a/.schema/pipeline/mutators.noop.schema.json b/.schema/pipeline/mutators.noop.schema.json new file mode 100644 index 0000000000..6661d62191 --- /dev/null +++ b/.schema/pipeline/mutators.noop.schema.json @@ -0,0 +1,4 @@ +{ + "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schema/mutators.noop.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#" +} diff --git a/.schemas/authenticators.anonymous.schema.json b/.schemas/authenticators.anonymous.schema.json deleted file mode 100644 index b8fa24d84a..0000000000 --- a/.schemas/authenticators.anonymous.schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/authenticators.anonymous.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "Anonymous Authenticator Configuration", - "description": "This section is optional when the authenticator is disabled.", - "properties": { - "subject": { - "type": "string", - "title": "Anonymous Subject", - "examples": [ - "guest", - "anon", - "anonymous", - "unknown" - ], - "default": "anonymous", - "description": "Sets the anonymous username." - } - }, - "additionalProperties": false -} diff --git a/.schemas/authenticators.cookie_session.schema.json b/.schemas/authenticators.cookie_session.schema.json deleted file mode 100644 index 5a7e10b965..0000000000 --- a/.schemas/authenticators.cookie_session.schema.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/authenticators.cookie_session.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "Cookie Session Authenticator Configuration", - "description": "This section is optional when the authenticator is disabled.", - "properties": { - "check_session_url": { - "title": "Session Check URL", - "type": "string", - "format": "uri", - "description": "The origin to proxy requests to. If the response is a 200 with body `{ \"subject\": \"...\", \"extra\": {} }`. The request will pass the subject through successfully, otherwise it will be marked as unauthorized.\n\n>If this authenticator is enabled, this value is required.", - "examples": [ - "https://session-store-host" - ] - }, - "only": { - "type": "array", - "items": { - "type": "string", - "additionalItems": false - }, - "title": "Only Cookies", - "description": "A list of possible cookies to look for on incoming requests, and will fallthrough to the next authenticator if none of the passed cookies are set on the request." - }, - "preserve_path": { - "title": "Preserve Path", - "type": "boolean", - "description": "When set to true, any path specified in `check_session_url` will be preserved instead of overwriting the path with the path from the original request" - } - }, - "required": [ - "check_session_url" - ], - "additionalProperties": false -} diff --git a/.schemas/authenticators.jwt.schema.json b/.schemas/authenticators.jwt.schema.json deleted file mode 100644 index 0cd4965a00..0000000000 --- a/.schemas/authenticators.jwt.schema.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/authenticators.jwt.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "JWT Authenticator Configuration", - "description": "This section is optional when the authenticator is disabled.", - "properties": { - "required_scope": { - "type": "array", - "title": "Required Token Scope", - "description": "An array of OAuth 2.0 scopes that are required when accessing an endpoint protected by this handler.\n If the token used in the Authorization header did not request that specific scope, the request is denied.", - "items": { - "type": "string" - } - }, - "target_audience": { - "title": "Intended Audience", - "type": "array", - "description": "An array of audiences that are required when accessing an endpoint protected by this handler.\n If the token used in the Authorization header is not intended for any of the requested audiences, the request is denied.", - "items": { - "type": "string" - } - }, - "trusted_issuers": { - "type": "array", - "items": { - "type": "string" - } - }, - "allowed_algorithms": { - "type": "array", - "items": { - "type": "string" - } - }, - "jwks_urls": { - "title": "JSON Web Key URLs", - "type": "array", - "items": { - "type": "string", - "format": "uri" - }, - "description": "URLs where ORY Oathkeeper can retrieve JSON Web Keys from for validating the JSON Web Token. Usually something like \"https://my-keys.com/.well-known/jwks.json\". The response of that endpoint must return a JSON Web Key Set (JWKS).\n\n>If this authenticator is enabled, this value is required.", - "examples": [ - "https://my-website.com/.well-known/jwks.json", - "https://my-other-website.com/.well-known/jwks.json", - "file://path/to/local/jwks.json" - ] - }, - "scope_strategy": { - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/scope_strategy.schema.json#" - }, - "token_from": { - "title": "Token From", - "description": "The location of the token.\n If not configured, the token will be received from a default location - 'Authorization' header.\n One and only one location (header, query, or cookie) must be specified.", - "oneOf": [ - { - "type": "object", - "required": [ - "header" - ], - "properties": { - "header": { - "title": "Header", - "type": "string", - "description": "The header (case insensitive) that must contain a token for request authentication. It can't be set along with query_parameter or cookie." - } - } - }, - { - "type": "object", - "required": [ - "query_parameter" - ], - "properties": { - "query_parameter": { - "title": "Query Parameter", - "type": "string", - "description": "The query parameter (case sensitive) that must contain a token for request authentication. It can't be set along with header or cookie." - } - } - }, - { - "type": "object", - "required": [ - "cookie" - ], - "properties": { - "cookie": { - "title": "Cookie", - "type": "string", - "description": "The cookie (case sensitive) that must contain a token for request authentication. It can't be set along with header or query_parameter." - } - } - } - ] - } - }, - "additionalProperties": false -} diff --git a/.schemas/authenticators.noop.schema.json b/.schemas/authenticators.noop.schema.json deleted file mode 100644 index 860805a40d..0000000000 --- a/.schemas/authenticators.noop.schema.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/authenticators.noop.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "NoOp Authenticator Configuration", - "description": "This section is optional when the authenticator is disabled.", - "properties": { - }, - "additionalProperties": false -} diff --git a/.schemas/authenticators.oauth2_client_credentials.schema.json b/.schemas/authenticators.oauth2_client_credentials.schema.json deleted file mode 100644 index a6072bba9f..0000000000 --- a/.schemas/authenticators.oauth2_client_credentials.schema.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/authenticators.oauth2_client_credentials.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "OAuth 2.0 Client Credentials Authenticator Configuration", - "description": "This section is optional when the authenticator is disabled.", - "properties": { - "token_url": { - "type": "string", - "description": "The OAuth 2.0 Token Endpoint that will be used to validate the client credentials.\n\n>If this authenticator is enabled, this value is required.", - "format": "uri", - "examples": [ - "https://my-website.com/oauth2/token" - ] - }, - "required_scope": { - "type": "array", - "title": "Request Permissions (Token Scope)", - "description": "Scopes is an array of OAuth 2.0 scopes that are required when accessing an endpoint protected by this rule.\n If the token used in the Authorization header did not request that specific scope, the request is denied.", - "items": { - "type": "string" - } - } - }, - "required": ["token_url"], - "additionalProperties": false -} diff --git a/.schemas/authenticators.oauth2_introspection.schema.json b/.schemas/authenticators.oauth2_introspection.schema.json deleted file mode 100644 index 6e9a33f312..0000000000 --- a/.schemas/authenticators.oauth2_introspection.schema.json +++ /dev/null @@ -1,155 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/authenticators.oauth2_introspection.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "OAuth 2.0 Introspection Authenticator Configuration", - "description": "This section is optional when the authenticator is disabled.", - "properties": { - "introspection_url": { - "type": "string", - "format": "uri", - "examples": [ - "https://my-website.com/oauth2/introspection" - ], - "title": "OAuth 2.0 Introspection URL", - "description": "The OAuth 2.0 Token Introspection endpoint URL.\n\n>If this authenticator is enabled, this value is required." - }, - "scope_strategy": { - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/scope_strategy.schema.json#" - }, - "pre_authorization": { - "title": "Pre-Authorization", - "description": "Enable pre-authorization in cases where the OAuth 2.0 Token Introspection endpoint is protected by OAuth 2.0 Bearer Tokens that can be retrieved using the OAuth 2.0 Client Credentials grant.", - "oneOf": [ - { - "type": "object", - "properties": { - "enabled": { - "title": "Enabled", - "const": false, - "default": false - } - } - }, - { - "type": "object", - "additionalProperties": false, - "required": [ - "client_id", - "client_secret", - "token_url" - ], - "properties": { - "enabled": { - "title": "Enabled", - "const": true, - "default": false - }, - "client_id": { - "type": "string", - "title": "OAuth 2.0 Client ID", - "description": "The OAuth 2.0 Client ID to be used for the OAuth 2.0 Client Credentials Grant.\n\n>If pre-authorization is enabled, this value is required." - }, - "client_secret": { - "type": "string", - "title": "OAuth 2.0 Client Secret", - "description": "The OAuth 2.0 Client Secret to be used for the OAuth 2.0 Client Credentials Grant.\n\n>If pre-authorization is enabled, this value is required." - }, - "token_url": { - "type": "string", - "format": "uri", - "title": "OAuth 2.0 Token URL", - "description": "The OAuth 2.0 Token Endpoint where the OAuth 2.0 Client Credentials Grant will be performed.\n\n>If pre-authorization is enabled, this value is required." - }, - "scope": { - "type": "array", - "items": { - "type": "string" - }, - "title": "OAuth 2.0 Scope", - "description": "The OAuth 2.0 Scope to be requested during the OAuth 2.0 Client Credentials Grant.", - "examples": [ - [ - "[\"foo\", \"bar\"]" - ] - ] - } - } - } - ] - }, - "required_scope": { - "title": "Required Scope", - "description": "An array of OAuth 2.0 scopes that are required when accessing an endpoint protected by this handler.\n If the token used in the Authorization header did not request that specific scope, the request is denied.", - "type": "array", - "items": { - "type": "string" - } - }, - "target_audience": { - "title": "Target Audience", - "description": "An array of audiences that are required when accessing an endpoint protected by this handler.\n If the token used in the Authorization header is not intended for any of the requested audiences, the request is denied.", - "type": "array", - "items": { - "type": "string" - } - }, - "trusted_issuers": { - "title": "Trusted Issuers", - "description": "The token must have been issued by one of the issuers listed in this array.", - "type": "array", - "items": { - "type": "string" - } - }, - "token_from": { - "title": "Token From", - "description": "The location of the token.\n If not configured, the token will be received from a default location - 'Authorization' header.\n One and only one location (header, query, or cookie) must be specified.", - "oneOf": [ - { - "type": "object", - "required": [ - "header" - ], - "properties": { - "header": { - "title": "Header", - "type": "string", - "description": "The header (case insensitive) that must contain a token for request authentication.\n It can't be set along with query_parameter or cookie." - } - } - }, - { - "type": "object", - "required": [ - "query_parameter" - ], - "properties": { - "query_parameter": { - "title": "Query Parameter", - "type": "string", - "description": "The query parameter (case sensitive) that must contain a token for request authentication.\n It can't be set along with header or cookie." - } - } - }, - { - "type": "object", - "required": [ - "cookie" - ], - "properties": { - "cookie": { - "title": "Cookie", - "type": "string", - "description": "The cookie (case sensitive) that must contain a token for request authentication.\n It can't be set along with header or query_parameter." - } - } - } - ] - } - }, - "required": [ - "introspection_url" - ], - "additionalProperties": false -} diff --git a/.schemas/authenticators.unauthorized.schema.json b/.schemas/authenticators.unauthorized.schema.json deleted file mode 100644 index 613b2961d2..0000000000 --- a/.schemas/authenticators.unauthorized.schema.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/authenticators.unauthorized.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "Unauthorized Authenticator Configuration", - "description": "This section is optional when the authenticator is disabled.", - "properties": { - }, - "additionalProperties": false -} diff --git a/.schemas/authorizers.allow.schema.json b/.schemas/authorizers.allow.schema.json deleted file mode 100644 index 9471a8ddc5..0000000000 --- a/.schemas/authorizers.allow.schema.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/authorizers.allow.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "Allow Authorizer Configuration", - "description": "This section is optional when the authorizer is disabled.", - "properties": { - }, - "additionalProperties": false -} diff --git a/.schemas/authorizers.deny.schema.json b/.schemas/authorizers.deny.schema.json deleted file mode 100644 index ba2690a8f7..0000000000 --- a/.schemas/authorizers.deny.schema.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/authorizers.deny.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "Deny Authorizer Configuration", - "description": "This section is optional when the authorizer is disabled.", - "properties": { - }, - "additionalProperties": false -} diff --git a/.schemas/authorizers.keto_engine_acp_ory.schema.json b/.schemas/authorizers.keto_engine_acp_ory.schema.json deleted file mode 100644 index 4f7c59d9f6..0000000000 --- a/.schemas/authorizers.keto_engine_acp_ory.schema.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/authorizers.keto_engine_acp_ory.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "ORY Keto Access Control Policy Authorizer Configuration", - "description": "This section is optional when the authorizer is disabled.", - "properties": { - "base_url": { - "title": "Base URL", - "type": "string", - "format": "uri", - "description": "The base URL of ORY Keto.\n\n>If this authorizer is enabled, this value is required.", - "examples": [ - "http://my-keto/" - ] - }, - "required_action": { - "type": "string" - }, - "required_resource": { - "type": "string" - }, - "subject": { - "type": "string" - }, - "flavor": { - "type": "string" - } - }, - "required": [ - "base_url", - "required_action", - "required_resource" - ], - "additionalProperties": false -} diff --git a/.schemas/authorizers.remote_json.schema.json b/.schemas/authorizers.remote_json.schema.json deleted file mode 100644 index 77a1b9d539..0000000000 --- a/.schemas/authorizers.remote_json.schema.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/authorizers.remote_json.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "Remote JSON Configuration", - "description": "This section is optional when the authorizer is disabled.", - "properties": { - "remote": { - "title": "Remote Authorizer URL", - "type": "string", - "format": "uri", - "description": "The URL of the remote authorizer. The remote authorizer is expected to return either 200 OK or 403 Forbidden to allow/deny access.\n\n>If this authorizer is enabled, this value is required.", - "examples": [ - "https://host/path" - ] - }, - "payload": { - "title": "JSON Payload", - "type": "string", - "description": "The JSON payload of the request sent to the remote authorizer. The string will be parsed by the Go text/template package and applied to an AuthenticationSession object.\n\n>If this authorizer is enabled, this value is required.", - "examples": [ - "{\"subject\":\"{{ .Subject }}\"}" - ] - } - }, - "required": [ - "remote", - "payload" - ], - "additionalProperties": false -} diff --git a/.schemas/mutators.cookie.schema.json b/.schemas/mutators.cookie.schema.json deleted file mode 100644 index 5b5b6259ed..0000000000 --- a/.schemas/mutators.cookie.schema.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/mutators.cookie.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "Cookie Mutator Configuration", - "description": "This section is optional when the mutator is disabled.", - "required": ["cookies"], - "properties": { - "cookies": { - "type": "object", - "additionalProperties": { "type": "string" } - } - }, - "additionalProperties": false -} diff --git a/.schemas/mutators.header.schema.json b/.schemas/mutators.header.schema.json deleted file mode 100644 index 5d882df861..0000000000 --- a/.schemas/mutators.header.schema.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/mutators.header.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "Header Mutator Configuration", - "description": "This section is optional when the mutator is disabled.", - "required": ["headers"], - "properties": { - "headers": { - "type": "object", - "additionalProperties": { "type": "string" } - } - }, - "additionalProperties": false -} diff --git a/.schemas/mutators.hydrator.schema.json b/.schemas/mutators.hydrator.schema.json deleted file mode 100644 index d0cb76a317..0000000000 --- a/.schemas/mutators.hydrator.schema.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/mutators.hydrator.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "Hydrator Mutator Configuration", - "description": "This section is optional when the mutator is disabled.", - "properties": { - "api": { - "additionalProperties": false, - "required": [ - "url" - ], - "type": "object", - "properties": { - "url": { - "type": "string", - "format": "uri" - }, - "auth": { - "type": "object", - "additionalProperties": false, - "properties": { - "basic": { - "required": [ - "username", - "password" - ], - "type": "object", - "additionalProperties": false, - "properties": { - "username": { - "type": "string" - }, - "password": { - "type": "string" - } - } - } - } - }, - "retry": { - "type": "object", - "additionalProperties": false, - "properties": { - "number_of_retries": { - "type": "number", - "minimum": 0, - "default": 100 - }, - "delay_in_milliseconds": { - "type": "number", - "minimum": 0, - "default": 3 - } - } - } - } - } - }, - "required": [ - "api" - ], - "additionalProperties": false -} diff --git a/.schemas/mutators.id_token.schema.json b/.schemas/mutators.id_token.schema.json deleted file mode 100644 index f4d113ded0..0000000000 --- a/.schemas/mutators.id_token.schema.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/mutators.id_token.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "ID Token Mutator Configuration", - "description": "This section is optional when the mutator is disabled.", - "required": ["jwks_url","issuer_url"], - "properties": { - "claims": { - "type": "string" - }, - "issuer_url": { - "type": "string", - "title": "Issuer URL", - "description": "Sets the \"iss\" value of the ID Token.\n\n>If this mutator is enabled, this value is required." - }, - "jwks_url": { - "type": "string", - "format": "uri", - "title": "JSON Web Key URL", - "description": "Sets the URL where keys should be fetched from. Supports remote locations (http, https) as well as local filesystem paths.\n\n>If this mutator is enabled, this value is required.", - "examples": [ - "https://fetch-keys/from/this/location.json", - "file:///from/this/absolute/location.json", - "file://../from/this/relative/location.json" - ] - }, - "ttl": { - "type": "string", - "title": "Expire After", - "description": "Sets the time-to-live of the JSON Web Token.", - "pattern": "^[0-9]+(ns|us|ms|s|m|h)$", - "default": "1m", - "examples": [ - "1h", - "1m", - "30s" - ] - } - }, - "additionalProperties": false -} diff --git a/.schemas/mutators.noop.schema.json b/.schemas/mutators.noop.schema.json deleted file mode 100644 index ee7fb89ad1..0000000000 --- a/.schemas/mutators.noop.schema.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/mutators.noop.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "title": "NoOp Mutator Configuration", - "description": "This section is optional when the mutator is disabled.", - "properties": { - }, - "additionalProperties": false -} diff --git a/.schemas/pipeline/authenticators.anonymous.schema.json b/.schemas/pipeline/authenticators.anonymous.schema.json deleted file mode 100644 index 1ed20b2b8e..0000000000 --- a/.schemas/pipeline/authenticators.anonymous.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/authenticators.anonymous.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configAuthenticatorsAnonymous" -} diff --git a/.schemas/pipeline/authenticators.cookie_session.schema.json b/.schemas/pipeline/authenticators.cookie_session.schema.json deleted file mode 100644 index 9a073ee840..0000000000 --- a/.schemas/pipeline/authenticators.cookie_session.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/authenticators.cookie_session.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configAuthenticatorsCookieSession" -} diff --git a/.schemas/pipeline/authenticators.jwt.schema.json b/.schemas/pipeline/authenticators.jwt.schema.json deleted file mode 100644 index cc9f3ce411..0000000000 --- a/.schemas/pipeline/authenticators.jwt.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/authenticators.jwt.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configAuthenticatorsJwt" -} diff --git a/.schemas/pipeline/authenticators.noop.schema.json b/.schemas/pipeline/authenticators.noop.schema.json deleted file mode 100644 index 7bbe3ecfaf..0000000000 --- a/.schemas/pipeline/authenticators.noop.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/authenticators.noop.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configAuthenticatorsAnonymous" -} diff --git a/.schemas/pipeline/authenticators.oauth2_client_credentials.schema.json b/.schemas/pipeline/authenticators.oauth2_client_credentials.schema.json deleted file mode 100644 index 89e18c688a..0000000000 --- a/.schemas/pipeline/authenticators.oauth2_client_credentials.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/authenticators.oauth2_client_credentials.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configAuthenticatorsOauth2ClientCredentials" -} diff --git a/.schemas/pipeline/authenticators.oauth2_introspection.schema.json b/.schemas/pipeline/authenticators.oauth2_introspection.schema.json deleted file mode 100644 index 1c137e2be7..0000000000 --- a/.schemas/pipeline/authenticators.oauth2_introspection.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/authenticators.oauth2_introspection.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configAuthenticatorsOauth2Introspection" -} diff --git a/.schemas/pipeline/authenticators.unauthorized.schema.json b/.schemas/pipeline/authenticators.unauthorized.schema.json deleted file mode 100644 index 7bdba4b8c1..0000000000 --- a/.schemas/pipeline/authenticators.unauthorized.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/authenticators.unauthorized.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configAuthenticatorsAnonymous" -} diff --git a/.schemas/pipeline/authorizers.allow.schema.json b/.schemas/pipeline/authorizers.allow.schema.json deleted file mode 100644 index 4fe70ae526..0000000000 --- a/.schemas/pipeline/authorizers.allow.schema.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/authorizers.allow.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#" -} diff --git a/.schemas/pipeline/authorizers.deny.schema.json b/.schemas/pipeline/authorizers.deny.schema.json deleted file mode 100644 index fa751b9edb..0000000000 --- a/.schemas/pipeline/authorizers.deny.schema.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/authorizers.deny.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#" -} diff --git a/.schemas/pipeline/authorizers.keto_engine_acp_ory.schema.json b/.schemas/pipeline/authorizers.keto_engine_acp_ory.schema.json deleted file mode 100644 index 84b3513b98..0000000000 --- a/.schemas/pipeline/authorizers.keto_engine_acp_ory.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/authorizers.keto_engine_acp_ory.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configAuthorizersKetoEngineAcpOry" -} diff --git a/.schemas/pipeline/authorizers.remote_json.schema.json b/.schemas/pipeline/authorizers.remote_json.schema.json deleted file mode 100644 index ef45b5c741..0000000000 --- a/.schemas/pipeline/authorizers.remote_json.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/authorizers.remote_json.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configAuthorizersRemoteJSON" -} diff --git a/.schemas/pipeline/errors.json.schema.json b/.schemas/pipeline/errors.json.schema.json deleted file mode 100644 index 505468faf7..0000000000 --- a/.schemas/pipeline/errors.json.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/mutators.cookie.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configErrorsJSON" -} diff --git a/.schemas/pipeline/errors.redirect.schema.json b/.schemas/pipeline/errors.redirect.schema.json deleted file mode 100644 index e65b05d547..0000000000 --- a/.schemas/pipeline/errors.redirect.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/mutators.cookie.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configErrorsRedirect" -} diff --git a/.schemas/pipeline/errors.www_authenticate.schema.json b/.schemas/pipeline/errors.www_authenticate.schema.json deleted file mode 100644 index 8e5cb50600..0000000000 --- a/.schemas/pipeline/errors.www_authenticate.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/mutators.cookie.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configErrorsWWWAuthenticate" -} diff --git a/.schemas/pipeline/mutators.cookie.schema.json b/.schemas/pipeline/mutators.cookie.schema.json deleted file mode 100644 index 947f38211e..0000000000 --- a/.schemas/pipeline/mutators.cookie.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/mutators.cookie.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configMutatorsCookie" -} diff --git a/.schemas/pipeline/mutators.header.schema.json b/.schemas/pipeline/mutators.header.schema.json deleted file mode 100644 index 5cdb64ffd5..0000000000 --- a/.schemas/pipeline/mutators.header.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/mutators.header.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configMutatorsHeader" -} diff --git a/.schemas/pipeline/mutators.hydrator.schema.json b/.schemas/pipeline/mutators.hydrator.schema.json deleted file mode 100644 index dd45e5fb20..0000000000 --- a/.schemas/pipeline/mutators.hydrator.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/mutators.hydrator.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configMutatorsHydrator" -} diff --git a/.schemas/pipeline/mutators.id_token.schema.json b/.schemas/pipeline/mutators.id_token.schema.json deleted file mode 100644 index bef04698a8..0000000000 --- a/.schemas/pipeline/mutators.id_token.schema.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/mutators.id_token.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "$ref": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/config.schema.json#/definitions/configMutatorsIdToken" -} diff --git a/.schemas/pipeline/mutators.noop.schema.json b/.schemas/pipeline/mutators.noop.schema.json deleted file mode 100644 index 0684df6b21..0000000000 --- a/.schemas/pipeline/mutators.noop.schema.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/v0.34.0-beta.1/.schemas/mutators.noop.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#" -} diff --git a/.schemas/scope_strategy.schema.json b/.schemas/scope_strategy.schema.json deleted file mode 100644 index 060834f2f8..0000000000 --- a/.schemas/scope_strategy.schema.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$id": "https://raw.githubusercontent.com/ory/oathkeeper/master/.schemas/scope_strategy.schema.json", - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Scope Strategy", - "type": "string", - "enum": [ - "hierarchic", - "exact", - "wildcard", - "none" - ], - "default": "none", - "description": "Sets the strategy validation algorithm." -} diff --git a/Makefile b/Makefile index a5ddb1b1c1..d47d280bcd 100644 --- a/Makefile +++ b/Makefile @@ -15,13 +15,13 @@ format: # Generates the SDKs .PHONY: sdk sdk: - $$(go env GOPATH)/bin/swagger generate spec -m -o ./docs/api.swagger.json -x internal/httpclient - $$(go env GOPATH)/bin/swagutil sanitize ./docs/api.swagger.json - $$(go env GOPATH)/bin/swagger flatten --with-flatten=remove-unused -o ./docs/api.swagger.json ./docs/api.swagger.json - $$(go env GOPATH)/bin/swagger validate ./docs/api.swagger.json + $$(go env GOPATH)/bin/swagger generate spec -m -o ./.schema/api.swagger.json -x internal/httpclient + $$(go env GOPATH)/bin/swagutil sanitize ./.schema/api.swagger.json + $$(go env GOPATH)/bin/swagger flatten --with-flatten=remove-unused -o ./.schema/api.swagger.json ./.schema/api.swagger.json + $$(go env GOPATH)/bin/swagger validate ./.schema/api.swagger.json rm -rf internal/httpclient mkdir -p internal/httpclient - $$(go env GOPATH)/bin/swagger generate client -f ./docs/api.swagger.json -t internal/httpclient -A Ory_Oathkeeper + $$(go env GOPATH)/bin/swagger generate client -f ./.schema/api.swagger.json -t internal/httpclient -A Ory_Oathkeeper make format .PHONY: install-stable diff --git a/README.md b/README.md index 527627bc6e..edcfa39788 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -

ORY Oathkeeper - Cloud Native Identity & Access Proxy

+

ORY Oathkeeper - Cloud Native Identity & Access Proxy

Chat | Forums | Newsletter

- API Docs | - Guide | + API Docs | + Guide | Code Docs

Support this project!

@@ -70,7 +70,7 @@ documentation and upgrade instructions. ## Installation Head over to the -[ORY Developer Documentation](https://www.ory.sh/docs/oathkeeper/install) to +[ORY Developer Documentation](https://www.ory.sh/oathkeeper/docs/install) to learn how to install ORY Oathkeeper on Linux, macOS, Windows, and Docker and how to build ORY Oathkeeper from source. @@ -260,12 +260,12 @@ more. ### Guide The Guide is available -[here](https://www.ory.sh/docs/oathkeeper/). +[here](https://www.ory.sh/oathkeeper/docs/). ### HTTP API documentation The HTTP API is documented -[here](https://www.ory.sh/docs/oathkeeper/sdk/api). +[here](https://www.ory.sh/oathkeeper/docs/reference/api). ### Upgrading and Changelog diff --git a/UPGRADE.md b/UPGRADE.md index 5680086063..759d78a42d 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -248,7 +248,7 @@ ORY Oathkeeper was changed according to discussion [177](https://github.com/ory/oathkeeper/issues/177). Several issues have been resolved that could not be resolved before due to design decisions. We strongly encourage you to re-read the -[documentation](https://www.ory.sh/docs/oathkeeper/) but to give you a short +[documentation](https://www.ory.sh/oathkeeper/docs/) but to give you a short overview of the most important changes: 1. Commands `oathkeeper serve api` and `oathkeeper serve proxy` have been @@ -256,7 +256,7 @@ overview of the most important changes: API). 1. ORY Oathkeeper can now be configured from a file and configuration keys where updated. Where appropriate, environment variables from previous versions - still work. Please check out [./docs/config.yml](docs/.oathkeeper.yaml) for a + still work. Please check out [./docs/config.yml](internal/config/.oathkeeper.yaml) for a fully annotated configuration file as several environment variables changed, for example (not exclusive): `HTTPS_TLS_CERT_PATH`, `HTTPS_TLS_KEY_PATH`, `HTTPS_TLS_CERT`, `HTTPS_TLS_KEY`. diff --git a/cmd/root.go b/cmd/root.go index 5f8aa9dc6e..d9e3ada96b 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -36,7 +36,7 @@ import ( var logger logrus.FieldLogger -var schemas = packr.New("schemas", "../.schemas") +var schemas = packr.New("schemas", "../.schema") // RootCmd represents the base command when called without any subcommands var RootCmd = &cobra.Command{ diff --git a/cmd/serve.go b/cmd/serve.go index 020886061d..30b36acfb0 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -40,7 +40,7 @@ var serveCmd = &cobra.Command{ ORY Oathkeeper can be configured using environment variables as well as a configuration file. For more information on configuration options, open the configuration documentation: ->> https://www.ory.sh/docs/oathkeeper/configuration << +>> https://www.ory.sh/oathkeeper/docs/configuration << `, Run: func(cmd *cobra.Command, args []string) { logger = viperx.InitializeConfig("oathkeeper", "", logger) diff --git a/docs/.editorconfig b/docs/.editorconfig new file mode 100644 index 0000000000..a9b781bece --- /dev/null +++ b/docs/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +insert_final_newline = true +charset = utf-8 +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000000..b2d6de3062 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/docs/.prettierignore b/docs/.prettierignore new file mode 100644 index 0000000000..6fb052bd12 --- /dev/null +++ b/docs/.prettierignore @@ -0,0 +1,6 @@ +build/ +website/build/ +schemas/ +apis/ +.widdershins/ +hooks/ diff --git a/docs/.prettierrc b/docs/.prettierrc new file mode 100644 index 0000000000..ffe12cd476 --- /dev/null +++ b/docs/.prettierrc @@ -0,0 +1,5 @@ +{ + "proseWrap": "always", + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/docs/.widdershins/config.json b/docs/.widdershins/config.json new file mode 100644 index 0000000000..e0ecffc038 --- /dev/null +++ b/docs/.widdershins/config.json @@ -0,0 +1,20 @@ +{ + "language_tabs": [], + "verbose": true, + "codeSamples": true, + "httpSnippet": true, + "search": false, + "discovery": false, + "tocSummary": true, + "sample": true, + "tagGroups": [ + { + "title": "Public Endpoints", + "tags": ["public"] + }, + { + "title": "Administrative Endpoints", + "tags": ["admin"] + } + ] +} diff --git a/docs/.widdershins/templates/README.md b/docs/.widdershins/templates/README.md new file mode 100644 index 0000000000..f2a63d58c4 --- /dev/null +++ b/docs/.widdershins/templates/README.md @@ -0,0 +1,72 @@ +## Swagger / OpenAPI 2 and OpenAPI 3 template parameters + +Note that properties of OpenAPI objects will be in OpenAPI 3.0 form, as Swagger +/ OpenAPI 2.0 definitions are converted automatically. + +### Code templates + +- `method` - the HTTP method of the operation (in lower-case) +- `methodUpper` - the HTTP method of the operation (in upper-case) +- `url` - the full URL of the operation (including protocol and host) +- `consumes[]` - an array of MIME-types the operation consumes +- `produces[]` - an array of MIME-types the operation produces +- `operation` - the current operation object +- `operationId` - the current operation id +- `opName` - the operationId if set, otherwise the method + path +- `tags[]` - the full list of tags applying to the operation +- `security` - the security definitions applying to the operation +- `resource` - the current tag/path object +- `parameters[]` - an array of parameters for the operation (see below) +- `queryString` - an example queryString, urlEncoded +- `requiredQueryString` - an example queryString for `required:true` parameters +- `queryParameters[]` - a subset of `parameters` that are `in:query` +- `requiredParameters[]` - a subset of `queryParameters` that are + `required:true` +- `headerParameters[]` - a subset of `parameters` that are `in:header` +- `allHeaders[]` - a concatenation of `headerParameters` and pseudo-parameters + `Accept` and `Content-Type`, and optionally `Authorization` (the latter has an + `isAuth` boolean property set true so it can be omitted in templates if + desired + +### Parameter template + +- `parameters[]` - an array of + [parameters](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#parameterObject), + including the following pseudo-properties + - `shortDesc` - a truncated version of the parameter description + - `safeType` - a computed version of the parameter type, including Body and + schema names + - `originalType` - the original type of the parameter + - `exampleValues` - an object containing examples for use in code-templates + - `json` - example values in JSON compatible syntax + - `object` - example values in raw object form (unquoted strings etc) + - `depth` - a zero-based indicator of the depth of expanded request body + parameters +- `enums[]` - an array of (parameter)name/value pairs + +### Responses template + +- `responses[]` - an array of + [responses](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#responseObject), + including `status` and `meaning` properties + +### Authentication template + +- `authenticationStr` - a simple string of methods (and scopes where + appropriate) +- `securityDefinitions[]` - an array of applicable + [securityDefinitions](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#securityRequirementObject) + +### Schema Property template + +- `schemaProperties[]` - an array of _ `name` _ `type` _ `required` _ + `description` +- `enums[]` - an array of (schema property)name/value pairs + +### Common to all templates + +- `openapi` - the top-level OpenAPI / Swagger document +- `header` - the front-matter of the Slate/Shins markdown document +- `host` - the (computed) host of the API +- `protocol` - the default/first protocol of the API +- `baseUrl` - the (computed) baseUrl of the API (including protocol and host) diff --git a/docs/.widdershins/templates/authentication.def b/docs/.widdershins/templates/authentication.def new file mode 100644 index 0000000000..6b039e532e --- /dev/null +++ b/docs/.widdershins/templates/authentication.def @@ -0,0 +1,5 @@ + + diff --git a/docs/.widdershins/templates/authentication_none.def b/docs/.widdershins/templates/authentication_none.def new file mode 100644 index 0000000000..ddb19cf276 --- /dev/null +++ b/docs/.widdershins/templates/authentication_none.def @@ -0,0 +1,3 @@ + diff --git a/docs/.widdershins/templates/callbacks.def b/docs/.widdershins/templates/callbacks.def new file mode 100644 index 0000000000..4f155e8a1a --- /dev/null +++ b/docs/.widdershins/templates/callbacks.def @@ -0,0 +1,38 @@ +{{? data.operation.callbacks}} + +#### Callbacks + +
+ +{{ data.oldOperation = data.operation; }} + +{{ for (var c in data.operation.callbacks) { }} + +##### {{=c}} + +{{ var callback = data.operation.callbacks[c]; }} + +{{ for (var e in callback) { }} + +**{{=e}}** + +{{ var exp = callback[e]; }} + +{{ for (var m in exp) { }} + +{{ data.operation = exp[m]; }} +{{ data.method.operation = data.operation; }} + +{{= data.templates.operation(data) }} + +{{ } /* of methods */ }} + +{{ } /* of expressions */ }} + +{{ } /* of callbacks */ }} + +{{ data.operation = data.oldOperation; }} + +
+ +{{?}} diff --git a/docs/.widdershins/templates/code_go.dot b/docs/.widdershins/templates/code_go.dot new file mode 100644 index 0000000000..4b68a54903 --- /dev/null +++ b/docs/.widdershins/templates/code_go.dot @@ -0,0 +1,23 @@ +package main + +import ( + "bytes" + "net/http" +) + +func main() { + +{{?data.allHeaders.length}} + headers := map[string][]string{ + {{~data.allHeaders :p:index}}"{{=p.name}}": []string{"{{=p.exampleValues.object}}"}, + {{~}} + }{{?}} + + data := bytes.NewBuffer([]byte{jsonReq}) + req, err := http.NewRequest("{{=data.methodUpper}}", "{{=data.url}}", data) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} diff --git a/docs/.widdershins/templates/code_http.dot b/docs/.widdershins/templates/code_http.dot new file mode 100644 index 0000000000..98636ec862 --- /dev/null +++ b/docs/.widdershins/templates/code_http.dot @@ -0,0 +1,7 @@ +{{=data.methodUpper}} {{=data.url}}{{=data.requiredQueryString}} HTTP/1.1{{? data.host}} +Host: {{=data.host}}{{?}}{{?data.consumes.length}} +Content-Type: {{=data.consumes[0]}}{{?}}{{?data.produces.length}} +Accept: {{=data.produces[0]}}{{?}} +{{?data.headerParameters.length}}{{~ data.headerParameters :p:index}}{{=p.name}}: {{=p.exampleValues.object}} +{{~}} +{{?}} \ No newline at end of file diff --git a/docs/.widdershins/templates/code_java.dot b/docs/.widdershins/templates/code_java.dot new file mode 100644 index 0000000000..8d61d00c6d --- /dev/null +++ b/docs/.widdershins/templates/code_java.dot @@ -0,0 +1,13 @@ +URL obj = new URL("{{=data.url}}{{=data.requiredQueryString}}"); +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("{{=data.methodUpper}}"); +int responseCode = con.getResponseCode(); +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream())); +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); +System.out.println(response.toString()); diff --git a/docs/.widdershins/templates/code_javascript.dot b/docs/.widdershins/templates/code_javascript.dot new file mode 100644 index 0000000000..06d2641336 --- /dev/null +++ b/docs/.widdershins/templates/code_javascript.dot @@ -0,0 +1,14 @@ +{{?data.allHeaders.length}}var headers = { +{{~data.allHeaders :p:index}} '{{=p.name}}':{{=p.exampleValues.json}}{{?index < data.allHeaders.length-1}},{{?}} +{{~}} +}; +{{?}} +$.ajax({ + url: '{{=data.url}}', + method: '{{=data.method.verb}}', +{{?data.requiredQueryString}} data: '{{=data.requiredQueryString}}',{{?}} +{{?data.allHeaders.length}} headers: headers,{{?}} + success: function(data) { + console.log(JSON.stringify(data)); + } +}) diff --git a/docs/.widdershins/templates/code_nodejs.dot b/docs/.widdershins/templates/code_nodejs.dot new file mode 100644 index 0000000000..44ea2a5e64 --- /dev/null +++ b/docs/.widdershins/templates/code_nodejs.dot @@ -0,0 +1,18 @@ +const fetch = require('node-fetch'); +{{?data.bodyParameter.present}}const inputBody = '{{=data.bodyParameter.exampleValues.json}}';{{?}} +{{?data.allHeaders.length}}const headers = { +{{~data.allHeaders :p:index}} '{{=p.name}}':{{=p.exampleValues.json}}{{?index < data.allHeaders.length-1}},{{?}} +{{~}} +}; +{{?}} +fetch('{{=data.url}}{{=data.requiredQueryString}}', +{ + method: '{{=data.methodUpper}}'{{?data.bodyParameter.present || data.allHeaders.length}},{{?}} +{{?data.bodyParameter.present}} body: inputBody{{?}}{{? data.bodyParameter.present && data.allHeaders.length}},{{?}} +{{?data.allHeaders.length}} headers: headers{{?}} +}) +.then(function(res) { + return res.json(); +}).then(function(body) { + console.log(body); +}); diff --git a/docs/.widdershins/templates/code_python.dot b/docs/.widdershins/templates/code_python.dot new file mode 100644 index 0000000000..bd277a1dbc --- /dev/null +++ b/docs/.widdershins/templates/code_python.dot @@ -0,0 +1,10 @@ +import requests +{{?data.allHeaders.length}}headers = { +{{~data.allHeaders :p:index}} '{{=p.name}}': {{=p.exampleValues.json}}{{?index < data.allHeaders.length-1}},{{?}} +{{~}}} +{{?}} +r = requests.{{=data.method.verb}}('{{=data.url}}', params={ +{{~ data.requiredParameters :p:index}} '{{=p.name}}': {{=p.exampleValues.json}}{{? data.requiredParameters.length-1 != index }},{{?}}{{~}} +{{?data.allHeaders.length}}}, headers = headers{{?}}) + +print r.json() diff --git a/docs/.widdershins/templates/code_ruby.dot b/docs/.widdershins/templates/code_ruby.dot new file mode 100644 index 0000000000..172219db1e --- /dev/null +++ b/docs/.widdershins/templates/code_ruby.dot @@ -0,0 +1,14 @@ +require 'rest-client' +require 'json' + +{{?data.allHeaders.length}}headers = { +{{~data.allHeaders :p:index}} '{{=p.name}}' => {{=p.exampleValues.json}}{{?index < data.allHeaders.length-1}},{{?}} +{{~}}}{{?}} + +result = RestClient.{{=data.method.verb}} '{{=data.url}}', + params: { + {{~ data.requiredParameters :p:index}}'{{=p.name}}' => '{{=p.safeType}}'{{? data.requiredParameters.length-1 != index }},{{?}} +{{~}}}{{? data.allHeaders.length}}, headers: headers +{{?}} + +p JSON.parse(result) diff --git a/docs/.widdershins/templates/code_shell.dot b/docs/.widdershins/templates/code_shell.dot new file mode 100644 index 0000000000..9934692808 --- /dev/null +++ b/docs/.widdershins/templates/code_shell.dot @@ -0,0 +1,3 @@ +curl -X {{=data.methodUpper}} {{=data.url}}{{=data.requiredQueryString}}{{?data.allHeaders.length}} \{{?}} +{{~data.allHeaders :p:index}} -H '{{=p.name}}: {{=p.exampleValues.object}}'{{?index < data.allHeaders.length-1}} \{{?}} +{{~}} diff --git a/docs/.widdershins/templates/debug.def b/docs/.widdershins/templates/debug.def new file mode 100644 index 0000000000..04fcf8f761 --- /dev/null +++ b/docs/.widdershins/templates/debug.def @@ -0,0 +1 @@ +{{= data.utils.inspect(data) }} diff --git a/docs/.widdershins/templates/discovery.def b/docs/.widdershins/templates/discovery.def new file mode 100644 index 0000000000..4755a7b8a3 --- /dev/null +++ b/docs/.widdershins/templates/discovery.def @@ -0,0 +1,11 @@ + diff --git a/docs/.widdershins/templates/footer.def b/docs/.widdershins/templates/footer.def new file mode 100644 index 0000000000..139597f9cb --- /dev/null +++ b/docs/.widdershins/templates/footer.def @@ -0,0 +1,2 @@ + + diff --git a/docs/.widdershins/templates/links.def b/docs/.widdershins/templates/links.def new file mode 100644 index 0000000000..72426c268e --- /dev/null +++ b/docs/.widdershins/templates/links.def @@ -0,0 +1,18 @@ +{{? data.response.links }} + +##### Links + +{{ for (var l in data.response.links) { }} +{{ var link = data.response.links[l]; }} + +**{{=l}}** => {{?link.operationId}}{{=link.operationId}}{{??}}{{=link.operationRef}}{{?}} + +{{? link.parameters }} +|Parameter|Expression| +|---|---| +{{for (var p in link.parameters) { }}|{{=p}}|{{=link.parameters[p]}}|{{ } }} +{{?}} + +{{ } /* of links */ }} + +{{?}} diff --git a/docs/.widdershins/templates/main.dot b/docs/.widdershins/templates/main.dot new file mode 100644 index 0000000000..bae434fd03 --- /dev/null +++ b/docs/.widdershins/templates/main.dot @@ -0,0 +1,109 @@ +{{? data.api.info.description}}{{=data.api.info.description}}{{?}} + +> You are viewing REST API documentation. This documentation is auto-generated from a swagger specification which +itself is generated from annotations in the source code of the project. It is possible that this documentation includes +bugs and that code samples are incomplete or wrong. +> +> If you find issues in the respective documentation, please do not edit the +Markdown files directly (as they are generated) but raise an issue on the project's GitHub presence instead. This documentation +will improve over time with your help! If you have ideas how to improve this part of the documentation, feel free to +share them in a [GitHub issue](https://github.com/ory/docs/issues/new) any time. + +{{? data.api.components && data.api.components.securitySchemes }} +{{#def.security}} +{{?}} + +{{ for (var r in data.resources) { }} +{{ data.resource = data.resources[r]; }} + + +## {{= r}} + +{{? data.resource.description }}{{= data.resource.description}}{{?}} + +{{? data.resource.externalDocs}} +{{=data.resource.externalDocs.description||'External documentation'}} +{{?}} + +{{ for (var m in data.resource.methods) { }} +{{ data.operationUniqueName = m; }} +{{ data.method = data.resource.methods[m]; }} +{{ data.operationUniqueSlug = data.method.slug; }} +{{ data.operation = data.method.operation; }} +{{= data.templates.operation(data) }} +{{ } /* of methods */ }} + +{{ } /* of resources */ }} + +{{? data.api.components && data.api.components.schemas }} +## Schemas + +{{ for (var s in data.components.schemas) { }} +{{ var origSchema = data.components.schemas[s]; }} +{{ var schema = data.api.components.schemas[s]; }} + +{{=s}} +#### {{=s}} + + + +{{? data.options.yaml }} +```yaml +{{=data.utils.yaml.safeDump(data.utils.getSample(schema,data.options,{},data.api))}} +{{??}} +```json +{{=data.utils.safejson(data.utils.getSample(schema,data.options,{},data.api),null,2)}} +{{?}} +``` + +{{ var enums = []; }} +{{ var blocks = data.utils.schemaToArray(origSchema,-1,{trim:true,join:true},data); }} +{{ for (var block of blocks) { + for (var p of block.rows) { + if (p.schema && p.schema.enum) { + for (var e of p.schema.enum) { + enums.push({name:p.name,value:e}); + } + } + } + } +}} + +{{~ blocks :block}} +{{? block.title }}*{{= block.title}}*{{= '\n\n'}}{{?}} +{{? block.externalDocs}} +{{=block.externalDocs.description||'External documentation'}} +{{?}} + +{{? block===blocks[0] }} +#### Properties +{{?}} + +{{? block.rows.length}}|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---|{{?}} +{{~ block.rows :p}}|{{=p.displayName}}|{{=p.safeType}}|{{=p.required}}|{{=p.restrictions||'none'}}|{{=p.description||'none'}}| +{{~}} +{{~}} +{{? (blocks[0].rows.length === 0) && (blocks.length === 1) }} +*None* +{{?}} + +{{? enums.length > 0 }} +##### Enumerated Values + +|Property|Value| +|---|---| +{{~ enums :e}}|{{=e.name}}|{{=data.utils.toPrimitive(e.value)}}| +{{~}} + +{{?}} + +{{ } /* of schemas */ }} + +{{?}} + +{{#def.footer}} + +{{? data.options.discovery}} +{{#def.discovery}} +{{?}} diff --git a/docs/.widdershins/templates/operation.dot b/docs/.widdershins/templates/operation.dot new file mode 100644 index 0000000000..32ad3d3cf5 --- /dev/null +++ b/docs/.widdershins/templates/operation.dot @@ -0,0 +1,194 @@ + +{{? data.operation.operationId}} + +{{?}} + +{{ data.methodUpper = data.method.verb.toUpperCase(); }} +{{ data.url = data.utils.slashes(data.baseUrl + data.method.path); }} +{{ data.parameters = data.operation.parameters; }} +{{ data.enums = []; }} +{{ data.utils.fakeProdCons(data); }} +{{ data.utils.fakeBodyParameter(data); }} +{{ data.utils.mergePathParameters(data); }} +{{ data.utils.getParameters(data); }} + +### {{= data.operationUniqueName}} + +``` +{{=data.methodUpper}} {{=data.url}}{{=data.requiredQueryString}} HTTP/1.1{{? data.host}} +Host: {{=data.host}}{{?}}{{?data.consumes.length}} +Content-Type: {{=data.consumes[0]}}{{?}}{{?data.produces.length}} +Accept: {{=data.produces[0]}}{{?}} +{{?data.headerParameters.length}}{{~ data.headerParameters :p:index}}{{=p.name}}: {{=p.exampleValues.object}} +{{~}} +{{?}} +``` + +{{? data.operation.summary && !data.options.tocSummary}}*{{= data.operation.summary }}*{{?}} + +{{? data.operation.description}}{{= data.operation.description }}{{?}} + +{{? data.operation.requestBody}} +#### Request body + +{{? data.bodyParameter.exampleValues.description }} +##### {{= data.bodyParameter.exampleValues.description }} +{{?}} + +{{= data.utils.getBodyParameterExamples(data) }} +{{?}} + +{{? data.parameters && data.parameters.length }} +{{#def.parameters}} +{{?}} + +{{#def.responses}} + +{{#def.callbacks}} + +{{ data.security = data.operation.security ? data.operation.security : data.api.security; }} +{{? data.security && data.security.length }} +{{#def.authentication}} +{{??}} +{{#def.authentication_none}} +{{?}} + +{{? data.options.codeSamples || data.operation["x-code-samples"] }} +#### Code samples + +
+ +
+
+ +```shell +curl -X {{=data.methodUpper}} {{=data.url}}{{=data.requiredQueryString}}{{?data.allHeaders.length}} \{{?}} +{{~data.allHeaders :p:index}} -H '{{=p.name}}: {{=p.exampleValues.object}}'{{?index < data.allHeaders.length-1}} \{{?}}{{~}} +``` + +
+
+ +```go +package main + +import ( + "bytes" + "net/http" +) + +func main() {{{?data.allHeaders.length}} + headers := map[string][]string{ {{~data.allHeaders :p:index}} + "{{=p.name}}": []string{"{{=p.exampleValues.object}}"},{{~}} + }{{?}} + + var body []byte + // body = ... + + req, err := http.NewRequest("{{=data.methodUpper}}", "{{=data.url}}", bytes.NewBuffer(body)) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} +``` + +
+
+ +```nodejs +const fetch = require('node-fetch'); +{{?data.bodyParameter.present}}const input = '{{=data.bodyParameter.exampleValues.json}}';{{?}} +{{?data.allHeaders.length}}const headers = { +{{~data.allHeaders :p:index}} '{{=p.name}}': {{=p.exampleValues.json}}{{?index < data.allHeaders.length-1}},{{?}}{{~}} +} +{{?}} +fetch('{{=data.url}}{{=data.requiredQueryString}}', { + method: '{{=data.methodUpper}}'{{?data.bodyParameter.present || data.allHeaders.length}},{{?}}{{?data.bodyParameter.present}} + body: input{{?}}{{? data.bodyParameter.present && data.allHeaders.length}},{{?}}{{?data.allHeaders.length}} + headers{{?}} +}) +.then(r => r.json()) +.then((body) => { + console.log(body) +}) +``` + +
+
+ +```java +// This sample needs improvement. +URL obj = new URL("{{=data.url}}{{=data.requiredQueryString}}"); + +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("{{=data.methodUpper}}"); + +int responseCode = con.getResponseCode(); + +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream()) +); + +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); + +System.out.println(response.toString()); +``` + +
+
+ +```python +import requests + +{{?data.allHeaders.length}}headers = { +{{~data.allHeaders :p:index}} '{{=p.name}}': {{=p.exampleValues.json}}{{?index < data.allHeaders.length-1}},{{?}} +{{~}}} +{{?}} +r = requests.{{=data.method.verb}}( + '{{=data.url}}', + params={{{~ data.requiredParameters :p:index}} + '{{=p.name}}': {{=p.exampleValues.json}}{{? data.requiredParameters.length-1 != index }},{{?}}{{~}}{{?data.allHeaders.length}}}, + headers = headers{{?}}) + +print r.json() +``` + +
+
+ +```ruby +require 'rest-client' +require 'json' + +{{?data.allHeaders.length}}headers = { +{{~data.allHeaders :p:index}} '{{=p.name}}' => {{=p.exampleValues.json}}{{?index < data.allHeaders.length-1}},{{?}} +{{~}}}{{?}} + +result = RestClient.{{=data.method.verb}} '{{=data.url}}', + params: {{{~ data.requiredParameters :p:index}} + '{{=p.name}}' => '{{=p.safeType}}'{{? data.requiredParameters.length-1 != index }},{{?}}{{~}}}{{? data.allHeaders.length}}, headers: headers +{{?}} + +p JSON.parse(result) +``` + +
+
+
+{{?}} diff --git a/docs/.widdershins/templates/parameters.def b/docs/.widdershins/templates/parameters.def new file mode 100644 index 0000000000..4bb8cd770b --- /dev/null +++ b/docs/.widdershins/templates/parameters.def @@ -0,0 +1,39 @@ + +##### Parameters + +|Parameter|In|Type|Required|Description| +|---|---|---|---|---| +{{~ data.parameters :p}}|{{=p.name}}|{{=p.in}}|{{=p.safeType}}|{{=p.required}}|{{=p.shortDesc || 'none'}}| +{{~}} + +{{? data.longDescs }} +##### Detailed descriptions +{{~ data.parameters :p}}{{? p.shortDesc !== p.description}} +**{{=p.name}}**: {{=p.description}}{{?}} +{{~}} +{{?}} + +{{~ data.parameters :p}} + +{{? p.schema && p.schema.enum }} +{{~ p.schema.enum :e}} +{{ var entry = {}; entry.name = p.name; entry.value = e; data.enums.push(entry); }} +{{~}} +{{?}} + +{{? p.schema && p.schema.items && p.schema.items.enum }} +{{~ p.schema.items.enum :e}} +{{ var entry = {}; entry.name = p.name; entry.value = e; data.enums.push(entry); }} +{{~}} +{{?}} + +{{~}} + +{{? data.enums && data.enums.length }} +##### Enumerated Values + +|Parameter|Value| +|---|---| +{{~ data.enums :e}}|{{=e.name}}|{{=data.utils.toPrimitive(e.value)}}| +{{~}} +{{?}} diff --git a/docs/.widdershins/templates/responses.def b/docs/.widdershins/templates/responses.def new file mode 100644 index 0000000000..a073e24dc8 --- /dev/null +++ b/docs/.widdershins/templates/responses.def @@ -0,0 +1,92 @@ +{{ data.responses = data.utils.getResponses(data); }} +{{ data.responseSchemas = false; }} +{{~ data.responses :response }} +{{ if (response.content) data.responseSchemas = true; }} +{{~}} + +#### Responses + + +##### Overview + +|Status|Meaning|Description|Schema| +|---|---|---|---| +{{~ data.responses :r}}|{{=r.status}}|{{=r.meaning}}|{{=r.description || 'none'}}|{{=r.schema}}| +{{~}} + +{{ data.responseSchemas = false; }} +{{~ data.responses :response }} +{{ if (response.content && !response.$ref && !data.utils.isPrimitive(response.type)) data.responseSchemas = true; }} +{{~}} +{{? data.responseSchemas }} + +##### Response Schema +{{~ data.responses :response}} +{{? response.content && !response.$ref && !data.utils.isPrimitive(response.type)}} +{{ var responseKey = Object.keys(response.content)[0]; }} +{{ var responseSchema = response.content[responseKey].schema; }} +{{ var enums = []; }} +{{ var blocks = data.utils.schemaToArray(responseSchema,0,{trim:true,join:true},data); }} +{{ for (var block of blocks) { + for (var p of block.rows) { + if (p.schema && p.schema.enum) { + for (var e of p.schema.enum) { + enums.push({name:p.name,value:e}); + } + } + } + } +}} + +{{? blocks[0].rows.length || blocks[0].title }} +Status Code **{{=response.status}}** + +{{~ blocks :block}} +{{? block.title }}*{{=block.title}}* +{{?}} +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +{{~block.rows :p}}|{{=p.displayName}}|{{=p.safeType}}|{{=p.required}}|{{=p.restrictions||'none'}}|{{=p.description||'none'}}| +{{~}} +{{~}} +{{?}} + +{{? enums.length > 0 }} +###### Enumerated Values + +|Property|Value| +|---|---| +{{~ enums :e}}|{{=e.name}}|{{=data.utils.toPrimitive(e.value)}}| +{{~}} + +{{?}} + +{{ data.response = response; }} +{{#def.links}} + +{{?}} +{{~}} +{{?}} + +{{ data.responseHeaders = data.utils.getResponseHeaders(data); }} +{{? data.responseHeaders.length }} + +##### Response Headers + +|Status|Header|Type|Format|Description| +|---|---|---|---|---| +{{~ data.responseHeaders :h}}|{{=h.status}}|{{=h.header}}|{{=h.type}}|{{=h.format||''}}|{{=h.description||'none'}}| +{{~}} + +{{?}} + +{{ data.responseSchemas = false; }} +{{~ data.responses :response }} +{{ if (response.content) data.responseSchemas = true; }} +{{~}} + +{{? data.responseSchemas }} +##### Examples + +{{= data.utils.getResponseExamples(data) }} +{{?}} diff --git a/docs/.widdershins/templates/security.def b/docs/.widdershins/templates/security.def new file mode 100644 index 0000000000..f3e330d83f --- /dev/null +++ b/docs/.widdershins/templates/security.def @@ -0,0 +1,16 @@ +## Authentication + +{{ for (var s in data.api.components.securitySchemes) { }}{{ var sd = data.api.components.securitySchemes[s]; }}{{? sd.type == 'apiKey' }} +* API Key ({{=s}}) + - Parameter Name: **{{=sd.name}}**, in: {{=sd.in}}. {{=sd.description || ''}}{{?}}{{? sd.type == 'http'}} +- HTTP Authentication, scheme: {{=sd.scheme}} {{=sd.description || ''}}{{?}}{{? sd.type == 'oauth2'}} +- OAuth 2.0 Authorization. {{=sd.description || ''}} + {{ for (var f in sd.flows) { }}{{ var flow = sd.flows[f]; }}- Flow: {{=f}}{{? flow.authorizationUrl}} + - OAuth 2.0 Authorization URL = [{{=flow.authorizationUrl}}]({{=flow.authorizationUrl}}){{?}}{{? flow.tokenUrl}} + - OAuth 2.0 Token URL = [{{=flow.tokenUrl}}]({{=flow.tokenUrl}}){{?}}{{? flow.scopes}} + - OAuth 2.0 Scope + + |Scope|Scope Description| + |---|---| + {{ for (var sc in flow.scopes) { }}|{{=sc}}|{{=data.utils.join(flow.scopes[sc])}}| + {{ } /* of scopes */ }}{{?}}{{ } /* of flows */ }}{{?}}{{ } /* of securitySchemes */ }} \ No newline at end of file diff --git a/docs/.widdershins/templates/translations.dot b/docs/.widdershins/templates/translations.dot new file mode 100644 index 0000000000..fe07658ce4 --- /dev/null +++ b/docs/.widdershins/templates/translations.dot @@ -0,0 +1,16 @@ +{{ +data.translations.defaultTag = 'Default'; +data.translations.response = 'Response'; +data.translations.responseDefault = 'Default'; +data.translations.responseUnknown = 'Unknown'; +data.translations.schemaInline = 'Inline'; +data.translations.schemaNone = 'None'; +data.translations.externalDocs = 'External documentation'; +data.translations.secDefNone = 'None'; +data.translations.secDefScopes = 'Scopes'; +data.translations.anonymous = 'anonymous'; +data.translations.continued = 'continued'; +data.translations.indent = 'ยป'; +data.translations.readOnly = 'read-only'; +data.translations.writeOnly = 'write-only'; +}} diff --git a/docs/README.md b/docs/README.md index 97dff6f195..9e7a27bf13 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,2 +1,75 @@ -The [documentation](https://www.ory.sh/docs) has moved to -[another GitHub repository](https://github.com/ory/docs). +# Documentation + +This directory contains the project's documentation. + +## Develop + +To change the documentation locally, you need NodeJS installed. +Next, install the dependencies: + +``` +$ npm +``` + +### Develop + +``` +$ npm start +``` + +This command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server. + +### Build + +``` +$ npm build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +## Create Documentation + +To create a new documentation for a new or existing project, copy the contents (without `node_modules`) +into the project's `./docs` directory. Next you need to create these files (relative to the project's root directory) +directory: + +```js +// ./docs/config.js +// +// This file contains the project's name and slug and tag line, for example: +module.exports = { + projectName: 'ORY Keto', + projectSlug: 'keto', + projectTagLine: 'A cloud native access control server providing best-practice patterns (RBAC, ABAC, ACL, AWS IAM Policies, Kubernetes Roles, ...) via REST APIs.', + updateTags: [ + { + image: 'oryd/keto', + files: ['docs/docs/configure-deploy.md'] + } + ], + updateConfig: { + src: '.schema/config.schema.json', + dst: './docs/docs/reference/configuration.md' + } +}; +``` + +```js +// ./docs/sidebar.js +// +// This represents the sidebar navigation, for example: +module.exports = { + Introduction: [ + "index", + "install", + ], +}; +``` + +``` +// ./docs/src/css/theme.css +// empty file is ok +``` + +Next, put your markdown files in `./docs/docs`. You may also want to add the CircleCI Orb `ory/docs` to your CI config, +depending on the project type. diff --git a/docs/config.js b/docs/config.js new file mode 100644 index 0000000000..cf8f02ce70 --- /dev/null +++ b/docs/config.js @@ -0,0 +1,18 @@ +module.exports = { + projectName: 'ORY Oathkeeper', + projectSlug: 'oathkeeper', + projectTagLine: 'A cloud native Identity & Access Proxy / API (IAP) and Access Control Decision API that authenticates, authorizes, and mutates incoming HTTP(s) requests. Inspired by the BeyondCorp / Zero Trust white paper. Written in Go.', + updateTags: [ + { + image: 'oryd/oathkeeper', + files: [ + 'docs/docs/install.md', + 'docs/docs/configure-deploy.md' + ] + } + ], + updateConfig: { + src: '.schema/config.schema.json', + dst: './docs/docs/reference/configuration.md' + } +}; diff --git a/docs/config.yaml b/docs/config.yaml deleted file mode 100644 index 24a9ed034a..0000000000 --- a/docs/config.yaml +++ /dev/null @@ -1 +0,0 @@ -# This file moved to: https://www.ory.sh/docs/oathkeeper/configuration diff --git a/docs/contrib/config.js b/docs/contrib/config.js new file mode 100644 index 0000000000..025c5e8454 --- /dev/null +++ b/docs/contrib/config.js @@ -0,0 +1,25 @@ +const fs = require('fs'); +const path = require('path'); + +let config = { + projectName: 'ORY Template', + projectSlug: 'docusaurus-template', + projectTagLine: 'Stubbydi dab dub dadada', + updateTags: [ + { + image: 'oryd/docusaurus-template', + files: ['docs/docs/configure-deploy.md'], + }, + ], + updateConfig: { + src: '.schema/config.schema.json', + dst: './docs/docs/reference/configuration.md', + }, +}; + +const cn = path.join(__dirname, '..', 'config.js'); +if (fs.existsSync(cn)) { + config = require(cn); +} + +module.exports = config; diff --git a/docs/contrib/docs/index.md b/docs/contrib/docs/index.md new file mode 100644 index 0000000000..154c3c2879 --- /dev/null +++ b/docs/contrib/docs/index.md @@ -0,0 +1,5 @@ +--- +id: index +title: Docusaurus Project Template +sidebar_label: Template +--- diff --git a/docs/contrib/sidebar.js b/docs/contrib/sidebar.js new file mode 100644 index 0000000000..3ac05836f4 --- /dev/null +++ b/docs/contrib/sidebar.js @@ -0,0 +1,55 @@ +const config = require('./config.js'); +const fs = require('fs'); +const path = require('path'); + +const projects = [ + { + slug: 'kratos', + name: 'ORY Kratos', + }, + { + slug: 'hydra', + name: 'ORY Hydra', + }, + { + slug: 'oathkeeper', + name: 'ORY Oathkeeper', + }, + { + slug: 'Keto', + name: 'ORY Keto', + }, +].filter((item) => config.projectSlug !== item.slug); + +let sidebar = { + Welcome: ['index'], +}; + +const cn = path.join(__dirname, '..', 'sidebar.js'); +if (fs.existsSync(cn)) { + sidebar = require(cn); +} + +projects.forEach((item) => { + sidebar[item.name] = [ + { + type: 'link', + label: 'Home', + href: `https://www.ory.sh/${item.slug}`, + }, + { + type: 'link', + label: 'Docs', + href: `https://www.ory.sh/${item.slug}/docs`, + }, + { + type: 'link', + label: 'GitHub', + href: `https://github.com/ory/${item.slug}`, + }, + ]; +}); + +module.exports = { + docs: sidebar, +}; diff --git a/docs/contrib/theme.css b/docs/contrib/theme.css new file mode 100644 index 0000000000..46b15735b5 --- /dev/null +++ b/docs/contrib/theme.css @@ -0,0 +1,3 @@ +:root { + --ifm-color-primary: #6274f3; +} diff --git a/docs/docs/.gitkeep b/docs/docs/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/docs/api-access-rules.md b/docs/docs/api-access-rules.md new file mode 100644 index 0000000000..edd0283b6b --- /dev/null +++ b/docs/docs/api-access-rules.md @@ -0,0 +1,263 @@ +--- +id: api-access-rules +title: API Access Rules +--- + +ORY Oathkeeper reaches decisions to allow or deny access by applying Access +Rules. Access Rules can be stored on the file system, set as an environment +variable, or fetched from HTTP(s) remotes. These repositories can be configured +in the configuration file (`oathkeeper -c ./path/to/config.yml ...`) + +```yaml +# Configures Access Rules +access_rules: + # Locations (list of URLs) where access rules should be fetched from on boot. + # It is expected that the documents at those locations return a JSON or YAML Array containing ORY Oathkeeper Access Rules. + repositories: + # If the URL Scheme is `file://`, the access rules (an array of access rules is expected) will be + # fetched from the local file system. + - file://path/to/rules.json + # If the URL Scheme is `inline://`, the access rules (an array of access rules is expected) + # are expected to be a base64 encoded (with padding!) JSON/YAML string (base64_encode(`[{"id":"foo-rule","authenticators":[....]}]`)): + - inline://W3siaWQiOiJmb28tcnVsZSIsImF1dGhlbnRpY2F0b3JzIjpbXX1d + # If the URL Scheme is `http://` or `https://`, the access rules (an array of access rules is expected) will be + # fetched from the provided HTTP(s) location. + - https://path-to-my-rules/rules.json + # Determines a matching strategy for the access rules . Currently supported values are `glob` and `regexp`. Empty string defaults to regexp. + matching_strategy: glob +``` + +or by setting the equivalent environment variable: + +```bash +$ export ACCESS_RULES_REPOSITORIES='file://path/to/rules.json,https://path-to-my-rules/rules.json,inline://W3siaWQiOiJmb28tcnVsZSIsImF1dGhlbnRpY2F0b3JzIjpbXX1d' +``` + +The repository (file, inline, remote) must be formatted either as a JSON or a +YAML array containing the access rules: + +```shell +$ cat ./rules.json +[{ + "id": "my-first-rule" +},{ + "id": "my-second-rule" +}] + +$ cat ./rules.yaml +- id: my-first-rule + version: v0.36.0-beta.4 + authenticators: + - handler: noop +- id: my-second-rule + version: v0.36.0-beta.4 + authorizer: + handler: allow +``` + +## Access Rule Format + +Access Rules have four principal keys: + +- `id` (string): The unique ID of the Access Rule. +- `version` (string): The version of ORY Oathkeeper this rule targets with out + the `+oryOS.` appendix. ORY Oathkeeper is able to migrate access rules + across versions. If left empty ORY Oathkeeper will assume that the rule is + using the same tag as the version that is running. +- `upstream` (object): The location of the server where requests matching this + rule should be forwarded to. This only needs to be set when using the ORY + Oathkeeper Proxy as the Decision API does not forward the request to the + upstream. + - `url` (string): The URL the request will be forwarded to. + - `preserve_host` (bool): If set to `false` (default), the forwarded request + will include the host and port of the `url` value. If `true`, the host and + port of the ORY Oathkeeper Proxy will be used instead: + - `false`: Incoming HTTP Header `Host: mydomain.com`-> Forwarding HTTP + Header `Host: someservice.intranet.mydomain.com:1234` + - `strip_path` (string): If set, replaces the provided path prefix when + forwarding the requested URL to the upstream URL: + - set to `/api/v1`: Incoming HTTP Request at `/api/v1/users` -> Forwarding + HTTP Request at `/users`. + - unset: Incoming HTTP Request at `/api/v1/users` -> Forwarding HTTP Request + at `/api/v1/users`. +- `match` (object): Defines the URL(s) this Access Rule should match. + - `methods` (string[]): Array of HTTP methods (e.g. GET, POST, PUT, DELETE, + ...). + - `url` (string): The URL that should be matched. You can use regular + expressions or glob patterns in this field to match more than one url. The + matching strategy (glob or regexp) is defined in the global configuration + file as `access_rules.matching_strategy`. This matcher ignores query + parameters. Regular expressions (or glob patterns) are encapsulated in + brackets `<` and `>`. Regular expressions examples: + - `https://mydomain.com/` matches `https://mydomain.com/` and does not match + `https://mydomain.com/foo` or `https://mydomain.com`. + - `://mydomain.com/<.*>` matches:`https://mydomain.com/` or + `http://mydomain.com/foo`. Does not match: `https://other-domain.com/` or + `https://mydomain.com`. + - `http://mydomain.com/<[[:digit:]]+>` matches `http://mydomain.com/123` and + does not match `http://mydomain/abc`. + - `http://mydomain.com/<(?!protected).*>` matches + `http://mydomain.com/resource` and does not match + `http://mydomain.com/protected` + [Glop](http://tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm) + patterns examples: + - `https://mydomain.com/` matches `https://mydomain.com/man` and does + not match `http://mydomain.com/foo`. + - `https://mydomain.com/<{foo*,bar*}>` matches `https://mydomain.com/foo` or + `https://mydomain.com/bar` and does not match `https://mydomain.com/any`. +- `authenticators`: A list of authentication handlers that authenticate the + provided credentials. Authenticators are checked iteratively from index `0` to + `n` and the first authenticator to return a positive result will be the one + used. If you want the rule to first check a specific authenticator before + "falling back" to others, have that authenticator as the first item in the + array. For the full list of available authenticators, click + [here](pipeline/authn.md). +- `authorizer`: The authorization handler which will try to authorize the + subject ("user") from the previously validated credentials making the request. + For example, you could check if the subject ("user") is part of the "admin" + group or if he/she has permission to perform that action. For the full list of + available authorizers, click [here](pipeline/authz.md). +- `mutators`: A list of mutation handlers that transform the HTTP request before + forwarding it. A common use case is generating a new set of credentials (e.g. + JWT) which then will be forwarded to the upstream server. When using ORY + Oathkeeper's Decision API, it is expected that the API Gateway forwards the + mutated HTTP Headers to the upstream server. For the full list of available + mutators, click [here](pipeline/mutator.md). +- `errors`: A list of error handlers that are executed when any of the previous + handlers (e.g. authentication) fail. Error handlers define what to do in case + of an error, for example redirect the user to the login endpoint when a + unauthorized (HTTP Status Code 401) error occurs. If left unspecified, errors + will always be handled as JSON responses unless the global configuration key + `errors.fallback` was changed. For more information on error handlers, click + [here](pipeline/error.md). + +**Examples** + +Rule in JSON format: + +```json +{ + "id": "some-id", + "version": "v0.36.0-beta.4", + "upstream": { + "url": "http://my-backend-service", + "preserve_host": true, + "strip_path": "/api/v1" + }, + "match": { + "url": "http://my-app/some-route/<.*>", + "methods": ["GET", "POST"] + }, + "authenticators": [{ "handler": "noop" }], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }], + "errors": [{ "handler": "json" }] +} +``` + +Rule in YAML format: + +```yaml +id: some-id +version: v0.36.0-beta.4 +upstream: + url: http://my-backend-service + preserve_host: true + strip_path: /api/v1 +match: + url: http://my-app/some-route/<.*> + methods: + - GET + - POST +authenticators: + - handler: noop +authorizer: + hander: allow +mutators: + - handler: noop +errors: + - handler: json +``` + +## Handler configuration + +Handlers (Authenticators, Mutators, Authorizers, Errors) sometimes require +configuration. The configuration can be defined globally as well as per Access +Rule. The configuration from the Access Rule is overrides values from the global +configuration. + +**oathkeeper.yml** + +```yaml +authenticators: + anonymous: + enabled: true + config: + subject: anon +``` + +**rule.json** + +```json +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service", + "preserve_host": true, + "strip_path": "/api/v1" + }, + "match": { + "url": "http://my-app/some-route/<.*>", + "methods": ["GET", "POST"] + }, + "authenticators": [ + { "handler": "anonymous", "config": { "subject": "anon" } } + ], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }] +} +``` + +## Scoped Credentials + +Some credentials are scoped. For example, OAuth 2.0 Access Tokens usually are +scoped ("OAuth 2.0 Scope"). Scope validation depends on the meaning of the +scope. Therefore, wherever ORY Oathkeeper validates a scope, these scope +strategies are supported: + +- `hierarchic`: Scope `foo` matches `foo`, `foo.bar`, `foo.baz` but not `bar` +- `wildcard`: Scope `foo.*` matches `foo`, `foo.bar`, `foo.baz` but not `bar`. + Scope `foo` matches `foo` but not `foo.bar` nor `bar` +- `exact`: Scope `foo` matches `foo` but not `bar` nor `foo.bar` +- `none`: Scope validation is disabled. If however a scope is configured to be + validated, the request will fail with an error message. + +## Match strategy behavior + +With the **Regular expression** strategy, you can use the extracted groups in +all handlers where the substitutions are supported by using the Go +[`text/template`](https://golang.org/pkg/text/template/) package, receiving the +[AuthenticationSession](https://github.com/ory/oathkeeper/blob/master/pipeline/authn/authenticator.go#L39) +struct: + +```go +type AuthenticationSession struct { + Subject string + Extra map[string]interface{} + Header http.Header + MatchContext MatchContext +} + +type MatchContext struct { + RegexpCaptureGroups []string + URL *url.URL +} +``` + +**Examples** + +If the match URL is `://mydomain.com/<.*>` and the request is +`http://mydomain.com/foo`, the `MatchContext` field will contain + +- `RegexpCaptureGroups`: ["http", "foo"] +- `URL`: "http://mydomain.com/foo" diff --git a/docs/docs/configure-deploy.md b/docs/docs/configure-deploy.md new file mode 100644 index 0000000000..897a5f50f4 --- /dev/null +++ b/docs/docs/configure-deploy.md @@ -0,0 +1,371 @@ +--- +id: configure-deploy +title: Configure and Deploy +--- + +The ORY Oathkeeper HTTP serve process `oathkeeper serve` opens two ports +exposing the + +- [reverse proxy](index.md#reverse-proxy) +- REST API which serves the + [Access Control Decision API](index.md#access-control-decision-api) as well as + other API endpoints such as health checks, JSON Web Key Sets, and a list of + available rules. + +For this guide we are using Docker. ORY Oathkeeper however can be +[installed in a variety of ways](install.md). + +## Configure + +ORY Oathkeeper can be configured via the filesystem as well as environment +variables. For more information on mapping the keys to environment variables +please head over to the [configuration chapter](configuration.md). + +First, create an empty directory and `cd` into it: + +```shell +$ mkdir oathkeeper-demo +$ cd oathkeeper-demo +``` + +Create a file called `config.yaml` with the following content: + +```shell +$ cat << EOF > config.yaml +serve: + proxy: + port: 4455 # run the proxy at port 4455 + api: + port: 4456 # run the api at port 4456 + +access_rules: + repositories: + - file:///rules.json + +errors: + fallback: + - json + handlers: + json: + enabled: true + config: + verbose: true + redirect: + enabled: true + config: + to: https://www.ory.sh/docs + +mutators: + header: + enabled: true + config: + headers: + X-User: "{{ print .Subject }}" + # You could add some other headers, for example with data from the + # session. + # X-Some-Arbitrary-Data: "{{ print .Extra.some.arbitrary.data }}" + noop: + enabled: true + id_token: + enabled: true + config: + issuer_url: http://localhost:4455/ + jwks_url: file:///jwks.json + +authorizers: + allow: + enabled: true + deny: + enabled: true + +authenticators: + anonymous: + enabled: true + config: + subject: guest +EOF +``` + +This configuration file will run the proxy at port 4455, the api at port 4456, +and enable the anonymous authenticator, the allow and deny authorizers, and the +noop and id_token mutators. + +### Access Rules + +We will be using [httpbin.org](https://httpbin.org) as the upstream server. The +service echoes incoming HTTP Requests and is perfect for seeing how ORY +Oathkeeper works. Let's define three rules: + +1. An access rule that allowing anonymous access to + `https://httpbin.org/anything/cookie` and using the `cookie` mutator. +2. An access rule denying every access to `https://httpbin.org/anything/deny`. + If the request header has `Accept: application/json`, we will receive a JSON + response. If however the accept header has `Accept: text/*`, a HTTP Redirect + will be sent (to `https://www.ory.sh/docs` as configured above). +3. An access rule allowing anonymous access to + `https://httpbin.org/anything/id_token` and using the `id_token` mutator. + +```shell +$ cat << EOF > rules.json +[ + { + "id": "allow-anonymous-with-header-mutator", + "version": "v0.36.0-beta.4", + "upstream": { + "url": "https://httpbin.org/anything/header" + }, + "match": { + "url": "http://<127.0.0.1|localhost>:4455/anything/header", + "methods": [ + "GET" + ] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "header", + "config": { + "headers": { + "X-User": "{{ print .Subject }}" + } + } + } + ] + }, + { + "id": "deny-anonymous", + "version": "v0.36.0-beta.4", + "upstream": { + "url": "https://httpbin.org/anything/deny" + }, + "match": { + "url": "http://<127.0.0.1|localhost>:4455/anything/deny", + "methods": [ + "GET" + ] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "deny" + }, + "mutators": [ + { + "handler": "noop" + } + ], + "errors": [ + { + "handler": "json", + "config": { + "when": [ + { + "request": { + "header": { + "accept": ["application/json"] + } + } + } + ] + } + }, + { + "handler": "redirect", + "config": { + "when": [ + { + "request": { + "header": { + "accept": ["text/*"] + } + } + } + ] + } + } + ] + }, + { + "id": "allow-anonymous-with-id-token-mutator", + "version": "v0.36.0-beta.4", + "upstream": { + "url": "https://httpbin.org/anything/id_token" + }, + "match": { + "url": "http://<127.0.0.1|localhost>:4455/anything/id_token", + "methods": [ + "GET" + ] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "id_token" + } + ] + } +] +EOF +``` + +### Cryptographic Keys + +The `id_token` mutator creates a signed JSON Web Token. For that to work, a +public/private key is required. Luckily, ORY Oathkeeper can assist you in +creating such keys. All common JWT algorithms are supported (RS256, ES256, +HS256, ...). Let's generate a key for the RS256 algorithm that will be used by +the id_token mutator: + +```sh +$ docker run oryd/oathkeeper:v0.37.1-beta.1 credentials generate --alg RS256 > jwks.json +``` + +### Dockerfile + +Next we will be creating a custom Docker Image that adds these configuration +files to the image: + +```shell +$ cat << EOF > Dockerfile +FROM oryd/oathkeeper:v0.37.1-beta.1 + +ADD config.yaml /config.yaml +ADD rules.json /rules.json +ADD jwks.json /jwks.json +EOF +``` + +We are doing this for demonstration purposes only. In a production environment +you would separate these configuration values from the build artifact itself. In +Kuberentes, it would make most sense to provide the JSON Web Keys as a +Kubernetes Secret mounted as in a directory, for example. + +We encourage you to check out our [helm charts](https://k8s.ory.sh/helm/) which +apply these best practices. + +## Build & Run + +Before building the Docker Image, we need to make sure that the local ORY +Oathkeeper Docker Image is on the most recent version: + +```sh +$ docker pull oryd/oathkeeper:v0.37.1-beta.1 +``` + +Next we will build our custom Docker Image + +```sh +$ docker build -t ory-oathkeeper-demo . +``` + +and run it + +``` +$ docker run --rm \ + --name ory-oathkeeper-demo \ + -p 4455:4455 \ + -p 4456:4456 \ + ory-oathkeeper-demo \ + --config /config.yaml \ + serve +``` + +Let's open a new terminal and check if it is alive: + +``` +$ curl http://127.0.0.1:4456/health/alive +{"status":"ok"} + +$ curl http://127.0.0.1:4456/health/ready +{"status":"ok"} +``` + +Let's also check if the rules have been imported properly: + +``` +$ curl http://127.0.0.1:4456/rules +[{"id":"allow-anonymous-with-header-mutator","description":"","match":{"methods":["GET"],... +``` + +## Authorizing Requests + +Everything is up and running and configured! Let's make some requests: + +``` +$ curl -X GET http://127.0.0.1:4455/anything/header +{ + "args": {}, + "data": "", + "files": {}, + "form": {}, + "headers": { + "Accept": "*/*", + "Accept-Encoding": "gzip", + "Host": "httpbin.org", + "User-Agent": "curl/7.54.0", + "X-User": "guest" + }, + "json": null, + "method": "GET", + "origin": "172.17.0.1, 82.135.11.242, 172.17.0.1", + "url": "https://httpbin.org/anything/header/anything/header" +} + +# Make request and accept JSON (we get an error response) +$ curl -H "Accept: application/json" -X GET http://127.0.0.1:4455/anything/deny +{ + "error":{ + "code":403, + "status":"Forbidden", + "message":"Access credentials are not sufficient to access this resource" + } +} + +# Make request and accept text/* (we get a redirect response). +$ curl -H "Accept: text/html" -X GET http://127.0.0.1:4455/anything/deny +Found. + +$ curl -X GET http://127.0.0.1:4455/anything/id_token +{ + "args": {}, + "data": "", + "files": {}, + "form": {}, + "headers": { + "Accept": "*/*", + "Accept-Encoding": "gzip", + "Authorization": "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjU3N2E2NWE0LTUzM2YtNDFhYi1hODI2LTgxNDliMDM2NDQ0MyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NTgwMTg1MTcsImlhdCI6MTU1ODAxODQ1NywiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo0NDU1LyIsImp0aSI6IjExNmRiNzhmLTQyMjEtNDU2ZC05OWIzLTY4NGJkMWVjYThjZSIsIm5iZiI6MTU1ODAxODQ1Nywic3ViIjoiZ3Vlc3QifQ.2VKW-oYtzkFGRPgK3sb4iRlObDSzW8PyHzgNiQubppFSlp0bzJLl4Rnt56orJndPqIa7hwsm8YIskf-Wp-FA1piv-aG_XljkUjgilKr3cncMXDP15yDRwZj8g0iVKEhnugQsw_zWf5gMU2YBev2Eyv4xciJxbhrKCat-X8xNT9SvAbwpY-VxQdu_rnpu1GKCA54DyIX6r-Qh5bQPrrT7NvIupA7jJQ23qq83m4C1cQfBgzlhm7dcCuPqKunYKRsc7NZuER3lT6TjkhsF1qhf7o7BZmCnhz6VuH8L8TwMZS8IJWKSjJd8dEKKwxwPkNXOcZO8A3hIO8SZx4Yd7jrONA", + "Host": "httpbin.org", + "User-Agent": "curl/7.54.0" + }, + "json": null, + "method": "GET", + "origin": "172.17.0.1, 82.135.11.242, 172.17.0.1", + "url": "https://httpbin.org/anything/id_token/anything/id_token" +} +``` + +That's it! You can now clean up the demo using: + +``` +$ docker rm -f ory-oathkeeper-demo +$ docker rmi -f ory-oathkeeper-demo +$ rm -rf oathkeeper-demo +``` diff --git a/docs/docs/index.md b/docs/docs/index.md new file mode 100644 index 0000000000..956ceb4ada --- /dev/null +++ b/docs/docs/index.md @@ -0,0 +1,211 @@ +--- +id: index +title: Introduction +--- + +ORY Oathkeeper authorizes incoming HTTP requests. It can be the Policy +Enforcement Point in your cloud architecture, i.e. a reverse proxy in front of +your upstream API or web server that rejects unauthorized requests and forwards +authorized ones to your server. If you want to use another API Gateway (Kong, +Nginx, Envoy, AWS API Gateway, ...), Oathkeeper can also plug into that and act +as its Policy Decision Point. + +The implemented problem domain and scope is called Zero-Trust Network +Architecture, [BeyondCorp](https://www.beyondcorp.com), and Identity And Access +Proxy (IAP). + +While ORY Oathkeeper works well with ORY Hydra and ORY Keto, ORY Oathkeeper can +be used completely standalone and alongside other stacks with adjacent problem +domains (Keycloak, Gluu, Vault, ...). ORY Oathkeeper's Access Control Decision +API works with + +- [Ambassador](https://github.com/datawire/ambassador) via + [auth service](https://www.getambassador.io/reference/services/auth-service) +- [Envoy](https://www.envoyproxy.io) via the + [External Authorization HTTP Filter](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/security/ext_authz_filter.html) +- AWS API Gateway via + [Custom Authorizers](https://aws.amazon.com/de/blogs/compute/introducing-custom-authorizers-in-amazon-api-gateway/) +- [Nginx](https://www.nginx.com) via + [Authentication Based on Subrequest Result](https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-subrequest-authentication/) + +among others. + +## Dependencies + +ORY Oathkeeper does not have any dependencies to other services. It can work +completely in isolation and does not require a database or any other type of +persistent storage. ORY Oathkeeper is configurable with yaml configuration +files, JSON files, and environment variables. + +## Operating Modes + +Starting Oathkeeper via `oathkeeper serve` exposes two ports: One port serves +the reverse proxy, the other ORY Oathkeeper's API. + +### Reverse Proxy + +The port exposing the reverse proxy forwards requests to the upstream server, +defined in the rule, if the request is allowed. If the request is not allowed, +ORY Oathkeeper does not forward the request and instead returns an error +message. + +[![ORY Oathkeeper deployed as a Reverse Proxy](https://mermaid.ink/img/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAgICBwYXJ0aWNpcGFudCBPIGFzIE9hdGhrZWVwZXIgUHJveHlcbiAgICBwYXJ0aWNpcGFudCBBIGFzIFByb3RlY3RlZCBTZXJ2ZXIvQVBJXG4gICAgQy0-Pk86IEhUVFAgUmVxdWVzdFxuICAgIE8tLT4-TzogQ2hlY2sgaWYgcmVxdWVzdCBpcyBhbGxvd2VkXG4gICAgYWx0IGlzIG5vdCBhbGxvd2VkXG4gICAgTy0-PkM6IFJldHVybiBIVFRQIEVycm9yIFxuICAgIGVsc2UgaXMgYWxsb3dlZFxuICAgIE8tPj5BOiBGb3J3YXJkIEhUVFAgUmVxdWVzdCBcbiAgICBBLT4-TzogUmV0dXJuIEhUVFAgUmVzcG9uc2VcbiAgICBPLT4-QzogUmV0dXJuIEhUVFAgUmVzcG9uc2VcbiAgICBlbmQiLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAgICBwYXJ0aWNpcGFudCBPIGFzIE9hdGhrZWVwZXIgUHJveHlcbiAgICBwYXJ0aWNpcGFudCBBIGFzIFByb3RlY3RlZCBTZXJ2ZXIvQVBJXG4gICAgQy0-Pk86IEhUVFAgUmVxdWVzdFxuICAgIE8tLT4-TzogQ2hlY2sgaWYgcmVxdWVzdCBpcyBhbGxvd2VkXG4gICAgYWx0IGlzIG5vdCBhbGxvd2VkXG4gICAgTy0-PkM6IFJldHVybiBIVFRQIEVycm9yIFxuICAgIGVsc2UgaXMgYWxsb3dlZFxuICAgIE8tPj5BOiBGb3J3YXJkIEhUVFAgUmVxdWVzdCBcbiAgICBBLT4-TzogUmV0dXJuIEhUVFAgUmVzcG9uc2VcbiAgICBPLT4-QzogUmV0dXJuIEhUVFAgUmVzcG9uc2VcbiAgICBlbmQiLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ) + +#### Example + +Assuming the following request + +``` +GET /my-service/whatever HTTP/1.1 +Host: oathkeeper-proxy:4455 +Authorization: bearer some-token +``` + +and you have the following rule defined (which allows this request) + +```json +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://oathkeeper-proxy:4455/my-service/whatever", + "methods": ["GET"] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "noop" + } + ] +} +``` + +then the request will be forwarded by ORY Oathkeeper as follows: + +``` +GET /my-service/whatever HTTP/1.1 +Host: my-backend-service:4455 +Authorization: bearer some-token +``` + +The response of this request will then be sent to the client that made the +request to ORY Oathkeeper. + +### Access Control Decision API + +The ORY Oathkeeper Access Control Decision API follows best-practices and works +with most (if not all) modern API gateways and reverse proxies. To verify a +request, send it to the `decisions` endpoint located at the Ory Authkeeper API +port. It matches every sub-path and HTTP Method: + +- `GET /decisions/v1/api` +- `PUT /decisions/my/other/api` +- `DELETE /decisions/users?foo=?bar` + +When matching a rule, the `/decision` prefix is stripped from the matching path. + +[![ORY Oathkeeper deployed as an Decision API](https://mermaid.ink/img/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAgICBwYXJ0aWNpcGFudCBBRyBhcyBBUEkgR2F0ZXdheVxuICAgIHBhcnRpY2lwYW50IE8gYXMgT2F0aGtlZXBlciBBUElcbiAgICBwYXJ0aWNpcGFudCBBIGFzIFByb3RlY3RlZCBTZXJ2ZXIvQVBJXG4gICAgQy0-PkFHOiBIVFRQIFJlcXVlc3RcbiAgICBBRy0-Pk86IEFzayBqdWRnZSBBUEkgZm9yIGF1dGhvcml6YXRpb25cblxuICAgIGFsdCBpcyBhbGxvd2VkXG4gICAgTy0-PkFHOiBSZXR1cm4gYXV0aCBpbmZvXG4gICAgQUctPj5BOiBGb3J3YXJkIEhUVFAgUmVxdWVzdFxuICAgIEEtPj5BRzogUmV0dXJuIEhUVFAgUmVzcG9uc2VcbiAgICBBRy0-PkM6IFJldHVybiBIVFRQIFJlc3BvbnNlXG4gICAgZWxzZSBpcyBub3QgYWxsb3dlZFxuICAgIE8tPj5BRzogRGVueSByZXF1ZXN0XG4gICAgQUctPj5DOiBSZXR1cm4gSFRUUCBFcnJvclxuICAgIGVuZCIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In19)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAgICBwYXJ0aWNpcGFudCBBRyBhcyBBUEkgR2F0ZXdheVxuICAgIHBhcnRpY2lwYW50IE8gYXMgT2F0aGtlZXBlciBBUElcbiAgICBwYXJ0aWNpcGFudCBBIGFzIFByb3RlY3RlZCBTZXJ2ZXIvQVBJXG4gICAgQy0-PkFHOiBIVFRQIFJlcXVlc3RcbiAgICBBRy0-Pk86IEFzayBqdWRnZSBBUEkgZm9yIGF1dGhvcml6YXRpb25cblxuICAgIGFsdCBpcyBhbGxvd2VkXG4gICAgTy0-PkFHOiBSZXR1cm4gYXV0aCBpbmZvXG4gICAgQUctPj5BOiBGb3J3YXJkIEhUVFAgUmVxdWVzdFxuICAgIEEtPj5BRzogUmV0dXJuIEhUVFAgUmVzcG9uc2VcbiAgICBBRy0-PkM6IFJldHVybiBIVFRQIFJlc3BvbnNlXG4gICAgZWxzZSBpcyBub3QgYWxsb3dlZFxuICAgIE8tPj5BRzogRGVueSByZXF1ZXN0XG4gICAgQUctPj5DOiBSZXR1cm4gSFRUUCBFcnJvclxuICAgIGVuZCIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In19) + +#### Example + +Assuming you are making the following request to ORY Oathkeeper's Access Control +Decision API + +``` +GET /decision/my-service/whatever HTTP/1.1 +Host: oathkeeper-api:4456 +Authorization: bearer some-token +``` + +and you have the following rule defined (which allows this request) + +```json +{ + "id": "some-id", + "match": { + "url": "http://oathkeeper-api:4456/my-service/whatever", + "methods": ["GET"] + }, + "authenticators": [ + { + "handler": "noop" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "noop" + } + ] +} +``` + +then this endpoint will directly respond with HTTP Status Code 200: + +``` +HTTP/1.1 200 OK +Authorization: bearer some-token +``` + +If any other status code is returned, the request must not be allowed, for +example: + +``` +HTTP/1.1 401 OK +Content-Length: 0 +Connection: Closed +``` + +It is also possible to have this endpoint return other error responses such as +the HTTP Status Found (HTTP Status Code `302`), depending configured on the +error handling. Use this feature only if your Reverse Proxy supports these type +of responses. + +Depending on the mutator defined by the access rule, the HTTP Response might +contain additional or mutated HTTP Headers: + +``` +HTTP/1.1 200 OK +X-User-ID: john.doe +``` + +## Decision Engine + +The decision engine allows to configure how ORY Oathkeeper authorizes HTTP +requests. Authorization happens in four steps, each of which can be configured: + +1. **Access Rule Matching:** Verifies that the HTTP method, path, and host of + the incoming HTTP request conform to your access rules. The request is denied + if no access rules match. The configuration of the matching access rule + becomes the input for the next steps. +2. **Authentication:** Oathkeeper can validate credentials via a variety of + methods like Bearer Token, Basic Authorization, or cookie. Invalid + credentials result in denial of the request. The "internal" session state + (e.g. user ID) of valid (authenticated) credentials becomes input for the + next steps. +3. **Authorization:** Access Rules can check permissions. To secure, for + example, an API that requires admin privileges, configure the authorizer to + check if the user ID from step 2 has the "admin" permission or role. + Oathkeeper supports a variety of authorizers. Failed authorization (e.g. user + does not have role "admin") results denial of the request. +4. **Mutation:** The Access Rule can add session data to the HTTP request that + it forwards to the upstream API. For example, the mutator could add + `X-User-ID: the-user-id` to the HTTP headers or generate a JWT with session + information and set it as `Authorization: Bearer the.jwt.token`. + +Additionally, error handling can be configured. You may want to send an +`application/json` response for API clients and a HTTP Redirect response for +browsers with an end user. + +[![ORY Oathkeeper Pipeline](https://mermaid.ink/img/eyJjb2RlIjoiZ3JhcGggVERcblxucihIVFRQIFJlcXVlc3QpIC0tPiBhcm0oQWNjZXNzIFJ1bGUgTWF0Y2hlcilcbmFybSAtLWZvdW5kIG1hdGNoaW5nIGFjY2VzcyBydWxlLS0-IGFuKEF1dGhlbnRpY2F0b3IpXG5hcm0gLS1kaWQgbm90IGZpbmQgYWNjZXNzIHJ1bGUtLT4gZWhcbmFuIC0tY3JlZGVudGlhbHMgaW4gcmVxdWVzdCBhcmUgdmFsaWQtLT5heihBdXRob3JpemVyKVxuYW4gLS1jcmVkZW50aWFscyBpbiByZXF1ZXN0IGFyZSBpbnZhbGlkLS0-IGVoXG5heiAtLXJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uLS0-IGVoXG5heiAtLXJlcXVlc3QgaGFzIHBlcm1pc3Npb24tLT5tdChNdXRhdG9yKVxubXQtLXRyYW5zZm9ybSBodHRwIHJlcXVlc3QtLT5yZXMoRm9yd2FyZCBIVFRQIFJlcXVlc3QpXG5cbmVoKEVycm9yIEhhbmRsZXIpIC0tIGlmIGVycm9yIGhhbmRsZWQgYXMganNvbiAtLT4gZWhqc29uKEhUVFAgSlNPTiBFcnJvciByZXNwb25zZSlcbmVoKEVycm9yIEhhbmRsZXIpIC0tIGlmIGVycm9yIGhhbmRsZWQgYXMgcmVkaXJlY3QgLS0-IGVocmVkaXJlY3QoSFRUUCBSZWRpcmVjdCByZXNwb25zZSlcbmVoKEVycm9yIEhhbmRsZXIpIC0tIG90aGVycyAtLT4gZWhvdGhlcihFeGVjdXRlIGFueSBvdGhlciBlcnJvciBoYW5kbGluZyBsb2dpYy4uLikiLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCIsInRoZW1lQ1NTIjoiLmxhYmVsIGZvcmVpZ25PYmplY3QgeyBvdmVyZmxvdzogdmlzaWJsZTsgZm9udC1zaXplOiAxM3B4IH0ifX0)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiZ3JhcGggVERcblxucihIVFRQIFJlcXVlc3QpIC0tPiBhcm0oQWNjZXNzIFJ1bGUgTWF0Y2hlcilcbmFybSAtLWZvdW5kIG1hdGNoaW5nIGFjY2VzcyBydWxlLS0-IGFuKEF1dGhlbnRpY2F0b3IpXG5hcm0gLS1kaWQgbm90IGZpbmQgYWNjZXNzIHJ1bGUtLT4gZWhcbmFuIC0tY3JlZGVudGlhbHMgaW4gcmVxdWVzdCBhcmUgdmFsaWQtLT5heihBdXRob3JpemVyKVxuYW4gLS1jcmVkZW50aWFscyBpbiByZXF1ZXN0IGFyZSBpbnZhbGlkLS0-IGVoXG5heiAtLXJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uLS0-IGVoXG5heiAtLXJlcXVlc3QgaGFzIHBlcm1pc3Npb24tLT5tdChNdXRhdG9yKVxubXQtLXRyYW5zZm9ybSBodHRwIHJlcXVlc3QtLT5yZXMoRm9yd2FyZCBIVFRQIFJlcXVlc3QpXG5cbmVoKEVycm9yIEhhbmRsZXIpIC0tIGlmIGVycm9yIGhhbmRsZWQgYXMganNvbiAtLT4gZWhqc29uKEhUVFAgSlNPTiBFcnJvciByZXNwb25zZSlcbmVoKEVycm9yIEhhbmRsZXIpIC0tIGlmIGVycm9yIGhhbmRsZWQgYXMgcmVkaXJlY3QgLS0-IGVocmVkaXJlY3QoSFRUUCBSZWRpcmVjdCByZXNwb25zZSlcbmVoKEVycm9yIEhhbmRsZXIpIC0tIG90aGVycyAtLT4gZWhvdGhlcihFeGVjdXRlIGFueSBvdGhlciBlcnJvciBoYW5kbGluZyBsb2dpYy4uLikiLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCIsInRoZW1lQ1NTIjoiLmxhYmVsIGZvcmVpZ25PYmplY3QgeyBvdmVyZmxvdzogdmlzaWJsZTsgZm9udC1zaXplOiAxM3B4IH0ifX0) diff --git a/docs/docs/install.md b/docs/docs/install.md new file mode 100644 index 0000000000..6a7271e1b5 --- /dev/null +++ b/docs/docs/install.md @@ -0,0 +1,82 @@ +--- +id: install +title: Installation +--- + +Installing ORY Oathkeeper on any system is straight forward. We provide +pre-built binaries, Docker Images and support various package managers. + +## Docker + +We recommend using Docker to run ORY Oathkeeper: + +```shell +$ docker pull oryd/oathkeeper +$ docker run --rm -it oryd/oathkeeper help +``` + +## macOS + +You can install ORY Oathkeeper using [homebrew](https://brew.sh/) on macOS: + +```shell +$ brew tap ory/oathkeeper +$ brew install ory/oathkeeper/oathkeeper +$ oathkeeper help +``` + +## Linux + +On linux, you can use `curl | bash` to fetch the latest stable binary using: + +```shell +$ curl https://raw.githubusercontent.com/ory/oathkeeper/master/install.sh | bash -s -- -b . +$ ./oathkeeper help +``` + +You may want to move ORY Oathkeeper to your `$PATH`: + +```shell +$ sudo mv ./oathkeeper /usr/local/bin/ +$ oathkeeper help +``` + +## Windows + +You can install ORY Oathkeeper using [scoop](https://scoop.sh) on Windows: + +```shell +> scoop bucket add ory-oathkeeper https://github.com/ory/scoop-oathkeeper.git +> scoop install oathkeeper +> oathkeeper help +``` + +## Download Binaries + +The client and server **binaries are downloadable at the +[releases tab](https://github.com/ory/oathkeeper/releases)**. There is currently +no installer available. You have to add the Oathkeeper binary to the PATH +environment variable yourself or put the binary in a location that is already in +your `$PATH` (e.g. `/usr/local/bin`, ...). + +Once installed, you should be able to run: + +```shell +$ oathkeeper help +``` + +## Building from Source + +If you wish to compile ORY Oathkeeper yourself, you need to install and set up +[Go 1.12+](https://golang.org/) and add `$GOPATH/bin` to your `$PATH`. + +The following commands will check out the latest release tag of ORY Oathkeeper +and compile it and set up flags so that `oathkeeper version` works as expected. +Please note that this will only work with a linux shell like bash or sh. + +```shell +$ go get -d -u github.com/ory/oathkeeper +$ cd $(go env GOPATH)/src/github.com/ory/oathkeeper +$ GO111MODULE=on make install-stable +$ $(go env GOPATH)/bin/oathkeeper help +``` diff --git a/docs/docs/pipeline/authn.md b/docs/docs/pipeline/authn.md new file mode 100644 index 0000000000..acafbd704d --- /dev/null +++ b/docs/docs/pipeline/authn.md @@ -0,0 +1,816 @@ +--- +id: authn +title: Authenticators +--- + +An authenticator is responsible for authenticating request credentials. ORY +Oathkeeper supports different authenticators and we will add more as the project +progresses. + +An authenticator inspects the HTTP request (e.g. the HTTP Authorization Header) +and executes some business logic that returns true (for authentication ok) or +false (for authentication invalid) as well as a subject ("user"). The subject is +typically the "user" that made the request, but it could also be a machine (if +you have machine-2-machine interaction) or something different. + +Each authenticator has two keys: + +- `handler` (string, required): Defines the handler (e.g. `noop`) to be used. +- `config` (object, optional): Configures the handler. Configuration keys vary + per handler. The configuration can be defined in the global configuration + file, or per access rule. + +**Example** + +```json +{ + "authenticators": [ + { + "handler": "noop", + "config": {} + } + ] +} +``` + +You can define more than one authenticator in the Access Rule. The first +authenticator that is able to handle the credentials will be consulted and other +authenticators will be ignored: + +```json +{ + "authenticators": [ + { + "handler": "a" + }, + { + "handler": "b" + }, + { + "handler": "c" + } + ] +} +``` + +If handler `a` is able to handle the provided credentials, then handler `b` and +`c` will be ignored. If handler `a` can not handle the provided credentials but +handler `b` can, then handler `a` and `c` will be ignored. Handling the provided +credentials means that the authenticator knows how to handle, for example, the +`Authorization: basic` header. It does not mean that the credentials are valid! +If a handler encounters invalid credentials, then other handlers will be ignored +too. + +## `noop` + +The `noop` handler tells ORY Oathkeeper to bypass authentication, authorization, +and mutation. This implies that no authorization will be executed and no +credentials will be issued. It's basically a pass-all authenticator that allows +any request to be forwarded to the upstream URL. + +> Using this handler is basically an allow-all configuration. It makes sense +> when the upstream handles access control itself or does not need any type of +> access control. + +### Configuration + +This handler is not configurable. + +To enable this handler, set: + +```yaml +# Global configuration file oathkeeper.yml +authenticators: + noop: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true +``` + +### Access Rule Example + +```sh +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ + "handler": "noop" + }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 200 Status OK +The request has been allowed! +``` + +## `unauthorized` + +The `unauthorized` handler tells ORY Oathkeeper to reject all requests as +unauthorized. + +### Configuration + +This handler is not configurable. + +To enable this handler, set: + +```yaml +# Global configuration file oathkeeper.yml +unauthorized: + noop: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true +``` + +### Access Rule Example + +```sh +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ + "handler": "unauthorized" + }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 401 Unauthorized +``` + +## `anonymous` + +The `anonymous` authenticator checks whether or not an `Authorization` header is +set. If not, it will set the subject to `anonymous`. + +### Configuration + +- `subject` (string, optional) - Sets the anonymous username. Defaults to + "anonymous". Common names include "guest", "anon", "anonymous", "unknown". + +```yaml +# Global configuration file oathkeeper.yml +authenticators: + anonymous: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + + config: + subject: guest +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +authenticators: + - handler: anonymous + config: + subject: guest +``` + +### Access Rule Example + +The following rule allows all requests to `GET http://my-app/some-route` and +sets the subject name to the anonymous username, as long as no `Authorization` +header is set in the HTTP request: + +```shell +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ + "handler": "anonymous" + }], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 200 Status OK +The request has been allowed! The subject is: "anonymous" + +$ curl -X GET -H "Authorization: Bearer foobar" http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because credentials have been provided but only the anonymous +authenticator is enabled for this URL. +``` + +## `cookie_session` + +The `cookie_session` authenticator will forward the request method, path and +headers to a session store. If the session store returns `200 OK` and body +`{ "subject": "...", "extra": {} }` then the authenticator will set the subject +appropriately. + +### Configuration + +- `check_session_url` (string, required) - The session store to forward request + method/path/headers to for validation. +- `only` ([]string, optional) - If set, only requests that have at least one of + the set cookies will be forwarded, others will be passed to the next + authenticator. If unset, all requests are forwarded. +- `preserve_path` (boolean, optional) - If set, any path in `check_session_url` + will be preserved instead of replacing the path with the path of the request + being checked. +- `extra_from` (string, optional - defaults to `extra`) - A + [GJSON Path](https://github.com/tidwall/gjson/blob/master/SYNTAX.md) pointing + to the `extra` field. This defaults to `extra`, but it could also be `@this` + (for the root element), `session.foo.bar` for + `{ "subject": "...", "session": { "foo": {"bar": "whatever"} } }`, and so on. +- `subject_from` (string, optional - defaults to `subject`) - A + [GJSON Path](https://github.com/tidwall/gjson/blob/master/SYNTAX.md) pointing + to the `subject` field. This defaults to `subject`. Example: `identity.id` for + `{ "identity": { "id": "1234" } }`. + +```yaml +# Global configuration file oathkeeper.yml +authenticators: + cookie_session: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + + config: + check_session_url: https://session-store-host +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +authenticators: + - handler: cookie_session + config: + check_session_url: https://session-store-host + only: + - sessionid +``` + +```yaml +# Some Access Rule Preserving Path: access-rule-2.yaml +id: access-rule-2 +# match: ... +# upstream: ... +authenticators: + - handler: cookie_session + config: + check_session_url: https://session-store-host/check-session + only: + - sessionid + preserve_path: true +``` + +### Access Rule Example + +```shell +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ + "handler": "cookie_session" + }], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }] +}] + +$ curl -X GET -b sessionid=abc http://my-app/some-route + +HTTP/1.0 200 OK +The request has been allowed! The subject is: "peter" + +$ curl -X GET -b sessionid=def http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because the provided credentials are invalid. +``` + +## `oauth2_client_credentials` + +This `oauth2_client_credentials` uses the username and password from HTTP Basic +Authorization (`Authorization: Basic base64()` to perform the +OAuth 2.0 Client Credentials grant in order to detect if the provided +credentials are valid. + +This authenticator will use the username from the HTTP Basic Authorization +header as the subject for this request. + +> If you are unfamiliar with OAuth 2.0 Introspection we recommend +> [reading this guide](https://www.oauth.com/oauth2-servers/access-tokens/client-credentials/). + +### Configuration + +- `token_url` (string, required) - The OAuth 2.0 Token Endpoint that will be + used to validate the client credentials. +- `required_scope` ([]string, optional) - Sets what scope is required by the URL + and when making performing OAuth 2.0 Client Credentials request, the scope + will be included in the request: + +```yaml +# Global configuration file oathkeeper.yml +authenticators: + oauth2_client_credentials: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + + config: + token_url: https://my-website.com/oauth2/token +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +authenticators: + - handler: oauth2_client_credentials + config: + token_url: https://my-website.com/oauth2/token +``` + +### Access Rule Example + +```shell +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ + "handler": "oauth2_client_credentials", + "config": { + "required_scope": ["scope-a", "scope-b"] + } + }], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because no credentials have been provided. + +$ curl -X GET --user idonotexist:whatever http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because the provided credentials are invalid. + +$ curl -X GET --user peter:somesecret http://my-app/some-route + +HTTP/1.0 200 OK +The request has been allowed! The subject is: "peter" +``` + +In the background, a request to the OAuth 2.0 Token Endpoint (value of +`authenticators.oauth2_client_credentials.token_url`) will be made, using the +OAuth 2.0 Client Credentials Grant: + +``` +POST /oauth2/token HTTP/1.1 +Host: authorization-server.com + +grant_type=client_credentials +&client_id=peter +&client_secret=somesecret +&scope=scope-a+scope-b +``` + +If the request succeeds, the credentials are considered valid and if the request +fails, the credentials are considered invalid. + +## `oauth2_introspection` + +The `oauth2_introspection` authenticator handles requests that have an Bearer +Token in the Authorization Header (`Authorization: bearer `) or in a +different header or query parameter specified in configuration. It then uses +OAuth 2.0 Token Introspection to check if the token is valid and if the token +was granted the requested scope. + +> If you are unfamiliar with OAuth 2.0 Introspection we recommend +> [reading this guide](https://www.oauth.com/oauth2-servers/token-introspection-endpoint/). + +### Configuration + +- `introspection_url` (string, required) - The OAuth 2.0 Token Introspection + endpoint. +- `scope_strategy` (string, optional) - Sets the strategy to be used to + validate/match the token scope. Supports "hierarchic", "exact", "wildcard", + "none". Defaults to "none". +- `required_scope` ([]string, optional) - Sets what scope is required by the URL + and when making performing OAuth 2.0 Client Credentials request, the scope + will be included in the request +- `pre_authorization` (object, optional) - Enable pre-authorization in cases + where the OAuth 2.0 Token Introspection endpoint is protected by OAuth 2.0 + Bearer Tokens that can be retrieved using the OAuth 2.0 Client Credentials + grant. + - `enabled` (bool, optional) - Enable pre-authorization. Defaults to false. + - `client_id` (string, required if enabled) - The OAuth 2.0 Client ID to be + used for the OAuth 2.0 Client Credentials Grant. + - `client_secret` (string, required if enabled) - The OAuth 2.0 Client Secret + to be used for the OAuth 2.0 Client Credentials Grant. + - `token_url` (string, required if enabled) - The OAuth 2.0 Scope to be + requested during the OAuth 2.0 Client Credentials Grant. + - `scope` ([]string, optional) - The OAuth 2.0 Token Endpoint where the OAuth + 2.0 Client Credentials Grant will be performed. +- `token_from` (object, optional) - The location of the bearer token. If not + configured, the token will be received from a default location - + 'Authorization' header. One and only one location (header, query, or cookie) + must be specified. + - `header` (string, required, one of) - The header (case insensitive) that + must contain a Bearer token for request authentication. It can't be set + along with `query_parameter` or `cookie`. + - `query_parameter` (string, required, one of) - The query parameter (case + sensitive) that must contain a Bearer token for request authentication. It + can't be set along with `header` or `cookie`. + - `cookie` (string, required, one of) - The cookie (case sensitive) that must + contain a Bearer token for request authentication. It can't be set along + with `header` or `query_parameter` +- `introspection_request_headers` (object, optional) - Additional headers to add + to the introspection request + +```yaml +# Global configuration file oathkeeper.yml +authenticators: + oauth2_introspection: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + + config: + introspection_url: https://my-website.com/oauth2/introspection + scope_strategy: exact + required_scope: + - photo + - profile + pre_authorization: + enabled: true + client_id: some_id + client_secret: some_secret + scope: + - introspect + token_url: https://my-website.com/oauth2/token + token_from: + header: Custom-Authorization-Header + # or + # query_parameter: auth-token + # or + # cookie: auth-token + introspection_request_headers: + x-forwarded-proto: https +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +authenticators: + - handler: oauth2_introspection + config: + introspection_url: https://my-website.com/oauth2/introspection + scope_strategy: exact + required_scope: + - photo + - profile + pre_authorization: + enabled: true + client_id: some_id + client_secret: some_secret + scope: + - introspect + token_url: https://my-website.com/oauth2/token + token_from: + query_parameter: auth-token + # or + # header: Custom-Authorization-Header + # or + # cookie: auth-token + introspection_request_headers: + x-forwarded-proto: https + x-foo: bar +``` + +### Access Rule Example + +```shell +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ + "handler": "oauth2_introspection", + "config": { + "required_scope": ["scope-a", "scope-b"] + } + }], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because no credentials have been provided. + +$ curl -X GET -H 'Authorization: Bearer invalid-token' http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because the provided credentials are invalid. + +$ curl -X GET -H 'Authorization: Bearer valid.access.token.from.peter' http://my-app/some-route + +HTTP/1.0 200 OK +The request has been allowed! The subject is: "peter" +``` + +In the background, this handler will make a request to the OAuth 2.0 Token +Endpoint (configuration value +`authenticators.oauth2_introspection.introspection_url`) to check if the Bearer +Token is valid: + +``` +POST /oauth2/introspect HTTP/1.1 + +token=valid.access.token.from.peter +``` + +If pre-authorization is enabled, that request will include an Authorization +Header: + +``` +POST /oauth2/introspect HTTP/1.1 +Authorization: Bearer token-received-by-performing-pre-authorization + +token=valid.access.token.from.peter +``` + +The Token is considered valid if the Introspection response is HTTP 200 OK and +includes `{"active":true}` in the response payload. The subject is extracted +from the `username` field. + +## `jwt` + +The `jwt` authenticator handles requests that have an Bearer Token in the +Authorization Header (`Authorization: bearer `) or in a different header +or query parameter specified in configuration. It assumes that the token is a +JSON Web Token and tries to verify the signature of it. + +### Configuration + +- `jwks_urls` ([]string, required) - The URLs where ORY Oathkeeper can retrieve + JSON Web Keys from for validating the JSON Web Token. Usually something like + `https://my-keys.com/.well-known/jwks.json`. The response of that endpoint + must return a JSON Web Key Set (JWKS). +- `scope_strategy` (string, optional) - Sets the strategy to be used to + validate/match the scope. Supports "hierarchic", "exact", "wildcard", "none". + Defaults to "none". +- If `trusted_issuers` ([]string) is set, the JWT must contain a value for claim + `iss` that matches _exactly_ (case-sensitive) one of the values of + `trusted_issuers`. If no values are configured, the issuer will be ignored. +- If `target_audience` ([]string) is set, the JWT must contain all values + (exact, case-sensitive) in the claim `aud`. If no values are configured, the + audience will be ignored. +- Value `allowed_algorithms` ([]string) sets what signing algorithms are + allowed. Defaults to `RS256`. +- Value `required_scope` ([]string) validates the scope of the JWT. It will + checks for claims `scp`, `scope`, `scopes` in the JWT when validating the + scope as that claim is not standardized. +- `token_from` (object, optional) - The location of the bearer token. If not + configured, the token will be received from a default location - + 'Authorization' header. One and only one location (header, query, or cookie) + must be specified. + - `header` (string, required, one of) - The header (case insensitive) that + must contain a Bearer token for request authentication. It can't be set + along with `query_parameter` or `cookie`. + - `query_parameter` (string, required, one of) - The query parameter (case + sensitive) that must contain a Bearer token for request authentication. It + can't be set along with `header` or `cookie`. + - `cookie` (string, required, one of) - The cookie (case sensitive) that must + contain a Bearer token for request authentication. It can't be set along + with `header` or `query_parameter` + +```yaml +# Global configuration file oathkeeper.yml +authenticators: + jwt: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + + config: + jwks_urls: + - https://my-website.com/.well-known/jwks.json + - https://my-other-website.com/.well-known/jwks.json + - file://path/to/local/jwks.json + scope_strategy: none + required_scope: + - scope-a + - scope-b + target_audience: + - https://my-service.com/api/users + - https://my-service.com/api/devices + trusted_issuers: + - https://my-issuer.com/ + allowed_algorithms: + - RS256 + token_from: + header: Custom-Authorization-Header + # or + # query_parameter: auth-token + # or + # cookie: auth-token +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +authenticators: + - handler: jwt + config: + jwks_urls: + - https://my-website.com/.well-known/jwks.json + - https://my-other-website.com/.well-known/jwks.json + - file://path/to/local/jwks.json + scope_strategy: none + required_scope: + - scope-a + - scope-b + target_audience: + - https://my-service.com/api/users + - https://my-service.com/api/devices + trusted_issuers: + - https://my-issuer.com/ + allowed_algorithms: + - RS256 + token_from: + query_parameter: auth-token + # or + # header: Custom-Authorization-Header + # or + # cookie: auth-token +``` + +#### Validation example + +```json +{ + "handler": "jwt", + "config": { + "required_scope": ["scope-a", "scope-b"], + "target_audience": [ + "https://my-service.com/api/users", + "https://my-service.com/api/devices" + ], + "trusted_issuers": ["https://my-issuer.com/"], + "allowed_algorithms": ["RS256", "RS256"] + } +} +``` + +That exemplary Access Rule consider the following (decoded) JSON Web Token as +valid: + +``` +{ + "alg": "RS256" +} +{ + "iss": "https://my-issuer.com/", + "aud": ["https://my-service.com/api/users", "https://my-service.com/api/devices"], + "scp": ["scope-a", "scope-b"] +} +``` + +And this token as invalid (audience is missing, issuer is not matching, scope is +missing, wrong algorithm): + +``` +{ + "alg": "HS256" +} +{ + "iss": "https://not-my-issuer.com/", + "aud": ["https://my-service.com/api/users"], + "scp": ["not-scope-a", "scope-b"] +} +``` + +### Scope + +JSON Web Tokens can be scoped. However, that feature is not standardized and +several claims that represent the token scope have been seen in the wild: `scp`, +`scope`, `scopes`. Additionally, the claim value can be a string (`"scope-a"`), +a space-delimited string (`"scope-a scope-b"`) or a JSON string array +(`["scope-a", "scope-b"]`). Because of this ambiguity, all of those claims are +checked and parsed and will be available as `scp` (string array) in the +authentication session (`.Extra["scp"]`). + +### Access Rule Example + +```shell +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ + "handler": "jwt", + "config": { + "required_scope": ["scope-a", "scope-b"], + "target_audience": ["aud-1"], + "trusted_issuers": ["iss-1"] + } + }], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because no credentials have been provided. + +$ curl -X GET -H 'Authorization: Bearer invalid-token' http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because the provided credentials are invalid. + +$ curl -X GET -H 'Authorization: Bearer valid.jwtfrom.peter' http://my-app/some-route + +HTTP/1.0 200 OK +The request has been allowed! The subject is: "peter" +``` + +In the background, this handler will fetch all JSON Web Key Sets provided by +configuration key `authenticators.jwt.jwks_urls` and use those keys to verify +the signature. If the signature can not be verified by any of those keys, the +JWT is considered invalid. diff --git a/docs/docs/pipeline/authz.md b/docs/docs/pipeline/authz.md new file mode 100644 index 0000000000..d0c337b300 --- /dev/null +++ b/docs/docs/pipeline/authz.md @@ -0,0 +1,360 @@ +--- +id: authz +title: Authorizers +--- + +An "authorizer" is responsible for properly permissioning a subject. ORY +Oathkeeper supports different kinds of authorizers. The list of authorizers +increases over time due to new features and requirements. + +Authorizers assure that a subject, for instance a "user", has the permissions +necessary to access or perform a particular service. For example, an authorizer +can permit access to an endpoint or URL for specific subjects or "users" from a +specific group "admin". The authorizer permits the subjects the desired access +to the endpoint. + +Each authorizer has two keys: + +- `handler` (string, required): Defines the handler, e.g. `noop`, to be used. +- `config` (object, optional): Configures the handler. Configuration keys can + vary for each handler. + +**Example** + +```json +{ + "authorizer": { + "handler": "noop", + "config": {} + } +} +``` + +There is a 1:1 mandatory relationship between an authoriser and an access rule. +It is not possible to configure more than one authorizer per Access Rule. + +## Authorizer `allow` + +This authorizer permits every action allowed. + +### Configuration + +This handler is not configurable. + +To enable this handler, set as follows: + +```yaml +# Global configuration file oathkeeper.yml +authorizers: + allow: + # Set enabled to "true" to enable the authenticator, and "false" to disable the authenticator. Defaults to "false". + enabled: true +``` + +### Access Rule Example + +```sh +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ "handler": "anonymous" }], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 200 Status OK +The request has been allowed! +``` + +## Authorizer`deny` + +This authorizer considers every action unauthorized therefore "forbidden" or +"disallowed". + +### Configuration + +This handler is not configurable. + +To enable this handler, set: + +```yaml +# Global configuration file oathkeeper.yml +authorizers: + deny: + # Set enabled to "true" to enable the authenticator, and "false" to disable the authenticator. Defaults to "false". + enabled: true +``` + +### Access Rule Example + +```sh +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ "handler": "anonymous" }], + "authorizer": { "handler": "deny" }, + "mutators": [{ "handler": "noop" }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 403 Forbidden +The request is forbidden! +``` + +## Authorizer `keto_engine_acp_ory` + +This authorizer uses the ORY Keto API to carry out access control using +"ORY-flavored" Access Control Policies. The conventions used in the ORY Keto +project are located on [GitHub ORY Keto](https://github.com/ory/keto) for +consultation prior to using this authorizer. + +### Configuration + +- `base_url` (string, required) - The base URL of ORY Keto, typically something + like https://hostname:port/ +- `required_action` (string, required) - See section below. +- `required_resource` (string, required) - See section below. +- `subject` (string, optional) - See section below. +- `flavor` (string, optional) - See section below. + +#### Resource, Action, Subject + +This authorizer has four configuration options, `required_action`, +`required_resource`, `subject`, and `flavor`: + +```json +{ + "handler": "keto_engine_acp_ory", + "config": { + "required_action": "...", + "required_resource": "...", + "subject": "...", + "flavor": "..." + } +} +``` + +All configuration options except `flavor` support Go +[`text/template`](https://golang.org/pkg/text/template/). For example in the +following match configuration: + +```json +{ + "match": { + "url": "http://my-app/api/users/<[0-9]+>/<[a-zA-Z]+>", + "methods": ["GET"] + } +} +``` + +The following example shows how to reference the values matched by or resulting +from the two regular expressions, `<[0-9]+>` and `<[a-zA-Z]+>`. using the +`AuthenticationSession` struct: + +```json +{ + "handler": "keto_engine_acp_ory", + "config": { + "required_action": "my:action:{{ printIndex .MatchContext.RegexpCaptureGroups 0 }}", + "required_resource": "my:resource:{{ printIndex .MatchContext.RegexpCaptureGroups 1 }}:foo:{{ printIndex .MatchContext.RegexpCaptureGroups 0 }}" + } +} +``` + +Assuming a request to `http://my-api/api/users/1234/foobar` was made, the config +from above would expand to: + +```json +{ + "handler": "keto_engine_acp_ory", + "config": { + "required_action": "my:action:1234", + "required_resource": "my:resource:foobar:foo:1234" + } +} +``` + +The `subject` field configures the subject that passes to the ORY Keto endpoint. +If `subject` is not specified it will default to +`AuthenticationSession.Subject`. + +For more details about supported Go template substitution, see. +[How to use session variables](index.md#session) + +#### Example + +```yaml +# Global configuration file oathkeeper.yml +authorizers: + keto_engine_acp_ory: + # Set enabled to "true" to enable the authenticator, and "false" to disable the authenticator. Defaults to "false". + enabled: true + + config: + base_url: http://my-keto/ + required_action: ... + required_resource: ... + subject: ... + flavor: ... +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +authorizers: + - handler: keto_engine_acp_ory + config: + base_url: http://my-keto/ + required_action: ... + required_resource: ... + subject: ... + flavor: ... +``` + +### Access Rule Example + +```shell +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/api/users/<[0-9]+>/<[a-zA-Z]+>", + "methods": [ + "GET" + ] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "keto_engine_acp_ory", + "config": { + "required_action": "my:action:$1", + "required_resource": "my:resource:$2:foo:$1" + "subject": "{{ .Extra.email }}", + "flavor": "exact" + } + } + "mutators": [ + { + "handler": "noop" + } + ] +}] +``` + +## `remote_json` + +This authorizer performs authorization using a remote authorizer. The authorizer +makes a HTTP POST request to a remote endpoint with a JSON body. If the endpoint +returns a "200 OK" response code, the access is allowed, if it returns a "403 +Forbidden" response code, the access is denied. + +### Configuration + +- `remote` (string, required) - The remote authorizer's URL. The remote + authorizer is expected to return either "200 OK" or "403 Forbidden" to + allow/deny access. +- `payload` (string, required) - The request's JSON payload sent to the remote + authorizer. The string will be parsed by the Go + [`text/template`](https://golang.org/pkg/text/template/) package and applied + to an + [`AuthenticationSession`](https://github.com/ory/oathkeeper/blob/master/pipeline/authn/authenticator.go#L40) + object. See [Session](index.md#session) for more details. + +#### Example + +```yaml +# Global configuration file oathkeeper.yml +authorizers: + remote_json: + # Set enabled to "true" to enable the authenticator, and "false" to disable the authenticator. Defaults to "false". + enabled: true + + config: + remote: http://my-remote-authorizer/authorize + payload: | + { + "subject": "{{ print .Subject }}", + "resource": "{{ printIndex .MatchContext.RegexpCaptureGroups 0 }}" + } +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +authorizers: + - handler: remote_json + config: + remote: http://my-remote-authorizer/authorize + payload: | + { + "subject": "{{ print .Subject }}", + "resource": "{{ printIndex .MatchContext.RegexpCaptureGroups 0 }}" + } +``` + +### Access Rule Example + +```shell +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/api/<.*>", + "methods": ["GET"] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "remote_json", + "config": { + "remote": "http://my-remote-authorizer/authorize", + "payload": "{\"subject\": \"{{ print .Subject }}\", \"resource\": \"{{ printIndex .MatchContext.RegexpCaptureGroups 0 }}\"}" + } + } + "mutators": [ + { + "handler": "noop" + } + ] +} +``` diff --git a/docs/docs/pipeline/error.md b/docs/docs/pipeline/error.md new file mode 100644 index 0000000000..543a97e215 --- /dev/null +++ b/docs/docs/pipeline/error.md @@ -0,0 +1,460 @@ +--- +id: error +title: Error Handlers +--- + +A error handler is responsible for executing logic after, for example, +authentication or authorization failed. ORY Oathkeeper supports different error +handlers and we will add more as the project progresses. + +A error handler can be configured to match on certain conditions, for example, +it is possible to configure the `json` error handler to only be executed if the +HTTP Header `Accept` contains `application/json`. + +Each error handler has two keys: + +- `handler` (string, required): Defines the handler (e.g. `noop`) to be used. +- `config` (object, optional): Configures the handler. Configuration keys vary + per handler. The configuration can be defined in the global configuration + file, or per access rule. + +**Example** + +```json +{ + "errors": [ + { + "handler": "json", + "config": {} + } + ] +} +``` + +You can define more than one error handler in the Access Rule. Depending on +their matching conditions (see next chapter), the appropriate error handler will +be chosen. + +Please be aware that defining error handlers with overlapping matching +conditions will cause errors, because ORY Oathkeeper will not know which error +handler to execute! + +## Error Matching + +You can configure the error handlers in such a way, that - for example - ORY +Oathkeeper responds, in the case of an error, with + +- a JSON response, such as + `{"error":{"code":403,"status":"Forbidden","message":"Access credentials are not sufficient to access this resource"}}`, + when the client that expects JSON (`Accept: application/json`); +- an XML response when the API Client expects XML (`Accept: application/xml`); +- a HTTP Redirect (HTTP Status Found - 302) to `/login` when the endpoint is + directly (no AJAX) accessed from a browser + (`Accept: text/html,application/xhtml+xml`). + +There are also other possible matching strategies - such as defining a response +per error type (unauthorized, forbidden, internal_server_error, ...) , per HTTP +`Content-Type` Header (similar to `Accept`), or based on the Remote IP Address. + +All match definitions are set in the handler's config, using the `when` key. +This is the same for all handlers! + +```json5 +{ + handler: 'json', // or redirect, www_authenticate, ... + config: { + when: [ + { + error: ['unauthorized', '...', '...'], + }, + ], + }, +} +``` + +If `when` is empty, then no conditions are applied and the error handler is +always matching! In fact, this is also true for all subkeys. If left empty, the +matching condition will not be applied and is thus always true! + +### Fallback + +Error handling can be set globally and per access rule. ORY Oathkeeper will +first check for any access rule specific error handling before falling back to +the globally defined error handling. + +Similar to other pipeline handlers (authentication, authorization, mutation), +you must enable the error handlers in the global ORY Oathkeeper config, except +for the `json` error handler which is always enabled by default: + +```yaml +# .oathkeeper.yaml +errors: + handlers: + json: + enabled: true # this is true by default + # config: + # when: ... + redirect: + enabled: true # this is false by default + # config: + # when: ... +``` + +As discussed in the previous section, when `config.when` is empty, the error +handler will always match. This of course is a problem because ORY Oathkeeper +now does not know if it should redirect or send a JSON error! + +Therefore, an additional configuration - called `fallback` - is available: + +```yaml +# .oathkeeper.yaml +errors: + # `["json"]` is the default! + fallback: + - json + + handlers: + json: + enabled: true # this is true by default + # config: + # when: ... + redirect: + enabled: true # this is false by default + config: + to: http://mywebsite/login + # when: ... +``` + +This feature tells ORY Oathkeeper that the `json` error handler should be used +as fallback. You could also define multiple fallback handlers - the first +matching handler will be the one and only executed! This makes sense if you +additionally configure the `when` section: + +```yaml +# .oathkeeper.yaml +errors: + fallback: + - redirect + - json + + handlers: + json: + enabled: true + redirect: + enabled: true + config: + when: + - request: + header: + accept: + - text/* +``` + +In this configuration example, ORY Oathkeeper would first check if the HTTP +Request Header contains `Accept: text/html` (or `text/xhtml`, `text/text`, ...) +and if not, would return a JSON Error Message. + +### Matchers + +All matchers are defined under the `config.when` key of the error handler, both +in the global config and in the access rule: + +```json5 +// access-rule.json +{ + handler: 'json', + config: { + when: [ + { + error: ['unauthorized', '...', '...'], + }, + ], + }, +} +``` + +```yaml +# .oathkeeper.yaml +errors: + handlers: + redirect: + enabled: true + config: + when: + - error: + - unauthorized + - ... + - ... +``` + +You can define multiple when clauses which allows you to differentiate between +error types and HTTP Requests. The when sections are combined with `OR` while +the subkeys (`error`, `request.header.accept`, `request.header.content_type`, +...) are matched with `AND`. Keys that have arrays as values (`error`, +`request.header.accept`, `request.header.content_type`, ...) are usually matched +with `OR`: + +```yaml +# .oathkeeper.yaml +errors: + handlers: + redirect: + enabled: true + config: + when: + - error: + - unauthorized + # OR + - internal_server_error + + # AND + request: + remote_ip: + match: + - 192.168.1.0/24 + # OR + - 192.178.1.0/24 + + # OR + - error: + - forbidden + # OR + - not_found + + # AND + request: + header: + accept: + - text/html + # OR + - text/xhtml + + # AND + content_type: + - application/x-www-form-urlencoded + # OR + - multipart/form-data +``` + +#### Error + +The `config.when.#.error` key may contain zero, one, or multiple error names +that must match for this matching condition to be true. The error names are +derived (lowercase and whitespaces replaced with `_`) from the well-defined +[HTTP Status](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) messages +such as `Not Found`, `Forbidden`, `Internal Server Error`, and so on. + +Here are some examples: + +- `Internal Server Error` (500) -> `{"errors": ["internal_server_error"]}` +- `Forbidden` (403) -> `{"errors": ["forbidden"]}` +- `Not Found` (404) -> `{"errors": ["not_found"]}` +- `Bad Request` (400) -> `{"errors": ["bad_request"]}` + +Keep in mind that these errors must be emitted by ORY Oathkeeper itself, not by +the upstream API. Therefore, most HTTP Status Codes will not have any effect +because ORY Oathkeeper - as of now - mostly returns 401, 403, 500 error codes. + +As discussed previously, if this configuration key is left empty, then all error +types will match! + +#### HTTP Request: Remote IP + +The HTTP Remote IP is the IP of the Client that initially made the request. The +Remote Address is matched using +[CIDR Notation](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing): + +```yaml +config: + when: + - request: + remote_ip: + match: + - 192.168.1.0/24 +``` + +This configuration would match a HTTP Request coming directly from +`192.168.1.1`, `192.168.1.2`, and so on. + +If ORY Oathkeeper runs behind a Load Balancer or any other type of Reverse +Proxy, you can configure ORY Oathkeeper to check the +[`X-Forwarded-For` HTTP Header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For) +header as well: + +```yaml +config: + when: + - request: + remote_ip: + respect_forwarded_for_header: true # defaults to false + match: + - 192.168.1.0/24 +``` + +As discussed previously, if this configuration key is left empty, then all +remote IPs will match! + +HTTP Requests that include one of the matching IP Addresses in the +`X-Forwaded-For` HTTP Header, for example +`X-Forwarded-For: 123.123.123.123, ..., 192.168.1.1, ...`, now match this error +handler. + +#### HTTP Request Header: Accept + +The HTTP `Accept` Header is the most common way to tell an HTTP API what MIME +content type is expected. For example, FireFox sends +`Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8` for +all regular requests (e.g. when opening [www.ory.sh](https://www.ory.sh/)). And +a REST API Client usually sends `Accept: application/json`. + +Therefore, using the `Accept` header is one of the most common ways to +distinguish between "regular" browser traffic, REST API traffic, and other types +of HTTP traffic. + +In ORY Oathkeeper, you can specify the matching conditions for the Accept header +as follows: + +```yaml +config: + when: + - request: + header: + accept: + - text/html + - text/* +``` + +The defined matching condition would apply if a client sends one of the +following `Accept` headers: + +- `Accept: text/html` +- `Accept: text/xhtml` +- `Accept: text/xhtml+xml` +- `Accept: text/...` +- `Accept: text/*` + +Most browsers (see the FireFox example) also send wildcard `Accept` headers such +as `*/*`. To prevent multiple conditions to match, HTTP Accept Headers from the +client are interpreted literally, meaning that wildcards are not interpreted. + +Assuming the client sends `Accept: */*` and the error condition is set to +`accept: ["text/text"]`, the error condition would not match. If however the +client sends `Accept: text/text` and the error condition is set to +`accept: ["*/*"]`, then the condition would match. + +To match against wildcards in the `Accept` header, you have to explicitly define +them in the error condition. Setting the configuration to `accept: ["*/*"]` will +match `Accept: */*` and of course any other type such as `Accept: text/*` +`Accept: text/html`, and so on. + +As discussed previously, if this configuration key is left empty, then all +`Accept` headers will match! + +#### HTTP Request Header: Content-Type + +The +[HTTP Content Type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type) +matcher works similar to the `Accept` header. The HTTP Content Type Header +however is much less common, as it is only used in POST, PUT, PATCH requests (or +any other requests that send a HTTP Body). + +The main difference however is that the client never (unless it sends malformed +data) sends wildcard MIME types, as the MIME type needs to be deterministic. +It's typically something like `multipart/form-data`, +`application/x-www-form-urlencoded`, or `application/json`. + +In ORY Oathkeeper, you can specify the matching conditions for the +`Content-Type` header as follows: + +```yaml +config: + when: + - request: + header: + content_type: + - multipart/form-data + # OR + - application/x-www-form-urlencoded + # OR + - application/json +``` + +As discussed previously, if this configuration key is left empty, then all +`Content-Type` headers will match! + +## Error Handlers + +### `json` + +The `json` Error Handler returns an `application/json` response type. Per +default, error messages are stripped of their details to reduce OSINT attack +surface. You can enable more detailed error messages by setting `verbose` to +`true`. As discussed in the previous section, you can define error matching +conditions under the `when` key. + +**Example** + +```json5 +// access-rule.json +{ + handler: 'json', + config: { + verbose: true, // defaults to false + when: [ + // ... + ], + }, +} +``` + +### `redirect` + +The `redirect` Error Handler returns a HTTP 302/301 response with a `Location` +Header. As discussed in the previous section, you can define error matching +conditions under the `when` key. + +**Example** + +```json5 +// access-rule.json +{ + handler: 'json', + config: { + to: 'http://my-website/login', // required!! + code: 301, // defaults to 302 - only 301 and 302 are supported. + when: [ + // ... + ], + }, +} +``` + +### `www_authenticate` + +The `www_authenticate` Error Handler responds with HTTP 401 and a +[`WWW-Authenticate`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/WWW-Authenticate) +HTTP Header. + +You can configure the `realm` the browser will display. The `realm` is a message +that will be displayed by the browser. Most browsers show a message like "The +website says: ``". Using a real message is thus more appropriate than a +Realm identifier. + +This error handler is "exotic" as WWW-Authenticate is not a common pattern in +today's web. As discussed in the previous section, you can define error matching +conditions under the `when` key. + +**Example** + +```json5 +// access-rule.json +{ + handler: 'json', + config: { + realm: 'Please enter your username and password', // Defaults to `Please authenticate.` + when: [ + // ... + ], + }, +} +``` diff --git a/docs/docs/pipeline/index.md b/docs/docs/pipeline/index.md new file mode 100644 index 0000000000..c9650ec6f4 --- /dev/null +++ b/docs/docs/pipeline/index.md @@ -0,0 +1,132 @@ +--- +id: index +title: Access Rule Pipeline +--- + +Read more about the +[principal components and execution pipeline of access rules](../api-access-rules.md) +if you have not already. This chapter explains the different pipeline handlers +available to you: + +- [Authentication handlers](authn.md) inspect HTTP requests (e.g. the HTTP + Authorization Header) and execute some business logic that return true (for + authentication ok) or false (for authentication invalid) as well as a subject + ("user"). The subject is typically the "user" that made the request, but it + could also be a machine (if you have machine-2-machine interaction) or + something different. +- [Authorization handlers](authz.md): ensure that a subject ("user") has the + right permissions. For example, a specific endpoint might only be accessible + to subjects ("users") from group "admin". The authorizer handles that logic. +- [Mutation handlers](mutator.md): transforms the credentials from incoming + requests to credentials that your backend understands. For example, the + `Authorization: basic` header might be transformed to `X-User: `. + This allows you to write backends that do not care if the original request was + an anonymous one, an OAuth 2.0 Access Token, or some other credential type. + All your backend has to do is understand, for example, the `X-User:`. +- [Error handlers](error.md): are responsible for executing logic after, for + example, authentication or authorization failed. ORY Oathkeeper supports + different error handlers and we will add more as the project progresses. + +## Templating + +Some handlers such as the [ID Token Mutator](mutator.md#id_token) support +templating using [Golang Text Templates](https://golang.org/pkg/text/template/) +([examples](https://blog.gopheracademy.com/advent-2017/using-go-templates/)). +The [sprig](http://masterminds.github.io/sprig/) is also supported, on top of +these two functions: + +```go +var _ = template.FuncMap{ + "print": func(i interface{}) string { + if i == nil { + return "" + } + return fmt.Sprintf("%v", i) + }, + "printIndex": func(element interface{}, i int) string { + if element == nil { + return "" + } + + list := reflect.ValueOf(element) + + if list.Kind() == reflect.Slice && i < list.Len() { + return fmt.Sprintf("%v", list.Index(i)) + } + + return "" + }, +} +``` + +## Session + +In all configurations supporting [templating](#templating) instructions, it's +possible to use the +[`AuthenticationSession`](https://github.com/ory/oathkeeper/blob/master/pipeline/authn/authenticator.go#L39) +struct content. + +```go +type AuthenticationSession struct { + Subject string + Extra map[string]interface{} + Header http.Header + MatchContext MatchContext +} + +type MatchContext struct { + RegexpCaptureGroups []string + URL *url.URL +} +``` + +### RegexpCaptureGroups + +### Configuration Examples + +To use the subject extract to the token + +```json +{ "config_field": "{{ print .subject }}" } +``` + +To use an embedded value in the `Extra` map (most of the time, it's a JWT token +claim) + +```json +{ "config_field": "{{ print .Extra.some.arbitrary.data }}" } +``` + +To use a Regex capture from the request URL +Note the usage of `printIndex` to print a value from the array + +```json +{ + "claims": "{\"aud\": \"{{ print .Extra.aud }}\", \"resource\": \"{{ printIndex .MatchContext.RegexpCaptureGroups 0 }}\"" +} +``` + +To display a string array to JSON format, we can use the +[fmt printf](https://golang.org/pkg/fmt/) function + +```json +{ + "claims": "{\"aud\": \"{{ print .Extra.aud }}\", \"scope\": {{ printf \"%+q\" .Extra.scp }}}" +} +``` + +Note that the `AuthenticationSession` struct has a field named `Extra` which is +a `map[string]interface{}`, which receives varying introspection data from the +authentication process. Because the contents of `Extra` are so variable, nested +and potentially non-existent values need special handling by the `text/template` +parser, and a `print` FuncMap function has been provided to ensure that +non-existent map values will simply return an empty string, rather than +``. + +If you find that your field contain the string `` then you have most +likely omitted the `print` function, and it is recommended you use it for all +values out of an abundance of caution and for consistency. + +In the same way, a `printIndex` FuncMap function is provided to avoid _out of +range_ exception to access in a array. It can be useful for the regexp captures +which depend of the request. diff --git a/docs/docs/pipeline/mutator.md b/docs/docs/pipeline/mutator.md new file mode 100644 index 0000000000..92e1686df1 --- /dev/null +++ b/docs/docs/pipeline/mutator.md @@ -0,0 +1,571 @@ +--- +id: mutator +title: Mutators +--- + +A mutator transforms the credentials from incoming requests to credentials that +your backend understands. For example, the `Authorization: basic` header might +be transformed to `X-User: `. This allows you to write backends that +do not care if the original request was an anonymous one, an OAuth 2.0 Access +Token, or some other credential type. All your backend has to do is understand, +for example, the `X-User:`. + +The Access Control Decision API will return the mutated result as the HTTP +Response. + +## `noop` + +This mutator does not transform the HTTP request and simply forwards the headers +as-is. This is useful if you don't want to replace, for example, +`Authorization: basic` with `X-User: `. + +### Configuration + +```yaml +# Global configuration file oathkeeper.yml +mutators: + noop: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +mutators: + - handler: noop +``` + +### Access Rule Example + +```shell +$ cat ./rules.json +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/api/users/<[0-9]+>/<[a-zA-Z]+>", + "methods": [ + "GET" + ] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "noop" + } + ] +} + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 200 Status OK +The request has been allowed! The original HTTP Request has not been modified. +``` + +## `id_token` + +This mutator takes the authentication information (e.g. subject) and transforms +it to a signed JSON Web Token, and more specifically to an OpenID Connect ID +Token. Your backend can verify the token by fetching the (public) key from the +`/.well-known/jwks.json` endpoint provided by the ORY Oathkeeper API. + +Let's say a request is made to a resource protected by ORY Oathkeeper using +Basic Authorization: + +``` +GET /api/resource HTTP/1.1 +Host: www.example.com +Authorization: Basic Zm9vOmJhcg== +``` + +Assuming that ORY Oathkeeper is granting the access request, +`Basic Zm9vOmJhcg==` will be replaced with a cryptographically signed JSON Web +Token: + +``` +GET /api/resource HTTP/1.1 +Host: internal-api-endpoint-dns +Authorization: Bearer +``` + +Now, the protected resource is capable of decoding and validating the JSON Web +Token using the public key supplied by ORY Oathkeeper's API. The public key for +decoding the ID token is available at ORY Oathkeeper's `/.well-known/jwks.json` +endpoint: + +``` +http://oathkeeper:4456/.well-known/jwks.json +``` + +The related flow diagram looks like this: + +[![ID Token Transformation](https://mermaid.ink/img/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAgICBwYXJ0aWNpcGFudCBPIGFzIE9hdGhrZWVwZXIgUHJveHlcbiAgICBwYXJ0aWNpcGFudCBBIGFzIFByb3RlY3RlZCBTZXJ2ZXIvQVBJXG4gICAgQy0-Pk86IEF1dGhvcml6YXRpb246IEJhc2ljIC4uLi5cbiAgICBPLS0-Pk86IFZhbGlkYXRlIGNyZWRlbnRpYWxzXG4gICAgTy0-PkE6IEF1dGhvcml6YXRpb246IEJlYXJlciBKLlcuVFxuICAgIEEtLT4-TzogRmV0Y2ggUHVibGljIEtleVxuICAgIEEtLT4-QTogVmFsaWRhdGUgSldUIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQiLCJ0aGVtZUNTUyI6Ii5sYWJlbCBmb3JlaWduT2JqZWN0IHsgb3ZlcmZsb3c6IHZpc2libGU7IGZvbnQtc2l6ZTogMTNweCB9In19)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAgICBwYXJ0aWNpcGFudCBPIGFzIE9hdGhrZWVwZXIgUHJveHlcbiAgICBwYXJ0aWNpcGFudCBBIGFzIFByb3RlY3RlZCBTZXJ2ZXIvQVBJXG4gICAgQy0-Pk86IEF1dGhvcml6YXRpb246IEJhc2ljIC4uLi5cbiAgICBPLS0-Pk86IFZhbGlkYXRlIGNyZWRlbnRpYWxzXG4gICAgTy0-PkE6IEF1dGhvcml6YXRpb246IEJlYXJlciBKLlcuVFxuICAgIEEtLT4-TzogRmV0Y2ggUHVibGljIEtleVxuICAgIEEtLT4-QTogVmFsaWRhdGUgSldUIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQiLCJ0aGVtZUNTUyI6Ii5sYWJlbCBmb3JlaWduT2JqZWN0IHsgb3ZlcmZsb3c6IHZpc2libGU7IGZvbnQtc2l6ZTogMTNweCB9In19) + +Let's say the `oauth2_client_credentials` authenticator successfully +authenticated the credentials `client-id:client-secret`. This mutator will craft +an ID Token (JWT) with the following exemplary claims: + +```json +{ + "iss": "https://server.example.com", + "sub": "client-id", + "aud": "s6BhdRkqt3", + "jti": "n-0S6_WzA2Mj", + "exp": 1311281970, + "iat": 1311280970 +} +``` + +The ID Token Claims are as follows: + +- `iss`: Issuer Identifier for the Issuer of the response. The iss value is a + case sensitive URL using the https scheme that contains scheme, host, and + optionally, port number and path components and no query or fragment + components. Typically, this is the URL of ORY Oathkeeper, for example: + `https://oathkeeper.myapi.com`. +- `sub`: Subject Identifier. A locally unique and never reassigned identifier + within the Issuer for the End-User, which is intended to be consumed by the + Client, e.g., 24400320 or AItOawmwtWwcT0k51BayewNvutrJUqsvl6qs7A4. It must not + exceed 255 ASCII characters in length. The sub value is a case sensitive + string. The End-User might also be an OAuth 2.0 Client, given that the access + token was granted using the OAuth 2.0 Client Credentials flow. +- `aud`: Audience(s) that this ID Token is intended for. It MUST contain the + OAuth 2.0 client_id of the Relying Party as an audience value. It MAY also + contain identifiers for other audiences. In the general case, the aud value is + an array of case sensitive strings. +- `exp`: Expiration time on or after which the ID Token MUST NOT be accepted for + processing. The processing of this parameter requires that the current + date/time MUST be before the expiration date/time listed in the value. Its + value is a JSON number representing the number of seconds from + 1970-01-01T0:0:0Z as measured in UTC until the date/time. See RFC 3339 + [RFC3339] for details regarding date/times in general and UTC in particular. +- `iat`: Time at which the JWT was issued. Its value is a JSON number + representing the number of seconds from 1970-01-01T0:0:0Z as measured in UTC + until the date/time. +- `jti`: A cryptographically strong random identifier to ensure the ID Token's + uniqueness. + +### Global Configuration + +### Configuration + +- `issuer_url` (string, required) - Sets the "iss" value of the ID Token. +- `jwks_url` (string, required) - Sets the URL where keys should be fetched + from. Supports remote locations (http, https) as well as local filesystem + paths. +- `ttl` (string, optional) - Sets the time-to-live of the ID token. Defaults to + one minute. Valid time units are: s (second), m (minute), h (hour). +- `claims` (string, optional) - Allows you to customize the ID Token claims and + support Go Templates. For more information, check section [Claims](#claims) + +```yaml +# Global configuration file oathkeeper.yml +mutators: + id_token: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + config: + issuer_url: https://my-oathkeeper/ + jwks_url: https://fetch-keys/from/this/location.json + # jwks_url: file:///from/this/absolute/location.json + # jwks_url: file://../from/this/relative/location.json + ttl: 60s + claims: + '{"aud": ["https://my-backend-service/some/endpoint"],"def": "{{ print + .Extra.some.arbitrary.data }}"}' +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +mutators: + - handler: id_token + config: + issuer_url: https://my-oathkeeper/ + jwks_url: https://fetch-keys/from/this/location.json + # jwks_url: file:///from/this/absolute/location.json + # jwks_url: file://../from/this/relative/location.json + ttl: 60s + claims: + '{"aud": ["https://my-backend-service/some/endpoint"],"def": "{{ print + .Extra.some.arbitrary.data }}"}' +``` + +The first private key found in the JSON Web Key Set defined by +`mutators.id_token.jwks_url` will be used for signing the JWT: + +- If the first key found is a symmetric key (`HS256` algorithm), that key will + be used. That key **will not** be broadcasted at `/.well-known/jwks.json`. You + must manually configure the upstream to be able to fetch the key (e.g. from an + environment variable). +- If the first key found is an asymmetric private key (e.g. `RS256`, `ES256`, + ...), that key will be used. The related public key will be broadcasted at + `/.well-known/jwks.json`. + +#### Claims + +This mutator allows you to specify custom claims, like the audience of ID +tokens, via the `claims` field of the mutator's `config` field. The keys +represent names of claims and the values are arbitrary data structures which +will be parsed by the Go [text/template](https://golang.org/pkg/text/template/) +package for value substitution, receiving the `AuthenticationSession` struct. + +For more details please check [Session variables](index.md#session) + +The claims configuration expects a string which is expected to be valid JSON: + +```json +{ + "handler": "id_token", + "config": { + "claims": "{\"aud\": [\"https://my-backend-service/some/endpoint\"],\"def\": \"{{ print .Extra.some.arbitrary.data }}\"}" + } +} +``` + +Please keep in mind that certain keys (such as the `sub`) claim **can not** be +overwritten! + +### Access Rule Example + +```shell +$ cat ./rules.json +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/api/users/<[0-9]+>/<[a-zA-Z]+>", + "methods": [ + "GET" + ] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "id_token", + "config": { + "aud": [ + "audience-1", + "audience-2" + ], + "claims": "{\"abc\": \"{{ print .Subject }}\",\"def\": \"{{ print .Extra.some.arbitrary.data }}\"}" + } + } + ] +} +``` + +## `header` + +This mutator will transform the request, allowing you to pass the credentials to +the upstream application via the headers. This will augment, for example, +`Authorization: basic` with `X-User: `. + +### Configuration + +- `headers` (object (`string: string`), required) - A keyed object + (`string:string`) representing the headers to be added to this request, see + section [headers](#headers). + +```yaml +# Global configuration file oathkeeper.yml +mutators: + header: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + config: + headers: + X-User: '{{ print .Subject }}' + X-Some-Arbitrary-Data: '{{ print .Extra.some.arbitrary.data }}' +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +mutators: + - handler: header + config: + headers: + X-User: '{{ print .Subject }}' + X-Some-Arbitrary-Data: '{{ print .Extra.some.arbitrary.data }}' +``` + +#### Headers + +The headers are specified via the `headers` field of the mutator's `config` +field. The keys are the header name and the values are a string which will be +parsed by the Go [`text/template`](https://golang.org/pkg/text/template/) +package for value substitution, receiving the `AuthenticationSession` struct. + +For more details please check [Session variables](index.md#session) + +### Access Rule Example + +```json +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/api/<.*>", + "methods": ["GET"] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "header", + "config": { + "headers": { + "X-User": "{{ print .Subject }}", + "X-Some-Arbitrary-Data": "{{ print .Extra.some.arbitrary.data }}" + } + } + } + ] +} +``` + +## `cookie` + +This mutator will transform the request, allowing you to pass the credentials to +the upstream application via the cookies. + +### Configuration + +- `cookies` (object (`string: string`), required) - A keyed object + (`string:string`) representing the cookies to be added to this request, see + section [cookies](#cookies). + +```yaml +# Global configuration file oathkeeper.yml +mutators: + cookie: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + config: + cookies: + user: "{{ print .Subject }}", + some-arbitrary-data: "{{ print .Extra.some.arbitrary.data }}" +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +mutators: + - handler: cookie + config: + cookies: + user: "{{ print .Subject }}", + some-arbitrary-data: "{{ print .Extra.some.arbitrary.data }}" +``` + +### Cookies + +The cookies are specified via the `cookies` field of the mutators `config` +field. The keys are the cookie name and the values are a string which will be +parsed by the Go [`text/template`](https://golang.org/pkg/text/template/) +package for value substitution, receiving the `AuthenticationSession` struct. + +For more details please check [Session variables](index.md#session) + +##### Example + +```json +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/api/<.*>", + "methods": ["GET"] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "cookie", + "config": { + "cookies": { + "user": "{{ print .Subject }}", + "some-arbitrary-data": "{{ print .Extra.some.arbitrary.data }}" + } + } + } + ] +} +``` + +## `hydrator` + +This mutator allows for fetching additional data from external APIs, which can +be then used by other mutators. It works by making an upstream HTTP call to an +API specified in the **Per-Rule Configuration** section below. The request is a +POST request and it contains JSON representation of +[AuthenticationSession](https://github.com/ory/oathkeeper/blob/master/pipeline/authn/authenticator.go#L39) +struct in body, which is: + +```json +{ + "subject": String, + "extra": Object, + "header": Object, + "match_context": { + "regexp_capture_groups": Object, + "url": Object + } +} +``` + +As a response the mutator expects similiar JSON object, but with `extra` or +`header` fields modified. + +Example request/response payload: + +```json +{ + "subject": "anonymous", + "extra": { + "foo": "bar" + }, + "header": { + "foo": ["bar1", "bar2"] + }, + "match_context": { + "regexp_capture_groups": ["http", "foo"], + "url": "http://domain.com/foo" + } +} +``` + +The AuthenticationSession from this object replaces the original one and is +passed to the next mutator, where it can be used to e.g. set a particular cookie +to the value received from an API. + +Setting `extra` field does not transform the HTTP request, whereas headers set +in the `header` field will be added to the final request headers. + +### Configuration + +- `api.url` (string - required) - The API URL. +- `api.auth.basic.*` (optional) - Enables HTTP Basic Authorization. +- `api.auth.retry.*` (optional) - Configures the retry logic. + +```yaml +# Global configuration file oathkeeper.yml +mutators: + hydrator: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + config: + api: + url: http://my-backend-api + auth: + basic: + username: someUserName + password: somePassword + retry: + give_up_after: 2s + max_delay: 100ms +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +mutators: + - handler: hydrator + config: + api: + url: http://my-backend-api + auth: + basic: + username: someUserName + password: somePassword + retry: + give_up_after: 2s + max_delay: 100ms +``` + +### Access Rule Example + +```json +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/api/<.*>", + "methods": ["GET"] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "hydrator", + "config": { + "api": { + "url": "http://my-backend-api" + } + } + }, + { + "handler": "cookie", + "config": { + "cookies": { + "some-arbitrary-data": "{{ print .Extra.cookie }}" + } + } + } + ] +} +``` diff --git a/docs/docs/reference/api.md b/docs/docs/reference/api.md new file mode 100644 index 0000000000..bfe1a8a754 --- /dev/null +++ b/docs/docs/reference/api.md @@ -0,0 +1,1777 @@ +--- +title: REST API +id: api +--- + +ORY Oathkeeper is a reverse proxy that checks the HTTP Authorization for +validity against a set of rules. This service uses Hydra to validate access +tokens and policies. + +> You are viewing REST API documentation. This documentation is auto-generated +> from a swagger specification which itself is generated from annotations in the +> source code of the project. It is possible that this documentation includes +> bugs and that code samples are incomplete or wrong. +> +> If you find issues in the respective documentation, please do not edit the +> Markdown files directly (as they are generated) but raise an issue on the +> project's GitHub presence instead. This documentation will improve over time +> with your help! If you have ideas how to improve this part of the +> documentation, feel free to share them in a +> [GitHub issue](https://github.com/ory/docs/issues/new) any time. + + + +## api + + + +### Lists cryptographic keys + +``` +GET /.well-known/jwks.json HTTP/1.1 +Accept: application/json + +``` + +This endpoint returns cryptographic keys that are required to, for example, +verify signatures of ID Tokens. + +#### Responses + + + +##### Overview + +| Status | Meaning | Description | Schema | +| ------ | -------------------------------------------------------------------------- | ------------------------- | ------------------------------------- | +| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | jsonWebKeySet | [jsonWebKeySet](#schemajsonwebkeyset) | +| 500 | [Internal Server Error](https://tools.ietf.org/html/rfc7231#section-6.6.1) | The standard error format | Inline | + + + +##### Response Schema + +Status Code **500** + +| Name | Type | Required | Restrictions | Description | +| --------------------------- | -------------- | -------- | ------------ | ----------- | +| ยป code | integer(int64) | false | none | none | +| ยป details | [object] | false | none | none | +| ยปยป **additionalProperties** | object | false | none | none | +| ยป message | string | false | none | none | +| ยป reason | string | false | none | none | +| ยป request | string | false | none | none | +| ยป status | string | false | none | none | + +##### Examples + +###### 200 response + +```json +{ + "keys": [ + { + "alg": "string", + "crv": "string", + "d": "string", + "dp": "string", + "dq": "string", + "e": "string", + "k": "string", + "kid": "string", + "kty": "string", + "n": "string", + "p": "string", + "q": "string", + "qi": "string", + "use": "string", + "x": "string", + "x5c": ["string"], + "y": "string" + } + ] +} +``` + + + +#### Code samples + +
+ +
+
+ +```shell +curl -X GET /.well-known/jwks.json \ + -H 'Accept: application/json' +``` + +
+
+ +```go +package main + +import ( + "bytes" + "net/http" +) + +func main() { + headers := map[string][]string{ + "Accept": []string{"application/json"}, + } + + var body []byte + // body = ... + + req, err := http.NewRequest("GET", "/.well-known/jwks.json", bytes.NewBuffer(body)) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} +``` + +
+
+ +```nodejs +const fetch = require('node-fetch'); + +const headers = { + 'Accept': 'application/json' +} + +fetch('/.well-known/jwks.json', { + method: 'GET', + headers +}) +.then(r => r.json()) +.then((body) => { + console.log(body) +}) +``` + +
+
+ +```java +// This sample needs improvement. +URL obj = new URL("/.well-known/jwks.json"); + +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("GET"); + +int responseCode = con.getResponseCode(); + +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream()) +); + +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); + +System.out.println(response.toString()); +``` + +
+
+ +```python +import requests + +headers = { + 'Accept': 'application/json' +} + +r = requests.get( + '/.well-known/jwks.json', + params={}, + headers = headers) + +print r.json() +``` + +
+
+ +```ruby +require 'rest-client' +require 'json' + +headers = { + 'Accept' => 'application/json' +} + +result = RestClient.get '/.well-known/jwks.json', + params: {}, headers: headers + +p JSON.parse(result) +``` + +
+
+
+ + + +### Access Control Decision API + +``` +GET /decisions HTTP/1.1 +Accept: application/json + +``` + +> This endpoint works with all HTTP Methods (GET, POST, PUT, ...) and matches +> every path prefixed with /decision. + +This endpoint mirrors the proxy capability of ORY Oathkeeper's proxy +functionality but instead of forwarding the request to the upstream server, +returns 200 (request should be allowed), 401 (unauthorized), or 403 (forbidden) +status codes. This endpoint can be used to integrate with other API Proxies like +Ambassador, Kong, Envoy, and many more. + +#### Responses + + + +##### Overview + +| Status | Meaning | Description | Schema | +| ------ | -------------------------------------------------------------------------- | ------------------------- | ------ | +| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | An empty response | None | +| 401 | [Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1) | The standard error format | Inline | +| 403 | [Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3) | The standard error format | Inline | +| 404 | [Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4) | The standard error format | Inline | +| 500 | [Internal Server Error](https://tools.ietf.org/html/rfc7231#section-6.6.1) | The standard error format | Inline | + + + +##### Response Schema + +Status Code **401** + +| Name | Type | Required | Restrictions | Description | +| --------------------------- | -------------- | -------- | ------------ | ----------- | +| ยป code | integer(int64) | false | none | none | +| ยป details | [object] | false | none | none | +| ยปยป **additionalProperties** | object | false | none | none | +| ยป message | string | false | none | none | +| ยป reason | string | false | none | none | +| ยป request | string | false | none | none | +| ยป status | string | false | none | none | + +Status Code **403** + +| Name | Type | Required | Restrictions | Description | +| --------------------------- | -------------- | -------- | ------------ | ----------- | +| ยป code | integer(int64) | false | none | none | +| ยป details | [object] | false | none | none | +| ยปยป **additionalProperties** | object | false | none | none | +| ยป message | string | false | none | none | +| ยป reason | string | false | none | none | +| ยป request | string | false | none | none | +| ยป status | string | false | none | none | + +Status Code **404** + +| Name | Type | Required | Restrictions | Description | +| --------------------------- | -------------- | -------- | ------------ | ----------- | +| ยป code | integer(int64) | false | none | none | +| ยป details | [object] | false | none | none | +| ยปยป **additionalProperties** | object | false | none | none | +| ยป message | string | false | none | none | +| ยป reason | string | false | none | none | +| ยป request | string | false | none | none | +| ยป status | string | false | none | none | + +Status Code **500** + +| Name | Type | Required | Restrictions | Description | +| --------------------------- | -------------- | -------- | ------------ | ----------- | +| ยป code | integer(int64) | false | none | none | +| ยป details | [object] | false | none | none | +| ยปยป **additionalProperties** | object | false | none | none | +| ยป message | string | false | none | none | +| ยป reason | string | false | none | none | +| ยป request | string | false | none | none | +| ยป status | string | false | none | none | + +##### Examples + +###### 401 response + +```json +{ + "code": 0, + "details": [ + { + "property1": {}, + "property2": {} + } + ], + "message": "string", + "reason": "string", + "request": "string", + "status": "string" +} +``` + + + +#### Code samples + +
+ +
+
+ +```shell +curl -X GET /decisions \ + -H 'Accept: application/json' +``` + +
+
+ +```go +package main + +import ( + "bytes" + "net/http" +) + +func main() { + headers := map[string][]string{ + "Accept": []string{"application/json"}, + } + + var body []byte + // body = ... + + req, err := http.NewRequest("GET", "/decisions", bytes.NewBuffer(body)) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} +``` + +
+
+ +```nodejs +const fetch = require('node-fetch'); + +const headers = { + 'Accept': 'application/json' +} + +fetch('/decisions', { + method: 'GET', + headers +}) +.then(r => r.json()) +.then((body) => { + console.log(body) +}) +``` + +
+
+ +```java +// This sample needs improvement. +URL obj = new URL("/decisions"); + +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("GET"); + +int responseCode = con.getResponseCode(); + +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream()) +); + +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); + +System.out.println(response.toString()); +``` + +
+
+ +```python +import requests + +headers = { + 'Accept': 'application/json' +} + +r = requests.get( + '/decisions', + params={}, + headers = headers) + +print r.json() +``` + +
+
+ +```ruby +require 'rest-client' +require 'json' + +headers = { + 'Accept' => 'application/json' +} + +result = RestClient.get '/decisions', + params: {}, headers: headers + +p JSON.parse(result) +``` + +
+
+
+ + + +### List all rules + +``` +GET /rules HTTP/1.1 +Accept: application/json + +``` + +This method returns an array of all rules that are stored in the backend. This +is useful if you want to get a full view of what rules you have currently in +place. + + + +##### Parameters + +| Parameter | In | Type | Required | Description | +| --------- | ----- | -------------- | -------- | --------------------------------------- | +| limit | query | integer(int64) | false | The maximum amount of rules returned. | +| offset | query | integer(int64) | false | The offset from where to start looking. | + +#### Responses + + + +##### Overview + +| Status | Meaning | Description | Schema | +| ------ | -------------------------------------------------------------------------- | ------------------------- | ------ | +| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | A list of rules | Inline | +| 500 | [Internal Server Error](https://tools.ietf.org/html/rfc7231#section-6.6.1) | The standard error format | Inline | + + + +##### Response Schema + +Status Code **200** + +| Name | Type | Required | Restrictions | Description | +| --------------------------------------------------------------------------- | ----------------------------------- | -------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| _anonymous_ | [[rule](#schemarule)] | false | none | none | +| ยป swaggerRule is a single rule that will get checked on every HTTP request. | [rule](#schemarule) | false | none | none | +| ยปยป authenticators | [[ruleHandler](#schemarulehandler)] | false | none | Authenticators is a list of authentication handlers that will try and authenticate the provided credentials. Authenticators are checked iteratively from index 0 to n and if the first authenticator to return a positive result will be the one used. If you want the rule to first check a specific authenticator before "falling back" to others, have that authenticator as the first item in the array. | +| ยปยปยป config | object | false | none | Config contains the configuration for the handler. Please read the user guide for a complete list of each handler's available settings. | +| ยปยปยป handler | string | false | none | Handler identifies the implementation which will be used to handle this specific request. Please read the user guide for a complete list of available handlers. | +| ยปยป authorizer | [ruleHandler](#schemarulehandler) | false | none | none | +| ยปยป description | string | false | none | Description is a human readable description of this rule. | +| ยปยป id | string | false | none | ID is the unique id of the rule. It can be at most 190 characters long, but the layout of the ID is up to you. You will need this ID later on to update or delete the rule. | +| ยปยป match | [ruleMatch](#schemarulematch) | false | none | none | +| ยปยปยป methods | [string] | false | none | An array of HTTP methods (e.g. GET, POST, PUT, DELETE, ...). When ORY Oathkeeper searches for rules to decide what to do with an incoming request to the proxy server, it compares the HTTP method of the incoming request with the HTTP methods of each rules. If a match is found, the rule is considered a partial match. If the matchesUrl field is satisfied as well, the rule is considered a full match. | +| ยปยปยป url | string | false | none | This field represents the URL pattern this rule matches. When ORY Oathkeeper searches for rules to decide what to do with an incoming request to the proxy server, it compares the full request URL (e.g. https://mydomain.com/api/resource) without query parameters of the incoming request with this field. If a match is found, the rule is considered a partial match. If the matchesMethods field is satisfied as well, the rule is considered a full match. You can use regular expressions in this field to match more than one url. Regular expressions are encapsulated in brackets < and >. The following example matches all paths of the domain `mydomain.com`: `https://mydomain.com/<.*>`. | +| ยปยป mutators | [[ruleHandler](#schemarulehandler)] | false | none | Mutators is a list of mutation handlers that transform the HTTP request. A common use case is generating a new set of credentials (e.g. JWT) which then will be forwarded to the upstream server. Mutations are performed iteratively from index 0 to n and should all succeed in order for the HTTP request to be forwarded. | +| ยปยป upstream | [Upstream](#schemaupstream) | false | none | none | +| ยปยปยป preserve_host | boolean | false | none | PreserveHost, if false (the default), tells ORY Oathkeeper to set the upstream request's Host header to the hostname of the API's upstream's URL. Setting this flag to true instructs ORY Oathkeeper not to do so. | +| ยปยปยป strip_path | string | false | none | StripPath if set, replaces the provided path prefix when forwarding the requested URL to the upstream URL. | +| ยปยปยป url | string | false | none | URL is the URL the request will be proxied to. | + +Status Code **500** + +| Name | Type | Required | Restrictions | Description | +| --------------------------- | -------------- | -------- | ------------ | ----------- | +| ยป code | integer(int64) | false | none | none | +| ยป details | [object] | false | none | none | +| ยปยป **additionalProperties** | object | false | none | none | +| ยป message | string | false | none | none | +| ยป reason | string | false | none | none | +| ยป request | string | false | none | none | +| ยป status | string | false | none | none | + +##### Examples + +###### 200 response + +```json +[ + { + "authenticators": [ + { + "config": {}, + "handler": "string" + } + ], + "authorizer": { + "config": {}, + "handler": "string" + }, + "description": "string", + "id": "string", + "match": { + "methods": ["string"], + "url": "string" + }, + "mutators": [ + { + "config": {}, + "handler": "string" + } + ], + "upstream": { + "preserve_host": true, + "strip_path": "string", + "url": "string" + } + } +] +``` + + + +#### Code samples + +
+ +
+
+ +```shell +curl -X GET /rules \ + -H 'Accept: application/json' +``` + +
+
+ +```go +package main + +import ( + "bytes" + "net/http" +) + +func main() { + headers := map[string][]string{ + "Accept": []string{"application/json"}, + } + + var body []byte + // body = ... + + req, err := http.NewRequest("GET", "/rules", bytes.NewBuffer(body)) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} +``` + +
+
+ +```nodejs +const fetch = require('node-fetch'); + +const headers = { + 'Accept': 'application/json' +} + +fetch('/rules', { + method: 'GET', + headers +}) +.then(r => r.json()) +.then((body) => { + console.log(body) +}) +``` + +
+
+ +```java +// This sample needs improvement. +URL obj = new URL("/rules"); + +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("GET"); + +int responseCode = con.getResponseCode(); + +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream()) +); + +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); + +System.out.println(response.toString()); +``` + +
+
+ +```python +import requests + +headers = { + 'Accept': 'application/json' +} + +r = requests.get( + '/rules', + params={}, + headers = headers) + +print r.json() +``` + +
+
+ +```ruby +require 'rest-client' +require 'json' + +headers = { + 'Accept' => 'application/json' +} + +result = RestClient.get '/rules', + params: {}, headers: headers + +p JSON.parse(result) +``` + +
+
+
+ + + +### Retrieve a rule + +``` +GET /rules/{id} HTTP/1.1 +Accept: application/json + +``` + +Use this method to retrieve a rule from the storage. If it does not exist you +will receive a 404 error. + + + +##### Parameters + +| Parameter | In | Type | Required | Description | +| --------- | ---- | ------ | -------- | ----------- | +| id | path | string | true | none | + +#### Responses + + + +##### Overview + +| Status | Meaning | Description | Schema | +| ------ | -------------------------------------------------------------------------- | ------------------------- | ------------------- | +| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | A rule | [rule](#schemarule) | +| 404 | [Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4) | The standard error format | Inline | +| 500 | [Internal Server Error](https://tools.ietf.org/html/rfc7231#section-6.6.1) | The standard error format | Inline | + + + +##### Response Schema + +Status Code **404** + +| Name | Type | Required | Restrictions | Description | +| --------------------------- | -------------- | -------- | ------------ | ----------- | +| ยป code | integer(int64) | false | none | none | +| ยป details | [object] | false | none | none | +| ยปยป **additionalProperties** | object | false | none | none | +| ยป message | string | false | none | none | +| ยป reason | string | false | none | none | +| ยป request | string | false | none | none | +| ยป status | string | false | none | none | + +Status Code **500** + +| Name | Type | Required | Restrictions | Description | +| --------------------------- | -------------- | -------- | ------------ | ----------- | +| ยป code | integer(int64) | false | none | none | +| ยป details | [object] | false | none | none | +| ยปยป **additionalProperties** | object | false | none | none | +| ยป message | string | false | none | none | +| ยป reason | string | false | none | none | +| ยป request | string | false | none | none | +| ยป status | string | false | none | none | + +##### Examples + +###### 200 response + +```json +{ + "authenticators": [ + { + "config": {}, + "handler": "string" + } + ], + "authorizer": { + "config": {}, + "handler": "string" + }, + "description": "string", + "id": "string", + "match": { + "methods": ["string"], + "url": "string" + }, + "mutators": [ + { + "config": {}, + "handler": "string" + } + ], + "upstream": { + "preserve_host": true, + "strip_path": "string", + "url": "string" + } +} +``` + + + +#### Code samples + +
+ +
+
+ +```shell +curl -X GET /rules/{id} \ + -H 'Accept: application/json' +``` + +
+
+ +```go +package main + +import ( + "bytes" + "net/http" +) + +func main() { + headers := map[string][]string{ + "Accept": []string{"application/json"}, + } + + var body []byte + // body = ... + + req, err := http.NewRequest("GET", "/rules/{id}", bytes.NewBuffer(body)) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} +``` + +
+
+ +```nodejs +const fetch = require('node-fetch'); + +const headers = { + 'Accept': 'application/json' +} + +fetch('/rules/{id}', { + method: 'GET', + headers +}) +.then(r => r.json()) +.then((body) => { + console.log(body) +}) +``` + +
+
+ +```java +// This sample needs improvement. +URL obj = new URL("/rules/{id}"); + +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("GET"); + +int responseCode = con.getResponseCode(); + +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream()) +); + +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); + +System.out.println(response.toString()); +``` + +
+
+ +```python +import requests + +headers = { + 'Accept': 'application/json' +} + +r = requests.get( + '/rules/{id}', + params={}, + headers = headers) + +print r.json() +``` + +
+
+ +```ruby +require 'rest-client' +require 'json' + +headers = { + 'Accept' => 'application/json' +} + +result = RestClient.get '/rules/{id}', + params: {}, headers: headers + +p JSON.parse(result) +``` + +
+
+
+ + + +## health + + + +### Check alive status + +``` +GET /health/alive HTTP/1.1 +Accept: application/json + +``` + +This endpoint returns a 200 status code when the HTTP server is up running. This +status does currently not include checks whether the database connection is +working. + +If the service supports TLS Edge Termination, this endpoint does not require the +`X-Forwarded-Proto` header to be set. + +Be aware that if you are running multiple nodes of this service, the health +status will never refer to the cluster state, only to a single instance. + +#### Responses + + + +##### Overview + +| Status | Meaning | Description | Schema | +| ------ | -------------------------------------------------------------------------- | ------------------------- | ----------------------------------- | +| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | healthStatus | [healthStatus](#schemahealthstatus) | +| 500 | [Internal Server Error](https://tools.ietf.org/html/rfc7231#section-6.6.1) | The standard error format | Inline | + + + +##### Response Schema + +Status Code **500** + +| Name | Type | Required | Restrictions | Description | +| --------------------------- | -------------- | -------- | ------------ | ----------- | +| ยป code | integer(int64) | false | none | none | +| ยป details | [object] | false | none | none | +| ยปยป **additionalProperties** | object | false | none | none | +| ยป message | string | false | none | none | +| ยป reason | string | false | none | none | +| ยป request | string | false | none | none | +| ยป status | string | false | none | none | + +##### Examples + +###### 200 response + +```json +{ + "status": "string" +} +``` + + + +#### Code samples + +
+ +
+
+ +```shell +curl -X GET /health/alive \ + -H 'Accept: application/json' +``` + +
+
+ +```go +package main + +import ( + "bytes" + "net/http" +) + +func main() { + headers := map[string][]string{ + "Accept": []string{"application/json"}, + } + + var body []byte + // body = ... + + req, err := http.NewRequest("GET", "/health/alive", bytes.NewBuffer(body)) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} +``` + +
+
+ +```nodejs +const fetch = require('node-fetch'); + +const headers = { + 'Accept': 'application/json' +} + +fetch('/health/alive', { + method: 'GET', + headers +}) +.then(r => r.json()) +.then((body) => { + console.log(body) +}) +``` + +
+
+ +```java +// This sample needs improvement. +URL obj = new URL("/health/alive"); + +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("GET"); + +int responseCode = con.getResponseCode(); + +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream()) +); + +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); + +System.out.println(response.toString()); +``` + +
+
+ +```python +import requests + +headers = { + 'Accept': 'application/json' +} + +r = requests.get( + '/health/alive', + params={}, + headers = headers) + +print r.json() +``` + +
+
+ +```ruby +require 'rest-client' +require 'json' + +headers = { + 'Accept' => 'application/json' +} + +result = RestClient.get '/health/alive', + params: {}, headers: headers + +p JSON.parse(result) +``` + +
+
+
+ + + +### Check readiness status + +``` +GET /health/ready HTTP/1.1 +Accept: application/json + +``` + +This endpoint returns a 200 status code when the HTTP server is up running and +the environment dependencies (e.g. the database) are responsive as well. + +If the service supports TLS Edge Termination, this endpoint does not require the +`X-Forwarded-Proto` header to be set. + +Be aware that if you are running multiple nodes of this service, the health +status will never refer to the cluster state, only to a single instance. + +#### Responses + + + +##### Overview + +| Status | Meaning | Description | Schema | +| ------ | ------------------------------------------------------------------------ | -------------------- | --------------------------------------------------- | +| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | healthStatus | [healthStatus](#schemahealthstatus) | +| 503 | [Service Unavailable](https://tools.ietf.org/html/rfc7231#section-6.6.4) | healthNotReadyStatus | [healthNotReadyStatus](#schemahealthnotreadystatus) | + +##### Examples + +###### 200 response + +```json +{ + "status": "string" +} +``` + + + +#### Code samples + +
+ +
+
+ +```shell +curl -X GET /health/ready \ + -H 'Accept: application/json' +``` + +
+
+ +```go +package main + +import ( + "bytes" + "net/http" +) + +func main() { + headers := map[string][]string{ + "Accept": []string{"application/json"}, + } + + var body []byte + // body = ... + + req, err := http.NewRequest("GET", "/health/ready", bytes.NewBuffer(body)) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} +``` + +
+
+ +```nodejs +const fetch = require('node-fetch'); + +const headers = { + 'Accept': 'application/json' +} + +fetch('/health/ready', { + method: 'GET', + headers +}) +.then(r => r.json()) +.then((body) => { + console.log(body) +}) +``` + +
+
+ +```java +// This sample needs improvement. +URL obj = new URL("/health/ready"); + +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("GET"); + +int responseCode = con.getResponseCode(); + +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream()) +); + +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); + +System.out.println(response.toString()); +``` + +
+
+ +```python +import requests + +headers = { + 'Accept': 'application/json' +} + +r = requests.get( + '/health/ready', + params={}, + headers = headers) + +print r.json() +``` + +
+
+ +```ruby +require 'rest-client' +require 'json' + +headers = { + 'Accept' => 'application/json' +} + +result = RestClient.get '/health/ready', + params: {}, headers: headers + +p JSON.parse(result) +``` + +
+
+
+ + + +## version + + + +### Get service version + +``` +GET /version HTTP/1.1 +Accept: application/json + +``` + +This endpoint returns the service version typically notated using semantic +versioning. + +If the service supports TLS Edge Termination, this endpoint does not require the +`X-Forwarded-Proto` header to be set. + +Be aware that if you are running multiple nodes of this service, the health +status will never refer to the cluster state, only to a single instance. + +#### Responses + + + +##### Overview + +| Status | Meaning | Description | Schema | +| ------ | ------------------------------------------------------- | ----------- | ------------------------- | +| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | version | [version](#schemaversion) | + +##### Examples + +###### 200 response + +```json +{ + "version": "string" +} +``` + + + +#### Code samples + +
+ +
+
+ +```shell +curl -X GET /version \ + -H 'Accept: application/json' +``` + +
+
+ +```go +package main + +import ( + "bytes" + "net/http" +) + +func main() { + headers := map[string][]string{ + "Accept": []string{"application/json"}, + } + + var body []byte + // body = ... + + req, err := http.NewRequest("GET", "/version", bytes.NewBuffer(body)) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} +``` + +
+
+ +```nodejs +const fetch = require('node-fetch'); + +const headers = { + 'Accept': 'application/json' +} + +fetch('/version', { + method: 'GET', + headers +}) +.then(r => r.json()) +.then((body) => { + console.log(body) +}) +``` + +
+
+ +```java +// This sample needs improvement. +URL obj = new URL("/version"); + +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("GET"); + +int responseCode = con.getResponseCode(); + +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream()) +); + +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); + +System.out.println(response.toString()); +``` + +
+
+ +```python +import requests + +headers = { + 'Accept': 'application/json' +} + +r = requests.get( + '/version', + params={}, + headers = headers) + +print r.json() +``` + +
+
+ +```ruby +require 'rest-client' +require 'json' + +headers = { + 'Accept' => 'application/json' +} + +result = RestClient.get '/version', + params: {}, headers: headers + +p JSON.parse(result) +``` + +
+
+
+ +## Schemas + +Upstream + +#### Upstream + + + +```json +{ + "preserve_host": true, + "strip_path": "string", + "url": "string" +} +``` + +#### Properties + +| Name | Type | Required | Restrictions | Description | +| ------------- | ------- | -------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| preserve_host | boolean | false | none | PreserveHost, if false (the default), tells ORY Oathkeeper to set the upstream request's Host header to the hostname of the API's upstream's URL. Setting this flag to true instructs ORY Oathkeeper not to do so. | +| strip_path | string | false | none | StripPath if set, replaces the provided path prefix when forwarding the requested URL to the upstream URL. | +| url | string | false | none | URL is the URL the request will be proxied to. | + +healthNotReadyStatus + +#### healthNotReadyStatus + + + +```json +{ + "errors": { + "property1": "string", + "property2": "string" + } +} +``` + +#### Properties + +| Name | Type | Required | Restrictions | Description | +| -------------------------- | ------ | -------- | ------------ | ------------------------------------------------------------------ | +| errors | object | false | none | Errors contains a list of errors that caused the not ready status. | +| ยป **additionalProperties** | string | false | none | none | + +healthStatus + +#### healthStatus + + + +```json +{ + "status": "string" +} +``` + +#### Properties + +| Name | Type | Required | Restrictions | Description | +| ------ | ------ | -------- | ------------ | ---------------------------- | +| status | string | false | none | Status always contains "ok". | + +jsonWebKey + +#### jsonWebKey + + + +```json +{ + "alg": "string", + "crv": "string", + "d": "string", + "dp": "string", + "dq": "string", + "e": "string", + "k": "string", + "kid": "string", + "kty": "string", + "n": "string", + "p": "string", + "q": "string", + "qi": "string", + "use": "string", + "x": "string", + "x5c": ["string"], + "y": "string" +} +``` + +#### Properties + +| Name | Type | Required | Restrictions | Description | +| ---- | -------- | -------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| alg | string | false | none | The "alg" (algorithm) parameter identifies the algorithm intended for use with the key. The values used should either be registered in the IANA "JSON Web Signature and Encryption Algorithms" registry established by [JWA] or be a value that contains a Collision- Resistant Name. | +| crv | string | false | none | none | +| d | string | false | none | none | +| dp | string | false | none | none | +| dq | string | false | none | none | +| e | string | false | none | none | +| k | string | false | none | none | +| kid | string | false | none | The "kid" (key ID) parameter is used to match a specific key. This is used, for instance, to choose among a set of keys within a JWK Set during key rollover. The structure of the "kid" value is unspecified. When "kid" values are used within a JWK Set, different keys within the JWK Set SHOULD use distinct "kid" values. (One example in which different keys might use the same "kid" value is if they have different "kty" (key type) values but are considered to be equivalent alternatives by the application using them.) The "kid" value is a case-sensitive string. | +| kty | string | false | none | The "kty" (key type) parameter identifies the cryptographic algorithm family used with the key, such as "RSA" or "EC". "kty" values should either be registered in the IANA "JSON Web Key Types" registry established by [JWA] or be a value that contains a Collision- Resistant Name. The "kty" value is a case-sensitive string. | +| n | string | false | none | none | +| p | string | false | none | none | +| q | string | false | none | none | +| qi | string | false | none | none | +| use | string | false | none | The "use" (public key use) parameter identifies the intended use of the public key. The "use" parameter is employed to indicate whether a public key is used for encrypting data or verifying the signature on data. Values are commonly "sig" (signature) or "enc" (encryption). | +| x | string | false | none | none | +| x5c | [string] | false | none | The "x5c" (X.509 certificate chain) parameter contains a chain of one or more PKIX certificates [RFC5280]. The certificate chain is represented as a JSON array of certificate value strings. Each string in the array is a base64-encoded (Section 4 of [RFC4648] -- not base64url-encoded) DER [ITU.X690.1994] PKIX certificate value. The PKIX certificate containing the key value MUST be the first certificate. | +| y | string | false | none | none | + +jsonWebKeySet + +#### jsonWebKeySet + + + +```json +{ + "keys": [ + { + "alg": "string", + "crv": "string", + "d": "string", + "dp": "string", + "dq": "string", + "e": "string", + "k": "string", + "kid": "string", + "kty": "string", + "n": "string", + "p": "string", + "q": "string", + "qi": "string", + "use": "string", + "x": "string", + "x5c": ["string"], + "y": "string" + } + ] +} +``` + +#### Properties + +| Name | Type | Required | Restrictions | Description | +| ---- | --------------------------------- | -------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| keys | [[jsonWebKey](#schemajsonwebkey)] | false | none | The value of the "keys" parameter is an array of JWK values. By default, the order of the JWK values within the array does not imply an order of preference among them, although applications of JWK Sets can choose to assign a meaning to the order for their purposes, if desired. | + +rule + +#### rule + + + +```json +{ + "authenticators": [ + { + "config": {}, + "handler": "string" + } + ], + "authorizer": { + "config": {}, + "handler": "string" + }, + "description": "string", + "id": "string", + "match": { + "methods": ["string"], + "url": "string" + }, + "mutators": [ + { + "config": {}, + "handler": "string" + } + ], + "upstream": { + "preserve_host": true, + "strip_path": "string", + "url": "string" + } +} +``` + +_swaggerRule is a single rule that will get checked on every HTTP request._ + +#### Properties + +| Name | Type | Required | Restrictions | Description | +| -------------- | ----------------------------------- | -------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| authenticators | [[ruleHandler](#schemarulehandler)] | false | none | Authenticators is a list of authentication handlers that will try and authenticate the provided credentials. Authenticators are checked iteratively from index 0 to n and if the first authenticator to return a positive result will be the one used. If you want the rule to first check a specific authenticator before "falling back" to others, have that authenticator as the first item in the array. | +| authorizer | [ruleHandler](#schemarulehandler) | false | none | none | +| description | string | false | none | Description is a human readable description of this rule. | +| id | string | false | none | ID is the unique id of the rule. It can be at most 190 characters long, but the layout of the ID is up to you. You will need this ID later on to update or delete the rule. | +| match | [ruleMatch](#schemarulematch) | false | none | none | +| mutators | [[ruleHandler](#schemarulehandler)] | false | none | Mutators is a list of mutation handlers that transform the HTTP request. A common use case is generating a new set of credentials (e.g. JWT) which then will be forwarded to the upstream server. Mutations are performed iteratively from index 0 to n and should all succeed in order for the HTTP request to be forwarded. | +| upstream | [Upstream](#schemaupstream) | false | none | none | + +ruleHandler + +#### ruleHandler + + + +```json +{ + "config": {}, + "handler": "string" +} +``` + +#### Properties + +| Name | Type | Required | Restrictions | Description | +| ------- | ------ | -------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| config | object | false | none | Config contains the configuration for the handler. Please read the user guide for a complete list of each handler's available settings. | +| handler | string | false | none | Handler identifies the implementation which will be used to handle this specific request. Please read the user guide for a complete list of available handlers. | + +ruleMatch + +#### ruleMatch + + + +```json +{ + "methods": ["string"], + "url": "string" +} +``` + +#### Properties + +| Name | Type | Required | Restrictions | Description | +| ------- | -------- | -------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| methods | [string] | false | none | An array of HTTP methods (e.g. GET, POST, PUT, DELETE, ...). When ORY Oathkeeper searches for rules to decide what to do with an incoming request to the proxy server, it compares the HTTP method of the incoming request with the HTTP methods of each rules. If a match is found, the rule is considered a partial match. If the matchesUrl field is satisfied as well, the rule is considered a full match. | +| url | string | false | none | This field represents the URL pattern this rule matches. When ORY Oathkeeper searches for rules to decide what to do with an incoming request to the proxy server, it compares the full request URL (e.g. https://mydomain.com/api/resource) without query parameters of the incoming request with this field. If a match is found, the rule is considered a partial match. If the matchesMethods field is satisfied as well, the rule is considered a full match. You can use regular expressions in this field to match more than one url. Regular expressions are encapsulated in brackets < and >. The following example matches all paths of the domain `mydomain.com`: `https://mydomain.com/<.*>`. | + +version + +#### version + + + +```json +{ + "version": "string" +} +``` + +#### Properties + +| Name | Type | Required | Restrictions | Description | +| ------- | ------ | -------- | ------------ | --------------------------------- | +| version | string | false | none | Version is the service's version. | diff --git a/docs/docs/reference/configuration.md b/docs/docs/reference/configuration.md new file mode 100644 index 0000000000..5863a25cf1 --- /dev/null +++ b/docs/docs/reference/configuration.md @@ -0,0 +1,1405 @@ +--- +id: configuration +title: Configuration +--- + + + +If file `$HOME/.oathkeeper.yaml` exists, it will be used as a configuration file +which supports all configuration settings listed below. + +You can load the config file from another source using the +`-c path/to/config.yaml` or `--config path/to/config.yaml` flag: +`oathkeeper --config path/to/config.yaml`. + +Config files can be formatted as JSON, YAML and TOML. Some configuration values +support reloading without server restart. All configuration values can be set +using environment variables, as documented below. + +To find out more about edge cases like setting string array values through +environmental variables head to the +[Configuring ORY services](../ecosystem/configuring) section. + +```yaml +## ORY Oathkeeper Configuration +# + +## HTTP(s) ## +# +serve: + ## HTTP REST API ## + # + api: + ## Port ## + # + # The port to listen on. + # + # Default value: 4456 + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_PORT= + # - Windows Command Line (CMD): + # > set SERVE_API_PORT= + # + port: -14767685 + + ## Host ## + # + # The network interface to listen on. + # + # Examples: + # - localhost + # - 127.0.0.1 + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_HOST= + # - Windows Command Line (CMD): + # > set SERVE_API_HOST= + # + host: localhost + + ## Cross Origin Resource Sharing (CORS) ## + # + # Configure [Cross Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/) using the following options. + # + cors: + ## Enable CORS ## + # + # If set to true, CORS will be enabled and preflight-requests (OPTION) will be answered. + # + # Default value: false + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_ENABLED= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_ENABLED= + # + enabled: false + + ## Allowed Origins ## + # + # A list of origins a cross-domain request can be executed from. If the special * value is present in the list, all origins will be allowed. An origin may contain a wildcard (*) to replace 0 or more characters (i.e.: http://*.domain.com). Usage of wildcards implies a small performance penality. Only one wildcard can be used per origin. + # + # Default value: * + # + # Examples: + # - - https://example.com + # - https://*.example.com + # - https://*.foo.example.com + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_ALLOWED_ORIGINS= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_ALLOWED_ORIGINS= + # + allowed_origins: + - https://example.com + - https://*.example.com + - https://*.foo.example.com + + ## Allowed HTTP Methods ## + # + # A list of methods the client is allowed to use with cross-domain requests. + # + # Default value: GET,POST,PUT,PATCH,DELETE + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_ALLOWED_METHODS= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_ALLOWED_METHODS= + # + allowed_methods: + - POST + - PATCH + + ## Allowed Request HTTP Headers ## + # + # A list of non simple headers the client is allowed to use with cross-domain requests. + # + # Default value: Authorization,Content-Type + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_ALLOWED_HEADERS= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_ALLOWED_HEADERS= + # + allowed_headers: + - ut + + ## Allowed Response HTTP Headers ## + # + # Indicates which headers are safe to expose to the API of a CORS API specification + # + # Default value: Content-Type + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_EXPOSED_HEADERS= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_EXPOSED_HEADERS= + # + exposed_headers: + - officia dolor + - consequat + - est + - nostrud sit minim + - in in + + ## Allow HTTP Credentials ## + # + # Indicates whether the request can include user credentials like cookies, HTTP authentication or client side SSL certificates. + # + # Default value: false + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_ALLOW_CREDENTIALS= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_ALLOW_CREDENTIALS= + # + allow_credentials: true + + ## Maximum Age ## + # + # Indicates how long (in seconds) the results of a preflight request can be cached. The default is 0 which stands for no max age. + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_MAX_AGE= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_MAX_AGE= + # + max_age: 32682046 + + ## Enable Debugging ## + # + # Set to true to debug server side CORS issues. + # + # Default value: false + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_DEBUG= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_DEBUG= + # + debug: true + + ## HTTPS ## + # + # Configure HTTP over TLS (HTTPS). All options can also be set using environment variables by replacing dots (`.`) with underscores (`_`) and uppercasing the key. For example, `some.prefix.tls.key.path` becomes `export SOME_PREFIX_TLS_KEY_PATH`. If all keys are left undefined, TLS will be disabled. + # + tls: + ## Private Key (PEM) ## + # + key: + ## path ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_TLS_KEY_PATH= + # - Windows Command Line (CMD): + # > set SERVE_API_TLS_KEY_PATH= + # + path: path/to/file.pem + + ## base64 ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_TLS_KEY_BASE64= + # - Windows Command Line (CMD): + # > set SERVE_API_TLS_KEY_BASE64= + # + base64: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlEWlRDQ0FrMmdBd0lCQWdJRVY1eE90REFOQmdr... + + ## TLS Certificate (PEM) ## + # + cert: + ## path ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_TLS_CERT_PATH= + # - Windows Command Line (CMD): + # > set SERVE_API_TLS_CERT_PATH= + # + path: path/to/file.pem + + ## base64 ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_TLS_CERT_BASE64= + # - Windows Command Line (CMD): + # > set SERVE_API_TLS_CERT_BASE64= + # + base64: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlEWlRDQ0FrMmdBd0lCQWdJRVY1eE90REFOQmdr... + + ## HTTP Reverse Proxy ## + # + proxy: + ## Port ## + # + # The port to listen on. + # + # Default value: 4455 + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_PORT= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_PORT= + # + port: 47008934 + + ## Host ## + # + # The network interface to listen on. Leave empty to listen on all interfaces. + # + # Examples: + # - localhost + # - 127.0.0.1 + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_HOST= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_HOST= + # + host: localhost + + ## HTTP Timeouts ## + # + # Control the reverse proxy's HTTP timeouts. + # + timeout: + ## HTTP Read Timeout ## + # + # The maximum duration for reading the entire request, including the body. + # + # Default value: 5s + # + # Examples: + # - 5s + # - 5m + # - 5h + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_TIMEOUT_READ= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_TIMEOUT_READ= + # + read: 5s + + ## HTTP Write Timeout ## + # + # The maximum duration before timing out writes of the response. Increase this parameter to prevent unexpected closing a client connection if an upstream request is responding slowly. + # + # Default value: 120s + # + # Examples: + # - 5s + # - 5m + # - 5h + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_TIMEOUT_WRITE= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_TIMEOUT_WRITE= + # + write: 5s + + ## HTTP Idle Timeout ## + # + # The maximum amount of time to wait for any action of a request session, reading data or writing the response. + # + # Default value: 120s + # + # Examples: + # - 5s + # - 5m + # - 5h + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_TIMEOUT_IDLE= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_TIMEOUT_IDLE= + # + idle: 120s + + ## Cross Origin Resource Sharing (CORS) ## + # + # Configure [Cross Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/) using the following options. + # + cors: + ## Enable CORS ## + # + # If set to true, CORS will be enabled and preflight-requests (OPTION) will be answered. + # + # Default value: false + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_ENABLED= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_ENABLED= + # + enabled: true + + ## Allowed Origins ## + # + # A list of origins a cross-domain request can be executed from. If the special * value is present in the list, all origins will be allowed. An origin may contain a wildcard (*) to replace 0 or more characters (i.e.: http://*.domain.com). Usage of wildcards implies a small performance penality. Only one wildcard can be used per origin. + # + # Default value: * + # + # Examples: + # - - https://example.com + # - https://*.example.com + # - https://*.foo.example.com + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_ALLOWED_ORIGINS= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_ALLOWED_ORIGINS= + # + allowed_origins: + - https://example.com + - https://*.example.com + - https://*.foo.example.com + + ## Allowed HTTP Methods ## + # + # A list of methods the client is allowed to use with cross-domain requests. + # + # Default value: GET,POST,PUT,PATCH,DELETE + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_ALLOWED_METHODS= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_ALLOWED_METHODS= + # + allowed_methods: + - HEAD + - CONNECT + - GET + - TRACE + - PATCH + + ## Allowed Request HTTP Headers ## + # + # A list of non simple headers the client is allowed to use with cross-domain requests. + # + # Default value: Authorization,Content-Type + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_ALLOWED_HEADERS= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_ALLOWED_HEADERS= + # + allowed_headers: + - in + + ## Allowed Response HTTP Headers ## + # + # Indicates which headers are safe to expose to the API of a CORS API specification + # + # Default value: Content-Type + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_EXPOSED_HEADERS= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_EXPOSED_HEADERS= + # + exposed_headers: + - laborum in dolore minim amet + - consectetur laborum + - ullamco amet exercitation enim + - 'sint ' + - 'Lorem enim in ' + + ## Allow HTTP Credentials ## + # + # Indicates whether the request can include user credentials like cookies, HTTP authentication or client side SSL certificates. + # + # Default value: false + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_ALLOW_CREDENTIALS= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_ALLOW_CREDENTIALS= + # + allow_credentials: true + + ## Maximum Age ## + # + # Indicates how long (in seconds) the results of a preflight request can be cached. The default is 0 which stands for no max age. + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_MAX_AGE= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_MAX_AGE= + # + max_age: 1235071 + + ## Enable Debugging ## + # + # Set to true to debug server side CORS issues. + # + # Default value: false + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_DEBUG= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_DEBUG= + # + debug: true + + ## HTTPS ## + # + # Configure HTTP over TLS (HTTPS). All options can also be set using environment variables by replacing dots (`.`) with underscores (`_`) and uppercasing the key. For example, `some.prefix.tls.key.path` becomes `export SOME_PREFIX_TLS_KEY_PATH`. If all keys are left undefined, TLS will be disabled. + # + tls: + ## Private Key (PEM) ## + # + key: + ## path ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_TLS_KEY_PATH= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_TLS_KEY_PATH= + # + path: path/to/file.pem + + ## base64 ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_TLS_KEY_BASE64= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_TLS_KEY_BASE64= + # + base64: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlEWlRDQ0FrMmdBd0lCQWdJRVY1eE90REFOQmdr... + + ## TLS Certificate (PEM) ## + # + cert: + ## path ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_TLS_CERT_PATH= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_TLS_CERT_PATH= + # + path: path/to/file.pem + + ## base64 ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_TLS_CERT_BASE64= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_TLS_CERT_BASE64= + # + base64: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlEWlRDQ0FrMmdBd0lCQWdJRVY1eE90REFOQmdr... + +## Access Rules ## +# +# Configure access rules. All sub-keys support configuration reloading without restarting. +# +access_rules: + ## Repositories ## + # + # Locations (list of URLs) where access rules should be fetched from on boot. It is expected that the documents at those locations return a JSON or YAML Array containing ORY Oathkeeper Access Rules: + # + # - If the URL Scheme is `file://`, the access rules (an array of access rules is expected) will be fetched from the local file system. + # - If the URL Scheme is `inline://`, the access rules (an array of access rules is expected) are expected to be a base64 encoded (with padding!) JSON/YAML string (base64_encode(`[{"id":"foo-rule","authenticators":[....]}]`)). + # - If the URL Scheme is `http://` or `https://`, the access rules (an array of access rules is expected) will be fetched from the provided HTTP(s) location. + # + # Examples: + # - - file://path/to/rules.json + # - inline://W3siaWQiOiJmb28tcnVsZSIsImF1dGhlbnRpY2F0b3JzIjpbXX1d + # - https://path-to-my-rules/rules.json + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ACCESS_RULES_REPOSITORIES= + # - Windows Command Line (CMD): + # > set ACCESS_RULES_REPOSITORIES= + # + repositories: + - file://path/to/rules.json + - inline://W3siaWQiOiJmb28tcnVsZSIsImF1dGhlbnRpY2F0b3JzIjpbXX1d + - https://path-to-my-rules/rules.json + + ## Matching strategy ## + # + # This an optional field describing matching strategy. Currently supported values are 'glob' and 'regexp'. + # + # Default value: regexp + # + # Examples: + # - glob + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ACCESS_RULES_MATCHING_STRATEGY= + # - Windows Command Line (CMD): + # > set ACCESS_RULES_MATCHING_STRATEGY= + # + matching_strategy: glob + +## Authenticators ## +# +# For more information on authenticators head over to: https://www.ory.sh/docs/oathkeeper/pipeline/authn +# +authenticators: + ## Anonymous ## + # + # The [`anonymous` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#anonymous). + # + anonymous: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_ANONYMOUS_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_ANONYMOUS_ENABLED= + # + enabled: false + + ## Anonymous Authenticator Configuration ## + # + # This section is optional when the authenticator is disabled. + # + config: + ## Anonymous Subject ## + # + # Sets the anonymous username. + # + # Default value: anonymous + # + # Examples: + # - guest + # - anon + # - unknown + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_ANONYMOUS_CONFIG_SUBJECT= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_ANONYMOUS_CONFIG_SUBJECT= + # + subject: guest + + ## No Operation (noop) ## + # + # The [`noop` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#noop). + # + noop: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_NOOP_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_NOOP_ENABLED= + # + enabled: true + + ## Unauthorized ## + # + # The [`unauthorized` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#unauthorized). + # + unauthorized: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_UNAUTHORIZED_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_UNAUTHORIZED_ENABLED= + # + enabled: false + + ## Cookie Session ## + # + # The [`cookie_session` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#cookie_session). + # + cookie_session: + ## config ## + # + config: + ## check_session_url ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_COOKIE_SESSION_CONFIG_CHECK_SESSION_URL= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_COOKIE_SESSION_CONFIG_CHECK_SESSION_URL= + # + check_session_url: https://session-store-host + + ## only ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_COOKIE_SESSION_CONFIG_ONLY= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_COOKIE_SESSION_CONFIG_ONLY= + # + only: + - non fugiat do + - in nisi e + - Ut amet proident dolor + + ## preserve_path ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_COOKIE_SESSION_CONFIG_PRESERVE_PATH= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_COOKIE_SESSION_CONFIG_PRESERVE_PATH= + # + preserve_path: false + + ## extra_from ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_COOKIE_SESSION_CONFIG_EXTRA_FROM= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_COOKIE_SESSION_CONFIG_EXTRA_FROM= + # + extra_from: sit + + ## subject_from ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_COOKIE_SESSION_CONFIG_SUBJECT_FROM= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_COOKIE_SESSION_CONFIG_SUBJECT_FROM= + # + subject_from: incididunt ea Duis + + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_COOKIE_SESSION_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_COOKIE_SESSION_ENABLED= + # + enabled: false + + ## JSON Web Token (jwt) ## + # + # The [`jwt` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#jwt). + # + jwt: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_JWT_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_JWT_ENABLED= + # + enabled: true + + ## OAuth 2.0 Client Credentials ## + # + # The [`oauth2_client_credentials` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#oauth2_client_credentials). + # + oauth2_client_credentials: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_CLIENT_CREDENTIALS_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_CLIENT_CREDENTIALS_ENABLED= + # + enabled: false + + ## OAuth 2.0 Token Introspection ## + # + # The [`oauth2_introspection` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#oauth2_introspection). + # + oauth2_introspection: + ## config ## + # + config: + ## introspection_url ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_INTROSPECTION_URL= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_INTROSPECTION_URL= + # + introspection_url: https://my-website.com/oauth2/introspection + + ## scope_strategy ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_SCOPE_STRATEGY= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_SCOPE_STRATEGY= + # + scope_strategy: wildcard + + ## pre_authorization ## + # + pre_authorization: + ## enabled ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_PRE_AUTHORIZATION_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_PRE_AUTHORIZATION_ENABLED= + # + enabled: false + + ## scope ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_PRE_AUTHORIZATION_SCOPE= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_PRE_AUTHORIZATION_SCOPE= + # + scope: + - foo + - bar + + ## required_scope ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_REQUIRED_SCOPE= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_REQUIRED_SCOPE= + # + required_scope: + - pariatur nulla + - laborum irure nulla + + ## target_audience ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_TARGET_AUDIENCE= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_TARGET_AUDIENCE= + # + target_audience: + - Duis in esse + - sint do + - enim ullamco + - Lorem + - occaecat nulla aliqua + + ## trusted_issuers ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_TRUSTED_ISSUERS= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_TRUSTED_ISSUERS= + # + trusted_issuers: + - et dolor fugiat + - anim cupidatat in + - esse deserunt + + ## introspection_request_headers ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_INTROSPECTION_REQUEST_HEADERS= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_INTROSPECTION_REQUEST_HEADERS= + # + introspection_request_headers: {} + + ## token_from ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_TOKEN_FROM= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_TOKEN_FROM= + # + token_from: null + + ## retry ## + # + retry: + ## give_up_after ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_RETRY_GIVE_UP_AFTER= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_RETRY_GIVE_UP_AFTER= + # + give_up_after: 529306s + + ## max_delay ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_RETRY_MAX_DELAY= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_RETRY_MAX_DELAY= + # + max_delay: 020ns + + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_ENABLED= + # + enabled: true + +## Error Handling ## +# +errors: + ## Error Handling Fallback ## + # + # This array defines how to handle errors when no "when" clause matches. If you have, for example, enabled redirect and json in your access rule, you could tell ORY Oathkeeper to try sending JSON if the request does not match the access rule definition + # + # Default value: json + # + # Examples: + # - - redirect + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ERRORS_FALLBACK= + # - Windows Command Line (CMD): + # > set ERRORS_FALLBACK= + # + fallback: + - redirect + + ## Individual Error Handler Configuration ## + # + handlers: + ## HTTP WWW-Authenticate Handler ## + # + # Responds with the WWW-Authenticate HTTP Response + # + www_authenticate: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ERRORS_HANDLERS_WWW_AUTHENTICATE_ENABLED= + # - Windows Command Line (CMD): + # > set ERRORS_HANDLERS_WWW_AUTHENTICATE_ENABLED= + # + enabled: false + + ## HTTP Redirect Error Handler ## + # + # Responds with a 301/302 HTTP redirect. + # + redirect: + ## config ## + # + config: + ## to ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ERRORS_HANDLERS_REDIRECT_CONFIG_TO= + # - Windows Command Line (CMD): + # > set ERRORS_HANDLERS_REDIRECT_CONFIG_TO= + # + to: http://fwzadCskXPkbVth.hkzhh-byENz9xmsHzFQRa3USp1rMw.sNFUME4yuXsaHMLOvsKMFvd2 + + ## code ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ERRORS_HANDLERS_REDIRECT_CONFIG_CODE= + # - Windows Command Line (CMD): + # > set ERRORS_HANDLERS_REDIRECT_CONFIG_CODE= + # + code: 302 + + ## when ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ERRORS_HANDLERS_REDIRECT_CONFIG_WHEN= + # - Windows Command Line (CMD): + # > set ERRORS_HANDLERS_REDIRECT_CONFIG_WHEN= + # + when: + - error: + - forbidden + - internal_server_error + - forbidden + - not_found + - unauthorized + request: + cidr: + - nisi Excepteur deserunt ad laboris + - veniam quis consequat Excepteur + - ea Excepteur incididunt sit in + - fugiat velit + - Duis ullamco volup + header: + content_type: [] + accept: [] + + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ERRORS_HANDLERS_REDIRECT_ENABLED= + # - Windows Command Line (CMD): + # > set ERRORS_HANDLERS_REDIRECT_ENABLED= + # + enabled: false + + ## JSON Error Handler ## + # + # Responds with a JSON error response + # + # Default value: [object Object] + # + json: + ## Enabled ## + # + # En-/disables this component. + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ERRORS_HANDLERS_JSON_ENABLED= + # - Windows Command Line (CMD): + # > set ERRORS_HANDLERS_JSON_ENABLED= + # + enabled: false + +## Authorizers ## +# +# For more information on authorizers head over to: https://www.ory.sh/docs/oathkeeper/pipeline/authz +# +authorizers: + ## Allow ## + # + # The [`allow` authorizer](https://www.ory.sh/docs/oathkeeper/pipeline/authz#allow). + # + allow: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_ALLOW_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_ALLOW_ENABLED= + # + enabled: true + + ## Deny ## + # + # The [`deny` authorizer](https://www.ory.sh/docs/oathkeeper/pipeline/authz#allow). + # + deny: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_DENY_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_DENY_ENABLED= + # + enabled: true + + ## ORY Keto Access Control Policies Engine ## + # + # The [`keto_engine_acp_ory` authorizer](https://www.ory.sh/docs/oathkeeper/pipeline/authz#keto_engine_acp_ory). + # + keto_engine_acp_ory: + ## config ## + # + config: + ## base_url ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_BASE_URL= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_BASE_URL= + # + base_url: http://my-keto/ + + ## required_action ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_REQUIRED_ACTION= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_REQUIRED_ACTION= + # + required_action: non Excepteur ipsum est dolor + + ## required_resource ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_REQUIRED_RESOURCE= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_REQUIRED_RESOURCE= + # + required_resource: do officia nisi in nostrud + + ## subject ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_SUBJECT= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_SUBJECT= + # + subject: in voluptate et sit + + ## flavor ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_FLAVOR= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_FLAVOR= + # + flavor: aute + + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_KETO_ENGINE_ACP_ORY_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_KETO_ENGINE_ACP_ORY_ENABLED= + # + enabled: false + +## Mutators ## +# +# For more information on mutators head over to: https://www.ory.sh/docs/oathkeeper/pipeline/mutator +# +mutators: + ## No Operation (noop) ## + # + # The [`noop` mutator](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#noop). + # + noop: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_NOOP_ENABLED= + # - Windows Command Line (CMD): + # > set MUTATORS_NOOP_ENABLED= + # + enabled: false + + ## HTTP Cookie ## + # + # The [`cookie` mutator](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#cookie). + # + cookie: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_COOKIE_ENABLED= + # - Windows Command Line (CMD): + # > set MUTATORS_COOKIE_ENABLED= + # + enabled: true + + ## HTTP Header ## + # + # The [`header` mutator](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#header). + # + header: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_HEADER_ENABLED= + # - Windows Command Line (CMD): + # > set MUTATORS_HEADER_ENABLED= + # + enabled: false + + ## Hydrator ## + # + # The [`hydrator` mutator](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#hydrator). + # + hydrator: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_HYDRATOR_ENABLED= + # - Windows Command Line (CMD): + # > set MUTATORS_HYDRATOR_ENABLED= + # + enabled: true + + ## ID Token (JSON Web Token) ## + # + # The [`id_token` mutator](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#id_token). + # + id_token: + ## config ## + # + config: + ## jwks_url ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_ID_TOKEN_CONFIG_JWKS_URL= + # - Windows Command Line (CMD): + # > set MUTATORS_ID_TOKEN_CONFIG_JWKS_URL= + # + jwks_url: file://../from/this/relative/location.json + + ## issuer_url ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_ID_TOKEN_CONFIG_ISSUER_URL= + # - Windows Command Line (CMD): + # > set MUTATORS_ID_TOKEN_CONFIG_ISSUER_URL= + # + issuer_url: tempor + + ## claims ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_ID_TOKEN_CONFIG_CLAIMS= + # - Windows Command Line (CMD): + # > set MUTATORS_ID_TOKEN_CONFIG_CLAIMS= + # + claims: anim ut + + ## ttl ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_ID_TOKEN_CONFIG_TTL= + # - Windows Command Line (CMD): + # > set MUTATORS_ID_TOKEN_CONFIG_TTL= + # + ttl: 30s + + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_ID_TOKEN_ENABLED= + # - Windows Command Line (CMD): + # > set MUTATORS_ID_TOKEN_ENABLED= + # + enabled: true + +## Log ## +# +# Configure logging using the following options. Logging will always be sent to stdout and stderr. +# +log: + ## Level ## + # + # Debug enables stack traces on errors. Can also be set using environment variable LOG_LEVEL. + # + # Default value: info + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export LOG_LEVEL= + # - Windows Command Line (CMD): + # > set LOG_LEVEL= + # + level: info + + ## Format ## + # + # The log format can either be text or JSON. + # + # Default value: text + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export LOG_FORMAT= + # - Windows Command Line (CMD): + # > set LOG_FORMAT= + # + format: text + +## Profiling ## +# +# Enables CPU or memory profiling if set. For more details on profiling Go programs read [Profiling Go Programs](https://blog.golang.org/profiling-go-programs). +# +# Set this value using environment variables on +# - Linux/macOS: +# $ export PROFILING= +# - Windows Command Line (CMD): +# > set PROFILING= +# +profiling: cpu +``` diff --git a/docs/docs/sdk/index.md b/docs/docs/sdk/index.md new file mode 100644 index 0000000000..a75ab014e8 --- /dev/null +++ b/docs/docs/sdk/index.md @@ -0,0 +1,30 @@ +--- +id: index +title: Overview +--- + +All SDKs use automated code generation provided by +[`openapi-generator`](https://github.com/OpenAPITools/openapi-generator). +Unfortunately, `openapi-generator` has serious breaking changes in the generated +code when upgrading versions. Therefore, we do not make backwards compatibility +promises with regards to the generated SDKs. We hope to improve this process in +the future. + +Before you check out the SDKs, head over to the +[REST API](oathkeeper/sdk/api.md) documentation which includes code samples for +common programming languages for each REST endpoint. + +We publish our SDKs for popular languages in their respective package +repositories: + +- [Python](https://pypi.org/project/ory-oathkeeper-client/) +- [PHP](https://packagist.org/packages/ory/oathkeeper-client) +- [Go](https://github.com/ory/oathkeeper-client-go) +- [NodeJS](https://www.npmjs.com/package/@oryd/oathkeeper-client) (with + TypeScript) +- [Java](https://search.maven.org/artifact/sh.ory.oathkeeper/oathkeeper-client) +- [Ruby](https://rubygems.org/gems/ory-oathkeeper-client) + +Missing your programming language? +[Create an issue](https://github.com/ory/oathkeeper/issues) and help us build, +test and publish the SDK for your programming language! diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js new file mode 100644 index 0000000000..e30d6de173 --- /dev/null +++ b/docs/docusaurus.config.js @@ -0,0 +1,130 @@ +const config = require('./contrib/config.js') +const fs = require('fs') + +let versions = [ + 'next' +] + +const links = [ + { + to: 'index', + activeBasePath: `${config.projectSlug}/docs`, + label: `Docs`, + position: 'left', + }, + { + href: 'https://www.ory.sh/docs', + label: 'Ecosystem', + position: 'left', + }, + { + href: 'https://www.ory.sh/blog', label: 'Blog', + position: 'left', + }, + { + href: 'https://community.ory.sh', label: 'Forum', + position: 'left', + }, + { + href: 'https://www.ory.sh/chat', label: 'Chat', + position: 'left', + }, + { + href: `https://github.com/ory/${config.projectSlug}`, + label: 'GitHub', + position: 'left', + }, +] + +if (fs.existsSync('./versions.json')) { + const version = require('./versions.json'); + if (version && version.length > 0) { + links.push({ + label: version[0], + position: 'right', + to: 'versions' + }); + } +} + +module.exports = { + title: config.projectName, + tagline: config.projectTagLine, + url: `https://www.ory.sh/`, + baseUrl: `/${config.projectSlug}/docs/`, + favicon: 'img/favico.png', + organizationName: 'ory', // Usually your GitHub org/user name. + projectName: config.projectSlug, // Usually your repo name. + themeConfig: { + googleAnalytics: { + trackingID: 'UA-71865250-1', + anonymizeIP: true, + }, + algolia: { + apiKey: '8463c6ece843b377565726bb4ed325b0', + indexName: 'ory', + // algoliaOptions: { + // facetFilters: ['language:LANGUAGE', 'version:VERSION'], + // }, + }, + navbar: { + logo: { + alt: config.projectName, + src: `img/logo-${config.projectSlug}.svg`, + }, + links: links + }, + footer: { + style: 'dark', + copyright: `Copyright ยฉ ${new Date().getFullYear()} ORY GmbH`, + links: [ + { + title: 'Company', + items: [ + { + label: 'Imprint', + href: 'https://www.ory.sh/imprint', + }, + { + label: 'Privacy', + href: 'https://www.ory.sh/privacy', + }, + { + label: 'Terms', + href: 'https://www.ory.sh/tos', + }, + ], + }, + ], + }, + }, + plugins: [ + [ + "@docusaurus/plugin-content-docs", + { + path: config.projectSlug === 'docusaurus-template' ? 'contrib/docs' : 'docs', + sidebarPath: require.resolve('./contrib/sidebar.js'), + editUrl: + `https://github.com/docs/${config.projectSlug}/edit/master/docs`, + routeBasePath: '', + showLastUpdateAuthor: true, + showLastUpdateTime: true, + }, + ], + [ + "@docusaurus/plugin-content-pages", + ], + ["@docusaurus/plugin-google-analytics"], + ["@docusaurus/plugin-sitemap"] + ], + themes: [ + [ + "@docusaurus/theme-classic", + { + customCss: config.projectSlug === 'docusaurus-template' ? require.resolve('./contrib/theme.css') : require.resolve('./src/css/theme.css'), + } + ], [ + "@docusaurus/theme-search-algolia" + ] + ], +}; diff --git a/docs/images/sec-console.png b/docs/images/sec-console.png deleted file mode 100644 index de6d455de9..0000000000 Binary files a/docs/images/sec-console.png and /dev/null differ diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 0000000000..0aacbbef23 --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,13649 @@ +{ + "name": "keto", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@apidevtools/json-schema-ref-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-8.0.0.tgz", + "integrity": "sha512-n4YBtwQhdpLto1BaUCyAeflizmIbaloGShsPyRtFf5qdFJxfssj+GgLavczgKJFa3Bq+3St2CKcpRJdjtB4EBw==", + "dev": true, + "requires": { + "@jsdevtools/ono": "^7.1.0", + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1" + } + }, + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/compat-data": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz", + "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==", + "requires": { + "browserslist": "^4.9.1", + "invariant": "^2.2.4", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/core": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/generator": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", + "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", + "requires": { + "@babel/types": "^7.9.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz", + "integrity": "sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/types": "^7.9.0" + } + }, + "@babel/helper-builder-react-jsx-experimental": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz", + "integrity": "sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-module-imports": "^7.8.3", + "@babel/types": "^7.9.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz", + "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==", + "requires": { + "@babel/compat-data": "^7.8.6", + "browserslist": "^4.9.1", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz", + "integrity": "sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg==", + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-split-export-declaration": "^7.8.3" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", + "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-regex": "^7.8.3", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", + "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "requires": { + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" + }, + "@babel/helper-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", + "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==" + }, + "@babel/helper-wrap-function": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", + "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helpers": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", + "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz", + "integrity": "sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", + "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz", + "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.8", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", + "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", + "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", + "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz", + "integrity": "sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-split-export-declaration": "^7.8.3", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz", + "integrity": "sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", + "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz", + "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==", + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz", + "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==", + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz", + "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==", + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz", + "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==", + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", + "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz", + "integrity": "sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==", + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", + "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz", + "integrity": "sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw==", + "requires": { + "@babel/helper-builder-react-jsx": "^7.9.0", + "@babel/helper-builder-react-jsx-experimental": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz", + "integrity": "sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw==", + "requires": { + "@babel/helper-builder-react-jsx-experimental": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz", + "integrity": "sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz", + "integrity": "sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", + "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz", + "integrity": "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==", + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", + "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz", + "integrity": "sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-typescript": "^7.8.3" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/preset-env": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", + "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", + "requires": { + "@babel/compat-data": "^7.9.0", + "@babel/helper-compilation-targets": "^7.8.7", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-numeric-separator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.9.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.9.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.9.0", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.9.0", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.9.0", + "@babel/plugin-transform-modules-commonjs": "^7.9.0", + "@babel/plugin-transform-modules-systemjs": "^7.9.0", + "@babel/plugin-transform-modules-umd": "^7.9.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.7", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.7", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.9.0", + "browserslist": "^4.9.1", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.9.4.tgz", + "integrity": "sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-transform-react-display-name": "^7.8.3", + "@babel/plugin-transform-react-jsx": "^7.9.4", + "@babel/plugin-transform-react-jsx-development": "^7.9.0", + "@babel/plugin-transform-react-jsx-self": "^7.9.0", + "@babel/plugin-transform-react-jsx-source": "^7.9.0" + } + }, + "@babel/preset-typescript": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz", + "integrity": "sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-transform-typescript": "^7.9.0" + } + }, + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" + }, + "@docusaurus/core": { + "version": "2.0.0-alpha.50", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-alpha.50.tgz", + "integrity": "sha512-lNvft+di325Ww3/S/kgbJmDmZF6OgJc3gM5zE8Lcl2Hqa6gZ6INIsGhnGxIX5Of1apliWGRVSojEF+mxf0BE1g==", + "requires": { + "@babel/core": "^7.9.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.9.0", + "@babel/preset-env": "^7.9.0", + "@babel/preset-react": "^7.9.4", + "@babel/preset-typescript": "^7.9.0", + "@babel/runtime": "^7.9.2", + "@docusaurus/utils": "^2.0.0-alpha.50", + "@endiliey/static-site-generator-webpack-plugin": "^4.0.0", + "babel-loader": "^8.1.0", + "babel-plugin-dynamic-import-node": "^2.3.0", + "cache-loader": "^4.1.0", + "chalk": "^3.0.0", + "chokidar": "^3.3.0", + "classnames": "^2.2.6", + "commander": "^4.0.1", + "copy-webpack-plugin": "^5.0.5", + "core-js": "^2.6.5", + "css-loader": "^3.4.2", + "del": "^5.1.0", + "ejs": "^3.0.2", + "express": "^4.17.1", + "fs-extra": "^8.1.0", + "globby": "^10.0.1", + "html-minifier-terser": "^5.0.5", + "html-tags": "^3.1.0", + "html-webpack-plugin": "^4.0.4", + "import-fresh": "^3.2.1", + "lodash": "^4.17.15", + "mini-css-extract-plugin": "^0.8.0", + "nprogress": "^0.2.0", + "null-loader": "^3.0.0", + "optimize-css-assets-webpack-plugin": "^5.0.3", + "portfinder": "^1.0.25", + "postcss-loader": "^3.0.0", + "postcss-preset-env": "^6.7.0", + "react-dev-utils": "^10.2.1", + "react-helmet": "^6.0.0-beta", + "react-loadable": "^5.5.0", + "react-loadable-ssr-addon": "^0.2.0", + "react-router": "^5.1.2", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.1.2", + "semver": "^6.3.0", + "shelljs": "^0.8.3", + "std-env": "^2.2.1", + "terser-webpack-plugin": "^2.3.5", + "wait-file": "^1.0.5", + "webpack": "^4.41.2", + "webpack-bundle-analyzer": "^3.6.1", + "webpack-dev-server": "^3.10.3", + "webpack-merge": "^4.2.2", + "webpackbar": "^4.0.0" + } + }, + "@docusaurus/mdx-loader": { + "version": "2.0.0-alpha.50", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-alpha.50.tgz", + "integrity": "sha512-S4e+zR0yWnMQQCcmQzWZi3Bl74FeF1E3qzyE4laQHXD1+napUo0j6eY8gFSI8h4mY2AaMQ3smCxqmqUU5IvtpQ==", + "requires": { + "@babel/parser": "^7.9.4", + "@babel/traverse": "^7.9.0", + "@mdx-js/mdx": "^1.5.8", + "@mdx-js/react": "^1.5.8", + "escape-html": "^1.0.3", + "fs-extra": "^8.1.0", + "github-slugger": "^1.3.0", + "gray-matter": "^4.0.2", + "loader-utils": "^1.2.3", + "mdast-util-to-string": "^1.1.0", + "remark-emoji": "^2.1.0", + "stringify-object": "^3.3.0", + "unist-util-visit": "^2.0.2" + } + }, + "@docusaurus/plugin-content-blog": { + "version": "2.0.0-alpha.50", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-alpha.50.tgz", + "integrity": "sha512-dHlahBYhCt0Orfj1bnrNAViUzylCV0oLpZlFAiJnv3vYSYpJsNtz6MFrhd3k/1agO6VRsUzMOkS7huFrZcIamw==", + "requires": { + "@docusaurus/mdx-loader": "^2.0.0-alpha.50", + "@docusaurus/utils": "^2.0.0-alpha.50", + "feed": "^4.1.0", + "fs-extra": "^8.1.0", + "globby": "^10.0.1", + "loader-utils": "^1.2.3", + "lodash.kebabcase": "^4.1.1" + } + }, + "@docusaurus/plugin-content-docs": { + "version": "2.0.0-alpha.50", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-alpha.50.tgz", + "integrity": "sha512-jBOq9kqntE+7RSZ4urivohFTEpb37pYVyRETtNFm+ArisBCclEOnxQetk3n36kNDijBKDnGxAVWPJF+zaEAe4Q==", + "requires": { + "@docusaurus/mdx-loader": "^2.0.0-alpha.50", + "@docusaurus/utils": "^2.0.0-alpha.50", + "execa": "^3.4.0", + "fs-extra": "^8.1.0", + "globby": "^10.0.1", + "import-fresh": "^3.2.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "shelljs": "^0.8.3" + }, + "dependencies": { + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" + } + } + }, + "@docusaurus/plugin-content-pages": { + "version": "2.0.0-alpha.50", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-alpha.50.tgz", + "integrity": "sha512-fSoQTcJdCh1EFGVvAvNMPaU6eilXM2pRaOgP9GthBktB8iasVxnUM5bpCuFjHXqvEZux1ho8XqrvQgTh06jPsA==", + "requires": { + "@docusaurus/types": "^2.0.0-alpha.50", + "@docusaurus/utils": "^2.0.0-alpha.50", + "globby": "^10.0.1" + } + }, + "@docusaurus/plugin-google-analytics": { + "version": "2.0.0-alpha.50", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-alpha.50.tgz", + "integrity": "sha512-99tw5yGRhrMfeTFny4dkjLdgeTrE/jbTQGUNHKaTiKQxm+APhiwDoKlptUrkMy4lxwPc3IW1cEcgF8j0oao1EQ==" + }, + "@docusaurus/plugin-google-gtag": { + "version": "2.0.0-alpha.50", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-alpha.50.tgz", + "integrity": "sha512-fdW6ycdnLbWah31vx1e8/n4oopwmo5H89zzC9xVsJB0snBPQnMNbuZ82ob9TXYN57JcnK5bZeVPR/RYiAh0CWQ==" + }, + "@docusaurus/plugin-sitemap": { + "version": "2.0.0-alpha.50", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-alpha.50.tgz", + "integrity": "sha512-aGTeDohtjPc/nnwG4QxMem/xmbqi345Cdvkij3HZi2/kfEb0e6VxZ/YXa6Vvdb7f4ezav2N5bY7uqQojGDz8vg==", + "requires": { + "@docusaurus/types": "^2.0.0-alpha.50", + "sitemap": "^3.2.2" + } + }, + "@docusaurus/preset-classic": { + "version": "2.0.0-alpha.50", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-alpha.50.tgz", + "integrity": "sha512-SrVE95VNOY/X5Cc7ZL175TiCNjW50PEVoGVp/Y86/RAQEq7Wm5Bi32jFAcsjndbTOqKaEhRikSkqEQipbrF8GA==", + "requires": { + "@docusaurus/plugin-content-blog": "^2.0.0-alpha.50", + "@docusaurus/plugin-content-docs": "^2.0.0-alpha.50", + "@docusaurus/plugin-content-pages": "^2.0.0-alpha.50", + "@docusaurus/plugin-google-analytics": "^2.0.0-alpha.50", + "@docusaurus/plugin-google-gtag": "^2.0.0-alpha.50", + "@docusaurus/plugin-sitemap": "^2.0.0-alpha.50", + "@docusaurus/theme-classic": "^2.0.0-alpha.50", + "@docusaurus/theme-search-algolia": "^2.0.0-alpha.50", + "remark-admonitions": "^1.2.1" + } + }, + "@docusaurus/theme-classic": { + "version": "2.0.0-alpha.50", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-alpha.50.tgz", + "integrity": "sha512-tcMnUsdHi3jKg7DLqohftYnwDGa8Tyrtrx0zcMDXOUcYF9NCdoz3DT/39c5Fo5tDIvvGAKVkuSBJX8O/UnzDIQ==", + "requires": { + "@mdx-js/mdx": "^1.5.8", + "@mdx-js/react": "^1.5.8", + "classnames": "^2.2.6", + "clipboard": "^2.0.6", + "infima": "0.2.0-alpha.6", + "parse-numeric-range": "^0.0.2", + "prism-react-renderer": "^1.0.2", + "prismjs": "^1.19.0", + "react-router-dom": "^5.1.2", + "react-toggle": "^4.1.1" + } + }, + "@docusaurus/theme-search-algolia": { + "version": "2.0.0-alpha.50", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-alpha.50.tgz", + "integrity": "sha512-ixceplsidNabn0L15XYaOHzf+DCPM0+0sESW7xXK2X/K/IQaP1Mrcrs/MPovjCqylt/0UuHro1CUJimQi/x8yw==", + "requires": { + "classnames": "^2.2.6", + "docsearch.js": "^2.6.3" + } + }, + "@docusaurus/types": { + "version": "2.0.0-alpha.50", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-alpha.50.tgz", + "integrity": "sha512-wrbBGRfTF/Obt4oaCBoVY2yKaU6jEJlqdAqSj346vBUTxKyHNVDp2EgFrjZ+nesmWlHfP6ELfIvjc/cgRwliLQ==", + "requires": { + "@types/webpack": "^4.41.0", + "commander": "^4.0.1", + "querystring": "0.2.0" + } + }, + "@docusaurus/utils": { + "version": "2.0.0-alpha.50", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-alpha.50.tgz", + "integrity": "sha512-1mQgmlF7/kB4Ud1EpUcS5C9fafI2TpjChIUEvT6Qgi5m1XOxiOTiV8x0JY/SCewR3aSmiR5nP/+hiiv57CxIFA==", + "requires": { + "escape-string-regexp": "^2.0.0", + "fs-extra": "^8.1.0", + "gray-matter": "^4.0.2", + "lodash": "^4.17.15" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } + }, + "@endiliey/static-site-generator-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@endiliey/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-3MBqYCs30qk1OBRC697NqhGouYbs71D1B8hrk/AFJC6GwF2QaJOQZtA1JYAaGSe650sZ8r5ppRTtCRXepDWlng==", + "requires": { + "bluebird": "^3.7.1", + "cheerio": "^0.22.0", + "eval": "^0.1.4", + "url": "^0.11.0", + "webpack-sources": "^1.4.3" + } + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@jsdevtools/ono": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.1.tgz", + "integrity": "sha512-pu5fxkbLQWzRbBgfFbZfHXz0KlYojOfVdUhcNfy9lef8ZhBt0pckGr8g7zv4vPX4Out5vBNvqd/az4UaVWzZ9A==", + "dev": true + }, + "@mdx-js/mdx": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.5.8.tgz", + "integrity": "sha512-OzanPTN0p9GZOEVeEuEa8QsjxxGyfFOOnI/+V1oC1su9UIN4KUg1k4n/hWTZC+VZhdW1Lfj6+Ho8nIs6L+pbDA==", + "requires": { + "@babel/core": "7.8.4", + "@babel/plugin-syntax-jsx": "7.8.3", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "^1.5.8", + "babel-plugin-apply-mdx-type-prop": "^1.5.8", + "babel-plugin-extract-import-names": "^1.5.8", + "camelcase-css": "2.0.1", + "detab": "2.0.3", + "hast-util-raw": "5.0.2", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "7.0.0", + "remark-mdx": "^1.5.8", + "remark-parse": "7.0.2", + "remark-squeeze-paragraphs": "3.0.4", + "style-to-object": "0.3.0", + "unified": "8.4.2", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.2" + }, + "dependencies": { + "@babel/core": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", + "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helpers": "^7.8.4", + "@babel/parser": "^7.8.4", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@mdx-js/react": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.5.8.tgz", + "integrity": "sha512-L3rehITVxqDHOPJFGBSHKt3Mv/p3MENYlGIwLNYU89/iVqTLMD/vz8hL9RQtKqRoMbKuWpzzLlKIObqJzthNYg==" + }, + "@mdx-js/util": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.5.8.tgz", + "integrity": "sha512-a7Gjjw8bfBSertA/pTWBA/9WKEhgaSxvQE2NTSUzaknrzGFOhs4alZSHh3RHmSFdSWv5pUuzAgsWseMLhWEVkQ==" + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==" + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==" + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/html-minifier-terser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.0.0.tgz", + "integrity": "sha512-q95SP4FdkmF0CwO0F2q0H6ZgudsApaY/yCtAQNRn1gduef5fGpyEphzy0YCq/N0UFvDSnLg5V8jFK/YGXlDiCw==" + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + }, + "@types/node": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.0.tgz", + "integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==" + }, + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, + "@types/tapable": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.5.tgz", + "integrity": "sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ==" + }, + "@types/uglify-js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.5.tgz", + "integrity": "sha512-L7EbSkhSaWBpkl+PZAEAqZTqtTeIsq7s/oX/q0LNnxxJoRVKQE0T81XDVyaxjiiKQwiV2vhVeYRqxdRNqGOGJw==", + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@types/unist": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", + "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" + }, + "@types/webpack": { + "version": "4.41.10", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.10.tgz", + "integrity": "sha512-vIy0qaq8AjOjZLuFPqpo7nAJzcoVXMdw3mvpNN07Uvdy0p1IpJeLNBe3obdRP7FX2jIusDE7z1pZa0A6qYUgnA==", + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@types/webpack-sources": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.7.tgz", + "integrity": "sha512-XyaHrJILjK1VHVC4aVlKsdNN5KBTwufMb43cQs+flGxtPAf/1Qwl8+Q0tp5BwEGaI8D6XT1L+9bSWXckgkjTLw==", + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + }, + "acorn-walk": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==" + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "agentkeepalive": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-2.2.0.tgz", + "integrity": "sha1-xdG9SxKQCPEWPyNvhuX66iAm4u8=" + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "algoliasearch": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-3.35.1.tgz", + "integrity": "sha512-K4yKVhaHkXfJ/xcUnil04xiSrB8B8yHZoFEhWNpXg23eiCnqvTZw1tn/SqvdsANlYHLJlKl0qi3I/Q2Sqo7LwQ==", + "requires": { + "agentkeepalive": "^2.2.0", + "debug": "^2.6.9", + "envify": "^4.0.0", + "es6-promise": "^4.1.0", + "events": "^1.1.0", + "foreach": "^2.0.5", + "global": "^4.3.2", + "inherits": "^2.0.1", + "isarray": "^2.0.1", + "load-script": "^1.0.0", + "object-keys": "^1.0.11", + "querystring-es3": "^0.2.1", + "reduce": "^1.0.1", + "semver": "^5.1.0", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autocomplete.js": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/autocomplete.js/-/autocomplete.js-0.36.0.tgz", + "integrity": "sha512-jEwUXnVMeCHHutUt10i/8ZiRaCb0Wo+ZyKxeGsYwBDtw6EJHqEeDrq4UwZRD8YBSvp3g6klP678il2eeiVXN2Q==", + "requires": { + "immediate": "^3.2.3" + } + }, + "autoprefixer": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.5.tgz", + "integrity": "sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg==", + "requires": { + "browserslist": "^4.11.0", + "caniuse-lite": "^1.0.30001036", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.27", + "postcss-value-parser": "^4.0.3" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + } + }, + "babel-plugin-apply-mdx-type-prop": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.5.8.tgz", + "integrity": "sha512-xYp5F9mAnZdDRFSd1vF3XQ0GQUbIulCpnuht2jCmK30GAHL8szVL7TgzwhEGamQ6yJmP/gEyYNM9OR5D2n26eA==", + "requires": { + "@babel/helper-plugin-utils": "7.8.3", + "@mdx-js/util": "^1.5.8" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-extract-import-names": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.5.8.tgz", + "integrity": "sha512-LcLfP8ZRBZMdMAXHLugyvvd5PY0gMmLMWFogWAUsG32X6TYW2Eavx+il2bw73KDbW+UdCC1bAJ3NuU25T1MI3g==", + "requires": { + "@babel/helper-plugin-utils": "7.8.3" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "requires": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz", + "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==", + "requires": { + "caniuse-lite": "^1.0.30001038", + "electron-to-chromium": "^1.3.390", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "requires": { + "semver": "^6.0.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", + "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "requires": { + "pascal-case": "^3.1.1", + "tslib": "^1.10.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001039", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz", + "integrity": "sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "ccount": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", + "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==" + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==" + }, + "cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + } + }, + "chokidar": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.3.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "clipboard": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz", + "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==", + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + }, + "consola": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.11.3.tgz", + "integrity": "sha512-aoW0YIIAmeftGR8GSpw6CGQluNdkWMWh3yEFjH/hmynTYnMtibXszii3lxCXmk8YxJtI3FAK5aTiquA5VH68Gw==" + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "core-js-compat": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", + "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", + "requires": { + "browserslist": "^4.8.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "requires": { + "postcss": "^7.0.5" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "css-loader": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", + "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.23", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.1", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" + } + }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "requires": { + "postcss": "^7.0.5" + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + }, + "csso": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "requires": { + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "requires": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.3.tgz", + "integrity": "sha512-Up8P0clUVwq0FnFjDclzZsy9PadzRn5FFxrr47tQQvMHqyiFYVbpH8oXDzWtF0Q7pYy3l+RPmtBl+BsFF6wH0A==", + "requires": { + "repeat-string": "^1.5.4" + } + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "docsearch.js": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/docsearch.js/-/docsearch.js-2.6.3.tgz", + "integrity": "sha512-GN+MBozuyz664ycpZY0ecdQE0ND/LSgJKhTLA0/v3arIS3S1Rpf2OJz6A35ReMsm91V5apcmzr5/kM84cvUg+A==", + "requires": { + "algoliasearch": "^3.24.5", + "autocomplete.js": "0.36.0", + "hogan.js": "^3.0.2", + "request": "^2.87.0", + "stack-utils": "^1.0.1", + "to-factory": "^1.0.0", + "zepto": "^1.2.0" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", + "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", + "dev": true + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.0.2.tgz", + "integrity": "sha512-IncmUpn1yN84hy2shb0POJ80FWrfGNY0cxO9f4v+/sG7qcBvAtVWUA1IdzY/8EYUmOVhoKJVdJjNd3AZcnxOjA==" + }, + "electron-to-chromium": { + "version": "1.3.396", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.396.tgz", + "integrity": "sha512-ESY3UGekvNQwofHvgdsFW8GQEoudbqtJfoSDovnsCRRx8t0+0dPbE1XD/ZQdB+jbskSyPwUtIVYSyKwSXW/A6Q==" + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "envify": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", + "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==", + "requires": { + "esprima": "^4.0.0", + "through": "~2.3.4" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eval": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.4.tgz", + "integrity": "sha512-npGsebJejyjMRnLdFu+T/97dnigqIU0Ov3IGrZ8ygd1v7RL1vGkEKtvyWZobqUH1AQgKlg0Yqqe2BtMA9/QZLw==", + "requires": { + "require-like": ">= 0.1.1" + } + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-glob": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", + "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fastq": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.7.0.tgz", + "integrity": "sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "feed": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.1.0.tgz", + "integrity": "sha512-dAXWXM8QMxZ1DRnAxDmy1MaWZFlh1Ku7TU3onbXgHrVJynsxkNGPUed1AxszVW8AXo43xExronVkIqK+ACsoBA==", + "requires": { + "xml-js": "^1.6.11" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "filesize": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.0.1.tgz", + "integrity": "sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "follow-redirects": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", + "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "fork-ts-checker-webpack-plugin": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz", + "integrity": "sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ==", + "requires": { + "babel-code-frame": "^6.22.0", + "chalk": "^2.4.1", + "chokidar": "^3.3.0", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "format-util": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.5.tgz", + "integrity": "sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "github-slugger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.3.0.tgz", + "integrity": "sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==", + "requires": { + "emoji-regex": ">=6.0.0 <=6.1.1" + }, + "dependencies": { + "emoji-regex": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", + "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=" + } + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "dependencies": { + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + } + } + }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "requires": { + "delegate": "^3.1.2" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "gray-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.2.tgz", + "integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==", + "requires": { + "js-yaml": "^3.11.0", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + } + }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hast-to-hyperscript": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-7.0.4.tgz", + "integrity": "sha512-vmwriQ2H0RPS9ho4Kkbf3n3lY436QKLq6VaGA1pzBh36hBi3tm1DO9bR+kaJIbpT10UqaANDkMjxvjVfr+cnOA==", + "requires": { + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.2.1", + "unist-util-is": "^3.0.0", + "web-namespaces": "^1.1.2" + }, + "dependencies": { + "style-to-object": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.3.tgz", + "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==", + "requires": { + "inline-style-parser": "0.1.1" + } + } + } + }, + "hast-util-from-parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", + "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", + "requires": { + "ccount": "^1.0.3", + "hastscript": "^5.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.1.2", + "xtend": "^4.0.1" + } + }, + "hast-util-parse-selector": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.4.tgz", + "integrity": "sha512-gW3sxfynIvZApL4L07wryYF4+C9VvH3AUi7LAnVXV4MneGEgwOByXvFo18BgmTWnm7oHAe874jKbIB1YhHSIzA==" + }, + "hast-util-raw": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-5.0.2.tgz", + "integrity": "sha512-3ReYQcIHmzSgMq8UrDZHFL0oGlbuVGdLKs8s/Fe8BfHFAyZDrdv1fy/AGn+Fim8ZuvAHcJ61NQhVMtyfHviT/g==", + "requires": { + "hast-util-from-parse5": "^5.0.0", + "hast-util-to-parse5": "^5.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^5.0.0", + "unist-util-position": "^3.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + } + }, + "hast-util-to-parse5": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-5.1.2.tgz", + "integrity": "sha512-ZgYLJu9lYknMfsBY0rBV4TJn2xiwF1fXFFjbP6EE7S0s5mS8LIKBVWzhA1MeIs1SWW6GnnE4In6c3kPb+CWhog==", + "requires": { + "hast-to-hyperscript": "^7.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + } + }, + "hastscript": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", + "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", + "requires": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hogan.js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", + "integrity": "sha1-TNnhq9QpQUbnZ55B14mHMrAse/0=", + "requires": { + "mkdirp": "0.3.0", + "nopt": "1.0.10" + }, + "dependencies": { + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=" + } + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "html-minifier-terser": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.5.tgz", + "integrity": "sha512-cBSFFghQh/uHcfSiL42KxxIRMF7A144+3E44xdlctIjxEmkEfCvouxNyFH2wysXk1fCGBPwtcr3hDWlGTfkDew==", + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + } + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==" + }, + "html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" + }, + "html-webpack-plugin": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.4.tgz", + "integrity": "sha512-BREQzUbFfIQS39KqxkT2L1Ot0tuu1isako1CaCQLrgEQ43zi2ScHAe3SMTnVBWsStnIsGtl8jprDdxwZkNhrwQ==", + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.15", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=" + }, + "immer": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", + "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "infima": { + "version": "0.2.0-alpha.6", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.6.tgz", + "integrity": "sha512-5Oin586QeBa5VdP8xpPuHB/BDg1D66+B5bFG67XPqKV8mD0hwKt2LJFYqoSJKGPBccxGBQpHEOFUd2sUSdhdGA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "inquirer": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", + "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "requires": { + "is-path-inside": "^2.1.0" + }, + "dependencies": { + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "requires": { + "path-is-inside": "^1.0.2" + } + } + } + }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "requires": { + "has": "^1.0.3" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" + }, + "is-wsl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jest-worker": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", + "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-faker": { + "version": "0.5.0-rcv.24", + "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.0-rcv.24.tgz", + "integrity": "sha512-qwuRwv7dnUdqdwuifb6kJAVUKm0mzi4h/mzvMwDKxyWUzjxFCdVH/g9IfKxvc4M7rvAavr8pcx9uO1PNIIWE0g==", + "dev": true, + "requires": { + "json-schema-ref-parser": "^6.1.0", + "jsonpath-plus": "^2.0.0", + "randexp": "^0.5.3" + }, + "dependencies": { + "json-schema-ref-parser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.1.0.tgz", + "integrity": "sha512-pXe9H1m6IgIpXmE5JSb8epilNTGsmTb2iPohAXpOdhqGFbQjNeHHsZxU+C8w6T81GZxSPFLeUoqDJmzxx5IGuw==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.12.1", + "ono": "^4.0.11" + } + } + } + }, + "json-schema-ref-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-8.0.0.tgz", + "integrity": "sha512-2P4icmNkZLrBr6oa5gSZaDSol/oaBHYkoP/8dsw63E54NnHGRhhiFuy9yFoxPuSm+uHKmeGxAAWMDF16SCHhcQ==", + "dev": true, + "requires": { + "@apidevtools/json-schema-ref-parser": "8.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "json5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonpath-plus": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-2.0.0.tgz", + "integrity": "sha512-ksXaz9+3SIZ5BMxgr7MQueYcR515VRZPuoDhIymUd1JcF6BnVaYJS7k4NJni4EHhvJaOIGGiPqT8+ifsGp6mBw==", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "requires": { + "leven": "^3.1.0" + } + }, + "load-script": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", + "integrity": "sha1-BJGTngvuVkPuSUp+PaPSuscMbKQ=" + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" + }, + "lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" + }, + "lodash.chunk": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", + "integrity": "sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw=" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=" + }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" + }, + "lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "loglevel": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", + "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", + "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "requires": { + "tslib": "^1.10.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdast-squeeze-paragraphs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-3.0.5.tgz", + "integrity": "sha512-xX6Vbe348Y/rukQlG4W3xH+7v4ZlzUbSY4HUIQCuYrF2DrkcHx584mCaFxkWoDZKNUfyLZItHC9VAqX3kIP7XA==", + "requires": { + "unist-util-remove": "^1.0.0" + } + }, + "mdast-util-definitions": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz", + "integrity": "sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==", + "requires": { + "unist-util-visit": "^1.0.0" + }, + "dependencies": { + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + } + } + }, + "mdast-util-to-hast": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-7.0.0.tgz", + "integrity": "sha512-vxnXKSZgvPG2grZM3kxaF052pxsLtq8TPAkiMkqYj1nFTOazYUPXt3LFYIEB6Ws/IX7Uyvljzk64kD6DwZl/wQ==", + "requires": { + "collapse-white-space": "^1.0.0", + "detab": "^2.0.0", + "mdast-util-definitions": "^1.2.0", + "mdurl": "^1.0.1", + "trim-lines": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-to-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", + "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==" + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "^0.1.0" + } + }, + "mini-create-react-context": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", + "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==", + "requires": { + "@babel/runtime": "^7.4.0", + "gud": "^1.0.0", + "tiny-warning": "^1.0.2" + } + }, + "mini-css-extract-plugin": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz", + "integrity": "sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==", + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", + "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "requires": { + "minipass": "^3.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "no-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", + "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "requires": { + "lower-case": "^2.0.1", + "tslib": "^1.10.0" + } + }, + "node-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "requires": { + "lodash.toarray": "^4.4.0" + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==" + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + } + } + }, + "node-releases": { + "version": "1.1.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", + "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==" + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + } + } + }, + "nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "null-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-3.0.0.tgz", + "integrity": "sha512-hf5sNLl8xdRho4UPBOOeoIwT3WhjYcMUQm0zj44EhD6UscMAz72o2udpoDFBgykucdEDGIcd6SXbc/G6zssbzw==", + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + }, + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "ono": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", + "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", + "dev": true, + "requires": { + "format-util": "^1.0.3" + } + }, + "open": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", + "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==" + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + } + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "param-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", + "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", + "requires": { + "dot-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", + "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-numeric-range": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz", + "integrity": "sha1-tPCdQTx6282Yf26SM8e0shDJOOQ=" + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", + "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "requires": { + "no-case": "^3.0.3", + "tslib": "^1.10.0" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + } + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "requires": { + "find-up": "^2.1.0" + } + }, + "portfinder": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + } + }, + "postcss-calc": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", + "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "requires": { + "postcss": "^7.0.14" + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "requires": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-font-variant": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", + "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-initial": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", + "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", + "requires": { + "lodash.template": "^4.5.0", + "postcss": "^7.0.2" + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-not": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", + "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==" + }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "prettier": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.2.tgz", + "integrity": "sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg==", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" + }, + "prism-react-renderer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.0.2.tgz", + "integrity": "sha512-0++pJyRfu4v2OxI/Us/5RLui9ESDkTiLkVCtKuPZYdpB8UQWJpnJQhPrWab053XtsKW3oM0sD69uJ6N9exm1Ag==" + }, + "prismjs": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.20.0.tgz", + "integrity": "sha512-AEDjSrVNkynnw6A+B1DsFkd6AVdTnp+/WoUixFRULlCLZVRZlVQMVWio/16jv7G1FscUxQxOQhWwApgbnxr6kQ==", + "requires": { + "clipboard": "^2.0.0" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "property-information": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.4.0.tgz", + "integrity": "sha512-nmMWAm/3vKFGmmOWOcdLjgq/Hlxa+hsuR/px1Lp/UGEyc5A22A6l78Shc2C0E71sPmAqglni+HrS7L7VJ7AUCA==", + "requires": { + "xtend": "^4.0.0" + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" + }, + "ramda": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.0.tgz", + "integrity": "sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA==", + "dev": true + }, + "randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "dev": true, + "requires": { + "drange": "^1.0.2", + "ret": "^0.2.0" + }, + "dependencies": { + "ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "dev": true + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "react": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-dev-utils": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.1.tgz", + "integrity": "sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ==", + "requires": { + "@babel/code-frame": "7.8.3", + "address": "1.1.2", + "browserslist": "4.10.0", + "chalk": "2.4.2", + "cross-spawn": "7.0.1", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "2.0.0", + "filesize": "6.0.1", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "3.1.1", + "global-modules": "2.0.0", + "globby": "8.0.2", + "gzip-size": "5.1.1", + "immer": "1.10.0", + "inquirer": "7.0.4", + "is-root": "2.1.0", + "loader-utils": "1.2.3", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "react-error-overlay": "^6.0.7", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", + "text-table": "0.2.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browserslist": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.10.0.tgz", + "integrity": "sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==", + "requires": { + "caniuse-lite": "^1.0.30001035", + "electron-to-chromium": "^1.3.378", + "node-releases": "^1.1.52", + "pkg-up": "^3.1.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "dependencies": { + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "requires": { + "array-union": "^1.0.1", + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "react-dom": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", + "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + } + }, + "react-error-overlay": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz", + "integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==" + }, + "react-fast-compare": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", + "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" + }, + "react-helmet": { + "version": "6.0.0-beta.2", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.0.0-beta.2.tgz", + "integrity": "sha512-rRAeil8HsddijqG2+1jeR5qY9wGQvK1zPMf+8MkiTCyhpEP/2qhAAPolEsveeAlz0xSv5C5xYypHtgCtFn0euw==", + "requires": { + "object-assign": "^4.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^2.0.4", + "react-side-effect": "^2.1.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-loadable": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-loadable/-/react-loadable-5.5.0.tgz", + "integrity": "sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg==", + "requires": { + "prop-types": "^15.5.0" + } + }, + "react-loadable-ssr-addon": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon/-/react-loadable-ssr-addon-0.2.0.tgz", + "integrity": "sha512-gTfPaxWZa5mHKeSOE61RpoLe7hyjcJHgNa5m0ZZGV3OCkWsOKlfYgoBxXzu9ENg/ePR/kFd5H3ncF4K5eyyNTQ==" + }, + "react-router": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz", + "integrity": "sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.3.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "react-router-dom": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.1.2.tgz", + "integrity": "sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.1.2", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-side-effect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.0.tgz", + "integrity": "sha512-IgmcegOSi5SNX+2Snh1vqmF0Vg/CbkycU9XZbOHJlZ6kMzTmi3yc254oB1WCkgA7OQtIAoLmcSFuHTc/tlcqXg==" + }, + "react-toggle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-toggle/-/react-toggle-4.1.1.tgz", + "integrity": "sha512-+wXlMcSpg8SmnIXauMaZiKpR+r2wp2gMUteroejp2UTSqGTVvZLN+m9EhMzFARBKEw7KpQOwzCyfzeHeAndQGw==", + "requires": { + "classnames": "^2.2.5" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "requires": { + "picomatch": "^2.0.7" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "requires": { + "minimatch": "3.0.4" + } + }, + "reduce": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce/-/reduce-1.0.2.tgz", + "integrity": "sha512-xX7Fxke/oHO5IfZSk77lvPa/7bjMh9BuCk4OOoX5XTXrM7s0Z+MkPfSDfz0q7r91BhhGSs8gii/VEN/7zhCPpQ==", + "requires": { + "object-keys": "^1.1.0" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + }, + "regenerator-transform": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", + "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", + "requires": { + "@babel/runtime": "^7.8.4", + "private": "^0.1.8" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "rehype-parse": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", + "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", + "requires": { + "hast-util-from-parse5": "^5.0.0", + "parse5": "^5.0.0", + "xtend": "^4.0.0" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "remark-admonitions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", + "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", + "requires": { + "rehype-parse": "^6.0.2", + "unified": "^8.4.2", + "unist-util-visit": "^2.0.1" + } + }, + "remark-emoji": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.1.0.tgz", + "integrity": "sha512-lDddGsxXURV01WS9WAiS9rO/cedO1pvr9tahtLhr6qCGFhHG4yZSJW3Ha4Nw9Uk1hLNmUBtPC0+m45Ms+xEitg==", + "requires": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.2" + } + }, + "remark-mdx": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.5.8.tgz", + "integrity": "sha512-wtqqsDuO/mU/ucEo/CDp0L8SPdS2oOE6PRsMm+lQ9TLmqgep4MBmyH8bLpoc8Wf7yjNmae/5yBzUN1YUvR/SsQ==", + "requires": { + "@babel/core": "7.8.4", + "@babel/helper-plugin-utils": "7.8.3", + "@babel/plugin-proposal-object-rest-spread": "7.8.3", + "@babel/plugin-syntax-jsx": "7.8.3", + "@mdx-js/util": "^1.5.8", + "is-alphabetical": "1.0.4", + "remark-parse": "7.0.2", + "unified": "8.4.2" + }, + "dependencies": { + "@babel/core": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", + "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helpers": "^7.8.4", + "@babel/parser": "^7.8.4", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "remark-parse": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-7.0.2.tgz", + "integrity": "sha512-9+my0lQS80IQkYXsMA8Sg6m9QfXYJBnXjWYN5U+kFc5/n69t+XZVXU/ZBYr3cYH8FheEGf1v87rkFDhJ8bVgMA==", + "requires": { + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^1.1.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^1.0.0", + "vfile-location": "^2.0.0", + "xtend": "^4.0.1" + } + }, + "remark-squeeze-paragraphs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-3.0.4.tgz", + "integrity": "sha512-Wmz5Yj9q+W1oryo8BV17JrOXZgUKVcpJ2ApE2pwnoHwhFKSk4Wp2PmFNbmJMgYSqAdFwfkoe+TSYop5Fy8wMgA==", + "requires": { + "mdast-squeeze-paragraphs": "^3.0.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + }, + "section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "requires": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + } + }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "shelljs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, + "sitemap": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-3.2.2.tgz", + "integrity": "sha512-TModL/WU4m2q/mQcrDgNANn0P4LwprM9MMvG4hu5zP4c6IIKs2YLTu6nXXnNr8ODW/WFtxKggiJ1EGn2W0GNmg==", + "requires": { + "lodash.chunk": "^4.2.0", + "lodash.padstart": "^4.6.1", + "whatwg-url": "^7.0.0", + "xmlbuilder": "^13.0.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" + }, + "state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "std-env": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.2.1.tgz", + "integrity": "sha512-IjYQUinA3lg5re/YMlwlfhqNRTzMZMqE+pezevdcTaHceqx8ngEi1alX9nNCk9Sc81fy1fLDeQoaCzeiW1yBOQ==", + "requires": { + "ci-info": "^1.6.0" + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz", + "integrity": "sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz", + "integrity": "sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==" + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "terser": { + "version": "4.6.10", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.10.tgz", + "integrity": "sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "terser-webpack-plugin": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz", + "integrity": "sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==", + "requires": { + "cacache": "^13.0.1", + "find-cache-dir": "^3.2.0", + "jest-worker": "^25.1.0", + "p-limit": "^2.2.2", + "schema-utils": "^2.6.4", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.4.3", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "cacache": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "requires": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "requires": { + "semver": "^6.0.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "ssri": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "requires": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-factory": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-factory/-/to-factory-1.0.0.tgz", + "integrity": "sha1-hzivi9lxIK0dQEeXKtpVY7+UebE=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, + "trim-lines": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-1.1.3.tgz", + "integrity": "sha512-E0ZosSWYK2mkSu+KEtQ9/KqarVjA9HztOSX+9FDdNacRAq29RRV6ZQNgob3iuW8Htar9vAfEa6yyt5qBAHZDBA==" + }, + "trim-trailing-lines": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz", + "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==" + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "requires": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" + }, + "unified": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", + "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" + }, + "unist-util-generated": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.5.tgz", + "integrity": "sha512-1TC+NxQa4N9pNdayCYA1EGUOCAO0Le3fVp7Jzns6lnua/mYgwHo0tz5WUAfrdpNch1RZLHc61VZ1SDgrtNXLSw==" + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==" + }, + "unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" + }, + "unist-util-remove": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-1.0.3.tgz", + "integrity": "sha512-mB6nCHCQK0pQffUAcCVmKgIWzG/AXs/V8qpS8K72tMPtOSCMSjDeMc5yN+Ye8rB0FhcE+JvW++o1xRNc0R+++g==", + "requires": { + "unist-util-is": "^3.0.0" + } + }, + "unist-util-remove-position": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", + "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", + "requires": { + "unist-util-visit": "^1.1.0" + }, + "dependencies": { + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", + "requires": { + "unist-util-visit-parents": "^2.0.0" + } + } + } + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "unist-util-visit": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.2.tgz", + "integrity": "sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "dependencies": { + "unist-util-is": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz", + "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==" + }, + "unist-util-visit-parents": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz", + "integrity": "sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + } + } + } + }, + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", + "requires": { + "unist-util-is": "^3.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vfile": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.1.0.tgz", + "integrity": "sha512-BaTPalregj++64xbGK6uIlsurN3BCRNM/P2Pg8HezlGzKd1O9PrwIac6bd9Pdx2uTb0QHoioZ+rXKolbVXEgJg==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + } + } + }, + "vfile-location": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", + "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==" + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "wait-file": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/wait-file/-/wait-file-1.0.5.tgz", + "integrity": "sha512-udLpJY/eOxlrMm3+XD1RLuF2oT9B7J7wiyR5/9xrvQymS6YR6trWvVhzOldHrVbLwyiRmLj9fcvsjzpSXeZHkw==", + "requires": { + "@hapi/joi": "^15.1.0", + "fs-extra": "^8.1.0", + "rx": "^4.1.0" + } + }, + "watchpack": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", + "requires": { + "chokidar": "^2.1.8", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "optional": true + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "webpack": { + "version": "4.42.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz", + "integrity": "sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.1.tgz", + "integrity": "sha512-Nfd8HDwfSx1xBwC+P8QMGvHAOITxNBSvu/J/mCJvOwv+G4VWkU7zir9SSenTtyCi0LnVtmsc7G5SZo1uV+bxRw==", + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.15", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + } + } + }, + "webpack-dev-server": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", + "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.6", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.25", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.4.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "optional": true + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "webpackbar": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-4.0.0.tgz", + "integrity": "sha512-k1qRoSL/3BVuINzngj09nIwreD8wxV4grcuhHTD8VJgUbGcy8lQSPqv+bM00B7F+PffwIsQ8ISd4mIwRbr23eQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "consola": "^2.10.0", + "figures": "^3.0.0", + "pretty-time": "^1.1.0", + "std-env": "^2.2.1", + "text-table": "^0.2.0", + "wrap-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + } + } + } + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "requires": { + "microevent.ts": "~0.1.1" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "requires": { + "sax": "^1.2.4" + } + }, + "xmlbuilder": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", + "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yaml": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz", + "integrity": "sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.7" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "zepto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zepto/-/zepto-1.2.0.tgz", + "integrity": "sha1-4Se9nmb9hGvl6rSME5SIL3wOT5g=" + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000000..afb85859a3 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,41 @@ +{ + "name": "keto", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "generate:api": "widdershins -u ../.widdershins/templates -e ../.widdershins/config.json ../api.swagger.json -o ../docs/oathkeeper/sdk/api.md", + "format": "prettier --write '{docs/**,docs,scripts,static,contrib}/*.{md,json,js,css,html}' || true" + }, + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.50", + "@docusaurus/preset-classic": "2.0.0-alpha.50", + "classnames": "^2.2.6", + "node-fetch": "^2.6.0", + "react": "^16.8.4", + "react-dom": "^16.8.4" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "json-schema-faker": "^0.5.0-rcv.24", + "json-schema-ref-parser": "^8.0.0", + "prettier": "^2.0.2", + "ramda": "^0.27.0", + "yaml": "^1.8.3" + } +} diff --git a/docs/scripts/config.js b/docs/scripts/config.js new file mode 100644 index 0000000000..0515c156fa --- /dev/null +++ b/docs/scripts/config.js @@ -0,0 +1,198 @@ +const RefParser = require('json-schema-ref-parser'); +const parser = new RefParser(); +const jsf = require('json-schema-faker'); +const YAML = require('yaml'); +const { pathOr } = require('ramda'); +const path = require('path'); +const fs = require('fs'); + +jsf.option({ + alwaysFakeOptionals: true, + useExamplesValue: true, + useDefaultValue: true, + minItems: 1, +}); + +if (process.argv.length !== 3 || process.argv[1] === 'help') { + console.error(` + usage: + node config.js path/to/config.js +`); + return; +} + +const config = require(path.resolve(process.argv[2])); + +const enhance = (schema, parents = []) => (item) => { + const key = item.key.value; + + const path = [ + ...parents.map((parent) => ['properties', parent]), + ['properties', key], + ].flat(); + + if (['title', 'description'].find((f) => path[path.length - 1] === f)) { + return; + } + + const comments = [`# ${pathOr(key, [...path, 'title'], schema)} ##`, '']; + + const description = pathOr('', [...path, 'description'], schema); + if (description) { + comments.push(' ' + description.split('\n').join('\n '), ''); + } + + const defaultValue = pathOr('', [...path, 'default'], schema); + if (defaultValue || defaultValue === false) { + comments.push(' Default value: ' + defaultValue, ''); + } + + const examples = pathOr('', [...path, 'examples'], schema); + if (examples) { + comments.push( + ' Examples:', + ...YAML.stringify(examples) + .split('\n') + .map((i) => ` ${i}`) + ); // split always returns one empty object so no need for newline + } + + let hasChildren; + if (item.value.items) { + item.value.items.forEach((item) => { + if (item.key) { + enhance(schema, [...parents, key])(item); + hasChildren = true; + } + }); + } + + if (!hasChildren) { + const env = [...parents, key].map((i) => i.toUpperCase()).join('_'); + comments.push( + ' Set this value using environment variables on', + ' - Linux/macOS:', + ` $ export ${env}=`, + ' - Windows Command Line (CMD):', + ` > set ${env}=`, + '' + ); + } + + item.commentBefore = comments.join('\n'); + item.spaceBefore = true; +}; + +new Promise((resolve, reject) => { + parser.dereference( + require(path.resolve(config.updateConfig.src)), + (err, result) => (err ? reject(err) : resolve(result)) + ); +}) + .then((schema) => { + const removeAdditionalProperties = (o) => { + delete o['additionalProperties']; + if (o.properties) { + Object.keys(o.properties).forEach((key) => + removeAdditionalProperties(o.properties[key]) + ); + } + }; + + const enableAll = (o) => { + if (o.properties) { + Object.keys(o.properties).forEach((key) => { + if (key === 'enable') { + o.properties[key] = true; + } + enableAll(o.properties[key]); + }); + } + }; + + removeAdditionalProperties(schema); + enableAll(schema); + if (schema.definitions) { + Object.keys(schema.definitions).forEach((key) => { + removeAdditionalProperties(schema.definitions[key]); + enableAll(schema.definitions[key]); + }); + } + + jsf.option({ + useExamplesValue: true, + useDefaultValue: false, // do not change this!! + fixedProbabilities: true, + alwaysFakeOptionals: true, + }); + + const values = jsf.generate(schema); + const doc = YAML.parseDocument(YAML.stringify(values)); + + const comments = [`# ${pathOr(config.projectSlug, ['title'], schema)}`, '']; + + const description = pathOr('', ['description'], schema); + if (description) { + comments.push(' ' + description); + } + + doc.commentBefore = comments.join('\n'); + doc.spaceAfter = false; + doc.spaceBefore = false; + + doc.contents.items.forEach(enhance(schema, [])); + + return Promise.resolve({ + // schema, + // values, + yaml: doc.toString(), + }); + }) + .then((out) => { + const content = `--- +id: configuration +title: Configuration +--- + + + +If file \`$HOME/.${config.projectSlug}.yaml\` exists, it will be used as a configuration file which supports all +configuration settings listed below. + +You can load the config file from another source using the \`-c path/to/config.yaml\` or \`--config path/to/config.yaml\` +flag: \`${config.projectSlug} --config path/to/config.yaml\`. + +Config files can be formatted as JSON, YAML and TOML. Some configuration values support reloading without server restart. +All configuration values can be set using environment variables, as documented below. + +To find out more about edge cases like setting string array values through environmental variables head to the +[Configuring ORY services](https://www.ory.sh/docs/ecosystem/configuring) section. + +\`\`\`yaml +${out.yaml} +\`\`\``; + + return new Promise((resolve, reject) => { + fs.writeFile( + path.resolve(config.updateConfig.dst), + content, + 'utf8', + (err) => { + if (err) { + reject(err); + return; + } + resolve(); + } + ); + }); + }) + .then(() => { + console.log('Done!'); + }) + .catch((err) => { + console.error(err); + process.exit(1); + }); diff --git a/docs/scripts/docker-tag.js b/docs/scripts/docker-tag.js new file mode 100644 index 0000000000..f8a1ee2955 --- /dev/null +++ b/docs/scripts/docker-tag.js @@ -0,0 +1,58 @@ +const fs = require('fs'); +const path = require('path'); + +const help = ` + usage: + node docker-tag.js path/to/config.js $CIRCLE_TAG +`; + +if (process.argv.length !== 4) { + if (process.argv[2] === 'help') { + console.log(help); + return; + } else if (process.argv.length === 3) { + console.log('Skipping because tag is empty'); + return; + } + + console.error(help); + process.exit(1); + return; +} + +const config = require(path.resolve(process.argv[2])); +const next = process.argv[3]; + +const replace = (path, replacer) => + new Promise((resolve, reject) => { + fs.readFile(path, 'utf8', (err, data) => { + if (err) { + return reject(err); + } + + fs.writeFile(path, replacer(data), 'utf8', (err) => { + if (err) { + return reject(err); + } + resolve(); + }); + }); + }); + +config.updateTags.forEach(({ files, image }) => { + files.forEach((loc) => { + replace(loc, (content) => + content.replace( + new RegExp(`${image}:v[0-9a-zA-Z\\.\\+\\_\\-]+`, 'g'), + `${image}:${next}` + ) + ) + .then(() => { + console.log('Done!'); + }) + .catch((err) => { + console.error(err); + process.exit(1); + }); + }); +}); diff --git a/docs/scripts/fix-api.js b/docs/scripts/fix-api.js new file mode 100644 index 0000000000..93468eb074 --- /dev/null +++ b/docs/scripts/fix-api.js @@ -0,0 +1,48 @@ +const fs = require('fs'); + +if (process.argv.length !== 3 || process.argv[1] === 'help') { + console.error(` + usage: + node fix-api.js path/to/file.md +`); + process.exit(1); +} + +const file = process.argv[2]; + +fs.readFile(file, (err, b) => { + if (err) { + throw err; + } + + const t = b + .toString() + .replace(/^id: api/gim, '') + .replace(/^title:(.*)/im, 'title: REST API\nid: api') // improve title, add docusaurus id + .replace(/^language_tabs:.*\n/im, '') // not supported by docusaurus + .replace(/^toc_footers.*\n/im, '') // not supported by docusaurus + .replace(/^includes.*\n/im, '') // not supported by docusaurus + .replace(/^search.*\n/im, '') // not supported by docusaurus + .replace(/^highlight_theme.*\n/im, '') // not supported by docusaurus + .replace(/^headingLevel.*\n/im, '') // not supported by docusaurus + // .replace(/^ Scroll down for example requests and responses.*\n/im, '') // Irrelevant information + // .replace(/^Base Urls:*\n/im, '') // Irrelevant information, let's replace it with something useful instead! + // .replace(/^\* \/<\/a>\n/im, '') // Irrelevant information + // .replace(/

([a-zA-Z0-9_\-]+)<\/h2>\n/gim, '## $2') + // .replace(/

([a-zA-Z0-9_\-]+)<\/h2>\n/gim, '## $2') + .replace(/\n\s*\n/g, '\n\n', -1) + .replace(/^-(\s.*)\n/gim, '-$1', -1) + .replace(/\n\n---/gi, '\n---\n\n') + // .replace(/\n\s*\n```/gi, '\n```') + // .replace(/^

Responses<\/h3>$/gim, '#### Summary',-1) + // .replace(/^> Example responses/gim, '### Responses',-1) + // .replace(/^> Body parameter/gim, '### Request body',-1) + .replace(/^> ([0-9]+) Response$/gim, '###### $1 response', -1); + + fs.writeFile(file, t, (err) => { + if (err) { + throw err; + } + }); +}); diff --git a/docs/scripts/rerelease.js b/docs/scripts/rerelease.js new file mode 100644 index 0000000000..d848e7f37c --- /dev/null +++ b/docs/scripts/rerelease.js @@ -0,0 +1,13 @@ +const path = require('path'); +const name = process.argv[2]; +const fs = require('fs'); + +const p = path.join(__dirname, '../versions.json'); + +fs.writeFile(p, JSON.stringify(require(p).filter((v) => v !== name)), function ( + err +) { + if (err) { + return console.error(err); + } +}); diff --git a/docs/sidebar.js b/docs/sidebar.js new file mode 100644 index 0000000000..3a5ea58bb1 --- /dev/null +++ b/docs/sidebar.js @@ -0,0 +1,28 @@ +module.exports = { + Introduction:[ + "index", + "install", + ], + "Core Concepts":[ + "api-access-rules", + { + type: "category", + label: "Handlers", + items:[ + "pipeline/index", + "pipeline/authn", + "pipeline/authz", + "pipeline/mutator", + "pipeline/error" + ] + }, + ], + "Guides":["configure-deploy"], + "Reference":[ + "reference/configuration", + "reference/api" + ], + "SDKs":[ + "sdk/index" + ], +}; diff --git a/docs/src/css/.gitkeep b/docs/src/css/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/src/css/theme.css b/docs/src/css/theme.css new file mode 100644 index 0000000000..fde8a975bb --- /dev/null +++ b/docs/src/css/theme.css @@ -0,0 +1,18 @@ +/* stylelint-disable docusaurus/copyright-header */ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: #6274f3; + --ifm-color-primary-dark: rgb(33, 175, 144); + --ifm-color-primary-darker: rgb(31, 165, 136); + --ifm-color-primary-darkest: rgb(26, 136, 112); + --ifm-color-primary-light: rgb(70, 203, 174); + --ifm-color-primary-lighter: rgb(102, 212, 189); + --ifm-color-primary-lightest: rgb(146, 224, 208); + --ifm-code-font-size: 95%; +} diff --git a/docs/src/pages/index.js b/docs/src/pages/index.js new file mode 100644 index 0000000000..17298eb8f1 --- /dev/null +++ b/docs/src/pages/index.js @@ -0,0 +1,10 @@ +import React from 'react'; + +import {Redirect} from '@docusaurus/router'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + +function Home() { + return ; +} + +export default Home; diff --git a/docs/src/pages/versions.js b/docs/src/pages/versions.js new file mode 100644 index 0000000000..b445b2bd30 --- /dev/null +++ b/docs/src/pages/versions.js @@ -0,0 +1,95 @@ +import React from 'react'; + +import Layout from '@theme/Layout'; + +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Link from '@docusaurus/Link'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + +import versions from '../../versions.json'; + +function Version() { + const context = useDocusaurusContext(); + const {siteConfig = {}} = context; + const latestVersion = versions[0]; + const pastVersions = versions.filter(version => version !== latestVersion); + const repoUrl = `https://github.com/${siteConfig.organizationName}/${siteConfig.projectName}`; + return ( + +
+

Documentation versions

+
+

Latest version (Stable)

+

Here you can find the latest documentation.

+ + + + + + + + +
{latestVersion} + + Documentation + + + + Changelog + +
+
+
+

Next version (Unreleased)

+

Here you can find the documentation for unreleased version.

+ + + + + + + + +
master + + Documentation + + + Source Code +
+
+ {pastVersions.length > 0 && ( +
+

Past Versions

+

+ Here you can find documentation for previous versions. +

+ + + {pastVersions.map(version => ( + + + + + + ))} + +
{version} + + Documentation + + + + Changelog + +
+
+ )} +
+
+ ); +} + +export default Version; diff --git a/docs/static/img/favico.png b/docs/static/img/favico.png new file mode 100644 index 0000000000..63c316a2e7 Binary files /dev/null and b/docs/static/img/favico.png differ diff --git a/docs/static/img/logo-docusaurus-template.svg b/docs/static/img/logo-docusaurus-template.svg new file mode 100644 index 0000000000..fd3ac477e4 --- /dev/null +++ b/docs/static/img/logo-docusaurus-template.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + diff --git a/docs/static/img/logo-hydra.svg b/docs/static/img/logo-hydra.svg new file mode 100644 index 0000000000..ea8d60fbf7 --- /dev/null +++ b/docs/static/img/logo-hydra.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/static/img/logo-keto.svg b/docs/static/img/logo-keto.svg new file mode 100644 index 0000000000..747668c967 --- /dev/null +++ b/docs/static/img/logo-keto.svg @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/docs/static/img/logo-kratos.svg b/docs/static/img/logo-kratos.svg new file mode 100644 index 0000000000..2c3ceb143f --- /dev/null +++ b/docs/static/img/logo-kratos.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/static/img/logo-oathkeeper.svg b/docs/static/img/logo-oathkeeper.svg new file mode 100644 index 0000000000..d87356e4af --- /dev/null +++ b/docs/static/img/logo-oathkeeper.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/versioned_docs/version-v0.37/.gitkeep b/docs/versioned_docs/version-v0.37/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/versioned_docs/version-v0.37/api-access-rules.md b/docs/versioned_docs/version-v0.37/api-access-rules.md new file mode 100644 index 0000000000..edd0283b6b --- /dev/null +++ b/docs/versioned_docs/version-v0.37/api-access-rules.md @@ -0,0 +1,263 @@ +--- +id: api-access-rules +title: API Access Rules +--- + +ORY Oathkeeper reaches decisions to allow or deny access by applying Access +Rules. Access Rules can be stored on the file system, set as an environment +variable, or fetched from HTTP(s) remotes. These repositories can be configured +in the configuration file (`oathkeeper -c ./path/to/config.yml ...`) + +```yaml +# Configures Access Rules +access_rules: + # Locations (list of URLs) where access rules should be fetched from on boot. + # It is expected that the documents at those locations return a JSON or YAML Array containing ORY Oathkeeper Access Rules. + repositories: + # If the URL Scheme is `file://`, the access rules (an array of access rules is expected) will be + # fetched from the local file system. + - file://path/to/rules.json + # If the URL Scheme is `inline://`, the access rules (an array of access rules is expected) + # are expected to be a base64 encoded (with padding!) JSON/YAML string (base64_encode(`[{"id":"foo-rule","authenticators":[....]}]`)): + - inline://W3siaWQiOiJmb28tcnVsZSIsImF1dGhlbnRpY2F0b3JzIjpbXX1d + # If the URL Scheme is `http://` or `https://`, the access rules (an array of access rules is expected) will be + # fetched from the provided HTTP(s) location. + - https://path-to-my-rules/rules.json + # Determines a matching strategy for the access rules . Currently supported values are `glob` and `regexp`. Empty string defaults to regexp. + matching_strategy: glob +``` + +or by setting the equivalent environment variable: + +```bash +$ export ACCESS_RULES_REPOSITORIES='file://path/to/rules.json,https://path-to-my-rules/rules.json,inline://W3siaWQiOiJmb28tcnVsZSIsImF1dGhlbnRpY2F0b3JzIjpbXX1d' +``` + +The repository (file, inline, remote) must be formatted either as a JSON or a +YAML array containing the access rules: + +```shell +$ cat ./rules.json +[{ + "id": "my-first-rule" +},{ + "id": "my-second-rule" +}] + +$ cat ./rules.yaml +- id: my-first-rule + version: v0.36.0-beta.4 + authenticators: + - handler: noop +- id: my-second-rule + version: v0.36.0-beta.4 + authorizer: + handler: allow +``` + +## Access Rule Format + +Access Rules have four principal keys: + +- `id` (string): The unique ID of the Access Rule. +- `version` (string): The version of ORY Oathkeeper this rule targets with out + the `+oryOS.` appendix. ORY Oathkeeper is able to migrate access rules + across versions. If left empty ORY Oathkeeper will assume that the rule is + using the same tag as the version that is running. +- `upstream` (object): The location of the server where requests matching this + rule should be forwarded to. This only needs to be set when using the ORY + Oathkeeper Proxy as the Decision API does not forward the request to the + upstream. + - `url` (string): The URL the request will be forwarded to. + - `preserve_host` (bool): If set to `false` (default), the forwarded request + will include the host and port of the `url` value. If `true`, the host and + port of the ORY Oathkeeper Proxy will be used instead: + - `false`: Incoming HTTP Header `Host: mydomain.com`-> Forwarding HTTP + Header `Host: someservice.intranet.mydomain.com:1234` + - `strip_path` (string): If set, replaces the provided path prefix when + forwarding the requested URL to the upstream URL: + - set to `/api/v1`: Incoming HTTP Request at `/api/v1/users` -> Forwarding + HTTP Request at `/users`. + - unset: Incoming HTTP Request at `/api/v1/users` -> Forwarding HTTP Request + at `/api/v1/users`. +- `match` (object): Defines the URL(s) this Access Rule should match. + - `methods` (string[]): Array of HTTP methods (e.g. GET, POST, PUT, DELETE, + ...). + - `url` (string): The URL that should be matched. You can use regular + expressions or glob patterns in this field to match more than one url. The + matching strategy (glob or regexp) is defined in the global configuration + file as `access_rules.matching_strategy`. This matcher ignores query + parameters. Regular expressions (or glob patterns) are encapsulated in + brackets `<` and `>`. Regular expressions examples: + - `https://mydomain.com/` matches `https://mydomain.com/` and does not match + `https://mydomain.com/foo` or `https://mydomain.com`. + - `://mydomain.com/<.*>` matches:`https://mydomain.com/` or + `http://mydomain.com/foo`. Does not match: `https://other-domain.com/` or + `https://mydomain.com`. + - `http://mydomain.com/<[[:digit:]]+>` matches `http://mydomain.com/123` and + does not match `http://mydomain/abc`. + - `http://mydomain.com/<(?!protected).*>` matches + `http://mydomain.com/resource` and does not match + `http://mydomain.com/protected` + [Glop](http://tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm) + patterns examples: + - `https://mydomain.com/` matches `https://mydomain.com/man` and does + not match `http://mydomain.com/foo`. + - `https://mydomain.com/<{foo*,bar*}>` matches `https://mydomain.com/foo` or + `https://mydomain.com/bar` and does not match `https://mydomain.com/any`. +- `authenticators`: A list of authentication handlers that authenticate the + provided credentials. Authenticators are checked iteratively from index `0` to + `n` and the first authenticator to return a positive result will be the one + used. If you want the rule to first check a specific authenticator before + "falling back" to others, have that authenticator as the first item in the + array. For the full list of available authenticators, click + [here](pipeline/authn.md). +- `authorizer`: The authorization handler which will try to authorize the + subject ("user") from the previously validated credentials making the request. + For example, you could check if the subject ("user") is part of the "admin" + group or if he/she has permission to perform that action. For the full list of + available authorizers, click [here](pipeline/authz.md). +- `mutators`: A list of mutation handlers that transform the HTTP request before + forwarding it. A common use case is generating a new set of credentials (e.g. + JWT) which then will be forwarded to the upstream server. When using ORY + Oathkeeper's Decision API, it is expected that the API Gateway forwards the + mutated HTTP Headers to the upstream server. For the full list of available + mutators, click [here](pipeline/mutator.md). +- `errors`: A list of error handlers that are executed when any of the previous + handlers (e.g. authentication) fail. Error handlers define what to do in case + of an error, for example redirect the user to the login endpoint when a + unauthorized (HTTP Status Code 401) error occurs. If left unspecified, errors + will always be handled as JSON responses unless the global configuration key + `errors.fallback` was changed. For more information on error handlers, click + [here](pipeline/error.md). + +**Examples** + +Rule in JSON format: + +```json +{ + "id": "some-id", + "version": "v0.36.0-beta.4", + "upstream": { + "url": "http://my-backend-service", + "preserve_host": true, + "strip_path": "/api/v1" + }, + "match": { + "url": "http://my-app/some-route/<.*>", + "methods": ["GET", "POST"] + }, + "authenticators": [{ "handler": "noop" }], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }], + "errors": [{ "handler": "json" }] +} +``` + +Rule in YAML format: + +```yaml +id: some-id +version: v0.36.0-beta.4 +upstream: + url: http://my-backend-service + preserve_host: true + strip_path: /api/v1 +match: + url: http://my-app/some-route/<.*> + methods: + - GET + - POST +authenticators: + - handler: noop +authorizer: + hander: allow +mutators: + - handler: noop +errors: + - handler: json +``` + +## Handler configuration + +Handlers (Authenticators, Mutators, Authorizers, Errors) sometimes require +configuration. The configuration can be defined globally as well as per Access +Rule. The configuration from the Access Rule is overrides values from the global +configuration. + +**oathkeeper.yml** + +```yaml +authenticators: + anonymous: + enabled: true + config: + subject: anon +``` + +**rule.json** + +```json +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service", + "preserve_host": true, + "strip_path": "/api/v1" + }, + "match": { + "url": "http://my-app/some-route/<.*>", + "methods": ["GET", "POST"] + }, + "authenticators": [ + { "handler": "anonymous", "config": { "subject": "anon" } } + ], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }] +} +``` + +## Scoped Credentials + +Some credentials are scoped. For example, OAuth 2.0 Access Tokens usually are +scoped ("OAuth 2.0 Scope"). Scope validation depends on the meaning of the +scope. Therefore, wherever ORY Oathkeeper validates a scope, these scope +strategies are supported: + +- `hierarchic`: Scope `foo` matches `foo`, `foo.bar`, `foo.baz` but not `bar` +- `wildcard`: Scope `foo.*` matches `foo`, `foo.bar`, `foo.baz` but not `bar`. + Scope `foo` matches `foo` but not `foo.bar` nor `bar` +- `exact`: Scope `foo` matches `foo` but not `bar` nor `foo.bar` +- `none`: Scope validation is disabled. If however a scope is configured to be + validated, the request will fail with an error message. + +## Match strategy behavior + +With the **Regular expression** strategy, you can use the extracted groups in +all handlers where the substitutions are supported by using the Go +[`text/template`](https://golang.org/pkg/text/template/) package, receiving the +[AuthenticationSession](https://github.com/ory/oathkeeper/blob/master/pipeline/authn/authenticator.go#L39) +struct: + +```go +type AuthenticationSession struct { + Subject string + Extra map[string]interface{} + Header http.Header + MatchContext MatchContext +} + +type MatchContext struct { + RegexpCaptureGroups []string + URL *url.URL +} +``` + +**Examples** + +If the match URL is `://mydomain.com/<.*>` and the request is +`http://mydomain.com/foo`, the `MatchContext` field will contain + +- `RegexpCaptureGroups`: ["http", "foo"] +- `URL`: "http://mydomain.com/foo" diff --git a/docs/versioned_docs/version-v0.37/configure-deploy.md b/docs/versioned_docs/version-v0.37/configure-deploy.md new file mode 100644 index 0000000000..897a5f50f4 --- /dev/null +++ b/docs/versioned_docs/version-v0.37/configure-deploy.md @@ -0,0 +1,371 @@ +--- +id: configure-deploy +title: Configure and Deploy +--- + +The ORY Oathkeeper HTTP serve process `oathkeeper serve` opens two ports +exposing the + +- [reverse proxy](index.md#reverse-proxy) +- REST API which serves the + [Access Control Decision API](index.md#access-control-decision-api) as well as + other API endpoints such as health checks, JSON Web Key Sets, and a list of + available rules. + +For this guide we are using Docker. ORY Oathkeeper however can be +[installed in a variety of ways](install.md). + +## Configure + +ORY Oathkeeper can be configured via the filesystem as well as environment +variables. For more information on mapping the keys to environment variables +please head over to the [configuration chapter](configuration.md). + +First, create an empty directory and `cd` into it: + +```shell +$ mkdir oathkeeper-demo +$ cd oathkeeper-demo +``` + +Create a file called `config.yaml` with the following content: + +```shell +$ cat << EOF > config.yaml +serve: + proxy: + port: 4455 # run the proxy at port 4455 + api: + port: 4456 # run the api at port 4456 + +access_rules: + repositories: + - file:///rules.json + +errors: + fallback: + - json + handlers: + json: + enabled: true + config: + verbose: true + redirect: + enabled: true + config: + to: https://www.ory.sh/docs + +mutators: + header: + enabled: true + config: + headers: + X-User: "{{ print .Subject }}" + # You could add some other headers, for example with data from the + # session. + # X-Some-Arbitrary-Data: "{{ print .Extra.some.arbitrary.data }}" + noop: + enabled: true + id_token: + enabled: true + config: + issuer_url: http://localhost:4455/ + jwks_url: file:///jwks.json + +authorizers: + allow: + enabled: true + deny: + enabled: true + +authenticators: + anonymous: + enabled: true + config: + subject: guest +EOF +``` + +This configuration file will run the proxy at port 4455, the api at port 4456, +and enable the anonymous authenticator, the allow and deny authorizers, and the +noop and id_token mutators. + +### Access Rules + +We will be using [httpbin.org](https://httpbin.org) as the upstream server. The +service echoes incoming HTTP Requests and is perfect for seeing how ORY +Oathkeeper works. Let's define three rules: + +1. An access rule that allowing anonymous access to + `https://httpbin.org/anything/cookie` and using the `cookie` mutator. +2. An access rule denying every access to `https://httpbin.org/anything/deny`. + If the request header has `Accept: application/json`, we will receive a JSON + response. If however the accept header has `Accept: text/*`, a HTTP Redirect + will be sent (to `https://www.ory.sh/docs` as configured above). +3. An access rule allowing anonymous access to + `https://httpbin.org/anything/id_token` and using the `id_token` mutator. + +```shell +$ cat << EOF > rules.json +[ + { + "id": "allow-anonymous-with-header-mutator", + "version": "v0.36.0-beta.4", + "upstream": { + "url": "https://httpbin.org/anything/header" + }, + "match": { + "url": "http://<127.0.0.1|localhost>:4455/anything/header", + "methods": [ + "GET" + ] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "header", + "config": { + "headers": { + "X-User": "{{ print .Subject }}" + } + } + } + ] + }, + { + "id": "deny-anonymous", + "version": "v0.36.0-beta.4", + "upstream": { + "url": "https://httpbin.org/anything/deny" + }, + "match": { + "url": "http://<127.0.0.1|localhost>:4455/anything/deny", + "methods": [ + "GET" + ] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "deny" + }, + "mutators": [ + { + "handler": "noop" + } + ], + "errors": [ + { + "handler": "json", + "config": { + "when": [ + { + "request": { + "header": { + "accept": ["application/json"] + } + } + } + ] + } + }, + { + "handler": "redirect", + "config": { + "when": [ + { + "request": { + "header": { + "accept": ["text/*"] + } + } + } + ] + } + } + ] + }, + { + "id": "allow-anonymous-with-id-token-mutator", + "version": "v0.36.0-beta.4", + "upstream": { + "url": "https://httpbin.org/anything/id_token" + }, + "match": { + "url": "http://<127.0.0.1|localhost>:4455/anything/id_token", + "methods": [ + "GET" + ] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "id_token" + } + ] + } +] +EOF +``` + +### Cryptographic Keys + +The `id_token` mutator creates a signed JSON Web Token. For that to work, a +public/private key is required. Luckily, ORY Oathkeeper can assist you in +creating such keys. All common JWT algorithms are supported (RS256, ES256, +HS256, ...). Let's generate a key for the RS256 algorithm that will be used by +the id_token mutator: + +```sh +$ docker run oryd/oathkeeper:v0.37.1-beta.1 credentials generate --alg RS256 > jwks.json +``` + +### Dockerfile + +Next we will be creating a custom Docker Image that adds these configuration +files to the image: + +```shell +$ cat << EOF > Dockerfile +FROM oryd/oathkeeper:v0.37.1-beta.1 + +ADD config.yaml /config.yaml +ADD rules.json /rules.json +ADD jwks.json /jwks.json +EOF +``` + +We are doing this for demonstration purposes only. In a production environment +you would separate these configuration values from the build artifact itself. In +Kuberentes, it would make most sense to provide the JSON Web Keys as a +Kubernetes Secret mounted as in a directory, for example. + +We encourage you to check out our [helm charts](https://k8s.ory.sh/helm/) which +apply these best practices. + +## Build & Run + +Before building the Docker Image, we need to make sure that the local ORY +Oathkeeper Docker Image is on the most recent version: + +```sh +$ docker pull oryd/oathkeeper:v0.37.1-beta.1 +``` + +Next we will build our custom Docker Image + +```sh +$ docker build -t ory-oathkeeper-demo . +``` + +and run it + +``` +$ docker run --rm \ + --name ory-oathkeeper-demo \ + -p 4455:4455 \ + -p 4456:4456 \ + ory-oathkeeper-demo \ + --config /config.yaml \ + serve +``` + +Let's open a new terminal and check if it is alive: + +``` +$ curl http://127.0.0.1:4456/health/alive +{"status":"ok"} + +$ curl http://127.0.0.1:4456/health/ready +{"status":"ok"} +``` + +Let's also check if the rules have been imported properly: + +``` +$ curl http://127.0.0.1:4456/rules +[{"id":"allow-anonymous-with-header-mutator","description":"","match":{"methods":["GET"],... +``` + +## Authorizing Requests + +Everything is up and running and configured! Let's make some requests: + +``` +$ curl -X GET http://127.0.0.1:4455/anything/header +{ + "args": {}, + "data": "", + "files": {}, + "form": {}, + "headers": { + "Accept": "*/*", + "Accept-Encoding": "gzip", + "Host": "httpbin.org", + "User-Agent": "curl/7.54.0", + "X-User": "guest" + }, + "json": null, + "method": "GET", + "origin": "172.17.0.1, 82.135.11.242, 172.17.0.1", + "url": "https://httpbin.org/anything/header/anything/header" +} + +# Make request and accept JSON (we get an error response) +$ curl -H "Accept: application/json" -X GET http://127.0.0.1:4455/anything/deny +{ + "error":{ + "code":403, + "status":"Forbidden", + "message":"Access credentials are not sufficient to access this resource" + } +} + +# Make request and accept text/* (we get a redirect response). +$ curl -H "Accept: text/html" -X GET http://127.0.0.1:4455/anything/deny +
Found. + +$ curl -X GET http://127.0.0.1:4455/anything/id_token +{ + "args": {}, + "data": "", + "files": {}, + "form": {}, + "headers": { + "Accept": "*/*", + "Accept-Encoding": "gzip", + "Authorization": "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjU3N2E2NWE0LTUzM2YtNDFhYi1hODI2LTgxNDliMDM2NDQ0MyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NTgwMTg1MTcsImlhdCI6MTU1ODAxODQ1NywiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo0NDU1LyIsImp0aSI6IjExNmRiNzhmLTQyMjEtNDU2ZC05OWIzLTY4NGJkMWVjYThjZSIsIm5iZiI6MTU1ODAxODQ1Nywic3ViIjoiZ3Vlc3QifQ.2VKW-oYtzkFGRPgK3sb4iRlObDSzW8PyHzgNiQubppFSlp0bzJLl4Rnt56orJndPqIa7hwsm8YIskf-Wp-FA1piv-aG_XljkUjgilKr3cncMXDP15yDRwZj8g0iVKEhnugQsw_zWf5gMU2YBev2Eyv4xciJxbhrKCat-X8xNT9SvAbwpY-VxQdu_rnpu1GKCA54DyIX6r-Qh5bQPrrT7NvIupA7jJQ23qq83m4C1cQfBgzlhm7dcCuPqKunYKRsc7NZuER3lT6TjkhsF1qhf7o7BZmCnhz6VuH8L8TwMZS8IJWKSjJd8dEKKwxwPkNXOcZO8A3hIO8SZx4Yd7jrONA", + "Host": "httpbin.org", + "User-Agent": "curl/7.54.0" + }, + "json": null, + "method": "GET", + "origin": "172.17.0.1, 82.135.11.242, 172.17.0.1", + "url": "https://httpbin.org/anything/id_token/anything/id_token" +} +``` + +That's it! You can now clean up the demo using: + +``` +$ docker rm -f ory-oathkeeper-demo +$ docker rmi -f ory-oathkeeper-demo +$ rm -rf oathkeeper-demo +``` diff --git a/docs/versioned_docs/version-v0.37/index.md b/docs/versioned_docs/version-v0.37/index.md new file mode 100644 index 0000000000..956ceb4ada --- /dev/null +++ b/docs/versioned_docs/version-v0.37/index.md @@ -0,0 +1,211 @@ +--- +id: index +title: Introduction +--- + +ORY Oathkeeper authorizes incoming HTTP requests. It can be the Policy +Enforcement Point in your cloud architecture, i.e. a reverse proxy in front of +your upstream API or web server that rejects unauthorized requests and forwards +authorized ones to your server. If you want to use another API Gateway (Kong, +Nginx, Envoy, AWS API Gateway, ...), Oathkeeper can also plug into that and act +as its Policy Decision Point. + +The implemented problem domain and scope is called Zero-Trust Network +Architecture, [BeyondCorp](https://www.beyondcorp.com), and Identity And Access +Proxy (IAP). + +While ORY Oathkeeper works well with ORY Hydra and ORY Keto, ORY Oathkeeper can +be used completely standalone and alongside other stacks with adjacent problem +domains (Keycloak, Gluu, Vault, ...). ORY Oathkeeper's Access Control Decision +API works with + +- [Ambassador](https://github.com/datawire/ambassador) via + [auth service](https://www.getambassador.io/reference/services/auth-service) +- [Envoy](https://www.envoyproxy.io) via the + [External Authorization HTTP Filter](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/security/ext_authz_filter.html) +- AWS API Gateway via + [Custom Authorizers](https://aws.amazon.com/de/blogs/compute/introducing-custom-authorizers-in-amazon-api-gateway/) +- [Nginx](https://www.nginx.com) via + [Authentication Based on Subrequest Result](https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-subrequest-authentication/) + +among others. + +## Dependencies + +ORY Oathkeeper does not have any dependencies to other services. It can work +completely in isolation and does not require a database or any other type of +persistent storage. ORY Oathkeeper is configurable with yaml configuration +files, JSON files, and environment variables. + +## Operating Modes + +Starting Oathkeeper via `oathkeeper serve` exposes two ports: One port serves +the reverse proxy, the other ORY Oathkeeper's API. + +### Reverse Proxy + +The port exposing the reverse proxy forwards requests to the upstream server, +defined in the rule, if the request is allowed. If the request is not allowed, +ORY Oathkeeper does not forward the request and instead returns an error +message. + +[![ORY Oathkeeper deployed as a Reverse Proxy](https://mermaid.ink/img/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAgICBwYXJ0aWNpcGFudCBPIGFzIE9hdGhrZWVwZXIgUHJveHlcbiAgICBwYXJ0aWNpcGFudCBBIGFzIFByb3RlY3RlZCBTZXJ2ZXIvQVBJXG4gICAgQy0-Pk86IEhUVFAgUmVxdWVzdFxuICAgIE8tLT4-TzogQ2hlY2sgaWYgcmVxdWVzdCBpcyBhbGxvd2VkXG4gICAgYWx0IGlzIG5vdCBhbGxvd2VkXG4gICAgTy0-PkM6IFJldHVybiBIVFRQIEVycm9yIFxuICAgIGVsc2UgaXMgYWxsb3dlZFxuICAgIE8tPj5BOiBGb3J3YXJkIEhUVFAgUmVxdWVzdCBcbiAgICBBLT4-TzogUmV0dXJuIEhUVFAgUmVzcG9uc2VcbiAgICBPLT4-QzogUmV0dXJuIEhUVFAgUmVzcG9uc2VcbiAgICBlbmQiLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAgICBwYXJ0aWNpcGFudCBPIGFzIE9hdGhrZWVwZXIgUHJveHlcbiAgICBwYXJ0aWNpcGFudCBBIGFzIFByb3RlY3RlZCBTZXJ2ZXIvQVBJXG4gICAgQy0-Pk86IEhUVFAgUmVxdWVzdFxuICAgIE8tLT4-TzogQ2hlY2sgaWYgcmVxdWVzdCBpcyBhbGxvd2VkXG4gICAgYWx0IGlzIG5vdCBhbGxvd2VkXG4gICAgTy0-PkM6IFJldHVybiBIVFRQIEVycm9yIFxuICAgIGVsc2UgaXMgYWxsb3dlZFxuICAgIE8tPj5BOiBGb3J3YXJkIEhUVFAgUmVxdWVzdCBcbiAgICBBLT4-TzogUmV0dXJuIEhUVFAgUmVzcG9uc2VcbiAgICBPLT4-QzogUmV0dXJuIEhUVFAgUmVzcG9uc2VcbiAgICBlbmQiLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ) + +#### Example + +Assuming the following request + +``` +GET /my-service/whatever HTTP/1.1 +Host: oathkeeper-proxy:4455 +Authorization: bearer some-token +``` + +and you have the following rule defined (which allows this request) + +```json +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://oathkeeper-proxy:4455/my-service/whatever", + "methods": ["GET"] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "noop" + } + ] +} +``` + +then the request will be forwarded by ORY Oathkeeper as follows: + +``` +GET /my-service/whatever HTTP/1.1 +Host: my-backend-service:4455 +Authorization: bearer some-token +``` + +The response of this request will then be sent to the client that made the +request to ORY Oathkeeper. + +### Access Control Decision API + +The ORY Oathkeeper Access Control Decision API follows best-practices and works +with most (if not all) modern API gateways and reverse proxies. To verify a +request, send it to the `decisions` endpoint located at the Ory Authkeeper API +port. It matches every sub-path and HTTP Method: + +- `GET /decisions/v1/api` +- `PUT /decisions/my/other/api` +- `DELETE /decisions/users?foo=?bar` + +When matching a rule, the `/decision` prefix is stripped from the matching path. + +[![ORY Oathkeeper deployed as an Decision API](https://mermaid.ink/img/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAgICBwYXJ0aWNpcGFudCBBRyBhcyBBUEkgR2F0ZXdheVxuICAgIHBhcnRpY2lwYW50IE8gYXMgT2F0aGtlZXBlciBBUElcbiAgICBwYXJ0aWNpcGFudCBBIGFzIFByb3RlY3RlZCBTZXJ2ZXIvQVBJXG4gICAgQy0-PkFHOiBIVFRQIFJlcXVlc3RcbiAgICBBRy0-Pk86IEFzayBqdWRnZSBBUEkgZm9yIGF1dGhvcml6YXRpb25cblxuICAgIGFsdCBpcyBhbGxvd2VkXG4gICAgTy0-PkFHOiBSZXR1cm4gYXV0aCBpbmZvXG4gICAgQUctPj5BOiBGb3J3YXJkIEhUVFAgUmVxdWVzdFxuICAgIEEtPj5BRzogUmV0dXJuIEhUVFAgUmVzcG9uc2VcbiAgICBBRy0-PkM6IFJldHVybiBIVFRQIFJlc3BvbnNlXG4gICAgZWxzZSBpcyBub3QgYWxsb3dlZFxuICAgIE8tPj5BRzogRGVueSByZXF1ZXN0XG4gICAgQUctPj5DOiBSZXR1cm4gSFRUUCBFcnJvclxuICAgIGVuZCIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In19)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAgICBwYXJ0aWNpcGFudCBBRyBhcyBBUEkgR2F0ZXdheVxuICAgIHBhcnRpY2lwYW50IE8gYXMgT2F0aGtlZXBlciBBUElcbiAgICBwYXJ0aWNpcGFudCBBIGFzIFByb3RlY3RlZCBTZXJ2ZXIvQVBJXG4gICAgQy0-PkFHOiBIVFRQIFJlcXVlc3RcbiAgICBBRy0-Pk86IEFzayBqdWRnZSBBUEkgZm9yIGF1dGhvcml6YXRpb25cblxuICAgIGFsdCBpcyBhbGxvd2VkXG4gICAgTy0-PkFHOiBSZXR1cm4gYXV0aCBpbmZvXG4gICAgQUctPj5BOiBGb3J3YXJkIEhUVFAgUmVxdWVzdFxuICAgIEEtPj5BRzogUmV0dXJuIEhUVFAgUmVzcG9uc2VcbiAgICBBRy0-PkM6IFJldHVybiBIVFRQIFJlc3BvbnNlXG4gICAgZWxzZSBpcyBub3QgYWxsb3dlZFxuICAgIE8tPj5BRzogRGVueSByZXF1ZXN0XG4gICAgQUctPj5DOiBSZXR1cm4gSFRUUCBFcnJvclxuICAgIGVuZCIsIm1lcm1haWQiOnsidGhlbWUiOiJkZWZhdWx0In19) + +#### Example + +Assuming you are making the following request to ORY Oathkeeper's Access Control +Decision API + +``` +GET /decision/my-service/whatever HTTP/1.1 +Host: oathkeeper-api:4456 +Authorization: bearer some-token +``` + +and you have the following rule defined (which allows this request) + +```json +{ + "id": "some-id", + "match": { + "url": "http://oathkeeper-api:4456/my-service/whatever", + "methods": ["GET"] + }, + "authenticators": [ + { + "handler": "noop" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "noop" + } + ] +} +``` + +then this endpoint will directly respond with HTTP Status Code 200: + +``` +HTTP/1.1 200 OK +Authorization: bearer some-token +``` + +If any other status code is returned, the request must not be allowed, for +example: + +``` +HTTP/1.1 401 OK +Content-Length: 0 +Connection: Closed +``` + +It is also possible to have this endpoint return other error responses such as +the HTTP Status Found (HTTP Status Code `302`), depending configured on the +error handling. Use this feature only if your Reverse Proxy supports these type +of responses. + +Depending on the mutator defined by the access rule, the HTTP Response might +contain additional or mutated HTTP Headers: + +``` +HTTP/1.1 200 OK +X-User-ID: john.doe +``` + +## Decision Engine + +The decision engine allows to configure how ORY Oathkeeper authorizes HTTP +requests. Authorization happens in four steps, each of which can be configured: + +1. **Access Rule Matching:** Verifies that the HTTP method, path, and host of + the incoming HTTP request conform to your access rules. The request is denied + if no access rules match. The configuration of the matching access rule + becomes the input for the next steps. +2. **Authentication:** Oathkeeper can validate credentials via a variety of + methods like Bearer Token, Basic Authorization, or cookie. Invalid + credentials result in denial of the request. The "internal" session state + (e.g. user ID) of valid (authenticated) credentials becomes input for the + next steps. +3. **Authorization:** Access Rules can check permissions. To secure, for + example, an API that requires admin privileges, configure the authorizer to + check if the user ID from step 2 has the "admin" permission or role. + Oathkeeper supports a variety of authorizers. Failed authorization (e.g. user + does not have role "admin") results denial of the request. +4. **Mutation:** The Access Rule can add session data to the HTTP request that + it forwards to the upstream API. For example, the mutator could add + `X-User-ID: the-user-id` to the HTTP headers or generate a JWT with session + information and set it as `Authorization: Bearer the.jwt.token`. + +Additionally, error handling can be configured. You may want to send an +`application/json` response for API clients and a HTTP Redirect response for +browsers with an end user. + +[![ORY Oathkeeper Pipeline](https://mermaid.ink/img/eyJjb2RlIjoiZ3JhcGggVERcblxucihIVFRQIFJlcXVlc3QpIC0tPiBhcm0oQWNjZXNzIFJ1bGUgTWF0Y2hlcilcbmFybSAtLWZvdW5kIG1hdGNoaW5nIGFjY2VzcyBydWxlLS0-IGFuKEF1dGhlbnRpY2F0b3IpXG5hcm0gLS1kaWQgbm90IGZpbmQgYWNjZXNzIHJ1bGUtLT4gZWhcbmFuIC0tY3JlZGVudGlhbHMgaW4gcmVxdWVzdCBhcmUgdmFsaWQtLT5heihBdXRob3JpemVyKVxuYW4gLS1jcmVkZW50aWFscyBpbiByZXF1ZXN0IGFyZSBpbnZhbGlkLS0-IGVoXG5heiAtLXJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uLS0-IGVoXG5heiAtLXJlcXVlc3QgaGFzIHBlcm1pc3Npb24tLT5tdChNdXRhdG9yKVxubXQtLXRyYW5zZm9ybSBodHRwIHJlcXVlc3QtLT5yZXMoRm9yd2FyZCBIVFRQIFJlcXVlc3QpXG5cbmVoKEVycm9yIEhhbmRsZXIpIC0tIGlmIGVycm9yIGhhbmRsZWQgYXMganNvbiAtLT4gZWhqc29uKEhUVFAgSlNPTiBFcnJvciByZXNwb25zZSlcbmVoKEVycm9yIEhhbmRsZXIpIC0tIGlmIGVycm9yIGhhbmRsZWQgYXMgcmVkaXJlY3QgLS0-IGVocmVkaXJlY3QoSFRUUCBSZWRpcmVjdCByZXNwb25zZSlcbmVoKEVycm9yIEhhbmRsZXIpIC0tIG90aGVycyAtLT4gZWhvdGhlcihFeGVjdXRlIGFueSBvdGhlciBlcnJvciBoYW5kbGluZyBsb2dpYy4uLikiLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCIsInRoZW1lQ1NTIjoiLmxhYmVsIGZvcmVpZ25PYmplY3QgeyBvdmVyZmxvdzogdmlzaWJsZTsgZm9udC1zaXplOiAxM3B4IH0ifX0)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiZ3JhcGggVERcblxucihIVFRQIFJlcXVlc3QpIC0tPiBhcm0oQWNjZXNzIFJ1bGUgTWF0Y2hlcilcbmFybSAtLWZvdW5kIG1hdGNoaW5nIGFjY2VzcyBydWxlLS0-IGFuKEF1dGhlbnRpY2F0b3IpXG5hcm0gLS1kaWQgbm90IGZpbmQgYWNjZXNzIHJ1bGUtLT4gZWhcbmFuIC0tY3JlZGVudGlhbHMgaW4gcmVxdWVzdCBhcmUgdmFsaWQtLT5heihBdXRob3JpemVyKVxuYW4gLS1jcmVkZW50aWFscyBpbiByZXF1ZXN0IGFyZSBpbnZhbGlkLS0-IGVoXG5heiAtLXJlcXVlc3QgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uLS0-IGVoXG5heiAtLXJlcXVlc3QgaGFzIHBlcm1pc3Npb24tLT5tdChNdXRhdG9yKVxubXQtLXRyYW5zZm9ybSBodHRwIHJlcXVlc3QtLT5yZXMoRm9yd2FyZCBIVFRQIFJlcXVlc3QpXG5cbmVoKEVycm9yIEhhbmRsZXIpIC0tIGlmIGVycm9yIGhhbmRsZWQgYXMganNvbiAtLT4gZWhqc29uKEhUVFAgSlNPTiBFcnJvciByZXNwb25zZSlcbmVoKEVycm9yIEhhbmRsZXIpIC0tIGlmIGVycm9yIGhhbmRsZWQgYXMgcmVkaXJlY3QgLS0-IGVocmVkaXJlY3QoSFRUUCBSZWRpcmVjdCByZXNwb25zZSlcbmVoKEVycm9yIEhhbmRsZXIpIC0tIG90aGVycyAtLT4gZWhvdGhlcihFeGVjdXRlIGFueSBvdGhlciBlcnJvciBoYW5kbGluZyBsb2dpYy4uLikiLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCIsInRoZW1lQ1NTIjoiLmxhYmVsIGZvcmVpZ25PYmplY3QgeyBvdmVyZmxvdzogdmlzaWJsZTsgZm9udC1zaXplOiAxM3B4IH0ifX0) diff --git a/docs/versioned_docs/version-v0.37/install.md b/docs/versioned_docs/version-v0.37/install.md new file mode 100644 index 0000000000..6a7271e1b5 --- /dev/null +++ b/docs/versioned_docs/version-v0.37/install.md @@ -0,0 +1,82 @@ +--- +id: install +title: Installation +--- + +Installing ORY Oathkeeper on any system is straight forward. We provide +pre-built binaries, Docker Images and support various package managers. + +## Docker + +We recommend using Docker to run ORY Oathkeeper: + +```shell +$ docker pull oryd/oathkeeper +$ docker run --rm -it oryd/oathkeeper help +``` + +## macOS + +You can install ORY Oathkeeper using [homebrew](https://brew.sh/) on macOS: + +```shell +$ brew tap ory/oathkeeper +$ brew install ory/oathkeeper/oathkeeper +$ oathkeeper help +``` + +## Linux + +On linux, you can use `curl | bash` to fetch the latest stable binary using: + +```shell +$ curl https://raw.githubusercontent.com/ory/oathkeeper/master/install.sh | bash -s -- -b . +$ ./oathkeeper help +``` + +You may want to move ORY Oathkeeper to your `$PATH`: + +```shell +$ sudo mv ./oathkeeper /usr/local/bin/ +$ oathkeeper help +``` + +## Windows + +You can install ORY Oathkeeper using [scoop](https://scoop.sh) on Windows: + +```shell +> scoop bucket add ory-oathkeeper https://github.com/ory/scoop-oathkeeper.git +> scoop install oathkeeper +> oathkeeper help +``` + +## Download Binaries + +The client and server **binaries are downloadable at the +[releases tab](https://github.com/ory/oathkeeper/releases)**. There is currently +no installer available. You have to add the Oathkeeper binary to the PATH +environment variable yourself or put the binary in a location that is already in +your `$PATH` (e.g. `/usr/local/bin`, ...). + +Once installed, you should be able to run: + +```shell +$ oathkeeper help +``` + +## Building from Source + +If you wish to compile ORY Oathkeeper yourself, you need to install and set up +[Go 1.12+](https://golang.org/) and add `$GOPATH/bin` to your `$PATH`. + +The following commands will check out the latest release tag of ORY Oathkeeper +and compile it and set up flags so that `oathkeeper version` works as expected. +Please note that this will only work with a linux shell like bash or sh. + +```shell +$ go get -d -u github.com/ory/oathkeeper +$ cd $(go env GOPATH)/src/github.com/ory/oathkeeper +$ GO111MODULE=on make install-stable +$ $(go env GOPATH)/bin/oathkeeper help +``` diff --git a/docs/versioned_docs/version-v0.37/pipeline/authn.md b/docs/versioned_docs/version-v0.37/pipeline/authn.md new file mode 100644 index 0000000000..acafbd704d --- /dev/null +++ b/docs/versioned_docs/version-v0.37/pipeline/authn.md @@ -0,0 +1,816 @@ +--- +id: authn +title: Authenticators +--- + +An authenticator is responsible for authenticating request credentials. ORY +Oathkeeper supports different authenticators and we will add more as the project +progresses. + +An authenticator inspects the HTTP request (e.g. the HTTP Authorization Header) +and executes some business logic that returns true (for authentication ok) or +false (for authentication invalid) as well as a subject ("user"). The subject is +typically the "user" that made the request, but it could also be a machine (if +you have machine-2-machine interaction) or something different. + +Each authenticator has two keys: + +- `handler` (string, required): Defines the handler (e.g. `noop`) to be used. +- `config` (object, optional): Configures the handler. Configuration keys vary + per handler. The configuration can be defined in the global configuration + file, or per access rule. + +**Example** + +```json +{ + "authenticators": [ + { + "handler": "noop", + "config": {} + } + ] +} +``` + +You can define more than one authenticator in the Access Rule. The first +authenticator that is able to handle the credentials will be consulted and other +authenticators will be ignored: + +```json +{ + "authenticators": [ + { + "handler": "a" + }, + { + "handler": "b" + }, + { + "handler": "c" + } + ] +} +``` + +If handler `a` is able to handle the provided credentials, then handler `b` and +`c` will be ignored. If handler `a` can not handle the provided credentials but +handler `b` can, then handler `a` and `c` will be ignored. Handling the provided +credentials means that the authenticator knows how to handle, for example, the +`Authorization: basic` header. It does not mean that the credentials are valid! +If a handler encounters invalid credentials, then other handlers will be ignored +too. + +## `noop` + +The `noop` handler tells ORY Oathkeeper to bypass authentication, authorization, +and mutation. This implies that no authorization will be executed and no +credentials will be issued. It's basically a pass-all authenticator that allows +any request to be forwarded to the upstream URL. + +> Using this handler is basically an allow-all configuration. It makes sense +> when the upstream handles access control itself or does not need any type of +> access control. + +### Configuration + +This handler is not configurable. + +To enable this handler, set: + +```yaml +# Global configuration file oathkeeper.yml +authenticators: + noop: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true +``` + +### Access Rule Example + +```sh +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ + "handler": "noop" + }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 200 Status OK +The request has been allowed! +``` + +## `unauthorized` + +The `unauthorized` handler tells ORY Oathkeeper to reject all requests as +unauthorized. + +### Configuration + +This handler is not configurable. + +To enable this handler, set: + +```yaml +# Global configuration file oathkeeper.yml +unauthorized: + noop: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true +``` + +### Access Rule Example + +```sh +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ + "handler": "unauthorized" + }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 401 Unauthorized +``` + +## `anonymous` + +The `anonymous` authenticator checks whether or not an `Authorization` header is +set. If not, it will set the subject to `anonymous`. + +### Configuration + +- `subject` (string, optional) - Sets the anonymous username. Defaults to + "anonymous". Common names include "guest", "anon", "anonymous", "unknown". + +```yaml +# Global configuration file oathkeeper.yml +authenticators: + anonymous: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + + config: + subject: guest +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +authenticators: + - handler: anonymous + config: + subject: guest +``` + +### Access Rule Example + +The following rule allows all requests to `GET http://my-app/some-route` and +sets the subject name to the anonymous username, as long as no `Authorization` +header is set in the HTTP request: + +```shell +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ + "handler": "anonymous" + }], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 200 Status OK +The request has been allowed! The subject is: "anonymous" + +$ curl -X GET -H "Authorization: Bearer foobar" http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because credentials have been provided but only the anonymous +authenticator is enabled for this URL. +``` + +## `cookie_session` + +The `cookie_session` authenticator will forward the request method, path and +headers to a session store. If the session store returns `200 OK` and body +`{ "subject": "...", "extra": {} }` then the authenticator will set the subject +appropriately. + +### Configuration + +- `check_session_url` (string, required) - The session store to forward request + method/path/headers to for validation. +- `only` ([]string, optional) - If set, only requests that have at least one of + the set cookies will be forwarded, others will be passed to the next + authenticator. If unset, all requests are forwarded. +- `preserve_path` (boolean, optional) - If set, any path in `check_session_url` + will be preserved instead of replacing the path with the path of the request + being checked. +- `extra_from` (string, optional - defaults to `extra`) - A + [GJSON Path](https://github.com/tidwall/gjson/blob/master/SYNTAX.md) pointing + to the `extra` field. This defaults to `extra`, but it could also be `@this` + (for the root element), `session.foo.bar` for + `{ "subject": "...", "session": { "foo": {"bar": "whatever"} } }`, and so on. +- `subject_from` (string, optional - defaults to `subject`) - A + [GJSON Path](https://github.com/tidwall/gjson/blob/master/SYNTAX.md) pointing + to the `subject` field. This defaults to `subject`. Example: `identity.id` for + `{ "identity": { "id": "1234" } }`. + +```yaml +# Global configuration file oathkeeper.yml +authenticators: + cookie_session: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + + config: + check_session_url: https://session-store-host +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +authenticators: + - handler: cookie_session + config: + check_session_url: https://session-store-host + only: + - sessionid +``` + +```yaml +# Some Access Rule Preserving Path: access-rule-2.yaml +id: access-rule-2 +# match: ... +# upstream: ... +authenticators: + - handler: cookie_session + config: + check_session_url: https://session-store-host/check-session + only: + - sessionid + preserve_path: true +``` + +### Access Rule Example + +```shell +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ + "handler": "cookie_session" + }], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }] +}] + +$ curl -X GET -b sessionid=abc http://my-app/some-route + +HTTP/1.0 200 OK +The request has been allowed! The subject is: "peter" + +$ curl -X GET -b sessionid=def http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because the provided credentials are invalid. +``` + +## `oauth2_client_credentials` + +This `oauth2_client_credentials` uses the username and password from HTTP Basic +Authorization (`Authorization: Basic base64()` to perform the +OAuth 2.0 Client Credentials grant in order to detect if the provided +credentials are valid. + +This authenticator will use the username from the HTTP Basic Authorization +header as the subject for this request. + +> If you are unfamiliar with OAuth 2.0 Introspection we recommend +> [reading this guide](https://www.oauth.com/oauth2-servers/access-tokens/client-credentials/). + +### Configuration + +- `token_url` (string, required) - The OAuth 2.0 Token Endpoint that will be + used to validate the client credentials. +- `required_scope` ([]string, optional) - Sets what scope is required by the URL + and when making performing OAuth 2.0 Client Credentials request, the scope + will be included in the request: + +```yaml +# Global configuration file oathkeeper.yml +authenticators: + oauth2_client_credentials: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + + config: + token_url: https://my-website.com/oauth2/token +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +authenticators: + - handler: oauth2_client_credentials + config: + token_url: https://my-website.com/oauth2/token +``` + +### Access Rule Example + +```shell +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ + "handler": "oauth2_client_credentials", + "config": { + "required_scope": ["scope-a", "scope-b"] + } + }], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because no credentials have been provided. + +$ curl -X GET --user idonotexist:whatever http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because the provided credentials are invalid. + +$ curl -X GET --user peter:somesecret http://my-app/some-route + +HTTP/1.0 200 OK +The request has been allowed! The subject is: "peter" +``` + +In the background, a request to the OAuth 2.0 Token Endpoint (value of +`authenticators.oauth2_client_credentials.token_url`) will be made, using the +OAuth 2.0 Client Credentials Grant: + +``` +POST /oauth2/token HTTP/1.1 +Host: authorization-server.com + +grant_type=client_credentials +&client_id=peter +&client_secret=somesecret +&scope=scope-a+scope-b +``` + +If the request succeeds, the credentials are considered valid and if the request +fails, the credentials are considered invalid. + +## `oauth2_introspection` + +The `oauth2_introspection` authenticator handles requests that have an Bearer +Token in the Authorization Header (`Authorization: bearer `) or in a +different header or query parameter specified in configuration. It then uses +OAuth 2.0 Token Introspection to check if the token is valid and if the token +was granted the requested scope. + +> If you are unfamiliar with OAuth 2.0 Introspection we recommend +> [reading this guide](https://www.oauth.com/oauth2-servers/token-introspection-endpoint/). + +### Configuration + +- `introspection_url` (string, required) - The OAuth 2.0 Token Introspection + endpoint. +- `scope_strategy` (string, optional) - Sets the strategy to be used to + validate/match the token scope. Supports "hierarchic", "exact", "wildcard", + "none". Defaults to "none". +- `required_scope` ([]string, optional) - Sets what scope is required by the URL + and when making performing OAuth 2.0 Client Credentials request, the scope + will be included in the request +- `pre_authorization` (object, optional) - Enable pre-authorization in cases + where the OAuth 2.0 Token Introspection endpoint is protected by OAuth 2.0 + Bearer Tokens that can be retrieved using the OAuth 2.0 Client Credentials + grant. + - `enabled` (bool, optional) - Enable pre-authorization. Defaults to false. + - `client_id` (string, required if enabled) - The OAuth 2.0 Client ID to be + used for the OAuth 2.0 Client Credentials Grant. + - `client_secret` (string, required if enabled) - The OAuth 2.0 Client Secret + to be used for the OAuth 2.0 Client Credentials Grant. + - `token_url` (string, required if enabled) - The OAuth 2.0 Scope to be + requested during the OAuth 2.0 Client Credentials Grant. + - `scope` ([]string, optional) - The OAuth 2.0 Token Endpoint where the OAuth + 2.0 Client Credentials Grant will be performed. +- `token_from` (object, optional) - The location of the bearer token. If not + configured, the token will be received from a default location - + 'Authorization' header. One and only one location (header, query, or cookie) + must be specified. + - `header` (string, required, one of) - The header (case insensitive) that + must contain a Bearer token for request authentication. It can't be set + along with `query_parameter` or `cookie`. + - `query_parameter` (string, required, one of) - The query parameter (case + sensitive) that must contain a Bearer token for request authentication. It + can't be set along with `header` or `cookie`. + - `cookie` (string, required, one of) - The cookie (case sensitive) that must + contain a Bearer token for request authentication. It can't be set along + with `header` or `query_parameter` +- `introspection_request_headers` (object, optional) - Additional headers to add + to the introspection request + +```yaml +# Global configuration file oathkeeper.yml +authenticators: + oauth2_introspection: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + + config: + introspection_url: https://my-website.com/oauth2/introspection + scope_strategy: exact + required_scope: + - photo + - profile + pre_authorization: + enabled: true + client_id: some_id + client_secret: some_secret + scope: + - introspect + token_url: https://my-website.com/oauth2/token + token_from: + header: Custom-Authorization-Header + # or + # query_parameter: auth-token + # or + # cookie: auth-token + introspection_request_headers: + x-forwarded-proto: https +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +authenticators: + - handler: oauth2_introspection + config: + introspection_url: https://my-website.com/oauth2/introspection + scope_strategy: exact + required_scope: + - photo + - profile + pre_authorization: + enabled: true + client_id: some_id + client_secret: some_secret + scope: + - introspect + token_url: https://my-website.com/oauth2/token + token_from: + query_parameter: auth-token + # or + # header: Custom-Authorization-Header + # or + # cookie: auth-token + introspection_request_headers: + x-forwarded-proto: https + x-foo: bar +``` + +### Access Rule Example + +```shell +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ + "handler": "oauth2_introspection", + "config": { + "required_scope": ["scope-a", "scope-b"] + } + }], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because no credentials have been provided. + +$ curl -X GET -H 'Authorization: Bearer invalid-token' http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because the provided credentials are invalid. + +$ curl -X GET -H 'Authorization: Bearer valid.access.token.from.peter' http://my-app/some-route + +HTTP/1.0 200 OK +The request has been allowed! The subject is: "peter" +``` + +In the background, this handler will make a request to the OAuth 2.0 Token +Endpoint (configuration value +`authenticators.oauth2_introspection.introspection_url`) to check if the Bearer +Token is valid: + +``` +POST /oauth2/introspect HTTP/1.1 + +token=valid.access.token.from.peter +``` + +If pre-authorization is enabled, that request will include an Authorization +Header: + +``` +POST /oauth2/introspect HTTP/1.1 +Authorization: Bearer token-received-by-performing-pre-authorization + +token=valid.access.token.from.peter +``` + +The Token is considered valid if the Introspection response is HTTP 200 OK and +includes `{"active":true}` in the response payload. The subject is extracted +from the `username` field. + +## `jwt` + +The `jwt` authenticator handles requests that have an Bearer Token in the +Authorization Header (`Authorization: bearer `) or in a different header +or query parameter specified in configuration. It assumes that the token is a +JSON Web Token and tries to verify the signature of it. + +### Configuration + +- `jwks_urls` ([]string, required) - The URLs where ORY Oathkeeper can retrieve + JSON Web Keys from for validating the JSON Web Token. Usually something like + `https://my-keys.com/.well-known/jwks.json`. The response of that endpoint + must return a JSON Web Key Set (JWKS). +- `scope_strategy` (string, optional) - Sets the strategy to be used to + validate/match the scope. Supports "hierarchic", "exact", "wildcard", "none". + Defaults to "none". +- If `trusted_issuers` ([]string) is set, the JWT must contain a value for claim + `iss` that matches _exactly_ (case-sensitive) one of the values of + `trusted_issuers`. If no values are configured, the issuer will be ignored. +- If `target_audience` ([]string) is set, the JWT must contain all values + (exact, case-sensitive) in the claim `aud`. If no values are configured, the + audience will be ignored. +- Value `allowed_algorithms` ([]string) sets what signing algorithms are + allowed. Defaults to `RS256`. +- Value `required_scope` ([]string) validates the scope of the JWT. It will + checks for claims `scp`, `scope`, `scopes` in the JWT when validating the + scope as that claim is not standardized. +- `token_from` (object, optional) - The location of the bearer token. If not + configured, the token will be received from a default location - + 'Authorization' header. One and only one location (header, query, or cookie) + must be specified. + - `header` (string, required, one of) - The header (case insensitive) that + must contain a Bearer token for request authentication. It can't be set + along with `query_parameter` or `cookie`. + - `query_parameter` (string, required, one of) - The query parameter (case + sensitive) that must contain a Bearer token for request authentication. It + can't be set along with `header` or `cookie`. + - `cookie` (string, required, one of) - The cookie (case sensitive) that must + contain a Bearer token for request authentication. It can't be set along + with `header` or `query_parameter` + +```yaml +# Global configuration file oathkeeper.yml +authenticators: + jwt: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + + config: + jwks_urls: + - https://my-website.com/.well-known/jwks.json + - https://my-other-website.com/.well-known/jwks.json + - file://path/to/local/jwks.json + scope_strategy: none + required_scope: + - scope-a + - scope-b + target_audience: + - https://my-service.com/api/users + - https://my-service.com/api/devices + trusted_issuers: + - https://my-issuer.com/ + allowed_algorithms: + - RS256 + token_from: + header: Custom-Authorization-Header + # or + # query_parameter: auth-token + # or + # cookie: auth-token +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +authenticators: + - handler: jwt + config: + jwks_urls: + - https://my-website.com/.well-known/jwks.json + - https://my-other-website.com/.well-known/jwks.json + - file://path/to/local/jwks.json + scope_strategy: none + required_scope: + - scope-a + - scope-b + target_audience: + - https://my-service.com/api/users + - https://my-service.com/api/devices + trusted_issuers: + - https://my-issuer.com/ + allowed_algorithms: + - RS256 + token_from: + query_parameter: auth-token + # or + # header: Custom-Authorization-Header + # or + # cookie: auth-token +``` + +#### Validation example + +```json +{ + "handler": "jwt", + "config": { + "required_scope": ["scope-a", "scope-b"], + "target_audience": [ + "https://my-service.com/api/users", + "https://my-service.com/api/devices" + ], + "trusted_issuers": ["https://my-issuer.com/"], + "allowed_algorithms": ["RS256", "RS256"] + } +} +``` + +That exemplary Access Rule consider the following (decoded) JSON Web Token as +valid: + +``` +{ + "alg": "RS256" +} +{ + "iss": "https://my-issuer.com/", + "aud": ["https://my-service.com/api/users", "https://my-service.com/api/devices"], + "scp": ["scope-a", "scope-b"] +} +``` + +And this token as invalid (audience is missing, issuer is not matching, scope is +missing, wrong algorithm): + +``` +{ + "alg": "HS256" +} +{ + "iss": "https://not-my-issuer.com/", + "aud": ["https://my-service.com/api/users"], + "scp": ["not-scope-a", "scope-b"] +} +``` + +### Scope + +JSON Web Tokens can be scoped. However, that feature is not standardized and +several claims that represent the token scope have been seen in the wild: `scp`, +`scope`, `scopes`. Additionally, the claim value can be a string (`"scope-a"`), +a space-delimited string (`"scope-a scope-b"`) or a JSON string array +(`["scope-a", "scope-b"]`). Because of this ambiguity, all of those claims are +checked and parsed and will be available as `scp` (string array) in the +authentication session (`.Extra["scp"]`). + +### Access Rule Example + +```shell +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ + "handler": "jwt", + "config": { + "required_scope": ["scope-a", "scope-b"], + "target_audience": ["aud-1"], + "trusted_issuers": ["iss-1"] + } + }], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because no credentials have been provided. + +$ curl -X GET -H 'Authorization: Bearer invalid-token' http://my-app/some-route + +HTTP/1.0 401 Status Unauthorized +The request is not authorized because the provided credentials are invalid. + +$ curl -X GET -H 'Authorization: Bearer valid.jwtfrom.peter' http://my-app/some-route + +HTTP/1.0 200 OK +The request has been allowed! The subject is: "peter" +``` + +In the background, this handler will fetch all JSON Web Key Sets provided by +configuration key `authenticators.jwt.jwks_urls` and use those keys to verify +the signature. If the signature can not be verified by any of those keys, the +JWT is considered invalid. diff --git a/docs/versioned_docs/version-v0.37/pipeline/authz.md b/docs/versioned_docs/version-v0.37/pipeline/authz.md new file mode 100644 index 0000000000..d0c337b300 --- /dev/null +++ b/docs/versioned_docs/version-v0.37/pipeline/authz.md @@ -0,0 +1,360 @@ +--- +id: authz +title: Authorizers +--- + +An "authorizer" is responsible for properly permissioning a subject. ORY +Oathkeeper supports different kinds of authorizers. The list of authorizers +increases over time due to new features and requirements. + +Authorizers assure that a subject, for instance a "user", has the permissions +necessary to access or perform a particular service. For example, an authorizer +can permit access to an endpoint or URL for specific subjects or "users" from a +specific group "admin". The authorizer permits the subjects the desired access +to the endpoint. + +Each authorizer has two keys: + +- `handler` (string, required): Defines the handler, e.g. `noop`, to be used. +- `config` (object, optional): Configures the handler. Configuration keys can + vary for each handler. + +**Example** + +```json +{ + "authorizer": { + "handler": "noop", + "config": {} + } +} +``` + +There is a 1:1 mandatory relationship between an authoriser and an access rule. +It is not possible to configure more than one authorizer per Access Rule. + +## Authorizer `allow` + +This authorizer permits every action allowed. + +### Configuration + +This handler is not configurable. + +To enable this handler, set as follows: + +```yaml +# Global configuration file oathkeeper.yml +authorizers: + allow: + # Set enabled to "true" to enable the authenticator, and "false" to disable the authenticator. Defaults to "false". + enabled: true +``` + +### Access Rule Example + +```sh +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ "handler": "anonymous" }], + "authorizer": { "handler": "allow" }, + "mutators": [{ "handler": "noop" }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 200 Status OK +The request has been allowed! +``` + +## Authorizer`deny` + +This authorizer considers every action unauthorized therefore "forbidden" or +"disallowed". + +### Configuration + +This handler is not configurable. + +To enable this handler, set: + +```yaml +# Global configuration file oathkeeper.yml +authorizers: + deny: + # Set enabled to "true" to enable the authenticator, and "false" to disable the authenticator. Defaults to "false". + enabled: true +``` + +### Access Rule Example + +```sh +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/some-route", + "methods": [ + "GET" + ] + }, + "authenticators": [{ "handler": "anonymous" }], + "authorizer": { "handler": "deny" }, + "mutators": [{ "handler": "noop" }] +}] + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 403 Forbidden +The request is forbidden! +``` + +## Authorizer `keto_engine_acp_ory` + +This authorizer uses the ORY Keto API to carry out access control using +"ORY-flavored" Access Control Policies. The conventions used in the ORY Keto +project are located on [GitHub ORY Keto](https://github.com/ory/keto) for +consultation prior to using this authorizer. + +### Configuration + +- `base_url` (string, required) - The base URL of ORY Keto, typically something + like https://hostname:port/ +- `required_action` (string, required) - See section below. +- `required_resource` (string, required) - See section below. +- `subject` (string, optional) - See section below. +- `flavor` (string, optional) - See section below. + +#### Resource, Action, Subject + +This authorizer has four configuration options, `required_action`, +`required_resource`, `subject`, and `flavor`: + +```json +{ + "handler": "keto_engine_acp_ory", + "config": { + "required_action": "...", + "required_resource": "...", + "subject": "...", + "flavor": "..." + } +} +``` + +All configuration options except `flavor` support Go +[`text/template`](https://golang.org/pkg/text/template/). For example in the +following match configuration: + +```json +{ + "match": { + "url": "http://my-app/api/users/<[0-9]+>/<[a-zA-Z]+>", + "methods": ["GET"] + } +} +``` + +The following example shows how to reference the values matched by or resulting +from the two regular expressions, `<[0-9]+>` and `<[a-zA-Z]+>`. using the +`AuthenticationSession` struct: + +```json +{ + "handler": "keto_engine_acp_ory", + "config": { + "required_action": "my:action:{{ printIndex .MatchContext.RegexpCaptureGroups 0 }}", + "required_resource": "my:resource:{{ printIndex .MatchContext.RegexpCaptureGroups 1 }}:foo:{{ printIndex .MatchContext.RegexpCaptureGroups 0 }}" + } +} +``` + +Assuming a request to `http://my-api/api/users/1234/foobar` was made, the config +from above would expand to: + +```json +{ + "handler": "keto_engine_acp_ory", + "config": { + "required_action": "my:action:1234", + "required_resource": "my:resource:foobar:foo:1234" + } +} +``` + +The `subject` field configures the subject that passes to the ORY Keto endpoint. +If `subject` is not specified it will default to +`AuthenticationSession.Subject`. + +For more details about supported Go template substitution, see. +[How to use session variables](index.md#session) + +#### Example + +```yaml +# Global configuration file oathkeeper.yml +authorizers: + keto_engine_acp_ory: + # Set enabled to "true" to enable the authenticator, and "false" to disable the authenticator. Defaults to "false". + enabled: true + + config: + base_url: http://my-keto/ + required_action: ... + required_resource: ... + subject: ... + flavor: ... +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +authorizers: + - handler: keto_engine_acp_ory + config: + base_url: http://my-keto/ + required_action: ... + required_resource: ... + subject: ... + flavor: ... +``` + +### Access Rule Example + +```shell +$ cat ./rules.json + +[{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/api/users/<[0-9]+>/<[a-zA-Z]+>", + "methods": [ + "GET" + ] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "keto_engine_acp_ory", + "config": { + "required_action": "my:action:$1", + "required_resource": "my:resource:$2:foo:$1" + "subject": "{{ .Extra.email }}", + "flavor": "exact" + } + } + "mutators": [ + { + "handler": "noop" + } + ] +}] +``` + +## `remote_json` + +This authorizer performs authorization using a remote authorizer. The authorizer +makes a HTTP POST request to a remote endpoint with a JSON body. If the endpoint +returns a "200 OK" response code, the access is allowed, if it returns a "403 +Forbidden" response code, the access is denied. + +### Configuration + +- `remote` (string, required) - The remote authorizer's URL. The remote + authorizer is expected to return either "200 OK" or "403 Forbidden" to + allow/deny access. +- `payload` (string, required) - The request's JSON payload sent to the remote + authorizer. The string will be parsed by the Go + [`text/template`](https://golang.org/pkg/text/template/) package and applied + to an + [`AuthenticationSession`](https://github.com/ory/oathkeeper/blob/master/pipeline/authn/authenticator.go#L40) + object. See [Session](index.md#session) for more details. + +#### Example + +```yaml +# Global configuration file oathkeeper.yml +authorizers: + remote_json: + # Set enabled to "true" to enable the authenticator, and "false" to disable the authenticator. Defaults to "false". + enabled: true + + config: + remote: http://my-remote-authorizer/authorize + payload: | + { + "subject": "{{ print .Subject }}", + "resource": "{{ printIndex .MatchContext.RegexpCaptureGroups 0 }}" + } +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +authorizers: + - handler: remote_json + config: + remote: http://my-remote-authorizer/authorize + payload: | + { + "subject": "{{ print .Subject }}", + "resource": "{{ printIndex .MatchContext.RegexpCaptureGroups 0 }}" + } +``` + +### Access Rule Example + +```shell +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/api/<.*>", + "methods": ["GET"] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "remote_json", + "config": { + "remote": "http://my-remote-authorizer/authorize", + "payload": "{\"subject\": \"{{ print .Subject }}\", \"resource\": \"{{ printIndex .MatchContext.RegexpCaptureGroups 0 }}\"}" + } + } + "mutators": [ + { + "handler": "noop" + } + ] +} +``` diff --git a/docs/versioned_docs/version-v0.37/pipeline/error.md b/docs/versioned_docs/version-v0.37/pipeline/error.md new file mode 100644 index 0000000000..543a97e215 --- /dev/null +++ b/docs/versioned_docs/version-v0.37/pipeline/error.md @@ -0,0 +1,460 @@ +--- +id: error +title: Error Handlers +--- + +A error handler is responsible for executing logic after, for example, +authentication or authorization failed. ORY Oathkeeper supports different error +handlers and we will add more as the project progresses. + +A error handler can be configured to match on certain conditions, for example, +it is possible to configure the `json` error handler to only be executed if the +HTTP Header `Accept` contains `application/json`. + +Each error handler has two keys: + +- `handler` (string, required): Defines the handler (e.g. `noop`) to be used. +- `config` (object, optional): Configures the handler. Configuration keys vary + per handler. The configuration can be defined in the global configuration + file, or per access rule. + +**Example** + +```json +{ + "errors": [ + { + "handler": "json", + "config": {} + } + ] +} +``` + +You can define more than one error handler in the Access Rule. Depending on +their matching conditions (see next chapter), the appropriate error handler will +be chosen. + +Please be aware that defining error handlers with overlapping matching +conditions will cause errors, because ORY Oathkeeper will not know which error +handler to execute! + +## Error Matching + +You can configure the error handlers in such a way, that - for example - ORY +Oathkeeper responds, in the case of an error, with + +- a JSON response, such as + `{"error":{"code":403,"status":"Forbidden","message":"Access credentials are not sufficient to access this resource"}}`, + when the client that expects JSON (`Accept: application/json`); +- an XML response when the API Client expects XML (`Accept: application/xml`); +- a HTTP Redirect (HTTP Status Found - 302) to `/login` when the endpoint is + directly (no AJAX) accessed from a browser + (`Accept: text/html,application/xhtml+xml`). + +There are also other possible matching strategies - such as defining a response +per error type (unauthorized, forbidden, internal_server_error, ...) , per HTTP +`Content-Type` Header (similar to `Accept`), or based on the Remote IP Address. + +All match definitions are set in the handler's config, using the `when` key. +This is the same for all handlers! + +```json5 +{ + handler: 'json', // or redirect, www_authenticate, ... + config: { + when: [ + { + error: ['unauthorized', '...', '...'], + }, + ], + }, +} +``` + +If `when` is empty, then no conditions are applied and the error handler is +always matching! In fact, this is also true for all subkeys. If left empty, the +matching condition will not be applied and is thus always true! + +### Fallback + +Error handling can be set globally and per access rule. ORY Oathkeeper will +first check for any access rule specific error handling before falling back to +the globally defined error handling. + +Similar to other pipeline handlers (authentication, authorization, mutation), +you must enable the error handlers in the global ORY Oathkeeper config, except +for the `json` error handler which is always enabled by default: + +```yaml +# .oathkeeper.yaml +errors: + handlers: + json: + enabled: true # this is true by default + # config: + # when: ... + redirect: + enabled: true # this is false by default + # config: + # when: ... +``` + +As discussed in the previous section, when `config.when` is empty, the error +handler will always match. This of course is a problem because ORY Oathkeeper +now does not know if it should redirect or send a JSON error! + +Therefore, an additional configuration - called `fallback` - is available: + +```yaml +# .oathkeeper.yaml +errors: + # `["json"]` is the default! + fallback: + - json + + handlers: + json: + enabled: true # this is true by default + # config: + # when: ... + redirect: + enabled: true # this is false by default + config: + to: http://mywebsite/login + # when: ... +``` + +This feature tells ORY Oathkeeper that the `json` error handler should be used +as fallback. You could also define multiple fallback handlers - the first +matching handler will be the one and only executed! This makes sense if you +additionally configure the `when` section: + +```yaml +# .oathkeeper.yaml +errors: + fallback: + - redirect + - json + + handlers: + json: + enabled: true + redirect: + enabled: true + config: + when: + - request: + header: + accept: + - text/* +``` + +In this configuration example, ORY Oathkeeper would first check if the HTTP +Request Header contains `Accept: text/html` (or `text/xhtml`, `text/text`, ...) +and if not, would return a JSON Error Message. + +### Matchers + +All matchers are defined under the `config.when` key of the error handler, both +in the global config and in the access rule: + +```json5 +// access-rule.json +{ + handler: 'json', + config: { + when: [ + { + error: ['unauthorized', '...', '...'], + }, + ], + }, +} +``` + +```yaml +# .oathkeeper.yaml +errors: + handlers: + redirect: + enabled: true + config: + when: + - error: + - unauthorized + - ... + - ... +``` + +You can define multiple when clauses which allows you to differentiate between +error types and HTTP Requests. The when sections are combined with `OR` while +the subkeys (`error`, `request.header.accept`, `request.header.content_type`, +...) are matched with `AND`. Keys that have arrays as values (`error`, +`request.header.accept`, `request.header.content_type`, ...) are usually matched +with `OR`: + +```yaml +# .oathkeeper.yaml +errors: + handlers: + redirect: + enabled: true + config: + when: + - error: + - unauthorized + # OR + - internal_server_error + + # AND + request: + remote_ip: + match: + - 192.168.1.0/24 + # OR + - 192.178.1.0/24 + + # OR + - error: + - forbidden + # OR + - not_found + + # AND + request: + header: + accept: + - text/html + # OR + - text/xhtml + + # AND + content_type: + - application/x-www-form-urlencoded + # OR + - multipart/form-data +``` + +#### Error + +The `config.when.#.error` key may contain zero, one, or multiple error names +that must match for this matching condition to be true. The error names are +derived (lowercase and whitespaces replaced with `_`) from the well-defined +[HTTP Status](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) messages +such as `Not Found`, `Forbidden`, `Internal Server Error`, and so on. + +Here are some examples: + +- `Internal Server Error` (500) -> `{"errors": ["internal_server_error"]}` +- `Forbidden` (403) -> `{"errors": ["forbidden"]}` +- `Not Found` (404) -> `{"errors": ["not_found"]}` +- `Bad Request` (400) -> `{"errors": ["bad_request"]}` + +Keep in mind that these errors must be emitted by ORY Oathkeeper itself, not by +the upstream API. Therefore, most HTTP Status Codes will not have any effect +because ORY Oathkeeper - as of now - mostly returns 401, 403, 500 error codes. + +As discussed previously, if this configuration key is left empty, then all error +types will match! + +#### HTTP Request: Remote IP + +The HTTP Remote IP is the IP of the Client that initially made the request. The +Remote Address is matched using +[CIDR Notation](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing): + +```yaml +config: + when: + - request: + remote_ip: + match: + - 192.168.1.0/24 +``` + +This configuration would match a HTTP Request coming directly from +`192.168.1.1`, `192.168.1.2`, and so on. + +If ORY Oathkeeper runs behind a Load Balancer or any other type of Reverse +Proxy, you can configure ORY Oathkeeper to check the +[`X-Forwarded-For` HTTP Header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For) +header as well: + +```yaml +config: + when: + - request: + remote_ip: + respect_forwarded_for_header: true # defaults to false + match: + - 192.168.1.0/24 +``` + +As discussed previously, if this configuration key is left empty, then all +remote IPs will match! + +HTTP Requests that include one of the matching IP Addresses in the +`X-Forwaded-For` HTTP Header, for example +`X-Forwarded-For: 123.123.123.123, ..., 192.168.1.1, ...`, now match this error +handler. + +#### HTTP Request Header: Accept + +The HTTP `Accept` Header is the most common way to tell an HTTP API what MIME +content type is expected. For example, FireFox sends +`Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8` for +all regular requests (e.g. when opening [www.ory.sh](https://www.ory.sh/)). And +a REST API Client usually sends `Accept: application/json`. + +Therefore, using the `Accept` header is one of the most common ways to +distinguish between "regular" browser traffic, REST API traffic, and other types +of HTTP traffic. + +In ORY Oathkeeper, you can specify the matching conditions for the Accept header +as follows: + +```yaml +config: + when: + - request: + header: + accept: + - text/html + - text/* +``` + +The defined matching condition would apply if a client sends one of the +following `Accept` headers: + +- `Accept: text/html` +- `Accept: text/xhtml` +- `Accept: text/xhtml+xml` +- `Accept: text/...` +- `Accept: text/*` + +Most browsers (see the FireFox example) also send wildcard `Accept` headers such +as `*/*`. To prevent multiple conditions to match, HTTP Accept Headers from the +client are interpreted literally, meaning that wildcards are not interpreted. + +Assuming the client sends `Accept: */*` and the error condition is set to +`accept: ["text/text"]`, the error condition would not match. If however the +client sends `Accept: text/text` and the error condition is set to +`accept: ["*/*"]`, then the condition would match. + +To match against wildcards in the `Accept` header, you have to explicitly define +them in the error condition. Setting the configuration to `accept: ["*/*"]` will +match `Accept: */*` and of course any other type such as `Accept: text/*` +`Accept: text/html`, and so on. + +As discussed previously, if this configuration key is left empty, then all +`Accept` headers will match! + +#### HTTP Request Header: Content-Type + +The +[HTTP Content Type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type) +matcher works similar to the `Accept` header. The HTTP Content Type Header +however is much less common, as it is only used in POST, PUT, PATCH requests (or +any other requests that send a HTTP Body). + +The main difference however is that the client never (unless it sends malformed +data) sends wildcard MIME types, as the MIME type needs to be deterministic. +It's typically something like `multipart/form-data`, +`application/x-www-form-urlencoded`, or `application/json`. + +In ORY Oathkeeper, you can specify the matching conditions for the +`Content-Type` header as follows: + +```yaml +config: + when: + - request: + header: + content_type: + - multipart/form-data + # OR + - application/x-www-form-urlencoded + # OR + - application/json +``` + +As discussed previously, if this configuration key is left empty, then all +`Content-Type` headers will match! + +## Error Handlers + +### `json` + +The `json` Error Handler returns an `application/json` response type. Per +default, error messages are stripped of their details to reduce OSINT attack +surface. You can enable more detailed error messages by setting `verbose` to +`true`. As discussed in the previous section, you can define error matching +conditions under the `when` key. + +**Example** + +```json5 +// access-rule.json +{ + handler: 'json', + config: { + verbose: true, // defaults to false + when: [ + // ... + ], + }, +} +``` + +### `redirect` + +The `redirect` Error Handler returns a HTTP 302/301 response with a `Location` +Header. As discussed in the previous section, you can define error matching +conditions under the `when` key. + +**Example** + +```json5 +// access-rule.json +{ + handler: 'json', + config: { + to: 'http://my-website/login', // required!! + code: 301, // defaults to 302 - only 301 and 302 are supported. + when: [ + // ... + ], + }, +} +``` + +### `www_authenticate` + +The `www_authenticate` Error Handler responds with HTTP 401 and a +[`WWW-Authenticate`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/WWW-Authenticate) +HTTP Header. + +You can configure the `realm` the browser will display. The `realm` is a message +that will be displayed by the browser. Most browsers show a message like "The +website says: ``". Using a real message is thus more appropriate than a +Realm identifier. + +This error handler is "exotic" as WWW-Authenticate is not a common pattern in +today's web. As discussed in the previous section, you can define error matching +conditions under the `when` key. + +**Example** + +```json5 +// access-rule.json +{ + handler: 'json', + config: { + realm: 'Please enter your username and password', // Defaults to `Please authenticate.` + when: [ + // ... + ], + }, +} +``` diff --git a/docs/versioned_docs/version-v0.37/pipeline/index.md b/docs/versioned_docs/version-v0.37/pipeline/index.md new file mode 100644 index 0000000000..c9650ec6f4 --- /dev/null +++ b/docs/versioned_docs/version-v0.37/pipeline/index.md @@ -0,0 +1,132 @@ +--- +id: index +title: Access Rule Pipeline +--- + +Read more about the +[principal components and execution pipeline of access rules](../api-access-rules.md) +if you have not already. This chapter explains the different pipeline handlers +available to you: + +- [Authentication handlers](authn.md) inspect HTTP requests (e.g. the HTTP + Authorization Header) and execute some business logic that return true (for + authentication ok) or false (for authentication invalid) as well as a subject + ("user"). The subject is typically the "user" that made the request, but it + could also be a machine (if you have machine-2-machine interaction) or + something different. +- [Authorization handlers](authz.md): ensure that a subject ("user") has the + right permissions. For example, a specific endpoint might only be accessible + to subjects ("users") from group "admin". The authorizer handles that logic. +- [Mutation handlers](mutator.md): transforms the credentials from incoming + requests to credentials that your backend understands. For example, the + `Authorization: basic` header might be transformed to `X-User: `. + This allows you to write backends that do not care if the original request was + an anonymous one, an OAuth 2.0 Access Token, or some other credential type. + All your backend has to do is understand, for example, the `X-User:`. +- [Error handlers](error.md): are responsible for executing logic after, for + example, authentication or authorization failed. ORY Oathkeeper supports + different error handlers and we will add more as the project progresses. + +## Templating + +Some handlers such as the [ID Token Mutator](mutator.md#id_token) support +templating using [Golang Text Templates](https://golang.org/pkg/text/template/) +([examples](https://blog.gopheracademy.com/advent-2017/using-go-templates/)). +The [sprig](http://masterminds.github.io/sprig/) is also supported, on top of +these two functions: + +```go +var _ = template.FuncMap{ + "print": func(i interface{}) string { + if i == nil { + return "" + } + return fmt.Sprintf("%v", i) + }, + "printIndex": func(element interface{}, i int) string { + if element == nil { + return "" + } + + list := reflect.ValueOf(element) + + if list.Kind() == reflect.Slice && i < list.Len() { + return fmt.Sprintf("%v", list.Index(i)) + } + + return "" + }, +} +``` + +## Session + +In all configurations supporting [templating](#templating) instructions, it's +possible to use the +[`AuthenticationSession`](https://github.com/ory/oathkeeper/blob/master/pipeline/authn/authenticator.go#L39) +struct content. + +```go +type AuthenticationSession struct { + Subject string + Extra map[string]interface{} + Header http.Header + MatchContext MatchContext +} + +type MatchContext struct { + RegexpCaptureGroups []string + URL *url.URL +} +``` + +### RegexpCaptureGroups + +### Configuration Examples + +To use the subject extract to the token + +```json +{ "config_field": "{{ print .subject }}" } +``` + +To use an embedded value in the `Extra` map (most of the time, it's a JWT token +claim) + +```json +{ "config_field": "{{ print .Extra.some.arbitrary.data }}" } +``` + +To use a Regex capture from the request URL +Note the usage of `printIndex` to print a value from the array + +```json +{ + "claims": "{\"aud\": \"{{ print .Extra.aud }}\", \"resource\": \"{{ printIndex .MatchContext.RegexpCaptureGroups 0 }}\"" +} +``` + +To display a string array to JSON format, we can use the +[fmt printf](https://golang.org/pkg/fmt/) function + +```json +{ + "claims": "{\"aud\": \"{{ print .Extra.aud }}\", \"scope\": {{ printf \"%+q\" .Extra.scp }}}" +} +``` + +Note that the `AuthenticationSession` struct has a field named `Extra` which is +a `map[string]interface{}`, which receives varying introspection data from the +authentication process. Because the contents of `Extra` are so variable, nested +and potentially non-existent values need special handling by the `text/template` +parser, and a `print` FuncMap function has been provided to ensure that +non-existent map values will simply return an empty string, rather than +``. + +If you find that your field contain the string `` then you have most +likely omitted the `print` function, and it is recommended you use it for all +values out of an abundance of caution and for consistency. + +In the same way, a `printIndex` FuncMap function is provided to avoid _out of +range_ exception to access in a array. It can be useful for the regexp captures +which depend of the request. diff --git a/docs/versioned_docs/version-v0.37/pipeline/mutator.md b/docs/versioned_docs/version-v0.37/pipeline/mutator.md new file mode 100644 index 0000000000..92e1686df1 --- /dev/null +++ b/docs/versioned_docs/version-v0.37/pipeline/mutator.md @@ -0,0 +1,571 @@ +--- +id: mutator +title: Mutators +--- + +A mutator transforms the credentials from incoming requests to credentials that +your backend understands. For example, the `Authorization: basic` header might +be transformed to `X-User: `. This allows you to write backends that +do not care if the original request was an anonymous one, an OAuth 2.0 Access +Token, or some other credential type. All your backend has to do is understand, +for example, the `X-User:`. + +The Access Control Decision API will return the mutated result as the HTTP +Response. + +## `noop` + +This mutator does not transform the HTTP request and simply forwards the headers +as-is. This is useful if you don't want to replace, for example, +`Authorization: basic` with `X-User: `. + +### Configuration + +```yaml +# Global configuration file oathkeeper.yml +mutators: + noop: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +mutators: + - handler: noop +``` + +### Access Rule Example + +```shell +$ cat ./rules.json +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/api/users/<[0-9]+>/<[a-zA-Z]+>", + "methods": [ + "GET" + ] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "noop" + } + ] +} + +$ curl -X GET http://my-app/some-route + +HTTP/1.0 200 Status OK +The request has been allowed! The original HTTP Request has not been modified. +``` + +## `id_token` + +This mutator takes the authentication information (e.g. subject) and transforms +it to a signed JSON Web Token, and more specifically to an OpenID Connect ID +Token. Your backend can verify the token by fetching the (public) key from the +`/.well-known/jwks.json` endpoint provided by the ORY Oathkeeper API. + +Let's say a request is made to a resource protected by ORY Oathkeeper using +Basic Authorization: + +``` +GET /api/resource HTTP/1.1 +Host: www.example.com +Authorization: Basic Zm9vOmJhcg== +``` + +Assuming that ORY Oathkeeper is granting the access request, +`Basic Zm9vOmJhcg==` will be replaced with a cryptographically signed JSON Web +Token: + +``` +GET /api/resource HTTP/1.1 +Host: internal-api-endpoint-dns +Authorization: Bearer +``` + +Now, the protected resource is capable of decoding and validating the JSON Web +Token using the public key supplied by ORY Oathkeeper's API. The public key for +decoding the ID token is available at ORY Oathkeeper's `/.well-known/jwks.json` +endpoint: + +``` +http://oathkeeper:4456/.well-known/jwks.json +``` + +The related flow diagram looks like this: + +[![ID Token Transformation](https://mermaid.ink/img/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAgICBwYXJ0aWNpcGFudCBPIGFzIE9hdGhrZWVwZXIgUHJveHlcbiAgICBwYXJ0aWNpcGFudCBBIGFzIFByb3RlY3RlZCBTZXJ2ZXIvQVBJXG4gICAgQy0-Pk86IEF1dGhvcml6YXRpb246IEJhc2ljIC4uLi5cbiAgICBPLS0-Pk86IFZhbGlkYXRlIGNyZWRlbnRpYWxzXG4gICAgTy0-PkE6IEF1dGhvcml6YXRpb246IEJlYXJlciBKLlcuVFxuICAgIEEtLT4-TzogRmV0Y2ggUHVibGljIEtleVxuICAgIEEtLT4-QTogVmFsaWRhdGUgSldUIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQiLCJ0aGVtZUNTUyI6Ii5sYWJlbCBmb3JlaWduT2JqZWN0IHsgb3ZlcmZsb3c6IHZpc2libGU7IGZvbnQtc2l6ZTogMTNweCB9In19)](https://mermaid-js.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG4gICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAgICBwYXJ0aWNpcGFudCBPIGFzIE9hdGhrZWVwZXIgUHJveHlcbiAgICBwYXJ0aWNpcGFudCBBIGFzIFByb3RlY3RlZCBTZXJ2ZXIvQVBJXG4gICAgQy0-Pk86IEF1dGhvcml6YXRpb246IEJhc2ljIC4uLi5cbiAgICBPLS0-Pk86IFZhbGlkYXRlIGNyZWRlbnRpYWxzXG4gICAgTy0-PkE6IEF1dGhvcml6YXRpb246IEJlYXJlciBKLlcuVFxuICAgIEEtLT4-TzogRmV0Y2ggUHVibGljIEtleVxuICAgIEEtLT4-QTogVmFsaWRhdGUgSldUIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQiLCJ0aGVtZUNTUyI6Ii5sYWJlbCBmb3JlaWduT2JqZWN0IHsgb3ZlcmZsb3c6IHZpc2libGU7IGZvbnQtc2l6ZTogMTNweCB9In19) + +Let's say the `oauth2_client_credentials` authenticator successfully +authenticated the credentials `client-id:client-secret`. This mutator will craft +an ID Token (JWT) with the following exemplary claims: + +```json +{ + "iss": "https://server.example.com", + "sub": "client-id", + "aud": "s6BhdRkqt3", + "jti": "n-0S6_WzA2Mj", + "exp": 1311281970, + "iat": 1311280970 +} +``` + +The ID Token Claims are as follows: + +- `iss`: Issuer Identifier for the Issuer of the response. The iss value is a + case sensitive URL using the https scheme that contains scheme, host, and + optionally, port number and path components and no query or fragment + components. Typically, this is the URL of ORY Oathkeeper, for example: + `https://oathkeeper.myapi.com`. +- `sub`: Subject Identifier. A locally unique and never reassigned identifier + within the Issuer for the End-User, which is intended to be consumed by the + Client, e.g., 24400320 or AItOawmwtWwcT0k51BayewNvutrJUqsvl6qs7A4. It must not + exceed 255 ASCII characters in length. The sub value is a case sensitive + string. The End-User might also be an OAuth 2.0 Client, given that the access + token was granted using the OAuth 2.0 Client Credentials flow. +- `aud`: Audience(s) that this ID Token is intended for. It MUST contain the + OAuth 2.0 client_id of the Relying Party as an audience value. It MAY also + contain identifiers for other audiences. In the general case, the aud value is + an array of case sensitive strings. +- `exp`: Expiration time on or after which the ID Token MUST NOT be accepted for + processing. The processing of this parameter requires that the current + date/time MUST be before the expiration date/time listed in the value. Its + value is a JSON number representing the number of seconds from + 1970-01-01T0:0:0Z as measured in UTC until the date/time. See RFC 3339 + [RFC3339] for details regarding date/times in general and UTC in particular. +- `iat`: Time at which the JWT was issued. Its value is a JSON number + representing the number of seconds from 1970-01-01T0:0:0Z as measured in UTC + until the date/time. +- `jti`: A cryptographically strong random identifier to ensure the ID Token's + uniqueness. + +### Global Configuration + +### Configuration + +- `issuer_url` (string, required) - Sets the "iss" value of the ID Token. +- `jwks_url` (string, required) - Sets the URL where keys should be fetched + from. Supports remote locations (http, https) as well as local filesystem + paths. +- `ttl` (string, optional) - Sets the time-to-live of the ID token. Defaults to + one minute. Valid time units are: s (second), m (minute), h (hour). +- `claims` (string, optional) - Allows you to customize the ID Token claims and + support Go Templates. For more information, check section [Claims](#claims) + +```yaml +# Global configuration file oathkeeper.yml +mutators: + id_token: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + config: + issuer_url: https://my-oathkeeper/ + jwks_url: https://fetch-keys/from/this/location.json + # jwks_url: file:///from/this/absolute/location.json + # jwks_url: file://../from/this/relative/location.json + ttl: 60s + claims: + '{"aud": ["https://my-backend-service/some/endpoint"],"def": "{{ print + .Extra.some.arbitrary.data }}"}' +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +mutators: + - handler: id_token + config: + issuer_url: https://my-oathkeeper/ + jwks_url: https://fetch-keys/from/this/location.json + # jwks_url: file:///from/this/absolute/location.json + # jwks_url: file://../from/this/relative/location.json + ttl: 60s + claims: + '{"aud": ["https://my-backend-service/some/endpoint"],"def": "{{ print + .Extra.some.arbitrary.data }}"}' +``` + +The first private key found in the JSON Web Key Set defined by +`mutators.id_token.jwks_url` will be used for signing the JWT: + +- If the first key found is a symmetric key (`HS256` algorithm), that key will + be used. That key **will not** be broadcasted at `/.well-known/jwks.json`. You + must manually configure the upstream to be able to fetch the key (e.g. from an + environment variable). +- If the first key found is an asymmetric private key (e.g. `RS256`, `ES256`, + ...), that key will be used. The related public key will be broadcasted at + `/.well-known/jwks.json`. + +#### Claims + +This mutator allows you to specify custom claims, like the audience of ID +tokens, via the `claims` field of the mutator's `config` field. The keys +represent names of claims and the values are arbitrary data structures which +will be parsed by the Go [text/template](https://golang.org/pkg/text/template/) +package for value substitution, receiving the `AuthenticationSession` struct. + +For more details please check [Session variables](index.md#session) + +The claims configuration expects a string which is expected to be valid JSON: + +```json +{ + "handler": "id_token", + "config": { + "claims": "{\"aud\": [\"https://my-backend-service/some/endpoint\"],\"def\": \"{{ print .Extra.some.arbitrary.data }}\"}" + } +} +``` + +Please keep in mind that certain keys (such as the `sub`) claim **can not** be +overwritten! + +### Access Rule Example + +```shell +$ cat ./rules.json +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/api/users/<[0-9]+>/<[a-zA-Z]+>", + "methods": [ + "GET" + ] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "id_token", + "config": { + "aud": [ + "audience-1", + "audience-2" + ], + "claims": "{\"abc\": \"{{ print .Subject }}\",\"def\": \"{{ print .Extra.some.arbitrary.data }}\"}" + } + } + ] +} +``` + +## `header` + +This mutator will transform the request, allowing you to pass the credentials to +the upstream application via the headers. This will augment, for example, +`Authorization: basic` with `X-User: `. + +### Configuration + +- `headers` (object (`string: string`), required) - A keyed object + (`string:string`) representing the headers to be added to this request, see + section [headers](#headers). + +```yaml +# Global configuration file oathkeeper.yml +mutators: + header: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + config: + headers: + X-User: '{{ print .Subject }}' + X-Some-Arbitrary-Data: '{{ print .Extra.some.arbitrary.data }}' +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +mutators: + - handler: header + config: + headers: + X-User: '{{ print .Subject }}' + X-Some-Arbitrary-Data: '{{ print .Extra.some.arbitrary.data }}' +``` + +#### Headers + +The headers are specified via the `headers` field of the mutator's `config` +field. The keys are the header name and the values are a string which will be +parsed by the Go [`text/template`](https://golang.org/pkg/text/template/) +package for value substitution, receiving the `AuthenticationSession` struct. + +For more details please check [Session variables](index.md#session) + +### Access Rule Example + +```json +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/api/<.*>", + "methods": ["GET"] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "header", + "config": { + "headers": { + "X-User": "{{ print .Subject }}", + "X-Some-Arbitrary-Data": "{{ print .Extra.some.arbitrary.data }}" + } + } + } + ] +} +``` + +## `cookie` + +This mutator will transform the request, allowing you to pass the credentials to +the upstream application via the cookies. + +### Configuration + +- `cookies` (object (`string: string`), required) - A keyed object + (`string:string`) representing the cookies to be added to this request, see + section [cookies](#cookies). + +```yaml +# Global configuration file oathkeeper.yml +mutators: + cookie: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + config: + cookies: + user: "{{ print .Subject }}", + some-arbitrary-data: "{{ print .Extra.some.arbitrary.data }}" +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +mutators: + - handler: cookie + config: + cookies: + user: "{{ print .Subject }}", + some-arbitrary-data: "{{ print .Extra.some.arbitrary.data }}" +``` + +### Cookies + +The cookies are specified via the `cookies` field of the mutators `config` +field. The keys are the cookie name and the values are a string which will be +parsed by the Go [`text/template`](https://golang.org/pkg/text/template/) +package for value substitution, receiving the `AuthenticationSession` struct. + +For more details please check [Session variables](index.md#session) + +##### Example + +```json +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/api/<.*>", + "methods": ["GET"] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "cookie", + "config": { + "cookies": { + "user": "{{ print .Subject }}", + "some-arbitrary-data": "{{ print .Extra.some.arbitrary.data }}" + } + } + } + ] +} +``` + +## `hydrator` + +This mutator allows for fetching additional data from external APIs, which can +be then used by other mutators. It works by making an upstream HTTP call to an +API specified in the **Per-Rule Configuration** section below. The request is a +POST request and it contains JSON representation of +[AuthenticationSession](https://github.com/ory/oathkeeper/blob/master/pipeline/authn/authenticator.go#L39) +struct in body, which is: + +```json +{ + "subject": String, + "extra": Object, + "header": Object, + "match_context": { + "regexp_capture_groups": Object, + "url": Object + } +} +``` + +As a response the mutator expects similiar JSON object, but with `extra` or +`header` fields modified. + +Example request/response payload: + +```json +{ + "subject": "anonymous", + "extra": { + "foo": "bar" + }, + "header": { + "foo": ["bar1", "bar2"] + }, + "match_context": { + "regexp_capture_groups": ["http", "foo"], + "url": "http://domain.com/foo" + } +} +``` + +The AuthenticationSession from this object replaces the original one and is +passed to the next mutator, where it can be used to e.g. set a particular cookie +to the value received from an API. + +Setting `extra` field does not transform the HTTP request, whereas headers set +in the `header` field will be added to the final request headers. + +### Configuration + +- `api.url` (string - required) - The API URL. +- `api.auth.basic.*` (optional) - Enables HTTP Basic Authorization. +- `api.auth.retry.*` (optional) - Configures the retry logic. + +```yaml +# Global configuration file oathkeeper.yml +mutators: + hydrator: + # Set enabled to true if the authenticator should be enabled and false to disable the authenticator. Defaults to false. + enabled: true + config: + api: + url: http://my-backend-api + auth: + basic: + username: someUserName + password: somePassword + retry: + give_up_after: 2s + max_delay: 100ms +``` + +```yaml +# Some Access Rule: access-rule-1.yaml +id: access-rule-1 +# match: ... +# upstream: ... +mutators: + - handler: hydrator + config: + api: + url: http://my-backend-api + auth: + basic: + username: someUserName + password: somePassword + retry: + give_up_after: 2s + max_delay: 100ms +``` + +### Access Rule Example + +```json +{ + "id": "some-id", + "upstream": { + "url": "http://my-backend-service" + }, + "match": { + "url": "http://my-app/api/<.*>", + "methods": ["GET"] + }, + "authenticators": [ + { + "handler": "anonymous" + } + ], + "authorizer": { + "handler": "allow" + }, + "mutators": [ + { + "handler": "hydrator", + "config": { + "api": { + "url": "http://my-backend-api" + } + } + }, + { + "handler": "cookie", + "config": { + "cookies": { + "some-arbitrary-data": "{{ print .Extra.cookie }}" + } + } + } + ] +} +``` diff --git a/docs/versioned_docs/version-v0.37/reference/api.md b/docs/versioned_docs/version-v0.37/reference/api.md new file mode 100644 index 0000000000..6215eb28c0 --- /dev/null +++ b/docs/versioned_docs/version-v0.37/reference/api.md @@ -0,0 +1,1764 @@ +--- +title: REST API +id: api +--- + + + +ORY Oathkeeper is a reverse proxy that checks the HTTP Authorization for validity against a set of rules. This service uses Hydra to validate access tokens and policies. + +> You are viewing REST API documentation. This documentation is auto-generated from a swagger specification which +itself is generated from annotations in the source code of the project. It is possible that this documentation includes +bugs and that code samples are incomplete or wrong. +> +> If you find issues in the respective documentation, please do not edit the +Markdown files directly (as they are generated) but raise an issue on the project's GitHub presence instead. This documentation +will improve over time with your help! If you have ideas how to improve this part of the documentation, feel free to +share them in a [GitHub issue](https://github.com/ory/docs/issues/new) any time. + + +## api + + + +### Lists cryptographic keys + +``` +GET /.well-known/jwks.json HTTP/1.1 +Accept: application/json + +``` + +This endpoint returns cryptographic keys that are required to, for example, verify signatures of ID Tokens. + +#### Responses + + +##### Overview + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|jsonWebKeySet|[jsonWebKeySet](#schemajsonwebkeyset)| +|500|[Internal Server Error](https://tools.ietf.org/html/rfc7231#section-6.6.1)|The standard error format|Inline| + + +##### Response Schema + +Status Code **500** + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ยป code|integer(int64)|false|none|none| +|ยป details|[object]|false|none|none| +|ยปยป **additionalProperties**|object|false|none|none| +|ยป message|string|false|none|none| +|ยป reason|string|false|none|none| +|ยป request|string|false|none|none| +|ยป status|string|false|none|none| + +##### Examples + +###### 200 response + +```json +{ + "keys": [ + { + "alg": "string", + "crv": "string", + "d": "string", + "dp": "string", + "dq": "string", + "e": "string", + "k": "string", + "kid": "string", + "kty": "string", + "n": "string", + "p": "string", + "q": "string", + "qi": "string", + "use": "string", + "x": "string", + "x5c": [ + "string" + ], + "y": "string" + } + ] +} +``` + + + +#### Code samples + +
+ +
+
+ +```shell +curl -X GET /.well-known/jwks.json \ + -H 'Accept: application/json' +``` + +
+
+ +```go +package main + +import ( + "bytes" + "net/http" +) + +func main() { + headers := map[string][]string{ + "Accept": []string{"application/json"}, + } + + var body []byte + // body = ... + + req, err := http.NewRequest("GET", "/.well-known/jwks.json", bytes.NewBuffer(body)) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} +``` + +
+
+ +```nodejs +const fetch = require('node-fetch'); + +const headers = { + 'Accept': 'application/json' +} + +fetch('/.well-known/jwks.json', { + method: 'GET', + headers +}) +.then(r => r.json()) +.then((body) => { + console.log(body) +}) +``` + +
+
+ +```java +// This sample needs improvement. +URL obj = new URL("/.well-known/jwks.json"); + +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("GET"); + +int responseCode = con.getResponseCode(); + +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream()) +); + +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); + +System.out.println(response.toString()); +``` + +
+
+ +```python +import requests + +headers = { + 'Accept': 'application/json' +} + +r = requests.get( + '/.well-known/jwks.json', + params={}, + headers = headers) + +print r.json() +``` + +
+
+ +```ruby +require 'rest-client' +require 'json' + +headers = { + 'Accept' => 'application/json' +} + +result = RestClient.get '/.well-known/jwks.json', + params: {}, headers: headers + +p JSON.parse(result) +``` + +
+
+
+ + + +### Access Control Decision API + +``` +GET /decisions HTTP/1.1 +Accept: application/json + +``` + +> This endpoint works with all HTTP Methods (GET, POST, PUT, ...) and matches every path prefixed with /decision. + +This endpoint mirrors the proxy capability of ORY Oathkeeper's proxy functionality but instead of forwarding the +request to the upstream server, returns 200 (request should be allowed), 401 (unauthorized), or 403 (forbidden) +status codes. This endpoint can be used to integrate with other API Proxies like Ambassador, Kong, Envoy, and many more. + +#### Responses + + +##### Overview + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|An empty response|None| +|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|The standard error format|Inline| +|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|The standard error format|Inline| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|The standard error format|Inline| +|500|[Internal Server Error](https://tools.ietf.org/html/rfc7231#section-6.6.1)|The standard error format|Inline| + + +##### Response Schema + +Status Code **401** + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ยป code|integer(int64)|false|none|none| +|ยป details|[object]|false|none|none| +|ยปยป **additionalProperties**|object|false|none|none| +|ยป message|string|false|none|none| +|ยป reason|string|false|none|none| +|ยป request|string|false|none|none| +|ยป status|string|false|none|none| + +Status Code **403** + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ยป code|integer(int64)|false|none|none| +|ยป details|[object]|false|none|none| +|ยปยป **additionalProperties**|object|false|none|none| +|ยป message|string|false|none|none| +|ยป reason|string|false|none|none| +|ยป request|string|false|none|none| +|ยป status|string|false|none|none| + +Status Code **404** + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ยป code|integer(int64)|false|none|none| +|ยป details|[object]|false|none|none| +|ยปยป **additionalProperties**|object|false|none|none| +|ยป message|string|false|none|none| +|ยป reason|string|false|none|none| +|ยป request|string|false|none|none| +|ยป status|string|false|none|none| + +Status Code **500** + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ยป code|integer(int64)|false|none|none| +|ยป details|[object]|false|none|none| +|ยปยป **additionalProperties**|object|false|none|none| +|ยป message|string|false|none|none| +|ยป reason|string|false|none|none| +|ยป request|string|false|none|none| +|ยป status|string|false|none|none| + +##### Examples + +###### 401 response + +```json +{ + "code": 0, + "details": [ + { + "property1": {}, + "property2": {} + } + ], + "message": "string", + "reason": "string", + "request": "string", + "status": "string" +} +``` + + + +#### Code samples + +
+ +
+
+ +```shell +curl -X GET /decisions \ + -H 'Accept: application/json' +``` + +
+
+ +```go +package main + +import ( + "bytes" + "net/http" +) + +func main() { + headers := map[string][]string{ + "Accept": []string{"application/json"}, + } + + var body []byte + // body = ... + + req, err := http.NewRequest("GET", "/decisions", bytes.NewBuffer(body)) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} +``` + +
+
+ +```nodejs +const fetch = require('node-fetch'); + +const headers = { + 'Accept': 'application/json' +} + +fetch('/decisions', { + method: 'GET', + headers +}) +.then(r => r.json()) +.then((body) => { + console.log(body) +}) +``` + +
+
+ +```java +// This sample needs improvement. +URL obj = new URL("/decisions"); + +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("GET"); + +int responseCode = con.getResponseCode(); + +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream()) +); + +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); + +System.out.println(response.toString()); +``` + +
+
+ +```python +import requests + +headers = { + 'Accept': 'application/json' +} + +r = requests.get( + '/decisions', + params={}, + headers = headers) + +print r.json() +``` + +
+
+ +```ruby +require 'rest-client' +require 'json' + +headers = { + 'Accept' => 'application/json' +} + +result = RestClient.get '/decisions', + params: {}, headers: headers + +p JSON.parse(result) +``` + +
+
+
+ + + +### List all rules + +``` +GET /rules HTTP/1.1 +Accept: application/json + +``` + +This method returns an array of all rules that are stored in the backend. This is useful if you want to get a full +view of what rules you have currently in place. + + +##### Parameters + +|Parameter|In|Type|Required|Description| +|---|---|---|---|---| +|limit|query|integer(int64)|false|The maximum amount of rules returned.| +|offset|query|integer(int64)|false|The offset from where to start looking.| + +#### Responses + + +##### Overview + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|A list of rules|Inline| +|500|[Internal Server Error](https://tools.ietf.org/html/rfc7231#section-6.6.1)|The standard error format|Inline| + + +##### Response Schema + +Status Code **200** + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|*anonymous*|[[rule](#schemarule)]|false|none|none| +|ยป swaggerRule is a single rule that will get checked on every HTTP request.|[rule](#schemarule)|false|none|none| +|ยปยป authenticators|[[ruleHandler](#schemarulehandler)]|false|none|Authenticators is a list of authentication handlers that will try and authenticate the provided credentials. Authenticators are checked iteratively from index 0 to n and if the first authenticator to return a positive result will be the one used. If you want the rule to first check a specific authenticator before "falling back" to others, have that authenticator as the first item in the array.| +|ยปยปยป config|object|false|none|Config contains the configuration for the handler. Please read the user guide for a complete list of each handler's available settings.| +|ยปยปยป handler|string|false|none|Handler identifies the implementation which will be used to handle this specific request. Please read the user guide for a complete list of available handlers.| +|ยปยป authorizer|[ruleHandler](#schemarulehandler)|false|none|none| +|ยปยป description|string|false|none|Description is a human readable description of this rule.| +|ยปยป id|string|false|none|ID is the unique id of the rule. It can be at most 190 characters long, but the layout of the ID is up to you. You will need this ID later on to update or delete the rule.| +|ยปยป match|[ruleMatch](#schemarulematch)|false|none|none| +|ยปยปยป methods|[string]|false|none|An array of HTTP methods (e.g. GET, POST, PUT, DELETE, ...). When ORY Oathkeeper searches for rules to decide what to do with an incoming request to the proxy server, it compares the HTTP method of the incoming request with the HTTP methods of each rules. If a match is found, the rule is considered a partial match. If the matchesUrl field is satisfied as well, the rule is considered a full match.| +|ยปยปยป url|string|false|none|This field represents the URL pattern this rule matches. When ORY Oathkeeper searches for rules to decide what to do with an incoming request to the proxy server, it compares the full request URL (e.g. https://mydomain.com/api/resource) without query parameters of the incoming request with this field. If a match is found, the rule is considered a partial match. If the matchesMethods field is satisfied as well, the rule is considered a full match. You can use regular expressions in this field to match more than one url. Regular expressions are encapsulated in brackets < and >. The following example matches all paths of the domain `mydomain.com`: `https://mydomain.com/<.*>`.| +|ยปยป mutators|[[ruleHandler](#schemarulehandler)]|false|none|Mutators is a list of mutation handlers that transform the HTTP request. A common use case is generating a new set of credentials (e.g. JWT) which then will be forwarded to the upstream server. Mutations are performed iteratively from index 0 to n and should all succeed in order for the HTTP request to be forwarded.| +|ยปยป upstream|[Upstream](#schemaupstream)|false|none|none| +|ยปยปยป preserve_host|boolean|false|none|PreserveHost, if false (the default), tells ORY Oathkeeper to set the upstream request's Host header to the hostname of the API's upstream's URL. Setting this flag to true instructs ORY Oathkeeper not to do so.| +|ยปยปยป strip_path|string|false|none|StripPath if set, replaces the provided path prefix when forwarding the requested URL to the upstream URL.| +|ยปยปยป url|string|false|none|URL is the URL the request will be proxied to.| + +Status Code **500** + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ยป code|integer(int64)|false|none|none| +|ยป details|[object]|false|none|none| +|ยปยป **additionalProperties**|object|false|none|none| +|ยป message|string|false|none|none| +|ยป reason|string|false|none|none| +|ยป request|string|false|none|none| +|ยป status|string|false|none|none| + +##### Examples + +###### 200 response + +```json +[ + { + "authenticators": [ + { + "config": {}, + "handler": "string" + } + ], + "authorizer": { + "config": {}, + "handler": "string" + }, + "description": "string", + "id": "string", + "match": { + "methods": [ + "string" + ], + "url": "string" + }, + "mutators": [ + { + "config": {}, + "handler": "string" + } + ], + "upstream": { + "preserve_host": true, + "strip_path": "string", + "url": "string" + } + } +] +``` + + + +#### Code samples + +
+ +
+
+ +```shell +curl -X GET /rules \ + -H 'Accept: application/json' +``` + +
+
+ +```go +package main + +import ( + "bytes" + "net/http" +) + +func main() { + headers := map[string][]string{ + "Accept": []string{"application/json"}, + } + + var body []byte + // body = ... + + req, err := http.NewRequest("GET", "/rules", bytes.NewBuffer(body)) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} +``` + +
+
+ +```nodejs +const fetch = require('node-fetch'); + +const headers = { + 'Accept': 'application/json' +} + +fetch('/rules', { + method: 'GET', + headers +}) +.then(r => r.json()) +.then((body) => { + console.log(body) +}) +``` + +
+
+ +```java +// This sample needs improvement. +URL obj = new URL("/rules"); + +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("GET"); + +int responseCode = con.getResponseCode(); + +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream()) +); + +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); + +System.out.println(response.toString()); +``` + +
+
+ +```python +import requests + +headers = { + 'Accept': 'application/json' +} + +r = requests.get( + '/rules', + params={}, + headers = headers) + +print r.json() +``` + +
+
+ +```ruby +require 'rest-client' +require 'json' + +headers = { + 'Accept' => 'application/json' +} + +result = RestClient.get '/rules', + params: {}, headers: headers + +p JSON.parse(result) +``` + +
+
+
+ + + +### Retrieve a rule + +``` +GET /rules/{id} HTTP/1.1 +Accept: application/json + +``` + +Use this method to retrieve a rule from the storage. If it does not exist you will receive a 404 error. + + +##### Parameters + +|Parameter|In|Type|Required|Description| +|---|---|---|---|---| +|id|path|string|true|none| + +#### Responses + + +##### Overview + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|A rule|[rule](#schemarule)| +|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|The standard error format|Inline| +|500|[Internal Server Error](https://tools.ietf.org/html/rfc7231#section-6.6.1)|The standard error format|Inline| + + +##### Response Schema + +Status Code **404** + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ยป code|integer(int64)|false|none|none| +|ยป details|[object]|false|none|none| +|ยปยป **additionalProperties**|object|false|none|none| +|ยป message|string|false|none|none| +|ยป reason|string|false|none|none| +|ยป request|string|false|none|none| +|ยป status|string|false|none|none| + +Status Code **500** + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ยป code|integer(int64)|false|none|none| +|ยป details|[object]|false|none|none| +|ยปยป **additionalProperties**|object|false|none|none| +|ยป message|string|false|none|none| +|ยป reason|string|false|none|none| +|ยป request|string|false|none|none| +|ยป status|string|false|none|none| + +##### Examples + +###### 200 response + +```json +{ + "authenticators": [ + { + "config": {}, + "handler": "string" + } + ], + "authorizer": { + "config": {}, + "handler": "string" + }, + "description": "string", + "id": "string", + "match": { + "methods": [ + "string" + ], + "url": "string" + }, + "mutators": [ + { + "config": {}, + "handler": "string" + } + ], + "upstream": { + "preserve_host": true, + "strip_path": "string", + "url": "string" + } +} +``` + + + +#### Code samples + +
+ +
+
+ +```shell +curl -X GET /rules/{id} \ + -H 'Accept: application/json' +``` + +
+
+ +```go +package main + +import ( + "bytes" + "net/http" +) + +func main() { + headers := map[string][]string{ + "Accept": []string{"application/json"}, + } + + var body []byte + // body = ... + + req, err := http.NewRequest("GET", "/rules/{id}", bytes.NewBuffer(body)) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} +``` + +
+
+ +```nodejs +const fetch = require('node-fetch'); + +const headers = { + 'Accept': 'application/json' +} + +fetch('/rules/{id}', { + method: 'GET', + headers +}) +.then(r => r.json()) +.then((body) => { + console.log(body) +}) +``` + +
+
+ +```java +// This sample needs improvement. +URL obj = new URL("/rules/{id}"); + +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("GET"); + +int responseCode = con.getResponseCode(); + +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream()) +); + +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); + +System.out.println(response.toString()); +``` + +
+
+ +```python +import requests + +headers = { + 'Accept': 'application/json' +} + +r = requests.get( + '/rules/{id}', + params={}, + headers = headers) + +print r.json() +``` + +
+
+ +```ruby +require 'rest-client' +require 'json' + +headers = { + 'Accept' => 'application/json' +} + +result = RestClient.get '/rules/{id}', + params: {}, headers: headers + +p JSON.parse(result) +``` + +
+
+
+ + +## health + + + +### Check alive status + +``` +GET /health/alive HTTP/1.1 +Accept: application/json + +``` + +This endpoint returns a 200 status code when the HTTP server is up running. +This status does currently not include checks whether the database connection is working. + +If the service supports TLS Edge Termination, this endpoint does not require the +`X-Forwarded-Proto` header to be set. + +Be aware that if you are running multiple nodes of this service, the health status will never +refer to the cluster state, only to a single instance. + +#### Responses + + +##### Overview + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|healthStatus|[healthStatus](#schemahealthstatus)| +|500|[Internal Server Error](https://tools.ietf.org/html/rfc7231#section-6.6.1)|The standard error format|Inline| + + +##### Response Schema + +Status Code **500** + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|ยป code|integer(int64)|false|none|none| +|ยป details|[object]|false|none|none| +|ยปยป **additionalProperties**|object|false|none|none| +|ยป message|string|false|none|none| +|ยป reason|string|false|none|none| +|ยป request|string|false|none|none| +|ยป status|string|false|none|none| + +##### Examples + +###### 200 response + +```json +{ + "status": "string" +} +``` + + + +#### Code samples + +
+ +
+
+ +```shell +curl -X GET /health/alive \ + -H 'Accept: application/json' +``` + +
+
+ +```go +package main + +import ( + "bytes" + "net/http" +) + +func main() { + headers := map[string][]string{ + "Accept": []string{"application/json"}, + } + + var body []byte + // body = ... + + req, err := http.NewRequest("GET", "/health/alive", bytes.NewBuffer(body)) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} +``` + +
+
+ +```nodejs +const fetch = require('node-fetch'); + +const headers = { + 'Accept': 'application/json' +} + +fetch('/health/alive', { + method: 'GET', + headers +}) +.then(r => r.json()) +.then((body) => { + console.log(body) +}) +``` + +
+
+ +```java +// This sample needs improvement. +URL obj = new URL("/health/alive"); + +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("GET"); + +int responseCode = con.getResponseCode(); + +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream()) +); + +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); + +System.out.println(response.toString()); +``` + +
+
+ +```python +import requests + +headers = { + 'Accept': 'application/json' +} + +r = requests.get( + '/health/alive', + params={}, + headers = headers) + +print r.json() +``` + +
+
+ +```ruby +require 'rest-client' +require 'json' + +headers = { + 'Accept' => 'application/json' +} + +result = RestClient.get '/health/alive', + params: {}, headers: headers + +p JSON.parse(result) +``` + +
+
+
+ + + +### Check readiness status + +``` +GET /health/ready HTTP/1.1 +Accept: application/json + +``` + +This endpoint returns a 200 status code when the HTTP server is up running and the environment dependencies (e.g. +the database) are responsive as well. + +If the service supports TLS Edge Termination, this endpoint does not require the +`X-Forwarded-Proto` header to be set. + +Be aware that if you are running multiple nodes of this service, the health status will never +refer to the cluster state, only to a single instance. + +#### Responses + + +##### Overview + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|healthStatus|[healthStatus](#schemahealthstatus)| +|503|[Service Unavailable](https://tools.ietf.org/html/rfc7231#section-6.6.4)|healthNotReadyStatus|[healthNotReadyStatus](#schemahealthnotreadystatus)| + +##### Examples + +###### 200 response + +```json +{ + "status": "string" +} +``` + + + +#### Code samples + +
+ +
+
+ +```shell +curl -X GET /health/ready \ + -H 'Accept: application/json' +``` + +
+
+ +```go +package main + +import ( + "bytes" + "net/http" +) + +func main() { + headers := map[string][]string{ + "Accept": []string{"application/json"}, + } + + var body []byte + // body = ... + + req, err := http.NewRequest("GET", "/health/ready", bytes.NewBuffer(body)) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} +``` + +
+
+ +```nodejs +const fetch = require('node-fetch'); + +const headers = { + 'Accept': 'application/json' +} + +fetch('/health/ready', { + method: 'GET', + headers +}) +.then(r => r.json()) +.then((body) => { + console.log(body) +}) +``` + +
+
+ +```java +// This sample needs improvement. +URL obj = new URL("/health/ready"); + +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("GET"); + +int responseCode = con.getResponseCode(); + +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream()) +); + +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); + +System.out.println(response.toString()); +``` + +
+
+ +```python +import requests + +headers = { + 'Accept': 'application/json' +} + +r = requests.get( + '/health/ready', + params={}, + headers = headers) + +print r.json() +``` + +
+
+ +```ruby +require 'rest-client' +require 'json' + +headers = { + 'Accept' => 'application/json' +} + +result = RestClient.get '/health/ready', + params: {}, headers: headers + +p JSON.parse(result) +``` + +
+
+
+ + +## version + + + +### Get service version + +``` +GET /version HTTP/1.1 +Accept: application/json + +``` + +This endpoint returns the service version typically notated using semantic versioning. + +If the service supports TLS Edge Termination, this endpoint does not require the +`X-Forwarded-Proto` header to be set. + +Be aware that if you are running multiple nodes of this service, the health status will never +refer to the cluster state, only to a single instance. + +#### Responses + + +##### Overview + +|Status|Meaning|Description|Schema| +|---|---|---|---| +|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|version|[version](#schemaversion)| + +##### Examples + +###### 200 response + +```json +{ + "version": "string" +} +``` + + + +#### Code samples + +
+ +
+
+ +```shell +curl -X GET /version \ + -H 'Accept: application/json' +``` + +
+
+ +```go +package main + +import ( + "bytes" + "net/http" +) + +func main() { + headers := map[string][]string{ + "Accept": []string{"application/json"}, + } + + var body []byte + // body = ... + + req, err := http.NewRequest("GET", "/version", bytes.NewBuffer(body)) + req.Header = headers + + client := &http.Client{} + resp, err := client.Do(req) + // ... +} +``` + +
+
+ +```nodejs +const fetch = require('node-fetch'); + +const headers = { + 'Accept': 'application/json' +} + +fetch('/version', { + method: 'GET', + headers +}) +.then(r => r.json()) +.then((body) => { + console.log(body) +}) +``` + +
+
+ +```java +// This sample needs improvement. +URL obj = new URL("/version"); + +HttpURLConnection con = (HttpURLConnection) obj.openConnection(); +con.setRequestMethod("GET"); + +int responseCode = con.getResponseCode(); + +BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream()) +); + +String inputLine; +StringBuffer response = new StringBuffer(); +while ((inputLine = in.readLine()) != null) { + response.append(inputLine); +} +in.close(); + +System.out.println(response.toString()); +``` + +
+
+ +```python +import requests + +headers = { + 'Accept': 'application/json' +} + +r = requests.get( + '/version', + params={}, + headers = headers) + +print r.json() +``` + +
+
+ +```ruby +require 'rest-client' +require 'json' + +headers = { + 'Accept' => 'application/json' +} + +result = RestClient.get '/version', + params: {}, headers: headers + +p JSON.parse(result) +``` + +
+
+
+ +## Schemas + +Upstream +#### Upstream + + + +```json +{ + "preserve_host": true, + "strip_path": "string", + "url": "string" +} + +``` + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|preserve_host|boolean|false|none|PreserveHost, if false (the default), tells ORY Oathkeeper to set the upstream request's Host header to the hostname of the API's upstream's URL. Setting this flag to true instructs ORY Oathkeeper not to do so.| +|strip_path|string|false|none|StripPath if set, replaces the provided path prefix when forwarding the requested URL to the upstream URL.| +|url|string|false|none|URL is the URL the request will be proxied to.| + +healthNotReadyStatus +#### healthNotReadyStatus + + + +```json +{ + "errors": { + "property1": "string", + "property2": "string" + } +} + +``` + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|errors|object|false|none|Errors contains a list of errors that caused the not ready status.| +|ยป **additionalProperties**|string|false|none|none| + +healthStatus +#### healthStatus + + + +```json +{ + "status": "string" +} + +``` + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|status|string|false|none|Status always contains "ok".| + +jsonWebKey +#### jsonWebKey + + + +```json +{ + "alg": "string", + "crv": "string", + "d": "string", + "dp": "string", + "dq": "string", + "e": "string", + "k": "string", + "kid": "string", + "kty": "string", + "n": "string", + "p": "string", + "q": "string", + "qi": "string", + "use": "string", + "x": "string", + "x5c": [ + "string" + ], + "y": "string" +} + +``` + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|alg|string|false|none|The "alg" (algorithm) parameter identifies the algorithm intended for use with the key. The values used should either be registered in the IANA "JSON Web Signature and Encryption Algorithms" registry established by [JWA] or be a value that contains a Collision- Resistant Name.| +|crv|string|false|none|none| +|d|string|false|none|none| +|dp|string|false|none|none| +|dq|string|false|none|none| +|e|string|false|none|none| +|k|string|false|none|none| +|kid|string|false|none|The "kid" (key ID) parameter is used to match a specific key. This is used, for instance, to choose among a set of keys within a JWK Set during key rollover. The structure of the "kid" value is unspecified. When "kid" values are used within a JWK Set, different keys within the JWK Set SHOULD use distinct "kid" values. (One example in which different keys might use the same "kid" value is if they have different "kty" (key type) values but are considered to be equivalent alternatives by the application using them.) The "kid" value is a case-sensitive string.| +|kty|string|false|none|The "kty" (key type) parameter identifies the cryptographic algorithm family used with the key, such as "RSA" or "EC". "kty" values should either be registered in the IANA "JSON Web Key Types" registry established by [JWA] or be a value that contains a Collision- Resistant Name. The "kty" value is a case-sensitive string.| +|n|string|false|none|none| +|p|string|false|none|none| +|q|string|false|none|none| +|qi|string|false|none|none| +|use|string|false|none|The "use" (public key use) parameter identifies the intended use of the public key. The "use" parameter is employed to indicate whether a public key is used for encrypting data or verifying the signature on data. Values are commonly "sig" (signature) or "enc" (encryption).| +|x|string|false|none|none| +|x5c|[string]|false|none|The "x5c" (X.509 certificate chain) parameter contains a chain of one or more PKIX certificates [RFC5280]. The certificate chain is represented as a JSON array of certificate value strings. Each string in the array is a base64-encoded (Section 4 of [RFC4648] -- not base64url-encoded) DER [ITU.X690.1994] PKIX certificate value. The PKIX certificate containing the key value MUST be the first certificate.| +|y|string|false|none|none| + +jsonWebKeySet +#### jsonWebKeySet + + + +```json +{ + "keys": [ + { + "alg": "string", + "crv": "string", + "d": "string", + "dp": "string", + "dq": "string", + "e": "string", + "k": "string", + "kid": "string", + "kty": "string", + "n": "string", + "p": "string", + "q": "string", + "qi": "string", + "use": "string", + "x": "string", + "x5c": [ + "string" + ], + "y": "string" + } + ] +} + +``` + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|keys|[[jsonWebKey](#schemajsonwebkey)]|false|none|The value of the "keys" parameter is an array of JWK values. By default, the order of the JWK values within the array does not imply an order of preference among them, although applications of JWK Sets can choose to assign a meaning to the order for their purposes, if desired.| + +rule +#### rule + + + +```json +{ + "authenticators": [ + { + "config": {}, + "handler": "string" + } + ], + "authorizer": { + "config": {}, + "handler": "string" + }, + "description": "string", + "id": "string", + "match": { + "methods": [ + "string" + ], + "url": "string" + }, + "mutators": [ + { + "config": {}, + "handler": "string" + } + ], + "upstream": { + "preserve_host": true, + "strip_path": "string", + "url": "string" + } +} + +``` + +*swaggerRule is a single rule that will get checked on every HTTP request.* + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|authenticators|[[ruleHandler](#schemarulehandler)]|false|none|Authenticators is a list of authentication handlers that will try and authenticate the provided credentials. Authenticators are checked iteratively from index 0 to n and if the first authenticator to return a positive result will be the one used. If you want the rule to first check a specific authenticator before "falling back" to others, have that authenticator as the first item in the array.| +|authorizer|[ruleHandler](#schemarulehandler)|false|none|none| +|description|string|false|none|Description is a human readable description of this rule.| +|id|string|false|none|ID is the unique id of the rule. It can be at most 190 characters long, but the layout of the ID is up to you. You will need this ID later on to update or delete the rule.| +|match|[ruleMatch](#schemarulematch)|false|none|none| +|mutators|[[ruleHandler](#schemarulehandler)]|false|none|Mutators is a list of mutation handlers that transform the HTTP request. A common use case is generating a new set of credentials (e.g. JWT) which then will be forwarded to the upstream server. Mutations are performed iteratively from index 0 to n and should all succeed in order for the HTTP request to be forwarded.| +|upstream|[Upstream](#schemaupstream)|false|none|none| + +ruleHandler +#### ruleHandler + + + +```json +{ + "config": {}, + "handler": "string" +} + +``` + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|config|object|false|none|Config contains the configuration for the handler. Please read the user guide for a complete list of each handler's available settings.| +|handler|string|false|none|Handler identifies the implementation which will be used to handle this specific request. Please read the user guide for a complete list of available handlers.| + +ruleMatch +#### ruleMatch + + + +```json +{ + "methods": [ + "string" + ], + "url": "string" +} + +``` + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|methods|[string]|false|none|An array of HTTP methods (e.g. GET, POST, PUT, DELETE, ...). When ORY Oathkeeper searches for rules to decide what to do with an incoming request to the proxy server, it compares the HTTP method of the incoming request with the HTTP methods of each rules. If a match is found, the rule is considered a partial match. If the matchesUrl field is satisfied as well, the rule is considered a full match.| +|url|string|false|none|This field represents the URL pattern this rule matches. When ORY Oathkeeper searches for rules to decide what to do with an incoming request to the proxy server, it compares the full request URL (e.g. https://mydomain.com/api/resource) without query parameters of the incoming request with this field. If a match is found, the rule is considered a partial match. If the matchesMethods field is satisfied as well, the rule is considered a full match. You can use regular expressions in this field to match more than one url. Regular expressions are encapsulated in brackets < and >. The following example matches all paths of the domain `mydomain.com`: `https://mydomain.com/<.*>`.| + +version +#### version + + + +```json +{ + "version": "string" +} + +``` + +#### Properties + +|Name|Type|Required|Restrictions|Description| +|---|---|---|---|---| +|version|string|false|none|Version is the service's version.| + diff --git a/docs/versioned_docs/version-v0.37/reference/configuration.md b/docs/versioned_docs/version-v0.37/reference/configuration.md new file mode 100644 index 0000000000..5863a25cf1 --- /dev/null +++ b/docs/versioned_docs/version-v0.37/reference/configuration.md @@ -0,0 +1,1405 @@ +--- +id: configuration +title: Configuration +--- + + + +If file `$HOME/.oathkeeper.yaml` exists, it will be used as a configuration file +which supports all configuration settings listed below. + +You can load the config file from another source using the +`-c path/to/config.yaml` or `--config path/to/config.yaml` flag: +`oathkeeper --config path/to/config.yaml`. + +Config files can be formatted as JSON, YAML and TOML. Some configuration values +support reloading without server restart. All configuration values can be set +using environment variables, as documented below. + +To find out more about edge cases like setting string array values through +environmental variables head to the +[Configuring ORY services](../ecosystem/configuring) section. + +```yaml +## ORY Oathkeeper Configuration +# + +## HTTP(s) ## +# +serve: + ## HTTP REST API ## + # + api: + ## Port ## + # + # The port to listen on. + # + # Default value: 4456 + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_PORT= + # - Windows Command Line (CMD): + # > set SERVE_API_PORT= + # + port: -14767685 + + ## Host ## + # + # The network interface to listen on. + # + # Examples: + # - localhost + # - 127.0.0.1 + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_HOST= + # - Windows Command Line (CMD): + # > set SERVE_API_HOST= + # + host: localhost + + ## Cross Origin Resource Sharing (CORS) ## + # + # Configure [Cross Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/) using the following options. + # + cors: + ## Enable CORS ## + # + # If set to true, CORS will be enabled and preflight-requests (OPTION) will be answered. + # + # Default value: false + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_ENABLED= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_ENABLED= + # + enabled: false + + ## Allowed Origins ## + # + # A list of origins a cross-domain request can be executed from. If the special * value is present in the list, all origins will be allowed. An origin may contain a wildcard (*) to replace 0 or more characters (i.e.: http://*.domain.com). Usage of wildcards implies a small performance penality. Only one wildcard can be used per origin. + # + # Default value: * + # + # Examples: + # - - https://example.com + # - https://*.example.com + # - https://*.foo.example.com + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_ALLOWED_ORIGINS= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_ALLOWED_ORIGINS= + # + allowed_origins: + - https://example.com + - https://*.example.com + - https://*.foo.example.com + + ## Allowed HTTP Methods ## + # + # A list of methods the client is allowed to use with cross-domain requests. + # + # Default value: GET,POST,PUT,PATCH,DELETE + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_ALLOWED_METHODS= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_ALLOWED_METHODS= + # + allowed_methods: + - POST + - PATCH + + ## Allowed Request HTTP Headers ## + # + # A list of non simple headers the client is allowed to use with cross-domain requests. + # + # Default value: Authorization,Content-Type + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_ALLOWED_HEADERS= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_ALLOWED_HEADERS= + # + allowed_headers: + - ut + + ## Allowed Response HTTP Headers ## + # + # Indicates which headers are safe to expose to the API of a CORS API specification + # + # Default value: Content-Type + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_EXPOSED_HEADERS= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_EXPOSED_HEADERS= + # + exposed_headers: + - officia dolor + - consequat + - est + - nostrud sit minim + - in in + + ## Allow HTTP Credentials ## + # + # Indicates whether the request can include user credentials like cookies, HTTP authentication or client side SSL certificates. + # + # Default value: false + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_ALLOW_CREDENTIALS= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_ALLOW_CREDENTIALS= + # + allow_credentials: true + + ## Maximum Age ## + # + # Indicates how long (in seconds) the results of a preflight request can be cached. The default is 0 which stands for no max age. + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_MAX_AGE= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_MAX_AGE= + # + max_age: 32682046 + + ## Enable Debugging ## + # + # Set to true to debug server side CORS issues. + # + # Default value: false + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_CORS_DEBUG= + # - Windows Command Line (CMD): + # > set SERVE_API_CORS_DEBUG= + # + debug: true + + ## HTTPS ## + # + # Configure HTTP over TLS (HTTPS). All options can also be set using environment variables by replacing dots (`.`) with underscores (`_`) and uppercasing the key. For example, `some.prefix.tls.key.path` becomes `export SOME_PREFIX_TLS_KEY_PATH`. If all keys are left undefined, TLS will be disabled. + # + tls: + ## Private Key (PEM) ## + # + key: + ## path ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_TLS_KEY_PATH= + # - Windows Command Line (CMD): + # > set SERVE_API_TLS_KEY_PATH= + # + path: path/to/file.pem + + ## base64 ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_TLS_KEY_BASE64= + # - Windows Command Line (CMD): + # > set SERVE_API_TLS_KEY_BASE64= + # + base64: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlEWlRDQ0FrMmdBd0lCQWdJRVY1eE90REFOQmdr... + + ## TLS Certificate (PEM) ## + # + cert: + ## path ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_TLS_CERT_PATH= + # - Windows Command Line (CMD): + # > set SERVE_API_TLS_CERT_PATH= + # + path: path/to/file.pem + + ## base64 ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_API_TLS_CERT_BASE64= + # - Windows Command Line (CMD): + # > set SERVE_API_TLS_CERT_BASE64= + # + base64: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlEWlRDQ0FrMmdBd0lCQWdJRVY1eE90REFOQmdr... + + ## HTTP Reverse Proxy ## + # + proxy: + ## Port ## + # + # The port to listen on. + # + # Default value: 4455 + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_PORT= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_PORT= + # + port: 47008934 + + ## Host ## + # + # The network interface to listen on. Leave empty to listen on all interfaces. + # + # Examples: + # - localhost + # - 127.0.0.1 + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_HOST= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_HOST= + # + host: localhost + + ## HTTP Timeouts ## + # + # Control the reverse proxy's HTTP timeouts. + # + timeout: + ## HTTP Read Timeout ## + # + # The maximum duration for reading the entire request, including the body. + # + # Default value: 5s + # + # Examples: + # - 5s + # - 5m + # - 5h + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_TIMEOUT_READ= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_TIMEOUT_READ= + # + read: 5s + + ## HTTP Write Timeout ## + # + # The maximum duration before timing out writes of the response. Increase this parameter to prevent unexpected closing a client connection if an upstream request is responding slowly. + # + # Default value: 120s + # + # Examples: + # - 5s + # - 5m + # - 5h + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_TIMEOUT_WRITE= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_TIMEOUT_WRITE= + # + write: 5s + + ## HTTP Idle Timeout ## + # + # The maximum amount of time to wait for any action of a request session, reading data or writing the response. + # + # Default value: 120s + # + # Examples: + # - 5s + # - 5m + # - 5h + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_TIMEOUT_IDLE= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_TIMEOUT_IDLE= + # + idle: 120s + + ## Cross Origin Resource Sharing (CORS) ## + # + # Configure [Cross Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/) using the following options. + # + cors: + ## Enable CORS ## + # + # If set to true, CORS will be enabled and preflight-requests (OPTION) will be answered. + # + # Default value: false + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_ENABLED= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_ENABLED= + # + enabled: true + + ## Allowed Origins ## + # + # A list of origins a cross-domain request can be executed from. If the special * value is present in the list, all origins will be allowed. An origin may contain a wildcard (*) to replace 0 or more characters (i.e.: http://*.domain.com). Usage of wildcards implies a small performance penality. Only one wildcard can be used per origin. + # + # Default value: * + # + # Examples: + # - - https://example.com + # - https://*.example.com + # - https://*.foo.example.com + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_ALLOWED_ORIGINS= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_ALLOWED_ORIGINS= + # + allowed_origins: + - https://example.com + - https://*.example.com + - https://*.foo.example.com + + ## Allowed HTTP Methods ## + # + # A list of methods the client is allowed to use with cross-domain requests. + # + # Default value: GET,POST,PUT,PATCH,DELETE + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_ALLOWED_METHODS= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_ALLOWED_METHODS= + # + allowed_methods: + - HEAD + - CONNECT + - GET + - TRACE + - PATCH + + ## Allowed Request HTTP Headers ## + # + # A list of non simple headers the client is allowed to use with cross-domain requests. + # + # Default value: Authorization,Content-Type + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_ALLOWED_HEADERS= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_ALLOWED_HEADERS= + # + allowed_headers: + - in + + ## Allowed Response HTTP Headers ## + # + # Indicates which headers are safe to expose to the API of a CORS API specification + # + # Default value: Content-Type + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_EXPOSED_HEADERS= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_EXPOSED_HEADERS= + # + exposed_headers: + - laborum in dolore minim amet + - consectetur laborum + - ullamco amet exercitation enim + - 'sint ' + - 'Lorem enim in ' + + ## Allow HTTP Credentials ## + # + # Indicates whether the request can include user credentials like cookies, HTTP authentication or client side SSL certificates. + # + # Default value: false + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_ALLOW_CREDENTIALS= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_ALLOW_CREDENTIALS= + # + allow_credentials: true + + ## Maximum Age ## + # + # Indicates how long (in seconds) the results of a preflight request can be cached. The default is 0 which stands for no max age. + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_MAX_AGE= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_MAX_AGE= + # + max_age: 1235071 + + ## Enable Debugging ## + # + # Set to true to debug server side CORS issues. + # + # Default value: false + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_CORS_DEBUG= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_CORS_DEBUG= + # + debug: true + + ## HTTPS ## + # + # Configure HTTP over TLS (HTTPS). All options can also be set using environment variables by replacing dots (`.`) with underscores (`_`) and uppercasing the key. For example, `some.prefix.tls.key.path` becomes `export SOME_PREFIX_TLS_KEY_PATH`. If all keys are left undefined, TLS will be disabled. + # + tls: + ## Private Key (PEM) ## + # + key: + ## path ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_TLS_KEY_PATH= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_TLS_KEY_PATH= + # + path: path/to/file.pem + + ## base64 ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_TLS_KEY_BASE64= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_TLS_KEY_BASE64= + # + base64: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlEWlRDQ0FrMmdBd0lCQWdJRVY1eE90REFOQmdr... + + ## TLS Certificate (PEM) ## + # + cert: + ## path ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_TLS_CERT_PATH= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_TLS_CERT_PATH= + # + path: path/to/file.pem + + ## base64 ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export SERVE_PROXY_TLS_CERT_BASE64= + # - Windows Command Line (CMD): + # > set SERVE_PROXY_TLS_CERT_BASE64= + # + base64: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlEWlRDQ0FrMmdBd0lCQWdJRVY1eE90REFOQmdr... + +## Access Rules ## +# +# Configure access rules. All sub-keys support configuration reloading without restarting. +# +access_rules: + ## Repositories ## + # + # Locations (list of URLs) where access rules should be fetched from on boot. It is expected that the documents at those locations return a JSON or YAML Array containing ORY Oathkeeper Access Rules: + # + # - If the URL Scheme is `file://`, the access rules (an array of access rules is expected) will be fetched from the local file system. + # - If the URL Scheme is `inline://`, the access rules (an array of access rules is expected) are expected to be a base64 encoded (with padding!) JSON/YAML string (base64_encode(`[{"id":"foo-rule","authenticators":[....]}]`)). + # - If the URL Scheme is `http://` or `https://`, the access rules (an array of access rules is expected) will be fetched from the provided HTTP(s) location. + # + # Examples: + # - - file://path/to/rules.json + # - inline://W3siaWQiOiJmb28tcnVsZSIsImF1dGhlbnRpY2F0b3JzIjpbXX1d + # - https://path-to-my-rules/rules.json + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ACCESS_RULES_REPOSITORIES= + # - Windows Command Line (CMD): + # > set ACCESS_RULES_REPOSITORIES= + # + repositories: + - file://path/to/rules.json + - inline://W3siaWQiOiJmb28tcnVsZSIsImF1dGhlbnRpY2F0b3JzIjpbXX1d + - https://path-to-my-rules/rules.json + + ## Matching strategy ## + # + # This an optional field describing matching strategy. Currently supported values are 'glob' and 'regexp'. + # + # Default value: regexp + # + # Examples: + # - glob + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ACCESS_RULES_MATCHING_STRATEGY= + # - Windows Command Line (CMD): + # > set ACCESS_RULES_MATCHING_STRATEGY= + # + matching_strategy: glob + +## Authenticators ## +# +# For more information on authenticators head over to: https://www.ory.sh/docs/oathkeeper/pipeline/authn +# +authenticators: + ## Anonymous ## + # + # The [`anonymous` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#anonymous). + # + anonymous: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_ANONYMOUS_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_ANONYMOUS_ENABLED= + # + enabled: false + + ## Anonymous Authenticator Configuration ## + # + # This section is optional when the authenticator is disabled. + # + config: + ## Anonymous Subject ## + # + # Sets the anonymous username. + # + # Default value: anonymous + # + # Examples: + # - guest + # - anon + # - unknown + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_ANONYMOUS_CONFIG_SUBJECT= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_ANONYMOUS_CONFIG_SUBJECT= + # + subject: guest + + ## No Operation (noop) ## + # + # The [`noop` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#noop). + # + noop: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_NOOP_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_NOOP_ENABLED= + # + enabled: true + + ## Unauthorized ## + # + # The [`unauthorized` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#unauthorized). + # + unauthorized: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_UNAUTHORIZED_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_UNAUTHORIZED_ENABLED= + # + enabled: false + + ## Cookie Session ## + # + # The [`cookie_session` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#cookie_session). + # + cookie_session: + ## config ## + # + config: + ## check_session_url ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_COOKIE_SESSION_CONFIG_CHECK_SESSION_URL= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_COOKIE_SESSION_CONFIG_CHECK_SESSION_URL= + # + check_session_url: https://session-store-host + + ## only ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_COOKIE_SESSION_CONFIG_ONLY= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_COOKIE_SESSION_CONFIG_ONLY= + # + only: + - non fugiat do + - in nisi e + - Ut amet proident dolor + + ## preserve_path ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_COOKIE_SESSION_CONFIG_PRESERVE_PATH= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_COOKIE_SESSION_CONFIG_PRESERVE_PATH= + # + preserve_path: false + + ## extra_from ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_COOKIE_SESSION_CONFIG_EXTRA_FROM= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_COOKIE_SESSION_CONFIG_EXTRA_FROM= + # + extra_from: sit + + ## subject_from ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_COOKIE_SESSION_CONFIG_SUBJECT_FROM= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_COOKIE_SESSION_CONFIG_SUBJECT_FROM= + # + subject_from: incididunt ea Duis + + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_COOKIE_SESSION_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_COOKIE_SESSION_ENABLED= + # + enabled: false + + ## JSON Web Token (jwt) ## + # + # The [`jwt` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#jwt). + # + jwt: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_JWT_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_JWT_ENABLED= + # + enabled: true + + ## OAuth 2.0 Client Credentials ## + # + # The [`oauth2_client_credentials` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#oauth2_client_credentials). + # + oauth2_client_credentials: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_CLIENT_CREDENTIALS_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_CLIENT_CREDENTIALS_ENABLED= + # + enabled: false + + ## OAuth 2.0 Token Introspection ## + # + # The [`oauth2_introspection` authenticator](https://www.ory.sh/docs/oathkeeper/pipeline/authn#oauth2_introspection). + # + oauth2_introspection: + ## config ## + # + config: + ## introspection_url ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_INTROSPECTION_URL= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_INTROSPECTION_URL= + # + introspection_url: https://my-website.com/oauth2/introspection + + ## scope_strategy ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_SCOPE_STRATEGY= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_SCOPE_STRATEGY= + # + scope_strategy: wildcard + + ## pre_authorization ## + # + pre_authorization: + ## enabled ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_PRE_AUTHORIZATION_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_PRE_AUTHORIZATION_ENABLED= + # + enabled: false + + ## scope ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_PRE_AUTHORIZATION_SCOPE= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_PRE_AUTHORIZATION_SCOPE= + # + scope: + - foo + - bar + + ## required_scope ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_REQUIRED_SCOPE= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_REQUIRED_SCOPE= + # + required_scope: + - pariatur nulla + - laborum irure nulla + + ## target_audience ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_TARGET_AUDIENCE= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_TARGET_AUDIENCE= + # + target_audience: + - Duis in esse + - sint do + - enim ullamco + - Lorem + - occaecat nulla aliqua + + ## trusted_issuers ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_TRUSTED_ISSUERS= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_TRUSTED_ISSUERS= + # + trusted_issuers: + - et dolor fugiat + - anim cupidatat in + - esse deserunt + + ## introspection_request_headers ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_INTROSPECTION_REQUEST_HEADERS= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_INTROSPECTION_REQUEST_HEADERS= + # + introspection_request_headers: {} + + ## token_from ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_TOKEN_FROM= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_TOKEN_FROM= + # + token_from: null + + ## retry ## + # + retry: + ## give_up_after ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_RETRY_GIVE_UP_AFTER= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_RETRY_GIVE_UP_AFTER= + # + give_up_after: 529306s + + ## max_delay ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_RETRY_MAX_DELAY= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_CONFIG_RETRY_MAX_DELAY= + # + max_delay: 020ns + + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHENTICATORS_OAUTH2_INTROSPECTION_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHENTICATORS_OAUTH2_INTROSPECTION_ENABLED= + # + enabled: true + +## Error Handling ## +# +errors: + ## Error Handling Fallback ## + # + # This array defines how to handle errors when no "when" clause matches. If you have, for example, enabled redirect and json in your access rule, you could tell ORY Oathkeeper to try sending JSON if the request does not match the access rule definition + # + # Default value: json + # + # Examples: + # - - redirect + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ERRORS_FALLBACK= + # - Windows Command Line (CMD): + # > set ERRORS_FALLBACK= + # + fallback: + - redirect + + ## Individual Error Handler Configuration ## + # + handlers: + ## HTTP WWW-Authenticate Handler ## + # + # Responds with the WWW-Authenticate HTTP Response + # + www_authenticate: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ERRORS_HANDLERS_WWW_AUTHENTICATE_ENABLED= + # - Windows Command Line (CMD): + # > set ERRORS_HANDLERS_WWW_AUTHENTICATE_ENABLED= + # + enabled: false + + ## HTTP Redirect Error Handler ## + # + # Responds with a 301/302 HTTP redirect. + # + redirect: + ## config ## + # + config: + ## to ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ERRORS_HANDLERS_REDIRECT_CONFIG_TO= + # - Windows Command Line (CMD): + # > set ERRORS_HANDLERS_REDIRECT_CONFIG_TO= + # + to: http://fwzadCskXPkbVth.hkzhh-byENz9xmsHzFQRa3USp1rMw.sNFUME4yuXsaHMLOvsKMFvd2 + + ## code ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ERRORS_HANDLERS_REDIRECT_CONFIG_CODE= + # - Windows Command Line (CMD): + # > set ERRORS_HANDLERS_REDIRECT_CONFIG_CODE= + # + code: 302 + + ## when ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ERRORS_HANDLERS_REDIRECT_CONFIG_WHEN= + # - Windows Command Line (CMD): + # > set ERRORS_HANDLERS_REDIRECT_CONFIG_WHEN= + # + when: + - error: + - forbidden + - internal_server_error + - forbidden + - not_found + - unauthorized + request: + cidr: + - nisi Excepteur deserunt ad laboris + - veniam quis consequat Excepteur + - ea Excepteur incididunt sit in + - fugiat velit + - Duis ullamco volup + header: + content_type: [] + accept: [] + + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ERRORS_HANDLERS_REDIRECT_ENABLED= + # - Windows Command Line (CMD): + # > set ERRORS_HANDLERS_REDIRECT_ENABLED= + # + enabled: false + + ## JSON Error Handler ## + # + # Responds with a JSON error response + # + # Default value: [object Object] + # + json: + ## Enabled ## + # + # En-/disables this component. + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export ERRORS_HANDLERS_JSON_ENABLED= + # - Windows Command Line (CMD): + # > set ERRORS_HANDLERS_JSON_ENABLED= + # + enabled: false + +## Authorizers ## +# +# For more information on authorizers head over to: https://www.ory.sh/docs/oathkeeper/pipeline/authz +# +authorizers: + ## Allow ## + # + # The [`allow` authorizer](https://www.ory.sh/docs/oathkeeper/pipeline/authz#allow). + # + allow: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_ALLOW_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_ALLOW_ENABLED= + # + enabled: true + + ## Deny ## + # + # The [`deny` authorizer](https://www.ory.sh/docs/oathkeeper/pipeline/authz#allow). + # + deny: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_DENY_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_DENY_ENABLED= + # + enabled: true + + ## ORY Keto Access Control Policies Engine ## + # + # The [`keto_engine_acp_ory` authorizer](https://www.ory.sh/docs/oathkeeper/pipeline/authz#keto_engine_acp_ory). + # + keto_engine_acp_ory: + ## config ## + # + config: + ## base_url ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_BASE_URL= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_BASE_URL= + # + base_url: http://my-keto/ + + ## required_action ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_REQUIRED_ACTION= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_REQUIRED_ACTION= + # + required_action: non Excepteur ipsum est dolor + + ## required_resource ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_REQUIRED_RESOURCE= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_REQUIRED_RESOURCE= + # + required_resource: do officia nisi in nostrud + + ## subject ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_SUBJECT= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_SUBJECT= + # + subject: in voluptate et sit + + ## flavor ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_FLAVOR= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_KETO_ENGINE_ACP_ORY_CONFIG_FLAVOR= + # + flavor: aute + + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export AUTHORIZERS_KETO_ENGINE_ACP_ORY_ENABLED= + # - Windows Command Line (CMD): + # > set AUTHORIZERS_KETO_ENGINE_ACP_ORY_ENABLED= + # + enabled: false + +## Mutators ## +# +# For more information on mutators head over to: https://www.ory.sh/docs/oathkeeper/pipeline/mutator +# +mutators: + ## No Operation (noop) ## + # + # The [`noop` mutator](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#noop). + # + noop: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_NOOP_ENABLED= + # - Windows Command Line (CMD): + # > set MUTATORS_NOOP_ENABLED= + # + enabled: false + + ## HTTP Cookie ## + # + # The [`cookie` mutator](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#cookie). + # + cookie: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_COOKIE_ENABLED= + # - Windows Command Line (CMD): + # > set MUTATORS_COOKIE_ENABLED= + # + enabled: true + + ## HTTP Header ## + # + # The [`header` mutator](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#header). + # + header: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_HEADER_ENABLED= + # - Windows Command Line (CMD): + # > set MUTATORS_HEADER_ENABLED= + # + enabled: false + + ## Hydrator ## + # + # The [`hydrator` mutator](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#hydrator). + # + hydrator: + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_HYDRATOR_ENABLED= + # - Windows Command Line (CMD): + # > set MUTATORS_HYDRATOR_ENABLED= + # + enabled: true + + ## ID Token (JSON Web Token) ## + # + # The [`id_token` mutator](https://www.ory.sh/docs/oathkeeper/pipeline/mutator#id_token). + # + id_token: + ## config ## + # + config: + ## jwks_url ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_ID_TOKEN_CONFIG_JWKS_URL= + # - Windows Command Line (CMD): + # > set MUTATORS_ID_TOKEN_CONFIG_JWKS_URL= + # + jwks_url: file://../from/this/relative/location.json + + ## issuer_url ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_ID_TOKEN_CONFIG_ISSUER_URL= + # - Windows Command Line (CMD): + # > set MUTATORS_ID_TOKEN_CONFIG_ISSUER_URL= + # + issuer_url: tempor + + ## claims ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_ID_TOKEN_CONFIG_CLAIMS= + # - Windows Command Line (CMD): + # > set MUTATORS_ID_TOKEN_CONFIG_CLAIMS= + # + claims: anim ut + + ## ttl ## + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_ID_TOKEN_CONFIG_TTL= + # - Windows Command Line (CMD): + # > set MUTATORS_ID_TOKEN_CONFIG_TTL= + # + ttl: 30s + + ## Enabled ## + # + # En-/disables this component. + # + # Default value: false + # + # Examples: + # - true + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export MUTATORS_ID_TOKEN_ENABLED= + # - Windows Command Line (CMD): + # > set MUTATORS_ID_TOKEN_ENABLED= + # + enabled: true + +## Log ## +# +# Configure logging using the following options. Logging will always be sent to stdout and stderr. +# +log: + ## Level ## + # + # Debug enables stack traces on errors. Can also be set using environment variable LOG_LEVEL. + # + # Default value: info + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export LOG_LEVEL= + # - Windows Command Line (CMD): + # > set LOG_LEVEL= + # + level: info + + ## Format ## + # + # The log format can either be text or JSON. + # + # Default value: text + # + # Set this value using environment variables on + # - Linux/macOS: + # $ export LOG_FORMAT= + # - Windows Command Line (CMD): + # > set LOG_FORMAT= + # + format: text + +## Profiling ## +# +# Enables CPU or memory profiling if set. For more details on profiling Go programs read [Profiling Go Programs](https://blog.golang.org/profiling-go-programs). +# +# Set this value using environment variables on +# - Linux/macOS: +# $ export PROFILING= +# - Windows Command Line (CMD): +# > set PROFILING= +# +profiling: cpu +``` diff --git a/docs/versioned_docs/version-v0.37/sdk/index.md b/docs/versioned_docs/version-v0.37/sdk/index.md new file mode 100644 index 0000000000..a75ab014e8 --- /dev/null +++ b/docs/versioned_docs/version-v0.37/sdk/index.md @@ -0,0 +1,30 @@ +--- +id: index +title: Overview +--- + +All SDKs use automated code generation provided by +[`openapi-generator`](https://github.com/OpenAPITools/openapi-generator). +Unfortunately, `openapi-generator` has serious breaking changes in the generated +code when upgrading versions. Therefore, we do not make backwards compatibility +promises with regards to the generated SDKs. We hope to improve this process in +the future. + +Before you check out the SDKs, head over to the +[REST API](oathkeeper/sdk/api.md) documentation which includes code samples for +common programming languages for each REST endpoint. + +We publish our SDKs for popular languages in their respective package +repositories: + +- [Python](https://pypi.org/project/ory-oathkeeper-client/) +- [PHP](https://packagist.org/packages/ory/oathkeeper-client) +- [Go](https://github.com/ory/oathkeeper-client-go) +- [NodeJS](https://www.npmjs.com/package/@oryd/oathkeeper-client) (with + TypeScript) +- [Java](https://search.maven.org/artifact/sh.ory.oathkeeper/oathkeeper-client) +- [Ruby](https://rubygems.org/gems/ory-oathkeeper-client) + +Missing your programming language? +[Create an issue](https://github.com/ory/oathkeeper/issues) and help us build, +test and publish the SDK for your programming language! diff --git a/docs/versioned_sidebars/version-v0.37-sidebars.json b/docs/versioned_sidebars/version-v0.37-sidebars.json new file mode 100644 index 0000000000..e28d9cb0ae --- /dev/null +++ b/docs/versioned_sidebars/version-v0.37-sidebars.json @@ -0,0 +1,151 @@ +{ + "version-v0.37/docs": [ + { + "type": "category", + "label": "Introduction", + "items": [ + { + "type": "doc", + "id": "version-v0.37/index" + }, + { + "type": "doc", + "id": "version-v0.37/install" + } + ] + }, + { + "type": "category", + "label": "Core Concepts", + "items": [ + { + "type": "doc", + "id": "version-v0.37/api-access-rules" + }, + { + "type": "category", + "label": "Handlers", + "items": [ + { + "type": "doc", + "id": "version-v0.37/pipeline/index" + }, + { + "type": "doc", + "id": "version-v0.37/pipeline/authn" + }, + { + "type": "doc", + "id": "version-v0.37/pipeline/authz" + }, + { + "type": "doc", + "id": "version-v0.37/pipeline/mutator" + }, + { + "type": "doc", + "id": "version-v0.37/pipeline/error" + } + ] + } + ] + }, + { + "type": "category", + "label": "Guides", + "items": [ + { + "type": "doc", + "id": "version-v0.37/configure-deploy" + } + ] + }, + { + "type": "category", + "label": "Reference", + "items": [ + { + "type": "doc", + "id": "version-v0.37/reference/configuration" + }, + { + "type": "doc", + "id": "version-v0.37/reference/api" + } + ] + }, + { + "type": "category", + "label": "SDKs", + "items": [ + { + "type": "doc", + "id": "version-v0.37/sdk/index" + } + ] + }, + { + "type": "category", + "label": "ORY Kratos", + "items": [ + { + "type": "link", + "label": "Home", + "href": "https://www.ory.sh/kratos" + }, + { + "type": "link", + "label": "Docs", + "href": "https://www.ory.sh/kratos/docs" + }, + { + "type": "link", + "label": "GitHub", + "href": "https://github.com/ory/kratos" + } + ] + }, + { + "type": "category", + "label": "ORY Hydra", + "items": [ + { + "type": "link", + "label": "Home", + "href": "https://www.ory.sh/hydra" + }, + { + "type": "link", + "label": "Docs", + "href": "https://www.ory.sh/hydra/docs" + }, + { + "type": "link", + "label": "GitHub", + "href": "https://github.com/ory/hydra" + } + ] + }, + { + "type": "category", + "label": "ORY Keto", + "items": [ + { + "type": "link", + "label": "Home", + "href": "https://www.ory.sh/Keto" + }, + { + "type": "link", + "label": "Docs", + "href": "https://www.ory.sh/Keto/docs" + }, + { + "type": "link", + "label": "GitHub", + "href": "https://github.com/ory/Keto" + } + ] + } + ] +} diff --git a/docs/versions.json b/docs/versions.json new file mode 100644 index 0000000000..2a9dd24d89 --- /dev/null +++ b/docs/versions.json @@ -0,0 +1,3 @@ +[ + "v0.37" +] diff --git a/driver/configuration/provider.go b/driver/configuration/provider.go index 62dbcb3337..49c25bafa8 100644 --- a/driver/configuration/provider.go +++ b/driver/configuration/provider.go @@ -14,7 +14,7 @@ import ( "github.com/rs/cors" ) -var schemas = packr.New("schemas", "../../.schemas") +var schemas = packr.New("schemas", "../../.schema") const ( ForbiddenStrategyErrorType = "forbidden" diff --git a/driver/configuration/provider_viper_public_test.go b/driver/configuration/provider_viper_public_test.go index 43cf630175..a4b0403175 100644 --- a/driver/configuration/provider_viper_public_test.go +++ b/driver/configuration/provider_viper_public_test.go @@ -32,11 +32,11 @@ func setup(t *testing.T) *ViperProvider { viper.Reset() viperx.InitializeConfig( "oathkeeper", - "./../../docs/", + "./../../internal/config/", l, ) - err := viperx.ValidateFromURL("file://../../.schemas/config.schema.json") + err := viperx.ValidateFromURL("file://../../.schema/config.schema.json") if err != nil { viperx.LoggerWithValidationErrorFields(l, err).Error("unable to validate") } @@ -114,11 +114,11 @@ func BenchmarkPipelineConfig(b *testing.B) { viper.Reset() viperx.InitializeConfig( "oathkeeper", - "./../../docs/", + "./../../internal/config/", logrus.New(), ) - err := viperx.ValidateFromURL("file://../../.schemas/config.schema.json") + err := viperx.ValidateFromURL("file://../../.schema/config.schema.json") if err != nil { viperx.LoggerWithValidationErrorFields(logrus.New(), err).Error("unable to validate") } @@ -146,11 +146,11 @@ func BenchmarkPipelineEnabled(b *testing.B) { viper.Reset() viperx.InitializeConfig( "oathkeeper", - "./../../docs/", + "./../../internal/config/", logrus.New(), ) - err := viperx.ValidateFromURL("file://../../.schemas/config.schema.json") + err := viperx.ValidateFromURL("file://../../.schema/config.schema.json") if err != nil { viperx.LoggerWithValidationErrorFields(logrus.New(), err).Error("unable to validate") } @@ -169,11 +169,11 @@ func TestViperProvider(t *testing.T) { viper.Reset() viperx.InitializeConfig( "oathkeeper", - "./../../docs/", + "./../../internal/config/", logrus.New(), ) - err := viperx.ValidateFromURL("file://../../.schemas/config.schema.json") + err := viperx.ValidateFromURL("file://../../.schema/config.schema.json") if err != nil { viperx.LoggerWithValidationErrorFields(logrus.New(), err).Error("unable to validate") } diff --git a/docs/.oathkeeper.yaml b/internal/config/.oathkeeper.yaml similarity index 99% rename from docs/.oathkeeper.yaml rename to internal/config/.oathkeeper.yaml index be5432d438..0f4e7af04a 100644 --- a/docs/.oathkeeper.yaml +++ b/internal/config/.oathkeeper.yaml @@ -1,5 +1,5 @@ # Please find the documentation for this file at -# https://www.ory.sh/docs/oathkeeper/configuration +# https://www.ory.sh/oathkeeper/docs/configuration log: level: debug diff --git a/scripts/run-gensdk.sh b/scripts/run-gensdk.sh index cdea34788f..0c9f6d22b2 100755 --- a/scripts/run-gensdk.sh +++ b/scripts/run-gensdk.sh @@ -11,8 +11,8 @@ rm -rf ./sdk/js/swagger # curl -O scripts/swagger-codegen-cli-2.2.3.jar http://central.maven.org/maven2/io/swagger/swagger-codegen-cli/2.2.3/swagger-codegen-cli-2.2.3.jar -java -jar scripts/swagger-codegen-cli-2.2.3.jar generate -i ./docs/api.swagger.json -l go -o ./sdk/go/oathkeeper/swagger -java -jar scripts/swagger-codegen-cli-2.2.3.jar generate -i ./docs/api.swagger.json -l javascript -o ./sdk/js/swagger +java -jar scripts/swagger-codegen-cli-2.2.3.jar generate -i ./.schema/api.swagger.json -l go -o ./sdk/go/oathkeeper/swagger +java -jar scripts/swagger-codegen-cli-2.2.3.jar generate -i ./.schema/api.swagger.json -l javascript -o ./sdk/js/swagger scripts/run-format.sh diff --git a/scripts/run-genswag.sh b/scripts/run-genswag.sh index d47f7cfcb4..9a44fb0c46 100755 --- a/scripts/run-genswag.sh +++ b/scripts/run-genswag.sh @@ -4,4 +4,4 @@ set -euo pipefail cd "$( dirname "${BASH_SOURCE[0]}" )/.." -swagger generate spec -m -o ./docs/api.swagger.json +swagger generate spec -m -o ./.schema/api.swagger.json