diff --git a/.NOT_EDITED_HERE.yaml b/.NOT_EDITED_HERE.yaml index 6e888014002..b9b568941a7 120000 --- a/.NOT_EDITED_HERE.yaml +++ b/.NOT_EDITED_HERE.yaml @@ -1 +1 @@ -_data/.NOT_EDITED_HERE.yaml \ No newline at end of file +_data/not_edited_here.yaml \ No newline at end of file diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000000..ce783a50541 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +.dockerignore +.git +.gitignore +Dockerfile +docker-compose.yml diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index e643696f57a..8367d26be72 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,7 +1,8 @@ ### Problem description - + ### Problem location diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ae767832e80..4cd61800a09 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,29 +1,25 @@ + for this project's contribution guidelines. Remove these comments + as you go. - + DO NOT edit files and directories listed in _data/not_edited_here.yaml. + These are maintained in upstream repos and changes here will be lost. -### Describe the proposed changes + Help us merge your changes more quickly by adding details and setting metadata + (such as labels, milestones, and reviewers) over at the right-hand side.--> - +### Proposed changes -### Unreleased project version + - +### Unreleased project version (optional) -### Related issue + - +### Related issues (optional) -### Related issue or PR in another project - - - -### Please take a look - - - - - + diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000000..024b0fead3c --- /dev/null +++ b/.gitmodules @@ -0,0 +1,13 @@ +[submodule "tests/src/github.com/gdevillele/frontparser"] + path = tests/src/github.com/gdevillele/frontparser + url = https://github.com/gdevillele/frontparser.git + branch = f28e87c7b9dae139855b574e96f22822986249a8 +[submodule "tests/src/golang.org/x/net"] + path = tests/src/golang.org/x/net + url = https://go.googlesource.com/net + branch = 45e771701b814666a7eb299e6c7a57d0b1799e91 +[submodule "tests/src/gopkg.in/yaml.v2"] + path = tests/src/gopkg.in/yaml.v2 + url = https://github.com/go-yaml/yaml.git + branch = a5b47d31c556af34a302ce5d659e6fea44d90de0 + diff --git a/Dockerfile b/Dockerfile index 239d0ed7ab2..1c681bb028e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,62 +1,39 @@ FROM starefossen/github-pages -RUN git clone https://www.github.com/docker/docker.github.io allv -RUN jekyll build -s allv -d allvbuild - -RUN git --git-dir=./allv/.git --work-tree=./allv checkout v1.4 -RUN mkdir allvbuild/v1.4 -RUN jekyll build -s allv -d allvbuild/v1.4 -RUN find allvbuild/v1.4 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="/#href="/v1.4/#g' -RUN find allvbuild/v1.4 -type f -name '*.html' -print0 | xargs -0 sed -i 's#src="/#src="/v1.4/#g' -RUN find allvbuild/v1.4 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="https://docs.docker.com/#href="/v1.4/#g' - -RUN git --git-dir=./allv/.git --work-tree=./allv checkout v1.5 -RUN mkdir allvbuild/v1.5 -RUN jekyll build -s allv -d allvbuild/v1.5 -RUN find allvbuild/v1.5 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="/#href="/v1.5/#g' -RUN find allvbuild/v1.5 -type f -name '*.html' -print0 | xargs -0 sed -i 's#src="/#src="/v1.5/#g' -RUN find allvbuild/v1.5 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="https://docs.docker.com/#href="/v1.5/#g' - -RUN git --git-dir=./allv/.git --work-tree=./allv checkout v1.6 -RUN mkdir allvbuild/v1.6 -RUN jekyll build -s allv -d allvbuild/v1.6 -RUN find allvbuild/v1.6 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="/#href="/v1.6/#g' -RUN find allvbuild/v1.6 -type f -name '*.html' -print0 | xargs -0 sed -i 's#src="/#src="/v1.6/#g' -RUN find allvbuild/v1.6 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="https://docs.docker.com/#href="/v1.6/#g' - -RUN git --git-dir=./allv/.git --work-tree=./allv checkout v1.7 -RUN mkdir allvbuild/v1.7 -RUN jekyll build -s allv -d allvbuild/v1.7 -RUN find allvbuild/v1.7 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="/#href="/v1.7/#g' -RUN find allvbuild/v1.7 -type f -name '*.html' -print0 | xargs -0 sed -i 's#src="/#src="/v1.7/#g' -RUN find allvbuild/v1.7 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="https://docs.docker.com/#href="/v1.7/#g' - -RUN git --git-dir=./allv/.git --work-tree=./allv checkout v1.8 -RUN mkdir allvbuild/v1.8 -RUN jekyll build -s allv -d allvbuild/v1.8 -RUN find allvbuild/v1.8 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="/#href="/v1.8/#g' -RUN find allvbuild/v1.8 -type f -name '*.html' -print0 | xargs -0 sed -i 's#src="/#src="/v1.8/#g' -RUN find allvbuild/v1.8 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="https://docs.docker.com/#href="/v1.8/#g' - -RUN git --git-dir=./allv/.git --work-tree=./allv checkout v1.9 -RUN mkdir allvbuild/v1.9 -RUN jekyll build -s allv -d allvbuild/v1.9 -RUN find allvbuild/v1.9 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="/#href="/v1.9/#g' -RUN find allvbuild/v1.9 -type f -name '*.html' -print0 | xargs -0 sed -i 's#src="/#src="/v1.9/#g' -RUN find allvbuild/v1.9 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="https://docs.docker.com/#href="/v1.9/#g' - -RUN git --git-dir=./allv/.git --work-tree=./allv checkout v1.10 -RUN mkdir allvbuild/v1.10 -RUN jekyll build -s allv -d allvbuild/v1.10 -RUN find allvbuild/v1.10 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="/#href="/v1.10/#g' -RUN find allvbuild/v1.10 -type f -name '*.html' -print0 | xargs -0 sed -i 's#src="/#src="/v1.10/#g' -RUN find allvbuild/v1.10 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="https://docs.docker.com/#href="/v1.10/#g' - -RUN git --git-dir=./allv/.git --work-tree=./allv checkout v1.11 -RUN mkdir allvbuild/v1.11 -RUN jekyll build -s allv -d allvbuild/v1.11 -RUN find allvbuild/v1.11 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="/#href="/v1.11/#g' -RUN find allvbuild/v1.11 -type f -name '*.html' -print0 | xargs -0 sed -i 's#src="/#src="/v1.11/#g' -RUN find allvbuild/v1.11 -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="https://docs.docker.com/#href="/v1.11/#g' - -CMD jekyll serve -s /usr/src/app/allvbuild -d /_site --no-watch -H 0.0.0.0 -P 4000 +ENV VERSIONS="v1.4 v1.5 v1.6 v1.7 v1.8 v1.9 v1.10 v1.11" + +# Create archive; check out each version, create HTML, tweak links +RUN git clone https://www.github.com/docker/docker.github.io temp; \ + for VER in $VERSIONS; do \ + git --git-dir=./temp/.git --work-tree=./temp checkout ${VER} \ + && mkdir -p allvbuild/${VER} \ + && jekyll build -s temp -d allvbuild/${VER} \ + && find allvbuild/${VER} -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="/#href="/'"$VER"'/#g' \ + && find allvbuild/${VER} -type f -name '*.html' -print0 | xargs -0 sed -i 's#src="/#src="/'"$VER"'/#g' \ + && find allvbuild/${VER} -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="https://docs.docker.com/#href="/'"$VER"'/#g'; \ + done; \ + rm -rf temp + +COPY . allv + +## Branch to pull from, per ref doc +ENV ENGINE_BRANCH="1.13.x" +ENV DISTRIBUTION_BRANCH="release/2.5" + +# The statements below pull reference docs from upstream locations, +# then build the whole site to static HTML using Jekyll + +RUN svn co https://github.com/docker/docker/branches/$ENGINE_BRANCH/docs/extend allv/engine/extend \ + && wget -O allv/engine/deprecated.md https://raw.githubusercontent.com/docker/docker/$ENGINE_BRANCH/docs/deprecated.md \ + && svn co https://github.com/docker/distribution/branches/$DISTRIBUTION_BRANCH/docs/spec allv/registry/spec \ + && wget -O allv/registry/configuration.md https://raw.githubusercontent.com/docker/distribution/$DISTRIBUTION_BRANCH/docs/configuration.md \ + && rm -rf allv/apidocs/cloud-api-source \ + && rm -rf allv/tests \ + && wget -O allv/engine/api/v1.25/swagger.yaml https://raw.githubusercontent.com/docker/docker/$ENGINE_BRANCH/api/swagger.yaml \ + && jekyll build -s allv -d allvbuild \ + && find allvbuild/engine/reference -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="https://docs.docker.com/#href="/#g' \ + && find allvbuild/engine/extend -type f -name '*.html' -print0 | xargs -0 sed -i 's#href="https://docs.docker.com/#href="/#g' \ + && rm -rf allv + +# Serve the site, which is now all static HTML +CMD jekyll serve -s /usr/src/app/allvbuild --no-watch -H 0.0.0.0 -P 4000 diff --git a/Gemfile b/Gemfile index 79fb6b8d7ca..855387d549d 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,3 @@ source "https://rubygems.org" -gem "github-pages", "104" #Update me once in a while: https://github.com/github/pages-gem/releases +gem "github-pages", "105" #Update me once in a while: https://github.com/github/pages-gem/releases diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 00000000000..6a343e94763 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,22 @@ +wrappedNode(label: 'linux && x86_64') { + deleteDir() + stage "checkout" + checkout scm + sh "git submodule update --init --recursive" + stage "test" + + /* Jekyll creates html files to implement client side redirects. + There are absolute links to docs.docker.com in these htmls + we don't want them to be parsed by the tests for now. + Removing jekyll-redirect-from option will make sure these pages + are not generated when building with Jekyll. */ + sh "awk '/jekyll-redirect-from/{n=1}; n {n--; next}; 1' < _config.yml > _config.yml.tmp" + sh "mv _config.yml.tmp _config.yml" + + sh "docker build -t docs:${JOB_BASE_NAME}-${BUILD_NUMBER} `pwd`" + sh "docker build -t tests:${JOB_BASE_NAME}-${BUILD_NUMBER} `pwd`/tests" + sh "docker run -v /usr/src/app/allvbuild --name docs-${JOB_BASE_NAME}-${BUILD_NUMBER} docs:${JOB_BASE_NAME}-${BUILD_NUMBER} /bin/true" + sh "docker run --rm --volumes-from docs-${JOB_BASE_NAME}-${BUILD_NUMBER} -v `pwd`:/docs tests:${JOB_BASE_NAME}-${BUILD_NUMBER}" + sh "docker rm -fv docs-${JOB_BASE_NAME}-${BUILD_NUMBER}" + sh "docker rmi docs:${JOB_BASE_NAME}-${BUILD_NUMBER} tests:${JOB_BASE_NAME}-${BUILD_NUMBER}" +} \ No newline at end of file diff --git a/README.md b/README.md index bcee65c334c..46e2223d811 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Docs @ Docker Welcome to the repo for our documentation. This is the source for the URL -served at https://docs.docker.com/. +served at [https://docs.docker.com/](https://docs.docker.com/). Feel free to send us pull requests and file issues. Our docs are completely open source and we deeply appreciate contributions from our community! @@ -9,7 +9,7 @@ open source and we deeply appreciate contributions from our community! ## Providing feedback We really want your feedback, and we've made it easy. You can edit, rate, or -file an issue at the bottom of every page on docs.docker.com. +file an issue at the bottom of every page on [https://docs.docker.com/](https://docs.docker.com/). **Please only file issues about the documentation in this repository.** One way to think about this is that you should file a bug here if your issue is that you @@ -17,7 +17,7 @@ don't see something that should be in the docs, or you see something incorrect or confusing in the docs. - If your problem is a general question about how to configure or use Docker, - consider asking a question on https://forums.docker.com instead. + consider asking a question on [https://forums.docker.com](https://forums.docker.com) instead. - If you have an idea for a new feature or behavior change in a specific aspect of Docker, or have found a bug in part of Docker, please file that issue in @@ -69,7 +69,7 @@ your work on that project's `vnext` branch.** These branches were created by cloning `master` and then importing a project's `master` branch's docs into it (at the time of the migration), in a way that preserved the commit history. When a project has a release, its `vnext` branch will be merged into `master` and your -work will be visible on docs.docker.com. +work will be visible on [https://docs.docker.com/](https://docs.docker.com/). The following `vnext` branches currently exist: @@ -101,7 +101,7 @@ The following `vnext` branches currently exist: docs for upcoming features in the [docker/kitematic](https://github.com/docker/kitematic/) project -## Per-PR staging on Github +## Per-PR staging on GitHub For every PR against `master` and all the long-lived branches, a staged version of the site is built using Netlify. If the site builds, you will see @@ -109,7 +109,7 @@ of the site is built using Netlify. If the site builds, you will see Click **Details** to review the staged site or the errors that prevented it from building. Review the staged site and amend your commit if necessary. Reviewers will also check the staged site before merging the PR, to protect the integrity -of [docs.docker.com](http://docs.docker.com/). +of [https://docs.docker.com/](https://docs.docker.com/). ## Staging locally @@ -136,10 +136,41 @@ You have three options: docker-compose down ``` -2. Use Jekyll directly. Clone this repo, [install Ruby 2.3 or higher - (required)](https://www.ruby-lang.org/en/documentation/installation/), - [install the GitHub Pages Ruby gem](https://help.github.com/articles/setting-up-your-github-pages-site-locally-with-jekyll/), - then run `jekyll serve` from within the directory. +2. Use Jekyll directly. + + a. Clone this repo by running: + + ```bash + git clone https://github.com/docker/docker.github.io.git + ``` + + b. Install Ruby 2.3 or later as described in [Installing Ruby] + (https://www.ruby-lang.org/en/documentation/installation/). + + c. Install Bundler: + + ```bash + gem install bundler + ``` + + d. If you use Ubuntu, install packages required for the Nokogiri HTML + parser: + + ```bash + sudo apt-get install ruby-dev zlib1g-dev liblzma-dev + ``` + + e. Install Jekyll and other required dependencies: + + ```bash + bundle install + ``` + + >**Note**: You may have to install some packages manually. + + f. Change the directory to `docker.github.io`. + + g. Use the `jekyll serve` command to continuously build the HTML output. The `jekyll serve` process runs in the foreground, and starts a web server running on http://localhost:4000/ by default. To stop it, use `CTRL+C`. @@ -162,7 +193,7 @@ You have three options: Feel free to link to `../foo.md` so that the docs are readable in GitHub, but keep in mind that Jekyll templating notation `{% such as this %}` will render in raw text and not be processed. In general it's best to assume the docs are being read -directly on docs.docker.com. +directly on [https://docs.docker.com/](https://docs.docker.com/). ## Style guide diff --git a/_config.yml b/_config.yml index 87895bd9b5d..b42596b5acc 100644 --- a/_config.yml +++ b/_config.yml @@ -10,6 +10,7 @@ permalink: pretty safe: false lsi: false url: https://docs.docker.com +keep_files: ["v1.4", "v1.5", "v1.6", "v1.7", "v1.8", "v1.9", "v1.10", "v1.11"] gems: - jekyll-redirect-from @@ -87,20 +88,32 @@ defaults: path: "toolbox" values: assignee: "londoncalling" + - + scope: + path: "datacenter/dtr/2.1" + values: + ucp_version: "2.0" + dtr_version: "2.1" - scope: path: "datacenter/dtr/2.0" values: hide_from_sitemap: true - this_version: "2.0" - latest_version: "2.1" + ucp_version: "1.1" + dtr_version: "2.0" + - + scope: + path: "datacenter/ucp/2.0" + values: + ucp_version: "2.0" + dtr_version: "2.1" - scope: path: "datacenter/ucp/1.1" values: hide_from_sitemap: true - this_version: "1.1" - latest_version: "2.0" + ucp_version: "1.1" + dtr_version: "2.0" - scope: path: "apidocs/v1.3.3" diff --git a/_data/advisories.yaml b/_data/advisories.yaml index d55001ff3a4..618cf305791 100644 --- a/_data/advisories.yaml +++ b/_data/advisories.yaml @@ -12,7 +12,10 @@ texts: rc: "The Swarm mode feature included in Docker Engine 1.12 is a release candidate feature and might be subject to non backward-compatible changes. Some functionality may change before the feature becomes generally available." docker4mac-beta: "Docker for Mac is currently in public beta. Some functionality may change before the product becomes generally available." docker4win-beta: "Docker for Windows is currently in public beta. Some functionality may change before the product becomes generally available." + toolbox: "**Legacy desktop solution.** Docker Toolbox is for older Mac and Windows systems that do not meet the requirements of [Docker for Mac](/docker-for-mac/) and [Docker for Windows](/docker-for-windows/). We recommend updating to the newer applications, if possible." + kitematic: "**Legacy desktop solution.** Kitematic is a legacy solution, bundled with [Docker Toolbox](/toolbox/overview/). We recommend updating to [Docker for Mac](/docker-for-mac/) or [Docker for Windows](/docker-for-windows/) if your system meets the requirements for one of those applications." swarm: "See [Swarm mode overview](/engine/swarm/) for the orchestration features introduced in Docker Engine 1.12. Only refer to the Docker Swarm documents below for information on the standalone Swarm product." + swarm-standalone: "**You are viewing docs for legacy standalone Swarm.** These topics describe standalone Docker Swarm. If you use Docker 1.12 or higher, [Swarm mode](/engine/swarm/) is integrated with Docker Engine. Most users should use integrated Swarm mode — a good place to start is [Getting started with swarm mode](/engine/swarm/swarm-tutorial/) and [Swarm mode CLI commands](/engine/swarm/index.md#swarm-mode-cli-commands). Standalone Docker Swarm is not integrated into the Docker Engine API and CLI commands." engine: "This site contains documentation for the v1.12 release candidate version of Docker Engine. For the Docker Engine v1.11 docs, see [https://docs.docker.com/v1.11/](https://docs.docker.com/v1.11/). Docker for Mac and Docker for Windows are currently in Beta." diff --git a/_data/ddc_offline_files.yaml b/_data/ddc_offline_files.yaml new file mode 100644 index 00000000000..751f673749c --- /dev/null +++ b/_data/ddc_offline_files.yaml @@ -0,0 +1,40 @@ +# This contains the list of urls that you can use to download a tar file +# with all the images needed to install Docker Datacenter in an air-gapped +# environment that can't access the internet + +# Used by _includes/components/ddc_url_list.html + +- ucp-version: "2.0" + tar-files: + - description: "DTR 2.1.4" + url: https://packages.docker.com/caas/dtr-2.1.4.tar.gz + - description: "UCP 2.0.1, DTR 2.1.3" + url: https://packages.docker.com/caas/ucp-2.0.1_dtr-2.1.3.tar.gz + - description: "UCP 2.0.1, DTR 2.1.2" + url: https://packages.docker.com/caas/ucp-2.0.1_dtr-2.1.2.tar.gz + - description: "UCP 2.0.1, DTR 2.1.1" + url: https://packages.docker.com/caas/ucp-2.0.1_dtr-2.1.1.tar.gz + - description: "UCP 2.0.1, DTR 2.1.0" + url: https://packages.docker.com/caas/ucp-2.0.1_dtr-2.1.0.tar.gz + - description: "UCP 2.0.0, DTR 2.1.0" + url: https://packages.docker.com/caas/ucp-2.0.0_dtr-2.1.0.tar.gz +- ucp-version: "1.1" + tar-files: + - description: "UCP 1.1.5, DTR 2.0.4" + url: https://packages.docker.com/caas/ucp-1.1.5_dtr-2.0.4.tar.gz + - description: "UCP 1.1.4, DTR 2.0.4" + url: https://packages.docker.com/caas/ucp-1.1.4_dtr-2.0.4.tar.gz + - description: "UCP 1.1.4, DTR 2.0.3" + url: https://packages.docker.com/caas/ucp-1.1.4_dtr-2.0.3.tar.gz + - description: "UCP 1.1.3, DTR 2.0.3" + url: https://packages.docker.com/caas/ucp-1.1.3_dtr-2.0.3.tar.gz + - description: "UCP 1.1.2, DTR 2.0.3" + url: https://packages.docker.com/caas/ucp-1.1.2_dtr-2.0.3.tar.gz + - description: "UCP 1.1.2, DTR 2.0.2" + url: https://packages.docker.com/caas/ucp-1.1.2_dtr-2.0.2.tar.gz + - description: "UCP 1.1.1, DTR 2.0.2" + url: https://packages.docker.com/caas/ucp-1.1.1_dtr-2.0.2.tar.gz + - description: "UCP 1.1.1, DTR 2.0.1" + url: https://packages.docker.com/caas/ucp-1.1.1_dtr-2.0.1.tar.gz + - description: "UCP 1.1.0, DTR 2.0.0" + url: https://packages.docker.com/caas/ucp-1.1.0_dtr-2.0.0.tar.gz diff --git a/_data/dockerd-cli/dockerd.yaml b/_data/dockerd-cli/dockerd.yaml new file mode 100644 index 00000000000..85e6078640d --- /dev/null +++ b/_data/dockerd-cli/dockerd.yaml @@ -0,0 +1,1372 @@ +command: dockerd +short: A self-sufficient runtime for containers. +long: | + Options with [] may be specified multiple times. + + dockerd is the persistent process that manages containers. Docker + uses different binaries for the daemon and client. To run the daemon you + type `dockerd`. + + To run the daemon with debug output, use `dockerd -D`. + + ## Daemon socket option + + The Docker daemon can listen for [Docker Remote API](../api/docker_remote_api.md) + requests via three different types of Socket: `unix`, `tcp`, and `fd`. + + By default, a `unix` domain socket (or IPC socket) is created at + `/var/run/docker.sock`, requiring either `root` permission, or `docker` group + membership. + + If you need to access the Docker daemon remotely, you need to enable the `tcp` + Socket. Beware that the default setup provides un-encrypted and + un-authenticated direct access to the Docker daemon - and should be secured + either using the [built in HTTPS encrypted socket](../../security/https.md), or by + putting a secure web proxy in front of it. You can listen on port `2375` on all + network interfaces with `-H tcp://0.0.0.0:2375`, or on a particular network + interface using its IP address: `-H tcp://192.168.59.103:2375`. It is + conventional to use port `2375` for un-encrypted, and port `2376` for encrypted + communication with the daemon. + + > **Note:** + > If you're using an HTTPS encrypted socket, keep in mind that only + > TLS1.0 and greater are supported. Protocols SSLv3 and under are not + > supported anymore for security reasons. + + On Systemd based systems, you can communicate with the daemon via + [Systemd socket activation](http://0pointer.de/blog/projects/socket-activation.html), + use `dockerd -H fd://`. Using `fd://` will work perfectly for most setups but + you can also specify individual sockets: `dockerd -H fd://3`. If the + specified socket activated files aren't found, then Docker will exit. You can + find examples of using Systemd socket activation with Docker and Systemd in the + [Docker source tree](https://github.com/docker/docker/tree/master/contrib/init/systemd/). + + You can configure the Docker daemon to listen to multiple sockets at the same + time using multiple `-H` options: + + ```bash + # listen using the default unix socket, and on 2 specific IP addresses on this host. + $ sudo dockerd -H unix:///var/run/docker.sock -H tcp://192.168.59.106 -H tcp://10.10.10.2 + ``` + + The Docker client will honor the `DOCKER_HOST` environment variable to set the + `-H` flag for the client. + + ```bash + $ docker -H tcp://0.0.0.0:2375 ps + # or + $ export DOCKER_HOST="tcp://0.0.0.0:2375" + $ docker ps + # both are equal + ``` + + Setting the `DOCKER_TLS_VERIFY` environment variable to any value other than + the empty string is equivalent to setting the `--tlsverify` flag. The following + are equivalent: + + ```bash + $ docker --tlsverify ps + # or + $ export DOCKER_TLS_VERIFY=1 + $ docker ps + ``` + + The Docker client will honor the `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` + environment variables (or the lowercase versions thereof). `HTTPS_PROXY` takes + precedence over `HTTP_PROXY`. + + ### Bind Docker to another host/port or a Unix socket + + > **Warning**: + > Changing the default `docker` daemon binding to a + > TCP port or Unix *docker* user group will increase your security risks + > by allowing non-root users to gain *root* access on the host. Make sure + > you control access to `docker`. If you are binding + > to a TCP port, anyone with access to that port has full Docker access; + > so it is not advisable on an open network. + + With `-H` it is possible to make the Docker daemon to listen on a + specific IP and port. By default, it will listen on + `unix:///var/run/docker.sock` to allow only local connections by the + *root* user. You *could* set it to `0.0.0.0:2375` or a specific host IP + to give access to everybody, but that is **not recommended** because + then it is trivial for someone to gain root access to the host where the + daemon is running. + + Similarly, the Docker client can use `-H` to connect to a custom port. + The Docker client will default to connecting to `unix:///var/run/docker.sock` + on Linux, and `tcp://127.0.0.1:2376` on Windows. + + `-H` accepts host and port assignment in the following format: + + tcp://[host]:[port][path] or unix://path + + For example: + + - `tcp://` -> TCP connection to `127.0.0.1` on either port `2376` when TLS encryption + is on, or port `2375` when communication is in plain text. + - `tcp://host:2375` -> TCP connection on + host:2375 + - `tcp://host:2375/path` -> TCP connection on + host:2375 and prepend path to all requests + - `unix://path/to/socket` -> Unix socket located + at `path/to/socket` + + `-H`, when empty, will default to the same value as + when no `-H` was passed in. + + `-H` also accepts short form for TCP bindings: `host:` or `host:port` or `:port` + + Run Docker in daemon mode: + + ```bash + $ sudo /dockerd -H 0.0.0.0:5555 & + ``` + + Download an `ubuntu` image: + + ```bash + $ docker -H :5555 pull ubuntu + ``` + + You can use multiple `-H`, for example, if you want to listen on both + TCP and a Unix socket + + ```bash + # Run docker in daemon mode + $ sudo /dockerd -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock & + # Download an ubuntu image, use default Unix socket + $ docker pull ubuntu + # OR use the TCP port + $ docker -H tcp://127.0.0.1:2375 pull ubuntu + ``` + + ### Daemon storage-driver option + + The Docker daemon has support for several different image layer storage + drivers: `aufs`, `devicemapper`, `btrfs`, `zfs`, `overlay` and `overlay2`. + + The `aufs` driver is the oldest, but is based on a Linux kernel patch-set that + is unlikely to be merged into the main kernel. These are also known to cause + some serious kernel crashes. However, `aufs` allows containers to share + executable and shared library memory, so is a useful choice when running + thousands of containers with the same program or libraries. + + The `devicemapper` driver uses thin provisioning and Copy on Write (CoW) + snapshots. For each devicemapper graph location – typically + `/var/lib/docker/devicemapper` – a thin pool is created based on two block + devices, one for data and one for metadata. By default, these block devices + are created automatically by using loopback mounts of automatically created + sparse files. Refer to [Storage driver options](dockerd.md#storage-driver-options) below + for a way how to customize this setup. + [~jpetazzo/Resizing Docker containers with the Device Mapper plugin](http://jpetazzo.github.io/2014/01/29/docker-device-mapper-resize/) + article explains how to tune your existing setup without the use of options. + + The `btrfs` driver is very fast for `docker build` - but like `devicemapper` + does not share executable memory between devices. Use + `dockerd -s btrfs -g /mnt/btrfs_partition`. + + The `zfs` driver is probably not as fast as `btrfs` but has a longer track record + on stability. Thanks to `Single Copy ARC` shared blocks between clones will be + cached only once. Use `dockerd -s zfs`. To select a different zfs filesystem + set `zfs.fsname` option as described in [Storage driver options](dockerd.md#storage-driver-options). + + The `overlay` is a very fast union filesystem. It is now merged in the main + Linux kernel as of [3.18.0](https://lkml.org/lkml/2014/10/26/137). `overlay` + also supports page cache sharing, this means multiple containers accessing + the same file can share a single page cache entry (or entries), it makes + `overlay` as efficient with memory as `aufs` driver. Call + `dockerd -s overlay` to use it. + + > **Note:** + > As promising as `overlay` is, the feature is still quite young and should not + > be used in production. Most notably, using `overlay` can cause excessive + > inode consumption (especially as the number of images grows), as well as + > being incompatible with the use of RPMs. + + The `overlay2` uses the same fast union filesystem but takes advantage of + [additional features](https://lkml.org/lkml/2015/2/11/106) added in Linux + kernel 4.0 to avoid excessive inode consumption. Call `dockerd -s overlay2` + to use it. + + > **Note:** + > Both `overlay` and `overlay2` are currently unsupported on `btrfs` or any + > Copy on Write filesystem and should only be used over `ext4` partitions. + + ### Storage driver options + + Particular storage-driver can be configured with options specified with + `--storage-opt` flags. Options for `devicemapper` are prefixed with `dm`, + options for `zfs` start with `zfs` and options for `btrfs` start with `btrfs`. + + #### Devicemapper options + + * `dm.thinpooldev` + + Specifies a custom block storage device to use for the thin pool. + + If using a block device for device mapper storage, it is best to use `lvm` + to create and manage the thin-pool volume. This volume is then handed to Docker + to exclusively create snapshot volumes needed for images and containers. + + Managing the thin-pool outside of Engine makes for the most feature-rich + method of having Docker utilize device mapper thin provisioning as the + backing storage for Docker containers. The highlights of the lvm-based + thin-pool management feature include: automatic or interactive thin-pool + resize support, dynamically changing thin-pool features, automatic thinp + metadata checking when lvm activates the thin-pool, etc. + + As a fallback if no thin pool is provided, loopback files are + created. Loopback is very slow, but can be used without any + pre-configuration of storage. It is strongly recommended that you do + not use loopback in production. Ensure your Engine daemon has a + `--storage-opt dm.thinpooldev` argument provided. + + Example use: + + ```bash + $ sudo dockerd --storage-opt dm.thinpooldev=/dev/mapper/thin-pool + ``` + + * `dm.basesize` + + Specifies the size to use when creating the base device, which limits the + size of images and containers. The default value is 10G. Note, thin devices + are inherently "sparse", so a 10G device which is mostly empty doesn't use + 10 GB of space on the pool. However, the filesystem will use more space for + the empty case the larger the device is. + + The base device size can be increased at daemon restart which will allow + all future images and containers (based on those new images) to be of the + new base device size. + + Example use: + + ```bash + $ sudo dockerd --storage-opt dm.basesize=50G + ``` + + This will increase the base device size to 50G. The Docker daemon will throw an + error if existing base device size is larger than 50G. A user can use + this option to expand the base device size however shrinking is not permitted. + + This value affects the system-wide "base" empty filesystem + that may already be initialized and inherited by pulled images. Typically, + a change to this value requires additional steps to take effect: + + ```bash + $ sudo service docker stop + $ sudo rm -rf /var/lib/docker + $ sudo service docker start + ``` + + Example use: + + ```bash + $ sudo dockerd --storage-opt dm.basesize=20G + ``` + + * `dm.loopdatasize` + + > **Note**: + > This option configures devicemapper loopback, which should not + > be used in production. + + Specifies the size to use when creating the loopback file for the + "data" device which is used for the thin pool. The default size is + 100G. The file is sparse, so it will not initially take up this + much space. + + Example use: + + ```bash + $ sudo dockerd --storage-opt dm.loopdatasize=200G + ``` + + * `dm.loopmetadatasize` + + > **Note**: + > This option configures devicemapper loopback, which should not + > be used in production. + + Specifies the size to use when creating the loopback file for the + "metadata" device which is used for the thin pool. The default size + is 2G. The file is sparse, so it will not initially take up + this much space. + + Example use: + + ```bash + $ sudo dockerd --storage-opt dm.loopmetadatasize=4G + ``` + + * `dm.fs` + + Specifies the filesystem type to use for the base device. The supported + options are "ext4" and "xfs". The default is "xfs" + + Example use: + + ```bash + $ sudo dockerd --storage-opt dm.fs=ext4 + ``` + + * `dm.mkfsarg` + + Specifies extra mkfs arguments to be used when creating the base device. + + Example use: + + ```bash + $ sudo dockerd --storage-opt "dm.mkfsarg=-O ^has_journal" + ``` + + * `dm.mountopt` + + Specifies extra mount options used when mounting the thin devices. + + Example use: + + ```bash + $ sudo dockerd --storage-opt dm.mountopt=nodiscard + ``` + + * `dm.datadev` + + (Deprecated, use `dm.thinpooldev`) + + Specifies a custom blockdevice to use for data for the thin pool. + + If using a block device for device mapper storage, ideally both datadev and + metadatadev should be specified to completely avoid using the loopback + device. + + Example use: + + ```bash + $ sudo dockerd \ + --storage-opt dm.datadev=/dev/sdb1 \ + --storage-opt dm.metadatadev=/dev/sdc1 + ``` + + * `dm.metadatadev` + + (Deprecated, use `dm.thinpooldev`) + + Specifies a custom blockdevice to use for metadata for the thin pool. + + For best performance the metadata should be on a different spindle than the + data, or even better on an SSD. + + If setting up a new metadata pool it is required to be valid. This can be + achieved by zeroing the first 4k to indicate empty metadata, like this: + + ```bash + $ dd if=/dev/zero of=$metadata_dev bs=4096 count=1 + ``` + + Example use: + + ```bash + $ sudo dockerd \ + --storage-opt dm.datadev=/dev/sdb1 \ + --storage-opt dm.metadatadev=/dev/sdc1 + ``` + + * `dm.blocksize` + + Specifies a custom blocksize to use for the thin pool. The default + blocksize is 64K. + + Example use: + + ```bash + $ sudo dockerd --storage-opt dm.blocksize=512K + ``` + + * `dm.blkdiscard` + + Enables or disables the use of blkdiscard when removing devicemapper + devices. This is enabled by default (only) if using loopback devices and is + required to resparsify the loopback file on image/container removal. + + Disabling this on loopback can lead to *much* faster container removal + times, but will make the space used in `/var/lib/docker` directory not be + returned to the system for other use when containers are removed. + + Example use: + + ```bash + $ sudo dockerd --storage-opt dm.blkdiscard=false + ``` + + * `dm.override_udev_sync_check` + + Overrides the `udev` synchronization checks between `devicemapper` and `udev`. + `udev` is the device manager for the Linux kernel. + + To view the `udev` sync support of a Docker daemon that is using the + `devicemapper` driver, run: + + ```bash + $ docker info + [...] + Udev Sync Supported: true + [...] + ``` + + When `udev` sync support is `true`, then `devicemapper` and udev can + coordinate the activation and deactivation of devices for containers. + + When `udev` sync support is `false`, a race condition occurs between + the`devicemapper` and `udev` during create and cleanup. The race condition + results in errors and failures. (For information on these failures, see + [docker#4036](https://github.com/docker/docker/issues/4036)) + + To allow the `docker` daemon to start, regardless of `udev` sync not being + supported, set `dm.override_udev_sync_check` to true: + + ```bash + $ sudo dockerd --storage-opt dm.override_udev_sync_check=true + ``` + + When this value is `true`, the `devicemapper` continues and simply warns + you the errors are happening. + + > **Note:** + > The ideal is to pursue a `docker` daemon and environment that does + > support synchronizing with `udev`. For further discussion on this + > topic, see [docker#4036](https://github.com/docker/docker/issues/4036). + > Otherwise, set this flag for migrating existing Docker daemons to + > a daemon with a supported environment. + + * `dm.use_deferred_removal` + + Enables use of deferred device removal if `libdm` and the kernel driver + support the mechanism. + + Deferred device removal means that if device is busy when devices are + being removed/deactivated, then a deferred removal is scheduled on + device. And devices automatically go away when last user of the device + exits. + + For example, when a container exits, its associated thin device is removed. + If that device has leaked into some other mount namespace and can't be + removed, the container exit still succeeds and this option causes the + system to schedule the device for deferred removal. It does not wait in a + loop trying to remove a busy device. + + Example use: + + ```bash + $ sudo dockerd --storage-opt dm.use_deferred_removal=true + ``` + + * `dm.use_deferred_deletion` + + Enables use of deferred device deletion for thin pool devices. By default, + thin pool device deletion is synchronous. Before a container is deleted, + the Docker daemon removes any associated devices. If the storage driver + can not remove a device, the container deletion fails and daemon returns. + + Error deleting container: Error response from daemon: Cannot destroy container + + To avoid this failure, enable both deferred device deletion and deferred + device removal on the daemon. + + ```bash + $ sudo dockerd \ + --storage-opt dm.use_deferred_deletion=true \ + --storage-opt dm.use_deferred_removal=true + ``` + + With these two options enabled, if a device is busy when the driver is + deleting a container, the driver marks the device as deleted. Later, when + the device isn't in use, the driver deletes it. + + In general it should be safe to enable this option by default. It will help + when unintentional leaking of mount point happens across multiple mount + namespaces. + + * `dm.min_free_space` + + Specifies the min free space percent in a thin pool require for new device + creation to succeed. This check applies to both free data space as well + as free metadata space. Valid values are from 0% - 99%. Value 0% disables + free space checking logic. If user does not specify a value for this option, + the Engine uses a default value of 10%. + + Whenever a new a thin pool device is created (during `docker pull` or during + container creation), the Engine checks if the minimum free space is + available. If sufficient space is unavailable, then device creation fails + and any relevant `docker` operation fails. + + To recover from this error, you must create more free space in the thin pool + to recover from the error. You can create free space by deleting some images + and containers from the thin pool. You can also add more storage to the thin + pool. + + To add more space to a LVM (logical volume management) thin pool, just add + more storage to the volume group container thin pool; this should automatically + resolve any errors. If your configuration uses loop devices, then stop the + Engine daemon, grow the size of loop files and restart the daemon to resolve + the issue. + + Example use: + + ```bash + $ sudo dockerd --storage-opt dm.min_free_space=10% + ``` + + #### ZFS options + + * `zfs.fsname` + + Set zfs filesystem under which docker will create its own datasets. + By default docker will pick up the zfs filesystem where docker graph + (`/var/lib/docker`) is located. + + Example use: + + ```bash + $ sudo dockerd -s zfs --storage-opt zfs.fsname=zroot/docker + ``` + + #### Btrfs options + + * `btrfs.min_space` + + Specifies the minimum size to use when creating the subvolume which is used + for containers. If user uses disk quota for btrfs when creating or running + a container with **--storage-opt size** option, docker should ensure the + **size** cannot be smaller than **btrfs.min_space**. + + Example use: + + ```bash + $ sudo dockerd -s btrfs --storage-opt btrfs.min_space=10G + ``` + + #### Overlay2 options + + * `overlay2.override_kernel_check` + + Overrides the Linux kernel version check allowing overlay2. Support for + specifying multiple lower directories needed by overlay2 was added to the + Linux kernel in 4.0.0. However some older kernel versions may be patched + to add multiple lower directory support for OverlayFS. This option should + only be used after verifying this support exists in the kernel. Applying + this option on a kernel without this support will cause failures on mount. + + ## Docker runtime execution options + + The Docker daemon relies on a + [OCI](https://github.com/opencontainers/specs) compliant runtime + (invoked via the `containerd` daemon) as its interface to the Linux + kernel `namespaces`, `cgroups`, and `SELinux`. + + By default, the Docker daemon automatically starts `containerd`. If you want to + control `containerd` startup, manually start `containerd` and pass the path to + the `containerd` socket using the `--containerd` flag. For example: + + ```bash + $ sudo dockerd --containerd /var/run/dev/docker-containerd.sock + ``` + + Runtimes can be registered with the daemon either via the + configuration file or using the `--add-runtime` command line argument. + + The following is an example adding 2 runtimes via the configuration: + + ```json + "default-runtime": "runc", + "runtimes": { + "runc": { + "path": "runc" + }, + "custom": { + "path": "/usr/local/bin/my-runc-replacement", + "runtimeArgs": [ + "--debug" + ] + } + } + ``` + + This is the same example via the command line: + + ```bash + $ sudo dockerd --add-runtime runc=runc --add-runtime custom=/usr/local/bin/my-runc-replacement + ``` + + > **Note**: defining runtime arguments via the command line is not supported. + + ## Options for the runtime + + You can configure the runtime using options specified + with the `--exec-opt` flag. All the flag's options have the `native` prefix. A + single `native.cgroupdriver` option is available. + + The `native.cgroupdriver` option specifies the management of the container's + cgroups. You can specify only specify `cgroupfs` or `systemd`. If you specify + `systemd` and it is not available, the system errors out. If you omit the + `native.cgroupdriver` option,` cgroupfs` is used. + + This example sets the `cgroupdriver` to `systemd`: + + ```bash + $ sudo dockerd --exec-opt native.cgroupdriver=systemd + ``` + + Setting this option applies to all containers the daemon launches. + + Also Windows Container makes use of `--exec-opt` for special purpose. Docker user + can specify default container isolation technology with this, for example: + + ```bash + $ sudo dockerd --exec-opt isolation=hyperv + ``` + + Will make `hyperv` the default isolation technology on Windows. If no isolation + value is specified on daemon start, on Windows client, the default is + `hyperv`, and on Windows server, the default is `process`. + + ## Daemon DNS options + + To set the DNS server for all Docker containers, use: + + ```bash + $ sudo dockerd --dns 8.8.8.8 + ``` + + + To set the DNS search domain for all Docker containers, use: + + ```bash + $ sudo dockerd --dns-search example.com + ``` + + + ## Insecure registries + + Docker considers a private registry either secure or insecure. In the rest of + this section, *registry* is used for *private registry*, and `myregistry:5000` + is a placeholder example for a private registry. + + A secure registry uses TLS and a copy of its CA certificate is placed on the + Docker host at `/etc/docker/certs.d/myregistry:5000/ca.crt`. An insecure + registry is either not using TLS (i.e., listening on plain text HTTP), or is + using TLS with a CA certificate not known by the Docker daemon. The latter can + happen when the certificate was not found under + `/etc/docker/certs.d/myregistry:5000/`, or if the certificate verification + failed (i.e., wrong CA). + + By default, Docker assumes all, but local (see local registries below), + registries are secure. Communicating with an insecure registry is not possible + if Docker assumes that registry is secure. In order to communicate with an + insecure registry, the Docker daemon requires `--insecure-registry` in one of + the following two forms: + + * `--insecure-registry myregistry:5000` tells the Docker daemon that + myregistry:5000 should be considered insecure. + * `--insecure-registry 10.1.0.0/16` tells the Docker daemon that all registries + whose domain resolve to an IP address is part of the subnet described by the + CIDR syntax, should be considered insecure. + + The flag can be used multiple times to allow multiple registries to be marked + as insecure. + + If an insecure registry is not marked as insecure, `docker pull`, + `docker push`, and `docker search` will result in an error message prompting + the user to either secure or pass the `--insecure-registry` flag to the Docker + daemon as described above. + + Local registries, whose IP address falls in the 127.0.0.0/8 range, are + automatically marked as insecure as of Docker 1.3.2. It is not recommended to + rely on this, as it may change in the future. + + Enabling `--insecure-registry`, i.e., allowing un-encrypted and/or untrusted + communication, can be useful when running a local registry. However, + because its use creates security vulnerabilities it should ONLY be enabled for + testing purposes. For increased security, users should add their CA to their + system's list of trusted CAs instead of enabling `--insecure-registry`. + + ## Legacy Registries + + Enabling `--disable-legacy-registry` forces a docker daemon to only interact with registries which support the V2 protocol. Specifically, the daemon will not attempt `push`, `pull` and `login` to v1 registries. The exception to this is `search` which can still be performed on v1 registries. + + ## Running a Docker daemon behind an HTTPS_PROXY + + When running inside a LAN that uses an `HTTPS` proxy, the Docker Hub + certificates will be replaced by the proxy's certificates. These certificates + need to be added to your Docker host's configuration: + + 1. Install the `ca-certificates` package for your distribution + 2. Ask your network admin for the proxy's CA certificate and append them to + `/etc/pki/tls/certs/ca-bundle.crt` + 3. Then start your Docker daemon with `HTTPS_PROXY=http://username:password@proxy:port/ dockerd`. + The `username:` and `password@` are optional - and are only needed if your + proxy is set up to require authentication. + + This will only add the proxy and authentication to the Docker daemon's requests - + your `docker build`s and running containers will need extra configuration to + use the proxy + + ## Default Ulimits + + `--default-ulimit` allows you to set the default `ulimit` options to use for + all containers. It takes the same options as `--ulimit` for `docker run`. If + these defaults are not set, `ulimit` settings will be inherited, if not set on + `docker run`, from the Docker daemon. Any `--ulimit` options passed to + `docker run` will overwrite these defaults. + + Be careful setting `nproc` with the `ulimit` flag as `nproc` is designed by Linux to + set the maximum number of processes available to a user, not to a container. For details + please check the [run](run.md) reference. + + ## Nodes discovery + + The `--cluster-advertise` option specifies the `host:port` or `interface:port` + combination that this particular daemon instance should use when advertising + itself to the cluster. The daemon is reached by remote hosts through this value. + If you specify an interface, make sure it includes the IP address of the actual + Docker host. For Engine installation created through `docker-machine`, the + interface is typically `eth1`. + + The daemon uses [libkv](https://github.com/docker/libkv/) to advertise + the node within the cluster. Some key-value backends support mutual + TLS. To configure the client TLS settings used by the daemon can be configured + using the `--cluster-store-opt` flag, specifying the paths to PEM encoded + files. For example: + + ```bash + $ sudo dockerd \ + --cluster-advertise 192.168.1.2:2376 \ + --cluster-store etcd://192.168.1.2:2379 \ + --cluster-store-opt kv.cacertfile=/path/to/ca.pem \ + --cluster-store-opt kv.certfile=/path/to/cert.pem \ + --cluster-store-opt kv.keyfile=/path/to/key.pem + ``` + + The currently supported cluster store options are: + + * `discovery.heartbeat` + + Specifies the heartbeat timer in seconds which is used by the daemon as a + keepalive mechanism to make sure discovery module treats the node as alive + in the cluster. If not configured, the default value is 20 seconds. + + * `discovery.ttl` + + Specifies the ttl (time-to-live) in seconds which is used by the discovery + module to timeout a node if a valid heartbeat is not received within the + configured ttl value. If not configured, the default value is 60 seconds. + + * `kv.cacertfile` + + Specifies the path to a local file with PEM encoded CA certificates to trust + + * `kv.certfile` + + Specifies the path to a local file with a PEM encoded certificate. This + certificate is used as the client cert for communication with the + Key/Value store. + + * `kv.keyfile` + + Specifies the path to a local file with a PEM encoded private key. This + private key is used as the client key for communication with the + Key/Value store. + + * `kv.path` + + Specifies the path in the Key/Value store. If not configured, the default value is 'docker/nodes'. + + ## Access authorization + + Docker's access authorization can be extended by authorization plugins that your + organization can purchase or build themselves. You can install one or more + authorization plugins when you start the Docker `daemon` using the + `--authorization-plugin=PLUGIN_ID` option. + + ```bash + $ sudo dockerd --authorization-plugin=plugin1 --authorization-plugin=plugin2,... + ``` + + The `PLUGIN_ID` value is either the plugin's name or a path to its specification + file. The plugin's implementation determines whether you can specify a name or + path. Consult with your Docker administrator to get information about the + plugins available to you. + + Once a plugin is installed, requests made to the `daemon` through the command + line or Docker's remote API are allowed or denied by the plugin. If you have + multiple plugins installed, at least one must allow the request for it to + complete. + + For information about how to create an authorization plugin, see [authorization + plugin](../../extend/plugins_authorization.md) section in the Docker extend section of this documentation. + + + ## Daemon user namespace options + + The Linux kernel [user namespace support](http://man7.org/linux/man-pages/man7/user_namespaces.7.html) provides additional security by enabling + a process, and therefore a container, to have a unique range of user and + group IDs which are outside the traditional user and group range utilized by + the host system. Potentially the most important security improvement is that, + by default, container processes running as the `root` user will have expected + administrative privilege (with some restrictions) inside the container but will + effectively be mapped to an unprivileged `uid` on the host. + + When user namespace support is enabled, Docker creates a single daemon-wide mapping + for all containers running on the same engine instance. The mappings will + utilize the existing subordinate user and group ID feature available on all modern + Linux distributions. + The [`/etc/subuid`](http://man7.org/linux/man-pages/man5/subuid.5.html) and + [`/etc/subgid`](http://man7.org/linux/man-pages/man5/subgid.5.html) files will be + read for the user, and optional group, specified to the `--userns-remap` + parameter. If you do not wish to specify your own user and/or group, you can + provide `default` as the value to this flag, and a user will be created on your behalf + and provided subordinate uid and gid ranges. This default user will be named + `dockremap`, and entries will be created for it in `/etc/passwd` and + `/etc/group` using your distro's standard user and group creation tools. + + > **Note**: The single mapping per-daemon restriction is in place for now + > because Docker shares image layers from its local cache across all + > containers running on the engine instance. Since file ownership must be + > the same for all containers sharing the same layer content, the decision + > was made to map the file ownership on `docker pull` to the daemon's user and + > group mappings so that there is no delay for running containers once the + > content is downloaded. This design preserves the same performance for `docker + > pull`, `docker push`, and container startup as users expect with + > user namespaces disabled. + + ### Starting the daemon with user namespaces enabled + + To enable user namespace support, start the daemon with the + `--userns-remap` flag, which accepts values in the following formats: + + - uid + - uid:gid + - username + - username:groupname + + If numeric IDs are provided, translation back to valid user or group names + will occur so that the subordinate uid and gid information can be read, given + these resources are name-based, not id-based. If the numeric ID information + provided does not exist as entries in `/etc/passwd` or `/etc/group`, daemon + startup will fail with an error message. + + > **Note:** On Fedora 22, you have to `touch` the `/etc/subuid` and `/etc/subgid` + > files to have ranges assigned when users are created. This must be done + > *before* the `--userns-remap` option is enabled. Once these files exist, the + > daemon can be (re)started and range assignment on user creation works properly. + + **Example: starting with default Docker user management:** + + ```bash + $ sudo dockerd --userns-remap=default + ``` + + When `default` is provided, Docker will create - or find the existing - user and group + named `dockremap`. If the user is created, and the Linux distribution has + appropriate support, the `/etc/subuid` and `/etc/subgid` files will be populated + with a contiguous 65536 length range of subordinate user and group IDs, starting + at an offset based on prior entries in those files. For example, Ubuntu will + create the following range, based on an existing user named `user1` already owning + the first 65536 range: + + ```bash + $ cat /etc/subuid + user1:100000:65536 + dockremap:165536:65536 + ``` + + If you have a preferred/self-managed user with subordinate ID mappings already + configured, you can provide that username or uid to the `--userns-remap` flag. + If you have a group that doesn't match the username, you may provide the `gid` + or group name as well; otherwise the username will be used as the group name + when querying the system for the subordinate group ID range. + + ### Detailed information on `subuid`/`subgid` ranges + + Given potential advanced use of the subordinate ID ranges by power users, the + following paragraphs define how the Docker daemon currently uses the range entries + found within the subordinate range files. + + The simplest case is that only one contiguous range is defined for the + provided user or group. In this case, Docker will use that entire contiguous + range for the mapping of host uids and gids to the container process. This + means that the first ID in the range will be the remapped root user, and the + IDs above that initial ID will map host ID 1 through the end of the range. + + From the example `/etc/subuid` content shown above, the remapped root + user would be uid 165536. + + If the system administrator has set up multiple ranges for a single user or + group, the Docker daemon will read all the available ranges and use the + following algorithm to create the mapping ranges: + + 1. The range segments found for the particular user will be sorted by *start ID* ascending. + 2. Map segments will be created from each range in increasing value with a length matching the length of each segment. Therefore the range segment with the lowest numeric starting value will be equal to the remapped root, and continue up through host uid/gid equal to the range segment length. As an example, if the lowest segment starts at ID 1000 and has a length of 100, then a map of 1000 -> 0 (the remapped root) up through 1100 -> 100 will be created from this segment. If the next segment starts at ID 10000, then the next map will start with mapping 10000 -> 101 up to the length of this second segment. This will continue until no more segments are found in the subordinate files for this user. + 3. If more than five range segments exist for a single user, only the first five will be utilized, matching the kernel's limitation of only five entries in `/proc/self/uid_map` and `proc/self/gid_map`. + + ### Disable user namespace for a container + + If you enable user namespaces on the daemon, all containers are started + with user namespaces enabled. In some situations you might want to disable + this feature for a container, for example, to start a privileged container (see + [user namespace known restrictions](dockerd.md#user-namespace-known-restrictions)). + To enable those advanced features for a specific container use `--userns=host` + in the `run/exec/create` command. + This option will completely disable user namespace mapping for the container's user. + + ### User namespace known restrictions + + The following standard Docker features are currently incompatible when + running a Docker daemon with user namespaces enabled: + + - sharing PID or NET namespaces with the host (`--pid=host` or `--network=host`) + - A `--read-only` container filesystem (this is a Linux kernel restriction against remounting with modified flags of a currently mounted filesystem when inside a user namespace) + - external (volume or graph) drivers which are unaware/incapable of using daemon user mappings + - Using `--privileged` mode flag on `docker run` (unless also specifying `--userns=host`) + + In general, user namespaces are an advanced feature and will require + coordination with other capabilities. For example, if volumes are mounted from + the host, file ownership will have to be pre-arranged if the user or + administrator wishes the containers to have expected access to the volume + contents. + + Finally, while the `root` user inside a user namespaced container process has + many of the expected admin privileges that go along with being the superuser, the + Linux kernel has restrictions based on internal knowledge that this is a user namespaced + process. The most notable restriction that we are aware of at this time is the + inability to use `mknod`. Permission will be denied for device creation even as + container `root` inside a user namespace. + + ## Miscellaneous options + + IP masquerading uses address translation to allow containers without a public + IP to talk to other machines on the Internet. This may interfere with some + network topologies and can be disabled with `--ip-masq=false`. + + Docker supports softlinks for the Docker data directory (`/var/lib/docker`) and + for `/var/lib/docker/tmp`. The `DOCKER_TMPDIR` and the data directory can be + set like this: + + DOCKER_TMPDIR=/mnt/disk2/tmp /usr/local/bin/dockerd -D -g /var/lib/docker -H unix:// > /var/lib/docker-machine/docker.log 2>&1 + # or + export DOCKER_TMPDIR=/mnt/disk2/tmp + /usr/local/bin/dockerd -D -g /var/lib/docker -H unix:// > /var/lib/docker-machine/docker.log 2>&1 + + ## Default cgroup parent + + The `--cgroup-parent` option allows you to set the default cgroup parent + to use for containers. If this option is not set, it defaults to `/docker` for + fs cgroup driver and `system.slice` for systemd cgroup driver. + + If the cgroup has a leading forward slash (`/`), the cgroup is created + under the root cgroup, otherwise the cgroup is created under the daemon + cgroup. + + Assuming the daemon is running in cgroup `daemoncgroup`, + `--cgroup-parent=/foobar` creates a cgroup in + `/sys/fs/cgroup/memory/foobar`, whereas using `--cgroup-parent=foobar` + creates the cgroup in `/sys/fs/cgroup/memory/daemoncgroup/foobar` + + The systemd cgroup driver has different rules for `--cgroup-parent`. Systemd + represents hierarchy by slice and the name of the slice encodes the location in + the tree. So `--cgroup-parent` for systemd cgroups should be a slice name. A + name can consist of a dash-separated series of names, which describes the path + to the slice from the root slice. For example, `--cgroup-parent=user-a-b.slice` + means the memory cgroup for the container is created in + `/sys/fs/cgroup/memory/user.slice/user-a.slice/user-a-b.slice/docker-.scope`. + + This setting can also be set per container, using the `--cgroup-parent` + option on `docker create` and `docker run`, and takes precedence over + the `--cgroup-parent` option on the daemon. + + ## Daemon configuration file + + The `--config-file` option allows you to set any configuration option + for the daemon in a JSON format. This file uses the same flag names as keys, + except for flags that allow several entries, where it uses the plural + of the flag name, e.g., `labels` for the `label` flag. + + The options set in the configuration file must not conflict with options set + via flags. The docker daemon fails to start if an option is duplicated between + the file and the flags, regardless their value. We do this to avoid + silently ignore changes introduced in configuration reloads. + For example, the daemon fails to start if you set daemon labels + in the configuration file and also set daemon labels via the `--label` flag. + Options that are not present in the file are ignored when the daemon starts. + + ### Linux configuration file + + The default location of the configuration file on Linux is + `/etc/docker/daemon.json`. The `--config-file` flag can be used to specify a + non-default location. + + This is a full example of the allowed configuration options on Linux: + + ```json + { + "api-cors-header": "", + "authorization-plugins": [], + "bip": "", + "bridge": "", + "cgroup-parent": "", + "cluster-store": "", + "cluster-store-opts": {}, + "cluster-advertise": "", + "debug": true, + "default-gateway": "", + "default-gateway-v6": "", + "default-runtime": "runc", + "default-ulimits": {}, + "disable-legacy-registry": false, + "dns": [], + "dns-opts": [], + "dns-search": [], + "exec-opts": [], + "exec-root": "", + "fixed-cidr": "", + "fixed-cidr-v6": "", + "graph": "", + "group": "", + "hosts": [], + "icc": false, + "insecure-registries": [], + "ip": "0.0.0.0", + "iptables": false, + "ipv6": false, + "ip-forward": false, + "ip-masq": false, + "labels": [], + "live-restore": true, + "log-driver": "", + "log-level": "", + "log-opts": {}, + "max-concurrent-downloads": 3, + "max-concurrent-uploads": 5, + "mtu": 0, + "oom-score-adjust": -500, + "pidfile": "", + "raw-logs": false, + "registry-mirrors": [], + "runtimes": { + "runc": { + "path": "runc" + }, + "custom": { + "path": "/usr/local/bin/my-runc-replacement", + "runtimeArgs": [ + "--debug" + ] + } + }, + "selinux-enabled": false, + "storage-driver": "", + "storage-opts": [], + "swarm-default-advertise-addr": "", + "tls": true, + "tlscacert": "", + "tlscert": "", + "tlskey": "", + "tlsverify": true, + "userland-proxy": false, + "userns-remap": "" + } + ``` + + ### Windows configuration file + + The default location of the configuration file on Windows is + `%programdata%\docker\config\daemon.json`. The `--config-file` flag can be + used to specify a non-default location. + + This is a full example of the allowed configuration options on Windows: + + ```json + { + "authorization-plugins": [], + "bridge": "", + "cluster-advertise": "", + "cluster-store": "", + "debug": true, + "default-ulimits": {}, + "disable-legacy-registry": false, + "dns": [], + "dns-opts": [], + "dns-search": [], + "exec-opts": [], + "fixed-cidr": "", + "graph": "", + "group": "", + "hosts": [], + "insecure-registries": [], + "labels": [], + "live-restore": true, + "log-driver": "", + "log-level": "", + "mtu": 0, + "pidfile": "", + "raw-logs": false, + "registry-mirrors": [], + "storage-driver": "", + "storage-opts": [], + "swarm-default-advertise-addr": "", + "tlscacert": "", + "tlscert": "", + "tlskey": "", + "tlsverify": true + } + ``` + + ### Configuration reloading + + Some options can be reconfigured when the daemon is running without requiring + to restart the process. We use the `SIGHUP` signal in Linux to reload, and a global event + in Windows with the key `Global\docker-daemon-config-$PID`. The options can + be modified in the configuration file but still will check for conflicts with + the provided flags. The daemon fails to reconfigure itself + if there are conflicts, but it won't stop execution. + + The list of currently supported options that can be reconfigured is this: + + - `debug`: it changes the daemon to debug mode when set to true. + - `cluster-store`: it reloads the discovery store with the new address. + - `cluster-store-opts`: it uses the new options to reload the discovery store. + - `cluster-advertise`: it modifies the address advertised after reloading. + - `labels`: it replaces the daemon labels with a new set of labels. + - `live-restore`: Enables [keeping containers alive during daemon downtime](../../admin/live-restore.md). + - `max-concurrent-downloads`: it updates the max concurrent downloads for each pull. + - `max-concurrent-uploads`: it updates the max concurrent uploads for each push. + - `default-runtime`: it updates the runtime to be used if not is + specified at container creation. It defaults to "default" which is + the runtime shipped with the official docker packages. + - `runtimes`: it updates the list of available OCI runtimes that can + be used to run containers + + Updating and reloading the cluster configurations such as `--cluster-store`, + `--cluster-advertise` and `--cluster-store-opts` will take effect only if + these configurations were not previously configured. If `--cluster-store` + has been provided in flags and `cluster-advertise` not, `cluster-advertise` + can be added in the configuration file without accompanied by `--cluster-store` + Configuration reload will log a warning message if it detects a change in + previously configured cluster configurations. + + + ## Running multiple daemons + + > **Note:** Running multiple daemons on a single host is considered as "experimental". The user should be aware of + > unsolved problems. This solution may not work properly in some cases. Solutions are currently under development + > and will be delivered in the near future. + + This section describes how to run multiple Docker daemons on a single host. To + run multiple daemons, you must configure each daemon so that it does not + conflict with other daemons on the same host. You can set these options either + by providing them as flags, or by using a [daemon configuration file](dockerd.md#daemon-configuration-file). + + The following daemon options must be configured for each daemon: + + ```bash + -b, --bridge= Attach containers to a network bridge + --exec-root=/var/run/docker Root of the Docker execdriver + -g, --graph=/var/lib/docker Root of the Docker runtime + -p, --pidfile=/var/run/docker.pid Path to use for daemon PID file + -H, --host=[] Daemon socket(s) to connect to + --iptables=true Enable addition of iptables rules + --config-file=/etc/docker/daemon.json Daemon configuration file + --tlscacert="~/.docker/ca.pem" Trust certs signed only by this CA + --tlscert="~/.docker/cert.pem" Path to TLS certificate file + --tlskey="~/.docker/key.pem" Path to TLS key file + ``` + + When your daemons use different values for these flags, you can run them on the same host without any problems. + It is very important to properly understand the meaning of those options and to use them correctly. + + - The `-b, --bridge=` flag is set to `docker0` as default bridge network. It is created automatically when you install Docker. + If you are not using the default, you must create and configure the bridge manually or just set it to 'none': `--bridge=none` + - `--exec-root` is the path where the container state is stored. The default value is `/var/run/docker`. Specify the path for + your running daemon here. + - `--graph` is the path where images are stored. The default value is `/var/lib/docker`. To avoid any conflict with other daemons + set this parameter separately for each daemon. + - `-p, --pidfile=/var/run/docker.pid` is the path where the process ID of the daemon is stored. Specify the path for your + pid file here. + - `--host=[]` specifies where the Docker daemon will listen for client connections. If unspecified, it defaults to `/var/run/docker.sock`. + - `--iptables=false` prevents the Docker daemon from adding iptables rules. If + multiple daemons manage iptables rules, they may overwrite rules set by another + daemon. Be aware that disabling this option requires you to manually add + iptables rules to expose container ports. If you prevent Docker from adding + iptables rules, Docker will also not add IP masquerading rules, even if you set + `--ip-masq` to `true`. Without IP masquerading rules, Docker containers will not be + able to connect to external hosts or the internet when using network other than + default bridge. + - `--config-file=/etc/docker/daemon.json` is the path where configuration file is stored. You can use it instead of + daemon flags. Specify the path for each daemon. + - `--tls*` Docker daemon supports `--tlsverify` mode that enforces encrypted and authenticated remote connections. + The `--tls*` options enable use of specific certificates for individual daemons. + + Example script for a separate “bootstrap” instance of the Docker daemon without network: + + ```bash + $ sudo dockerd \ + -H unix:///var/run/docker-bootstrap.sock \ + -p /var/run/docker-bootstrap.pid \ + --iptables=false \ + --ip-masq=false \ + --bridge=none \ + --graph=/var/lib/docker-bootstrap \ + --exec-root=/var/run/docker-bootstrap + ``` +usage: dockerd [OPTIONS] +pname: dockerd +plink: dockerd.yaml +options: +- option: add-runtime + description: Register an additional OCI compatible runtime +- option: api-cors-header + description: Set CORS headers in the remote API +- option: authorization-plugin + description: Authorization plugins to load +- option: bridge + shorthand: b + description: Attach containers to a network bridge +- option: bip + description: Specify network bridge IP +- option: cgroup-parent + description: Set parent cgroup for all containers +- option: cluster-advertise + description: Address or interface name to advertise +- option: cluster-store + default_value: map[] + description: Set cluster store options +- option: config-file + default_value: /etc/docker/daemon.json + description: Daemon configuration file +- option: containerd + description: Path to containerd socket +- option: debug + shorthand: D + description: Enable debug mode +- option: default-gateway + description: Container default gateway IPv4 address +- option: default-gateway-v6 + description: Container default gateway IPv6 address +- option: default-runtime + default_value: runc + description: Default OCI runtime for containers +- option: default-ulimit + description: Default ulimits for containers +- option: disable-legacy-registry + description: Disable contacting legacy registries +- option: dns + description: DNS server to use +- option: dns-opt + description: DNS options to use +- option: dns-search + description: DNS search domains to use +- option: exec-opt + description: Runtime execution options +- option: exec-root + default_value: /var/run/docker + description: Root directory for execution state files +- option: fixed-cidr + description: IPv4 subnet for fixed IPs +- option: fixed-cidr-v6 + description: IPv6 subnet for fixed IPs +- option: group + shorthand: G + default_value: docker + description: Group for the unix socket +- option: graph + shorthand: g + default_value: /var/lib/docker + description: Root of the Docker runtime +- option: host + shorthand: H + description: Daemon socket(s) to connect to +- option: help + description: Print usage +- option: icc + default_value: true + description: Enable inter-container communication +- option: insecure-registry + description: Enable insecure registry communication +- option: ip + default_value: 0.0.0.0 + description: Default IP when binding container ports +- option: ip-forward + default_value: true + description: Enable net.ipv4.ip_forward +- option: ip-masq + default_value: true + description: Enable IP masquerading +- option: iptables + default_value: true + description: Enable addition of iptables rules +- option: ipv6 + description: Enable IPv6 networking +- option: log-level + shorthand: l + default_value: info + description: Set the logging level +- option: label + description: Set key=value labels to the daemon +- option: live-restore + description: Enables keeping containers alive during daemon downtime +- option: log-driver + default_value: json-file + description: Default driver for container logs +- option: log-opt + default_value: map[] + description: Default log driver options for containers +- option: max-concurrent-downloads + default_value: 3 + description: Set the max concurrent downloads for each pull +- option: max-concurrent-uploads + default_value: 5 + description: Set the max concurrent uploads for each push +- option: mtu + description: Set the containers network MTU +- option: oom-score-adjust + default_value: -500 + description: Set the oom_score_adj for the daemon +- option: pidfile + shorthand: p + default_value: /var/run/docker.pid + description: Path to use for daemon PID file +- option: raw-logs + description: Full timestamps without ANSI coloring +- option: registry-mirror + description: Preferred Docker registry mirror +- option: storage-driver + shorthand: s + description: Storage driver to use +- option: selinux-enabled + description: Enable selinux support +- option: storage-opt + description: Storage driver options +- option: swarm-default-advertise-addr + description: Set default address or interface for swarm advertised address +- option: tls + description: Use TLS; implied by --tlsverify +- option: tlscacert + default_value: ~/.docker/ca.pem + description: Trust certs signed only by this CA +- option: tlscert + default_value: ~/.docker/cert.pem + description: Path to TLS certificate file +- option: tlskey + default_value: ~/.docker/key.pem + description: Path to TLS key file +- option: tlsverify + description: Use TLS and verify the remote +- option: userland-proxy + default_value: true + description: Use userland proxy for loopback traffic +- option: userns-remap + description: User/Group setting for user namespaces +- option: version + shorthand: v + description: Print version information and quit diff --git a/_data/engine-cli/docker.yaml b/_data/engine-cli/docker.yaml new file mode 100644 index 00000000000..c214f7f9ed5 --- /dev/null +++ b/_data/engine-cli/docker.yaml @@ -0,0 +1,109 @@ +command: docker +cname: +- docker attach +- docker build +- docker checkpoint +- docker commit +- docker container +- docker cp +- docker create +- docker deploy +- docker diff +- docker events +- docker exec +- docker export +- docker history +- docker image +- docker images +- docker import +- docker info +- docker inspect +- docker kill +- docker load +- docker login +- docker logout +- docker logs +- docker network +- docker node +- docker pause +- docker plugin +- docker port +- docker ps +- docker pull +- docker push +- docker rename +- docker restart +- docker rm +- docker rmi +- docker run +- docker save +- docker search +- docker secret +- docker service +- docker stack +- docker start +- docker stats +- docker stop +- docker swarm +- docker system +- docker tag +- docker top +- docker unpause +- docker update +- docker version +- docker volume +- docker wait +clink: +- docker_attach.yaml +- docker_build.yaml +- docker_checkpoint.yaml +- docker_commit.yaml +- docker_container.yaml +- docker_cp.yaml +- docker_create.yaml +- docker_deploy.yaml +- docker_diff.yaml +- docker_events.yaml +- docker_exec.yaml +- docker_export.yaml +- docker_history.yaml +- docker_image.yaml +- docker_images.yaml +- docker_import.yaml +- docker_info.yaml +- docker_inspect.yaml +- docker_kill.yaml +- docker_load.yaml +- docker_login.yaml +- docker_logout.yaml +- docker_logs.yaml +- docker_network.yaml +- docker_node.yaml +- docker_pause.yaml +- docker_plugin.yaml +- docker_port.yaml +- docker_ps.yaml +- docker_pull.yaml +- docker_push.yaml +- docker_rename.yaml +- docker_restart.yaml +- docker_rm.yaml +- docker_rmi.yaml +- docker_run.yaml +- docker_save.yaml +- docker_search.yaml +- docker_secret.yaml +- docker_service.yaml +- docker_stack.yaml +- docker_start.yaml +- docker_stats.yaml +- docker_stop.yaml +- docker_swarm.yaml +- docker_system.yaml +- docker_tag.yaml +- docker_top.yaml +- docker_unpause.yaml +- docker_update.yaml +- docker_version.yaml +- docker_volume.yaml +- docker_wait.yaml diff --git a/_data/engine-cli/docker_attach.yaml b/_data/engine-cli/docker_attach.yaml new file mode 100644 index 00000000000..6ce8b4ff285 --- /dev/null +++ b/_data/engine-cli/docker_attach.yaml @@ -0,0 +1,15 @@ +command: docker attach +short: Attach to a running container +long: Attach to a running container +usage: docker attach [OPTIONS] CONTAINER +pname: docker +plink: docker.yaml +options: +- option: detach-keys + description: Override the key sequence for detaching a container +- option: no-stdin + default_value: "false" + description: Do not attach STDIN +- option: sig-proxy + default_value: "true" + description: Proxy all received signals to the process diff --git a/_data/engine-cli/docker_build.yaml b/_data/engine-cli/docker_build.yaml new file mode 100644 index 00000000000..f77ffc43042 --- /dev/null +++ b/_data/engine-cli/docker_build.yaml @@ -0,0 +1,84 @@ +command: docker build +short: Build an image from a Dockerfile +long: Build an image from a Dockerfile +usage: docker build [OPTIONS] PATH | URL | - +pname: docker +plink: docker.yaml +options: +- option: build-arg + default_value: '[]' + description: Set build-time variables +- option: cache-from + default_value: '[]' + description: Images to consider as cache sources +- option: cgroup-parent + description: Optional parent cgroup for the container +- option: compress + default_value: "false" + description: Compress the build context using gzip +- option: cpu-period + default_value: "0" + description: Limit the CPU CFS (Completely Fair Scheduler) period +- option: cpu-quota + default_value: "0" + description: Limit the CPU CFS (Completely Fair Scheduler) quota +- option: cpu-shares + shorthand: c + default_value: "0" + description: CPU shares (relative weight) +- option: cpuset-cpus + description: CPUs in which to allow execution (0-3, 0,1) +- option: cpuset-mems + description: MEMs in which to allow execution (0-3, 0,1) +- option: disable-content-trust + default_value: "true" + description: Skip image verification +- option: file + shorthand: f + description: Name of the Dockerfile (Default is 'PATH/Dockerfile') +- option: force-rm + default_value: "false" + description: Always remove intermediate containers +- option: isolation + description: Container isolation technology +- option: label + default_value: '[]' + description: Set metadata for an image +- option: memory + shorthand: m + description: Memory limit +- option: memory-swap + description: | + Swap limit equal to memory plus swap: '-1' to enable unlimited swap +- option: network + default_value: default + description: | + Set the networking mode for the RUN instructions during build +- option: no-cache + default_value: "false" + description: Do not use cache when building the image +- option: pull + default_value: "false" + description: Always attempt to pull a newer version of the image +- option: quiet + shorthand: q + default_value: "false" + description: Suppress the build output and print image ID on success +- option: rm + default_value: "true" + description: Remove intermediate containers after a successful build +- option: security-opt + default_value: '[]' + description: Security options +- option: shm-size + description: Size of /dev/shm, default value is 64MB +- option: squash + default_value: "false" + description: Squash newly built layers into a single new layer +- option: tag + shorthand: t + default_value: '[]' + description: Name and optionally a tag in the 'name:tag' format +- option: ulimit + default_value: '[]' + description: Ulimit options diff --git a/_data/engine-cli/docker_checkpoint.yaml b/_data/engine-cli/docker_checkpoint.yaml new file mode 100644 index 00000000000..29a4441af10 --- /dev/null +++ b/_data/engine-cli/docker_checkpoint.yaml @@ -0,0 +1,14 @@ +command: docker checkpoint +short: Manage checkpoints +long: Manage checkpoints +usage: docker checkpoint +pname: docker +plink: docker.yaml +cname: +- docker checkpoint create +- docker checkpoint ls +- docker checkpoint rm +clink: +- docker_checkpoint_create.yaml +- docker_checkpoint_ls.yaml +- docker_checkpoint_rm.yaml diff --git a/_data/engine-cli/docker_checkpoint_create.yaml b/_data/engine-cli/docker_checkpoint_create.yaml new file mode 100644 index 00000000000..2e8f0a9529b --- /dev/null +++ b/_data/engine-cli/docker_checkpoint_create.yaml @@ -0,0 +1,12 @@ +command: docker checkpoint create +short: Create a checkpoint from a running container +long: Create a checkpoint from a running container +usage: docker checkpoint create [OPTIONS] CONTAINER CHECKPOINT +pname: docker checkpoint +plink: docker_checkpoint.yaml +options: +- option: checkpoint-dir + description: Use a custom checkpoint storage directory +- option: leave-running + default_value: "false" + description: Leave the container running after checkpoint diff --git a/_data/engine-cli/docker_checkpoint_ls.yaml b/_data/engine-cli/docker_checkpoint_ls.yaml new file mode 100644 index 00000000000..959ddf90c2c --- /dev/null +++ b/_data/engine-cli/docker_checkpoint_ls.yaml @@ -0,0 +1,9 @@ +command: docker checkpoint ls +short: List checkpoints for a container +long: List checkpoints for a container +usage: docker checkpoint ls [OPTIONS] CONTAINER +pname: docker checkpoint +plink: docker_checkpoint.yaml +options: +- option: checkpoint-dir + description: Use a custom checkpoint storage directory diff --git a/_data/engine-cli/docker_checkpoint_rm.yaml b/_data/engine-cli/docker_checkpoint_rm.yaml new file mode 100644 index 00000000000..0534b2d50b0 --- /dev/null +++ b/_data/engine-cli/docker_checkpoint_rm.yaml @@ -0,0 +1,9 @@ +command: docker checkpoint rm +short: Remove a checkpoint +long: Remove a checkpoint +usage: docker checkpoint rm [OPTIONS] CONTAINER CHECKPOINT +pname: docker checkpoint +plink: docker_checkpoint.yaml +options: +- option: checkpoint-dir + description: Use a custom checkpoint storage directory diff --git a/_data/engine-cli/docker_commit.yaml b/_data/engine-cli/docker_commit.yaml new file mode 100644 index 00000000000..3c00e494345 --- /dev/null +++ b/_data/engine-cli/docker_commit.yaml @@ -0,0 +1,21 @@ +command: docker commit +short: Create a new image from a container's changes +long: Create a new image from a container's changes +usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] +pname: docker +plink: docker.yaml +options: +- option: author + shorthand: a + description: Author (e.g., "John Hannibal Smith ") +- option: change + shorthand: c + default_value: '[]' + description: Apply Dockerfile instruction to the created image +- option: message + shorthand: m + description: Commit message +- option: pause + shorthand: p + default_value: "true" + description: Pause container during commit diff --git a/_data/engine-cli/docker_container.yaml b/_data/engine-cli/docker_container.yaml new file mode 100644 index 00000000000..82d287f8580 --- /dev/null +++ b/_data/engine-cli/docker_container.yaml @@ -0,0 +1,58 @@ +command: docker container +short: Manage containers +long: Manage containers +usage: docker container +pname: docker +plink: docker.yaml +cname: +- docker container attach +- docker container commit +- docker container cp +- docker container create +- docker container diff +- docker container exec +- docker container export +- docker container inspect +- docker container kill +- docker container logs +- docker container ls +- docker container pause +- docker container port +- docker container prune +- docker container rename +- docker container restart +- docker container rm +- docker container run +- docker container start +- docker container stats +- docker container stop +- docker container top +- docker container unpause +- docker container update +- docker container wait +clink: +- docker_container_attach.yaml +- docker_container_commit.yaml +- docker_container_cp.yaml +- docker_container_create.yaml +- docker_container_diff.yaml +- docker_container_exec.yaml +- docker_container_export.yaml +- docker_container_inspect.yaml +- docker_container_kill.yaml +- docker_container_logs.yaml +- docker_container_ls.yaml +- docker_container_pause.yaml +- docker_container_port.yaml +- docker_container_prune.yaml +- docker_container_rename.yaml +- docker_container_restart.yaml +- docker_container_rm.yaml +- docker_container_run.yaml +- docker_container_start.yaml +- docker_container_stats.yaml +- docker_container_stop.yaml +- docker_container_top.yaml +- docker_container_unpause.yaml +- docker_container_update.yaml +- docker_container_wait.yaml diff --git a/_data/engine-cli/docker_container_attach.yaml b/_data/engine-cli/docker_container_attach.yaml new file mode 100644 index 00000000000..ff4c77b2fa7 --- /dev/null +++ b/_data/engine-cli/docker_container_attach.yaml @@ -0,0 +1,15 @@ +command: docker container attach +short: Attach to a running container +long: Attach to a running container +usage: docker container attach [OPTIONS] CONTAINER +pname: docker container +plink: docker_container.yaml +options: +- option: detach-keys + description: Override the key sequence for detaching a container +- option: no-stdin + default_value: "false" + description: Do not attach STDIN +- option: sig-proxy + default_value: "true" + description: Proxy all received signals to the process diff --git a/_data/engine-cli/docker_container_commit.yaml b/_data/engine-cli/docker_container_commit.yaml new file mode 100644 index 00000000000..3c5a87bcb2d --- /dev/null +++ b/_data/engine-cli/docker_container_commit.yaml @@ -0,0 +1,21 @@ +command: docker container commit +short: Create a new image from a container's changes +long: Create a new image from a container's changes +usage: docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] +pname: docker container +plink: docker_container.yaml +options: +- option: author + shorthand: a + description: Author (e.g., "John Hannibal Smith ") +- option: change + shorthand: c + default_value: '[]' + description: Apply Dockerfile instruction to the created image +- option: message + shorthand: m + description: Commit message +- option: pause + shorthand: p + default_value: "true" + description: Pause container during commit diff --git a/_data/engine-cli/docker_container_cp.yaml b/_data/engine-cli/docker_container_cp.yaml new file mode 100644 index 00000000000..b437905c37c --- /dev/null +++ b/_data/engine-cli/docker_container_cp.yaml @@ -0,0 +1,18 @@ +command: docker container cp +short: Copy files/folders between a container and the local filesystem +long: |- + Copy files/folders between a container and the local filesystem + + Use '-' as the source to read a tar archive from stdin + and extract it to a directory destination in a container. + Use '-' as the destination to stream a tar archive of a + container source to stdout. +usage: "docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-\n\tdocker cp + [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH" +pname: docker container +plink: docker_container.yaml +options: +- option: follow-link + shorthand: L + default_value: "false" + description: Always follow symbol link in SRC_PATH diff --git a/_data/engine-cli/docker_container_create.yaml b/_data/engine-cli/docker_container_create.yaml new file mode 100644 index 00000000000..a9eac33c40c --- /dev/null +++ b/_data/engine-cli/docker_container_create.yaml @@ -0,0 +1,278 @@ +command: docker container create +short: Create a new container +long: Create a new container +usage: docker container create [OPTIONS] IMAGE [COMMAND] [ARG...] +pname: docker container +plink: docker_container.yaml +options: +- option: add-host + default_value: '[]' + description: Add a custom host-to-IP mapping (host:ip) +- option: attach + shorthand: a + default_value: '[]' + description: Attach to STDIN, STDOUT or STDERR +- option: blkio-weight + default_value: "0" + description: | + Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0) +- option: blkio-weight-device + default_value: '[]' + description: Block IO weight (relative device weight) +- option: cap-add + default_value: '[]' + description: Add Linux capabilities +- option: cap-drop + default_value: '[]' + description: Drop Linux capabilities +- option: cgroup-parent + description: Optional parent cgroup for the container +- option: cidfile + description: Write the container ID to the file +- option: cpu-count + default_value: "0" + description: CPU count (Windows only) +- option: cpu-percent + default_value: "0" + description: CPU percent (Windows only) +- option: cpu-period + default_value: "0" + description: Limit CPU CFS (Completely Fair Scheduler) period +- option: cpu-quota + default_value: "0" + description: Limit CPU CFS (Completely Fair Scheduler) quota +- option: cpu-rt-period + default_value: "0" + description: Limit CPU real-time period in microseconds +- option: cpu-rt-runtime + default_value: "0" + description: Limit CPU real-time runtime in microseconds +- option: cpu-shares + shorthand: c + default_value: "0" + description: CPU shares (relative weight) +- option: cpus + default_value: "0.000" + description: Number of CPUs +- option: cpuset-cpus + description: CPUs in which to allow execution (0-3, 0,1) +- option: cpuset-mems + description: MEMs in which to allow execution (0-3, 0,1) +- option: credentialspec + description: Credential spec for managed service account (Windows only) +- option: device + default_value: '[]' + description: Add a host device to the container +- option: device-read-bps + default_value: '[]' + description: Limit read rate (bytes per second) from a device +- option: device-read-iops + default_value: '[]' + description: Limit read rate (IO per second) from a device +- option: device-write-bps + default_value: '[]' + description: Limit write rate (bytes per second) to a device +- option: device-write-iops + default_value: '[]' + description: Limit write rate (IO per second) to a device +- option: disable-content-trust + default_value: "true" + description: Skip image verification +- option: dns + default_value: '[]' + description: Set custom DNS servers +- option: dns-opt + default_value: '[]' + description: Set DNS options +- option: dns-option + default_value: '[]' + description: Set DNS options +- option: dns-search + default_value: '[]' + description: Set custom DNS search domains +- option: entrypoint + description: Overwrite the default ENTRYPOINT of the image +- option: env + shorthand: e + default_value: '[]' + description: Set environment variables +- option: env-file + default_value: '[]' + description: Read in a file of environment variables +- option: expose + default_value: '[]' + description: Expose a port or a range of ports +- option: group-add + default_value: '[]' + description: Add additional groups to join +- option: health-cmd + description: Command to run to check health +- option: health-interval + default_value: "0" + description: Time between running the check (ns|us|ms|s|m|h) (default 0s) +- option: health-retries + default_value: "0" + description: Consecutive failures needed to report unhealthy +- option: health-timeout + default_value: "0" + description: | + Maximum time to allow one check to run (ns|us|ms|s|m|h) (default 0s) +- option: help + default_value: "false" + description: Print usage +- option: hostname + shorthand: h + description: Container host name +- option: init + default_value: "false" + description: | + Run an init inside the container that forwards signals and reaps processes +- option: init-path + description: Path to the docker-init binary +- option: interactive + shorthand: i + default_value: "false" + description: Keep STDIN open even if not attached +- option: io-maxbandwidth + description: | + Maximum IO bandwidth limit for the system drive (Windows only) +- option: io-maxiops + default_value: "0" + description: Maximum IOps limit for the system drive (Windows only) +- option: ip + description: Container IPv4 address (e.g. 172.30.100.104) +- option: ip6 + description: Container IPv6 address (e.g. 2001:db8::33) +- option: ipc + description: IPC namespace to use +- option: isolation + description: Container isolation technology +- option: kernel-memory + description: Kernel memory limit +- option: label + shorthand: l + default_value: '[]' + description: Set meta data on a container +- option: label-file + default_value: '[]' + description: Read in a line delimited file of labels +- option: link + default_value: '[]' + description: Add link to another container +- option: link-local-ip + default_value: '[]' + description: Container IPv4/IPv6 link-local addresses +- option: log-driver + description: Logging driver for the container +- option: log-opt + default_value: '[]' + description: Log driver options +- option: mac-address + description: Container MAC address (e.g. 92:d0:c6:0a:29:33) +- option: memory + shorthand: m + description: Memory limit +- option: memory-reservation + description: Memory soft limit +- option: memory-swap + description: | + Swap limit equal to memory plus swap: '-1' to enable unlimited swap +- option: memory-swappiness + default_value: "-1" + description: Tune container memory swappiness (0 to 100) +- option: name + description: Assign a name to the container +- option: net + default_value: default + description: Connect a container to a network +- option: net-alias + default_value: '[]' + description: Add network-scoped alias for the container +- option: network + default_value: default + description: Connect a container to a network +- option: network-alias + default_value: '[]' + description: Add network-scoped alias for the container +- option: no-healthcheck + default_value: "false" + description: Disable any container-specified HEALTHCHECK +- option: oom-kill-disable + default_value: "false" + description: Disable OOM Killer +- option: oom-score-adj + default_value: "0" + description: Tune host's OOM preferences (-1000 to 1000) +- option: pid + description: PID namespace to use +- option: pids-limit + default_value: "0" + description: Tune container pids limit (set -1 for unlimited) +- option: privileged + default_value: "false" + description: Give extended privileges to this container +- option: publish + shorthand: p + default_value: '[]' + description: Publish a container's port(s) to the host +- option: publish-all + shorthand: P + default_value: "false" + description: Publish all exposed ports to random ports +- option: read-only + default_value: "false" + description: Mount the container's root filesystem as read only +- option: restart + default_value: "no" + description: Restart policy to apply when a container exits +- option: rm + default_value: "false" + description: Automatically remove the container when it exits +- option: runtime + description: Runtime to use for this container +- option: security-opt + default_value: '[]' + description: Security Options +- option: shm-size + description: Size of /dev/shm, default value is 64MB +- option: stop-signal + default_value: SIGTERM + description: Signal to stop a container, SIGTERM by default +- option: stop-timeout + default_value: "0" + description: Timeout (in seconds) to stop a container +- option: storage-opt + default_value: '[]' + description: Storage driver options for the container +- option: sysctl + default_value: map[] + description: Sysctl options +- option: tmpfs + default_value: '[]' + description: Mount a tmpfs directory +- option: tty + shorthand: t + default_value: "false" + description: Allocate a pseudo-TTY +- option: ulimit + default_value: '[]' + description: Ulimit options +- option: user + shorthand: u + description: 'Username or UID (format: [:])' +- option: userns + description: User namespace to use +- option: uts + description: UTS namespace to use +- option: volume + shorthand: v + default_value: '[]' + description: Bind mount a volume +- option: volume-driver + description: Optional volume driver for the container +- option: volumes-from + default_value: '[]' + description: Mount volumes from the specified container(s) +- option: workdir + shorthand: w + description: Working directory inside the container diff --git a/_data/engine-cli/docker_container_diff.yaml b/_data/engine-cli/docker_container_diff.yaml new file mode 100644 index 00000000000..0e532f24686 --- /dev/null +++ b/_data/engine-cli/docker_container_diff.yaml @@ -0,0 +1,6 @@ +command: docker container diff +short: Inspect changes on a container's filesystem +long: Inspect changes on a container's filesystem +usage: docker container diff CONTAINER +pname: docker container +plink: docker_container.yaml diff --git a/_data/engine-cli/docker_container_exec.yaml b/_data/engine-cli/docker_container_exec.yaml new file mode 100644 index 00000000000..95b544670bc --- /dev/null +++ b/_data/engine-cli/docker_container_exec.yaml @@ -0,0 +1,31 @@ +command: docker container exec +short: Run a command in a running container +long: Run a command in a running container +usage: docker container exec [OPTIONS] CONTAINER COMMAND [ARG...] +pname: docker container +plink: docker_container.yaml +options: +- option: detach + shorthand: d + default_value: "false" + description: 'Detached mode: run command in the background' +- option: detach-keys + description: Override the key sequence for detaching a container +- option: env + shorthand: e + default_value: '[]' + description: Set environment variables +- option: interactive + shorthand: i + default_value: "false" + description: Keep STDIN open even if not attached +- option: privileged + default_value: "false" + description: Give extended privileges to the command +- option: tty + shorthand: t + default_value: "false" + description: Allocate a pseudo-TTY +- option: user + shorthand: u + description: 'Username or UID (format: [:])' diff --git a/_data/engine-cli/docker_container_export.yaml b/_data/engine-cli/docker_container_export.yaml new file mode 100644 index 00000000000..fff2766d2cb --- /dev/null +++ b/_data/engine-cli/docker_container_export.yaml @@ -0,0 +1,10 @@ +command: docker container export +short: Export a container's filesystem as a tar archive +long: Export a container's filesystem as a tar archive +usage: docker container export [OPTIONS] CONTAINER +pname: docker container +plink: docker_container.yaml +options: +- option: output + shorthand: o + description: Write to a file, instead of STDOUT diff --git a/_data/engine-cli/docker_container_inspect.yaml b/_data/engine-cli/docker_container_inspect.yaml new file mode 100644 index 00000000000..6590496cbda --- /dev/null +++ b/_data/engine-cli/docker_container_inspect.yaml @@ -0,0 +1,14 @@ +command: docker container inspect +short: Display detailed information on one or more containers +long: Display detailed information on one or more containers +usage: docker container inspect [OPTIONS] CONTAINER [CONTAINER...] +pname: docker container +plink: docker_container.yaml +options: +- option: format + shorthand: f + description: Format the output using the given Go template +- option: size + shorthand: s + default_value: "false" + description: Display total file sizes diff --git a/_data/engine-cli/docker_container_kill.yaml b/_data/engine-cli/docker_container_kill.yaml new file mode 100644 index 00000000000..421f779e5fe --- /dev/null +++ b/_data/engine-cli/docker_container_kill.yaml @@ -0,0 +1,11 @@ +command: docker container kill +short: Kill one or more running containers +long: Kill one or more running containers +usage: docker container kill [OPTIONS] CONTAINER [CONTAINER...] +pname: docker container +plink: docker_container.yaml +options: +- option: signal + shorthand: s + default_value: KILL + description: Signal to send to the container diff --git a/_data/engine-cli/docker_container_logs.yaml b/_data/engine-cli/docker_container_logs.yaml new file mode 100644 index 00000000000..b1d9d5af214 --- /dev/null +++ b/_data/engine-cli/docker_container_logs.yaml @@ -0,0 +1,23 @@ +command: docker container logs +short: Fetch the logs of a container +long: Fetch the logs of a container +usage: docker container logs [OPTIONS] CONTAINER +pname: docker container +plink: docker_container.yaml +options: +- option: details + default_value: "false" + description: Show extra details provided to logs +- option: follow + shorthand: f + default_value: "false" + description: Follow log output +- option: since + description: Show logs since timestamp +- option: tail + default_value: all + description: Number of lines to show from the end of the logs +- option: timestamps + shorthand: t + default_value: "false" + description: Show timestamps diff --git a/_data/engine-cli/docker_container_ls.yaml b/_data/engine-cli/docker_container_ls.yaml new file mode 100644 index 00000000000..ef425c6be18 --- /dev/null +++ b/_data/engine-cli/docker_container_ls.yaml @@ -0,0 +1,35 @@ +command: docker container ls +short: List containers +long: List containers +usage: docker container ls [OPTIONS] +pname: docker container +plink: docker_container.yaml +options: +- option: all + shorthand: a + default_value: "false" + description: Show all containers (default shows just running) +- option: filter + shorthand: f + description: Filter output based on conditions provided +- option: format + description: Pretty-print containers using a Go template +- option: last + shorthand: "n" + default_value: "-1" + description: Show n last created containers (includes all states) +- option: latest + shorthand: l + default_value: "false" + description: Show the latest created container (includes all states) +- option: no-trunc + default_value: "false" + description: Don't truncate output +- option: quiet + shorthand: q + default_value: "false" + description: Only display numeric IDs +- option: size + shorthand: s + default_value: "false" + description: Display total file sizes diff --git a/_data/engine-cli/docker_container_pause.yaml b/_data/engine-cli/docker_container_pause.yaml new file mode 100644 index 00000000000..e6fabc1f766 --- /dev/null +++ b/_data/engine-cli/docker_container_pause.yaml @@ -0,0 +1,6 @@ +command: docker container pause +short: Pause all processes within one or more containers +long: Pause all processes within one or more containers +usage: docker container pause CONTAINER [CONTAINER...] +pname: docker container +plink: docker_container.yaml diff --git a/_data/engine-cli/docker_container_port.yaml b/_data/engine-cli/docker_container_port.yaml new file mode 100644 index 00000000000..99c0ee6702b --- /dev/null +++ b/_data/engine-cli/docker_container_port.yaml @@ -0,0 +1,6 @@ +command: docker container port +short: List port mappings or a specific mapping for the container +long: List port mappings or a specific mapping for the container +usage: docker container port CONTAINER [PRIVATE_PORT[/PROTO]] +pname: docker container +plink: docker_container.yaml diff --git a/_data/engine-cli/docker_container_prune.yaml b/_data/engine-cli/docker_container_prune.yaml new file mode 100644 index 00000000000..3b433e0d0e0 --- /dev/null +++ b/_data/engine-cli/docker_container_prune.yaml @@ -0,0 +1,11 @@ +command: docker container prune +short: Remove all stopped containers +long: Remove all stopped containers +usage: docker container prune [OPTIONS] +pname: docker container +plink: docker_container.yaml +options: +- option: force + shorthand: f + default_value: "false" + description: Do not prompt for confirmation diff --git a/_data/engine-cli/docker_container_rename.yaml b/_data/engine-cli/docker_container_rename.yaml new file mode 100644 index 00000000000..9a289fe028a --- /dev/null +++ b/_data/engine-cli/docker_container_rename.yaml @@ -0,0 +1,6 @@ +command: docker container rename +short: Rename a container +long: Rename a container +usage: docker container rename CONTAINER NEW_NAME +pname: docker container +plink: docker_container.yaml diff --git a/_data/engine-cli/docker_container_restart.yaml b/_data/engine-cli/docker_container_restart.yaml new file mode 100644 index 00000000000..717e1ce8971 --- /dev/null +++ b/_data/engine-cli/docker_container_restart.yaml @@ -0,0 +1,11 @@ +command: docker container restart +short: Restart one or more containers +long: Restart one or more containers +usage: docker container restart [OPTIONS] CONTAINER [CONTAINER...] +pname: docker container +plink: docker_container.yaml +options: +- option: time + shorthand: t + default_value: "10" + description: Seconds to wait for stop before killing the container diff --git a/_data/engine-cli/docker_container_rm.yaml b/_data/engine-cli/docker_container_rm.yaml new file mode 100644 index 00000000000..6cbc0396a68 --- /dev/null +++ b/_data/engine-cli/docker_container_rm.yaml @@ -0,0 +1,19 @@ +command: docker container rm +short: Remove one or more containers +long: Remove one or more containers +usage: docker container rm [OPTIONS] CONTAINER [CONTAINER...] +pname: docker container +plink: docker_container.yaml +options: +- option: force + shorthand: f + default_value: "false" + description: Force the removal of a running container (uses SIGKILL) +- option: link + shorthand: l + default_value: "false" + description: Remove the specified link +- option: volumes + shorthand: v + default_value: "false" + description: Remove the volumes associated with the container diff --git a/_data/engine-cli/docker_container_run.yaml b/_data/engine-cli/docker_container_run.yaml new file mode 100644 index 00000000000..71e201696f0 --- /dev/null +++ b/_data/engine-cli/docker_container_run.yaml @@ -0,0 +1,287 @@ +command: docker container run +short: Run a command in a new container +long: Run a command in a new container +usage: docker container run [OPTIONS] IMAGE [COMMAND] [ARG...] +pname: docker container +plink: docker_container.yaml +options: +- option: add-host + default_value: '[]' + description: Add a custom host-to-IP mapping (host:ip) +- option: attach + shorthand: a + default_value: '[]' + description: Attach to STDIN, STDOUT or STDERR +- option: blkio-weight + default_value: "0" + description: | + Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0) +- option: blkio-weight-device + default_value: '[]' + description: Block IO weight (relative device weight) +- option: cap-add + default_value: '[]' + description: Add Linux capabilities +- option: cap-drop + default_value: '[]' + description: Drop Linux capabilities +- option: cgroup-parent + description: Optional parent cgroup for the container +- option: cidfile + description: Write the container ID to the file +- option: cpu-count + default_value: "0" + description: CPU count (Windows only) +- option: cpu-percent + default_value: "0" + description: CPU percent (Windows only) +- option: cpu-period + default_value: "0" + description: Limit CPU CFS (Completely Fair Scheduler) period +- option: cpu-quota + default_value: "0" + description: Limit CPU CFS (Completely Fair Scheduler) quota +- option: cpu-rt-period + default_value: "0" + description: Limit CPU real-time period in microseconds +- option: cpu-rt-runtime + default_value: "0" + description: Limit CPU real-time runtime in microseconds +- option: cpu-shares + shorthand: c + default_value: "0" + description: CPU shares (relative weight) +- option: cpus + default_value: "0.000" + description: Number of CPUs +- option: cpuset-cpus + description: CPUs in which to allow execution (0-3, 0,1) +- option: cpuset-mems + description: MEMs in which to allow execution (0-3, 0,1) +- option: credentialspec + description: Credential spec for managed service account (Windows only) +- option: detach + shorthand: d + default_value: "false" + description: Run container in background and print container ID +- option: detach-keys + description: Override the key sequence for detaching a container +- option: device + default_value: '[]' + description: Add a host device to the container +- option: device-read-bps + default_value: '[]' + description: Limit read rate (bytes per second) from a device +- option: device-read-iops + default_value: '[]' + description: Limit read rate (IO per second) from a device +- option: device-write-bps + default_value: '[]' + description: Limit write rate (bytes per second) to a device +- option: device-write-iops + default_value: '[]' + description: Limit write rate (IO per second) to a device +- option: disable-content-trust + default_value: "true" + description: Skip image verification +- option: dns + default_value: '[]' + description: Set custom DNS servers +- option: dns-opt + default_value: '[]' + description: Set DNS options +- option: dns-option + default_value: '[]' + description: Set DNS options +- option: dns-search + default_value: '[]' + description: Set custom DNS search domains +- option: entrypoint + description: Overwrite the default ENTRYPOINT of the image +- option: env + shorthand: e + default_value: '[]' + description: Set environment variables +- option: env-file + default_value: '[]' + description: Read in a file of environment variables +- option: expose + default_value: '[]' + description: Expose a port or a range of ports +- option: group-add + default_value: '[]' + description: Add additional groups to join +- option: health-cmd + description: Command to run to check health +- option: health-interval + default_value: "0" + description: Time between running the check (ns|us|ms|s|m|h) (default 0s) +- option: health-retries + default_value: "0" + description: Consecutive failures needed to report unhealthy +- option: health-timeout + default_value: "0" + description: | + Maximum time to allow one check to run (ns|us|ms|s|m|h) (default 0s) +- option: help + default_value: "false" + description: Print usage +- option: hostname + shorthand: h + description: Container host name +- option: init + default_value: "false" + description: | + Run an init inside the container that forwards signals and reaps processes +- option: init-path + description: Path to the docker-init binary +- option: interactive + shorthand: i + default_value: "false" + description: Keep STDIN open even if not attached +- option: io-maxbandwidth + description: | + Maximum IO bandwidth limit for the system drive (Windows only) +- option: io-maxiops + default_value: "0" + description: Maximum IOps limit for the system drive (Windows only) +- option: ip + description: Container IPv4 address (e.g. 172.30.100.104) +- option: ip6 + description: Container IPv6 address (e.g. 2001:db8::33) +- option: ipc + description: IPC namespace to use +- option: isolation + description: Container isolation technology +- option: kernel-memory + description: Kernel memory limit +- option: label + shorthand: l + default_value: '[]' + description: Set meta data on a container +- option: label-file + default_value: '[]' + description: Read in a line delimited file of labels +- option: link + default_value: '[]' + description: Add link to another container +- option: link-local-ip + default_value: '[]' + description: Container IPv4/IPv6 link-local addresses +- option: log-driver + description: Logging driver for the container +- option: log-opt + default_value: '[]' + description: Log driver options +- option: mac-address + description: Container MAC address (e.g. 92:d0:c6:0a:29:33) +- option: memory + shorthand: m + description: Memory limit +- option: memory-reservation + description: Memory soft limit +- option: memory-swap + description: | + Swap limit equal to memory plus swap: '-1' to enable unlimited swap +- option: memory-swappiness + default_value: "-1" + description: Tune container memory swappiness (0 to 100) +- option: name + description: Assign a name to the container +- option: net + default_value: default + description: Connect a container to a network +- option: net-alias + default_value: '[]' + description: Add network-scoped alias for the container +- option: network + default_value: default + description: Connect a container to a network +- option: network-alias + default_value: '[]' + description: Add network-scoped alias for the container +- option: no-healthcheck + default_value: "false" + description: Disable any container-specified HEALTHCHECK +- option: oom-kill-disable + default_value: "false" + description: Disable OOM Killer +- option: oom-score-adj + default_value: "0" + description: Tune host's OOM preferences (-1000 to 1000) +- option: pid + description: PID namespace to use +- option: pids-limit + default_value: "0" + description: Tune container pids limit (set -1 for unlimited) +- option: privileged + default_value: "false" + description: Give extended privileges to this container +- option: publish + shorthand: p + default_value: '[]' + description: Publish a container's port(s) to the host +- option: publish-all + shorthand: P + default_value: "false" + description: Publish all exposed ports to random ports +- option: read-only + default_value: "false" + description: Mount the container's root filesystem as read only +- option: restart + default_value: "no" + description: Restart policy to apply when a container exits +- option: rm + default_value: "false" + description: Automatically remove the container when it exits +- option: runtime + description: Runtime to use for this container +- option: security-opt + default_value: '[]' + description: Security Options +- option: shm-size + description: Size of /dev/shm, default value is 64MB +- option: sig-proxy + default_value: "true" + description: Proxy received signals to the process +- option: stop-signal + default_value: SIGTERM + description: Signal to stop a container, SIGTERM by default +- option: stop-timeout + default_value: "0" + description: Timeout (in seconds) to stop a container +- option: storage-opt + default_value: '[]' + description: Storage driver options for the container +- option: sysctl + default_value: map[] + description: Sysctl options +- option: tmpfs + default_value: '[]' + description: Mount a tmpfs directory +- option: tty + shorthand: t + default_value: "false" + description: Allocate a pseudo-TTY +- option: ulimit + default_value: '[]' + description: Ulimit options +- option: user + shorthand: u + description: 'Username or UID (format: [:])' +- option: userns + description: User namespace to use +- option: uts + description: UTS namespace to use +- option: volume + shorthand: v + default_value: '[]' + description: Bind mount a volume +- option: volume-driver + description: Optional volume driver for the container +- option: volumes-from + default_value: '[]' + description: Mount volumes from the specified container(s) +- option: workdir + shorthand: w + description: Working directory inside the container diff --git a/_data/engine-cli/docker_container_start.yaml b/_data/engine-cli/docker_container_start.yaml new file mode 100644 index 00000000000..abe60a60a9c --- /dev/null +++ b/_data/engine-cli/docker_container_start.yaml @@ -0,0 +1,21 @@ +command: docker container start +short: Start one or more stopped containers +long: Start one or more stopped containers +usage: docker container start [OPTIONS] CONTAINER [CONTAINER...] +pname: docker container +plink: docker_container.yaml +options: +- option: attach + shorthand: a + default_value: "false" + description: Attach STDOUT/STDERR and forward signals +- option: checkpoint + description: Restore from this checkpoint +- option: checkpoint-dir + description: Use a custom checkpoint storage directory +- option: detach-keys + description: Override the key sequence for detaching a container +- option: interactive + shorthand: i + default_value: "false" + description: Attach container's STDIN diff --git a/_data/engine-cli/docker_container_stats.yaml b/_data/engine-cli/docker_container_stats.yaml new file mode 100644 index 00000000000..55bc855c3f4 --- /dev/null +++ b/_data/engine-cli/docker_container_stats.yaml @@ -0,0 +1,16 @@ +command: docker container stats +short: Display a live stream of container(s) resource usage statistics +long: Display a live stream of container(s) resource usage statistics +usage: docker container stats [OPTIONS] [CONTAINER...] +pname: docker container +plink: docker_container.yaml +options: +- option: all + shorthand: a + default_value: "false" + description: Show all containers (default shows just running) +- option: format + description: Pretty-print images using a Go template +- option: no-stream + default_value: "false" + description: Disable streaming stats and only pull the first result diff --git a/_data/engine-cli/docker_container_stop.yaml b/_data/engine-cli/docker_container_stop.yaml new file mode 100644 index 00000000000..346cd358f6a --- /dev/null +++ b/_data/engine-cli/docker_container_stop.yaml @@ -0,0 +1,11 @@ +command: docker container stop +short: Stop one or more running containers +long: Stop one or more running containers +usage: docker container stop [OPTIONS] CONTAINER [CONTAINER...] +pname: docker container +plink: docker_container.yaml +options: +- option: time + shorthand: t + default_value: "10" + description: Seconds to wait for stop before killing it diff --git a/_data/engine-cli/docker_container_top.yaml b/_data/engine-cli/docker_container_top.yaml new file mode 100644 index 00000000000..2746ea9a9a6 --- /dev/null +++ b/_data/engine-cli/docker_container_top.yaml @@ -0,0 +1,6 @@ +command: docker container top +short: Display the running processes of a container +long: Display the running processes of a container +usage: docker container top CONTAINER [ps OPTIONS] +pname: docker container +plink: docker_container.yaml diff --git a/_data/engine-cli/docker_container_unpause.yaml b/_data/engine-cli/docker_container_unpause.yaml new file mode 100644 index 00000000000..619b6b01baf --- /dev/null +++ b/_data/engine-cli/docker_container_unpause.yaml @@ -0,0 +1,6 @@ +command: docker container unpause +short: Unpause all processes within one or more containers +long: Unpause all processes within one or more containers +usage: docker container unpause CONTAINER [CONTAINER...] +pname: docker container +plink: docker_container.yaml diff --git a/_data/engine-cli/docker_container_update.yaml b/_data/engine-cli/docker_container_update.yaml new file mode 100644 index 00000000000..9cb1b78f609 --- /dev/null +++ b/_data/engine-cli/docker_container_update.yaml @@ -0,0 +1,43 @@ +command: docker container update +short: Update configuration of one or more containers +long: Update configuration of one or more containers +usage: docker container update [OPTIONS] CONTAINER [CONTAINER...] +pname: docker container +plink: docker_container.yaml +options: +- option: blkio-weight + default_value: "0" + description: | + Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0) +- option: cpu-period + default_value: "0" + description: Limit CPU CFS (Completely Fair Scheduler) period +- option: cpu-quota + default_value: "0" + description: Limit CPU CFS (Completely Fair Scheduler) quota +- option: cpu-rt-period + default_value: "0" + description: Limit the CPU real-time period in microseconds +- option: cpu-rt-runtime + default_value: "0" + description: Limit the CPU real-time runtime in microseconds +- option: cpu-shares + shorthand: c + default_value: "0" + description: CPU shares (relative weight) +- option: cpuset-cpus + description: CPUs in which to allow execution (0-3, 0,1) +- option: cpuset-mems + description: MEMs in which to allow execution (0-3, 0,1) +- option: kernel-memory + description: Kernel memory limit +- option: memory + shorthand: m + description: Memory limit +- option: memory-reservation + description: Memory soft limit +- option: memory-swap + description: | + Swap limit equal to memory plus swap: '-1' to enable unlimited swap +- option: restart + description: Restart policy to apply when a container exits diff --git a/_data/engine-cli/docker_container_wait.yaml b/_data/engine-cli/docker_container_wait.yaml new file mode 100644 index 00000000000..b524287d756 --- /dev/null +++ b/_data/engine-cli/docker_container_wait.yaml @@ -0,0 +1,6 @@ +command: docker container wait +short: Block until one or more containers stop, then print their exit codes +long: Block until one or more containers stop, then print their exit codes +usage: docker container wait CONTAINER [CONTAINER...] +pname: docker container +plink: docker_container.yaml diff --git a/_data/engine-cli/docker_cp.yaml b/_data/engine-cli/docker_cp.yaml new file mode 100644 index 00000000000..596fe8ccf13 --- /dev/null +++ b/_data/engine-cli/docker_cp.yaml @@ -0,0 +1,18 @@ +command: docker cp +short: Copy files/folders between a container and the local filesystem +long: |- + Copy files/folders between a container and the local filesystem + + Use '-' as the source to read a tar archive from stdin + and extract it to a directory destination in a container. + Use '-' as the destination to stream a tar archive of a + container source to stdout. +usage: "docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-\n\tdocker cp [OPTIONS] + SRC_PATH|- CONTAINER:DEST_PATH" +pname: docker +plink: docker.yaml +options: +- option: follow-link + shorthand: L + default_value: "false" + description: Always follow symbol link in SRC_PATH diff --git a/_data/engine-cli/docker_create.yaml b/_data/engine-cli/docker_create.yaml new file mode 100644 index 00000000000..5c9eb23150a --- /dev/null +++ b/_data/engine-cli/docker_create.yaml @@ -0,0 +1,278 @@ +command: docker create +short: Create a new container +long: Create a new container +usage: docker create [OPTIONS] IMAGE [COMMAND] [ARG...] +pname: docker +plink: docker.yaml +options: +- option: add-host + default_value: '[]' + description: Add a custom host-to-IP mapping (host:ip) +- option: attach + shorthand: a + default_value: '[]' + description: Attach to STDIN, STDOUT or STDERR +- option: blkio-weight + default_value: "0" + description: | + Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0) +- option: blkio-weight-device + default_value: '[]' + description: Block IO weight (relative device weight) +- option: cap-add + default_value: '[]' + description: Add Linux capabilities +- option: cap-drop + default_value: '[]' + description: Drop Linux capabilities +- option: cgroup-parent + description: Optional parent cgroup for the container +- option: cidfile + description: Write the container ID to the file +- option: cpu-count + default_value: "0" + description: CPU count (Windows only) +- option: cpu-percent + default_value: "0" + description: CPU percent (Windows only) +- option: cpu-period + default_value: "0" + description: Limit CPU CFS (Completely Fair Scheduler) period +- option: cpu-quota + default_value: "0" + description: Limit CPU CFS (Completely Fair Scheduler) quota +- option: cpu-rt-period + default_value: "0" + description: Limit CPU real-time period in microseconds +- option: cpu-rt-runtime + default_value: "0" + description: Limit CPU real-time runtime in microseconds +- option: cpu-shares + shorthand: c + default_value: "0" + description: CPU shares (relative weight) +- option: cpus + default_value: "0.000" + description: Number of CPUs +- option: cpuset-cpus + description: CPUs in which to allow execution (0-3, 0,1) +- option: cpuset-mems + description: MEMs in which to allow execution (0-3, 0,1) +- option: credentialspec + description: Credential spec for managed service account (Windows only) +- option: device + default_value: '[]' + description: Add a host device to the container +- option: device-read-bps + default_value: '[]' + description: Limit read rate (bytes per second) from a device +- option: device-read-iops + default_value: '[]' + description: Limit read rate (IO per second) from a device +- option: device-write-bps + default_value: '[]' + description: Limit write rate (bytes per second) to a device +- option: device-write-iops + default_value: '[]' + description: Limit write rate (IO per second) to a device +- option: disable-content-trust + default_value: "true" + description: Skip image verification +- option: dns + default_value: '[]' + description: Set custom DNS servers +- option: dns-opt + default_value: '[]' + description: Set DNS options +- option: dns-option + default_value: '[]' + description: Set DNS options +- option: dns-search + default_value: '[]' + description: Set custom DNS search domains +- option: entrypoint + description: Overwrite the default ENTRYPOINT of the image +- option: env + shorthand: e + default_value: '[]' + description: Set environment variables +- option: env-file + default_value: '[]' + description: Read in a file of environment variables +- option: expose + default_value: '[]' + description: Expose a port or a range of ports +- option: group-add + default_value: '[]' + description: Add additional groups to join +- option: health-cmd + description: Command to run to check health +- option: health-interval + default_value: "0" + description: Time between running the check (ns|us|ms|s|m|h) (default 0s) +- option: health-retries + default_value: "0" + description: Consecutive failures needed to report unhealthy +- option: health-timeout + default_value: "0" + description: | + Maximum time to allow one check to run (ns|us|ms|s|m|h) (default 0s) +- option: help + default_value: "false" + description: Print usage +- option: hostname + shorthand: h + description: Container host name +- option: init + default_value: "false" + description: | + Run an init inside the container that forwards signals and reaps processes +- option: init-path + description: Path to the docker-init binary +- option: interactive + shorthand: i + default_value: "false" + description: Keep STDIN open even if not attached +- option: io-maxbandwidth + description: | + Maximum IO bandwidth limit for the system drive (Windows only) +- option: io-maxiops + default_value: "0" + description: Maximum IOps limit for the system drive (Windows only) +- option: ip + description: Container IPv4 address (e.g. 172.30.100.104) +- option: ip6 + description: Container IPv6 address (e.g. 2001:db8::33) +- option: ipc + description: IPC namespace to use +- option: isolation + description: Container isolation technology +- option: kernel-memory + description: Kernel memory limit +- option: label + shorthand: l + default_value: '[]' + description: Set meta data on a container +- option: label-file + default_value: '[]' + description: Read in a line delimited file of labels +- option: link + default_value: '[]' + description: Add link to another container +- option: link-local-ip + default_value: '[]' + description: Container IPv4/IPv6 link-local addresses +- option: log-driver + description: Logging driver for the container +- option: log-opt + default_value: '[]' + description: Log driver options +- option: mac-address + description: Container MAC address (e.g. 92:d0:c6:0a:29:33) +- option: memory + shorthand: m + description: Memory limit +- option: memory-reservation + description: Memory soft limit +- option: memory-swap + description: | + Swap limit equal to memory plus swap: '-1' to enable unlimited swap +- option: memory-swappiness + default_value: "-1" + description: Tune container memory swappiness (0 to 100) +- option: name + description: Assign a name to the container +- option: net + default_value: default + description: Connect a container to a network +- option: net-alias + default_value: '[]' + description: Add network-scoped alias for the container +- option: network + default_value: default + description: Connect a container to a network +- option: network-alias + default_value: '[]' + description: Add network-scoped alias for the container +- option: no-healthcheck + default_value: "false" + description: Disable any container-specified HEALTHCHECK +- option: oom-kill-disable + default_value: "false" + description: Disable OOM Killer +- option: oom-score-adj + default_value: "0" + description: Tune host's OOM preferences (-1000 to 1000) +- option: pid + description: PID namespace to use +- option: pids-limit + default_value: "0" + description: Tune container pids limit (set -1 for unlimited) +- option: privileged + default_value: "false" + description: Give extended privileges to this container +- option: publish + shorthand: p + default_value: '[]' + description: Publish a container's port(s) to the host +- option: publish-all + shorthand: P + default_value: "false" + description: Publish all exposed ports to random ports +- option: read-only + default_value: "false" + description: Mount the container's root filesystem as read only +- option: restart + default_value: "no" + description: Restart policy to apply when a container exits +- option: rm + default_value: "false" + description: Automatically remove the container when it exits +- option: runtime + description: Runtime to use for this container +- option: security-opt + default_value: '[]' + description: Security Options +- option: shm-size + description: Size of /dev/shm, default value is 64MB +- option: stop-signal + default_value: SIGTERM + description: Signal to stop a container, SIGTERM by default +- option: stop-timeout + default_value: "0" + description: Timeout (in seconds) to stop a container +- option: storage-opt + default_value: '[]' + description: Storage driver options for the container +- option: sysctl + default_value: map[] + description: Sysctl options +- option: tmpfs + default_value: '[]' + description: Mount a tmpfs directory +- option: tty + shorthand: t + default_value: "false" + description: Allocate a pseudo-TTY +- option: ulimit + default_value: '[]' + description: Ulimit options +- option: user + shorthand: u + description: 'Username or UID (format: [:])' +- option: userns + description: User namespace to use +- option: uts + description: UTS namespace to use +- option: volume + shorthand: v + default_value: '[]' + description: Bind mount a volume +- option: volume-driver + description: Optional volume driver for the container +- option: volumes-from + default_value: '[]' + description: Mount volumes from the specified container(s) +- option: workdir + shorthand: w + description: Working directory inside the container diff --git a/_data/engine-cli/docker_deploy.yaml b/_data/engine-cli/docker_deploy.yaml new file mode 100644 index 00000000000..a7347c7654c --- /dev/null +++ b/_data/engine-cli/docker_deploy.yaml @@ -0,0 +1,15 @@ +command: docker deploy +short: Deploy a new stack or update an existing stack +long: Deploy a new stack or update an existing stack +usage: docker deploy [OPTIONS] STACK +pname: docker +plink: docker.yaml +options: +- option: bundle-file + description: Path to a Distributed Application Bundle file +- option: compose-file + shorthand: c + description: Path to a Compose file +- option: with-registry-auth + default_value: "false" + description: Send registry authentication details to Swarm agents diff --git a/_data/engine-cli/docker_diff.yaml b/_data/engine-cli/docker_diff.yaml new file mode 100644 index 00000000000..6d5385ceaff --- /dev/null +++ b/_data/engine-cli/docker_diff.yaml @@ -0,0 +1,6 @@ +command: docker diff +short: Inspect changes on a container's filesystem +long: Inspect changes on a container's filesystem +usage: docker diff CONTAINER +pname: docker +plink: docker.yaml diff --git a/_data/engine-cli/docker_events.yaml b/_data/engine-cli/docker_events.yaml new file mode 100644 index 00000000000..cd72ef56f8b --- /dev/null +++ b/_data/engine-cli/docker_events.yaml @@ -0,0 +1,16 @@ +command: docker events +short: Get real time events from the server +long: Get real time events from the server +usage: docker events [OPTIONS] +pname: docker +plink: docker.yaml +options: +- option: filter + shorthand: f + description: Filter output based on conditions provided +- option: format + description: Format the output using the given Go template +- option: since + description: Show all events created since timestamp +- option: until + description: Stream events until this timestamp diff --git a/_data/engine-cli/docker_exec.yaml b/_data/engine-cli/docker_exec.yaml new file mode 100644 index 00000000000..1bb3bb33c33 --- /dev/null +++ b/_data/engine-cli/docker_exec.yaml @@ -0,0 +1,31 @@ +command: docker exec +short: Run a command in a running container +long: Run a command in a running container +usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] +pname: docker +plink: docker.yaml +options: +- option: detach + shorthand: d + default_value: "false" + description: 'Detached mode: run command in the background' +- option: detach-keys + description: Override the key sequence for detaching a container +- option: env + shorthand: e + default_value: '[]' + description: Set environment variables +- option: interactive + shorthand: i + default_value: "false" + description: Keep STDIN open even if not attached +- option: privileged + default_value: "false" + description: Give extended privileges to the command +- option: tty + shorthand: t + default_value: "false" + description: Allocate a pseudo-TTY +- option: user + shorthand: u + description: 'Username or UID (format: [:])' diff --git a/_data/engine-cli/docker_export.yaml b/_data/engine-cli/docker_export.yaml new file mode 100644 index 00000000000..7b9f38eb7e8 --- /dev/null +++ b/_data/engine-cli/docker_export.yaml @@ -0,0 +1,10 @@ +command: docker export +short: Export a container's filesystem as a tar archive +long: Export a container's filesystem as a tar archive +usage: docker export [OPTIONS] CONTAINER +pname: docker +plink: docker.yaml +options: +- option: output + shorthand: o + description: Write to a file, instead of STDOUT diff --git a/_data/engine-cli/docker_history.yaml b/_data/engine-cli/docker_history.yaml new file mode 100644 index 00000000000..e6698aead8f --- /dev/null +++ b/_data/engine-cli/docker_history.yaml @@ -0,0 +1,18 @@ +command: docker history +short: Show the history of an image +long: Show the history of an image +usage: docker history [OPTIONS] IMAGE +pname: docker +plink: docker.yaml +options: +- option: human + shorthand: H + default_value: "true" + description: Print sizes and dates in human readable format +- option: no-trunc + default_value: "false" + description: Don't truncate output +- option: quiet + shorthand: q + default_value: "false" + description: Only show numeric IDs diff --git a/_data/engine-cli/docker_image.yaml b/_data/engine-cli/docker_image.yaml new file mode 100644 index 00000000000..09ecfd7be7f --- /dev/null +++ b/_data/engine-cli/docker_image.yaml @@ -0,0 +1,32 @@ +command: docker image +short: Manage images +long: Manage images +usage: docker image +pname: docker +plink: docker.yaml +cname: +- docker image build +- docker image history +- docker image import +- docker image inspect +- docker image load +- docker image ls +- docker image prune +- docker image pull +- docker image push +- docker image rm +- docker image save +- docker image tag +clink: +- docker_image_build.yaml +- docker_image_history.yaml +- docker_image_import.yaml +- docker_image_inspect.yaml +- docker_image_load.yaml +- docker_image_ls.yaml +- docker_image_prune.yaml +- docker_image_pull.yaml +- docker_image_push.yaml +- docker_image_rm.yaml +- docker_image_save.yaml +- docker_image_tag.yaml diff --git a/_data/engine-cli/docker_image_build.yaml b/_data/engine-cli/docker_image_build.yaml new file mode 100644 index 00000000000..8e35921eae9 --- /dev/null +++ b/_data/engine-cli/docker_image_build.yaml @@ -0,0 +1,84 @@ +command: docker image build +short: Build an image from a Dockerfile +long: Build an image from a Dockerfile +usage: docker image build [OPTIONS] PATH | URL | - +pname: docker image +plink: docker_image.yaml +options: +- option: build-arg + default_value: '[]' + description: Set build-time variables +- option: cache-from + default_value: '[]' + description: Images to consider as cache sources +- option: cgroup-parent + description: Optional parent cgroup for the container +- option: compress + default_value: "false" + description: Compress the build context using gzip +- option: cpu-period + default_value: "0" + description: Limit the CPU CFS (Completely Fair Scheduler) period +- option: cpu-quota + default_value: "0" + description: Limit the CPU CFS (Completely Fair Scheduler) quota +- option: cpu-shares + shorthand: c + default_value: "0" + description: CPU shares (relative weight) +- option: cpuset-cpus + description: CPUs in which to allow execution (0-3, 0,1) +- option: cpuset-mems + description: MEMs in which to allow execution (0-3, 0,1) +- option: disable-content-trust + default_value: "true" + description: Skip image verification +- option: file + shorthand: f + description: Name of the Dockerfile (Default is 'PATH/Dockerfile') +- option: force-rm + default_value: "false" + description: Always remove intermediate containers +- option: isolation + description: Container isolation technology +- option: label + default_value: '[]' + description: Set metadata for an image +- option: memory + shorthand: m + description: Memory limit +- option: memory-swap + description: | + Swap limit equal to memory plus swap: '-1' to enable unlimited swap +- option: network + default_value: default + description: | + Set the networking mode for the RUN instructions during build +- option: no-cache + default_value: "false" + description: Do not use cache when building the image +- option: pull + default_value: "false" + description: Always attempt to pull a newer version of the image +- option: quiet + shorthand: q + default_value: "false" + description: Suppress the build output and print image ID on success +- option: rm + default_value: "true" + description: Remove intermediate containers after a successful build +- option: security-opt + default_value: '[]' + description: Security options +- option: shm-size + description: Size of /dev/shm, default value is 64MB +- option: squash + default_value: "false" + description: Squash newly built layers into a single new layer +- option: tag + shorthand: t + default_value: '[]' + description: Name and optionally a tag in the 'name:tag' format +- option: ulimit + default_value: '[]' + description: Ulimit options diff --git a/_data/engine-cli/docker_image_history.yaml b/_data/engine-cli/docker_image_history.yaml new file mode 100644 index 00000000000..e6688a348a1 --- /dev/null +++ b/_data/engine-cli/docker_image_history.yaml @@ -0,0 +1,18 @@ +command: docker image history +short: Show the history of an image +long: Show the history of an image +usage: docker image history [OPTIONS] IMAGE +pname: docker image +plink: docker_image.yaml +options: +- option: human + shorthand: H + default_value: "true" + description: Print sizes and dates in human readable format +- option: no-trunc + default_value: "false" + description: Don't truncate output +- option: quiet + shorthand: q + default_value: "false" + description: Only show numeric IDs diff --git a/_data/engine-cli/docker_image_import.yaml b/_data/engine-cli/docker_image_import.yaml new file mode 100644 index 00000000000..743d8f9dbee --- /dev/null +++ b/_data/engine-cli/docker_image_import.yaml @@ -0,0 +1,14 @@ +command: docker image import +short: Import the contents from a tarball to create a filesystem image +long: Import the contents from a tarball to create a filesystem image +usage: docker image import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] +pname: docker image +plink: docker_image.yaml +options: +- option: change + shorthand: c + default_value: '[]' + description: Apply Dockerfile instruction to the created image +- option: message + shorthand: m + description: Set commit message for imported image diff --git a/_data/engine-cli/docker_image_inspect.yaml b/_data/engine-cli/docker_image_inspect.yaml new file mode 100644 index 00000000000..f8b6ec854f0 --- /dev/null +++ b/_data/engine-cli/docker_image_inspect.yaml @@ -0,0 +1,10 @@ +command: docker image inspect +short: Display detailed information on one or more images +long: Display detailed information on one or more images +usage: docker image inspect [OPTIONS] IMAGE [IMAGE...] +pname: docker image +plink: docker_image.yaml +options: +- option: format + shorthand: f + description: Format the output using the given Go template diff --git a/_data/engine-cli/docker_image_load.yaml b/_data/engine-cli/docker_image_load.yaml new file mode 100644 index 00000000000..e2ad0ddb93d --- /dev/null +++ b/_data/engine-cli/docker_image_load.yaml @@ -0,0 +1,14 @@ +command: docker image load +short: Load an image from a tar archive or STDIN +long: Load an image from a tar archive or STDIN +usage: docker image load [OPTIONS] +pname: docker image +plink: docker_image.yaml +options: +- option: input + shorthand: i + description: Read from tar archive file, instead of STDIN +- option: quiet + shorthand: q + default_value: "false" + description: Suppress the load output diff --git a/_data/engine-cli/docker_image_ls.yaml b/_data/engine-cli/docker_image_ls.yaml new file mode 100644 index 00000000000..60caf152371 --- /dev/null +++ b/_data/engine-cli/docker_image_ls.yaml @@ -0,0 +1,26 @@ +command: docker image ls +short: List images +long: List images +usage: docker image ls [OPTIONS] [REPOSITORY[:TAG]] +pname: docker image +plink: docker_image.yaml +options: +- option: all + shorthand: a + default_value: "false" + description: Show all images (default hides intermediate images) +- option: digests + default_value: "false" + description: Show digests +- option: filter + shorthand: f + description: Filter output based on conditions provided +- option: format + description: Pretty-print images using a Go template +- option: no-trunc + default_value: "false" + description: Don't truncate output +- option: quiet + shorthand: q + default_value: "false" + description: Only show numeric IDs diff --git a/_data/engine-cli/docker_image_prune.yaml b/_data/engine-cli/docker_image_prune.yaml new file mode 100644 index 00000000000..f8d1fa82289 --- /dev/null +++ b/_data/engine-cli/docker_image_prune.yaml @@ -0,0 +1,15 @@ +command: docker image prune +short: Remove unused images +long: Remove unused images +usage: docker image prune [OPTIONS] +pname: docker image +plink: docker_image.yaml +options: +- option: all + shorthand: a + default_value: "false" + description: Remove all unused images, not just dangling ones +- option: force + shorthand: f + default_value: "false" + description: Do not prompt for confirmation diff --git a/_data/engine-cli/docker_image_pull.yaml b/_data/engine-cli/docker_image_pull.yaml new file mode 100644 index 00000000000..a5697848347 --- /dev/null +++ b/_data/engine-cli/docker_image_pull.yaml @@ -0,0 +1,14 @@ +command: docker image pull +short: Pull an image or a repository from a registry +long: Pull an image or a repository from a registry +usage: docker image pull [OPTIONS] NAME[:TAG|@DIGEST] +pname: docker image +plink: docker_image.yaml +options: +- option: all-tags + shorthand: a + default_value: "false" + description: Download all tagged images in the repository +- option: disable-content-trust + default_value: "true" + description: Skip image verification diff --git a/_data/engine-cli/docker_image_push.yaml b/_data/engine-cli/docker_image_push.yaml new file mode 100644 index 00000000000..d59d7aa5252 --- /dev/null +++ b/_data/engine-cli/docker_image_push.yaml @@ -0,0 +1,10 @@ +command: docker image push +short: Push an image or a repository to a registry +long: Push an image or a repository to a registry +usage: docker image push [OPTIONS] NAME[:TAG] +pname: docker image +plink: docker_image.yaml +options: +- option: disable-content-trust + default_value: "true" + description: Skip image verification diff --git a/_data/engine-cli/docker_image_rm.yaml b/_data/engine-cli/docker_image_rm.yaml new file mode 100644 index 00000000000..349eb32432f --- /dev/null +++ b/_data/engine-cli/docker_image_rm.yaml @@ -0,0 +1,14 @@ +command: docker image rm +short: Remove one or more images +long: Remove one or more images +usage: docker image rm [OPTIONS] IMAGE [IMAGE...] +pname: docker image +plink: docker_image.yaml +options: +- option: force + shorthand: f + default_value: "false" + description: Force removal of the image +- option: no-prune + default_value: "false" + description: Do not delete untagged parents diff --git a/_data/engine-cli/docker_image_save.yaml b/_data/engine-cli/docker_image_save.yaml new file mode 100644 index 00000000000..883f909b615 --- /dev/null +++ b/_data/engine-cli/docker_image_save.yaml @@ -0,0 +1,10 @@ +command: docker image save +short: Save one or more images to a tar archive (streamed to STDOUT by default) +long: Save one or more images to a tar archive (streamed to STDOUT by default) +usage: docker image save [OPTIONS] IMAGE [IMAGE...] +pname: docker image +plink: docker_image.yaml +options: +- option: output + shorthand: o + description: Write to a file, instead of STDOUT diff --git a/_data/engine-cli/docker_image_tag.yaml b/_data/engine-cli/docker_image_tag.yaml new file mode 100644 index 00000000000..dfcd8ec2049 --- /dev/null +++ b/_data/engine-cli/docker_image_tag.yaml @@ -0,0 +1,6 @@ +command: docker image tag +short: Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE +long: Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE +usage: docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] +pname: docker image +plink: docker_image.yaml diff --git a/_data/engine-cli/docker_images.yaml b/_data/engine-cli/docker_images.yaml new file mode 100644 index 00000000000..6d22bfdd862 --- /dev/null +++ b/_data/engine-cli/docker_images.yaml @@ -0,0 +1,26 @@ +command: docker images +short: List images +long: List images +usage: docker images [OPTIONS] [REPOSITORY[:TAG]] +pname: docker +plink: docker.yaml +options: +- option: all + shorthand: a + default_value: "false" + description: Show all images (default hides intermediate images) +- option: digests + default_value: "false" + description: Show digests +- option: filter + shorthand: f + description: Filter output based on conditions provided +- option: format + description: Pretty-print images using a Go template +- option: no-trunc + default_value: "false" + description: Don't truncate output +- option: quiet + shorthand: q + default_value: "false" + description: Only show numeric IDs diff --git a/_data/engine-cli/docker_import.yaml b/_data/engine-cli/docker_import.yaml new file mode 100644 index 00000000000..862d385f6d6 --- /dev/null +++ b/_data/engine-cli/docker_import.yaml @@ -0,0 +1,14 @@ +command: docker import +short: Import the contents from a tarball to create a filesystem image +long: Import the contents from a tarball to create a filesystem image +usage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] +pname: docker +plink: docker.yaml +options: +- option: change + shorthand: c + default_value: '[]' + description: Apply Dockerfile instruction to the created image +- option: message + shorthand: m + description: Set commit message for imported image diff --git a/_data/engine-cli/docker_info.yaml b/_data/engine-cli/docker_info.yaml new file mode 100644 index 00000000000..312c038684c --- /dev/null +++ b/_data/engine-cli/docker_info.yaml @@ -0,0 +1,10 @@ +command: docker info +short: Display system-wide information +long: Display system-wide information +usage: docker info [OPTIONS] +pname: docker +plink: docker.yaml +options: +- option: format + shorthand: f + description: Format the output using the given Go template diff --git a/_data/engine-cli/docker_inspect.yaml b/_data/engine-cli/docker_inspect.yaml new file mode 100644 index 00000000000..65ee9396f35 --- /dev/null +++ b/_data/engine-cli/docker_inspect.yaml @@ -0,0 +1,16 @@ +command: docker inspect +short: Return low-level information on Docker objects +long: Return low-level information on Docker objects +usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...] +pname: docker +plink: docker.yaml +options: +- option: format + shorthand: f + description: Format the output using the given Go template +- option: size + shorthand: s + default_value: "false" + description: Display total file sizes if the type is container +- option: type + description: Return JSON for specified type diff --git a/_data/engine-cli/docker_kill.yaml b/_data/engine-cli/docker_kill.yaml new file mode 100644 index 00000000000..5c1bcbb5bc4 --- /dev/null +++ b/_data/engine-cli/docker_kill.yaml @@ -0,0 +1,11 @@ +command: docker kill +short: Kill one or more running containers +long: Kill one or more running containers +usage: docker kill [OPTIONS] CONTAINER [CONTAINER...] +pname: docker +plink: docker.yaml +options: +- option: signal + shorthand: s + default_value: KILL + description: Signal to send to the container diff --git a/_data/engine-cli/docker_load.yaml b/_data/engine-cli/docker_load.yaml new file mode 100644 index 00000000000..c0fbdc02d28 --- /dev/null +++ b/_data/engine-cli/docker_load.yaml @@ -0,0 +1,14 @@ +command: docker load +short: Load an image from a tar archive or STDIN +long: Load an image from a tar archive or STDIN +usage: docker load [OPTIONS] +pname: docker +plink: docker.yaml +options: +- option: input + shorthand: i + description: Read from tar archive file, instead of STDIN +- option: quiet + shorthand: q + default_value: "false" + description: Suppress the load output diff --git a/_data/engine-cli/docker_login.yaml b/_data/engine-cli/docker_login.yaml new file mode 100644 index 00000000000..ba7c59590d1 --- /dev/null +++ b/_data/engine-cli/docker_login.yaml @@ -0,0 +1,15 @@ +command: docker login +short: Log in to a Docker registry +long: |- + Log in to a Docker registry. + If no server is specified, the default is defined by the daemon. +usage: docker login [OPTIONS] [SERVER] +pname: docker +plink: docker.yaml +options: +- option: password + shorthand: p + description: Password +- option: username + shorthand: u + description: Username diff --git a/_data/engine-cli/docker_logout.yaml b/_data/engine-cli/docker_logout.yaml new file mode 100644 index 00000000000..61b23dd516b --- /dev/null +++ b/_data/engine-cli/docker_logout.yaml @@ -0,0 +1,8 @@ +command: docker logout +short: Log out from a Docker registry +long: |- + Log out from a Docker registry. + If no server is specified, the default is defined by the daemon. +usage: docker logout [SERVER] +pname: docker +plink: docker.yaml diff --git a/_data/engine-cli/docker_logs.yaml b/_data/engine-cli/docker_logs.yaml new file mode 100644 index 00000000000..c175c19e89b --- /dev/null +++ b/_data/engine-cli/docker_logs.yaml @@ -0,0 +1,23 @@ +command: docker logs +short: Fetch the logs of a container +long: Fetch the logs of a container +usage: docker logs [OPTIONS] CONTAINER +pname: docker +plink: docker.yaml +options: +- option: details + default_value: "false" + description: Show extra details provided to logs +- option: follow + shorthand: f + default_value: "false" + description: Follow log output +- option: since + description: Show logs since timestamp +- option: tail + default_value: all + description: Number of lines to show from the end of the logs +- option: timestamps + shorthand: t + default_value: "false" + description: Show timestamps diff --git a/_data/engine-cli/docker_network.yaml b/_data/engine-cli/docker_network.yaml new file mode 100644 index 00000000000..60b18974dea --- /dev/null +++ b/_data/engine-cli/docker_network.yaml @@ -0,0 +1,22 @@ +command: docker network +short: Manage networks +long: Manage networks +usage: docker network +pname: docker +plink: docker.yaml +cname: +- docker network connect +- docker network create +- docker network disconnect +- docker network inspect +- docker network ls +- docker network prune +- docker network rm +clink: +- docker_network_connect.yaml +- docker_network_create.yaml +- docker_network_disconnect.yaml +- docker_network_inspect.yaml +- docker_network_ls.yaml +- docker_network_prune.yaml +- docker_network_rm.yaml diff --git a/_data/engine-cli/docker_network_connect.yaml b/_data/engine-cli/docker_network_connect.yaml new file mode 100644 index 00000000000..c3e8650cac0 --- /dev/null +++ b/_data/engine-cli/docker_network_connect.yaml @@ -0,0 +1,62 @@ +command: docker network connect +short: Connect a container to a network +long: | + Connects a container to a network. You can connect a container by name + or by ID. Once connected, the container can communicate with other containers in + the same network. + + ```bash + $ docker network connect multi-host-network container1 + ``` + + You can also use the `docker run --net=` option to start a container and immediately connect it to a network. + + ```bash + $ docker run -itd --net=multi-host-network --ip 172.20.88.22 --ip6 2001:db8::8822 busybox + ``` + + You can pause, restart, and stop containers that are connected to a network. + Paused containers remain connected and can be revealed by a `network inspect`. + When the container is stopped, it does not appear on the network until you restart + it. + + If specified, the container's IP address(es) is reapplied when a stopped + container is restarted. If the IP address is no longer available, the container + fails to start. One way to guarantee that the IP address is available is + to specify an `--ip-range` when creating the network, and choose the static IP + address(es) from outside that range. This ensures that the IP address is not + given to another container while this container is not on the network. + + ```bash + $ docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 multi-host-network + ``` + + ```bash + $ docker network connect --ip 172.20.128.2 multi-host-network container2 + ``` + + To verify the container is connected, use the `docker network inspect` command. Use `docker network disconnect` to remove a container from the network. + + Once connected in network, containers can communicate using only another + container's IP address or name. For `overlay` networks or custom plugins that + support multi-host connectivity, containers connected to the same multi-host + network but launched from different Engines can also communicate in this way. + + You can connect a container to one or more networks. The networks need not be the same type. For example, you can connect a single container bridge and overlay networks. +usage: docker network connect [OPTIONS] NETWORK CONTAINER +pname: docker network +plink: docker_network.yaml +options: +- option: alias + default_value: '[]' + description: Add network-scoped alias for the container +- option: ip + description: IP Address +- option: ip6 + description: IPv6 Address +- option: link + default_value: '[]' + description: Add link to another container +- option: link-local-ip + default_value: '[]' + description: Add a link-local address for the container diff --git a/_data/engine-cli/docker_network_create.yaml b/_data/engine-cli/docker_network_create.yaml new file mode 100644 index 00000000000..8c4e507d78a --- /dev/null +++ b/_data/engine-cli/docker_network_create.yaml @@ -0,0 +1,102 @@ +command: docker network create +short: Create a network +long: "Creates a new network. The `DRIVER` accepts `bridge` or `overlay` which are + the\nbuilt-in network drivers. If you have installed a third party or your own custom\nnetwork + driver you can specify that `DRIVER` here also. If you don't specify the\n`--driver` + option, the command automatically creates a `bridge` network for you.\nWhen you + install Docker Engine it creates a `bridge` network automatically. This\nnetwork + corresponds to the `docker0` bridge that Engine has traditionally relied\non. When + launch a new container with `docker run` it automatically connects to\nthis bridge + network. You cannot remove this default bridge network but you can\ncreate new ones + using the `network create` command.\n\n```bash\n$ docker network create -d bridge + my-bridge-network\n```\n\nBridge networks are isolated networks on a single Engine + installation. If you\nwant to create a network that spans multiple Docker hosts + each running an\nEngine, you must create an `overlay` network. Unlike `bridge` networks + overlay\nnetworks require some pre-existing conditions before you can create one. + These\nconditions are:\n\n* Access to a key-value store. Engine supports Consul, + Etcd, and Zookeeper (Distributed store) key-value stores.\n* A cluster of hosts + with connectivity to the key-value store.\n* A properly configured Engine `daemon` + on each host in the cluster.\n\nThe `dockerd` options that support the `overlay` + network are:\n\n* `--cluster-store`\n* `--cluster-store-opt`\n* `--cluster-advertise`\n\nTo + read more about these options and how to configure them, see [\"*Get started\nwith + multi-host\nnetwork*\"](https://docs.docker.com/engine/userguide/networking/get-started-overlay/).\n\nIt + is also a good idea, though not required, that you install Docker Swarm on to\nmanage + the cluster that makes up your network. Swarm provides sophisticated\ndiscovery + and server management that can assist your implementation.\n\nOnce you have prepared + the `overlay` network prerequisites you simply choose a\nDocker host in the cluster + and issue the following to create the network:\n\n```bash\n$ docker network create + -d overlay my-multihost-network\n```\n\nNetwork names must be unique. The Docker + daemon attempts to identify naming\nconflicts but this is not guaranteed. It is + the user's responsibility to avoid\nname conflicts.\n\n## Connect containers\n\nWhen + you start a container use the `--net` flag to connect it to a network.\nThis adds + the `busybox` container to the `mynet` network.\n\n```bash\n$ docker run -itd --net=mynet + busybox\n```\n\nIf you want to add a container to a network after the container + is already\nrunning use the `docker network connect` subcommand.\n\nYou can connect + multiple containers to the same network. Once connected, the\ncontainers can communicate + using only another container's IP address or name.\nFor `overlay` networks or custom + plugins that support multi-host connectivity,\ncontainers connected to the same + multi-host network but launched from different\nEngines can also communicate in + this way.\n\nYou can disconnect a container from a network using the `docker network\ndisconnect` + command.\n\n## Specifying advanced options\n\nWhen you create a network, Engine + creates a non-overlapping subnetwork for the\nnetwork by default. This subnetwork + is not a subdivision of an existing network.\nIt is purely for ip-addressing purposes. + You can override this default and\nspecify subnetwork values directly using the + `--subnet` option. On a\n`bridge` network you can only create a single subnet:\n\n```bash\n$ + docker network create -d bridge --subnet=192.168.0.0/16 br0\n```\n\nAdditionally, + you also specify the `--gateway` `--ip-range` and `--aux-address`\noptions.\n\n```bash\n$ + docker network create \\\n --driver=bridge \\\n --subnet=172.28.0.0/16 \\\n --ip-range=172.28.5.0/24 + \\\n --gateway=172.28.5.254 \\\n br0\n```\n\nIf you omit the `--gateway` flag + the Engine selects one for you from inside a\npreferred pool. For `overlay` networks + and for network driver plugins that\nsupport it you can create multiple subnetworks.\n\n```bash\n$ + docker network create -d overlay \\\n --subnet=192.168.0.0/16 \\\n --subnet=192.170.0.0/16 + \\\n --gateway=192.168.0.100 \\ \n --gateway=192.170.0.100 \\\n --ip-range=192.168.1.0/24 + \\\n --aux-address=\"my-router=192.168.1.5\" --aux-address=\"my-switch=192.168.1.6\" + \\\n --aux-address=\"my-printer=192.170.1.5\" --aux-address=\"my-nas=192.170.1.6\" + \\\n my-multihost-network\n```\n\nBe sure that your subnetworks do not overlap. + If they do, the network create\nfails and Engine returns an error.\n\n### Network + internal mode\n\nBy default, when you connect a container to an `overlay` network, + Docker also\nconnects a bridge network to it to provide external connectivity. If + you want\nto create an externally isolated `overlay` network, you can specify the\n`--internal` + option.\n" +usage: docker network create [OPTIONS] NETWORK +pname: docker network +plink: docker_network.yaml +options: +- option: attachable + default_value: "false" + description: Enable manual container attachment +- option: aux-address + default_value: map[] + description: Auxiliary IPv4 or IPv6 addresses used by Network driver +- option: driver + shorthand: d + default_value: bridge + description: Driver to manage the Network +- option: gateway + default_value: '[]' + description: IPv4 or IPv6 Gateway for the master subnet +- option: internal + default_value: "false" + description: Restrict external access to the network +- option: ip-range + default_value: '[]' + description: Allocate container ip from a sub-range +- option: ipam-driver + default_value: default + description: IP Address Management Driver +- option: ipam-opt + default_value: map[] + description: Set IPAM driver specific options +- option: ipv6 + default_value: "false" + description: Enable IPv6 networking +- option: label + default_value: '[]' + description: Set metadata on a network +- option: opt + shorthand: o + default_value: map[] + description: Set driver specific options +- option: subnet + default_value: '[]' + description: Subnet in CIDR format that represents a network segment diff --git a/_data/engine-cli/docker_network_disconnect.yaml b/_data/engine-cli/docker_network_disconnect.yaml new file mode 100644 index 00000000000..87fca9d5bf5 --- /dev/null +++ b/_data/engine-cli/docker_network_disconnect.yaml @@ -0,0 +1,16 @@ +command: docker network disconnect +short: Disconnect a container from a network +long: | + Disconnects a container from a network. + + ```bash + $ docker network disconnect multi-host-network container1 + ``` +usage: docker network disconnect [OPTIONS] NETWORK CONTAINER +pname: docker network +plink: docker_network.yaml +options: +- option: force + shorthand: f + default_value: "false" + description: Force the container to disconnect from a network diff --git a/_data/engine-cli/docker_network_inspect.yaml b/_data/engine-cli/docker_network_inspect.yaml new file mode 100644 index 00000000000..733ceca4bc3 --- /dev/null +++ b/_data/engine-cli/docker_network_inspect.yaml @@ -0,0 +1,98 @@ +command: docker network inspect +short: Display detailed information on one or more networks +long: | + Returns information about one or more networks. By default, this command renders all results in a JSON object. For example, if you connect two containers to the default `bridge` network: + + ```bash + $ sudo docker run -itd --name=container1 busybox + f2870c98fd504370fb86e59f32cd0753b1ac9b69b7d80566ffc7192a82b3ed27 + + $ sudo docker run -itd --name=container2 busybox + bda12f8922785d1f160be70736f26c1e331ab8aaf8ed8d56728508f2e2fd4727 + ``` + + The `network inspect` command shows the containers, by id, in its + results. You can specify an alternate format to execute a given + template for each result. Go's + [text/template](http://golang.org/pkg/text/template/) package + describes all the details of the format. + + ```bash + $ sudo docker network inspect bridge + [ + { + "Name": "bridge", + "Id": "b2b1a2cba717161d984383fd68218cf70bbbd17d328496885f7c921333228b0f", + "Scope": "local", + "Driver": "bridge", + "IPAM": { + "Driver": "default", + "Config": [ + { + "Subnet": "172.17.42.1/16", + "Gateway": "172.17.42.1" + } + ] + }, + "Internal": false, + "Containers": { + "bda12f8922785d1f160be70736f26c1e331ab8aaf8ed8d56728508f2e2fd4727": { + "Name": "container2", + "EndpointID": "0aebb8fcd2b282abe1365979536f21ee4ceaf3ed56177c628eae9f706e00e019", + "MacAddress": "02:42:ac:11:00:02", + "IPv4Address": "172.17.0.2/16", + "IPv6Address": "" + }, + "f2870c98fd504370fb86e59f32cd0753b1ac9b69b7d80566ffc7192a82b3ed27": { + "Name": "container1", + "EndpointID": "a00676d9c91a96bbe5bcfb34f705387a33d7cc365bac1a29e4e9728df92d10ad", + "MacAddress": "02:42:ac:11:00:01", + "IPv4Address": "172.17.0.1/16", + "IPv6Address": "" + } + }, + "Options": { + "com.docker.network.bridge.default_bridge": "true", + "com.docker.network.bridge.enable_icc": "true", + "com.docker.network.bridge.enable_ip_masquerade": "true", + "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", + "com.docker.network.bridge.name": "docker0", + "com.docker.network.driver.mtu": "1500" + } + } + ] + ``` + + Returns the information about the user-defined network: + + ```bash + $ docker network create simple-network + 69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a + $ docker network inspect simple-network + [ + { + "Name": "simple-network", + "Id": "69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a", + "Scope": "local", + "Driver": "bridge", + "IPAM": { + "Driver": "default", + "Config": [ + { + "Subnet": "172.22.0.0/16", + "Gateway": "172.22.0.1" + } + ] + }, + "Containers": {}, + "Options": {} + } + ] + ``` +usage: docker network inspect [OPTIONS] NETWORK [NETWORK...] +pname: docker network +plink: docker_network.yaml +options: +- option: format + shorthand: f + description: Format the output using the given Go template diff --git a/_data/engine-cli/docker_network_ls.yaml b/_data/engine-cli/docker_network_ls.yaml new file mode 100644 index 00000000000..b500f1e13fa --- /dev/null +++ b/_data/engine-cli/docker_network_ls.yaml @@ -0,0 +1,78 @@ +command: docker network ls +short: List networks +long: "Lists all the networks the Engine `daemon` knows about. This includes the\nnetworks + that span across multiple hosts in a cluster, for example:\n\n```bash\n $ docker + network ls\n NETWORK ID NAME DRIVER\n 7fca4eb8c647 + \ bridge bridge\n 9f904ee27bf5 none null\n + \ cf03ee007fb4 host host\n 78b03ee04fc4 multi-host + \ overlay\n```\n\nUse the `--no-trunc` option to display the full network + id:\n\n```bash\n$ docker network ls --no-trunc\nNETWORK ID NAME + \ DRIVER\n18a2866682b85619a026c81b98a5e375bd33e1b0936a26cc497c283d27bae9b3 + \ none null \nc288470c46f6c8949c5f7e5099b5b7947b07eabe8d9a27d79a9cbf111adcbf47 + \ host host \n7b369448dccbf865d397c8d2be0cda7cf7edc6b0945f77d2529912ae917a0185 + \ bridge bridge \n95e74588f40db048e86320c6526440c504650a1ff3e9f7d60a497c4d2163e5bd + \ foo bridge \n63d1ff1f77b07ca51070a8c227e962238358bd310bde1529cf62e6c307ade161 + \ dev bridge\n```\n\n## Filtering\n\nThe filtering flag (`-f` or + `--filter`) format is a `key=value` pair. If there\nis more than one filter, then + pass multiple flags (e.g. `--filter \"foo=bar\" --filter \"bif=baz\"`).\nMultiple + filter flags are combined as an `OR` filter. For example, \n`-f type=custom -f type=builtin` + returns both `custom` and `builtin` networks.\n\nThe currently supported filters + are:\n\n* driver\n* id (network's id)\n* label (`label=` or `label==`)\n* + name (network's name)\n* type (custom|builtin)\n\n#### Driver\n\nThe `driver` filter + matches networks based on their driver.\n\nThe following example matches networks + with the `bridge` driver:\n\n```bash\n$ docker network ls --filter driver=bridge\nNETWORK + ID NAME DRIVER\ndb9db329f835 test1 bridge\nf6e212da9dfd + \ test2 bridge\n```\n\n#### ID\n\nThe `id` filter matches on + all or part of a network's ID.\n\nThe following filter matches all networks with + an ID containing the\n`63d1ff1f77b0...` string.\n\n```bash\n$ docker network ls + --filter id=63d1ff1f77b07ca51070a8c227e962238358bd310bde1529cf62e6c307ade161\nNETWORK + ID NAME DRIVER\n63d1ff1f77b0 dev bridge\n```\n\nYou + can also filter for a substring in an ID as this shows:\n\n```bash\n$ docker network + ls --filter id=95e74588f40d\nNETWORK ID NAME DRIVER\n95e74588f40d + \ foo bridge\n\n$ docker network ls --filter id=95e\nNETWORK + ID NAME DRIVER\n95e74588f40d foo bridge\n```\n\n#### + Label\n\nThe `label` filter matches networks based on the presence of a `label` + alone or a `label` and a\nvalue.\n\nThe following filter matches networks with the + `usage` label regardless of its value.\n\n```bash\n$ docker network ls -f \"label=usage\"\nNETWORK + ID NAME DRIVER\ndb9db329f835 test1 bridge + \ \nf6e212da9dfd test2 bridge\n```\n\nThe following + filter matches networks with the `usage` label with the `prod` value.\n\n```bash\n$ + docker network ls -f \"label=usage=prod\"\nNETWORK ID NAME DRIVER\nf6e212da9dfd + \ test2 bridge\n```\n\n#### Name\n\nThe `name` filter matches + on all or part of a network's name.\n\nThe following filter matches all networks + with a name containing the `foobar` string.\n\n```bash\n$ docker network ls --filter + name=foobar\nNETWORK ID NAME DRIVER\n06e7eef0a170 foobar + \ bridge\n```\n\nYou can also filter for a substring in a name as this + shows:\n\n```bash\n$ docker network ls --filter name=foo\nNETWORK ID NAME + \ DRIVER\n95e74588f40d foo bridge\n06e7eef0a170 + \ foobar bridge\n```\n\n#### Type\n\nThe `type` filter supports + two values; `builtin` displays predefined networks\n(`bridge`, `none`, `host`), + whereas `custom` displays user defined networks.\n\nThe following filter matches + all user defined networks:\n\n```bash\n$ docker network ls --filter type=custom\nNETWORK + ID NAME DRIVER\n95e74588f40d foo bridge\n63d1ff1f77b0 + \ dev bridge\n```\n\nBy having this flag it allows for batch + cleanup. For example, use this filter\nto delete all user defined networks:\n\n```bash\n$ + docker network rm `docker network ls --filter type=custom -q`\n```\n\nA warning + will be issued when trying to remove a network that has containers\nattached.\n\n## + Format\n\nFormat uses a Go template to print the output. The following variables + are \nsupported: \n\n* .ID - Network ID\n* .Name - Network name\n* .Driver - Network + driver\n* .Scope - Network scope (local, global)\n* .IPv6 - Whether IPv6 is enabled + on the network or not\n* .Internal - Whether the network is internal or not\n* .Labels + - All labels assigned to the network\n* .Label - Value of a specific label for this + network. For example `{{.Label \"project.version\"}}`\n" +usage: docker network ls [OPTIONS] +pname: docker network +plink: docker_network.yaml +options: +- option: filter + shorthand: f + description: Provide filter values (e.g. 'driver=bridge') +- option: format + description: Pretty-print networks using a Go template +- option: no-trunc + default_value: "false" + description: Do not truncate the output +- option: quiet + shorthand: q + default_value: "false" + description: Only display network IDs diff --git a/_data/engine-cli/docker_network_prune.yaml b/_data/engine-cli/docker_network_prune.yaml new file mode 100644 index 00000000000..3e51e70ac2a --- /dev/null +++ b/_data/engine-cli/docker_network_prune.yaml @@ -0,0 +1,11 @@ +command: docker network prune +short: Remove all unused networks +long: Remove all unused networks +usage: docker network prune [OPTIONS] +pname: docker network +plink: docker_network.yaml +options: +- option: force + shorthand: f + default_value: "false" + description: Do not prompt for confirmation diff --git a/_data/engine-cli/docker_network_rm.yaml b/_data/engine-cli/docker_network_rm.yaml new file mode 100644 index 00000000000..afc3c2f3d14 --- /dev/null +++ b/_data/engine-cli/docker_network_rm.yaml @@ -0,0 +1,26 @@ +command: docker network rm +short: Remove one or more networks +long: | + Removes one or more networks by name or identifier. To remove a network, + you must first disconnect any containers connected to it. + To remove the network named 'my-network': + + ```bash + $ docker network rm my-network + ``` + + To delete multiple networks in a single `docker network rm` command, provide + multiple network names or ids. The following example deletes a network with id + `3695c422697f` and a network named `my-network`: + + ```bash + $ docker network rm 3695c422697f my-network + ``` + + When you specify multiple networks, the command attempts to delete each in turn. + If the deletion of one network fails, the command continues to the next on the + list and tries to delete that. The command reports success or failure for each + deletion. +usage: docker network rm NETWORK [NETWORK...] +pname: docker network +plink: docker_network.yaml diff --git a/_data/engine-cli/docker_node.yaml b/_data/engine-cli/docker_node.yaml new file mode 100644 index 00000000000..c079518a23a --- /dev/null +++ b/_data/engine-cli/docker_node.yaml @@ -0,0 +1,22 @@ +command: docker node +short: Manage Swarm nodes +long: Manage Swarm nodes +usage: docker node +pname: docker +plink: docker.yaml +cname: +- docker node demote +- docker node inspect +- docker node ls +- docker node promote +- docker node ps +- docker node rm +- docker node update +clink: +- docker_node_demote.yaml +- docker_node_inspect.yaml +- docker_node_ls.yaml +- docker_node_promote.yaml +- docker_node_ps.yaml +- docker_node_rm.yaml +- docker_node_update.yaml diff --git a/_data/engine-cli/docker_node_demote.yaml b/_data/engine-cli/docker_node_demote.yaml new file mode 100644 index 00000000000..282c0971faf --- /dev/null +++ b/_data/engine-cli/docker_node_demote.yaml @@ -0,0 +1,6 @@ +command: docker node demote +short: Demote one or more nodes from manager in the swarm +long: Demote one or more nodes from manager in the swarm +usage: docker node demote NODE [NODE...] +pname: docker node +plink: docker_node.yaml diff --git a/_data/engine-cli/docker_node_inspect.yaml b/_data/engine-cli/docker_node_inspect.yaml new file mode 100644 index 00000000000..7b3af8991fe --- /dev/null +++ b/_data/engine-cli/docker_node_inspect.yaml @@ -0,0 +1,13 @@ +command: docker node inspect +short: Display detailed information on one or more nodes +long: Display detailed information on one or more nodes +usage: docker node inspect [OPTIONS] self|NODE [NODE...] +pname: docker node +plink: docker_node.yaml +options: +- option: format + shorthand: f + description: Format the output using the given Go template +- option: pretty + default_value: "false" + description: Print the information in a human friendly format. diff --git a/_data/engine-cli/docker_node_ls.yaml b/_data/engine-cli/docker_node_ls.yaml new file mode 100644 index 00000000000..9c478e2d133 --- /dev/null +++ b/_data/engine-cli/docker_node_ls.yaml @@ -0,0 +1,14 @@ +command: docker node ls +short: List nodes in the swarm +long: List nodes in the swarm +usage: docker node ls [OPTIONS] +pname: docker node +plink: docker_node.yaml +options: +- option: filter + shorthand: f + description: Filter output based on conditions provided +- option: quiet + shorthand: q + default_value: "false" + description: Only display IDs diff --git a/_data/engine-cli/docker_node_promote.yaml b/_data/engine-cli/docker_node_promote.yaml new file mode 100644 index 00000000000..ee12b6d7b6d --- /dev/null +++ b/_data/engine-cli/docker_node_promote.yaml @@ -0,0 +1,6 @@ +command: docker node promote +short: Promote one or more nodes to manager in the swarm +long: Promote one or more nodes to manager in the swarm +usage: docker node promote NODE [NODE...] +pname: docker node +plink: docker_node.yaml diff --git a/_data/engine-cli/docker_node_ps.yaml b/_data/engine-cli/docker_node_ps.yaml new file mode 100644 index 00000000000..e17c1612c71 --- /dev/null +++ b/_data/engine-cli/docker_node_ps.yaml @@ -0,0 +1,16 @@ +command: docker node ps +short: List tasks running on one or more nodes, defaults to current node +long: List tasks running on one or more nodes, defaults to current node +usage: docker node ps [OPTIONS] [NODE...] +pname: docker node +plink: docker_node.yaml +options: +- option: filter + shorthand: f + description: Filter output based on conditions provided +- option: no-resolve + default_value: "false" + description: Do not map IDs to Names +- option: no-trunc + default_value: "false" + description: Do not truncate output diff --git a/_data/engine-cli/docker_node_rm.yaml b/_data/engine-cli/docker_node_rm.yaml new file mode 100644 index 00000000000..e400bbd91c1 --- /dev/null +++ b/_data/engine-cli/docker_node_rm.yaml @@ -0,0 +1,11 @@ +command: docker node rm +short: Remove one or more nodes from the swarm +long: Remove one or more nodes from the swarm +usage: docker node rm [OPTIONS] NODE [NODE...] +pname: docker node +plink: docker_node.yaml +options: +- option: force + shorthand: f + default_value: "false" + description: Force remove a node from the swarm diff --git a/_data/engine-cli/docker_node_update.yaml b/_data/engine-cli/docker_node_update.yaml new file mode 100644 index 00000000000..bf7187c6dd6 --- /dev/null +++ b/_data/engine-cli/docker_node_update.yaml @@ -0,0 +1,17 @@ +command: docker node update +short: Update a node +long: Update a node +usage: docker node update [OPTIONS] NODE +pname: docker node +plink: docker_node.yaml +options: +- option: availability + description: Availability of the node (active/pause/drain) +- option: label-add + default_value: '[]' + description: Add or update a node label (key=value) +- option: label-rm + default_value: '[]' + description: Remove a node label if exists +- option: role + description: Role of the node (worker/manager) diff --git a/_data/engine-cli/docker_pause.yaml b/_data/engine-cli/docker_pause.yaml new file mode 100644 index 00000000000..bd878757f45 --- /dev/null +++ b/_data/engine-cli/docker_pause.yaml @@ -0,0 +1,6 @@ +command: docker pause +short: Pause all processes within one or more containers +long: Pause all processes within one or more containers +usage: docker pause CONTAINER [CONTAINER...] +pname: docker +plink: docker.yaml diff --git a/_data/engine-cli/docker_plugin.yaml b/_data/engine-cli/docker_plugin.yaml new file mode 100644 index 00000000000..bd0e6572e53 --- /dev/null +++ b/_data/engine-cli/docker_plugin.yaml @@ -0,0 +1,26 @@ +command: docker plugin +short: Manage plugins +long: Manage plugins +usage: docker plugin +pname: docker +plink: docker.yaml +cname: +- docker plugin create +- docker plugin disable +- docker plugin enable +- docker plugin inspect +- docker plugin install +- docker plugin ls +- docker plugin push +- docker plugin rm +- docker plugin set +clink: +- docker_plugin_create.yaml +- docker_plugin_disable.yaml +- docker_plugin_enable.yaml +- docker_plugin_inspect.yaml +- docker_plugin_install.yaml +- docker_plugin_ls.yaml +- docker_plugin_push.yaml +- docker_plugin_rm.yaml +- docker_plugin_set.yaml diff --git a/_data/engine-cli/docker_plugin_create.yaml b/_data/engine-cli/docker_plugin_create.yaml new file mode 100644 index 00000000000..88f1d4cbd4a --- /dev/null +++ b/_data/engine-cli/docker_plugin_create.yaml @@ -0,0 +1,10 @@ +command: docker plugin create +short: Create a plugin from a rootfs and config +long: Create a plugin from a rootfs and config +usage: docker plugin create [OPTIONS] PLUGIN[:tag] PATH-TO-ROOTFS(rootfs + config.json) +pname: docker plugin +plink: docker_plugin.yaml +options: +- option: compress + default_value: "false" + description: Compress the context using gzip diff --git a/_data/engine-cli/docker_plugin_disable.yaml b/_data/engine-cli/docker_plugin_disable.yaml new file mode 100644 index 00000000000..b0abd0a379d --- /dev/null +++ b/_data/engine-cli/docker_plugin_disable.yaml @@ -0,0 +1,6 @@ +command: docker plugin disable +short: Disable a plugin +long: Disable a plugin +usage: docker plugin disable PLUGIN +pname: docker plugin +plink: docker_plugin.yaml diff --git a/_data/engine-cli/docker_plugin_enable.yaml b/_data/engine-cli/docker_plugin_enable.yaml new file mode 100644 index 00000000000..1ba94b4185f --- /dev/null +++ b/_data/engine-cli/docker_plugin_enable.yaml @@ -0,0 +1,10 @@ +command: docker plugin enable +short: Enable a plugin +long: Enable a plugin +usage: docker plugin enable [OPTIONS] PLUGIN +pname: docker plugin +plink: docker_plugin.yaml +options: +- option: timeout + default_value: "0" + description: HTTP client timeout (in seconds) diff --git a/_data/engine-cli/docker_plugin_inspect.yaml b/_data/engine-cli/docker_plugin_inspect.yaml new file mode 100644 index 00000000000..1a13a415f92 --- /dev/null +++ b/_data/engine-cli/docker_plugin_inspect.yaml @@ -0,0 +1,10 @@ +command: docker plugin inspect +short: Display detailed information on one or more plugins +long: Display detailed information on one or more plugins +usage: docker plugin inspect [OPTIONS] PLUGIN|ID [PLUGIN|ID...] +pname: docker plugin +plink: docker_plugin.yaml +options: +- option: format + shorthand: f + description: Format the output using the given Go template diff --git a/_data/engine-cli/docker_plugin_install.yaml b/_data/engine-cli/docker_plugin_install.yaml new file mode 100644 index 00000000000..44e345248ec --- /dev/null +++ b/_data/engine-cli/docker_plugin_install.yaml @@ -0,0 +1,13 @@ +command: docker plugin install +short: Install a plugin +long: Install a plugin +usage: docker plugin install [OPTIONS] PLUGIN [KEY=VALUE...] +pname: docker plugin +plink: docker_plugin.yaml +options: +- option: disable + default_value: "false" + description: Do not enable the plugin on install +- option: grant-all-permissions + default_value: "false" + description: Grant all permissions necessary to run the plugin diff --git a/_data/engine-cli/docker_plugin_ls.yaml b/_data/engine-cli/docker_plugin_ls.yaml new file mode 100644 index 00000000000..d3c030429ca --- /dev/null +++ b/_data/engine-cli/docker_plugin_ls.yaml @@ -0,0 +1,10 @@ +command: docker plugin ls +short: List plugins +long: List plugins +usage: docker plugin ls [OPTIONS] +pname: docker plugin +plink: docker_plugin.yaml +options: +- option: no-trunc + default_value: "false" + description: Don't truncate output diff --git a/_data/engine-cli/docker_plugin_push.yaml b/_data/engine-cli/docker_plugin_push.yaml new file mode 100644 index 00000000000..79f8bda7b5e --- /dev/null +++ b/_data/engine-cli/docker_plugin_push.yaml @@ -0,0 +1,6 @@ +command: docker plugin push +short: Push a plugin to a registry +long: Push a plugin to a registry +usage: docker plugin push PLUGIN[:TAG] +pname: docker plugin +plink: docker_plugin.yaml diff --git a/_data/engine-cli/docker_plugin_rm.yaml b/_data/engine-cli/docker_plugin_rm.yaml new file mode 100644 index 00000000000..c131692ce37 --- /dev/null +++ b/_data/engine-cli/docker_plugin_rm.yaml @@ -0,0 +1,11 @@ +command: docker plugin rm +short: Remove one or more plugins +long: Remove one or more plugins +usage: docker plugin rm [OPTIONS] PLUGIN [PLUGIN...] +pname: docker plugin +plink: docker_plugin.yaml +options: +- option: force + shorthand: f + default_value: "false" + description: Force the removal of an active plugin diff --git a/_data/engine-cli/docker_plugin_set.yaml b/_data/engine-cli/docker_plugin_set.yaml new file mode 100644 index 00000000000..2aa6ff26b4b --- /dev/null +++ b/_data/engine-cli/docker_plugin_set.yaml @@ -0,0 +1,6 @@ +command: docker plugin set +short: Change settings for a plugin +long: Change settings for a plugin +usage: docker plugin set PLUGIN KEY=VALUE [KEY=VALUE...] +pname: docker plugin +plink: docker_plugin.yaml diff --git a/_data/engine-cli/docker_port.yaml b/_data/engine-cli/docker_port.yaml new file mode 100644 index 00000000000..2427702df7d --- /dev/null +++ b/_data/engine-cli/docker_port.yaml @@ -0,0 +1,6 @@ +command: docker port +short: List port mappings or a specific mapping for the container +long: List port mappings or a specific mapping for the container +usage: docker port CONTAINER [PRIVATE_PORT[/PROTO]] +pname: docker +plink: docker.yaml diff --git a/_data/engine-cli/docker_ps.yaml b/_data/engine-cli/docker_ps.yaml new file mode 100644 index 00000000000..2836a4bdbff --- /dev/null +++ b/_data/engine-cli/docker_ps.yaml @@ -0,0 +1,35 @@ +command: docker ps +short: List containers +long: List containers +usage: docker ps [OPTIONS] +pname: docker +plink: docker.yaml +options: +- option: all + shorthand: a + default_value: "false" + description: Show all containers (default shows just running) +- option: filter + shorthand: f + description: Filter output based on conditions provided +- option: format + description: Pretty-print containers using a Go template +- option: last + shorthand: "n" + default_value: "-1" + description: Show n last created containers (includes all states) +- option: latest + shorthand: l + default_value: "false" + description: Show the latest created container (includes all states) +- option: no-trunc + default_value: "false" + description: Don't truncate output +- option: quiet + shorthand: q + default_value: "false" + description: Only display numeric IDs +- option: size + shorthand: s + default_value: "false" + description: Display total file sizes diff --git a/_data/engine-cli/docker_pull.yaml b/_data/engine-cli/docker_pull.yaml new file mode 100644 index 00000000000..86bada6b54e --- /dev/null +++ b/_data/engine-cli/docker_pull.yaml @@ -0,0 +1,14 @@ +command: docker pull +short: Pull an image or a repository from a registry +long: Pull an image or a repository from a registry +usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST] +pname: docker +plink: docker.yaml +options: +- option: all-tags + shorthand: a + default_value: "false" + description: Download all tagged images in the repository +- option: disable-content-trust + default_value: "true" + description: Skip image verification diff --git a/_data/engine-cli/docker_push.yaml b/_data/engine-cli/docker_push.yaml new file mode 100644 index 00000000000..be641b24aa6 --- /dev/null +++ b/_data/engine-cli/docker_push.yaml @@ -0,0 +1,10 @@ +command: docker push +short: Push an image or a repository to a registry +long: Push an image or a repository to a registry +usage: docker push [OPTIONS] NAME[:TAG] +pname: docker +plink: docker.yaml +options: +- option: disable-content-trust + default_value: "true" + description: Skip image verification diff --git a/_data/engine-cli/docker_rename.yaml b/_data/engine-cli/docker_rename.yaml new file mode 100644 index 00000000000..3935d3e0a20 --- /dev/null +++ b/_data/engine-cli/docker_rename.yaml @@ -0,0 +1,6 @@ +command: docker rename +short: Rename a container +long: Rename a container +usage: docker rename CONTAINER NEW_NAME +pname: docker +plink: docker.yaml diff --git a/_data/engine-cli/docker_restart.yaml b/_data/engine-cli/docker_restart.yaml new file mode 100644 index 00000000000..b2795c0ab44 --- /dev/null +++ b/_data/engine-cli/docker_restart.yaml @@ -0,0 +1,11 @@ +command: docker restart +short: Restart one or more containers +long: Restart one or more containers +usage: docker restart [OPTIONS] CONTAINER [CONTAINER...] +pname: docker +plink: docker.yaml +options: +- option: time + shorthand: t + default_value: "10" + description: Seconds to wait for stop before killing the container diff --git a/_data/engine-cli/docker_rm.yaml b/_data/engine-cli/docker_rm.yaml new file mode 100644 index 00000000000..d7ddef45069 --- /dev/null +++ b/_data/engine-cli/docker_rm.yaml @@ -0,0 +1,19 @@ +command: docker rm +short: Remove one or more containers +long: Remove one or more containers +usage: docker rm [OPTIONS] CONTAINER [CONTAINER...] +pname: docker +plink: docker.yaml +options: +- option: force + shorthand: f + default_value: "false" + description: Force the removal of a running container (uses SIGKILL) +- option: link + shorthand: l + default_value: "false" + description: Remove the specified link +- option: volumes + shorthand: v + default_value: "false" + description: Remove the volumes associated with the container diff --git a/_data/engine-cli/docker_rmi.yaml b/_data/engine-cli/docker_rmi.yaml new file mode 100644 index 00000000000..e558864ee9a --- /dev/null +++ b/_data/engine-cli/docker_rmi.yaml @@ -0,0 +1,14 @@ +command: docker rmi +short: Remove one or more images +long: Remove one or more images +usage: docker rmi [OPTIONS] IMAGE [IMAGE...] +pname: docker +plink: docker.yaml +options: +- option: force + shorthand: f + default_value: "false" + description: Force removal of the image +- option: no-prune + default_value: "false" + description: Do not delete untagged parents diff --git a/_data/engine-cli/docker_run.yaml b/_data/engine-cli/docker_run.yaml new file mode 100644 index 00000000000..560ef60bc49 --- /dev/null +++ b/_data/engine-cli/docker_run.yaml @@ -0,0 +1,287 @@ +command: docker run +short: Run a command in a new container +long: Run a command in a new container +usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] +pname: docker +plink: docker.yaml +options: +- option: add-host + default_value: '[]' + description: Add a custom host-to-IP mapping (host:ip) +- option: attach + shorthand: a + default_value: '[]' + description: Attach to STDIN, STDOUT or STDERR +- option: blkio-weight + default_value: "0" + description: | + Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0) +- option: blkio-weight-device + default_value: '[]' + description: Block IO weight (relative device weight) +- option: cap-add + default_value: '[]' + description: Add Linux capabilities +- option: cap-drop + default_value: '[]' + description: Drop Linux capabilities +- option: cgroup-parent + description: Optional parent cgroup for the container +- option: cidfile + description: Write the container ID to the file +- option: cpu-count + default_value: "0" + description: CPU count (Windows only) +- option: cpu-percent + default_value: "0" + description: CPU percent (Windows only) +- option: cpu-period + default_value: "0" + description: Limit CPU CFS (Completely Fair Scheduler) period +- option: cpu-quota + default_value: "0" + description: Limit CPU CFS (Completely Fair Scheduler) quota +- option: cpu-rt-period + default_value: "0" + description: Limit CPU real-time period in microseconds +- option: cpu-rt-runtime + default_value: "0" + description: Limit CPU real-time runtime in microseconds +- option: cpu-shares + shorthand: c + default_value: "0" + description: CPU shares (relative weight) +- option: cpus + default_value: "0.000" + description: Number of CPUs +- option: cpuset-cpus + description: CPUs in which to allow execution (0-3, 0,1) +- option: cpuset-mems + description: MEMs in which to allow execution (0-3, 0,1) +- option: credentialspec + description: Credential spec for managed service account (Windows only) +- option: detach + shorthand: d + default_value: "false" + description: Run container in background and print container ID +- option: detach-keys + description: Override the key sequence for detaching a container +- option: device + default_value: '[]' + description: Add a host device to the container +- option: device-read-bps + default_value: '[]' + description: Limit read rate (bytes per second) from a device +- option: device-read-iops + default_value: '[]' + description: Limit read rate (IO per second) from a device +- option: device-write-bps + default_value: '[]' + description: Limit write rate (bytes per second) to a device +- option: device-write-iops + default_value: '[]' + description: Limit write rate (IO per second) to a device +- option: disable-content-trust + default_value: "true" + description: Skip image verification +- option: dns + default_value: '[]' + description: Set custom DNS servers +- option: dns-opt + default_value: '[]' + description: Set DNS options +- option: dns-option + default_value: '[]' + description: Set DNS options +- option: dns-search + default_value: '[]' + description: Set custom DNS search domains +- option: entrypoint + description: Overwrite the default ENTRYPOINT of the image +- option: env + shorthand: e + default_value: '[]' + description: Set environment variables +- option: env-file + default_value: '[]' + description: Read in a file of environment variables +- option: expose + default_value: '[]' + description: Expose a port or a range of ports +- option: group-add + default_value: '[]' + description: Add additional groups to join +- option: health-cmd + description: Command to run to check health +- option: health-interval + default_value: "0" + description: Time between running the check (ns|us|ms|s|m|h) (default 0s) +- option: health-retries + default_value: "0" + description: Consecutive failures needed to report unhealthy +- option: health-timeout + default_value: "0" + description: | + Maximum time to allow one check to run (ns|us|ms|s|m|h) (default 0s) +- option: help + default_value: "false" + description: Print usage +- option: hostname + shorthand: h + description: Container host name +- option: init + default_value: "false" + description: | + Run an init inside the container that forwards signals and reaps processes +- option: init-path + description: Path to the docker-init binary +- option: interactive + shorthand: i + default_value: "false" + description: Keep STDIN open even if not attached +- option: io-maxbandwidth + description: | + Maximum IO bandwidth limit for the system drive (Windows only) +- option: io-maxiops + default_value: "0" + description: Maximum IOps limit for the system drive (Windows only) +- option: ip + description: Container IPv4 address (e.g. 172.30.100.104) +- option: ip6 + description: Container IPv6 address (e.g. 2001:db8::33) +- option: ipc + description: IPC namespace to use +- option: isolation + description: Container isolation technology +- option: kernel-memory + description: Kernel memory limit +- option: label + shorthand: l + default_value: '[]' + description: Set meta data on a container +- option: label-file + default_value: '[]' + description: Read in a line delimited file of labels +- option: link + default_value: '[]' + description: Add link to another container +- option: link-local-ip + default_value: '[]' + description: Container IPv4/IPv6 link-local addresses +- option: log-driver + description: Logging driver for the container +- option: log-opt + default_value: '[]' + description: Log driver options +- option: mac-address + description: Container MAC address (e.g. 92:d0:c6:0a:29:33) +- option: memory + shorthand: m + description: Memory limit +- option: memory-reservation + description: Memory soft limit +- option: memory-swap + description: | + Swap limit equal to memory plus swap: '-1' to enable unlimited swap +- option: memory-swappiness + default_value: "-1" + description: Tune container memory swappiness (0 to 100) +- option: name + description: Assign a name to the container +- option: net + default_value: default + description: Connect a container to a network +- option: net-alias + default_value: '[]' + description: Add network-scoped alias for the container +- option: network + default_value: default + description: Connect a container to a network +- option: network-alias + default_value: '[]' + description: Add network-scoped alias for the container +- option: no-healthcheck + default_value: "false" + description: Disable any container-specified HEALTHCHECK +- option: oom-kill-disable + default_value: "false" + description: Disable OOM Killer +- option: oom-score-adj + default_value: "0" + description: Tune host's OOM preferences (-1000 to 1000) +- option: pid + description: PID namespace to use +- option: pids-limit + default_value: "0" + description: Tune container pids limit (set -1 for unlimited) +- option: privileged + default_value: "false" + description: Give extended privileges to this container +- option: publish + shorthand: p + default_value: '[]' + description: Publish a container's port(s) to the host +- option: publish-all + shorthand: P + default_value: "false" + description: Publish all exposed ports to random ports +- option: read-only + default_value: "false" + description: Mount the container's root filesystem as read only +- option: restart + default_value: "no" + description: Restart policy to apply when a container exits +- option: rm + default_value: "false" + description: Automatically remove the container when it exits +- option: runtime + description: Runtime to use for this container +- option: security-opt + default_value: '[]' + description: Security Options +- option: shm-size + description: Size of /dev/shm, default value is 64MB +- option: sig-proxy + default_value: "true" + description: Proxy received signals to the process +- option: stop-signal + default_value: SIGTERM + description: Signal to stop a container, SIGTERM by default +- option: stop-timeout + default_value: "0" + description: Timeout (in seconds) to stop a container +- option: storage-opt + default_value: '[]' + description: Storage driver options for the container +- option: sysctl + default_value: map[] + description: Sysctl options +- option: tmpfs + default_value: '[]' + description: Mount a tmpfs directory +- option: tty + shorthand: t + default_value: "false" + description: Allocate a pseudo-TTY +- option: ulimit + default_value: '[]' + description: Ulimit options +- option: user + shorthand: u + description: 'Username or UID (format: [:])' +- option: userns + description: User namespace to use +- option: uts + description: UTS namespace to use +- option: volume + shorthand: v + default_value: '[]' + description: Bind mount a volume +- option: volume-driver + description: Optional volume driver for the container +- option: volumes-from + default_value: '[]' + description: Mount volumes from the specified container(s) +- option: workdir + shorthand: w + description: Working directory inside the container diff --git a/_data/engine-cli/docker_save.yaml b/_data/engine-cli/docker_save.yaml new file mode 100644 index 00000000000..5d8ee319a83 --- /dev/null +++ b/_data/engine-cli/docker_save.yaml @@ -0,0 +1,10 @@ +command: docker save +short: Save one or more images to a tar archive (streamed to STDOUT by default) +long: Save one or more images to a tar archive (streamed to STDOUT by default) +usage: docker save [OPTIONS] IMAGE [IMAGE...] +pname: docker +plink: docker.yaml +options: +- option: output + shorthand: o + description: Write to a file, instead of STDOUT diff --git a/_data/engine-cli/docker_search.yaml b/_data/engine-cli/docker_search.yaml new file mode 100644 index 00000000000..337c5f1afdb --- /dev/null +++ b/_data/engine-cli/docker_search.yaml @@ -0,0 +1,23 @@ +command: docker search +short: Search the Docker Hub for images +long: Search the Docker Hub for images +usage: docker search [OPTIONS] TERM +pname: docker +plink: docker.yaml +options: +- option: automated + default_value: "false" + description: Only show automated builds +- option: filter + shorthand: f + description: Filter output based on conditions provided +- option: limit + default_value: "25" + description: Max number of search results +- option: no-trunc + default_value: "false" + description: Don't truncate output +- option: stars + shorthand: s + default_value: "0" + description: Only displays with at least x stars diff --git a/_data/engine-cli/docker_secret.yaml b/_data/engine-cli/docker_secret.yaml new file mode 100644 index 00000000000..bad1030e0e4 --- /dev/null +++ b/_data/engine-cli/docker_secret.yaml @@ -0,0 +1,16 @@ +command: docker secret +short: Manage Docker secrets +long: Manage Docker secrets +usage: docker secret +pname: docker +plink: docker.yaml +cname: +- docker secret create +- docker secret inspect +- docker secret ls +- docker secret rm +clink: +- docker_secret_create.yaml +- docker_secret_inspect.yaml +- docker_secret_ls.yaml +- docker_secret_rm.yaml diff --git a/_data/engine-cli/docker_secret_create.yaml b/_data/engine-cli/docker_secret_create.yaml new file mode 100644 index 00000000000..8094c584eec --- /dev/null +++ b/_data/engine-cli/docker_secret_create.yaml @@ -0,0 +1,11 @@ +command: docker secret create +short: Create a secret using stdin as content +long: Create a secret using stdin as content +usage: docker secret create [OPTIONS] SECRET +pname: docker secret +plink: docker_secret.yaml +options: +- option: label + shorthand: l + default_value: '[]' + description: Secret labels diff --git a/_data/engine-cli/docker_secret_inspect.yaml b/_data/engine-cli/docker_secret_inspect.yaml new file mode 100644 index 00000000000..64657022313 --- /dev/null +++ b/_data/engine-cli/docker_secret_inspect.yaml @@ -0,0 +1,10 @@ +command: docker secret inspect +short: Display detailed information on one or more secrets +long: Display detailed information on one or more secrets +usage: docker secret inspect [OPTIONS] SECRET [SECRET...] +pname: docker secret +plink: docker_secret.yaml +options: +- option: format + shorthand: f + description: Format the output using the given Go template diff --git a/_data/engine-cli/docker_secret_ls.yaml b/_data/engine-cli/docker_secret_ls.yaml new file mode 100644 index 00000000000..05aaa778492 --- /dev/null +++ b/_data/engine-cli/docker_secret_ls.yaml @@ -0,0 +1,11 @@ +command: docker secret ls +short: List secrets +long: List secrets +usage: docker secret ls [OPTIONS] +pname: docker secret +plink: docker_secret.yaml +options: +- option: quiet + shorthand: q + default_value: "false" + description: Only display IDs diff --git a/_data/engine-cli/docker_secret_rm.yaml b/_data/engine-cli/docker_secret_rm.yaml new file mode 100644 index 00000000000..69ea4cb8f02 --- /dev/null +++ b/_data/engine-cli/docker_secret_rm.yaml @@ -0,0 +1,6 @@ +command: docker secret rm +short: Remove one or more secrets +long: Remove one or more secrets +usage: docker secret rm SECRET [SECRET...] +pname: docker secret +plink: docker_secret.yaml diff --git a/_data/engine-cli/docker_service.yaml b/_data/engine-cli/docker_service.yaml new file mode 100644 index 00000000000..9e919b0fc81 --- /dev/null +++ b/_data/engine-cli/docker_service.yaml @@ -0,0 +1,24 @@ +command: docker service +short: Manage services +long: Manage services +usage: docker service +pname: docker +plink: docker.yaml +cname: +- docker service create +- docker service inspect +- docker service logs +- docker service ls +- docker service ps +- docker service rm +- docker service scale +- docker service update +clink: +- docker_service_create.yaml +- docker_service_inspect.yaml +- docker_service_logs.yaml +- docker_service_ls.yaml +- docker_service_ps.yaml +- docker_service_rm.yaml +- docker_service_scale.yaml +- docker_service_update.yaml diff --git a/_data/engine-cli/docker_service_create.yaml b/_data/engine-cli/docker_service_create.yaml new file mode 100644 index 00000000000..363252542a7 --- /dev/null +++ b/_data/engine-cli/docker_service_create.yaml @@ -0,0 +1,137 @@ +command: docker service create +short: Create a new service +long: Create a new service +usage: docker service create [OPTIONS] IMAGE [COMMAND] [ARG...] +pname: docker service +plink: docker_service.yaml +options: +- option: constraint + default_value: '[]' + description: Placement constraints +- option: container-label + default_value: '[]' + description: Container labels +- option: dns + default_value: '[]' + description: Set custom DNS servers +- option: dns-option + default_value: '[]' + description: Set DNS options +- option: dns-search + default_value: '[]' + description: Set custom DNS search domains +- option: endpoint-mode + description: Endpoint mode (vip or dnsrr) +- option: env + shorthand: e + default_value: '[]' + description: Set environment variables +- option: env-file + default_value: '[]' + description: Read in a file of environment variables +- option: group + default_value: '[]' + description: Set one or more supplementary user groups for the container +- option: health-cmd + description: Command to run to check health +- option: health-interval + default_value: none + description: Time between running the check (ns|us|ms|s|m|h) +- option: health-retries + default_value: "0" + description: Consecutive failures needed to report unhealthy +- option: health-timeout + default_value: none + description: Maximum time to allow one check to run (ns|us|ms|s|m|h) +- option: host + default_value: '[]' + description: Set one or more custom host-to-IP mappings (host:ip) +- option: hostname + description: Container hostname +- option: label + shorthand: l + default_value: '[]' + description: Service labels +- option: limit-cpu + default_value: "0.000" + description: Limit CPUs +- option: limit-memory + default_value: 0 B + description: Limit Memory +- option: log-driver + description: Logging driver for service +- option: log-opt + default_value: '[]' + description: Logging driver options +- option: mode + default_value: replicated + description: Service mode (replicated or global) +- option: mount + description: Attach a filesystem mount to the service +- option: name + description: Service name +- option: network + default_value: '[]' + description: Network attachments +- option: no-healthcheck + default_value: "false" + description: Disable any container-specified HEALTHCHECK +- option: publish + shorthand: p + description: Publish a port as a node port +- option: replicas + default_value: none + description: Number of tasks +- option: reserve-cpu + default_value: "0.000" + description: Reserve CPUs +- option: reserve-memory + default_value: 0 B + description: Reserve Memory +- option: restart-condition + description: Restart when condition is met (none, on-failure, or any) +- option: restart-delay + default_value: none + description: Delay between restart attempts (ns|us|ms|s|m|h) +- option: restart-max-attempts + default_value: none + description: Maximum number of restarts before giving up +- option: restart-window + default_value: none + description: Window used to evaluate the restart policy (ns|us|ms|s|m|h) +- option: secret + description: Specify secrets to expose to the service +- option: stop-grace-period + default_value: none + description: | + Time to wait before force killing a container (ns|us|ms|s|m|h) +- option: tty + shorthand: t + default_value: "false" + description: Allocate a pseudo-TTY +- option: update-delay + default_value: "0" + description: Delay between updates (ns|us|ms|s|m|h) (default 0s) +- option: update-failure-action + default_value: pause + description: Action on update failure (pause|continue) +- option: update-max-failure-ratio + default_value: "0" + description: Failure rate to tolerate during an update +- option: update-monitor + default_value: "0" + description: | + Duration after each task update to monitor for failure (ns|us|ms|s|m|h) (default 0s) +- option: update-parallelism + default_value: "1" + description: | + Maximum number of tasks updated simultaneously (0 to update all at once) +- option: user + shorthand: u + description: 'Username or UID (format: [:])' +- option: with-registry-auth + default_value: "false" + description: Send registry authentication details to swarm agents +- option: workdir + shorthand: w + description: Working directory inside the container diff --git a/_data/engine-cli/docker_service_inspect.yaml b/_data/engine-cli/docker_service_inspect.yaml new file mode 100644 index 00000000000..05a93786874 --- /dev/null +++ b/_data/engine-cli/docker_service_inspect.yaml @@ -0,0 +1,13 @@ +command: docker service inspect +short: Display detailed information on one or more services +long: Display detailed information on one or more services +usage: docker service inspect [OPTIONS] SERVICE [SERVICE...] +pname: docker service +plink: docker_service.yaml +options: +- option: format + shorthand: f + description: Format the output using the given Go template +- option: pretty + default_value: "false" + description: Print the information in a human friendly format. diff --git a/_data/engine-cli/docker_service_logs.yaml b/_data/engine-cli/docker_service_logs.yaml new file mode 100644 index 00000000000..adbacd1a4b5 --- /dev/null +++ b/_data/engine-cli/docker_service_logs.yaml @@ -0,0 +1,26 @@ +command: docker service logs +short: Fetch the logs of a service +long: Fetch the logs of a service +usage: docker service logs [OPTIONS] SERVICE +pname: docker service +plink: docker_service.yaml +options: +- option: details + default_value: "false" + description: Show extra details provided to logs +- option: follow + shorthand: f + default_value: "false" + description: Follow log output +- option: no-resolve + default_value: "false" + description: Do not map IDs to Names +- option: since + description: Show logs since timestamp +- option: tail + default_value: all + description: Number of lines to show from the end of the logs +- option: timestamps + shorthand: t + default_value: "false" + description: Show timestamps diff --git a/_data/engine-cli/docker_service_ls.yaml b/_data/engine-cli/docker_service_ls.yaml new file mode 100644 index 00000000000..1fe576c38d5 --- /dev/null +++ b/_data/engine-cli/docker_service_ls.yaml @@ -0,0 +1,14 @@ +command: docker service ls +short: List services +long: List services +usage: docker service ls [OPTIONS] +pname: docker service +plink: docker_service.yaml +options: +- option: filter + shorthand: f + description: Filter output based on conditions provided +- option: quiet + shorthand: q + default_value: "false" + description: Only display IDs diff --git a/_data/engine-cli/docker_service_ps.yaml b/_data/engine-cli/docker_service_ps.yaml new file mode 100644 index 00000000000..384e118dff8 --- /dev/null +++ b/_data/engine-cli/docker_service_ps.yaml @@ -0,0 +1,20 @@ +command: docker service ps +short: List the tasks of a service +long: List the tasks of a service +usage: docker service ps [OPTIONS] SERVICE +pname: docker service +plink: docker_service.yaml +options: +- option: filter + shorthand: f + description: Filter output based on conditions provided +- option: no-resolve + default_value: "false" + description: Do not map IDs to Names +- option: no-trunc + default_value: "false" + description: Do not truncate output +- option: quiet + shorthand: q + default_value: "false" + description: Only display task IDs diff --git a/_data/engine-cli/docker_service_rm.yaml b/_data/engine-cli/docker_service_rm.yaml new file mode 100644 index 00000000000..2a62ac01ded --- /dev/null +++ b/_data/engine-cli/docker_service_rm.yaml @@ -0,0 +1,6 @@ +command: docker service rm +short: Remove one or more services +long: Remove one or more services +usage: docker service rm SERVICE [SERVICE...] +pname: docker service +plink: docker_service.yaml diff --git a/_data/engine-cli/docker_service_scale.yaml b/_data/engine-cli/docker_service_scale.yaml new file mode 100644 index 00000000000..aa546312259 --- /dev/null +++ b/_data/engine-cli/docker_service_scale.yaml @@ -0,0 +1,6 @@ +command: docker service scale +short: Scale one or multiple replicated services +long: Scale one or multiple replicated services +usage: docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...] +pname: docker service +plink: docker_service.yaml diff --git a/_data/engine-cli/docker_service_update.yaml b/_data/engine-cli/docker_service_update.yaml new file mode 100644 index 00000000000..c227c16b54e --- /dev/null +++ b/_data/engine-cli/docker_service_update.yaml @@ -0,0 +1,169 @@ +command: docker service update +short: Update a service +long: Update a service +usage: docker service update [OPTIONS] SERVICE +pname: docker service +plink: docker_service.yaml +options: +- option: args + description: Service command args +- option: constraint-add + default_value: '[]' + description: Add or update a placement constraint +- option: constraint-rm + default_value: '[]' + description: Remove a constraint +- option: container-label-add + default_value: '[]' + description: Add or update a container label +- option: container-label-rm + default_value: '[]' + description: Remove a container label by its key +- option: dns-add + default_value: '[]' + description: Add or update a custom DNS server +- option: dns-option-add + default_value: '[]' + description: Add or update a DNS option +- option: dns-option-rm + default_value: '[]' + description: Remove a DNS option +- option: dns-rm + default_value: '[]' + description: Remove a custom DNS server +- option: dns-search-add + default_value: '[]' + description: Add or update a custom DNS search domain +- option: dns-search-rm + default_value: '[]' + description: Remove a DNS search domain +- option: endpoint-mode + description: Endpoint mode (vip or dnsrr) +- option: env-add + default_value: '[]' + description: Add or update an environment variable +- option: env-rm + default_value: '[]' + description: Remove an environment variable +- option: force + default_value: "false" + description: Force update even if no changes require it +- option: group-add + default_value: '[]' + description: Add an additional supplementary user group to the container +- option: group-rm + default_value: '[]' + description: | + Remove a previously added supplementary user group from the container +- option: health-cmd + description: Command to run to check health +- option: health-interval + default_value: none + description: Time between running the check (ns|us|ms|s|m|h) +- option: health-retries + default_value: "0" + description: Consecutive failures needed to report unhealthy +- option: health-timeout + default_value: none + description: Maximum time to allow one check to run (ns|us|ms|s|m|h) +- option: host-add + default_value: '[]' + description: Add or update a custom host-to-IP mapping (host:ip) +- option: host-rm + default_value: '[]' + description: Remove a custom host-to-IP mapping (host:ip) +- option: hostname + description: Container hostname +- option: image + description: Service image tag +- option: label-add + default_value: '[]' + description: Add or update a service label +- option: label-rm + default_value: '[]' + description: Remove a label by its key +- option: limit-cpu + default_value: "0.000" + description: Limit CPUs +- option: limit-memory + default_value: 0 B + description: Limit Memory +- option: log-driver + description: Logging driver for service +- option: log-opt + default_value: '[]' + description: Logging driver options +- option: mount-add + description: Add or update a mount on a service +- option: mount-rm + default_value: '[]' + description: Remove a mount by its target path +- option: no-healthcheck + default_value: "false" + description: Disable any container-specified HEALTHCHECK +- option: publish-add + description: Add or update a published port +- option: publish-rm + description: Remove a published port by its target port +- option: replicas + default_value: none + description: Number of tasks +- option: reserve-cpu + default_value: "0.000" + description: Reserve CPUs +- option: reserve-memory + default_value: 0 B + description: Reserve Memory +- option: restart-condition + description: Restart when condition is met (none, on-failure, or any) +- option: restart-delay + default_value: none + description: Delay between restart attempts (ns|us|ms|s|m|h) +- option: restart-max-attempts + default_value: none + description: Maximum number of restarts before giving up +- option: restart-window + default_value: none + description: Window used to evaluate the restart policy (ns|us|ms|s|m|h) +- option: rollback + default_value: "false" + description: Rollback to previous specification +- option: secret-add + description: Add or update a secret on a service +- option: secret-rm + default_value: '[]' + description: Remove a secret +- option: stop-grace-period + default_value: none + description: | + Time to wait before force killing a container (ns|us|ms|s|m|h) +- option: tty + shorthand: t + default_value: "false" + description: Allocate a pseudo-TTY +- option: update-delay + default_value: "0" + description: Delay between updates (ns|us|ms|s|m|h) (default 0s) +- option: update-failure-action + default_value: pause + description: Action on update failure (pause|continue) +- option: update-max-failure-ratio + default_value: "0" + description: Failure rate to tolerate during an update +- option: update-monitor + default_value: "0" + description: | + Duration after each task update to monitor for failure (ns|us|ms|s|m|h) (default 0s) +- option: update-parallelism + default_value: "1" + description: | + Maximum number of tasks updated simultaneously (0 to update all at once) +- option: user + shorthand: u + description: 'Username or UID (format: [:])' +- option: with-registry-auth + default_value: "false" + description: Send registry authentication details to swarm agents +- option: workdir + shorthand: w + description: Working directory inside the container diff --git a/_data/engine-cli/docker_stack.yaml b/_data/engine-cli/docker_stack.yaml new file mode 100644 index 00000000000..59f04a610d8 --- /dev/null +++ b/_data/engine-cli/docker_stack.yaml @@ -0,0 +1,18 @@ +command: docker stack +short: Manage Docker stacks +long: Manage Docker stacks +usage: docker stack +pname: docker +plink: docker.yaml +cname: +- docker stack deploy +- docker stack ls +- docker stack ps +- docker stack rm +- docker stack services +clink: +- docker_stack_deploy.yaml +- docker_stack_ls.yaml +- docker_stack_ps.yaml +- docker_stack_rm.yaml +- docker_stack_services.yaml diff --git a/_data/engine-cli/docker_stack_deploy.yaml b/_data/engine-cli/docker_stack_deploy.yaml new file mode 100644 index 00000000000..95bcba3474e --- /dev/null +++ b/_data/engine-cli/docker_stack_deploy.yaml @@ -0,0 +1,15 @@ +command: docker stack deploy +short: Deploy a new stack or update an existing stack +long: Deploy a new stack or update an existing stack +usage: docker stack deploy [OPTIONS] STACK +pname: docker stack +plink: docker_stack.yaml +options: +- option: bundle-file + description: Path to a Distributed Application Bundle file +- option: compose-file + shorthand: c + description: Path to a Compose file +- option: with-registry-auth + default_value: "false" + description: Send registry authentication details to Swarm agents diff --git a/_data/engine-cli/docker_stack_ls.yaml b/_data/engine-cli/docker_stack_ls.yaml new file mode 100644 index 00000000000..3176bcff3d0 --- /dev/null +++ b/_data/engine-cli/docker_stack_ls.yaml @@ -0,0 +1,6 @@ +command: docker stack ls +short: List stacks +long: List stacks +usage: docker stack ls +pname: docker stack +plink: docker_stack.yaml diff --git a/_data/engine-cli/docker_stack_ps.yaml b/_data/engine-cli/docker_stack_ps.yaml new file mode 100644 index 00000000000..3f46f59e39f --- /dev/null +++ b/_data/engine-cli/docker_stack_ps.yaml @@ -0,0 +1,20 @@ +command: docker stack ps +short: List the tasks in the stack +long: List the tasks in the stack +usage: docker stack ps [OPTIONS] STACK +pname: docker stack +plink: docker_stack.yaml +options: +- option: all + shorthand: a + default_value: "false" + description: Display all tasks +- option: filter + shorthand: f + description: Filter output based on conditions provided +- option: no-resolve + default_value: "false" + description: Do not map IDs to Names +- option: no-trunc + default_value: "false" + description: Do not truncate output diff --git a/_data/engine-cli/docker_stack_rm.yaml b/_data/engine-cli/docker_stack_rm.yaml new file mode 100644 index 00000000000..b6626648ca3 --- /dev/null +++ b/_data/engine-cli/docker_stack_rm.yaml @@ -0,0 +1,6 @@ +command: docker stack rm +short: Remove the stack +long: Remove the stack +usage: docker stack rm STACK +pname: docker stack +plink: docker_stack.yaml diff --git a/_data/engine-cli/docker_stack_services.yaml b/_data/engine-cli/docker_stack_services.yaml new file mode 100644 index 00000000000..40f2462815d --- /dev/null +++ b/_data/engine-cli/docker_stack_services.yaml @@ -0,0 +1,14 @@ +command: docker stack services +short: List the services in the stack +long: List the services in the stack +usage: docker stack services [OPTIONS] STACK +pname: docker stack +plink: docker_stack.yaml +options: +- option: filter + shorthand: f + description: Filter output based on conditions provided +- option: quiet + shorthand: q + default_value: "false" + description: Only display IDs diff --git a/_data/engine-cli/docker_start.yaml b/_data/engine-cli/docker_start.yaml new file mode 100644 index 00000000000..83554192050 --- /dev/null +++ b/_data/engine-cli/docker_start.yaml @@ -0,0 +1,21 @@ +command: docker start +short: Start one or more stopped containers +long: Start one or more stopped containers +usage: docker start [OPTIONS] CONTAINER [CONTAINER...] +pname: docker +plink: docker.yaml +options: +- option: attach + shorthand: a + default_value: "false" + description: Attach STDOUT/STDERR and forward signals +- option: checkpoint + description: Restore from this checkpoint +- option: checkpoint-dir + description: Use a custom checkpoint storage directory +- option: detach-keys + description: Override the key sequence for detaching a container +- option: interactive + shorthand: i + default_value: "false" + description: Attach container's STDIN diff --git a/_data/engine-cli/docker_stats.yaml b/_data/engine-cli/docker_stats.yaml new file mode 100644 index 00000000000..14010bfd096 --- /dev/null +++ b/_data/engine-cli/docker_stats.yaml @@ -0,0 +1,16 @@ +command: docker stats +short: Display a live stream of container(s) resource usage statistics +long: Display a live stream of container(s) resource usage statistics +usage: docker stats [OPTIONS] [CONTAINER...] +pname: docker +plink: docker.yaml +options: +- option: all + shorthand: a + default_value: "false" + description: Show all containers (default shows just running) +- option: format + description: Pretty-print images using a Go template +- option: no-stream + default_value: "false" + description: Disable streaming stats and only pull the first result diff --git a/_data/engine-cli/docker_stop.yaml b/_data/engine-cli/docker_stop.yaml new file mode 100644 index 00000000000..6be109b2fe6 --- /dev/null +++ b/_data/engine-cli/docker_stop.yaml @@ -0,0 +1,11 @@ +command: docker stop +short: Stop one or more running containers +long: Stop one or more running containers +usage: docker stop [OPTIONS] CONTAINER [CONTAINER...] +pname: docker +plink: docker.yaml +options: +- option: time + shorthand: t + default_value: "10" + description: Seconds to wait for stop before killing it diff --git a/_data/engine-cli/docker_swarm.yaml b/_data/engine-cli/docker_swarm.yaml new file mode 100644 index 00000000000..b8935bd2309 --- /dev/null +++ b/_data/engine-cli/docker_swarm.yaml @@ -0,0 +1,22 @@ +command: docker swarm +short: Manage Swarm +long: Manage Swarm +usage: docker swarm +pname: docker +plink: docker.yaml +cname: +- docker swarm init +- docker swarm join +- docker swarm join-token +- docker swarm leave +- docker swarm unlock +- docker swarm unlock-key +- docker swarm update +clink: +- docker_swarm_init.yaml +- docker_swarm_join.yaml +- docker_swarm_join-token.yaml +- docker_swarm_leave.yaml +- docker_swarm_unlock.yaml +- docker_swarm_unlock-key.yaml +- docker_swarm_update.yaml diff --git a/_data/engine-cli/docker_swarm_init.yaml b/_data/engine-cli/docker_swarm_init.yaml new file mode 100644 index 00000000000..6a2f9305571 --- /dev/null +++ b/_data/engine-cli/docker_swarm_init.yaml @@ -0,0 +1,36 @@ +command: docker swarm init +short: Initialize a swarm +long: Initialize a swarm +usage: docker swarm init [OPTIONS] +pname: docker swarm +plink: docker_swarm.yaml +options: +- option: advertise-addr + description: 'Advertised address (format: [:port])' +- option: autolock + default_value: "false" + description: | + Enable manager autolocking (requiring an unlock key to start a stopped manager) +- option: cert-expiry + default_value: 2160h0m0s + description: Validity period for node certificates (ns|us|ms|s|m|h) +- option: dispatcher-heartbeat + default_value: 5s + description: Dispatcher heartbeat period (ns|us|ms|s|m|h) +- option: external-ca + description: Specifications of one or more certificate signing endpoints +- option: force-new-cluster + default_value: "false" + description: Force create a new cluster from current state +- option: listen-addr + default_value: 0.0.0.0:2377 + description: 'Listen address (format: [:port])' +- option: max-snapshots + default_value: "0" + description: Number of additional Raft snapshots to retain +- option: snapshot-interval + default_value: "10000" + description: Number of log entries between Raft snapshots +- option: task-history-limit + default_value: "5" + description: Task history retention limit diff --git a/_data/engine-cli/docker_swarm_join-token.yaml b/_data/engine-cli/docker_swarm_join-token.yaml new file mode 100644 index 00000000000..a334eb1dd79 --- /dev/null +++ b/_data/engine-cli/docker_swarm_join-token.yaml @@ -0,0 +1,14 @@ +command: docker swarm join-token +short: Manage join tokens +long: Manage join tokens +usage: docker swarm join-token [OPTIONS] (worker|manager) +pname: docker swarm +plink: docker_swarm.yaml +options: +- option: quiet + shorthand: q + default_value: "false" + description: Only display token +- option: rotate + default_value: "false" + description: Rotate join token diff --git a/_data/engine-cli/docker_swarm_join.yaml b/_data/engine-cli/docker_swarm_join.yaml new file mode 100644 index 00000000000..57d27329f1f --- /dev/null +++ b/_data/engine-cli/docker_swarm_join.yaml @@ -0,0 +1,14 @@ +command: docker swarm join +short: Join a swarm as a node and/or manager +long: Join a swarm as a node and/or manager +usage: docker swarm join [OPTIONS] HOST:PORT +pname: docker swarm +plink: docker_swarm.yaml +options: +- option: advertise-addr + description: 'Advertised address (format: [:port])' +- option: listen-addr + default_value: 0.0.0.0:2377 + description: 'Listen address (format: [:port])' +- option: token + description: Token for entry into the swarm diff --git a/_data/engine-cli/docker_swarm_leave.yaml b/_data/engine-cli/docker_swarm_leave.yaml new file mode 100644 index 00000000000..d22cbd21b5e --- /dev/null +++ b/_data/engine-cli/docker_swarm_leave.yaml @@ -0,0 +1,11 @@ +command: docker swarm leave +short: Leave the swarm +long: Leave the swarm +usage: docker swarm leave [OPTIONS] +pname: docker swarm +plink: docker_swarm.yaml +options: +- option: force + shorthand: f + default_value: "false" + description: Force this node to leave the swarm, ignoring warnings diff --git a/_data/engine-cli/docker_swarm_unlock-key.yaml b/_data/engine-cli/docker_swarm_unlock-key.yaml new file mode 100644 index 00000000000..a5534d60a8f --- /dev/null +++ b/_data/engine-cli/docker_swarm_unlock-key.yaml @@ -0,0 +1,14 @@ +command: docker swarm unlock-key +short: Manage the unlock key +long: Manage the unlock key +usage: docker swarm unlock-key [OPTIONS] +pname: docker swarm +plink: docker_swarm.yaml +options: +- option: quiet + shorthand: q + default_value: "false" + description: Only display token +- option: rotate + default_value: "false" + description: Rotate unlock key diff --git a/_data/engine-cli/docker_swarm_unlock.yaml b/_data/engine-cli/docker_swarm_unlock.yaml new file mode 100644 index 00000000000..5155a4961b4 --- /dev/null +++ b/_data/engine-cli/docker_swarm_unlock.yaml @@ -0,0 +1,6 @@ +command: docker swarm unlock +short: Unlock swarm +long: Unlock swarm +usage: docker swarm unlock +pname: docker swarm +plink: docker_swarm.yaml diff --git a/_data/engine-cli/docker_swarm_update.yaml b/_data/engine-cli/docker_swarm_update.yaml new file mode 100644 index 00000000000..0380cb850e3 --- /dev/null +++ b/_data/engine-cli/docker_swarm_update.yaml @@ -0,0 +1,27 @@ +command: docker swarm update +short: Update the swarm +long: Update the swarm +usage: docker swarm update [OPTIONS] +pname: docker swarm +plink: docker_swarm.yaml +options: +- option: autolock + default_value: "false" + description: Change manager autolocking setting (true|false) +- option: cert-expiry + default_value: 2160h0m0s + description: Validity period for node certificates (ns|us|ms|s|m|h) +- option: dispatcher-heartbeat + default_value: 5s + description: Dispatcher heartbeat period (ns|us|ms|s|m|h) +- option: external-ca + description: Specifications of one or more certificate signing endpoints +- option: max-snapshots + default_value: "0" + description: Number of additional Raft snapshots to retain +- option: snapshot-interval + default_value: "10000" + description: Number of log entries between Raft snapshots +- option: task-history-limit + default_value: "5" + description: Task history retention limit diff --git a/_data/engine-cli/docker_system.yaml b/_data/engine-cli/docker_system.yaml new file mode 100644 index 00000000000..9b3a9fa7247 --- /dev/null +++ b/_data/engine-cli/docker_system.yaml @@ -0,0 +1,16 @@ +command: docker system +short: Manage Docker +long: Manage Docker +usage: docker system +pname: docker +plink: docker.yaml +cname: +- docker system df +- docker system events +- docker system info +- docker system prune +clink: +- docker_system_df.yaml +- docker_system_events.yaml +- docker_system_info.yaml +- docker_system_prune.yaml diff --git a/_data/engine-cli/docker_system_df.yaml b/_data/engine-cli/docker_system_df.yaml new file mode 100644 index 00000000000..bef13871a4b --- /dev/null +++ b/_data/engine-cli/docker_system_df.yaml @@ -0,0 +1,11 @@ +command: docker system df +short: Show docker disk usage +long: Show docker disk usage +usage: docker system df [OPTIONS] +pname: docker system +plink: docker_system.yaml +options: +- option: verbose + shorthand: v + default_value: "false" + description: Show detailed information on space usage diff --git a/_data/engine-cli/docker_system_events.yaml b/_data/engine-cli/docker_system_events.yaml new file mode 100644 index 00000000000..7ac3a687a23 --- /dev/null +++ b/_data/engine-cli/docker_system_events.yaml @@ -0,0 +1,16 @@ +command: docker system events +short: Get real time events from the server +long: Get real time events from the server +usage: docker system events [OPTIONS] +pname: docker system +plink: docker_system.yaml +options: +- option: filter + shorthand: f + description: Filter output based on conditions provided +- option: format + description: Format the output using the given Go template +- option: since + description: Show all events created since timestamp +- option: until + description: Stream events until this timestamp diff --git a/_data/engine-cli/docker_system_info.yaml b/_data/engine-cli/docker_system_info.yaml new file mode 100644 index 00000000000..2636cfc87ad --- /dev/null +++ b/_data/engine-cli/docker_system_info.yaml @@ -0,0 +1,10 @@ +command: docker system info +short: Display system-wide information +long: Display system-wide information +usage: docker system info [OPTIONS] +pname: docker system +plink: docker_system.yaml +options: +- option: format + shorthand: f + description: Format the output using the given Go template diff --git a/_data/engine-cli/docker_system_prune.yaml b/_data/engine-cli/docker_system_prune.yaml new file mode 100644 index 00000000000..953ea7eb42f --- /dev/null +++ b/_data/engine-cli/docker_system_prune.yaml @@ -0,0 +1,15 @@ +command: docker system prune +short: Remove unused data +long: Remove unused data +usage: docker system prune [OPTIONS] +pname: docker system +plink: docker_system.yaml +options: +- option: all + shorthand: a + default_value: "false" + description: Remove all unused images not just dangling ones +- option: force + shorthand: f + default_value: "false" + description: Do not prompt for confirmation diff --git a/_data/engine-cli/docker_tag.yaml b/_data/engine-cli/docker_tag.yaml new file mode 100644 index 00000000000..1f99378ccae --- /dev/null +++ b/_data/engine-cli/docker_tag.yaml @@ -0,0 +1,6 @@ +command: docker tag +short: Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE +long: Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE +usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] +pname: docker +plink: docker.yaml diff --git a/_data/engine-cli/docker_top.yaml b/_data/engine-cli/docker_top.yaml new file mode 100644 index 00000000000..5082a5a5b7e --- /dev/null +++ b/_data/engine-cli/docker_top.yaml @@ -0,0 +1,17 @@ +command: docker top +short: Display the running processes of a container +long: | + Display the running process of the container. ps-OPTION can be any of the options you would pass to a Linux ps command. + + All displayed information is from host's point of view. + + # EXAMPLES + + Run **docker top** with the ps option of -x: + + $ docker top 8601afda2b -x + PID TTY STAT TIME COMMAND + 16623 ? Ss 0:00 sleep 99999 +usage: docker top CONTAINER [ps OPTIONS] +pname: docker +plink: docker.yaml diff --git a/_data/engine-cli/docker_unpause.yaml b/_data/engine-cli/docker_unpause.yaml new file mode 100644 index 00000000000..3e3de8cdc83 --- /dev/null +++ b/_data/engine-cli/docker_unpause.yaml @@ -0,0 +1,6 @@ +command: docker unpause +short: Unpause all processes within one or more containers +long: Unpause all processes within one or more containers +usage: docker unpause CONTAINER [CONTAINER...] +pname: docker +plink: docker.yaml diff --git a/_data/engine-cli/docker_update.yaml b/_data/engine-cli/docker_update.yaml new file mode 100644 index 00000000000..d129771c0a9 --- /dev/null +++ b/_data/engine-cli/docker_update.yaml @@ -0,0 +1,43 @@ +command: docker update +short: Update configuration of one or more containers +long: Update configuration of one or more containers +usage: docker update [OPTIONS] CONTAINER [CONTAINER...] +pname: docker +plink: docker.yaml +options: +- option: blkio-weight + default_value: "0" + description: | + Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0) +- option: cpu-period + default_value: "0" + description: Limit CPU CFS (Completely Fair Scheduler) period +- option: cpu-quota + default_value: "0" + description: Limit CPU CFS (Completely Fair Scheduler) quota +- option: cpu-rt-period + default_value: "0" + description: Limit the CPU real-time period in microseconds +- option: cpu-rt-runtime + default_value: "0" + description: Limit the CPU real-time runtime in microseconds +- option: cpu-shares + shorthand: c + default_value: "0" + description: CPU shares (relative weight) +- option: cpuset-cpus + description: CPUs in which to allow execution (0-3, 0,1) +- option: cpuset-mems + description: MEMs in which to allow execution (0-3, 0,1) +- option: kernel-memory + description: Kernel memory limit +- option: memory + shorthand: m + description: Memory limit +- option: memory-reservation + description: Memory soft limit +- option: memory-swap + description: | + Swap limit equal to memory plus swap: '-1' to enable unlimited swap +- option: restart + description: Restart policy to apply when a container exits diff --git a/_data/engine-cli/docker_version.yaml b/_data/engine-cli/docker_version.yaml new file mode 100644 index 00000000000..61451ec84d2 --- /dev/null +++ b/_data/engine-cli/docker_version.yaml @@ -0,0 +1,21 @@ +command: docker version +short: Show the Docker version information +long: "This command displays version information for both the Docker client and \ndaemon. + \n\n# EXAMPLES\n\n## Display Docker version information\n\nThe default output:\n\n + \ $ docker version\n\tClient:\n\t Version: 1.8.0\n\t API version: 1.20\n\t + Go version: go1.4.2\n\t Git commit: f5bae0a\n\t Built: Tue Jun 23 17:56:00 + UTC 2015\n\t OS/Arch: linux/amd64\n\n\tServer:\n\t Version: 1.8.0\n\t + API version: 1.20\n\t Go version: go1.4.2\n\t Git commit: f5bae0a\n\t Built: + \ Tue Jun 23 17:56:00 UTC 2015\n\t OS/Arch: linux/amd64\n\nGet server + version:\n\n $ docker version --format '{{.Server.Version}}'\n\t1.8.0\n\nDump + raw data:\n\nTo view all available fields, you can use the format `{{json .}}`.\n\n + \ $ docker version --format '{{json .}}'\n {\"Client\":{\"Version\":\"1.8.0\",\"ApiVersion\":\"1.20\",\"GitCommit\":\"f5bae0a\",\"GoVersion\":\"go1.4.2\",\"Os\":\"linux\",\"Arch\":\"amd64\",\"BuildTime\":\"Tue + Jun 23 17:56:00 UTC 2015\"},\"ServerOK\":true,\"Server\":{\"Version\":\"1.8.0\",\"ApiVersion\":\"1.20\",\"GitCommit\":\"f5bae0a\",\"GoVersion\":\"go1.4.2\",\"Os\":\"linux\",\"Arch\":\"amd64\",\"KernelVersion\":\"3.13.2-gentoo\",\"BuildTime\":\"Tue + Jun 23 17:56:00 UTC 2015\"}}\n" +usage: docker version [OPTIONS] +pname: docker +plink: docker.yaml +options: +- option: format + shorthand: f + description: Format the output using the given Go template diff --git a/_data/engine-cli/docker_volume.yaml b/_data/engine-cli/docker_volume.yaml new file mode 100644 index 00000000000..6903a13fa7e --- /dev/null +++ b/_data/engine-cli/docker_volume.yaml @@ -0,0 +1,32 @@ +command: docker volume +short: Manage volumes +long: | + The `docker volume` command has subcommands for managing data volumes. A data + volume is a specially-designated directory that by-passes storage driver + management. + + Data volumes persist data independent of a container's life cycle. When you + delete a container, the Engine daemon does not delete any data volumes. You can + share volumes across multiple containers. Moreover, you can share data volumes + with other computing resources in your system. + + To see help for a subcommand, use: + + docker volume CMD help + + For full details on using docker volume visit Docker's online documentation. +usage: docker volume COMMAND +pname: docker +plink: docker.yaml +cname: +- docker volume create +- docker volume inspect +- docker volume ls +- docker volume prune +- docker volume rm +clink: +- docker_volume_create.yaml +- docker_volume_inspect.yaml +- docker_volume_ls.yaml +- docker_volume_prune.yaml +- docker_volume_rm.yaml diff --git a/_data/engine-cli/docker_volume_create.yaml b/_data/engine-cli/docker_volume_create.yaml new file mode 100644 index 00000000000..4e813009897 --- /dev/null +++ b/_data/engine-cli/docker_volume_create.yaml @@ -0,0 +1,55 @@ +command: docker volume create +short: Create a volume +long: | + Creates a new volume that containers can consume and store data in. If a name + is not specified, Docker generates a random name. You create a volume and then + configure the container to use it, for example: + + $ docker volume create hello + hello + $ docker run -d -v hello:/world busybox ls /world + + The mount is created inside the container's `/src` directory. Docker doesn't + not support relative paths for mount points inside the container. + + Multiple containers can use the same volume in the same time period. This is + useful if two containers need access to shared data. For example, if one + container writes and the other reads the data. + + ## Driver specific options + + Some volume drivers may take options to customize the volume creation. Use the + `-o` or `--opt` flags to pass driver options: + + $ docker volume create --driver fake --opt tardis=blue --opt timey=wimey + + These options are passed directly to the volume driver. Options for different + volume drivers may do different things (or nothing at all). + + The built-in `local` driver on Windows does not support any options. + + The built-in `local` driver on Linux accepts options similar to the linux + `mount` command: + + $ docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100m,uid=1000 + + Another example: + + $ docker volume create --driver local --opt type=btrfs --opt device=/dev/sda2 +usage: docker volume create [OPTIONS] [VOLUME] +pname: docker volume +plink: docker_volume.yaml +options: +- option: driver + shorthand: d + default_value: local + description: Specify volume driver name +- option: label + default_value: '[]' + description: Set metadata for a volume +- option: name + description: Specify volume name +- option: opt + shorthand: o + default_value: map[] + description: Set driver specific options diff --git a/_data/engine-cli/docker_volume_inspect.yaml b/_data/engine-cli/docker_volume_inspect.yaml new file mode 100644 index 00000000000..4ab9a7c847f --- /dev/null +++ b/_data/engine-cli/docker_volume_inspect.yaml @@ -0,0 +1,14 @@ +command: docker volume inspect +short: Display detailed information on one or more volumes +long: | + Returns information about one or more volumes. By default, this command renders + all results in a JSON array. You can specify an alternate format to execute a + given template is executed for each result. Go's https://golang.org/pkg/text/template/ + package describes all the details of the format. +usage: docker volume inspect [OPTIONS] VOLUME [VOLUME...] +pname: docker volume +plink: docker_volume.yaml +options: +- option: format + shorthand: f + description: Format the output using the given Go template diff --git a/_data/engine-cli/docker_volume_ls.yaml b/_data/engine-cli/docker_volume_ls.yaml new file mode 100644 index 00000000000..72899aa4af1 --- /dev/null +++ b/_data/engine-cli/docker_volume_ls.yaml @@ -0,0 +1,27 @@ +command: docker volume ls +short: List volumes +long: | + Lists all the volumes Docker knows about. You can filter using the `-f` or + `--filter` flag. The filtering format is a `key=value` pair. To specify + more than one filter, pass multiple flags (for example, + `--filter "foo=bar" --filter "bif=baz"`) + + The currently supported filters are: + + * `dangling` (boolean - `true` or `false`, `1` or `0`) + * `driver` (a volume driver's name) + * `label` (`label=` or `label==`) + * `name` (a volume's name) +usage: docker volume ls [OPTIONS] +pname: docker volume +plink: docker_volume.yaml +options: +- option: filter + shorthand: f + description: Provide filter values (e.g. 'dangling=true') +- option: format + description: Pretty-print volumes using a Go template +- option: quiet + shorthand: q + default_value: "false" + description: Only display volume names diff --git a/_data/engine-cli/docker_volume_prune.yaml b/_data/engine-cli/docker_volume_prune.yaml new file mode 100644 index 00000000000..e9facac4977 --- /dev/null +++ b/_data/engine-cli/docker_volume_prune.yaml @@ -0,0 +1,11 @@ +command: docker volume prune +short: Remove all unused volumes +long: Remove all unused volumes +usage: docker volume prune [OPTIONS] +pname: docker volume +plink: docker_volume.yaml +options: +- option: force + shorthand: f + default_value: "false" + description: Do not prompt for confirmation diff --git a/_data/engine-cli/docker_volume_rm.yaml b/_data/engine-cli/docker_volume_rm.yaml new file mode 100644 index 00000000000..e316229bd4c --- /dev/null +++ b/_data/engine-cli/docker_volume_rm.yaml @@ -0,0 +1,17 @@ +command: docker volume rm +short: Remove one or more volumes +long: |2 + + Remove one or more volumes. You cannot remove a volume that is in use by a container. +usage: docker volume rm [OPTIONS] VOLUME [VOLUME...] +pname: docker volume +plink: docker_volume.yaml +options: +- option: force + shorthand: f + default_value: "false" + description: Force the removal of one or more volumes +example: |2 + + $ docker volume rm hello + hello diff --git a/_data/engine-cli/docker_wait.yaml b/_data/engine-cli/docker_wait.yaml new file mode 100644 index 00000000000..a45f9cd074a --- /dev/null +++ b/_data/engine-cli/docker_wait.yaml @@ -0,0 +1,6 @@ +command: docker wait +short: Block until one or more containers stop, then print their exit codes +long: Block until one or more containers stop, then print their exit codes +usage: docker wait CONTAINER [CONTAINER...] +pname: docker +plink: docker.yaml diff --git a/_data/.NOT_EDITED_HERE.yaml b/_data/not_edited_here.yaml similarity index 62% rename from _data/.NOT_EDITED_HERE.yaml rename to _data/not_edited_here.yaml index 65fbbfca1f0..94d55ae327d 100644 --- a/_data/.NOT_EDITED_HERE.yaml +++ b/_data/not_edited_here.yaml @@ -10,29 +10,30 @@ # Make sure directories have the trailing slash, keep the list alphabetical -- path: apidocs/ +overrides: +- path: /apidocs/ description: "Auto-generated API docs for Docker Cloud, DTR, UCP. File an issue." -- path: engine/deprecated.md +- path: /engine/deprecated.md description: Docker Engine deprecation reference - source: https://github.com/docker/docker/docs/deprecated.md + source: https://github.com/docker/docker/tree/1.12.x/docs/deprecated.md -- path: engine/extend/ +- path: /engine/extend/ description: References for Docker Engine plugin system - source: https://github.com/docker/docker/docs/extend/ + source: https://github.com/docker/docker/tree/1.12.x/docs/extend/ -- path: engine/reference/ +- path: /engine/reference/ description: Docker Engine CLI and API references - source: https://github.com/docker/docker/docs/reference/ + source: https://github.com/docker/docker/tree/1.12.x/docs/reference/ -- path: notary/reference/ +- path: /notary/reference/ description: Reference docs for Docker Notary - source: https://github.com/docker/notary/docs/reference/ + source: https://github.com/docker/notary/tree/master/docs/reference/ -- path: registry/configuration.md +- path: /registry/configuration/ description: Reference docs for configuring Docker Registry - source: https://github.com/docker/distribution/docs/configuration.md + source: https://github.com/docker/distribution/tree/release/2.5/docs/configuration.md -- path: registry/spec/ +- path: /registry/spec/ description: Docker Registry API references - source: https://github.com/docker/distribution/docs/spec/ + source: https://github.com/docker/distribution/tree/release/2.5/docs/spec/ diff --git a/_data/toc.yaml b/_data/toc.yaml index c0e31b2d26f..0a2b0651e81 100644 --- a/_data/toc.yaml +++ b/_data/toc.yaml @@ -1,6 +1,97 @@ toc: - title: Welcome to the Docs path: / +- sectiontitle: Get Docker + section: + - path: /engine/installation/ + title: Install Docker Engine + - sectiontitle: Docker for Mac + section: + - path: /docker-for-mac/ + title: Getting Started + - path: /docker-for-mac/docker-toolbox/ + title: Docker for Mac vs. Docker Toolbox + - path: /docker-for-mac/multi-arch/ + title: Leveraging Multi-CPU Architecture Support + - path: /docker-for-mac/networking/ + title: Networking + - path: /docker-for-mac/osxfs/ + title: File system sharing + - path: /docker-for-mac/troubleshoot/ + title: Logs and Troubleshooting + - path: /docker-for-mac/faqs/ + title: FAQs + - path: /docker-for-mac/examples/ + title: Example Applications + - path: /docker-for-mac/opensource/ + title: Open Source Licensing + - path: /docker-for-mac/release-notes/ + title: Release Notes + - sectiontitle: Docker for Windows + section: + - path: /docker-for-windows/ + title: Getting Started + - path: /docker-for-windows/troubleshoot/ + title: Logs and Troubleshooting + - path: /docker-for-windows/faqs/ + title: FAQs + - path: /docker-for-windows/examples/ + title: Example Applications + - path: /docker-for-windows/opensource/ + title: Open Source Licensing + - path: /docker-for-windows/release-notes/ + title: Release Notes + - sectiontitle: Docker for Linux + section: + - path: /engine/installation/linux/ubuntu/ + title: Ubuntu + - path: /engine/installation/linux/rhel/ + title: Red Hat Enterprise Linux + - path: /engine/installation/linux/centos/ + title: CentOS + - path: /engine/installation/linux/fedora/ + title: Fedora + - path: /engine/installation/linux/debian/ + title: Debian + - path: /engine/installation/linux/oracle/ + title: Oracle Linux + - path: /engine/installation/linux/suse/ + title: OpenSuSE and SuSE Linux Enterprise + - path: /engine/installation/linux/other/ + title: Other Linux distributions + - path: /engine/installation/binaries/ + title: Installation from binaries + - path: /engine/installation/linux-postinstall/ + title: Optional post-installation steps + - sectiontitle: Docker for AWS + section: + - path: /docker-for-aws/ + title: Setup & Prerequisites + - path: /docker-for-aws/iam-permissions/ + title: IAM Permissions + - path: /docker-for-aws/scaling/ + title: Scaling + - path: /docker-for-aws/upgrade/ + title: Upgrading + - path: /docker-for-aws/faqs/ + title: FAQs + - path: /docker-for-aws/opensource/ + title: Open Source Licensing + - path: /docker-for-aws/release-notes/ + title: Release Notes + - sectiontitle: Docker for Azure + section: + - path: /docker-for-azure/ + title: Setup & Prerequisites + - path: /docker-for-azure/upgrade/ + title: Upgrading + - path: /docker-for-azure/faqs/ + title: FAQs + - path: /docker-for-azure/opensource/ + title: Open Source Licensing + - path: /docker-for-azure/release-notes/ + title: Release Notes + - sectiontitle: Get started section: - path: /learn/ @@ -51,46 +142,50 @@ toc: title: Manage data in containers - path: /engine/tutorials/dockerrepos/ title: Store images on Docker Hub + +- sectiontitle: Docker ID + section: + - path: /docker-id/ + title: Docker ID accounts + - path: /docker-id/api-reference/ + title: API Reference - sectiontitle: Docker Engine section: - - sectiontitle: Install + - sectiontitle: Get Started with Docker section: - - path: /engine/installation/mac/ - title: Installation on macOS - - path: /engine/installation/windows/ - title: Installation on Windows - - sectiontitle: On Linux distributions - section: - - path: /engine/installation/linux/ubuntulinux/ - title: Installation on Ubuntu - - path: /engine/installation/linux/rhel/ - title: Installation on Red Hat Enterprise Linux - - path: /engine/installation/linux/centos/ - title: Installation on CentOS - - path: /engine/installation/linux/fedora/ - title: Installation on Fedora - - path: /engine/installation/linux/debian/ - title: Installation on Debian - - path: /engine/installation/linux/archlinux/ - title: Installation on Arch Linux - - path: /engine/installation/linux/cruxlinux/ - title: Installation on CRUX Linux - - path: /engine/installation/linux/gentoolinux/ - title: Installation on Gentoo - - path: /engine/installation/linux/oracle/ - title: Installation on Oracle Linux - - path: /engine/installation/linux/SUSE/ - title: Installation on openSUSE and SUSE Linux Enterprise - - sectiontitle: On cloud providers - section: - - path: /engine/installation/cloud/overview/ - title: Choose how to install - - path: /engine/installation/cloud/cloud-ex-aws/ - title: "Example: Manual install on cloud provider" - - path: /engine/installation/cloud/cloud-ex-machine-ocean/ - title: "Example: Use Docker Machine to provision cloud hosts" - - path: /engine/installation/binaries/ - title: Installation from binaries + - path: /engine/getstarted/ + title: Get Started with Docker + - path: /engine/getstarted/step_one/ + title: Install Docker and run hello-world + - path: /engine/getstarted/step_two/ + title: Understand images & containers + - path: /engine/getstarted/step_three/ + title: Find & run the whalesay image + - path: /engine/getstarted/step_four/ + title: Build your own image + - path: /engine/getstarted/step_five/ + title: Create a Docker Hub account & repository + - path: /engine/getstarted/step_six/ + title: Tag, push, & pull your image + - path: /engine/getstarted/last_page/ + title: Learning more + - sectiontitle: Learn by example + section: + - path: /engine/tutorials/dockerizing/ + title: Hello world in a container + - path: /engine/tutorials/usingdocker/ + title: Run a simple application + - path: /engine/tutorials/dockerimages/ + title: Build your own images + - path: /engine/tutorials/networkingcontainers/ + title: Network containers + - path: /engine/tutorials/dockervolumes/ + title: Manage data in containers + - path: /engine/tutorials/dockerrepos/ + title: Store images on Docker Hub + +- sectiontitle: Docker Engine + section: - sectiontitle: User Guide section: - path: /engine/userguide/intro/ @@ -157,6 +252,8 @@ toc: title: Configuring and running Docker - path: /engine/admin/host_integration/ title: Automatically start containers + - path: /engine/admin/resource_constraints/ + title: Limit a container's resources - path: /engine/admin/live-restore/ title: Keep containers alive during daemon downtime - path: /engine/admin/systemd/ @@ -167,10 +264,14 @@ toc: title: Run a local registry mirror - sectiontitle: Logging section: + - path: /engine/admin/logging/view_container_logs/ + title: View a container's logs - path: /engine/admin/logging/overview/ title: Configuring Logging Drivers - path: /engine/admin/logging/log_tags/ title: Log tags for logging driver + - path: engine/admin/logging/logentries/ + title: Logentries logging driver - path: /engine/admin/logging/awslogs/ title: Amazon CloudWatch Logs logging driver - path: /engine/admin/logging/etwlogs/ @@ -197,6 +298,10 @@ toc: title: Runtime metrics - path: /engine/admin/ambassador_pattern_linking/ title: Link via an ambassador container + - sectiontitle: Troubleshoot Docker Engine + section: + - path: /engine/admin/troubleshooting_volume_errors.md + title: Troubleshoot volume problems - sectiontitle: Manage a swarm section: - path: /engine/swarm/ @@ -223,6 +328,8 @@ toc: title: Apply rolling updates - path: /engine/swarm/swarm-tutorial/drain-node/ title: Drain a node + - path: /engine/swarm/ingress/ + title: Use swarm mode routing mesh - sectiontitle: How swarm mode works section: - path: /engine/swarm/how-swarm-mode-works/nodes/ @@ -237,6 +344,8 @@ toc: title: Manage nodes in a swarm - path: /engine/swarm/services/ title: Deploy services to a swarm + - path: /engine/swarm/secrets/ + title: Manage sensitive data with Docker secrets - path: /engine/swarm/networking/ title: Attach services to an overlay network - path: /engine/swarm/admin_guide/ @@ -277,7 +386,7 @@ toc: title: Managed plugin system - path: /engine/extend/plugins_authorization/ title: Access authorization plugin - - path: /engine/extend/plugins/ + - path: /engine/extend/legacy_plugins/ title: Extending Engine with plugins - path: /engine/extend/plugins_network/ title: Docker network driver plugins @@ -303,248 +412,362 @@ toc: title: Dockerizing an SSH service - path: /engine/examples/apt-cacher-ng/ title: Dockerizing an apt-cacher-ng service - - sectiontitle: Engine reference + - path: /engine/reference/builder/ + title: Dockerfile reference + - path: /engine/reference/run/ + title: Docker run reference + - path: /engine/reference/commandline/cli/ + title: Use the Docker command line + - path: /engine/reference/commandline/dockerd/ + title: Daemon CLI reference + - sectiontitle: Engine CLI reference section: - - path: /engine/reference/builder/ - title: Dockerfile reference - - path: /engine/reference/run/ - title: Docker run reference - - sectiontitle: Command line reference + - path: /engine/reference/commandline/docker/ + title: docker (base command) + - path: /engine/reference/commandline/attach/ + title: docker attach + - path: /engine/reference/commandline/build/ + title: docker build + - path: /engine/reference/commandline/commit/ + title: docker commit + - sectiontitle: docker container * section: - - path: /engine/reference/commandline/ - title: Docker commands - - path: /engine/reference/commandline/cli/ - title: Use the Docker command line - - path: /engine/reference/commandline/dockerd/ - title: dockerd - - path: /engine/reference/commandline/attach/ - title: attach - - path: /engine/reference/commandline/build/ - title: build - - path: /engine/reference/commandline/commit/ - title: commit - - path: /engine/reference/commandline/cp/ - title: cp - - path: /engine/reference/commandline/create/ - title: create - - path: /engine/reference/commandline/deploy/ - title: deploy - - path: /engine/reference/commandline/diff/ - title: diff - - path: /engine/reference/commandline/events/ - title: events - - path: /engine/reference/commandline/exec/ - title: exec - - path: /engine/reference/commandline/export/ - title: export - - path: /engine/reference/commandline/history/ - title: history - - path: /engine/reference/commandline/images/ - title: images - - path: /engine/reference/commandline/import/ - title: import - - path: /engine/reference/commandline/info/ - title: info - - path: /engine/reference/commandline/inspect/ - title: inspect - - path: /engine/reference/commandline/kill/ - title: kill - - path: /engine/reference/commandline/load/ - title: load - - path: /engine/reference/commandline/login/ - title: login - - path: /engine/reference/commandline/logout/ - title: logout - - path: /engine/reference/commandline/logs/ - title: logs + - path: /engine/reference/commandline/container/ + title: docker container + - path: /engine/reference/commandline/container_attach/ + title: docker container attach + - path: /engine/reference/commandline/container_commit/ + title: docker container commit + - path: /engine/reference/commandline/container_cp/ + title: docker container cp + - path: /engine/reference/commandline/container_create/ + title: docker container create + - path: /engine/reference/commandline/container_diff/ + title: docker container diff + - path: /engine/reference/commandline/container_exec/ + title: docker container exec + - path: /engine/reference/commandline/container_export/ + title: docker container export + - path: /engine/reference/commandline/container_inspect/ + title: docker container inspect + - path: /engine/reference/commandline/container_kill/ + title: docker container kill + - path: /engine/reference/commandline/container_logs/ + title: docker container logs + - path: /engine/reference/commandline/container_ls/ + title: docker container ls + - path: /engine/reference/commandline/container_pause/ + title: docker container pause + - path: /engine/reference/commandline/container_port/ + title: docker container port + - path: /engine/reference/commandline/container_prune/ + title: docker container prune + - path: /engine/reference/commandline/container_rename/ + title: docker container rename + - path: /engine/reference/commandline/container_restart/ + title: docker container restart + - path: /engine/reference/commandline/container_rm/ + title: docker container rm + - path: /engine/reference/commandline/container_run/ + title: docker container run + - path: /engine/reference/commandline/container_start/ + title: docker container start + - path: /engine/reference/commandline/container_stats/ + title: docker container stats + - path: /engine/reference/commandline/container_stop/ + title: docker container stop + - path: /engine/reference/commandline/container_top/ + title: docker container top + - path: /engine/reference/commandline/container_unpause/ + title: docker container unpause + - path: /engine/reference/commandline/container_update/ + title: docker container update + - path: /engine/reference/commandline/container_wait/ + title: docker container wait + - path: /engine/reference/commandline/cp/ + title: docker cp + - path: /engine/reference/commandline/create/ + title: docker create + - path: /engine/reference/commandline/deploy/ + title: docker deploy + - path: /engine/reference/commandline/diff/ + title: docker diff + - path: /engine/reference/commandline/events/ + title: docker events + - path: /engine/reference/commandline/exec/ + title: docker exec + - path: /engine/reference/commandline/export/ + title: docker export + - path: /engine/reference/commandline/history/ + title: docker history + - sectiontitle: docker image * + section: + - path: /engine/reference/commandline/image/ + title: docker image + - path: /engine/reference/commandline/image_build/ + title: docker image build + - path: /engine/reference/commandline/image_history/ + title: docker image history + - path: /engine/reference/commandline/image_import/ + title: docker image import + - path: /engine/reference/commandline/image_inspect/ + title: docker image inspect + - path: /engine/reference/commandline/image_load/ + title: docker image load + - path: /engine/reference/commandline/image_ls/ + title: docker image ls + - path: /engine/reference/commandline/image_prune/ + title: docker image prune + - path: /engine/reference/commandline/image_pull/ + title: docker image pull + - path: /engine/reference/commandline/image_push/ + title: docker image push + - path: /engine/reference/commandline/image_rm/ + title: docker image rm + - path: /engine/reference/commandline/image_save/ + title: docker image save + - path: /engine/reference/commandline/image_tag/ + title: docker image tag + - path: /engine/reference/commandline/images/ + title: docker images + - path: /engine/reference/commandline/import/ + title: docker import + - path: /engine/reference/commandline/info/ + title: docker info + - path: /engine/reference/commandline/inspect/ + title: docker inspect + - path: /engine/reference/commandline/kill/ + title: docker kill + - path: /engine/reference/commandline/load/ + title: docker load + - path: /engine/reference/commandline/login/ + title: docker login + - path: /engine/reference/commandline/logout/ + title: docker logout + - path: /engine/reference/commandline/logs/ + title: docker logs + - sectiontitle: docker network * + section: + - path: /engine/reference/commandline/network/ + title: docker network - path: /engine/reference/commandline/network_connect/ - title: network connect + title: docker network connect - path: /engine/reference/commandline/network_create/ - title: network create + title: docker network create - path: /engine/reference/commandline/network_disconnect/ - title: network disconnect + title: docker network disconnect - path: /engine/reference/commandline/network_inspect/ - title: network inspect + title: docker network inspect - path: /engine/reference/commandline/network_ls/ - title: network ls + title: docker network ls + - path: /engine/reference/commandline/network_prune/ + title: docker network prune - path: /engine/reference/commandline/network_rm/ - title: network rm + title: docker network rm + - sectiontitle: docker node * + section: + - path: /engine/reference/commandline/node/ + title: docker node - path: /engine/reference/commandline/node_demote/ - title: node demote + title: docker node demote - path: /engine/reference/commandline/node_inspect/ - title: node inspect + title: docker node inspect - path: /engine/reference/commandline/node_ls/ - title: node ls + title: docker node ls - path: /engine/reference/commandline/node_promote/ - title: node promote + title: docker node promote - path: /engine/reference/commandline/node_ps/ - title: node ps + title: docker node ps - path: /engine/reference/commandline/node_rm/ - title: node rm + title: docker node rm - path: /engine/reference/commandline/node_update/ - title: node update - - path: /engine/reference/commandline/pause/ - title: pause + title: docker node update + - path: /engine/reference/commandline/pause/ + title: docker pause + - sectiontitle: docker plugin * + section: + - path: /engine/reference/commandline/plugin/ + title: docker plugin + - path: /engine/reference/commandline/plugin_create/ + title: docker plugin disable - path: /engine/reference/commandline/plugin_disable/ - title: plugin disable + title: docker plugin disable - path: /engine/reference/commandline/plugin_enable/ - title: plugin enable + title: docker plugin enable - path: /engine/reference/commandline/plugin_inspect/ - title: plugin inspect + title: docker plugin inspect - path: /engine/reference/commandline/plugin_install/ - title: plugin install + title: docker plugin install - path: /engine/reference/commandline/plugin_ls/ - title: plugin ls + title: docker plugin ls - path: /engine/reference/commandline/plugin_rm/ - title: plugin rm - - path: /engine/reference/commandline/port/ - title: port - - path: /engine/reference/commandline/ps/ - title: ps - - path: /engine/reference/commandline/pull/ - title: pull - - path: /engine/reference/commandline/push/ - title: push - - path: /engine/reference/commandline/rename/ - title: rename - - path: /engine/reference/commandline/restart/ - title: restart - - path: /engine/reference/commandline/rm/ - title: rm - - path: /engine/reference/commandline/rmi/ - title: rmi - - path: /engine/reference/commandline/run/ - title: run - - path: /engine/reference/commandline/save/ - title: save - - path: /engine/reference/commandline/search/ - title: search + title: docker plugin rm + - path: /engine/reference/commandline/plugin_set/ + title: docker plugin set + - path: /engine/reference/commandline/port/ + title: docker port + - path: /engine/reference/commandline/ps/ + title: docker ps + - path: /engine/reference/commandline/pull/ + title: docker pull + - path: /engine/reference/commandline/push/ + title: docker push + - path: /engine/reference/commandline/rename/ + title: docker rename + - path: /engine/reference/commandline/restart/ + title: docker restart + - path: /engine/reference/commandline/rm/ + title: docker rm + - path: /engine/reference/commandline/rmi/ + title: docker rmi + - path: /engine/reference/commandline/run/ + title: docker run + - path: /engine/reference/commandline/save/ + title: docker save + - path: /engine/reference/commandline/search/ + title: docker search + - sectiontitle: docker secret * + section: + - path: /engine/reference/commandline/secret/ + title: docker secret + - path: /engine/reference/commandline/secret_create/ + title: docker secret create + - path: /engine/reference/commandline/secret_inspect/ + title: docker secret inspect + - path: /engine/reference/commandline/secret_ls/ + title: docker secret ls + - path: /engine/reference/commandline/secret_rm/ + title: docker secret rm + - sectiontitle: docker service * + section: + - path: /engine/reference/commandline/service/ + title: docker service - path: /engine/reference/commandline/service_create/ - title: service create + title: docker service create - path: /engine/reference/commandline/service_inspect/ - title: service inspect + title: docker service inspect + - path: /engine/reference/commandline/service_logs/ + title: docker service logs - path: /engine/reference/commandline/service_ls/ - title: service ls + title: docker service ls - path: /engine/reference/commandline/service_ps/ - title: service ps + title: docker service ps - path: /engine/reference/commandline/service_rm/ - title: service rm + title: docker service rm - path: /engine/reference/commandline/service_scale/ - title: service scale + title: docker service scale - path: /engine/reference/commandline/service_update/ - title: service update + title: docker service update + - sectiontitle: docker stack * + section: + - path: /engine/reference/commandline/stack/ + title: docker stack - path: /engine/reference/commandline/stack_config/ - title: stack config + title: docker stack config - path: /engine/reference/commandline/stack_deploy/ - title: stack deploy + title: docker stack deploy - path: /engine/reference/commandline/stack_rm/ - title: stack rm + title: docker stack rm - path: /engine/reference/commandline/stack_services/ - title: stack services + title: docker stack services - path: /engine/reference/commandline/stack_tasks/ - title: stack tasks - - path: /engine/reference/commandline/start/ - title: start - - path: /engine/reference/commandline/stats/ - title: stats - - path: /engine/reference/commandline/stop/ - title: stop + title: docker stack tasks + - path: /engine/reference/commandline/start/ + title: docker start + - path: /engine/reference/commandline/stats/ + title: docker stats + - path: /engine/reference/commandline/stop/ + title: docker stop + - sectiontitle: docker swarm * + setcion: + - path: /engine/reference/commandline/swarm/ + title: docker swarm - path: /engine/reference/commandline/swarm_init/ - title: swarm init + title: docker swarm init + - path: /engine/reference/commandline/swarm_join-token/ + title: docker swarm join-token - path: /engine/reference/commandline/swarm_join/ - title: swarm join - - path: /engine/reference/commandline/swarm_join_token/ - title: swarm join-token + title: docker swarm join - path: /engine/reference/commandline/swarm_leave/ - title: swarm leave + title: docker swarm leave + - path: /engine/reference/commandline/swarm_unlock-key/ + title: docker swarm unlock-key + - path: /engine/reference/commandline/swarm_unlock/ + title: docker swarm unlock - path: /engine/reference/commandline/swarm_update/ - title: swarm update - - path: /engine/reference/commandline/tag/ - title: tag - - path: /engine/reference/commandline/top/ - title: top - - path: /engine/reference/commandline/unpause/ - title: unpause - - path: /engine/reference/commandline/update/ - title: update - - path: /engine/reference/commandline/version/ - title: version + title: docker swarm update + - sectiontitle: docker system * + section: + - path: /engine/reference/commandline/system/ + title: docker system + - path: /engine/reference/commandline/system_df/ + title: docker system df + - path: /engine/reference/commandline/system_events/ + title: docker system events + - path: /engine/reference/commandline/system_info/ + title: docker system info + - path: /engine/reference/commandline/system_prune/ + title: docker system prune + - path: /engine/reference/commandline/tag/ + title: docker tag + - path: /engine/reference/commandline/top/ + title: docker top + - path: /engine/reference/commandline/unpause/ + title: docker unpause + - path: /engine/reference/commandline/update/ + title: docker update + - path: /engine/reference/commandline/version/ + title: docker version + - sectiontitle: docker volume * + section: - path: /engine/reference/commandline/volume_create/ - title: volume create + title: docker volume create - path: /engine/reference/commandline/volume_inspect/ - title: volume inspect + title: docker volume inspect - path: /engine/reference/commandline/volume_ls/ - title: volume ls + title: docker volume ls + - path: /engine/reference/commandline/volume_prune/ + title: docker volume ls - path: /engine/reference/commandline/volume_rm/ - title: volume rm - - path: /engine/reference/commandline/wait/ - title: wait - - sectiontitle: API Reference + title: docker volume rm + - path: /engine/reference/commandline/wait/ + title: docker wait + - sectiontitle: Engine API + section: + - path: /engine/api/ + title: Overview + - path: /engine/api/getting-started/ + title: Getting started + - path: /engine/api/sdks/ + title: SDKs + - path: /engine/api/v1.25/ + title: Reference + - sectiontitle: Version history section: - - path: /engine/reference/api/docker_remote_api/ - title: Remote API - - path: /engine/reference/api/docker_remote_api_v1.24/ - title: Remote API v1.24 - - path: /engine/reference/api/docker_remote_api_v1.23/ - title: Remote API v1.23 - - path: /engine/reference/api/docker_remote_api_v1.22/ - title: Remote API v1.22 - - path: /engine/reference/api/docker_remote_api_v1.21/ - title: Remote API v1.21 - - path: /engine/reference/api/docker_remote_api_v1.20/ - title: Remote API v1.20 - - path: /engine/reference/api/docker_remote_api_v1.19/ - title: Remote API v1.19 - - path: /engine/reference/api/docker_remote_api_v1.18/ - title: Remote API v1.18 - - path: /engine/reference/api/remote_api_client_libraries/ - title: Remote API client libraries - - path: /engine/reference/api/docker_io_accounts_api/ - title: docker.io accounts API - - path: /engine/migration/ - title: Migrate to Engine 1.10 - - path: /engine/breaking_changes/ - title: Breaking changes - - path: /engine/deprecated/ - title: Deprecated Engine Features - - path: /engine/faq/ - title: FAQ -- sectiontitle: Docker for Mac - section: - - path: /docker-for-mac/ - title: Getting Started - - path: /docker-for-mac/docker-toolbox/ - title: Docker for Mac vs. Docker Toolbox - - path: /docker-for-mac/multi-arch/ - title: Leveraging Multi-CPU Architecture Support - - path: /docker-for-mac/networking/ - title: Networking - - path: /docker-for-mac/osxfs/ - title: File system sharing - - path: /docker-for-mac/troubleshoot/ - title: Logs and Troubleshooting - - path: /docker-for-mac/faqs/ - title: FAQs - - path: /docker-for-mac/examples/ - title: Example Applications - - path: /docker-for-mac/opensource/ - title: Open Source Licensing - - path: /docker-for-mac/release-notes/ - title: Release Notes -- sectiontitle: Docker for Windows - section: - - path: /docker-for-windows/ - title: Getting Started - - path: /docker-for-windows/troubleshoot/ - title: Logs and Troubleshooting - - path: /docker-for-windows/faqs/ - title: FAQs - - path: /docker-for-windows/examples/ - title: Example Applications - - path: /docker-for-windows/opensource/ - title: Open Source Licensing - - path: /docker-for-windows/release-notes/ - title: Release Notes + - path: /engine/api/version-history/ + title: Overview + - path: /engine/api/v1.24/ + title: v1.24 reference + - path: /engine/api/v1.23/ + title: v1.23 reference + - path: /engine/api/v1.22/ + title: v1.22 reference + - path: /engine/api/v1.21/ + title: v1.21 reference + - path: /engine/api/v1.20/ + title: v1.20 reference + - path: /engine/api/v1.19/ + title: v1.19 reference + - path: /engine/api/v1.18/ + title: v1.18 reference + - path: /engine/migration/ + title: Migrate to Engine 1.10 + - path: /engine/breaking_changes/ + title: Breaking changes + - path: /engine/deprecated/ + title: Deprecated Engine Features + - path: /engine/faq/ + title: FAQ - sectiontitle: Docker Compose section: - path: /compose/overview/ @@ -649,8 +872,10 @@ toc: title: Prior CS Engine release notes - sectiontitle: Docker Datacenter section: - - path: /datacenter/try/ - title: Try Docker Datacenter + - path: /datacenter/install/aws/ + title: Deploy Datacenter on AWS + - path: /datacenter/install/linux/ + title: Deploy Datacenter on Linux - sectiontitle: Universal Control Plane 2.0 section: - path: /datacenter/ucp/2.0/guides/ @@ -729,6 +954,8 @@ toc: title: Run only images you trust - path: /datacenter/ucp/2.0/guides/content-trust/manage-trusted-repositories/ title: Manage trusted repositories + - path: /datacenter/ucp/2.0/guides/content-trust/continuous-integration/ + title: Use trusted images for continuous integration - sectiontitle: CLI reference section: - path: /datacenter/ucp/2.0/reference/cli/ @@ -777,6 +1004,8 @@ toc: title: Install offline - path: /datacenter/dtr/2.1/guides/install/license/ title: License your deployment + - path: /datacenter/dtr/2.1/guides/install/scale-your-deployment/ + title: Scale your deployment - path: /datacenter/dtr/2.1/guides/install/upgrade/ title: Upgrade - path: /datacenter/dtr/2.1/guides/install/uninstall/ @@ -787,6 +1016,8 @@ toc: title: Use your own certificates - path: /datacenter/dtr/2.1/guides/configure/configure-storage/ title: Storage configuration + - path: /datacenter/dtr/2.1/guides/configure/use-nfs/ + title: Use NFS - sectiontitle: Monitor and troubleshoot section: - path: /datacenter/dtr/2.1/guides/monitor-troubleshoot/ @@ -851,12 +1082,240 @@ toc: title: Release notes - path: /datacenter/dtr/2.1/guides/support/ title: Get support + - sectiontitle: Previous versions + section: + - sectiontitle: Universal Control Plane 1.0 + section: + - path: /datacenter/ucp/1.1/overview/ + title: Universal Control Plane overview + - path: /datacenter/ucp/1.1/install-sandbox/ + title: Install DDC in a sandbox for evaluation + - path: /datacenter/ucp/1.1/install-sandbox-2/ + title: Evaluate DDC in a sandbox deployment + - path: /datacenter/ucp/1.1/architecture/ + title: Architecture + - sectiontitle: Installation + section: + - path: /datacenter/ucp/1.1/installation/system-requirements/ + title: System requirements + - path: /datacenter/ucp/1.1/installation/plan-production-install/ + title: Plan a production installation + - path: /datacenter/ucp/1.1/installation/install-production/ + title: Install UCP for production + - path: /datacenter/ucp/1.1/installation/install-offline/ + title: Install offline + - path: /datacenter/ucp/1.1/installation/license/ + title: License UCP + - path: /datacenter/ucp/1.1/installation/upgrade/ + title: Upgrade UCP + - path: /datacenter/ucp/1.1/installation/uninstall/ + title: Uninstall UCP + - sectiontitle: UCP tool reference + section: + - path: /datacenter/ucp/1.1/reference/backup/ + title: backup + - path: /datacenter/ucp/1.1/reference/dump-certs/ + title: dump-certs + - path: /datacenter/ucp/1.1/reference/engine-discovery/ + title: engine-discovery + - path: /datacenter/ucp/1.1/reference/fingerprint/ + title: fingerprint + - path: /datacenter/ucp/1.1/reference/help/ + title: help + - path: /datacenter/ucp/1.1/reference/id/ + title: id + - path: /datacenter/ucp/1.1/reference/images/ + title: images + - path: /datacenter/ucp/1.1/reference/install/ + title: install + - path: /datacenter/ucp/1.1/reference/join/ + title: join + - path: /datacenter/ucp/1.1/reference/regen-certs/ + title: regen-certs.md + - path: /datacenter/ucp/1.1/reference/restart/ + title: restart + - path: /datacenter/ucp/1.1/reference/restore/ + title: restore + - path: /datacenter/ucp/1.1/reference/stop/ + title: stop + - path: /datacenter/ucp/1.1/reference/support/ + title: support + - path: /datacenter/ucp/1.1/reference/uninstall/ + title: uninstall + - path: /datacenter/ucp/1.1/reference/upgrade/ + title: upgrade + - sectiontitle: Access UCP + section: + - path: /datacenter/ucp/1.1/access-ucp/web-based-access/ + title: Web-based access + - path: /datacenter/ucp/1.1/access-ucp/cli-based-access/ + title: CLI-based access + - sectiontitle: Configuration + section: + - path: /datacenter/ucp/1.1/configuration/use-externally-signed-certs/ + title: Use externally-signed certificates + - path: /datacenter/ucp/1.1/configuration/configure-logs/ + title: Configure UCP logging + - path: /datacenter/ucp/1.1/configuration/dtr-integration/ + title: Integrate with Docker Trusted Registry + - path: /datacenter/ucp/1.1/configuration/ldap-integration/ + title: Integrate with LDAP + - path: /datacenter/ucp/1.1/configuration/multi-host-networking/ + title: Set up container networking + - sectiontitle: Monitor and troubleshoot + section: + - path: /datacenter/ucp/1.1/monitor/monitor-ucp/ + title: Monitor your cluster + - path: /datacenter/ucp/1.1/monitor/troubleshoot-ucp/ + title: Troubleshoot your cluster + - path: /datacenter/ucp/1.1/monitor/troubleshoot-configurations/ + title: Troubleshoot cluster configurations + - sectiontitle: High-availability + section: + - path: /datacenter/ucp/1.1/high-availability/set-up-high-availability/ + title: Set up high availability + - path: /datacenter/ucp/1.1/high-availability/replicate-cas/ + title: Replicate CAs for high availability + - path: /datacenter/ucp/1.1/high-availability/backups-and-disaster-recovery/ + title: Backups and disaster recovery + - sectiontitle: User management + section: + - path: /datacenter/ucp/1.1/user-management/authentication-and-authorization/ + title: Authentication and authorization + - path: /datacenter/ucp/1.1/user-management/create-and-manage-users/ + title: Create and manage users + - path: /datacenter/ucp/1.1/user-management/create-and-manage-teams/ + title: Create and manage teams + - path: /datacenter/ucp/1.1/user-management/permission-levels/ + title: Permission levels + - sectiontitle: Applications + section: + - path: /datacenter/ucp/1.1/applications/deploy-app-ui/ + title: Deploy an app from the UI + - path: /datacenter/ucp/1.1/applications/deploy-app-cli/ + title: Deploy an app from the CLI + - path: /datacenter/ucp/1.1/support/ + title: Get support + - path: /datacenter/ucp/1.1/release_notes/ + title: Release Notes + - sectiontitle: Docker Trusted Registry 2.0 + section: + - path: /datacenter/dtr/2.0/ + title: Docker Trusted Registry overview + - path: /datacenter/dtr/2.0/architecture/ + title: Architecture + - sectiontitle: Installation + section: + - path: /datacenter/dtr/2.0/install/system-requirements/ + title: System requirements + - path: /datacenter/dtr/2.0/install/ + title: Install Docker Trusted Registry + - path: /datacenter/dtr/2.0/install/install-dtr-offline/ + title: Install offline + - path: /datacenter/dtr/2.0/install/license/ + title: License DTR + - sectiontitle: Upgrade + section: + - path: /datacenter/dtr/2.0/install/upgrade/upgrade-major/ + title: Upgrade from 1.4.3 + - path: /datacenter/dtr/2.0/install/upgrade/ + title: Upgrade from 2.0.0 + - path: /datacenter/dtr/2.0/install/uninstall/ + title: Uninstall + - sectiontitle: docker/dtr image reference + section: + - path: /datacenter/dtr/2.0/reference/ + title: Overview + - path: /datacenter/dtr/2.0/reference/backup/ + title: backup + - path: /datacenter/dtr/2.0/reference/dumpcerts/ + title: dumpcerts + - path: /datacenter/dtr/2.0/reference/images/ + title: images + - path: /datacenter/dtr/2.0/reference/install/ + title: install + - path: /datacenter/dtr/2.0/reference/join/ + title: join + - path: /datacenter/dtr/2.0/reference/migrate/ + title: migrate + - path: /datacenter/dtr/2.0/reference/reconfigure/ + title: reconfigure + - path: /datacenter/dtr/2.0/reference/remove/ + title: remove + - path: /datacenter/dtr/2.0/reference/restore/ + title: restore + - path: /datacenter/dtr/2.0/reference/upgrade/ + title: upgrade + - sectiontitle: Configuration + section: + - path: /datacenter/dtr/2.0/configure/configuration/ + title: Configuration overview + - path: /datacenter/dtr/2.0/configure/config-general/ + title: Configure general settings + - path: /datacenter/dtr/2.0/configure/config-security/ + title: Security configuration + - path: /datacenter/dtr/2.0/configure/config-storage/ + title: Storage configuration + - sectiontitle: Monitor and troubleshoot + section: + - path: /datacenter/dtr/2.0/monitor-troubleshoot/ + title: Monitor DTR + - path: /datacenter/dtr/2.0/monitor-troubleshoot/troubleshoot/ + title: Troubleshoot DTR + - sectiontitle: High-availability + section: + - path: /datacenter/dtr/2.0/high-availability/ + title: Set up high availability + - path: /datacenter/dtr/2.0/high-availability/backups-and-disaster-recovery/ + title: Backups and disaster recovery + - sectiontitle: User management + section: + - path: /datacenter/dtr/2.0/user-management/ + title: Authentication and authorization + - path: /datacenter/dtr/2.0/user-management/create-and-manage-users/ + title: Create and manage users + - path: /datacenter/dtr/2.0/user-management/create-and-manage-orgs/ + title: Create and manage organizations + - path: /datacenter/dtr/2.0/user-management/create-and-manage-teams/ + title: Create and manage teams + - path: /datacenter/dtr/2.0/user-management/permission-levels/ + title: Permission levels + - sectiontitle: Repositories and images + section: + - path: /datacenter/dtr/2.0/repos-and-images/ + title: Configure your Docker Engine + - path: /datacenter/dtr/2.0/repos-and-images/pull-an-image/ + title: Pull an image + - path: /datacenter/dtr/2.0/repos-and-images/push-an-image/ + title: Push an image + - path: /datacenter/dtr/2.0/repos-and-images/delete-an-image/ + title: Delete an image + - sectiontitle: DTR APIs + section: + - path: /apidocs/overview/ + title: Overview + - path: /apidocs/v1.3.3/ + title: v1.3.3 API + - path: /apidocs/v1.4.0/ + title: v1.4.0 API + - path: /apidocs/v2.0.0/ + title: v2.0.0 API + - path: /apidocs/v2.0.1/ + title: v2.0.1 API + - sectiontitle: Release notes + section: + - path: /datacenter/dtr/2.0/release-notes/ + title: Trusted Registry release notes + - path: /datacenter/dtr/2.0/release-notes/prior-release-notes/ + title: Prior Trusted Registry release notes + - path: /datacenter/dtr/2.0/support/ + title: Get support - sectiontitle: Docker Cloud section: - - path: /docker-cloud/overview/ - title: Docker Cloud Overview + - path: /docker-cloud/ + title: About Docker Cloud - path: /docker-cloud/dockerid/ - title: Docker ID and Settings + title: Docker Cloud Settings and Docker ID - path: /docker-cloud/orgs/ title: Organizations and Teams - sectiontitle: Getting Started @@ -986,7 +1445,7 @@ toc: - path: /docker-hub/ title: Overview of Docker Hub - path: /docker-hub/accounts/ - title: Your Docker ID + title: Use Docker Hub with Docker ID - path: /docker-hub/orgs/ title: Teams & Organizations - path: /docker-hub/repos/ @@ -1383,232 +1842,4 @@ toc: title: v1.10 - path: /v1.11 title: v1.11 -- sectiontitle: Docker Datacenter archive - section: - - sectiontitle: Universal Control Plane 1.0 - section: - - path: /datacenter/ucp/1.1/overview/ - title: Universal Control Plane overview - - path: /datacenter/ucp/1.1/install-sandbox/ - title: Install DDC in a sandbox for evaluation - - path: /datacenter/ucp/1.1/install-sandbox-2/ - title: Evaluate DDC in a sandbox deployment - - path: /datacenter/ucp/1.1/architecture/ - title: Architecture - - sectiontitle: Installation - section: - - path: /datacenter/ucp/1.1/installation/system-requirements/ - title: System requirements - - path: /datacenter/ucp/1.1/installation/plan-production-install/ - title: Plan a production installation - - path: /datacenter/ucp/1.1/installation/install-production/ - title: Install UCP for production - - path: /datacenter/ucp/1.1/installation/install-offline/ - title: Install offline - - path: /datacenter/ucp/1.1/installation/license/ - title: License UCP - - path: /datacenter/ucp/1.1/installation/upgrade/ - title: Upgrade UCP - - path: /datacenter/ucp/1.1/installation/uninstall/ - title: Uninstall UCP - - sectiontitle: UCP tool reference - section: - - path: /datacenter/ucp/1.1/reference/backup/ - title: backup - - path: /datacenter/ucp/1.1/reference/dump-certs/ - title: dump-certs - - path: /datacenter/ucp/1.1/reference/engine-discovery/ - title: engine-discovery - - path: /datacenter/ucp/1.1/reference/fingerprint/ - title: fingerprint - - path: /datacenter/ucp/1.1/reference/help/ - title: help - - path: /datacenter/ucp/1.1/reference/id/ - title: id - - path: /datacenter/ucp/1.1/reference/images/ - title: images - - path: /datacenter/ucp/1.1/reference/install/ - title: install - - path: /datacenter/ucp/1.1/reference/join/ - title: join - - path: /datacenter/ucp/1.1/reference/regen-certs/ - title: regen-certs.md - - path: /datacenter/ucp/1.1/reference/restart/ - title: restart - - path: /datacenter/ucp/1.1/reference/restore/ - title: restore - - path: /datacenter/ucp/1.1/reference/stop/ - title: stop - - path: /datacenter/ucp/1.1/reference/support/ - title: support - - path: /datacenter/ucp/1.1/reference/uninstall/ - title: uninstall - - path: /datacenter/ucp/1.1/reference/upgrade/ - title: upgrade - - sectiontitle: Access UCP - section: - - path: /datacenter/ucp/1.1/access-ucp/web-based-access/ - title: Web-based access - - path: /datacenter/ucp/1.1/access-ucp/cli-based-access/ - title: CLI-based access - - sectiontitle: Configuration - section: - - path: /datacenter/ucp/1.1/configuration/use-externally-signed-certs/ - title: Use externally-signed certificates - - path: /datacenter/ucp/1.1/configuration/configure-logs/ - title: Configure UCP logging - - path: /datacenter/ucp/1.1/configuration/dtr-integration/ - title: Integrate with Docker Trusted Registry - - path: /datacenter/ucp/1.1/configuration/ldap-integration/ - title: Integrate with LDAP - - path: /datacenter/ucp/1.1/configuration/multi-host-networking/ - title: Set up container networking - - sectiontitle: Monitor and troubleshoot - section: - - path: /datacenter/ucp/1.1/monitor/monitor-ucp/ - title: Monitor your cluster - - path: /datacenter/ucp/1.1/monitor/troubleshoot-ucp/ - title: Troubleshoot your cluster - - path: /datacenter/ucp/1.1/monitor/troubleshoot-configurations/ - title: Troubleshoot cluster configurations - - sectiontitle: High-availability - section: - - path: /datacenter/ucp/1.1/high-availability/set-up-high-availability/ - title: Set up high availability - - path: /datacenter/ucp/1.1/high-availability/replicate-cas/ - title: Replicate CAs for high availability - - path: /datacenter/ucp/1.1/high-availability/backups-and-disaster-recovery/ - title: Backups and disaster recovery - - sectiontitle: User management - section: - - path: /datacenter/ucp/1.1/user-management/authentication-and-authorization/ - title: Authentication and authorization - - path: /datacenter/ucp/1.1/user-management/create-and-manage-users/ - title: Create and manage users - - path: /datacenter/ucp/1.1/user-management/create-and-manage-teams/ - title: Create and manage teams - - path: /datacenter/ucp/1.1/user-management/permission-levels/ - title: Permission levels - - sectiontitle: Applications - section: - - path: /datacenter/ucp/1.1/applications/deploy-app-ui/ - title: Deploy an app from the UI - - path: /datacenter/ucp/1.1/applications/deploy-app-cli/ - title: Deploy an app from the CLI - - path: /datacenter/ucp/1.1/support/ - title: Get support - - path: /datacenter/ucp/1.1/release_notes/ - title: Release Notes - - sectiontitle: Docker Trusted Registry 2.0 - section: - - path: /datacenter/dtr/2.0/ - title: Docker Trusted Registry overview - - path: /datacenter/dtr/2.0/architecture/ - title: Architecture - - sectiontitle: Installation - section: - - path: /datacenter/dtr/2.0/install/system-requirements/ - title: System requirements - - path: /datacenter/dtr/2.0/install/ - title: Install Docker Trusted Registry - - path: /datacenter/dtr/2.0/install/install-dtr-offline/ - title: Install offline - - path: /datacenter/dtr/2.0/install/license/ - title: License DTR - - sectiontitle: Upgrade - section: - - path: /datacenter/dtr/2.0/install/upgrade/upgrade-major/ - title: Upgrade from 1.4.3 - - path: /datacenter/dtr/2.0/install/upgrade/ - title: Upgrade from 2.0.0 - - path: /datacenter/dtr/2.0/install/uninstall/ - title: Uninstall - - sectiontitle: docker/dtr image reference - section: - - path: /datacenter/dtr/2.0/reference/ - title: Overview - - path: /datacenter/dtr/2.0/reference/backup/ - title: backup - - path: /datacenter/dtr/2.0/reference/dumpcerts/ - title: dumpcerts - - path: /datacenter/dtr/2.0/reference/images/ - title: images - - path: /datacenter/dtr/2.0/reference/install/ - title: install - - path: /datacenter/dtr/2.0/reference/join/ - title: join - - path: /datacenter/dtr/2.0/reference/migrate/ - title: migrate - - path: /datacenter/dtr/2.0/reference/reconfigure/ - title: reconfigure - - path: /datacenter/dtr/2.0/reference/remove/ - title: remove - - path: /datacenter/dtr/2.0/reference/restore/ - title: restore - - path: /datacenter/dtr/2.0/reference/upgrade/ - title: upgrade - - sectiontitle: Configuration - section: - - path: /datacenter/dtr/2.0/configure/configuration/ - title: Configuration overview - - path: /datacenter/dtr/2.0/configure/config-general/ - title: Configure general settings - - path: /datacenter/dtr/2.0/configure/config-security/ - title: Security configuration - - path: /datacenter/dtr/2.0/configure/config-storage/ - title: Storage configuration - - sectiontitle: Monitor and troubleshoot - section: - - path: /datacenter/dtr/2.0/monitor-troubleshoot/ - title: Monitor DTR - - path: /datacenter/dtr/2.0/monitor-troubleshoot/troubleshoot/ - title: Troubleshoot DTR - - sectiontitle: High-availability - section: - - path: /datacenter/dtr/2.0/high-availability/ - title: Set up high availability - - path: /datacenter/dtr/2.0/high-availability/backups-and-disaster-recovery/ - title: Backups and disaster recovery - - sectiontitle: User management - section: - - path: /datacenter/dtr/2.0/user-management/ - title: Authentication and authorization - - path: /datacenter/dtr/2.0/user-management/create-and-manage-users/ - title: Create and manage users - - path: /datacenter/dtr/2.0/user-management/create-and-manage-orgs/ - title: Create and manage organizations - - path: /datacenter/dtr/2.0/user-management/create-and-manage-teams/ - title: Create and manage teams - - path: /datacenter/dtr/2.0/user-management/permission-levels/ - title: Permission levels - - sectiontitle: Repositories and images - section: - - path: /datacenter/dtr/2.0/repos-and-images/ - title: Configure your Docker Engine - - path: /datacenter/dtr/2.0/repos-and-images/pull-an-image/ - title: Pull an image - - path: /datacenter/dtr/2.0/repos-and-images/push-an-image/ - title: Push an image - - path: /datacenter/dtr/2.0/repos-and-images/delete-an-image/ - title: Delete an image - - sectiontitle: DTR APIs - section: - - path: /apidocs/overview/ - title: Overview - - path: /apidocs/v1.3.3/ - title: v1.3.3 API - - path: /apidocs/v1.4.0/ - title: v1.4.0 API - - path: /apidocs/v2.0.0/ - title: v2.0.0 API - - path: /apidocs/v2.0.1/ - title: v2.0.1 API - - sectiontitle: Release notes - section: - - path: /datacenter/dtr/2.0/release-notes/ - title: Trusted Registry release notes - - path: /datacenter/dtr/2.0/release-notes/prior-release-notes/ - title: Prior Trusted Registry release notes - - path: /datacenter/dtr/2.0/support/ - title: Get support path: /docsarchive/ diff --git a/_includes/cli.md b/_includes/cli.md new file mode 100644 index 00000000000..4ffe339c5cc --- /dev/null +++ b/_includes/cli.md @@ -0,0 +1,69 @@ +{% capture tabChar %} {% endcapture %} +{% capture dockerBaseDesc %}The base command for the Docker CLI.{% endcapture %} +{% if page.datafolder and page.datafile %} + +## Description + +{% if page.datafile=="docker" %} +{{ dockerBaseDesc }} +{% else %} +{{ site.data[page.datafolder][page.datafile].short }} +{% endif %} + +{% if site.data[page.datafolder][page.datafile].usage %} + +## Usage + +```shell +{{ site.data[page.datafolder][page.datafile].usage | replace: tabChar,"" | strip }}{% if site.data[page.datafolder][page.datafile].cname %} COMMAND{% endif %} +``` + +{% endif %} +{% if site.data[page.datafolder][page.datafile].options %} + +## Options + +| Name, shorthand | Default | Description | +| ---- | ------- | ----------- |{% for option in site.data[page.datafolder][page.datafile].options %} +| `--{{ option.option }}{% if option.shorthand %}, -{{ option.shorthand }}{% endif %}` | {% if option.default_value and option.default_value != "[]" %}`{{ option.default_value }}`{% endif %} | {{ option.description | replace: "|","|" | strip }} | {% endfor %} + +{% endif %} + +{% if site.data[page.datafolder][page.datafile].cname %} + +## Child commands + +| Command | Description | +| ------- | ----------- |{% for command in site.data[page.datafolder][page.datafile].cname %}{% capture dataFileName %}{{ command | strip | replace: " ","_" }}{% endcapture %} +| [{{ command }}]({{ dataFileName | replace: "docker_","" }}/) | {{ site.data[page.datafolder][dataFileName].short }} |{% endfor %} + +{% endif %} + +{% if site.data[page.datafolder][page.datafile].pname and site.data[page.datafolder][page.datafile].pname != page.datafile %} + +## Parent command + +{% capture parentfile %}{{ site.data[page.datafolder][page.datafile].plink | replace: ".yaml", "" | replace: "docker_","" }}{% endcapture %} +{% capture parentdatafile %}{{ site.data[page.datafolder][page.datafile].plink | replace: ".yaml", "" }}{% endcapture %} + +{% if site.data[page.datafolder][page.datafile].pname == "docker" %} +{% capture parentDesc %}{{ dockerBaseDesc }}{% endcapture %} +{% else %} +{% capture parentDesc %}{{ site.data[page.datafolder][parentdatafile].short }}{% endcapture %} +{% endif %} + +| Command | Description | +| ------- | ----------- | +| [{{ site.data[page.datafolder][page.datafile].pname }}]({{ parentfile }}) | {{ parentDesc }}| + +{% endif %} + +{% if site.data[page.datafolder][page.datafile].long != site.data[page.datafolder][page.datafile].short %} + +## Extended description + +{{ site.data[page.datafolder][page.datafile].long }} + +{% endif %} + +{% endif %} diff --git a/_includes/components/ddc_url_list.html b/_includes/components/ddc_url_list.html new file mode 100644 index 00000000000..1cf4890e535 --- /dev/null +++ b/_includes/components/ddc_url_list.html @@ -0,0 +1,18 @@ + +{% for data in site.data.ddc_offline_files %} + {% if data.ucp-version == page.ucp_version %} +
+
+
+ {% for tar-file in data.tar-files %} + + {{ tar-file.description }} + + + {% endfor %} +
+
+
+ {% endif %} +{% endfor %} + diff --git a/_includes/content/typical_docker_workflow.md b/_includes/content/typical_docker_workflow.md index e9ea7cc50f1..673adf7387c 100644 --- a/_includes/content/typical_docker_workflow.md +++ b/_includes/content/typical_docker_workflow.md @@ -11,10 +11,10 @@ - Build, then run your containers on a virtual host via [Docker Machine](machine/overview.md) as you develop. 2. Configure [networking](engine/tutorials/networkingcontainers.md) and [storage](engine/tutorials/dockervolumes.md) for your solution, if needed. -3. Upload builds to a registry ([ours](engine/tutorials/dockerrepos.md), [yours](docker-trusted-registry/index.md), or your cloud provider's), to collaborate with your team. +3. Upload builds to a registry ([ours](engine/tutorials/dockerrepos.md), [yours](/datacenter/dtr/2.0/index.md), or your cloud provider's), to collaborate with your team. 4. If you're gonna need to scale your solution across multiple hosts (VMs or physical machines), [plan for how you'll set up your Swarm cluster](engine/swarm/key-concepts.md) and [scale it to meet demand](engine/swarm/swarm-tutorial/index.md). - - Note: Use [Universal Control Plane](ucp/overview.md) and you can manage your + - Note: Use [Universal Control Plane](/datacenter/ucp/1.1/overview.md) and you can manage your Swarm cluster using a friendly UI! 5. Finally, deploy to your preferred - cloud provider (or, for redundancy, *multiple* cloud providers) with [Docker Cloud](docker-cloud/overview.md). Or, use [Docker Datacenter](https://www.docker.com/products/docker-datacenter), and deploy to your own on-premise hardware. + cloud provider (or, for redundancy, *multiple* cloud providers) with [Docker Cloud](/docker-cloud/index.md). Or, use [Docker Datacenter](https://www.docker.com/products/docker-datacenter), and deploy to your own on-premise hardware. diff --git a/_includes/read_time.html b/_includes/read_time.html new file mode 100644 index 00000000000..9a7565e233f --- /dev/null +++ b/_includes/read_time.html @@ -0,0 +1,9 @@ + + Estimated reading time: + {% assign words = content | number_of_words %} + {% if words < 360 %} + 1 minute + {% else %} + {{ words | divided_by:180 }} minutes + {% endif %} + diff --git a/_includes/tree.html b/_includes/tree.html index 6adacc83f8b..60b587ec311 100644 --- a/_includes/tree.html +++ b/_includes/tree.html @@ -1,4 +1,4 @@ -{% for item in tree %}{% if item.heading %}{% else %}{% if item.sectiontitle %} +

Namespaced endpoints in the docker-cloud CLI

+ +

If you are using namespaces with the docker-cloud CLI, set them by changing +the value of the DOCKERCLOUD_NAMESPACE environment variable. You can either +set this globally, or specify it before each CLI command. To learn more, see the +Docker Cloud CLI README.

+

Stream API

import websocket
 import base64
@@ -163,7 +176,7 @@ 

API roles

The CLI and the SDKs will detect this environment variable and automatically use it

-

If you give an API role to a container, the environment variable DOCKERCLOUD_AUTH inside the container will have the contents of the Authorization header that you can use to authenticate against the REST or Stream APIs:

+

If you give an API role to a container, the environment variable DOCKERCLOUD_AUTH inside the container will have the contents of the Authorization header that you can use to authenticate against the REST or Stream APIs:

curl -H "Authorization: $DOCKERCLOUD_AUTH" https://cloud.docker.com/api/app/v1/service/

@@ -1374,7 +1387,7 @@

Attributes

tags -List of tags to identify the node cluster nodes when deploying services (see Tags for more information) +List of tags to identify the node cluster nodes when deploying services (see Tags for more information) provider_options @@ -1583,7 +1596,7 @@

JSON Parameters

tags -(optional) List of tags of the node cluster to be used when deploying services see Tags for more information) (default: []) +(optional) List of tags of the node cluster to be used when deploying services see Tags for more information) (default: []) provider_options @@ -1941,7 +1954,7 @@

Attributes

tags -List of tags to identify the node when deploying services (see Tags for more information) +List of tags to identify the node when deploying services (see Tags for more information) nickname @@ -1983,28 +1996,6 @@

Node states

-

Node Last Metric attributes

- - - - - - - - - - - - - - - - - - - -
AttributeDescription
cpuCPU percentage usage
memoryMemory usage in bytes
diskDisk storage usage in bytes
-

List all nodes

import dockercloud
 
@@ -2217,7 +2208,7 @@ 

Upgrade Docker Daemon

docker-cloud node upgrade 7eaf7fff
 
-

Upgrades the docker daemon of the node. This will restart your containers on that node. See Docker upgrade for more information.

+

Upgrades the docker daemon of the node. This will restart your containers on that node. See Docker upgrade for more information.

Endpoint Type

@@ -2975,7 +2966,7 @@

Create a new stack

docker-cloud stack create --name hello-world -f docker-compose.yml
 
-

Creates a new stack without starting it. Note that the JSON syntax is abstracted by both, the Docker Cloud CLI and our UI, in order to use Stack YAML files.

+

Creates a new stack without starting it. Note that the JSON syntax is abstracted by both, the Docker Cloud CLI and our UI, in order to use Stack YAML files.

Endpoint Type

@@ -3033,7 +3024,7 @@

Export an existing stack

docker-cloud stack export 46aca402
 
-

Get a JSON representation of the stack following the Stack YAML representation.

+

Get a JSON representation of the stack following the Stack YAML representation.

Endpoint Type

@@ -3616,11 +3607,11 @@

Attributes

net -Network mode to set on the containers (see table Network Modes below, more information ../../docker-cloud/apps/service-links/) +Network mode to set on the containers (see table Network Modes below, more information /docker-cloud/apps/service-links/) pid -Set the PID (Process) Namespace mode for the containers (more information ../../reference/run/#pid-settings-pid) +Set the PID (Process) Namespace mode for the containers (more information) synchronized @@ -3748,11 +3739,11 @@

Attributes

sequential_deployment -Whether the containers for this service should be deployed in sequence, linking each of them to the previous containers (see Service scaling for more information) +Whether the containers for this service should be deployed in sequence, linking each of them to the previous containers (see Service scaling for more information) cpu_shares -The relative CPU priority of the containers of the service (see Runtime Constraints on CPU and Memory for more information) +The relative CPU priority of the containers of the service (see Runtime Constraints on CPU and Memory for more information) cpuset @@ -3760,7 +3751,7 @@

Attributes

memory -The memory limit of the containers of the service in MB (see Runtime Constraints on CPU and Memory for more information) +The memory limit of the containers of the service in MB (see Runtime Constraints on CPU and Memory for more information) memory_swap @@ -3780,15 +3771,15 @@

Attributes

autorestart -Whether to restart the containers of the service automatically if they stop (see Crash recovery for more information) +Whether to restart the containers of the service automatically if they stop (see Crash recovery for more information) autodestroy -Whether to terminate the containers of the service automatically if they stop (see Autodestroy for more information) +Whether to terminate the containers of the service automatically if they stop (see Autodestroy for more information) roles -List of Docker Cloud roles assigned to this service (see Service links for more information) +List of Docker Cloud roles assigned to this service (see Service links for more information) link_variables @@ -3796,7 +3787,7 @@

Attributes

privileged -Whether to start the containers with Docker’s privileged flag set or not, which allows containers to access all devices on the host among other things (see Runtime privilege for more information) +Whether to start the containers with Docker’s privileged flag set or not, which allows containers to access all devices on the host among other things (see Runtime privilege for more information) read_only @@ -3804,15 +3795,15 @@

Attributes

deployment_strategy -Container distribution among nodes (see table Deployment strategies below and Deployment strategies for more information) +Container distribution among nodes (see table Deployment strategies below and Deployment strategies for more information) tags -List of tags to be used to deploy the service (see Tags for more information) +List of tags to be used to deploy the service (see Tags for more information) autoredeploy -Whether to redeploy the containers of the service when its image is updated in Docker Cloud registry (see Docker Cloud’s private registry for more information) +Whether to redeploy the containers of the service when its image is updated in Docker Cloud registry (see Docker Cloud’s private registry for more information) nickname @@ -4152,35 +4143,35 @@

JSON Parameters

autorestart -(optional) Whether the containers for this service should be restarted if they stop, i.e. ALWAYS (default: OFF, possible values: OFF, ON_FAILURE, ALWAYS) (see Crash recovery for more information) +(optional) Whether the containers for this service should be restarted if they stop, i.e. ALWAYS (default: OFF, possible values: OFF, ON_FAILURE, ALWAYS) (see Crash recovery for more information) autodestroy -(optional) Whether the containers should be terminated if they stop, i.e. OFF (default: OFF, possible values: OFF, ON_SUCCESS, ALWAYS) (see Autodestroy for more information) +(optional) Whether the containers should be terminated if they stop, i.e. OFF (default: OFF, possible values: OFF, ON_SUCCESS, ALWAYS) (see Autodestroy for more information) sequential_deployment -(optional) Whether the containers should be launched and scaled in sequence, i.e. true (default: false) (see Service scaling for more information) +(optional) Whether the containers should be launched and scaled in sequence, i.e. true (default: false) (see Service scaling for more information) roles -(optional) A list of Docker Cloud API roles to grant the service, i.e. ["global"] (default: [], possible values: global) (see Service links for more information) +(optional) A list of Docker Cloud API roles to grant the service, i.e. ["global"] (default: [], possible values: global) (see Service links for more information) privileged -(optional) Whether to start the containers with Docker’s privileged flag set or not, i.e. false (default: false) (see Runtime privilege for more information) +(optional) Whether to start the containers with Docker’s privileged flag set or not, i.e. false (default: false) (see Runtime privilege for more information) deployment_strategy -(optional) Container distribution among nodes (default: EMPTIEST_NODE, see table Deployment strategies above and Deployment strategies for more information) +(optional) Container distribution among nodes (default: EMPTIEST_NODE, see table Deployment strategies above and Deployment strategies for more information) tags -(optional) A list of tags to be used to deploy the service (see Tags for more information) (default: []) +(optional) A list of tags to be used to deploy the service (see Tags for more information) (default: []) autoredeploy -(optional) Whether to redeploy the containers of the service when its image is updated in Docker Cloud registry (default: false) (see Docker Cloud’s private registry for more information) +(optional) Whether to redeploy the containers of the service when its image is updated in Docker Cloud registry (default: false) (see Docker Cloud’s private registry for more information) net @@ -4496,11 +4487,11 @@

JSON Parameters

autorestart -(optional) Whether the containers for this service should be restarted if they stop, i.e. ALWAYS (possible values: OFF, ON_FAILURE, ALWAYS) (see Crash recovery for more information) +(optional) Whether the containers for this service should be restarted if they stop, i.e. ALWAYS (possible values: OFF, ON_FAILURE, ALWAYS) (see Crash recovery for more information) autodestroy -(optional) Whether the containers should be terminated if they stop, i.e. OFF (possible values: OFF, ON_SUCCESS, ALWAYS) (see Autodestroy for more information) +(optional) Whether the containers should be terminated if they stop, i.e. OFF (possible values: OFF, ON_SUCCESS, ALWAYS) (see Autodestroy for more information) container_envvars @@ -4512,7 +4503,7 @@

JSON Parameters

cpu_shares -(optional) The relative CPU priority of the containers the service describes (see Runtime Constraints on CPU and Memory for more information) +(optional) The relative CPU priority of the containers the service describes (see Runtime Constraints on CPU and Memory for more information) entrypoint @@ -4528,15 +4519,15 @@

JSON Parameters

memory -(optional) The memory limit of the containers of the service in MB (see Runtime Constraints on CPU and Memory for more information) +(optional) The memory limit of the containers of the service in MB (see Runtime Constraints on CPU and Memory for more information) privileged -(optional) Whether to start the containers with Docker’s privileged flag set or not, i.e. false (see Runtime privilege for more information) +(optional) Whether to start the containers with Docker’s privileged flag set or not, i.e. false (see Runtime privilege for more information) roles -(optional) A list of Docker Cloud API roles to grant the service, i.e. ["global"] (possible values: global) (see Service links for more information) +(optional) A list of Docker Cloud API roles to grant the service, i.e. ["global"] (possible values: global) (see Service links for more information) run_command @@ -4544,7 +4535,7 @@

JSON Parameters

sequential_deployment -(optional) Whether the containers should be launched and scaled in sequence, i.e. true (see Service scaling for more information) +(optional) Whether the containers should be launched and scaled in sequence, i.e. true (see Service scaling for more information) tags @@ -4556,11 +4547,11 @@

JSON Parameters

deployment_strategy -(optional) Container distribution among nodes. A service cannot be updated to or from a deployment strategy of EVERY_NODE. (See table Deployment strategies above and Deployment strategies for more information) +(optional) Container distribution among nodes. A service cannot be updated to or from a deployment strategy of EVERY_NODE. (See table Deployment strategies above and Deployment strategies for more information) autoredeploy -Whether to redeploy the containers of the service when its image is updated in Docker Cloud registry (see Docker Cloud’s private registry for more information) +Whether to redeploy the containers of the service when its image is updated in Docker Cloud registry (see Docker Cloud’s private registry for more information) net @@ -5248,7 +5239,7 @@

Attributes

cpu_shares -The relative CPU priority of the container (see Runtime Constraints on CPU and Memory for more information) +The relative CPU priority of the container (see Runtime Constraints on CPU and Memory for more information) cpuset @@ -5256,7 +5247,7 @@

Attributes

memory -The memory limit of the container in MB (see Runtime Constraints on CPU and Memory for more information) +The memory limit of the container in MB (see Runtime Constraints on CPU and Memory for more information) memory_swap @@ -5264,19 +5255,19 @@

Attributes

autorestart -Whether to restart the container automatically if it stops (see Crash recovery for more information) +Whether to restart the container automatically if it stops (see Crash recovery for more information) autodestroy -Whether to terminate the container automatically if it stops (see Autodestroy for more information) +Whether to terminate the container automatically if it stops (see Autodestroy for more information) roles -List of Docker Cloud roles asigned to this container (see API roles for more information)) +List of Docker Cloud roles asigned to this container (see API roles for more information)) linked_to_container -List of IP addresses of the linked containers (see table Container Link attributes below and Service links for more information) +List of IP addresses of the linked containers (see table Container Link attributes below and Service links for more information) link_variables @@ -5284,7 +5275,7 @@

Attributes

privileged -Whether the container has Docker’s privileged flag set or not (see Runtime privilege for more information) +Whether the container has Docker’s privileged flag set or not (see Runtime privilege for more information) read_only @@ -5296,11 +5287,11 @@

Attributes

net -Network mode set on the container (see table Network Modes below, more information ../../reference/run/#network-settings) +Network mode set on the container (see table Network Modes below, more information) pid -PID (Process) Namespace mode for the container (more information ../../reference/run/#pid-settings-pid) +PID (Process) Namespace mode for the container (more information) @@ -5438,28 +5429,6 @@

Network Modes

-

Container Last Metric attributes

- - - - - - - - - - - - - - - - - - - -
AttributeDescription
cpuCPU percentage usage
memoryMemory usage in bytes
diskDisk storage usage in bytes
- @@ -5985,7 +5954,7 @@

Service triggers

} -

Triggers are URLs that will start a redeploy of the service whenever a POST request is sent to them. They require no authorization headers, so they should be treated as access tokens. Triggers can be revoked if they are leaked or no longer used for security purposes. See Triggers for more information.

+

Triggers are URLs that will start a redeploy of the service whenever a POST request is sent to them. They require no authorization headers, so they should be treated as access tokens. Triggers can be revoked if they are leaked or no longer used for security purposes. See Triggers for more information.

This is a namespaced endpoint.

@@ -6465,17 +6434,23 @@

Listen to new Docker Cloud Events

import "github.com/docker/go-dockercloud/dockercloud"
 
-c := make(chan dockercloud.Event)
-e := make(chan error)
+// Listens for container events only
+myFilter := dockercloud.NewStreamFilter(&dockercloud.EventFilter{Type: "container"})
 
-go dockercloud.Events(c, e)
+stream := dockercloud.NewStream(myFilter)
+
+if err := stream.Connect(); err == nil {
+    go stream.RunForever()
+} else {
+    log.Print("Connect err: " + err.Error())
+}
 
 for {
     select {
-        case event := <-c:
-            log.Println(event)
-        case err := <-e:
-            log.Println(err)
+    case event := <-stream.MessageChan:
+        log.Println(event)
+    case err := <-stream.ErrorChan:
+        log.Println(err)
     }
 }
 
@@ -6498,6 +6473,28 @@

HTTP Request

GET /api/audit/v1/[optional_namespace/]events/

+

Query Parameters

+ +
+ + + + + + + + + + + + + + + + + +
ParameterDescription
typeFilter by type
objectFilter by object resource URI
parentFilter by object parents
+

Errors

@@ -6576,20 +6573,5 @@

Errors

-
- - - - -
diff --git a/apidocs/docker-cloud/javascripts/all.js b/apidocs/docker-cloud/javascripts/all.js index a0773c13f01..a7bf81a3957 100644 --- a/apidocs/docker-cloud/javascripts/all.js +++ b/apidocs/docker-cloud/javascripts/all.js @@ -1,4 +1,4 @@ -!function(){if("ontouchstart"in window){var e,t,n,i,o,r,s={};e=function(e,t){return Math.abs(e[0]-t[0])>5||Math.abs(e[1]-t[1])>5},t=function(e){this.startXY=[e.touches[0].clientX,e.touches[0].clientY],this.threshold=!1},n=function(t){return this.threshold?!1:void(this.threshold=e(this.startXY,[t.touches[0].clientX,t.touches[0].clientY]))},i=function(t){if(!this.threshold&&!e(this.startXY,[t.changedTouches[0].clientX,t.changedTouches[0].clientY])){var n=t.changedTouches[0],i=document.createEvent("MouseEvents");i.initMouseEvent("click",!0,!0,window,0,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),i.simulated=!0,t.target.dispatchEvent(i)}},o=function(e){var t=Date.now(),n=t-s.time,i=e.clientX,o=e.clientY,a=[Math.abs(s.x-i),Math.abs(s.y-o)],c=r(e.target,"A")||e.target,h=c.nodeName,l="A"===h,u=window.navigator.standalone&&l&&e.target.getAttribute("href");return s.time=t,s.x=i,s.y=o,(!e.simulated&&(500>n||1500>n&&a[0]<50&&a[1]<50)||u)&&(e.preventDefault(),e.stopPropagation(),!u)?!1:(u&&(window.location=c.getAttribute("href")),void(c&&c.classList&&(c.classList.add("energize-focus"),window.setTimeout(function(){c.classList.remove("energize-focus")},150))))},r=function(e,t){for(var n=e;n!==document.body;){if(!n||n.nodeName===t)return n;n=n.parentNode}return null},document.addEventListener("touchstart",t,!1),document.addEventListener("touchmove",n,!1),document.addEventListener("touchend",i,!1),document.addEventListener("click",o,!0)}}(),/* +!function(){if("ontouchstart"in window){var e,t,n,i,o,s,r={};e=function(e,t){return Math.abs(e[0]-t[0])>5||Math.abs(e[1]-t[1])>5},t=function(e){this.startXY=[e.touches[0].clientX,e.touches[0].clientY],this.threshold=!1},n=function(t){return this.threshold?!1:void(this.threshold=e(this.startXY,[t.touches[0].clientX,t.touches[0].clientY]))},i=function(t){if(!this.threshold&&!e(this.startXY,[t.changedTouches[0].clientX,t.changedTouches[0].clientY])){var n=t.changedTouches[0],i=document.createEvent("MouseEvents");i.initMouseEvent("click",!0,!0,window,0,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),i.simulated=!0,t.target.dispatchEvent(i)}},o=function(e){var t=Date.now(),n=t-r.time,i=e.clientX,o=e.clientY,a=[Math.abs(r.x-i),Math.abs(r.y-o)],c=s(e.target,"A")||e.target,h=c.nodeName,l="A"===h,u=window.navigator.standalone&&l&&e.target.getAttribute("href");return r.time=t,r.x=i,r.y=o,(!e.simulated&&(500>n||1500>n&&a[0]<50&&a[1]<50)||u)&&(e.preventDefault(),e.stopPropagation(),!u)?!1:(u&&(window.location=c.getAttribute("href")),void(c&&c.classList&&(c.classList.add("energize-focus"),window.setTimeout(function(){c.classList.remove("energize-focus")},150))))},s=function(e,t){for(var n=e;n!==document.body;){if(!n||n.nodeName===t)return n;n=n.parentNode}return null},document.addEventListener("touchstart",t,!1),document.addEventListener("touchmove",n,!1),document.addEventListener("touchend",i,!1),document.addEventListener("click",o,!0)}}(),/* Copyright 2008-2013 Concur Technologies, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -13,7 +13,7 @@ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -function(e){"use strict";function t(t){if(t&&""!==t){$(".lang-selector a").removeClass("active"),$(".lang-selector a[data-language-name='"+t+"']").addClass("active");for(var n=0;n=1){var e=n(location.search).language;if(e)return e;if(-1!=jQuery.inArray(location.search.substr(1),c))return location.search.substr(1)}return!1}function r(e){var t=n(location.search);return t.language?(t.language=e,i(t)):e}function s(e){if(history){var t=window.location.hash;t&&(t=t.replace(/^#+/,"")),history.pushState({},"","?"+r(e)+"#"+t),localStorage.setItem("language",e)}}function a(e){var n=localStorage.getItem("language");c=e;var i=o();i?(t(i),localStorage.setItem("language",i)):t(null!==n&&-1!=jQuery.inArray(n,c)?n:c[0])}var c=[];e.setupLanguages=a,e.activateLanguage=t,$(function(){$(".lang-selector a").on("click",function(){var e=$(this).data("language-name");return s(e),t(e),!1}),window.onpopstate=function(){t(o())}})}(window),/** +function(e){"use strict";function t(t){if(t&&""!==t){$(".lang-selector a").removeClass("active"),$(".lang-selector a[data-language-name='"+t+"']").addClass("active");for(var n=0;n=1){var e=n(location.search).language;if(e)return e;if(-1!=jQuery.inArray(location.search.substr(1),c))return location.search.substr(1)}return!1}function s(e){var t=n(location.search);return t.language?(t.language=e,i(t)):e}function r(e){if(history){var t=window.location.hash;t&&(t=t.replace(/^#+/,"")),history.pushState({},"","?"+s(e)+"#"+t),localStorage.setItem("language",e)}}function a(e){var n=localStorage.getItem("language");c=e;var i=o();i?(t(i),localStorage.setItem("language",i)):t(null!==n&&-1!=jQuery.inArray(n,c)?n:c[0])}var c=[];e.setupLanguages=a,e.activateLanguage=t,$(function(){$(".lang-selector a").on("click",function(){var e=$(this).data("language-name");return r(e),t(e),!1}),window.onpopstate=function(){t(o())}})}(window),/** * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.5.7 * Copyright (C) 2014 Oliver Nightingale * MIT Licensed @@ -35,19 +35,19 @@ e.tokenizer=function(e){if(!arguments.length||null==e||void 0==e)return[];if(Arr * lunr.Pipeline * Copyright (C) 2014 Oliver Nightingale */ -e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions={},e.Pipeline.registerFunction=function(t,n){n in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+n),t.label=n,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var n=t.label&&t.label in this.registeredFunctions;n||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var n=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load un-registered function: "+t);n.add(i)}),n},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,n){e.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(t)+1;this._stack.splice(i,0,n)},e.Pipeline.prototype.before=function(t,n){e.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(t);this._stack.splice(i,0,n)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._stack.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._stack[s](r,o,e),void 0!==r);s++);void 0!==r&&t.push(r)}return t},e.Pipeline.prototype.reset=function(){this._stack=[]},e.Pipeline.prototype.toJSON=function(){return this._stack.map(function(t){return e.Pipeline.warnIfFunctionNotRegistered(t),t.label})},/*! +e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions={},e.Pipeline.registerFunction=function(t,n){n in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+n),t.label=n,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var n=t.label&&t.label in this.registeredFunctions;n||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var n=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load un-registered function: "+t);n.add(i)}),n},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,n){e.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(t)+1;this._stack.splice(i,0,n)},e.Pipeline.prototype.before=function(t,n){e.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(t);this._stack.splice(i,0,n)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._stack.length,o=0;n>o;o++){for(var s=e[o],r=0;i>r&&(s=this._stack[r](s,o,e),void 0!==s);r++);void 0!==s&&t.push(s)}return t},e.Pipeline.prototype.reset=function(){this._stack=[]},e.Pipeline.prototype.toJSON=function(){return this._stack.map(function(t){return e.Pipeline.warnIfFunctionNotRegistered(t),t.label})},/*! * lunr.Vector * Copyright (C) 2014 Oliver Nightingale */ -e.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},e.Vector.Node=function(e,t,n){this.idx=e,this.val=t,this.next=n},e.Vector.prototype.insert=function(t,n){var i=this.list;if(!i)return this.list=new e.Vector.Node(t,n,i),this.length++;for(var o=i,r=i.next;void 0!=r;){if(tn.idx?n=n.next:(i+=t.val*n.val,t=t.next,n=n.next);return i},e.Vector.prototype.similarity=function(e){return this.dot(e)/(this.magnitude()*e.magnitude())},/*! +e.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},e.Vector.Node=function(e,t,n){this.idx=e,this.val=t,this.next=n},e.Vector.prototype.insert=function(t,n){var i=this.list;if(!i)return this.list=new e.Vector.Node(t,n,i),this.length++;for(var o=i,s=i.next;void 0!=s;){if(tn.idx?n=n.next:(i+=t.val*n.val,t=t.next,n=n.next);return i},e.Vector.prototype.similarity=function(e){return this.dot(e)/(this.magnitude()*e.magnitude())},/*! * lunr.SortedSet * Copyright (C) 2014 Oliver Nightingale */ -e.SortedSet=function(){this.length=0,this.elements=[]},e.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},e.SortedSet.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(e){~this.indexOf(e)||this.elements.splice(this.locationFor(e),0,e)},this),this.length=this.elements.length},e.SortedSet.prototype.toArray=function(){return this.elements.slice()},e.SortedSet.prototype.map=function(e,t){return this.elements.map(e,t)},e.SortedSet.prototype.forEach=function(e,t){return this.elements.forEach(e,t)},e.SortedSet.prototype.indexOf=function(e,t,n){var t=t||0,n=n||this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return 1>=i?r===e?o:-1:e>r?this.indexOf(e,o,n):r>e?this.indexOf(e,t,o):r===e?o:void 0},e.SortedSet.prototype.locationFor=function(e,t,n){var t=t||0,n=n||this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];if(1>=i){if(r>e)return o;if(e>r)return o+1}return e>r?this.locationFor(e,o,n):r>e?this.locationFor(e,t,o):void 0},e.SortedSet.prototype.intersect=function(t){for(var n=new e.SortedSet,i=0,o=0,r=this.length,s=t.length,a=this.elements,c=t.elements;;){if(i>r-1||o>s-1)break;a[i]!==c[o]?a[i]c[o]&&o++:(n.add(a[i]),i++,o++)}return n},e.SortedSet.prototype.clone=function(){var t=new e.SortedSet;return t.elements=this.toArray(),t.length=t.elements.length,t},e.SortedSet.prototype.union=function(e){var t,n,i;return this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone(),i.add.apply(i,n.toArray()),i},e.SortedSet.prototype.toJSON=function(){return this.toArray()},/*! +e.SortedSet=function(){this.length=0,this.elements=[]},e.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},e.SortedSet.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(e){~this.indexOf(e)||this.elements.splice(this.locationFor(e),0,e)},this),this.length=this.elements.length},e.SortedSet.prototype.toArray=function(){return this.elements.slice()},e.SortedSet.prototype.map=function(e,t){return this.elements.map(e,t)},e.SortedSet.prototype.forEach=function(e,t){return this.elements.forEach(e,t)},e.SortedSet.prototype.indexOf=function(e,t,n){var t=t||0,n=n||this.elements.length,i=n-t,o=t+Math.floor(i/2),s=this.elements[o];return 1>=i?s===e?o:-1:e>s?this.indexOf(e,o,n):s>e?this.indexOf(e,t,o):s===e?o:void 0},e.SortedSet.prototype.locationFor=function(e,t,n){var t=t||0,n=n||this.elements.length,i=n-t,o=t+Math.floor(i/2),s=this.elements[o];if(1>=i){if(s>e)return o;if(e>s)return o+1}return e>s?this.locationFor(e,o,n):s>e?this.locationFor(e,t,o):void 0},e.SortedSet.prototype.intersect=function(t){for(var n=new e.SortedSet,i=0,o=0,s=this.length,r=t.length,a=this.elements,c=t.elements;;){if(i>s-1||o>r-1)break;a[i]!==c[o]?a[i]c[o]&&o++:(n.add(a[i]),i++,o++)}return n},e.SortedSet.prototype.clone=function(){var t=new e.SortedSet;return t.elements=this.toArray(),t.length=t.elements.length,t},e.SortedSet.prototype.union=function(e){var t,n,i;return this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone(),i.add.apply(i,n.toArray()),i},e.SortedSet.prototype.toJSON=function(){return this.toArray()},/*! * lunr.Index * Copyright (C) 2014 Oliver Nightingale */ -e.Index=function(){this._fields=[],this._ref="id",this.pipeline=new e.Pipeline,this.documentStore=new e.Store,this.tokenStore=new e.TokenStore,this.corpusTokens=new e.SortedSet,this.eventEmitter=new e.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},e.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},e.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},e.Index.load=function(t){t.version!==e.version&&e.utils.warn("version mismatch: current "+e.version+" importing "+t.version);var n=new this;return n._fields=t.fields,n._ref=t.ref,n.documentStore=e.Store.load(t.documentStore),n.tokenStore=e.TokenStore.load(t.tokenStore),n.corpusTokens=e.SortedSet.load(t.corpusTokens),n.pipeline=e.Pipeline.load(t.pipeline),n},e.Index.prototype.field=function(e,t){var t=t||{},n={name:e,boost:t.boost||1};return this._fields.push(n),this},e.Index.prototype.ref=function(e){return this._ref=e,this},e.Index.prototype.add=function(t,n){var i={},o=new e.SortedSet,r=t[this._ref],n=void 0===n?!0:n;this._fields.forEach(function(n){var r=this.pipeline.run(e.tokenizer(t[n.name]));i[n.name]=r,e.SortedSet.prototype.add.apply(o,r)},this),this.documentStore.set(r,o),e.SortedSet.prototype.add.apply(this.corpusTokens,o.toArray());for(var s=0;s0&&(i=1+Math.log(this.tokenStore.length/n)),this._idfCache[t]=i},e.Index.prototype.search=function(t){var n=this.pipeline.run(e.tokenizer(t)),i=new e.Vector,o=[],r=this._fields.reduce(function(e,t){return e+t.boost},0),s=n.some(function(e){return this.tokenStore.has(e)},this);if(!s)return[];n.forEach(function(t,n,s){var a=1/s.length*this._fields.length*r,c=this,h=this.tokenStore.expand(t).reduce(function(n,o){var r=c.corpusTokens.indexOf(o),s=c.idf(o),h=1,l=new e.SortedSet;if(o!==t){var u=Math.max(3,o.length-t.length);h=1/Math.log(u)}return r>-1&&i.insert(r,a*s*h),Object.keys(c.tokenStore.get(o)).forEach(function(e){l.add(e)}),n.union(l)},new e.SortedSet);o.push(h)},this);var a=o.reduce(function(e,t){return e.intersect(t)});return a.map(function(e){return{ref:e,score:i.similarity(this.documentVector(e))}},this).sort(function(e,t){return t.score-e.score})},e.Index.prototype.documentVector=function(t){for(var n=this.documentStore.get(t),i=n.length,o=new e.Vector,r=0;i>r;r++){var s=n.elements[r],a=this.tokenStore.get(s)[t].tf,c=this.idf(s);o.insert(this.corpusTokens.indexOf(s),a*c)}return o},e.Index.prototype.toJSON=function(){return{version:e.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},e.Index.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},/*! +e.Index=function(){this._fields=[],this._ref="id",this.pipeline=new e.Pipeline,this.documentStore=new e.Store,this.tokenStore=new e.TokenStore,this.corpusTokens=new e.SortedSet,this.eventEmitter=new e.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},e.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},e.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},e.Index.load=function(t){t.version!==e.version&&e.utils.warn("version mismatch: current "+e.version+" importing "+t.version);var n=new this;return n._fields=t.fields,n._ref=t.ref,n.documentStore=e.Store.load(t.documentStore),n.tokenStore=e.TokenStore.load(t.tokenStore),n.corpusTokens=e.SortedSet.load(t.corpusTokens),n.pipeline=e.Pipeline.load(t.pipeline),n},e.Index.prototype.field=function(e,t){var t=t||{},n={name:e,boost:t.boost||1};return this._fields.push(n),this},e.Index.prototype.ref=function(e){return this._ref=e,this},e.Index.prototype.add=function(t,n){var i={},o=new e.SortedSet,s=t[this._ref],n=void 0===n?!0:n;this._fields.forEach(function(n){var s=this.pipeline.run(e.tokenizer(t[n.name]));i[n.name]=s,e.SortedSet.prototype.add.apply(o,s)},this),this.documentStore.set(s,o),e.SortedSet.prototype.add.apply(this.corpusTokens,o.toArray());for(var r=0;r0&&(i=1+Math.log(this.tokenStore.length/n)),this._idfCache[t]=i},e.Index.prototype.search=function(t){var n=this.pipeline.run(e.tokenizer(t)),i=new e.Vector,o=[],s=this._fields.reduce(function(e,t){return e+t.boost},0),r=n.some(function(e){return this.tokenStore.has(e)},this);if(!r)return[];n.forEach(function(t,n,r){var a=1/r.length*this._fields.length*s,c=this,h=this.tokenStore.expand(t).reduce(function(n,o){var s=c.corpusTokens.indexOf(o),r=c.idf(o),h=1,l=new e.SortedSet;if(o!==t){var u=Math.max(3,o.length-t.length);h=1/Math.log(u)}return s>-1&&i.insert(s,a*r*h),Object.keys(c.tokenStore.get(o)).forEach(function(e){l.add(e)}),n.union(l)},new e.SortedSet);o.push(h)},this);var a=o.reduce(function(e,t){return e.intersect(t)});return a.map(function(e){return{ref:e,score:i.similarity(this.documentVector(e))}},this).sort(function(e,t){return t.score-e.score})},e.Index.prototype.documentVector=function(t){for(var n=this.documentStore.get(t),i=n.length,o=new e.Vector,s=0;i>s;s++){var r=n.elements[s],a=this.tokenStore.get(r)[t].tf,c=this.idf(r);o.insert(this.corpusTokens.indexOf(r),a*c)}return o},e.Index.prototype.toJSON=function(){return{version:e.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},e.Index.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},/*! * lunr.Store * Copyright (C) 2014 Oliver Nightingale */ @@ -56,7 +56,7 @@ e.Store=function(){this.store={},this.length=0},e.Store.load=function(t){var n=n * Copyright (C) 2014 Oliver Nightingale * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt */ -e.stemmer=function(){var e={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},t={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",r=i+"[aeiou]*",s="^("+o+")?"+r+o,a="^("+o+")?"+r+o+"("+r+")?$",c="^("+o+")?"+r+o+r+o,h="^("+o+")?"+i,l=new RegExp(s),u=new RegExp(c),d=new RegExp(a),f=new RegExp(h),p=/^(.+?)(ss|i)es$/,g=/^(.+?)([^s])s$/,v=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,y=/.$/,w=/(at|bl|iz)$/,b=new RegExp("([^aeiouylsz])\\1$"),S=new RegExp("^"+o+i+"[^aeiouwxy]$"),x=/^(.+?[^aeiou])y$/,E=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,_=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,C=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,k=/^(.+?)(s|t)(ion)$/,O=/^(.+?)e$/,L=/ll$/,N=new RegExp("^"+o+i+"[^aeiouwxy]$"),A=function(n){var i,o,r,s,a,c,h;if(n.length<3)return n;if(r=n.substr(0,1),"y"==r&&(n=r.toUpperCase()+n.substr(1)),s=p,a=g,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=v,a=m,s.test(n)){var A=s.exec(n);s=l,s.test(A[1])&&(s=y,n=n.replace(s,""))}else if(a.test(n)){var A=a.exec(n);i=A[1],a=f,a.test(i)&&(n=i,a=w,c=b,h=S,a.test(n)?n+="e":c.test(n)?(s=y,n=n.replace(s,"")):h.test(n)&&(n+="e"))}if(s=x,s.test(n)){var A=s.exec(n);i=A[1],n=i+"i"}if(s=E,s.test(n)){var A=s.exec(n);i=A[1],o=A[2],s=l,s.test(i)&&(n=i+e[o])}if(s=_,s.test(n)){var A=s.exec(n);i=A[1],o=A[2],s=l,s.test(i)&&(n=i+t[o])}if(s=C,a=k,s.test(n)){var A=s.exec(n);i=A[1],s=u,s.test(i)&&(n=i)}else if(a.test(n)){var A=a.exec(n);i=A[1]+A[2],a=u,a.test(i)&&(n=i)}if(s=O,s.test(n)){var A=s.exec(n);i=A[1],s=u,a=d,c=N,(s.test(i)||a.test(i)&&!c.test(i))&&(n=i)}return s=L,a=u,s.test(n)&&a.test(n)&&(s=y,n=n.replace(s,"")),"y"==r&&(n=r.toLowerCase()+n.substr(1)),n};return A}(),e.Pipeline.registerFunction(e.stemmer,"stemmer"),/*! +e.stemmer=function(){var e={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},t={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",o=n+"[^aeiouy]*",s=i+"[aeiou]*",r="^("+o+")?"+s+o,a="^("+o+")?"+s+o+"("+s+")?$",c="^("+o+")?"+s+o+s+o,h="^("+o+")?"+i,l=new RegExp(r),u=new RegExp(c),d=new RegExp(a),f=new RegExp(h),p=/^(.+?)(ss|i)es$/,g=/^(.+?)([^s])s$/,v=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,y=/.$/,w=/(at|bl|iz)$/,b=new RegExp("([^aeiouylsz])\\1$"),E=new RegExp("^"+o+i+"[^aeiouwxy]$"),x=/^(.+?[^aeiou])y$/,_=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,S=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,C=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,O=/^(.+?)(s|t)(ion)$/,k=/^(.+?)e$/,L=/ll$/,A=new RegExp("^"+o+i+"[^aeiouwxy]$"),T=function(n){var i,o,s,r,a,c,h;if(n.length<3)return n;if(s=n.substr(0,1),"y"==s&&(n=s.toUpperCase()+n.substr(1)),r=p,a=g,r.test(n)?n=n.replace(r,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),r=v,a=m,r.test(n)){var T=r.exec(n);r=l,r.test(T[1])&&(r=y,n=n.replace(r,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=f,a.test(i)&&(n=i,a=w,c=b,h=E,a.test(n)?n+="e":c.test(n)?(r=y,n=n.replace(r,"")):h.test(n)&&(n+="e"))}if(r=x,r.test(n)){var T=r.exec(n);i=T[1],n=i+"i"}if(r=_,r.test(n)){var T=r.exec(n);i=T[1],o=T[2],r=l,r.test(i)&&(n=i+e[o])}if(r=S,r.test(n)){var T=r.exec(n);i=T[1],o=T[2],r=l,r.test(i)&&(n=i+t[o])}if(r=C,a=O,r.test(n)){var T=r.exec(n);i=T[1],r=u,r.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=u,a.test(i)&&(n=i)}if(r=k,r.test(n)){var T=r.exec(n);i=T[1],r=u,a=d,c=A,(r.test(i)||a.test(i)&&!c.test(i))&&(n=i)}return r=L,a=u,r.test(n)&&a.test(n)&&(r=y,n=n.replace(r,"")),"y"==s&&(n=s.toLowerCase()+n.substr(1)),n};return T}(),e.Pipeline.registerFunction(e.stemmer,"stemmer"),/*! * lunr.stopWordFilter * Copyright (C) 2014 Oliver Nightingale */ @@ -113,7 +113,7 @@ e.TokenStore=function(){this.root={docs:{}},this.length=0},e.TokenStore.load=fun * Licensed under MIT license. * */ -jQuery.extend({highlight:function(e,t,n,i){if(3===e.nodeType){var o=e.data.match(t);if(o){var r=document.createElement(n||"span");r.className=i||"highlight";var s=e.splitText(o.index);s.splitText(o[0].length);var a=s.cloneNode(!0);return r.appendChild(a),s.parentNode.replaceChild(r,s),1}}else if(1===e.nodeType&&e.childNodes&&!/(script|style)/i.test(e.tagName)&&(e.tagName!==n.toUpperCase()||e.className!==i))for(var c=0;c1e-4});t.length?(s.empty(),$.each(t,function(e,t){var n=document.getElementById(t.ref);s.append("
  • "+$(n).text()+"
  • ")}),i.call(this)):(s.html("
  • "),$(".search-results li").text('No Results Found for "'+this.value+'"'))}else o(),s.removeClass("visible")}function i(){this.value&&r.highlight(this.value,a)}function o(){r.unhighlight(a)}var r,s,a={element:"span",className:"search-highlight"},c=new lunr.Index;c.ref("id"),c.field("title",{boost:10}),c.field("body"),c.pipeline.add(lunr.trimmer,lunr.stopWordFilter),$(e),$(t)}(),/*! jQuery UI - v1.11.3 - 2015-02-12 +jQuery.extend({highlight:function(e,t,n,i){if(3===e.nodeType){var o=e.data.match(t);if(o){var s=document.createElement(n||"span");s.className=i||"highlight";var r=e.splitText(o.index);r.splitText(o[0].length);var a=r.cloneNode(!0);return s.appendChild(a),r.parentNode.replaceChild(s,r),1}}else if(1===e.nodeType&&e.childNodes&&!/(script|style)/i.test(e.tagName)&&(e.tagName!==n.toUpperCase()||e.className!==i))for(var c=0;c1e-4});t.length?(r.empty(),$.each(t,function(e,t){var n=document.getElementById(t.ref);r.append("
  • "+$(n).text()+"
  • ")}),i.call(this)):(r.html("
  • "),$(".search-results li").text('No Results Found for "'+this.value+'"'))}else o(),r.removeClass("visible")}function i(){this.value&&s.highlight(this.value,a)}function o(){s.unhighlight(a)}var s,r,a={element:"span",className:"search-highlight"},c=new lunr.Index;c.ref("id"),c.field("title",{boost:10}),c.field("body"),c.pipeline.add(lunr.trimmer,lunr.stopWordFilter),$(e),$(t)}(),/*! jQuery UI - v1.11.3 - 2015-02-12 * http://jqueryui.com * Includes: widget.js * Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ @@ -127,7 +127,7 @@ function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery) * * http://api.jqueryui.com/jQuery.widget/ */ -var t=0,n=Array.prototype.slice;e.cleanData=function(t){return function(n){var i,o,r;for(r=0;null!=(o=n[r]);r++)try{i=e._data(o,"events"),i&&i.remove&&e(o).triggerHandler("remove")}catch(s){}t(n)}}(e.cleanData),e.widget=function(t,n,i){var o,r,s,a,c={},h=t.split(".")[0];return t=t.split(".")[1],o=h+"-"+t,i||(i=n,n=e.Widget),e.expr[":"][o.toLowerCase()]=function(t){return!!e.data(t,o)},e[h]=e[h]||{},r=e[h][t],s=e[h][t]=function(e,t){return this._createWidget?void(arguments.length&&this._createWidget(e,t)):new s(e,t)},e.extend(s,r,{version:i.version,_proto:e.extend({},i),_childConstructors:[]}),a=new n,a.options=e.widget.extend({},a.options),e.each(i,function(t,i){return e.isFunction(i)?void(c[t]=function(){var e=function(){return n.prototype[t].apply(this,arguments)},o=function(e){return n.prototype[t].apply(this,e)};return function(){var t,n=this._super,r=this._superApply;return this._super=e,this._superApply=o,t=i.apply(this,arguments),this._super=n,this._superApply=r,t}}()):void(c[t]=i)}),s.prototype=e.widget.extend(a,{widgetEventPrefix:r?a.widgetEventPrefix||t:t},c,{constructor:s,namespace:h,widgetName:t,widgetFullName:o}),r?(e.each(r._childConstructors,function(t,n){var i=n.prototype;e.widget(i.namespace+"."+i.widgetName,s,n._proto)}),delete r._childConstructors):n._childConstructors.push(s),e.widget.bridge(t,s),s},e.widget.extend=function(t){for(var i,o,r=n.call(arguments,1),s=0,a=r.length;a>s;s++)for(i in r[s])o=r[s][i],r[s].hasOwnProperty(i)&&void 0!==o&&(t[i]=e.isPlainObject(o)?e.isPlainObject(t[i])?e.widget.extend({},t[i],o):e.widget.extend({},o):o);return t},e.widget.bridge=function(t,i){var o=i.prototype.widgetFullName||t;e.fn[t]=function(r){var s="string"==typeof r,a=n.call(arguments,1),c=this;return s?this.each(function(){var n,i=e.data(this,o);return"instance"===r?(c=i,!1):i?e.isFunction(i[r])&&"_"!==r.charAt(0)?(n=i[r].apply(i,a),n!==i&&void 0!==n?(c=n&&n.jquery?c.pushStack(n.get()):n,!1):void 0):e.error("no such method '"+r+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; attempted to call method '"+r+"'")}):(a.length&&(r=e.widget.extend.apply(null,[r].concat(a))),this.each(function(){var t=e.data(this,o);t?(t.option(r||{}),t._init&&t._init()):e.data(this,o,new i(r,this))})),c}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{disabled:!1,create:null},_createWidget:function(n,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=t++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),n),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,n){var i,o,r,s=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(s={},i=t.split("."),t=i.shift(),i.length){for(o=s[t]=e.widget.extend({},this.options[t]),r=0;rr;r++)for(i in s[r])o=s[r][i],s[r].hasOwnProperty(i)&&void 0!==o&&(t[i]=e.isPlainObject(o)?e.isPlainObject(t[i])?e.widget.extend({},t[i],o):e.widget.extend({},o):o);return t},e.widget.bridge=function(t,i){var o=i.prototype.widgetFullName||t;e.fn[t]=function(s){var r="string"==typeof s,a=n.call(arguments,1),c=this;return r?this.each(function(){var n,i=e.data(this,o);return"instance"===s?(c=i,!1):i?e.isFunction(i[s])&&"_"!==s.charAt(0)?(n=i[s].apply(i,a),n!==i&&void 0!==n?(c=n&&n.jquery?c.pushStack(n.get()):n,!1):void 0):e.error("no such method '"+s+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; attempted to call method '"+s+"'")}):(a.length&&(s=e.widget.extend.apply(null,[s].concat(a))),this.each(function(){var t=e.data(this,o);t?(t.option(s||{}),t._init&&t._init()):e.data(this,o,new i(s,this))})),c}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{disabled:!1,create:null},_createWidget:function(n,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=t++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),n),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,n){var i,o,s,r=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(r={},i=t.split("."),t=i.shift(),i.length){for(o=r[t]=e.widget.extend({},this.options[t]),s=0;s",{id:c+t,"class":c}).append(i._nestElements(e(this),t)),i.element.append(n),e(this).nextUntil(this.nodeName.toLowerCase()).each(function(){0===e(this).find(i.options.selectors).length?e(this).filter(i.options.selectors).each(function(){e(this).is(r)||i._appendSubheaders.call(this,i,n)}):e(this).find(i.options.selectors).each(function(){e(this).is(r)||i._appendSubheaders.call(this,i,n)})}))})):void i.element.addClass(a)},_setActiveElement:function(e){var n=this,i=t.location.hash.substring(1),o=n.element.find("li[data-unique='"+i+"']");return i.length?(n.element.find("."+n.focusClass).removeClass(n.focusClass),o.addClass(n.focusClass),n.options.showAndHide&&o.click()):(n.element.find("."+n.focusClass).removeClass(n.focusClass),!i.length&&e&&n.options.highlightDefault&&n.element.find(f).first().addClass(n.focusClass)),n},_nestElements:function(t,n){var i,o,r;return i=e.grep(this.items,function(e){return e===t.text()}),this.items.push(i.length?t.text()+n:t.text()),r=this._generateHashValue(i,t,n),o=e("
  • ",{"class":d,"data-unique":r}).append(e("",{text:t.text()})),t.before(e("
    ",{name:r,"data-unique":r})),o},_generateHashValue:function(e,t,n){var i="",o=this.options.hashGenerator;if("pretty"===o){for(i=t.text().toLowerCase().replace(/\s/g,"-"),i=i.replace(/[^\x00-\x7F]/g,"");i.indexOf("--")>-1;)i=i.replace(/--/g,"-");for(;i.indexOf(":-")>-1;)i=i.replace(/:-/g,"-")}else i="function"==typeof o?o(t.text(),t):t.text().replace(/\s/g,"");return e.length&&(i+=""+n),i},_appendSubheaders:function(t,n){var i=e(this).index(t.options.selectors),o=e(t.options.selectors).eq(i-1),r=+e(this).prop("tagName").charAt(1),s=+o.prop("tagName").charAt(1);s>r?t.element.find(u+"[data-tag="+r+"]").last().append(t._nestElements(e(this),i)):r===s?n.find(f).last().after(t._nestElements(e(this),i)):n.find(f).last().after(e("
  • -

    If you give an API role to a container, the environment variable DOCKERCLOUD_AUTH inside the container will have the contents of the Authorization header that you can use to authenticate against the REST or Stream APIs:

    +

    If you give an API role to a container, the environment variable DOCKERCLOUD_AUTH inside the container will have the contents of the Authorization header that you can use to authenticate against the REST or Stream APIs:

    curl -H "Authorization: $DOCKERCLOUD_AUTH" https://cloud.docker.com/api/app/v1/service/

    @@ -1374,7 +1387,7 @@

    Attributes

    tags -List of tags to identify the node cluster nodes when deploying services (see Tags for more information) +List of tags to identify the node cluster nodes when deploying services (see Tags for more information) provider_options @@ -1583,7 +1596,7 @@

    JSON Parameters

    tags -(optional) List of tags of the node cluster to be used when deploying services see Tags for more information) (default: []) +(optional) List of tags of the node cluster to be used when deploying services see Tags for more information) (default: []) provider_options @@ -1941,7 +1954,7 @@

    Attributes

    tags -List of tags to identify the node when deploying services (see Tags for more information) +List of tags to identify the node when deploying services (see Tags for more information) nickname @@ -1983,28 +1996,6 @@

    Node states

    -

    Node Last Metric attributes

    - - - - - - - - - - - - - - - - - - - -
    AttributeDescription
    cpuCPU percentage usage
    memoryMemory usage in bytes
    diskDisk storage usage in bytes
    -

    List all nodes

    import dockercloud
     
    @@ -2217,7 +2208,7 @@ 

    Upgrade Docker Daemon

    docker-cloud node upgrade 7eaf7fff
     
    -

    Upgrades the docker daemon of the node. This will restart your containers on that node. See Docker upgrade for more information.

    +

    Upgrades the docker daemon of the node. This will restart your containers on that node. See Docker upgrade for more information.

    Endpoint Type

    @@ -2975,7 +2966,7 @@

    Create a new stack

    docker-cloud stack create --name hello-world -f docker-compose.yml
     
    -

    Creates a new stack without starting it. Note that the JSON syntax is abstracted by both, the Docker Cloud CLI and our UI, in order to use Stack YAML files.

    +

    Creates a new stack without starting it. Note that the JSON syntax is abstracted by both, the Docker Cloud CLI and our UI, in order to use Stack YAML files.

    Endpoint Type

    @@ -3033,7 +3024,7 @@

    Export an existing stack

    docker-cloud stack export 46aca402
     
    -

    Get a JSON representation of the stack following the Stack YAML representation.

    +

    Get a JSON representation of the stack following the Stack YAML representation.

    Endpoint Type

    @@ -3616,11 +3607,11 @@

    Attributes

    net -Network mode to set on the containers (see table Network Modes below, more information ../../docker-cloud/apps/service-links/) +Network mode to set on the containers (see table Network Modes below, more information /docker-cloud/apps/service-links/) pid -Set the PID (Process) Namespace mode for the containers (more information ../../reference/run/#pid-settings-pid) +Set the PID (Process) Namespace mode for the containers (more information) synchronized @@ -3748,11 +3739,11 @@

    Attributes

    sequential_deployment -Whether the containers for this service should be deployed in sequence, linking each of them to the previous containers (see Service scaling for more information) +Whether the containers for this service should be deployed in sequence, linking each of them to the previous containers (see Service scaling for more information) cpu_shares -The relative CPU priority of the containers of the service (see Runtime Constraints on CPU and Memory for more information) +The relative CPU priority of the containers of the service (see Runtime Constraints on CPU and Memory for more information) cpuset @@ -3760,7 +3751,7 @@

    Attributes

    memory -The memory limit of the containers of the service in MB (see Runtime Constraints on CPU and Memory for more information) +The memory limit of the containers of the service in MB (see Runtime Constraints on CPU and Memory for more information) memory_swap @@ -3780,15 +3771,15 @@

    Attributes

    autorestart -Whether to restart the containers of the service automatically if they stop (see Crash recovery for more information) +Whether to restart the containers of the service automatically if they stop (see Crash recovery for more information) autodestroy -Whether to terminate the containers of the service automatically if they stop (see Autodestroy for more information) +Whether to terminate the containers of the service automatically if they stop (see Autodestroy for more information) roles -List of Docker Cloud roles assigned to this service (see Service links for more information) +List of Docker Cloud roles assigned to this service (see Service links for more information) link_variables @@ -3796,7 +3787,7 @@

    Attributes

    privileged -Whether to start the containers with Docker’s privileged flag set or not, which allows containers to access all devices on the host among other things (see Runtime privilege for more information) +Whether to start the containers with Docker’s privileged flag set or not, which allows containers to access all devices on the host among other things (see Runtime privilege for more information) read_only @@ -3804,15 +3795,15 @@

    Attributes

    deployment_strategy -Container distribution among nodes (see table Deployment strategies below and Deployment strategies for more information) +Container distribution among nodes (see table Deployment strategies below and Deployment strategies for more information) tags -List of tags to be used to deploy the service (see Tags for more information) +List of tags to be used to deploy the service (see Tags for more information) autoredeploy -Whether to redeploy the containers of the service when its image is updated in Docker Cloud registry (see Docker Cloud’s private registry for more information) +Whether to redeploy the containers of the service when its image is updated in Docker Cloud registry (see Docker Cloud’s private registry for more information) nickname @@ -4152,35 +4143,35 @@

    JSON Parameters

    autorestart -(optional) Whether the containers for this service should be restarted if they stop, i.e. ALWAYS (default: OFF, possible values: OFF, ON_FAILURE, ALWAYS) (see Crash recovery for more information) +(optional) Whether the containers for this service should be restarted if they stop, i.e. ALWAYS (default: OFF, possible values: OFF, ON_FAILURE, ALWAYS) (see Crash recovery for more information) autodestroy -(optional) Whether the containers should be terminated if they stop, i.e. OFF (default: OFF, possible values: OFF, ON_SUCCESS, ALWAYS) (see Autodestroy for more information) +(optional) Whether the containers should be terminated if they stop, i.e. OFF (default: OFF, possible values: OFF, ON_SUCCESS, ALWAYS) (see Autodestroy for more information) sequential_deployment -(optional) Whether the containers should be launched and scaled in sequence, i.e. true (default: false) (see Service scaling for more information) +(optional) Whether the containers should be launched and scaled in sequence, i.e. true (default: false) (see Service scaling for more information) roles -(optional) A list of Docker Cloud API roles to grant the service, i.e. ["global"] (default: [], possible values: global) (see Service links for more information) +(optional) A list of Docker Cloud API roles to grant the service, i.e. ["global"] (default: [], possible values: global) (see Service links for more information) privileged -(optional) Whether to start the containers with Docker’s privileged flag set or not, i.e. false (default: false) (see Runtime privilege for more information) +(optional) Whether to start the containers with Docker’s privileged flag set or not, i.e. false (default: false) (see Runtime privilege for more information) deployment_strategy -(optional) Container distribution among nodes (default: EMPTIEST_NODE, see table Deployment strategies above and Deployment strategies for more information) +(optional) Container distribution among nodes (default: EMPTIEST_NODE, see table Deployment strategies above and Deployment strategies for more information) tags -(optional) A list of tags to be used to deploy the service (see Tags for more information) (default: []) +(optional) A list of tags to be used to deploy the service (see Tags for more information) (default: []) autoredeploy -(optional) Whether to redeploy the containers of the service when its image is updated in Docker Cloud registry (default: false) (see Docker Cloud’s private registry for more information) +(optional) Whether to redeploy the containers of the service when its image is updated in Docker Cloud registry (default: false) (see Docker Cloud’s private registry for more information) net @@ -4496,11 +4487,11 @@

    JSON Parameters

    autorestart -(optional) Whether the containers for this service should be restarted if they stop, i.e. ALWAYS (possible values: OFF, ON_FAILURE, ALWAYS) (see Crash recovery for more information) +(optional) Whether the containers for this service should be restarted if they stop, i.e. ALWAYS (possible values: OFF, ON_FAILURE, ALWAYS) (see Crash recovery for more information) autodestroy -(optional) Whether the containers should be terminated if they stop, i.e. OFF (possible values: OFF, ON_SUCCESS, ALWAYS) (see Autodestroy for more information) +(optional) Whether the containers should be terminated if they stop, i.e. OFF (possible values: OFF, ON_SUCCESS, ALWAYS) (see Autodestroy for more information) container_envvars @@ -4512,7 +4503,7 @@

    JSON Parameters

    cpu_shares -(optional) The relative CPU priority of the containers the service describes (see Runtime Constraints on CPU and Memory for more information) +(optional) The relative CPU priority of the containers the service describes (see Runtime Constraints on CPU and Memory for more information) entrypoint @@ -4528,15 +4519,15 @@

    JSON Parameters

    memory -(optional) The memory limit of the containers of the service in MB (see Runtime Constraints on CPU and Memory for more information) +(optional) The memory limit of the containers of the service in MB (see Runtime Constraints on CPU and Memory for more information) privileged -(optional) Whether to start the containers with Docker’s privileged flag set or not, i.e. false (see Runtime privilege for more information) +(optional) Whether to start the containers with Docker’s privileged flag set or not, i.e. false (see Runtime privilege for more information) roles -(optional) A list of Docker Cloud API roles to grant the service, i.e. ["global"] (possible values: global) (see Service links for more information) +(optional) A list of Docker Cloud API roles to grant the service, i.e. ["global"] (possible values: global) (see Service links for more information) run_command @@ -4544,7 +4535,7 @@

    JSON Parameters

    sequential_deployment -(optional) Whether the containers should be launched and scaled in sequence, i.e. true (see Service scaling for more information) +(optional) Whether the containers should be launched and scaled in sequence, i.e. true (see Service scaling for more information) tags @@ -4556,11 +4547,11 @@

    JSON Parameters

    deployment_strategy -(optional) Container distribution among nodes. A service cannot be updated to or from a deployment strategy of EVERY_NODE. (See table Deployment strategies above and Deployment strategies for more information) +(optional) Container distribution among nodes. A service cannot be updated to or from a deployment strategy of EVERY_NODE. (See table Deployment strategies above and Deployment strategies for more information) autoredeploy -Whether to redeploy the containers of the service when its image is updated in Docker Cloud registry (see Docker Cloud’s private registry for more information) +Whether to redeploy the containers of the service when its image is updated in Docker Cloud registry (see Docker Cloud’s private registry for more information) net @@ -5248,7 +5239,7 @@

    Attributes

    cpu_shares -The relative CPU priority of the container (see Runtime Constraints on CPU and Memory for more information) +The relative CPU priority of the container (see Runtime Constraints on CPU and Memory for more information) cpuset @@ -5256,7 +5247,7 @@

    Attributes

    memory -The memory limit of the container in MB (see Runtime Constraints on CPU and Memory for more information) +The memory limit of the container in MB (see Runtime Constraints on CPU and Memory for more information) memory_swap @@ -5264,19 +5255,19 @@

    Attributes

    autorestart -Whether to restart the container automatically if it stops (see Crash recovery for more information) +Whether to restart the container automatically if it stops (see Crash recovery for more information) autodestroy -Whether to terminate the container automatically if it stops (see Autodestroy for more information) +Whether to terminate the container automatically if it stops (see Autodestroy for more information) roles -List of Docker Cloud roles asigned to this container (see API roles for more information)) +List of Docker Cloud roles asigned to this container (see API roles for more information)) linked_to_container -List of IP addresses of the linked containers (see table Container Link attributes below and Service links for more information) +List of IP addresses of the linked containers (see table Container Link attributes below and Service links for more information) link_variables @@ -5284,7 +5275,7 @@

    Attributes

    privileged -Whether the container has Docker’s privileged flag set or not (see Runtime privilege for more information) +Whether the container has Docker’s privileged flag set or not (see Runtime privilege for more information) read_only @@ -5296,11 +5287,11 @@

    Attributes

    net -Network mode set on the container (see table Network Modes below, more information ../../reference/run/#network-settings) +Network mode set on the container (see table Network Modes below, more information) pid -PID (Process) Namespace mode for the container (more information ../../reference/run/#pid-settings-pid) +PID (Process) Namespace mode for the container (more information) @@ -5438,28 +5429,6 @@

    Network Modes

    -

    Container Last Metric attributes

    - - - - - - - - - - - - - - - - - - - -
    AttributeDescription
    cpuCPU percentage usage
    memoryMemory usage in bytes
    diskDisk storage usage in bytes
    - @@ -5985,7 +5954,7 @@

    Service triggers

    } -

    Triggers are URLs that will start a redeploy of the service whenever a POST request is sent to them. They require no authorization headers, so they should be treated as access tokens. Triggers can be revoked if they are leaked or no longer used for security purposes. See Triggers for more information.

    +

    Triggers are URLs that will start a redeploy of the service whenever a POST request is sent to them. They require no authorization headers, so they should be treated as access tokens. Triggers can be revoked if they are leaked or no longer used for security purposes. See Triggers for more information.

    This is a namespaced endpoint.

    @@ -6465,17 +6434,23 @@

    Listen to new Docker Cloud Events

    import "github.com/docker/go-dockercloud/dockercloud"
     
    -c := make(chan dockercloud.Event)
    -e := make(chan error)
    +// Listens for container events only
    +myFilter := dockercloud.NewStreamFilter(&dockercloud.EventFilter{Type: "container"})
     
    -go dockercloud.Events(c, e)
    +stream := dockercloud.NewStream(myFilter)
    +
    +if err := stream.Connect(); err == nil {
    +    go stream.RunForever()
    +} else {
    +    log.Print("Connect err: " + err.Error())
    +}
     
     for {
         select {
    -        case event := <-c:
    -            log.Println(event)
    -        case err := <-e:
    -            log.Println(err)
    +    case event := <-stream.MessageChan:
    +        log.Println(event)
    +    case err := <-stream.ErrorChan:
    +        log.Println(err)
         }
     }
     
    @@ -6498,6 +6473,28 @@

    HTTP Request

    GET /api/audit/v1/[optional_namespace/]events/

    +

    Query Parameters

    + +
    + + + + + + + + + + + + + + + + + +
    ParameterDescription
    typeFilter by type
    objectFilter by object resource URI
    parentFilter by object parents
    +

    Errors

    @@ -6576,20 +6573,5 @@

    Errors

    -
    - - - - -
    diff --git a/apidocs/overview.md b/apidocs/overview.md index f11e2b96cd8..6d5098def12 100644 --- a/apidocs/overview.md +++ b/apidocs/overview.md @@ -1,7 +1,6 @@ --- description: Learn how to use DTR APIs. -keywords: -- docker, registry, DTR, APIs +keywords: docker, registry, DTR, APIs title: API overview --- diff --git a/apidocs/v1.3.3/images/explorer_icons.png b/apidocs/v1.3.3/images/explorer_icons.png index ed9d2fffb64..be43b273940 100644 Binary files a/apidocs/v1.3.3/images/explorer_icons.png and b/apidocs/v1.3.3/images/explorer_icons.png differ diff --git a/apidocs/v1.3.3/images/favicon-16x16.png b/apidocs/v1.3.3/images/favicon-16x16.png index 66b1a5bfb9e..120eb0700eb 100644 Binary files a/apidocs/v1.3.3/images/favicon-16x16.png and b/apidocs/v1.3.3/images/favicon-16x16.png differ diff --git a/apidocs/v1.3.3/images/favicon-32x32.png b/apidocs/v1.3.3/images/favicon-32x32.png index 32f319f89bd..b0a3352ffd3 100644 Binary files a/apidocs/v1.3.3/images/favicon-32x32.png and b/apidocs/v1.3.3/images/favicon-32x32.png differ diff --git a/apidocs/v1.3.3/images/logo_small.png b/apidocs/v1.3.3/images/logo_small.png index 5496a65579a..2625a77d48a 100644 Binary files a/apidocs/v1.3.3/images/logo_small.png and b/apidocs/v1.3.3/images/logo_small.png differ diff --git a/apidocs/v1.3.3/images/pet_store_api.png b/apidocs/v1.3.3/images/pet_store_api.png index f9f9cd4aeb3..1192ad8cd6a 100644 Binary files a/apidocs/v1.3.3/images/pet_store_api.png and b/apidocs/v1.3.3/images/pet_store_api.png differ diff --git a/apidocs/v1.3.3/images/wordnik_api.png b/apidocs/v1.3.3/images/wordnik_api.png index dca4f1455ac..dc0ddab138f 100644 Binary files a/apidocs/v1.3.3/images/wordnik_api.png and b/apidocs/v1.3.3/images/wordnik_api.png differ diff --git a/apidocs/v1.3.3/index.md b/apidocs/v1.3.3/index.md index 5073ef2e559..60668298eab 100644 --- a/apidocs/v1.3.3/index.md +++ b/apidocs/v1.3.3/index.md @@ -1,13 +1,7 @@ --- -description: v1.3.3 API -keywords: -- Docker, DTR, API, v1.3.3 -menu: - main: - parent: smn_dtrapi title: v1.3.3 API -type: _default -weight: 101 +description: v1.3.3 API +keywords: Docker, DTR, API, v1.3.3 ---
    diff --git a/apidocs/v1.3.3/swagger-ui.js b/apidocs/v1.3.3/swagger-ui.js deleted file mode 100644 index 18d256d6064..00000000000 --- a/apidocs/v1.3.3/swagger-ui.js +++ /dev/null @@ -1,32271 +0,0 @@ - - -/** - * swagger-ui - Swagger UI is a dependency-free collection of HTML, JavaScript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API - * @version v2.1.3 - * @link http://swagger.io - * @license Apache-2.0 - */ -(function(){'use strict'; - -window.SwaggerUi = Backbone.Router.extend({ - - dom_id: 'swagger_ui', - - // Attributes - options: null, - api: null, - headerView: null, - mainView: null, - - // SwaggerUi accepts all the same options as SwaggerApi - initialize: function(options) { - options = options || {}; - if(!options.highlightSizeThreshold) { - options.highlightSizeThreshold = 100000; - } - - // Allow dom_id to be overridden - if (options.dom_id) { - this.dom_id = options.dom_id; - delete options.dom_id; - } - - if (!options.supportedSubmitMethods){ - options.supportedSubmitMethods = [ - 'get', - 'put', - 'post', - 'delete', - 'head', - 'options', - 'patch' - ]; - } - - if (typeof options.oauth2RedirectUrl === 'string') { - window.oAuthRedirectUrl = options.redirectUrl; - } - - // Create an empty div which contains the dom_id - if (! $('#' + this.dom_id).length){ - $('body').append('
    ') ; - } - - this.options = options; - - // set marked options - marked.setOptions({gfm: true}); - - // Set the callbacks - var that = this; - this.options.success = function() { return that.render(); }; - this.options.progress = function(d) { return that.showMessage(d); }; - this.options.failure = function(d) { return that.onLoadFailure(d); }; - - // Create view to handle the header inputs - this.headerView = new SwaggerUi.Views.HeaderView({el: $('#header')}); - - // Event handler for when the baseUrl/apiKey is entered by user - this.headerView.on('update-swagger-ui', function(data) { - return that.updateSwaggerUi(data); - }); - }, - - // Set an option after initializing - setOption: function(option, value) { - this.options[option] = value; - }, - - // Get the value of a previously set option - getOption: function(option) { - return this.options[option]; - }, - - // Event handler for when url/key is received from user - updateSwaggerUi: function(data){ - this.options.url = data.url; - this.load(); - }, - - // Create an api and render - load: function(){ - // Initialize the API object - if (this.mainView) { - this.mainView.clear(); - } - var url = this.options.url; - if (url && url.indexOf('http') !== 0) { - url = this.buildUrl(window.location.href.toString(), url); - } - if(this.api) { - this.options.authorizations = this.api.clientAuthorizations.authz; - } - this.options.url = url; - this.headerView.update(url); - - this.api = new SwaggerClient(this.options); - }, - - // collapse all sections - collapseAll: function(){ - Docs.collapseEndpointListForResource(''); - }, - - // list operations for all sections - listAll: function(){ - Docs.collapseOperationsForResource(''); - }, - - // expand operations for all sections - expandAll: function(){ - Docs.expandOperationsForResource(''); - }, - - // This is bound to success handler for SwaggerApi - // so it gets called when SwaggerApi completes loading - render: function(){ - this.showMessage('Finished Loading Resource Information. Rendering Swagger UI...'); - this.mainView = new SwaggerUi.Views.MainView({ - model: this.api, - el: $('#' + this.dom_id), - swaggerOptions: this.options, - router: this - }).render(); - this.showMessage(); - switch (this.options.docExpansion) { - case 'full': - this.expandAll(); break; - case 'list': - this.listAll(); break; - default: - break; - } - this.renderGFM(); - - if (this.options.onComplete){ - this.options.onComplete(this.api, this); - } - - setTimeout(Docs.shebang.bind(this), 100); - }, - - buildUrl: function(base, url){ - if (url.indexOf('/') === 0) { - var parts = base.split('/'); - base = parts[0] + '//' + parts[2]; - return base + url; - } else { - var endOfPath = base.length; - - if (base.indexOf('?') > -1){ - endOfPath = Math.min(endOfPath, base.indexOf('?')); - } - - if (base.indexOf('#') > -1){ - endOfPath = Math.min(endOfPath, base.indexOf('#')); - } - - base = base.substring(0, endOfPath); - - if (base.indexOf('/', base.length - 1 ) !== -1){ - return base + url; - } - - return base + '/' + url; - } - }, - - // Shows message on topbar of the ui - showMessage: function(data){ - if (data === undefined) { - data = ''; - } - var $msgbar = $('#message-bar'); - $msgbar.removeClass('message-fail'); - $msgbar.addClass('message-success'); - $msgbar.html(data); - if(window.SwaggerTranslator) { - window.SwaggerTranslator.translate($msgbar); - } - }, - - // shows message in red - onLoadFailure: function(data){ - if (data === undefined) { - data = ''; - } - $('#message-bar').removeClass('message-success'); - $('#message-bar').addClass('message-fail'); - - var val = $('#message-bar').text(data); - - if (this.options.onFailure) { - this.options.onFailure(data); - } - - return val; - }, - - // Renders GFM for elements with 'markdown' class - renderGFM: function(){ - $('.markdown').each(function(){ - $(this).html(marked($(this).html())); - }); - - $('.propDesc', '.model-signature .description').each(function () { - $(this).html(marked($(this).html())).addClass('markdown'); - }); - } - -}); - -window.SwaggerUi.Views = {}; - -// don't break backward compatibility with previous versions and warn users to upgrade their code -(function(){ - window.authorizations = { - add: function() { - warn('Using window.authorizations is deprecated. Please use SwaggerUi.api.clientAuthorizations.add().'); - - if (typeof window.swaggerUi === 'undefined') { - throw new TypeError('window.swaggerUi is not defined'); - } - - if (window.swaggerUi instanceof SwaggerUi) { - window.swaggerUi.api.clientAuthorizations.add.apply(window.swaggerUi.api.clientAuthorizations, arguments); - } - } - }; - - window.ApiKeyAuthorization = function() { - warn('window.ApiKeyAuthorization is deprecated. Please use SwaggerClient.ApiKeyAuthorization.'); - SwaggerClient.ApiKeyAuthorization.apply(window, arguments); - }; - - window.PasswordAuthorization = function() { - warn('window.PasswordAuthorization is deprecated. Please use SwaggerClient.PasswordAuthorization.'); - SwaggerClient.PasswordAuthorization.apply(window, arguments); - }; - - function warn(message) { - if ('console' in window && typeof window.console.warn === 'function') { - console.warn(message); - } - } -})(); - - -// UMD -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['b'], function (b) { - return (root.SwaggerUi = factory(b)); - }); - } else if (typeof exports === 'object') { - // Node. Does not work with strict CommonJS, but - // only CommonJS-like environments that support module.exports, - // like Node. - module.exports = factory(require('b')); - } else { - // Browser globals - root.SwaggerUi = factory(root.b); - } -}(this, function () { - return SwaggerUi; -})); - -this["Handlebars"] = this["Handlebars"] || {}; -this["Handlebars"]["templates"] = this["Handlebars"]["templates"] || {}; -this["Handlebars"]["templates"]["apikey_button_view"] = Handlebars.template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { - var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; - return "\n
    \n
    \n
    \n \n \n
    \n
    \n"; -},"useData":true}); -this["Handlebars"]["templates"]["basic_auth_button_view"] = Handlebars.template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { - return "
    \n
    \n
    \n
    \n \n
    \n \n \n
    \n
    \n\n"; - },"useData":true}); -this["Handlebars"]["templates"]["content_type"] = Handlebars.template({"1":function(depth0,helpers,partials,data) { - var stack1, buffer = ""; - stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.produces : depth0), {"name":"each","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer; -},"2":function(depth0,helpers,partials,data) { - var stack1, lambda=this.lambda, buffer = " \n"; -},"4":function(depth0,helpers,partials,data) { - return " \n"; - },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { - var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "\n\n"; -},"useData":true}); -'use strict'; - - -$(function() { - - // Helper function for vertically aligning DOM elements - // http://www.seodenver.com/simple-vertical-align-plugin-for-jquery/ - $.fn.vAlign = function() { - return this.each(function(){ - var ah = $(this).height(); - var ph = $(this).parent().height(); - var mh = (ph - ah) / 2; - $(this).css('margin-top', mh); - }); - }; - - $.fn.stretchFormtasticInputWidthToParent = function() { - return this.each(function(){ - var p_width = $(this).closest("form").innerWidth(); - var p_padding = parseInt($(this).closest("form").css('padding-left') ,10) + parseInt($(this).closest('form').css('padding-right'), 10); - var this_padding = parseInt($(this).css('padding-left'), 10) + parseInt($(this).css('padding-right'), 10); - $(this).css('width', p_width - p_padding - this_padding); - }); - }; - - $('form.formtastic li.string input, form.formtastic textarea').stretchFormtasticInputWidthToParent(); - - // Vertically center these paragraphs - // Parent may need a min-height for this to work.. - $('ul.downplayed li div.content p').vAlign(); - - // When a sandbox form is submitted.. - $("form.sandbox").submit(function(){ - - var error_free = true; - - // Cycle through the forms required inputs - $(this).find("input.required").each(function() { - - // Remove any existing error styles from the input - $(this).removeClass('error'); - - // Tack the error style on if the input is empty.. - if ($(this).val() === '') { - $(this).addClass('error'); - $(this).wiggle(); - error_free = false; - } - - }); - - return error_free; - }); - -}); - -function clippyCopiedCallback() { - $('#api_key_copied').fadeIn().delay(1000).fadeOut(); - - // var b = $("#clippy_tooltip_" + a); - // b.length != 0 && (b.attr("title", "copied!").trigger("tipsy.reload"), setTimeout(function() { - // b.attr("title", "copy to clipboard") - // }, - // 500)) -} - -// Logging function that accounts for browsers that don't have window.console -function log(){ - log.history = log.history || []; - log.history.push(arguments); - if(this.console){ - console.log( Array.prototype.slice.call(arguments)[0] ); - } -} - -// Handle browsers that do console incorrectly (IE9 and below, see http://stackoverflow.com/a/5539378/7913) -if (Function.prototype.bind && console && typeof console.log === "object") { - [ - "log","info","warn","error","assert","dir","clear","profile","profileEnd" - ].forEach(function (method) { - console[method] = this.bind(console[method], console); - }, Function.prototype.call); -} - -window.Docs = { - - shebang: function() { - - // If shebang has an operation nickname in it.. - // e.g. /docs/#!/words/get_search - var fragments = location.hash.substring(1).split('/'); - fragments.shift(); // get rid of the bang - - switch (fragments.length) { - case 1: - if (fragments[0].length > 0) { // prevent matching "#/" - // Expand all operations for the resource and scroll to it - var dom_id = 'resource_' + fragments[0]; - - Docs.expandEndpointListForResource(fragments[0]); - //$("#"+dom_id).slideto({highlight: false}); - } - break; - case 2: - // Refer to the endpoint DOM element, e.g. #words_get_search - - // Expand Resource - Docs.expandEndpointListForResource(fragments[0]); - //$("#"+dom_id).slideto({highlight: false}); - - // Expand operation - var li_dom_id = fragments.join('_'); - var li_content_dom_id = li_dom_id + "_content"; - - - Docs.expandOperation($('#'+li_content_dom_id)); - //$('#'+li_dom_id).slideto({highlight: false}); - break; - } - - }, - - toggleEndpointListForResource: function(resource) { - var elem = $('li#resource_' + Docs.escapeResourceName(resource) + ' ul.endpoints'); - if (elem.is(':visible')) { - Docs.collapseEndpointListForResource(resource); - } else { - Docs.expandEndpointListForResource(resource); - } - }, - - // Expand resource - expandEndpointListForResource: function(resource) { - var resource = Docs.escapeResourceName(resource); - if (resource == '') { - $('.resource ul.endpoints').slideDown(); - return; - } - - $('li#resource_' + resource).addClass('active'); - - var elem = $('li#resource_' + resource + ' ul.endpoints'); - elem.slideDown(); - }, - - // Collapse resource and mark as explicitly closed - collapseEndpointListForResource: function(resource) { - var resource = Docs.escapeResourceName(resource); - if (resource == '') { - $('.resource ul.endpoints').slideUp(); - return; - } - - $('li#resource_' + resource).removeClass('active'); - - var elem = $('li#resource_' + resource + ' ul.endpoints'); - elem.slideUp(); - }, - - expandOperationsForResource: function(resource) { - // Make sure the resource container is open.. - Docs.expandEndpointListForResource(resource); - - if (resource == '') { - $('.resource ul.endpoints li.operation div.content').slideDown(); - return; - } - - $('li#resource_' + Docs.escapeResourceName(resource) + ' li.operation div.content').each(function() { - Docs.expandOperation($(this)); - }); - }, - - collapseOperationsForResource: function(resource) { - // Make sure the resource container is open.. - Docs.expandEndpointListForResource(resource); - - if (resource == '') { - $('.resource ul.endpoints li.operation div.content').slideUp(); - return; - } - - $('li#resource_' + Docs.escapeResourceName(resource) + ' li.operation div.content').each(function() { - Docs.collapseOperation($(this)); - }); - }, - - escapeResourceName: function(resource) { - return resource.replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]\^`{|}~]/g, "\\$&"); - }, - - expandOperation: function(elem) { - elem.slideDown(); - }, - - collapseOperation: function(elem) { - elem.slideUp(); - } -}; - -'use strict'; - -Handlebars.registerHelper('sanitize', function(html) { - // Strip the script tags from the html, and return it as a Handlebars.SafeString - html = html.replace(/)<[^<]*)*<\/script>/gi, ''); - return new Handlebars.SafeString(html); -}); - -Handlebars.registerHelper('renderTextParam', function(param) { - var result, type = 'text', idAtt = ''; - var isArray = param.type.toLowerCase() === 'array' || param.allowMultiple; - var defaultValue = isArray && Array.isArray(param.default) ? param.default.join('\n') : param.default; - - var dataVendorExtensions = Object.keys(param).filter(function(property) { - // filter X-data- properties - return property.match(/^X-data-/i) !== null; - }).reduce(function(result, property) { - // remove X- from property name, so it results in html attributes like data-foo='bar' - return result += ' ' + property.substring(2, property.length) + '=\'' + param[property] + '\''; - }, ''); - - if (typeof defaultValue === 'undefined') { - defaultValue = ''; - } - - if(param.format && param.format === 'password') { - type = 'password'; - } - - if(param.valueId) { - idAtt = ' id=\'' + param.valueId + '\''; - } - - if(isArray) { - result = ''; - } else { - var parameterClass = 'parameter'; - if(param.required) { - parameterClass += ' required'; - } - result = ''; - } - return new Handlebars.SafeString(result); -}); - -this["Handlebars"]["templates"]["main"] = Handlebars.template({"1":function(depth0,helpers,partials,data) { - var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression, buffer = "
    " - + escapeExpression(lambda(((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.title : stack1), depth0)) - + "
    \n
    "; - stack1 = lambda(((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.description : stack1), depth0); - if (stack1 != null) { buffer += stack1; } - buffer += "
    \n"; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.externalDocs : depth0), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - buffer += " "; - stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.termsOfServiceUrl : stack1), {"name":"if","hash":{},"fn":this.program(4, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - buffer += "\n "; - stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.name : stack1), {"name":"if","hash":{},"fn":this.program(6, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - buffer += "\n "; - stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.url : stack1), {"name":"if","hash":{},"fn":this.program(8, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - buffer += "\n "; - stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.email : stack1), {"name":"if","hash":{},"fn":this.program(10, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - buffer += "\n "; - stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.license : stack1), {"name":"if","hash":{},"fn":this.program(12, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer + "\n"; -},"2":function(depth0,helpers,partials,data) { - var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression; - return "

    " - + escapeExpression(lambda(((stack1 = (depth0 != null ? depth0.externalDocs : depth0)) != null ? stack1.description : stack1), depth0)) - + "

    \n " - + escapeExpression(lambda(((stack1 = (depth0 != null ? depth0.externalDocs : depth0)) != null ? stack1.url : stack1), depth0)) - + "\n"; -},"4":function(depth0,helpers,partials,data) { - var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression; - return ""; -},"6":function(depth0,helpers,partials,data) { - var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression; - return "
    Created by " - + escapeExpression(lambda(((stack1 = ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.contact : stack1)) != null ? stack1.name : stack1), depth0)) - + "
    "; -},"8":function(depth0,helpers,partials,data) { - var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression; - return ""; -},"10":function(depth0,helpers,partials,data) { - var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression; - return ""; -},"12":function(depth0,helpers,partials,data) { - var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression; - return ""; -},"14":function(depth0,helpers,partials,data) { - var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression; - return " , api version: " - + escapeExpression(lambda(((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.version : stack1), depth0)) - + "\n "; -},"16":function(depth0,helpers,partials,data) { - var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; - return " \n \n"; -},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { - var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "
    \n"; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.info : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - buffer += "
    \n
    \n
      \n\n
      \n

      [ base url: " - + escapeExpression(((helper = (helper = helpers.basePath || (depth0 != null ? depth0.basePath : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"basePath","hash":{},"data":data}) : helper))) - + "\n"; - stack1 = helpers['if'].call(depth0, ((stack1 = (depth0 != null ? depth0.info : depth0)) != null ? stack1.version : stack1), {"name":"if","hash":{},"fn":this.program(14, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - buffer += "]\n"; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.validatorUrl : depth0), {"name":"if","hash":{},"fn":this.program(16, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer + "

      \n
      \n
      \n"; -},"useData":true}); -this["Handlebars"]["templates"]["operation"] = Handlebars.template({"1":function(depth0,helpers,partials,data) { - return "deprecated"; - },"3":function(depth0,helpers,partials,data) { - return "

      Warning: Deprecated

      \n"; - },"5":function(depth0,helpers,partials,data) { - var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, buffer = "

      Implementation Notes

      \n
      "; - stack1 = ((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"description","hash":{},"data":data}) : helper)); - if (stack1 != null) { buffer += stack1; } - return buffer + "
      \n"; -},"7":function(depth0,helpers,partials,data) { - return "
      \n "; - },"9":function(depth0,helpers,partials,data) { - var stack1, buffer = "
      \n"; - stack1 = helpers.each.call(depth0, depth0, {"name":"each","hash":{},"fn":this.program(10, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer + "
      \n"; -},"10":function(depth0,helpers,partials,data) { - var stack1, lambda=this.lambda, escapeExpression=this.escapeExpression, buffer = "
      " - + escapeExpression(lambda((depth0 != null ? depth0.scope : depth0), depth0)) - + "
      \n"; -},"12":function(depth0,helpers,partials,data) { - return "
      "; - },"14":function(depth0,helpers,partials,data) { - return "
      \n \n
      \n"; - },"16":function(depth0,helpers,partials,data) { - var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; - return "

      Response Class (Status " - + escapeExpression(((helper = (helper = helpers.successCode || (depth0 != null ? depth0.successCode : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"successCode","hash":{},"data":data}) : helper))) - + ")

      \n

      \n
      \n
      \n"; -},"18":function(depth0,helpers,partials,data) { - return "

      Parameters

      \n \n \n \n \n \n \n \n \n \n \n \n\n \n
      ParameterValueDescriptionParameter TypeData Type
      \n"; - },"20":function(depth0,helpers,partials,data) { - return "
      \n

      Response Messages

      \n \n \n \n \n \n \n \n \n \n \n\n \n
      HTTP Status CodeReasonResponse ModelHeaders
      \n"; - },"22":function(depth0,helpers,partials,data) { - return ""; -},"24":function(depth0,helpers,partials,data) { - return "
      \n \n \n \n
      \n"; - },"26":function(depth0,helpers,partials,data) { - return "

      Request Headers

      \n
      \n"; - },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { - var stack1, helper, options, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, blockHelperMissing=helpers.blockHelperMissing, buffer = "\n
        \n
      • \n \n \n
      • \n
      \n"; -},"useData":true}); -this["Handlebars"]["templates"]["param"] = Handlebars.template({"1":function(depth0,helpers,partials,data) { - var stack1, buffer = ""; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isFile : depth0), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.program(4, data),"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer; -},"2":function(depth0,helpers,partials,data) { - var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; - return " \n
      \n"; -},"4":function(depth0,helpers,partials,data) { - var stack1, buffer = ""; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['default'] : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.program(7, data),"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer; -},"5":function(depth0,helpers,partials,data) { - var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; - return " \n
      \n
      \n"; -},"7":function(depth0,helpers,partials,data) { - var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; - return " \n
      \n
      \n"; -},"9":function(depth0,helpers,partials,data) { - var stack1, buffer = ""; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isFile : depth0), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.program(10, data),"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer; -},"10":function(depth0,helpers,partials,data) { - var stack1, helperMissing=helpers.helperMissing, buffer = ""; - stack1 = ((helpers.renderTextParam || (depth0 && depth0.renderTextParam) || helperMissing).call(depth0, depth0, {"name":"renderTextParam","hash":{},"fn":this.program(11, data),"inverse":this.noop,"data":data})); - if (stack1 != null) { buffer += stack1; } - return buffer; -},"11":function(depth0,helpers,partials,data) { - return ""; -},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { - var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "\n\n\n"; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isBody : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.program(9, data),"data":data}); - if (stack1 != null) { buffer += stack1; } - buffer += "\n\n"; - stack1 = ((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"description","hash":{},"data":data}) : helper)); - if (stack1 != null) { buffer += stack1; } - buffer += "\n"; - stack1 = ((helper = (helper = helpers.paramType || (depth0 != null ? depth0.paramType : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"paramType","hash":{},"data":data}) : helper)); - if (stack1 != null) { buffer += stack1; } - return buffer + "\n\n \n\n"; -},"useData":true}); -this["Handlebars"]["templates"]["param_list"] = Handlebars.template({"1":function(depth0,helpers,partials,data) { - return " required"; - },"3":function(depth0,helpers,partials,data) { - return " multiple=\"multiple\""; - },"5":function(depth0,helpers,partials,data) { - return " required "; - },"7":function(depth0,helpers,partials,data) { - var stack1, buffer = " \n"; -},"8":function(depth0,helpers,partials,data) { - return " selected=\"\" "; - },"10":function(depth0,helpers,partials,data) { - var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "\n \n\n"; -},"11":function(depth0,helpers,partials,data) { - return " selected=\"\" "; - },"13":function(depth0,helpers,partials,data) { - return " (default) "; - },"15":function(depth0,helpers,partials,data) { - return ""; - },"17":function(depth0,helpers,partials,data) { - return ""; - },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { - var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "" - + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper))) - + "\n\n \n\n"; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.required : depth0), {"name":"if","hash":{},"fn":this.program(15, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - stack1 = ((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"description","hash":{},"data":data}) : helper)); - if (stack1 != null) { buffer += stack1; } - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.required : depth0), {"name":"if","hash":{},"fn":this.program(17, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - buffer += "\n"; - stack1 = ((helper = (helper = helpers.paramType || (depth0 != null ? depth0.paramType : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"paramType","hash":{},"data":data}) : helper)); - if (stack1 != null) { buffer += stack1; } - return buffer + "\n\n"; -},"useData":true}); -this["Handlebars"]["templates"]["param_readonly"] = Handlebars.template({"1":function(depth0,helpers,partials,data) { - var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; - return " \n"; -},"3":function(depth0,helpers,partials,data) { - var stack1, buffer = ""; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['default'] : depth0), {"name":"if","hash":{},"fn":this.program(4, data),"inverse":this.program(6, data),"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer; -},"4":function(depth0,helpers,partials,data) { - var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; - return " " - + escapeExpression(((helper = (helper = helpers['default'] || (depth0 != null ? depth0['default'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"default","hash":{},"data":data}) : helper))) - + "\n"; -},"6":function(depth0,helpers,partials,data) { - return " (empty)\n"; - },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { - var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "\n\n"; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isBody : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.program(3, data),"data":data}); - if (stack1 != null) { buffer += stack1; } - buffer += "\n"; - stack1 = ((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"description","hash":{},"data":data}) : helper)); - if (stack1 != null) { buffer += stack1; } - buffer += "\n"; - stack1 = ((helper = (helper = helpers.paramType || (depth0 != null ? depth0.paramType : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"paramType","hash":{},"data":data}) : helper)); - if (stack1 != null) { buffer += stack1; } - return buffer + "\n\n"; -},"useData":true}); -this["Handlebars"]["templates"]["param_readonly_required"] = Handlebars.template({"1":function(depth0,helpers,partials,data) { - var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; - return " \n"; -},"3":function(depth0,helpers,partials,data) { - var stack1, buffer = ""; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['default'] : depth0), {"name":"if","hash":{},"fn":this.program(4, data),"inverse":this.program(6, data),"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer; -},"4":function(depth0,helpers,partials,data) { - var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; - return " " - + escapeExpression(((helper = (helper = helpers['default'] || (depth0 != null ? depth0['default'] : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"default","hash":{},"data":data}) : helper))) - + "\n"; -},"6":function(depth0,helpers,partials,data) { - return " (empty)\n"; - },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { - var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "\n\n"; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isBody : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.program(3, data),"data":data}); - if (stack1 != null) { buffer += stack1; } - buffer += "\n"; - stack1 = ((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"description","hash":{},"data":data}) : helper)); - if (stack1 != null) { buffer += stack1; } - buffer += "\n"; - stack1 = ((helper = (helper = helpers.paramType || (depth0 != null ? depth0.paramType : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"paramType","hash":{},"data":data}) : helper)); - if (stack1 != null) { buffer += stack1; } - return buffer + "\n\n"; -},"useData":true}); -this["Handlebars"]["templates"]["param_required"] = Handlebars.template({"1":function(depth0,helpers,partials,data) { - var stack1, buffer = ""; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isFile : depth0), {"name":"if","hash":{},"fn":this.program(2, data),"inverse":this.program(4, data),"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer; -},"2":function(depth0,helpers,partials,data) { - var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; - return " \n"; -},"4":function(depth0,helpers,partials,data) { - var stack1, buffer = ""; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0['default'] : depth0), {"name":"if","hash":{},"fn":this.program(5, data),"inverse":this.program(7, data),"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer; -},"5":function(depth0,helpers,partials,data) { - var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; - return " \n
      \n
      \n"; -},"7":function(depth0,helpers,partials,data) { - var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; - return " \n
      \n
      \n"; -},"9":function(depth0,helpers,partials,data) { - var stack1, buffer = ""; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isFile : depth0), {"name":"if","hash":{},"fn":this.program(10, data),"inverse":this.program(12, data),"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer; -},"10":function(depth0,helpers,partials,data) { - var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; - return " \n"; -},"12":function(depth0,helpers,partials,data) { - var stack1, helperMissing=helpers.helperMissing, buffer = ""; - stack1 = ((helpers.renderTextParam || (depth0 && depth0.renderTextParam) || helperMissing).call(depth0, depth0, {"name":"renderTextParam","hash":{},"fn":this.program(13, data),"inverse":this.noop,"data":data})); - if (stack1 != null) { buffer += stack1; } - return buffer; -},"13":function(depth0,helpers,partials,data) { - return ""; -},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { - var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "\n\n"; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.isBody : depth0), {"name":"if","hash":{},"fn":this.program(1, data),"inverse":this.program(9, data),"data":data}); - if (stack1 != null) { buffer += stack1; } - buffer += "\n\n "; - stack1 = ((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"description","hash":{},"data":data}) : helper)); - if (stack1 != null) { buffer += stack1; } - buffer += "\n\n"; - stack1 = ((helper = (helper = helpers.paramType || (depth0 != null ? depth0.paramType : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"paramType","hash":{},"data":data}) : helper)); - if (stack1 != null) { buffer += stack1; } - return buffer + "\n\n"; -},"useData":true}); -this["Handlebars"]["templates"]["parameter_content_type"] = Handlebars.template({"1":function(depth0,helpers,partials,data) { - var stack1, buffer = ""; - stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.consumes : depth0), {"name":"each","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer; -},"2":function(depth0,helpers,partials,data) { - var stack1, lambda=this.lambda, buffer = " \n"; -},"4":function(depth0,helpers,partials,data) { - return " \n"; - },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { - var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "\n\n"; -},"useData":true}); -this["Handlebars"]["templates"]["resource"] = Handlebars.template({"1":function(depth0,helpers,partials,data) { - return " : "; - },"3":function(depth0,helpers,partials,data) { - var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; - return "
    • \n Raw\n
    • \n"; -},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { - var stack1, helper, options, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, blockHelperMissing=helpers.blockHelperMissing, buffer = "
      \n

      \n " - + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper))) - + " "; - stack1 = ((helper = (helper = helpers.summary || (depth0 != null ? depth0.summary : depth0)) != null ? helper : helperMissing),(options={"name":"summary","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data}),(typeof helper === functionType ? helper.call(depth0, options) : helper)); - if (!helpers.summary) { stack1 = blockHelperMissing.call(depth0, stack1, options); } - if (stack1 != null) { buffer += stack1; } - stack1 = ((helper = (helper = helpers.summary || (depth0 != null ? depth0.summary : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"summary","hash":{},"data":data}) : helper)); - if (stack1 != null) { buffer += stack1; } - buffer += "\n

      \n
        \n
      • \n Show/Hide\n
      • \n
      • \n \n List Operations\n \n
      • \n
      • \n \n Expand Operations\n \n
      • \n"; - stack1 = helpers['if'].call(depth0, (depth0 != null ? depth0.url : depth0), {"name":"if","hash":{},"fn":this.program(3, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer + "
      \n
      \n\n"; -},"useData":true}); -this["Handlebars"]["templates"]["response_content_type"] = Handlebars.template({"1":function(depth0,helpers,partials,data) { - var stack1, buffer = ""; - stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.produces : depth0), {"name":"each","hash":{},"fn":this.program(2, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer; -},"2":function(depth0,helpers,partials,data) { - var stack1, lambda=this.lambda, buffer = " \n"; -},"4":function(depth0,helpers,partials,data) { - return " \n"; - },"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { - var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "\n\n"; -},"useData":true}); -this["Handlebars"]["templates"]["signature"] = Handlebars.template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { - var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "
      \n\n
      \n\n
      \n
      \n "; - stack1 = ((helper = (helper = helpers.signature || (depth0 != null ? depth0.signature : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"signature","hash":{},"data":data}) : helper)); - if (stack1 != null) { buffer += stack1; } - return buffer + "\n
      \n\n
      \n
      "
      -    + escapeExpression(((helper = (helper = helpers.sampleJSON || (depth0 != null ? depth0.sampleJSON : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"sampleJSON","hash":{},"data":data}) : helper)))
      -    + "
      \n \n
      \n
      \n\n"; -},"useData":true}); -this["Handlebars"]["templates"]["status_code"] = Handlebars.template({"1":function(depth0,helpers,partials,data) { - var lambda=this.lambda, escapeExpression=this.escapeExpression; - return " \n " - + escapeExpression(lambda((data && data.key), depth0)) - + "\n " - + escapeExpression(lambda((depth0 != null ? depth0.description : depth0), depth0)) - + "\n " - + escapeExpression(lambda((depth0 != null ? depth0.type : depth0), depth0)) - + "\n \n"; -},"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { - var stack1, helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, buffer = "" - + escapeExpression(((helper = (helper = helpers.code || (depth0 != null ? depth0.code : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"code","hash":{},"data":data}) : helper))) - + "\n"; - stack1 = ((helper = (helper = helpers.message || (depth0 != null ? depth0.message : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"message","hash":{},"data":data}) : helper)); - if (stack1 != null) { buffer += stack1; } - buffer += "\n\n\n \n \n"; - stack1 = helpers.each.call(depth0, (depth0 != null ? depth0.headers : depth0), {"name":"each","hash":{},"fn":this.program(1, data),"inverse":this.noop,"data":data}); - if (stack1 != null) { buffer += stack1; } - return buffer + " \n
      \n"; -},"useData":true}); -/** - * swagger-client - swagger-client is a javascript client for use with swaggering APIs. - * @version v2.1.4 - * @link http://swagger.io - * @license Apache-2.0 - */ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.SwaggerClient = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0) { - obj.url = obj.url + '&' + this.name + '=' + this.value; - } else { - obj.url = obj.url + '?' + this.name + '=' + this.value; - } - - return true; - } else if (this.type === 'header') { - if(typeof obj.headers[this.name] === 'undefined') { - obj.headers[this.name] = this.value; - } - - return true; - } -}; - -var CookieAuthorization = module.exports.CookieAuthorization = function (cookie) { - this.cookie = cookie; -}; - -CookieAuthorization.prototype.apply = function (obj) { - obj.cookieJar = obj.cookieJar || new CookieJar(); - obj.cookieJar.setCookie(this.cookie); - - return true; -}; - -/** - * Password Authorization is a basic auth implementation - */ -var PasswordAuthorization = module.exports.PasswordAuthorization = function (username, password) { - if (arguments.length === 3) { - helpers.log('PasswordAuthorization: the \'name\' argument has been removed, pass only username and password'); - username = arguments[1]; - password = arguments[2]; - } - this.username = username; - this.password = password; -}; - -PasswordAuthorization.prototype.apply = function (obj) { - if(typeof obj.headers.Authorization === 'undefined') { - obj.headers.Authorization = 'Basic ' + btoa(this.username + ':' + this.password); - } - - return true; -}; - -},{"./helpers":4,"btoa":18,"cookiejar":19,"lodash-compat/collection/each":55,"lodash-compat/collection/includes":58,"lodash-compat/lang/isArray":143,"lodash-compat/lang/isObject":147}],3:[function(require,module,exports){ -'use strict'; - -var _ = { - bind: require('lodash-compat/function/bind'), - cloneDeep: require('lodash-compat/lang/cloneDeep'), - find: require('lodash-compat/collection/find'), - forEach: require('lodash-compat/collection/forEach'), - indexOf: require('lodash-compat/array/indexOf'), - isArray: require('lodash-compat/lang/isArray'), - isObject: require('lodash-compat/lang/isObject'), - isFunction: require('lodash-compat/lang/isFunction'), - isPlainObject: require('lodash-compat/lang/isPlainObject'), - isUndefined: require('lodash-compat/lang/isUndefined') -}; -var auth = require('./auth'); -var helpers = require('./helpers'); -var Model = require('./types/model'); -var Operation = require('./types/operation'); -var OperationGroup = require('./types/operationGroup'); -var Resolver = require('./resolver'); -var SwaggerHttp = require('./http'); -var SwaggerSpecConverter = require('./spec-converter'); - -// We have to keep track of the function/property names to avoid collisions for tag names which are used to allow the -// following usage: 'client.{tagName}' -var reservedClientTags = [ - 'apis', - 'authorizationScheme', - 'authorizations', - 'basePath', - 'build', - 'buildFrom1_1Spec', - 'buildFrom1_2Spec', - 'buildFromSpec', - 'clientAuthorizations', - 'convertInfo', - 'debug', - 'defaultErrorCallback', - 'defaultSuccessCallback', - 'fail', - 'failure', - 'finish', - 'help', - 'idFromOp', - 'info', - 'initialize', - 'isBuilt', - 'isValid', - 'modelPropertyMacro', - 'models', - 'modelsArray', - 'options', - 'parameterMacro', - 'parseUri', - 'progress', - 'resourceCount', - 'sampleModels', - 'selfReflect', - 'setConsolidatedModels', - 'spec', - 'supportedSubmitMethods', - 'swaggerRequestHeaders', - 'tagFromLabel', - 'url', - 'useJQuery' -]; -// We have to keep track of the function/property names to avoid collisions for tag names which are used to allow the -// following usage: 'client.apis.{tagName}' -var reservedApiTags = [ - 'apis', - 'asCurl', - 'description', - 'externalDocs', - 'help', - 'label', - 'name', - 'operation', - 'operations', - 'operationsArray', - 'path', - 'tag' -]; -var supportedOperationMethods = ['delete', 'get', 'head', 'options', 'patch', 'post', 'put']; -var SwaggerClient = module.exports = function (url, options) { - this.authorizations = null; - this.authorizationScheme = null; - this.basePath = null; - this.debug = false; - this.info = null; - this.isBuilt = false; - this.isValid = false; - this.modelsArray = []; - this.resourceCount = 0; - this.url = null; - this.useJQuery = false; - this.swaggerObject = {}; - - this.clientAuthorizations = new auth.SwaggerAuthorizations(); - - if (typeof url !== 'undefined') { - return this.initialize(url, options); - } else { - return this; - } -}; - -SwaggerClient.prototype.initialize = function (url, options) { - this.models = {}; - this.sampleModels = {}; - - if (typeof url === 'string') { - this.url = url; - } else if (_.isObject(url)) { - options = url; - this.url = options.url; - } - - options = options || {}; - this.clientAuthorizations.add(options.authorizations); - this.swaggerRequestHeaders = options.swaggerRequestHeaders || 'application/json;charset=utf-8,*/*'; - this.defaultSuccessCallback = options.defaultSuccessCallback || null; - this.defaultErrorCallback = options.defaultErrorCallback || null; - this.modelPropertyMacro = options.modelPropertyMacro || null; - this.parameterMacro = options.parameterMacro || null; - - if (typeof options.success === 'function') { - this.success = options.success; - } - - if (options.useJQuery) { - this.useJQuery = options.useJQuery; - } - - this.options = options || {}; - - this.supportedSubmitMethods = options.supportedSubmitMethods || []; - this.failure = options.failure || function () {}; - this.progress = options.progress || function () {}; - this.spec = _.cloneDeep(options.spec); // Clone so we do not alter the provided document - - if (options.scheme) { - this.scheme = options.scheme; - } - - if (typeof options.success === 'function') { - this.ready = true; - this.build(); - } -}; - -SwaggerClient.prototype.build = function (mock) { - if (this.isBuilt) { - return this; - } - - var self = this; - - this.progress('fetching resource list: ' + this.url); - - var obj = { - useJQuery: this.useJQuery, - url: this.url, - method: 'get', - headers: { - accept: this.swaggerRequestHeaders - }, - on: { - error: function (response) { - if (self.url.substring(0, 4) !== 'http') { - return self.fail('Please specify the protocol for ' + self.url); - } else if (response.status === 0) { - return self.fail('Can\'t read from server. It may not have the appropriate access-control-origin settings.'); - } else if (response.status === 404) { - return self.fail('Can\'t read swagger JSON from ' + self.url); - } else { - return self.fail(response.status + ' : ' + response.statusText + ' ' + self.url); - } - }, - response: function (resp) { - - var responseObj = resp.obj; - if(!responseObj) { - return self.fail('failed to parse JSON/YAML response'); - } - - self.swaggerVersion = responseObj.swaggerVersion; - self.swaggerObject = responseObj; - - if (responseObj.swagger && parseInt(responseObj.swagger) === 2) { - self.swaggerVersion = responseObj.swagger; - - new Resolver().resolve(responseObj, self.url, self.buildFromSpec, self); - - self.isValid = true; - } else { - var converter = new SwaggerSpecConverter(); - self.oldSwaggerObject = self.swaggerObject; - - converter.setDocumentationLocation(self.url); - converter.convert(responseObj, self.clientAuthorizations, function(spec) { - self.swaggerObject = spec; - new Resolver().resolve(spec, self.url, self.buildFromSpec, self); - self.isValid = true; - }); - } - } - } - }; - - if (this.spec) { - self.swaggerObject = this.spec; - setTimeout(function () { - new Resolver().resolve(self.spec, self.buildFromSpec, self); - }, 10); - } else { - this.clientAuthorizations.apply(obj); - - if (mock) { - return obj; - } - - new SwaggerHttp().execute(obj, this.options); - } - - return this; -}; - -SwaggerClient.prototype.buildFromSpec = function (response) { - if (this.isBuilt) { - return this; - } - - this.apis = {}; - this.apisArray = []; - this.basePath = response.basePath || ''; - this.consumes = response.consumes; - this.host = response.host || ''; - this.info = response.info || {}; - this.produces = response.produces; - this.schemes = response.schemes || []; - this.securityDefinitions = response.securityDefinitions; - this.title = response.title || ''; - - if (response.externalDocs) { - this.externalDocs = response.externalDocs; - } - - // legacy support - this.authSchemes = response.securityDefinitions; - - var definedTags = {}; - var k; - - if (Array.isArray(response.tags)) { - definedTags = {}; - - for (k = 0; k < response.tags.length; k++) { - var t = response.tags[k]; - definedTags[t.name] = t; - } - } - - var location; - - if (typeof this.url === 'string') { - location = this.parseUri(this.url); - if (typeof this.scheme === 'undefined' && typeof this.schemes === 'undefined' || this.schemes.length === 0) { - this.scheme = location.scheme || 'http'; - } else if (typeof this.scheme === 'undefined') { - this.scheme = this.schemes[0]; - } - - if (typeof this.host === 'undefined' || this.host === '') { - this.host = location.host; - - if (location.port) { - this.host = this.host + ':' + location.port; - } - } - } - else { - if (typeof this.schemes === 'undefined' || this.schemes.length === 0) { - this.scheme = 'http'; - } - else if (typeof this.scheme === 'undefined') { - this.scheme = this.schemes[0]; - } - } - - this.definitions = response.definitions; - - var key; - - for (key in this.definitions) { - var model = new Model(key, this.definitions[key], this.models, this.modelPropertyMacro); - - if (model) { - this.models[key] = model; - } - } - - // get paths, create functions for each operationId - var self = this; - - // Bind help to 'client.apis' - self.apis.help = _.bind(self.help, self); - - _.forEach(response.paths, function (pathObj, path) { - // Only process a path if it's an object - if (!_.isPlainObject(pathObj)) { - return; - } - - _.forEach(supportedOperationMethods, function (method) { - var operation = pathObj[method]; - - if (_.isUndefined(operation)) { - // Operation does not exist - return; - } else if (!_.isPlainObject(operation)) { - // Operation exists but it is not an Operation Object. Since this is invalid, log it. - helpers.log('The \'' + method + '\' operation for \'' + path + '\' path is not an Operation Object'); - - return; - } - - var tags = operation.tags; - - if (_.isUndefined(tags) || !_.isArray(tags) || tags.length === 0) { - tags = operation.tags = [ 'default' ]; - } - - var operationId = self.idFromOp(path, method, operation); - var operationObject = new Operation(self, - operation.scheme, - operationId, - method, - path, - operation, - self.definitions, - self.models, - self.clientAuthorizations); - - // bind self operation's execute command to the api - _.forEach(tags, function (tag) { - var clientProperty = _.indexOf(reservedClientTags, tag) > -1 ? '_' + tag : tag; - var apiProperty = _.indexOf(reservedApiTags, tag) > -1 ? '_' + tag : tag; - var operationGroup = self[clientProperty]; - - if (clientProperty !== tag) { - helpers.log('The \'' + tag + '\' tag conflicts with a SwaggerClient function/property name. Use \'client.' + - clientProperty + '\' or \'client.apis.' + tag + '\' instead of \'client.' + tag + '\'.'); - } - - if (apiProperty !== tag) { - helpers.log('The \'' + tag + '\' tag conflicts with a SwaggerClient operation function/property name. Use ' + - '\'client.apis.' + apiProperty + '\' instead of \'client.apis.' + tag + '\'.'); - } - - if (_.indexOf(reservedApiTags, operationId) > -1) { - helpers.log('The \'' + operationId + '\' operationId conflicts with a SwaggerClient operation ' + - 'function/property name. Use \'client.apis.' + apiProperty + '._' + operationId + - '\' instead of \'client.apis.' + apiProperty + '.' + operationId + '\'.'); - - operationId = '_' + operationId; - operationObject.nickname = operationId; // So 'client.apis.[tag].operationId.help() works properly - } - - if (_.isUndefined(operationGroup)) { - operationGroup = self[clientProperty] = self.apis[apiProperty] = {}; - - operationGroup.operations = {}; - operationGroup.label = apiProperty; - operationGroup.apis = {}; - - var tagDef = definedTags[tag]; - - if (!_.isUndefined(tagDef)) { - operationGroup.description = tagDef.description; - operationGroup.externalDocs = tagDef.externalDocs; - } - - self[clientProperty].help = _.bind(self.help, operationGroup); - self.apisArray.push(new OperationGroup(tag, operationGroup.description, operationGroup.externalDocs, operationObject)); - } - - // Bind tag help - if (!_.isFunction(operationGroup.help)) { - operationGroup.help = _.bind(self.help, operationGroup); - } - - // bind to the apis object - self.apis[apiProperty][operationId] = operationGroup[operationId] = _.bind(operationObject.execute, - operationObject); - self.apis[apiProperty][operationId].help = operationGroup[operationId].help = _.bind(operationObject.help, - operationObject); - self.apis[apiProperty][operationId].asCurl = operationGroup[operationId].asCurl = _.bind(operationObject.asCurl, - operationObject); - - operationGroup.apis[operationId] = operationGroup.operations[operationId] = operationObject; - - // legacy UI feature - var api = _.find(self.apisArray, function (api) { - return api.tag === tag; - }); - - if (api) { - api.operationsArray.push(operationObject); - } - }); - }); - }); - - this.isBuilt = true; - - if (this.success) { - this.isValid = true; - this.isBuilt = true; - this.success(); - } - - return this; -}; - -SwaggerClient.prototype.parseUri = function (uri) { - var urlParseRE = /^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/; - var parts = urlParseRE.exec(uri); - - return { - scheme: parts[4].replace(':',''), - host: parts[11], - port: parts[12], - path: parts[15] - }; -}; - -SwaggerClient.prototype.help = function (dontPrint) { - var output = ''; - - if (this instanceof SwaggerClient) { - _.forEach(this.apis, function (api, name) { - if (_.isPlainObject(api)) { - output += 'operations for the \'' + name + '\' tag\n'; - - _.forEach(api.operations, function (operation, name) { - output += ' * ' + name + ': ' + operation.summary + '\n'; - }); - } - }); - } else if (this instanceof OperationGroup || _.isPlainObject(this)) { - output += 'operations for the \'' + this.label + '\' tag\n'; - - _.forEach(this.apis, function (operation, name) { - output += ' * ' + name + ': ' + operation.summary + '\n'; - }); - } - - if (dontPrint) { - return output; - } else { - helpers.log(output); - - return output; - } -}; - -SwaggerClient.prototype.tagFromLabel = function (label) { - return label; -}; - -SwaggerClient.prototype.idFromOp = function (path, httpMethod, op) { - if(!op || !op.operationId) { - op = op || {}; - op.operationId = httpMethod + '_' + path; - } - var opId = op.operationId.replace(/[\s!@#$%^&*()_+=\[{\]};:<>|.\/?,\\'""-]/g, '_') || (path.substring(1) + '_' + httpMethod); - - opId = opId.replace(/((_){2,})/g, '_'); - opId = opId.replace(/^(_)*/g, ''); - opId = opId.replace(/([_])*$/g, ''); - return opId; -}; - -SwaggerClient.prototype.setHost = function (host) { - this.host = host; - - if(this.apis) { - _.forEach(this.apis, function(api) { - if(api.operations) { - _.forEach(api.operations, function(operation) { - operation.host = host; - }); - } - }); - } -}; - -SwaggerClient.prototype.setBasePath = function (basePath) { - this.basePath = basePath; - - if(this.apis) { - _.forEach(this.apis, function(api) { - if(api.operations) { - _.forEach(api.operations, function(operation) { - operation.basePath = basePath; - }); - } - }); - } -}; - -SwaggerClient.prototype.fail = function (message) { - this.failure(message); - - throw message; -}; -},{"./auth":2,"./helpers":4,"./http":5,"./resolver":6,"./spec-converter":8,"./types/model":9,"./types/operation":10,"./types/operationGroup":11,"lodash-compat/array/indexOf":52,"lodash-compat/collection/find":56,"lodash-compat/collection/forEach":57,"lodash-compat/function/bind":61,"lodash-compat/lang/cloneDeep":141,"lodash-compat/lang/isArray":143,"lodash-compat/lang/isFunction":145,"lodash-compat/lang/isObject":147,"lodash-compat/lang/isPlainObject":148,"lodash-compat/lang/isUndefined":151}],4:[function(require,module,exports){ -(function (process){ -'use strict'; - -var _ = { - isPlainObject: require('lodash-compat/lang/isPlainObject'), - indexOf: require('lodash-compat/array/indexOf') -}; - -module.exports.__bind = function (fn, me) { - return function(){ - return fn.apply(me, arguments); - }; -}; - -var log = module.exports.log = function() { - // Only log if available and we're not testing - if (console && process.env.NODE_ENV !== 'test') { - console.log(Array.prototype.slice.call(arguments)[0]); - } -}; - -module.exports.fail = function (message) { - log(message); -}; - -var optionHtml = module.exports.optionHtml = function (label, value) { - return '' + label + ':' + value + ''; -}; - -var resolveSchema = module.exports.resolveSchema = function (schema) { - if (_.isPlainObject(schema.schema)) { - schema = resolveSchema(schema.schema); - } - - return schema; -}; - -var simpleRef = module.exports.simpleRef = function (name) { - if (typeof name === 'undefined') { - return null; - } - - if (name.indexOf('#/definitions/') === 0) { - return name.substring('#/definitions/'.length); - } else { - return name; - } -}; - - -}).call(this,require('_process')) -//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9oZWxwZXJzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgXyA9IHtcbiAgaXNQbGFpbk9iamVjdDogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9sYW5nL2lzUGxhaW5PYmplY3QnKSxcbiAgaW5kZXhPZjogcmVxdWlyZSgnbG9kYXNoLWNvbXBhdC9hcnJheS9pbmRleE9mJylcbn07XG5cbm1vZHVsZS5leHBvcnRzLl9fYmluZCA9IGZ1bmN0aW9uIChmbiwgbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCl7XG4gICAgcmV0dXJuIGZuLmFwcGx5KG1lLCBhcmd1bWVudHMpO1xuICB9O1xufTtcblxudmFyIGxvZyA9IG1vZHVsZS5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICAvLyBPbmx5IGxvZyBpZiBhdmFpbGFibGUgYW5kIHdlJ3JlIG5vdCB0ZXN0aW5nXG4gIGlmIChjb25zb2xlICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcpIHtcbiAgICBjb25zb2xlLmxvZyhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpWzBdKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMuZmFpbCA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gIGxvZyhtZXNzYWdlKTtcbn07XG5cbnZhciBvcHRpb25IdG1sID0gbW9kdWxlLmV4cG9ydHMub3B0aW9uSHRtbCA9IGZ1bmN0aW9uIChsYWJlbCwgdmFsdWUpIHtcbiAgcmV0dXJuICc8dHI+PHRkIGNsYXNzPVwib3B0aW9uTmFtZVwiPicgKyBsYWJlbCArICc6PC90ZD48dGQ+JyArIHZhbHVlICsgJzwvdGQ+PC90cj4nO1xufTtcblxudmFyIHJlc29sdmVTY2hlbWEgPSBtb2R1bGUuZXhwb3J0cy5yZXNvbHZlU2NoZW1hID0gZnVuY3Rpb24gKHNjaGVtYSkge1xuICBpZiAoXy5pc1BsYWluT2JqZWN0KHNjaGVtYS5zY2hlbWEpKSB7XG4gICAgc2NoZW1hID0gcmVzb2x2ZVNjaGVtYShzY2hlbWEuc2NoZW1hKTtcbiAgfVxuXG4gIHJldHVybiBzY2hlbWE7XG59O1xuXG52YXIgc2ltcGxlUmVmID0gbW9kdWxlLmV4cG9ydHMuc2ltcGxlUmVmID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG5hbWUuaW5kZXhPZignIy9kZWZpbml0aW9ucy8nKSA9PT0gMCkge1xuICAgIHJldHVybiBuYW1lLnN1YnN0cmluZygnIy9kZWZpbml0aW9ucy8nLmxlbmd0aCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbn07XG5cbiJdfQ== -},{"_process":17,"lodash-compat/array/indexOf":52,"lodash-compat/lang/isPlainObject":148}],5:[function(require,module,exports){ -'use strict'; - -var helpers = require('./helpers'); -var jQuery = require('jquery'); -var request = require('superagent'); -var jsyaml = require('js-yaml'); -var _ = { - isObject: require('lodash-compat/lang/isObject') -}; - -/* - * JQueryHttpClient is a light-weight, node or browser HTTP client - */ -var JQueryHttpClient = function () {}; - -/* - * SuperagentHttpClient is a light-weight, node or browser HTTP client - */ -var SuperagentHttpClient = function () {}; - -/** - * SwaggerHttp is a wrapper for executing requests - */ -var SwaggerHttp = module.exports = function () {}; - -SwaggerHttp.prototype.execute = function (obj, opts) { - var client; - - if(opts && opts.client) { - client = opts.client; - } - else { - client = new SuperagentHttpClient(opts); - } - - // legacy support - if ((obj && obj.useJQuery === true) || this.isInternetExplorer()) { - client = new JQueryHttpClient(opts); - } - - var success = obj.on.response; - - var responseInterceptor = function(data) { - if(opts && opts.responseInterceptor) { - data = opts.responseInterceptor.apply(data); - } - success(data); - }; - - obj.on.response = function(data) { - responseInterceptor(data); - }; - - - if (_.isObject(obj) && _.isObject(obj.body)) { - // special processing for file uploads via jquery - if (obj.body.type && obj.body.type === 'formData'){ - obj.contentType = false; - obj.processData = false; - - delete obj.headers['Content-Type']; - } else { - obj.body = JSON.stringify(obj.body); - } - } - client.execute(obj); -}; - -SwaggerHttp.prototype.isInternetExplorer = function () { - var detectedIE = false; - - if (typeof navigator !== 'undefined' && navigator.userAgent) { - var nav = navigator.userAgent.toLowerCase(); - - if (nav.indexOf('msie') !== -1) { - var version = parseInt(nav.split('msie')[1]); - - if (version <= 8) { - detectedIE = true; - } - } - } - - return detectedIE; -}; - -JQueryHttpClient.prototype.execute = function (obj) { - var cb = obj.on; - var request = obj; - - obj.type = obj.method; - obj.cache = false; - delete obj.useJQuery; - - /* - obj.beforeSend = function (xhr) { - var key, results; - if (obj.headers) { - results = []; - for (key in obj.headers) { - if (key.toLowerCase() === 'content-type') { - results.push(obj.contentType = obj.headers[key]); - } else if (key.toLowerCase() === 'accept') { - results.push(obj.accepts = obj.headers[key]); - } else { - results.push(xhr.setRequestHeader(key, obj.headers[key])); - } - } - return results; - } - };*/ - - obj.data = obj.body; - - delete obj.body; - - obj.complete = function (response) { - var headers = {}; - var headerArray = response.getAllResponseHeaders().split('\n'); - - for (var i = 0; i < headerArray.length; i++) { - var toSplit = headerArray[i].trim(); - - if (toSplit.length === 0) { - continue; - } - - var separator = toSplit.indexOf(':'); - - if (separator === -1) { - // Name but no value in the header - headers[toSplit] = null; - - continue; - } - - var name = toSplit.substring(0, separator).trim(); - var value = toSplit.substring(separator + 1).trim(); - - headers[name] = value; - } - - var out = { - url: request.url, - method: request.method, - status: response.status, - statusText: response.statusText, - data: response.responseText, - headers: headers - }; - - try { - var possibleObj = response.responseJSON || jsyaml.safeLoad(response.responseText); - out.obj = (typeof possibleObj === 'string') ? {} : possibleObj; - } catch (ex) { - // do not set out.obj - helpers.log('unable to parse JSON/YAML content'); - } - - // I can throw, or parse null? - out.obj = out.obj || null; - - if (response.status >= 200 && response.status < 300) { - cb.response(out); - } else if (response.status === 0 || (response.status >= 400 && response.status < 599)) { - cb.error(out); - } else { - return cb.response(out); - } - }; - - jQuery.support.cors = true; - - return jQuery.ajax(obj); -}; - -SuperagentHttpClient.prototype.execute = function (obj) { - var method = obj.method.toLowerCase(); - - if (method === 'delete') { - method = 'del'; - } - var headers = obj.headers || {}; - var r = request[method](obj.url); - var name; - for (name in headers) { - r.set(name, headers[name]); - } - - if (obj.body) { - r.send(obj.body); - } - - if(typeof r.buffer === 'function') { - r.buffer(); // force superagent to populate res.text with the raw response data - } - - r.end(function (err, res) { - res = res || { - status: 0, - headers: {error: 'no response from server'} - }; - var response = { - url: obj.url, - method: obj.method, - headers: res.headers - }; - var cb; - - if (!err && res.error) { - err = res.error; - } - - if (err && obj.on && obj.on.error) { - response.obj = err; - response.status = res ? res.status : 500; - response.statusText = res ? res.text : err.message; - cb = obj.on.error; - } else if (res && obj.on && obj.on.response) { - var possibleObj; - - // Already parsed by by superagent? - if(res.body && Object.keys(res.body).length > 0) { - possibleObj = res.body; - } else { - try { - possibleObj = jsyaml.safeLoad(res.text); - // can parse into a string... which we don't need running around in the system - possibleObj = (typeof possibleObj === 'string') ? null : possibleObj; - } catch(e) { - helpers.log('cannot parse JSON/YAML content'); - } - } - - // null means we can't parse into object - response.obj = possibleObj || null; - - response.status = res.status; - response.statusText = res.text; - cb = obj.on.response; - } - response.data = response.statusText; - - if (cb) { - cb(response); - } - }); -}; - -},{"./helpers":4,"jquery":20,"js-yaml":21,"lodash-compat/lang/isObject":147,"superagent":160}],6:[function(require,module,exports){ -'use strict'; - -var SwaggerHttp = require('./http'); -var _ = { - isObject: require('lodash-compat/lang/isObject'), - isArray: require('lodash-compat/lang/isArray') -}; - - -/** - * Resolves a spec's remote references - */ -var Resolver = module.exports = function () {}; - -Resolver.prototype.processAllOf = function(name, definition, resolutionTable, unresolvedRefs, spec) { - var i, location, property; - - definition['x-resolved-from'] = [ '#/definitions/' + name ]; - var allOf = definition.allOf; - // the refs go first - allOf.sort(function(a, b) { - if(a.$ref && b.$ref) { return 0; } - else if(a.$ref) { return -1; } - else { return 1; } - }); - for (i = 0; i < allOf.length; i++) { - property = allOf[i]; - location = '/definitions/' + name + '/allOf'; - this.resolveInline(null, spec, property, resolutionTable, unresolvedRefs, location); - } -}; - -Resolver.prototype.resolve = function (spec, arg1, arg2, arg3) { - var root = arg1, callback = arg2, scope = arg3, location, i; - if(typeof arg1 === 'function') { - root = null; - callback = arg1; - scope = arg2; - } - var _root = root; - this.scope = (scope || this); - this.iteration = this.iteration || 0; - - var name, path, property, propertyName; - var processedCalls = 0, resolvedRefs = {}, unresolvedRefs = {}; - var resolutionTable = []; // store objects for dereferencing - - // definitions - for (name in spec.definitions) { - var definition = spec.definitions[name]; - for (propertyName in definition.properties) { - property = definition.properties[propertyName]; - if(_.isArray(property.allOf)) { - this.processAllOf(name, property, resolutionTable, unresolvedRefs, spec); - } - else { - this.resolveTo(root, property, resolutionTable, '/definitions'); - } - } - - if(definition.allOf) { - this.processAllOf(name, definition, resolutionTable, unresolvedRefs, spec); - } - } - - // operations - for (name in spec.paths) { - var method, operation, responseCode; - path = spec.paths[name]; - - for (method in path) { - // operation reference - if(method === '$ref') { - // location = path[method]; - location = '/paths' + name; - this.resolveInline(root, spec, path, resolutionTable, unresolvedRefs, location); - } - else { - operation = path[method]; - - var parameters = operation.parameters; - for (i in parameters) { - var parameter = parameters[i]; - location = '/paths' + name + '/' + method + '/parameters'; - - if (parameter.in === 'body' && parameter.schema) { - this.resolveTo(root, parameter.schema, resolutionTable, location); - } - - if (parameter.$ref) { - // parameter reference - this.resolveInline(root, spec, parameter, resolutionTable, unresolvedRefs, parameter.$ref); - } - } - - for (responseCode in operation.responses) { - var response = operation.responses[responseCode]; - location = '/paths' + name + '/' + method + '/responses/' + responseCode; - - if(_.isObject(response)) { - if(response.$ref) { - // response reference - this.resolveInline(root, spec, response, resolutionTable, unresolvedRefs, location); - } - if (response.schema) { - this.resolveTo(root, response.schema, resolutionTable, location); - } - } - } - } - } - } - - var expectedCalls = 0, toResolve = []; - // if the root is same as obj[i].root we can resolve locally - var all = resolutionTable; - - var parts; - for(i = 0; i < all.length; i++) { - var a = all[i]; - if(root === a.root) { - if(a.resolveAs === 'ref') { - // resolve any path walking - var joined = ((a.root || '') + '/' + a.key).split('/'); - var normalized = []; - var url = ''; - var k; - - if(a.key.indexOf('../') >= 0) { - for(var j = 0; j < joined.length; j++) { - if(joined[j] === '..') { - normalized = normalized.slice(0, normalized.length-1); - } - else { - normalized.push(joined[j]); - } - } - for(k = 0; k < normalized.length; k ++) { - if(k > 0) { - url += '/'; - } - url += normalized[k]; - } - // we now have to remote resolve this because the path has changed - a.root = url; - toResolve.push(a); - } - else { - parts = a.key.split('#'); - if(parts.length === 2) { - if(parts[0].indexOf('http://') === 0 || parts[0].indexOf('https://') === 0) { - a.root = parts[0]; - } - location = parts[1].split('/'); - var r; - var s = spec; - for(k = 0; k < location.length; k++) { - var part = location[k]; - if(part !== '') { - s = s[part]; - if(typeof s !== 'undefined') { - r = s; - } - else { - r = null; - break; - } - } - } - if(r === null) { - // must resolve this too - toResolve.push(a); - } - } - } - } - else { - if (a.resolveAs === 'inline') { - if(a.key && a.key.indexOf('#') === -1 && a.key.charAt(0) !== '/') { - // handle relative schema - parts = a.root.split('/'); - location = ''; - for(i = 0; i < parts.length - 1; i++) { - location += parts[i] + '/'; - } - location += a.key; - a.root = location; - a.location = ''; - } - toResolve.push(a); - } - } - } - else { - toResolve.push(a); - } - } - expectedCalls = toResolve.length; - - // resolve anything that is local - for(var ii = 0; ii < toResolve.length; ii++) { - (function(item, self) { - if(item.root === null || item.root === root) { - // local resolve - self.resolveItem(spec, _root, resolutionTable, resolvedRefs, unresolvedRefs, item); - processedCalls += 1; - - if(processedCalls === expectedCalls) { - self.finish(spec, root, resolutionTable, resolvedRefs, unresolvedRefs, callback); - } - } - else { - var obj = { - useJQuery: false, // TODO - url: item.root, - method: 'get', - headers: { - accept: self.scope.swaggerRequestHeaders || 'application/json' - }, - on: { - error: function () { - processedCalls += 1; - unresolvedRefs[item.key] = { - root: item.root, - location: item.location - }; - - if (processedCalls === expectedCalls) { - self.finish(spec, _root, resolutionTable, resolvedRefs, unresolvedRefs, callback); - } - }, // jshint ignore:line - response: function (response) { - var swagger = response.obj; - self.resolveItem(swagger, item.root, resolutionTable, resolvedRefs, unresolvedRefs, item); - processedCalls += 1; - - if (processedCalls === expectedCalls) { - self.finish(spec, _root, resolutionTable, resolvedRefs, unresolvedRefs, callback); - } - } - } // jshint ignore:line - }; - - if (scope && scope.clientAuthorizations) { - scope.clientAuthorizations.apply(obj); - } - new SwaggerHttp().execute(obj); - } - }(toResolve[ii], this)); - } - - if (Object.keys(toResolve).length === 0) { - this.finish(spec, _root, resolutionTable, resolvedRefs, unresolvedRefs, callback); - } -}; - -Resolver.prototype.resolveItem = function(spec, root, resolutionTable, resolvedRefs, unresolvedRefs, item) { - var path = item.location; - var location = spec, parts = path.split('/'); - if(path !== '') { - for (var j = 0; j < parts.length; j++) { - var segment = parts[j]; - if (segment.indexOf('~1') !== -1) { - segment = parts[j].replace(/~0/g, '~').replace(/~1/g, '/'); - if (segment.charAt(0) !== '/') { - segment = '/' + segment; - } - } - if (typeof location === 'undefined' || location === null) { - break; - } - if (segment === '' && j === (parts.length - 1) && parts.length > 1) { - location = null; - break; - } - if (segment.length > 0) { - location = location[segment]; - } - } - } - var resolved = item.key; - parts = item.key.split('/'); - var resolvedName = parts[parts.length-1]; - - if(resolvedName.indexOf('#') >= 0) { - resolvedName = resolvedName.split('#')[1]; - } - - if (location !== null && typeof location !== 'undefined') { - resolvedRefs[resolved] = { - name: resolvedName, - obj: location, - key: item.key, - root: item.root - }; - } else { - unresolvedRefs[resolved] = { - root: item.root, - location: item.location - }; - } -}; - -Resolver.prototype.finish = function (spec, root, resolutionTable, resolvedRefs, unresolvedRefs, callback) { - // walk resolution table and replace with resolved refs - var ref; - for (ref in resolutionTable) { - var item = resolutionTable[ref]; - - var key = item.key; - var resolvedTo = resolvedRefs[key]; - if (resolvedTo) { - spec.definitions = spec.definitions || {}; - if (item.resolveAs === 'ref') { - for (key in resolvedTo.obj) { - var abs = this.retainRoot(resolvedTo.obj[key], item.root); - } - spec.definitions[resolvedTo.name] = resolvedTo.obj; - item.obj.$ref = '#/definitions/' + resolvedTo.name; - } else if (item.resolveAs === 'inline') { - var targetObj = item.obj; - targetObj['x-resolved-from'] = [ item.key ]; - delete targetObj.$ref; - - for (key in resolvedTo.obj) { - var abs = this.retainRoot(resolvedTo.obj[key], item.root); - targetObj[key] = abs; - } - } - } - } - var existingUnresolved = this.countUnresolvedRefs(spec); - - if(existingUnresolved.length === 0 || this.iteration > 5) { - this.resolveAllOf(spec.definitions); - callback.call(this.scope, spec, unresolvedRefs); - } - else { - this.iteration += 1; - this.resolve(spec, root, callback, this.scope); - } -}; - -Resolver.prototype.countUnresolvedRefs = function(spec) { - var i; - var refs = this.getRefs(spec); - var keys = []; - var unresolvedKeys = []; - for(i in refs) { - if(i.indexOf('#') === 0) { - keys.push(i.substring(1)); - } - else { - unresolvedKeys.push(i); - } - } - - // verify possible keys - for (i = 0; i < keys.length; i++) { - var part = keys[i]; - var parts = part.split('/'); - var obj = spec; - - for (var k = 0; k < parts.length; k++) { - var key = parts[k]; - if(key !== '') { - obj = obj[key]; - if(typeof obj === 'undefined') { - unresolvedKeys.push(part); - break; - } - } - } - } - return unresolvedKeys.length; -}; - -Resolver.prototype.getRefs = function(spec, obj) { - obj = obj || spec; - var output = {}; - for(var key in obj) { - if (!obj.hasOwnProperty(key)) { - continue; - } - var item = obj[key]; - if(key === '$ref' && typeof item === 'string') { - output[item] = null; - } - else if(_.isObject(item)) { - var o = this.getRefs(item); - for(var k in o) { - output[k] = null; - } - } - } - return output; -}; - -Resolver.prototype.retainRoot = function(obj, root) { - // walk object and look for relative $refs - for(var key in obj) { - var item = obj[key]; - if(key === '$ref' && typeof item === 'string') { - // stop and inspect - if(item.indexOf('http://') !== 0 && item.indexOf('https://') !== 0) { - if(item.indexOf('#') !== 0) { - item = '#' + item; - } - item = (root || '') + item; - obj[key] = item; - } - } - else if(_.isObject(item)) { - this.retainRoot(item, root); - } - } - return obj; -}; - -/** - * immediately in-lines local refs, queues remote refs - * for inline resolution - */ -Resolver.prototype.resolveInline = function (root, spec, property, resolutionTable, unresolvedRefs, location) { - var key = property.$ref, ref = property.$ref, i, p, p2, rs; - var rootTrimmed = false; - if (ref) { - if(ref.indexOf('../') === 0) { - // reset root - p = ref.split('../'); - p2 = root.split('/'); - ref = ''; - for(i = 0; i < p.length; i++) { - if(p[i] === '') { - p2 = p2.slice(0, p2.length-1); - } - else { - ref += p[i]; - } - } - root = ''; - for(i = 0; i < p2.length - 1; i++) { - if(i > 0) { root += '/'; } - root += p2[i]; - } - rootTrimmed = true; - } - if(ref.indexOf('#') >= 0) { - if(ref.indexOf('/') === 0) { - rs = ref.split('#'); - p = root.split('//'); - p2 = p[1].split('/'); - root = p[0] + '//' + p2[0] + rs[0]; - location = rs[1]; - } - else { - rs = ref.split('#'); - if(rs[0] !== '') { - p2 = root.split('/'); - p2 = p2.slice(0, p2.length - 1); - if(!rootTrimmed) { - root = ''; - for (var k = 0; k < p2.length; k++) { - if(k > 0) { root += '/'; } - root += p2[k]; - } - } - root += '/' + ref.split('#')[0]; - } - location = rs[1]; - } - } - if (ref.indexOf('http') === 0) { - if(ref.indexOf('#') >= 0) { - root = ref.split('#')[0]; - location = ref.split('#')[1]; - } - else { - root = ref; - location = ''; - } - resolutionTable.push({obj: property, resolveAs: 'inline', root: root, key: key, location: location}); - } else if (ref.indexOf('#') === 0) { - location = ref.split('#')[1]; - resolutionTable.push({obj: property, resolveAs: 'inline', root: root, key: key, location: location}); - } - else { - resolutionTable.push({obj: property, resolveAs: 'inline', root: root, key: key, location: location}); - } - } else if (property.type === 'array') { - this.resolveTo(root, property.items, resolutionTable, location); - } -}; - -Resolver.prototype.resolveTo = function (root, property, resolutionTable, location) { - var sp, i; - var ref = property.$ref; - var lroot = root; - if (typeof ref !== 'undefined') { - if(ref.indexOf('#') >= 0) { - var parts = ref.split('#'); - - // #/definitions/foo - // foo.json#/bar - if(parts[0] && ref.indexOf('/') === 0) { - - } - else if(parts[0] && ref.indexOf('http') === 0) { - - } - else if(parts[0] && parts[0].length > 0) { - // relative file - sp = root.split('/'); - lroot = ''; - for(i = 0; i < sp.length - 1; i++) { - lroot += sp[i] + '/'; - } - lroot += parts[0]; - } - else { - - } - - location = parts[1]; - } - else { - // relative file - sp = root.split('/'); - lroot = ''; - for(i = 0; i < sp.length - 1; i++) { - lroot += sp[i] + '/'; - } - lroot += ref; - location = ''; - } - resolutionTable.push({ - obj: property, resolveAs: 'ref', root: lroot, key: ref, location: location - }); - } else if (property.type === 'array') { - var items = property.items; - this.resolveTo(root, items, resolutionTable, location); - } -}; - -Resolver.prototype.resolveAllOf = function(spec, obj, depth) { - depth = depth || 0; - obj = obj || spec; - var name; - for(var key in obj) { - if (!obj.hasOwnProperty(key)) { - continue; - } - var item = obj[key]; - if(item === null) { - throw new TypeError('Swagger 2.0 does not support null types (' + obj + '). See https://github.com/swagger-api/swagger-spec/issues/229.'); - } - if(typeof item === 'object') { - this.resolveAllOf(spec, item, depth + 1); - } - if(item && typeof item.allOf !== 'undefined') { - var allOf = item.allOf; - if(_.isArray(allOf)) { - var output = {}; - output['x-composed'] = true; - if (typeof item['x-resolved-from'] !== 'undefined') { - output['x-resolved-from'] = item['x-resolved-from']; - } - output.properties = {}; - if ( item.example ){ - output.example = item.example; - } - for(var i = 0; i < allOf.length; i++) { - var component = allOf[i]; - var source = 'self'; - if(typeof component['x-resolved-from'] !== 'undefined') { - source = component['x-resolved-from'][0]; - } - - for(var part in component) { - if(!output.hasOwnProperty(part)) { - output[part] = JSON.parse(JSON.stringify(component[part])); - if(part === 'properties') { - for(name in output[part]) { - output[part][name]['x-resolved-from'] = source; - } - } - } - else { - if(part === 'properties') { - var properties = component[part]; - for(name in properties) { - output.properties[name] = JSON.parse(JSON.stringify(properties[name])); - var resolvedFrom = properties[name]['x-resolved-from']; - if (typeof resolvedFrom === 'undefined' || resolvedFrom === 'self') { - resolvedFrom = source; - } - output.properties[name]['x-resolved-from'] = resolvedFrom; - } - } - else if(part === 'required') { - // merge & dedup the required array - var a = output.required.concat(component[part]); - for(var k = 0; k < a.length; ++k) { - for(var j = k + 1; j < a.length; ++j) { - if(a[k] === a[j]) { a.splice(j--, 1); } - } - } - output.required = a; - } - else if(part === 'x-resolved-from') { - output['x-resolved-from'].push(source); - } - else { - // TODO: need to merge this property - // console.log('what to do with ' + part) - } - } - } - } - obj[key] = output; - } - } - if(_.isObject(item)) { - this.resolveAllOf(spec, item, depth + 1); - } - } -}; - -},{"./http":5,"lodash-compat/lang/isArray":143,"lodash-compat/lang/isObject":147}],7:[function(require,module,exports){ -'use strict'; - -var Helpers = require('./helpers'); - -var _ = { - isPlainObject: require('lodash-compat/lang/isPlainObject'), - isUndefined: require('lodash-compat/lang/isUndefined'), - isArray: require('lodash-compat/lang/isArray'), - isObject: require('lodash-compat/lang/isObject'), - isEmpty: require('lodash-compat/lang/isEmpty'), - map: require('lodash-compat/collection/map'), - indexOf: require('lodash-compat/array/indexOf'), - cloneDeep: require('lodash-compat/lang/cloneDeep'), - keys: require('lodash-compat/object/keys'), - forEach: require('lodash-compat/collection/forEach') -}; - -module.exports.optionHtml = optionHtml; -module.exports.typeFromJsonSchema = typeFromJsonSchema; -module.exports.getStringSignature = getStringSignature; -module.exports.schemaToHTML = schemaToHTML; -module.exports.schemaToJSON = schemaToJSON; - -function optionHtml(label, value) { - return '' + label + ':' + value + ''; -} - -function typeFromJsonSchema(type, format) { - var str; - - if (type === 'integer' && format === 'int32') { - str = 'integer'; - } else if (type === 'integer' && format === 'int64') { - str = 'long'; - } else if (type === 'integer' && typeof format === 'undefined') { - str = 'long'; - } else if (type === 'string' && format === 'date-time') { - str = 'date-time'; - } else if (type === 'string' && format === 'date') { - str = 'date'; - } else if (type === 'number' && format === 'float') { - str = 'float'; - } else if (type === 'number' && format === 'double') { - str = 'double'; - } else if (type === 'number' && typeof format === 'undefined') { - str = 'double'; - } else if (type === 'boolean') { - str = 'boolean'; - } else if (type === 'string') { - str = 'string'; - } - - return str; -} - -function getStringSignature(obj, baseComponent) { - var str = ''; - - if (typeof obj.$ref !== 'undefined') { - str += Helpers.simpleRef(obj.$ref); - } else if (typeof obj.type === 'undefined') { - str += 'object'; - } else if (obj.type === 'array') { - if (baseComponent) { - str += getStringSignature((obj.items || obj.$ref || {})); - } else { - str += 'Array['; - str += getStringSignature((obj.items || obj.$ref || {})); - str += ']'; - } - } else if (obj.type === 'integer' && obj.format === 'int32') { - str += 'integer'; - } else if (obj.type === 'integer' && obj.format === 'int64') { - str += 'long'; - } else if (obj.type === 'integer' && typeof obj.format === 'undefined') { - str += 'long'; - } else if (obj.type === 'string' && obj.format === 'date-time') { - str += 'date-time'; - } else if (obj.type === 'string' && obj.format === 'date') { - str += 'date'; - } else if (obj.type === 'string' && typeof obj.format === 'undefined') { - str += 'string'; - } else if (obj.type === 'number' && obj.format === 'float') { - str += 'float'; - } else if (obj.type === 'number' && obj.format === 'double') { - str += 'double'; - } else if (obj.type === 'number' && typeof obj.format === 'undefined') { - str += 'double'; - } else if (obj.type === 'boolean') { - str += 'boolean'; - } else if (obj.$ref) { - str += Helpers.simpleRef(obj.$ref); - } else { - str += obj.type; - } - - return str; -} - -function schemaToJSON(schema, models, modelsToIgnore, modelPropertyMacro) { - // Resolve the schema (Handle nested schemas) - schema = Helpers.resolveSchema(schema); - - if(typeof modelPropertyMacro !== 'function') { - modelPropertyMacro = function(prop){ - return (prop || {}).default; - }; - } - - modelsToIgnore= modelsToIgnore || {}; - - var type = schema.type || 'object'; - var format = schema.format; - var model; - var output; - - if (schema.example) { - output = schema.example; - } else if (_.isUndefined(schema.items) && _.isArray(schema.enum)) { - output = schema.enum[0]; - } - - if (_.isUndefined(output)) { - if (schema.$ref) { - model = models[Helpers.simpleRef(schema.$ref)]; - - if (!_.isUndefined(model)) { - if (_.isUndefined(modelsToIgnore[model.name])) { - modelsToIgnore[model.name] = model; - output = schemaToJSON(model.definition, models, modelsToIgnore, modelPropertyMacro); - delete modelsToIgnore[model.name]; - } else { - if (model.type === 'array') { - output = []; - } else { - output = {}; - } - } - } - } else if (!_.isUndefined(schema.default)) { - output = schema.default; - } else if (type === 'string') { - if (format === 'date-time') { - output = new Date().toISOString(); - } else if (format === 'date') { - output = new Date().toISOString().split('T')[0]; - } else { - output = 'string'; - } - } else if (type === 'integer') { - output = 0; - } else if (type === 'number') { - output = 0.0; - } else if (type === 'boolean') { - output = true; - } else if (type === 'object') { - output = {}; - - _.forEach(schema.properties, function (property, name) { - var cProperty = _.cloneDeep(property); - - // Allow macro to set the default value - cProperty.default = modelPropertyMacro(property); - - output[name] = schemaToJSON(cProperty, models, modelsToIgnore, modelPropertyMacro); - }); - } else if (type === 'array') { - output = []; - - if (_.isArray(schema.items)) { - _.forEach(schema.items, function (item) { - output.push(schemaToJSON(item, models, modelsToIgnore, modelPropertyMacro)); - }); - } else if (_.isPlainObject(schema.items)) { - output.push(schemaToJSON(schema.items, models, modelsToIgnore, modelPropertyMacro)); - } else if (_.isUndefined(schema.items)) { - output.push({}); - } else { - Helpers.log('Array type\'s \'items\' property is not an array or an object, cannot process'); - } - } - } - - return output; -} - -function schemaToHTML(name, schema, models, modelPropertyMacro) { - - var strongOpen = ''; - var strongClose = ''; - - // Allow for ignoring the 'name' argument.... shifting the rest - if(_.isObject(arguments[0])) { - name = void 0; - schema = arguments[0]; - models = arguments[1]; - modelPropertyMacro = arguments[2]; - } - - models = models || {}; - - // Resolve the schema (Handle nested schemas) - schema = Helpers.resolveSchema(schema); - - // Return for empty object - if(_.isEmpty(schema)) { - return strongOpen + 'Empty' + strongClose; - } - - // Dereference $ref from 'models' - if(typeof schema.$ref === 'string') { - name = Helpers.simpleRef(schema.$ref); - schema = models[name]; - if(typeof schema === 'undefined') - { - return strongOpen + name + ' is not defined!' + strongClose; - } - } - - if(typeof name !== 'string') { - name = schema.title || 'Inline Model'; - } - - // If we are a Model object... adjust accordingly - if(schema.definition) { - schema = schema.definition; - } - - if(typeof modelPropertyMacro !== 'function') { - modelPropertyMacro = function(prop){ - return (prop || {}).default; - }; - } - - var references = {}; - var seenModels = []; - var inlineModels = 0; - - - - // Generate current HTML - var html = processModel(schema, name); - - // Generate references HTML - while (_.keys(references).length > 0) { - /* jshint ignore:start */ - _.forEach(references, function (schema, name) { - var seenModel = _.indexOf(seenModels, name) > -1; - - delete references[name]; - - if (!seenModel) { - seenModels.push(name); - - html += '
      ' + processModel(schema, name); - } - }); - /* jshint ignore:end */ - } - - return html; - - ///////////////////////////////// - - function addReference(schema, name, skipRef) { - var modelName = name; - var model; - - if (schema.$ref) { - modelName = schema.title || Helpers.simpleRef(schema.$ref); - model = models[modelName]; - } else if (_.isUndefined(name)) { - modelName = schema.title || 'Inline Model ' + (++inlineModels); - model = {definition: schema}; - } - - if (skipRef !== true) { - references[modelName] = _.isUndefined(model) ? {} : model.definition; - } - - return modelName; - } - - function primitiveToHTML(schema) { - var html = ''; - var type = schema.type || 'object'; - - if (schema.$ref) { - html += addReference(schema, Helpers.simpleRef(schema.$ref)); - } else if (type === 'object') { - if (!_.isUndefined(schema.properties)) { - html += addReference(schema); - } else { - html += 'object'; - } - } else if (type === 'array') { - html += 'Array['; - - if (_.isArray(schema.items)) { - html += _.map(schema.items, addReference).join(','); - } else if (_.isPlainObject(schema.items)) { - if (_.isUndefined(schema.items.$ref)) { - if (!_.isUndefined(schema.items.type) && _.indexOf(['array', 'object'], schema.items.type) === -1) { - html += schema.items.type; - } else { - html += addReference(schema.items); - } - } else { - html += addReference(schema.items, Helpers.simpleRef(schema.items.$ref)); - } - } else { - Helpers.log('Array type\'s \'items\' schema is not an array or an object, cannot process'); - html += 'object'; - } - - html += ']'; - } else { - html += schema.type; - } - - html += ''; - - return html; - } - - function primitiveToOptionsHTML(schema, html) { - var options = ''; - var type = schema.type || 'object'; - var isArray = type === 'array'; - - if (isArray) { - if (_.isPlainObject(schema.items) && !_.isUndefined(schema.items.type)) { - type = schema.items.type; - } else { - type = 'object'; - } - } - - if (!_.isUndefined(schema.default)) { - options += optionHtml('Default', schema.default); - } - - switch (type) { - case 'string': - if (schema.minLength) { - options += optionHtml('Min. Length', schema.minLength); - } - - if (schema.maxLength) { - options += optionHtml('Max. Length', schema.maxLength); - } - - if (schema.pattern) { - options += optionHtml('Reg. Exp.', schema.pattern); - } - break; - case 'integer': - case 'number': - if (schema.minimum) { - options += optionHtml('Min. Value', schema.minimum); - } - - if (schema.exclusiveMinimum) { - options += optionHtml('Exclusive Min.', 'true'); - } - - if (schema.maximum) { - options += optionHtml('Max. Value', schema.maximum); - } - - if (schema.exclusiveMaximum) { - options += optionHtml('Exclusive Max.', 'true'); - } - - if (schema.multipleOf) { - options += optionHtml('Multiple Of', schema.multipleOf); - } - - break; - } - - if (isArray) { - if (schema.minItems) { - options += optionHtml('Min. Items', schema.minItems); - } - - if (schema.maxItems) { - options += optionHtml('Max. Items', schema.maxItems); - } - - if (schema.uniqueItems) { - options += optionHtml('Unique Items', 'true'); - } - - if (schema.collectionFormat) { - options += optionHtml('Coll. Format', schema.collectionFormat); - } - } - - if (_.isUndefined(schema.items)) { - if (_.isArray(schema.enum)) { - var enumString; - - if (type === 'number' || type === 'integer') { - enumString = schema.enum.join(', '); - } else { - enumString = '"' + schema.enum.join('", "') + '"'; - } - - options += optionHtml('Enum', enumString); - } - } - - if (options.length > 0) { - html = '' + html + '' + options + '
      ' + type + '
      '; - } - - return html; - } - - function processModel(schema, name) { - var type = schema.type || 'object'; - var isArray = schema.type === 'array'; - var html = strongOpen + name + ' ' + (isArray ? '[' : '{') + strongClose; - - if (name) { - seenModels.push(name); - } - - if (isArray) { - if (_.isArray(schema.items)) { - html += '
      ' + _.map(schema.items, function (item) { - var type = item.type || 'object'; - - if (_.isUndefined(item.$ref)) { - if (_.indexOf(['array', 'object'], type) > -1) { - if (type === 'object' && _.isUndefined(item.properties)) { - return 'object'; - } else { - return addReference(item); - } - } else { - return primitiveToOptionsHTML(item, type); - } - } else { - return addReference(item, Helpers.simpleRef(item.$ref)); - } - }).join(',
      '); - } else if (_.isPlainObject(schema.items)) { - if (_.isUndefined(schema.items.$ref)) { - if (_.indexOf(['array', 'object'], schema.items.type || 'object') > -1) { - if ((_.isUndefined(schema.items.type) || schema.items.type === 'object') && _.isUndefined(schema.items.properties)) { - html += '
      object
      '; - } else { - html += '
      ' + addReference(schema.items) + '
      '; - } - } else { - html += '
      ' + primitiveToOptionsHTML(schema.items, schema.items.type) + '
      '; - } - } else { - html += '
      ' + addReference(schema.items, Helpers.simpleRef(schema.items.$ref)) + '
      '; - } - } else { - Helpers.log('Array type\'s \'items\' property is not an array or an object, cannot process'); - html += '
      object
      '; - } - } else { - if (schema.$ref) { - html += '
      ' + addReference(schema, name) + '
      '; - } else if (type === 'object') { - html += '
      '; - - if (_.isPlainObject(schema.properties)) { - html += _.map(schema.properties, function (property, name) { - var propertyIsRequired = (_.indexOf(schema.required, name) >= 0); - var cProperty = _.cloneDeep(property); - - var requiredClass = propertyIsRequired ? 'required' : ''; - var html = '' + name + ' ('; - var model; - - // Allow macro to set the default value - cProperty.default = modelPropertyMacro(cProperty); - - // Resolve the schema (Handle nested schemas) - cProperty = Helpers.resolveSchema(cProperty); - - // We need to handle property references to primitives (Issue 339) - if (!_.isUndefined(cProperty.$ref)) { - model = models[Helpers.simpleRef(cProperty.$ref)]; - - if (!_.isUndefined(model) && _.indexOf([undefined, 'array', 'object'], model.definition.type) === -1) { - // Use referenced schema - cProperty = Helpers.resolveSchema(model.definition); - } - } - - html += primitiveToHTML(cProperty); - - if(!propertyIsRequired) { - html += ', optional'; - } - - html += ')'; - - if (!_.isUndefined(cProperty.description)) { - html += ': ' + '' + cProperty.description + ''; - } - - if (cProperty.enum) { - html += ' = [\'' + cProperty.enum.join('\', \'') + '\']'; - } - - return primitiveToOptionsHTML(cProperty, html); - }).join(',
      '); - } - - html += '
      '; - } else { - html += '
      ' + primitiveToOptionsHTML(schema, type) + '
      '; - } - } - - return html + strongOpen + (isArray ? ']' : '}') + strongClose; - } -} - -},{"./helpers":4,"lodash-compat/array/indexOf":52,"lodash-compat/collection/forEach":57,"lodash-compat/collection/map":59,"lodash-compat/lang/cloneDeep":141,"lodash-compat/lang/isArray":143,"lodash-compat/lang/isEmpty":144,"lodash-compat/lang/isObject":147,"lodash-compat/lang/isPlainObject":148,"lodash-compat/lang/isUndefined":151,"lodash-compat/object/keys":152}],8:[function(require,module,exports){ -'use strict'; - -var SwaggerHttp = require('./http'); -var _ = { - isObject: require('lodash-compat/lang/isObject') -}; - -var SwaggerSpecConverter = module.exports = function () { - this.errors = []; - this.warnings = []; - this.modelMap = {}; -}; - -SwaggerSpecConverter.prototype.setDocumentationLocation = function (location) { - this.docLocation = location; -}; - -/** - * converts a resource listing OR api declaration - **/ -SwaggerSpecConverter.prototype.convert = function (obj, clientAuthorizations, callback) { - // not a valid spec - if(!obj || !Array.isArray(obj.apis)) { - return this.finish(callback, null); - } - this.clientAuthorizations = clientAuthorizations; - - // create a new swagger object to return - var swagger = { swagger: '2.0' }; - - swagger.originalVersion = obj.swaggerVersion; - - // add the info - this.apiInfo(obj, swagger); - - // add security definitions - this.securityDefinitions(obj, swagger); - - // take basePath into account - if (obj.basePath) { - this.setDocumentationLocation(obj.basePath); - } - - // see if this is a single-file swagger definition - var isSingleFileSwagger = false; - var i; - for(i = 0; i < obj.apis.length; i++) { - var api = obj.apis[i]; - if(Array.isArray(api.operations)) { - isSingleFileSwagger = true; - } - } - if(isSingleFileSwagger) { - this.declaration(obj, swagger); - this.finish(callback, swagger); - } - else { - this.resourceListing(obj, swagger, callback); - } -}; - -SwaggerSpecConverter.prototype.declaration = function(obj, swagger) { - var name, i, p, pos; - if(!obj.apis) { - return; - } - - if (obj.basePath.indexOf('http://') === 0) { - p = obj.basePath.substring('http://'.length); - pos = p.indexOf('/'); - if (pos > 0) { - swagger.host = p.substring(0, pos); - swagger.basePath = p.substring(pos); - } - else { - swagger.host = p; - swagger.basePath = '/'; - } - } else if (obj.basePath.indexOf('https://') === 0) { - p = obj.basePath.substring('https://'.length); - pos = p.indexOf('/'); - if (pos > 0) { - swagger.host = p.substring(0, pos); - swagger.basePath = p.substring(pos); - } - else { - swagger.host = p; - swagger.basePath = '/'; - } - } else { - swagger.basePath = obj.basePath; - } - - var resourceLevelAuth; - if(obj.authorizations) { - resourceLevelAuth = obj.authorizations; - } - if(obj.consumes) { - swagger.consumes = obj.consumes; - } - if(obj.produces) { - swagger.produces = obj.produces; - } - - // build a mapping of id to name for 1.0 model resolutions - if(_.isObject(obj)) { - for(name in obj.models) { - var existingModel = obj.models[name]; - var key = (existingModel.id || name); - this.modelMap[key] = name; - } - } - - for(i = 0; i < obj.apis.length; i++) { - var api = obj.apis[i]; - var path = api.path; - var operations = api.operations; - this.operations(path, obj.resourcePath, operations, resourceLevelAuth, swagger); - } - - var models = obj.models || {}; - this.models(models, swagger); -}; - -SwaggerSpecConverter.prototype.models = function(obj, swagger) { - if(!_.isObject(obj)) { - return; - } - var name; - - swagger.definitions = swagger.definitions || {}; - for(name in obj) { - var existingModel = obj[name]; - var _enum = []; - var schema = { properties: {}}; - var propertyName; - for(propertyName in existingModel.properties) { - var existingProperty = existingModel.properties[propertyName]; - var property = {}; - this.dataType(existingProperty, property); - if(existingProperty.description) { - property.description = existingProperty.description; - } - if(existingProperty['enum']) { - property['enum'] = existingProperty['enum']; - } - if(typeof existingProperty.required === 'boolean' && existingProperty.required === true) { - _enum.push(propertyName); - } - if(typeof existingProperty.required === 'string' && existingProperty.required === 'true') { - _enum.push(propertyName); - } - schema.properties[propertyName] = property; - } - if(_enum.length > 0) { - schema['enum'] = _enum; - } - - schema.required = existingModel.required; - swagger.definitions[name] = schema; - } -}; - -SwaggerSpecConverter.prototype.extractTag = function(resourcePath) { - var pathString = resourcePath || 'default'; - if(pathString.indexOf('http:') === 0 || pathString.indexOf('https:') === 0) { - pathString = pathString.split(['/']); - pathString = pathString[pathString.length -1].substring(); - } - if(pathString.endsWith('.json')) { - pathString = pathString.substring(0, pathString.length - '.json'.length); - } - return pathString.replace('/',''); -}; - -SwaggerSpecConverter.prototype.operations = function(path, resourcePath, obj, resourceLevelAuth, swagger) { - if(!Array.isArray(obj)) { - return; - } - var i; - - if(!swagger.paths) { - swagger.paths = {}; - } - - var pathObj = swagger.paths[path] || {}; - var tag = this.extractTag(resourcePath); - swagger.tags = swagger.tags || []; - var matched = false; - for(i = 0; i < swagger.tags.length; i++) { - var tagObject = swagger.tags[i]; - if(tagObject.name === tag) { - matched = true; - } - } - if(!matched) { - swagger.tags.push({name: tag}); - } - - for(i = 0; i < obj.length; i++) { - var existingOperation = obj[i]; - var method = (existingOperation.method || existingOperation.httpMethod).toLowerCase(); - var operation = {tags: [tag]}; - var existingAuthorizations = existingOperation.authorizations; - - if(existingAuthorizations && Object.keys(existingAuthorizations).length === 0) { - existingAuthorizations = resourceLevelAuth; - } - - if(typeof existingAuthorizations !== 'undefined') { - var scopesObject; - for(var key in existingAuthorizations) { - operation.security = operation.security || []; - var scopes = existingAuthorizations[key]; - if(scopes) { - var securityScopes = []; - for(var j in scopes) { - securityScopes.push(scopes[j].scope); - } - scopesObject = {}; - scopesObject[key] = securityScopes; - operation.security.push(scopesObject); - } - else { - scopesObject = {}; - scopesObject[key] = []; - operation.security.push(scopesObject); - } - } - } - - if(existingOperation.consumes) { - operation.consumes = existingOperation.consumes; - } - else if(swagger.consumes) { - operation.consumes = swagger.consumes; - } - if(existingOperation.produces) { - operation.produces = existingOperation.produces; - } - else if(swagger.produces) { - operation.produces = swagger.produces; - } - if(existingOperation.summary) { - operation.summary = existingOperation.summary; - } - if(existingOperation.notes) { - operation.description = existingOperation.notes; - } - if(existingOperation.nickname) { - operation.operationId = existingOperation.nickname; - } - if(existingOperation.deprecated) { - operation.deprecated = existingOperation.deprecated; - } - - this.authorizations(existingAuthorizations, swagger); - this.parameters(operation, existingOperation.parameters, swagger); - this.responseMessages(operation, existingOperation, swagger); - - pathObj[method] = operation; - } - - swagger.paths[path] = pathObj; -}; - -SwaggerSpecConverter.prototype.responseMessages = function(operation, existingOperation) { - if(!_.isObject(existingOperation)) { - return; - } - // build default response from the operation (1.x) - var defaultResponse = {}; - this.dataType(existingOperation, defaultResponse); - // TODO: look into the real problem of rendering responses in swagger-ui - // ....should reponseType have an implicit schema? - if(!defaultResponse.schema && defaultResponse.type) { - defaultResponse = {schema: defaultResponse}; - } - - operation.responses = operation.responses || {}; - - // grab from responseMessages (1.2) - var has200 = false; - if(Array.isArray(existingOperation.responseMessages)) { - var i; - var existingResponses = existingOperation.responseMessages; - for(i = 0; i < existingResponses.length; i++) { - var existingResponse = existingResponses[i]; - var response = { description: existingResponse.message }; - if(existingResponse.code === 200) { - has200 = true; - } - // Convert responseModel -> schema{$ref: responseModel} - if(existingResponse.responseModel) { - response.schema = {'$ref': existingResponse.responseModel}; - } - operation.responses['' + existingResponse.code] = response; - } - } - - if(has200) { - operation.responses['default'] = defaultResponse; - } - else { - operation.responses['200'] = defaultResponse; - } -}; - -SwaggerSpecConverter.prototype.authorizations = function(obj) { - // TODO - if(!_.isObject(obj)) { - return; - } -}; - -SwaggerSpecConverter.prototype.parameters = function(operation, obj) { - if(!Array.isArray(obj)) { - return; - } - var i; - for(i = 0; i < obj.length; i++) { - var existingParameter = obj[i]; - var parameter = {}; - parameter.name = existingParameter.name; - parameter.description = existingParameter.description; - parameter.required = existingParameter.required; - parameter.in = existingParameter.paramType; - - // per #168 - if(parameter.in === 'body') { - parameter.name = 'body'; - } - if(parameter.in === 'form') { - parameter.in = 'formData'; - } - - if(existingParameter.enum) { - parameter.enum = existingParameter.enum; - } - - if(existingParameter.allowMultiple === true || existingParameter.allowMultiple === 'true') { - var innerType = {}; - this.dataType(existingParameter, innerType); - parameter.type = 'array'; - parameter.items = innerType; - - if(existingParameter.allowableValues) { - var av = existingParameter.allowableValues; - if(av.valueType === 'LIST') { - parameter['enum'] = av.values; - } - } - } - else { - this.dataType(existingParameter, parameter); - } - - operation.parameters = operation.parameters || []; - operation.parameters.push(parameter); - } -}; - -SwaggerSpecConverter.prototype.dataType = function(source, target) { - if(!_.isObject(source)) { - return; - } - - if(source.minimum) { - target.minimum = source.minimum; - } - if(source.maximum) { - target.maximum = source.maximum; - } - if (source.format) { - target.format = source.format; - } - - // default can be 'false' - if(typeof source.defaultValue !== 'undefined') { - target.default = source.defaultValue; - } - - var jsonSchemaType = this.toJsonSchema(source); - if(jsonSchemaType) { - target = target || {}; - if(jsonSchemaType.type) { - target.type = jsonSchemaType.type; - } - if(jsonSchemaType.format) { - target.format = jsonSchemaType.format; - } - if(jsonSchemaType.$ref) { - target.schema = {$ref: jsonSchemaType.$ref}; - } - if(jsonSchemaType.items) { - target.items = jsonSchemaType.items; - } - } -}; - -SwaggerSpecConverter.prototype.toJsonSchema = function(source) { - if(!source) { - return 'object'; - } - var detectedType = (source.type || source.dataType || source.responseClass || ''); - var lcType = detectedType.toLowerCase(); - var format = (source.format || '').toLowerCase(); - - if(lcType.indexOf('list[') === 0) { - var innerType = detectedType.substring(5, detectedType.length - 1); - var jsonType = this.toJsonSchema({type: innerType}); - return {type: 'array', items: jsonType}; - } - else if(lcType === 'int' || (lcType === 'integer' && format === 'int32')) - {return {type: 'integer', format: 'int32'};} - else if(lcType === 'long' || (lcType === 'integer' && format === 'int64')) - {return {type: 'integer', format: 'int64'};} - else if(lcType === 'integer') - {return {type: 'integer', format: 'int64'};} - else if(lcType === 'float' || (lcType === 'number' && format === 'float')) - {return {type: 'number', format: 'float'};} - else if(lcType === 'double' || (lcType === 'number' && format === 'double')) - {return {type: 'number', format: 'double'};} - else if((lcType === 'string' && format === 'date-time') || (lcType === 'date')) - {return {type: 'string', format: 'date-time'};} - else if(lcType === 'string') - {return {type: 'string'};} - else if(lcType === 'file') - {return {type: 'file'};} - else if(lcType === 'boolean') - {return {type: 'boolean'};} - else if(lcType === 'array' || lcType === 'list') { - if(source.items) { - var it = this.toJsonSchema(source.items); - return {type: 'array', items: it}; - } - else { - return {type: 'array', items: {type: 'object'}}; - } - } - else if(source.$ref) { - return {$ref: '#/definitions/' + this.modelMap[source.$ref] || source.$ref}; - } - else if(lcType === 'void' || lcType === '') - {return {};} - else { - return {$ref: '#/definitions/' + this.modelMap[source.type] || source.type}; - } -}; - -SwaggerSpecConverter.prototype.resourceListing = function(obj, swagger, callback) { - var i; - var processedCount = 0; // jshint ignore:line - var self = this; // jshint ignore:line - var expectedCount = obj.apis.length; - var _swagger = swagger; // jshint ignore:line - - if(expectedCount === 0) { - this.finish(callback, swagger); - } - - for(i = 0; i < expectedCount; i++) { - var api = obj.apis[i]; - var path = api.path; - var absolutePath = this.getAbsolutePath(obj.swaggerVersion, this.docLocation, path); - - if(api.description) { - swagger.tags = swagger.tags || []; - swagger.tags.push({ - name : this.extractTag(api.path), - description : api.description || '' - }); - } - var http = { - url: absolutePath, - headers: {accept: 'application/json'}, - on: {}, - method: 'get' - }; - /* jshint ignore:start */ - http.on.response = function(data) { - processedCount += 1; - var obj = data.obj; - if(obj) { - self.declaration(obj, _swagger); - } - if(processedCount === expectedCount) { - self.finish(callback, _swagger); - } - }; - http.on.error = function(data) { - console.error(data); - processedCount += 1; - if(processedCount === expectedCount) { - self.finish(callback, _swagger); - } - }; - /* jshint ignore:end */ - - if(this.clientAuthorizations && typeof this.clientAuthorizations.apply === 'function') { - this.clientAuthorizations.apply(http); - } - - new SwaggerHttp().execute(http); - } -}; - -SwaggerSpecConverter.prototype.getAbsolutePath = function(version, docLocation, path) { - if(version === '1.0') { - if(docLocation.endsWith('.json')) { - // get root path - var pos = docLocation.lastIndexOf('/'); - if(pos > 0) { - docLocation = docLocation.substring(0, pos); - } - } - } - - var location = docLocation; - if(path.indexOf('http://') === 0 || path.indexOf('https://') === 0) { - location = path; - } - else { - if(docLocation.endsWith('/')) { - location = docLocation.substring(0, docLocation.length - 1); - } - location += path; - } - location = location.replace('{format}', 'json'); - return location; -}; - -SwaggerSpecConverter.prototype.securityDefinitions = function(obj, swagger) { - if(obj.authorizations) { - var name; - for(name in obj.authorizations) { - var isValid = false; - var securityDefinition = {}; - var definition = obj.authorizations[name]; - if(definition.type === 'apiKey') { - securityDefinition.type = 'apiKey'; - securityDefinition.in = definition.passAs; - securityDefinition.name = definition.keyname || name; - isValid = true; - } - else if(definition.type === 'oauth2') { - var existingScopes = definition.scopes || []; - var scopes = {}; - var i; - for(i in existingScopes) { - var scope = existingScopes[i]; - scopes[scope.scope] = scope.description; - } - securityDefinition.type = 'oauth2'; - if(i > 0) { - securityDefinition.scopes = scopes; - } - if(definition.grantTypes) { - if(definition.grantTypes.implicit) { - var implicit = definition.grantTypes.implicit; - securityDefinition.flow = 'implicit'; - securityDefinition.authorizationUrl = implicit.loginEndpoint; - isValid = true; - } - /* jshint ignore:start */ - if(definition.grantTypes['authorization_code']) { - if(!securityDefinition.flow) { - // cannot set if flow is already defined - var authCode = definition.grantTypes['authorization_code']; - securityDefinition.flow = 'accessCode'; - securityDefinition.authorizationUrl = authCode.tokenRequestEndpoint.url; - securityDefinition.tokenUrl = authCode.tokenEndpoint.url; - isValid = true; - } - } - /* jshint ignore:end */ - } - } - if(isValid) { - swagger.securityDefinitions = swagger.securityDefinitions || {}; - swagger.securityDefinitions[name] = securityDefinition; - } - } - } -}; - -SwaggerSpecConverter.prototype.apiInfo = function(obj, swagger) { - // info section - if(obj.info) { - var info = obj.info; - swagger.info = {}; - - if(info.contact) { - swagger.info.contact = {}; - swagger.info.contact.email = info.contact; - } - if(info.description) { - swagger.info.description = info.description; - } - if(info.title) { - swagger.info.title = info.title; - } - if(info.termsOfServiceUrl) { - swagger.info.termsOfService = info.termsOfServiceUrl; - } - if(info.license || info.licenseUrl) { - swagger.license = {}; - if(info.license) { - swagger.license.name = info.license; - } - if(info.licenseUrl) { - swagger.license.url = info.licenseUrl; - } - } - } - else { - this.warnings.push('missing info section'); - } -}; - -SwaggerSpecConverter.prototype.finish = function (callback, obj) { - callback(obj); -}; - -},{"./http":5,"lodash-compat/lang/isObject":147}],9:[function(require,module,exports){ -'use strict'; - -var _ = { - isPlainObject: require('lodash-compat/lang/isPlainObject'), - isString: require('lodash-compat/lang/isString'), -}; - -var SchemaMarkup = require('../schema-markup.js'); -var jsyaml = require('js-yaml'); - -var Model = module.exports = function (name, definition, models, modelPropertyMacro) { - this.definition = definition || {}; - this.isArray = definition.type === 'array'; - this.models = models || {}; - this.name = definition.title || name || 'Inline Model'; - this.modelPropertyMacro = modelPropertyMacro || function (property) { - return property.default; - }; - - return this; -}; - -Model.prototype.createJSONSample = Model.prototype.getSampleValue = function (modelsToIgnore) { - modelsToIgnore = modelsToIgnore || {}; - - modelsToIgnore[this.name] = this; - - // Response support - if (this.examples && _.isPlainObject(this.examples) && this.examples['application/json']) { - this.definition.example = this.examples['application/json']; - - if (_.isString(this.definition.example)) { - this.definition.example = jsyaml.safeLoad(this.definition.example); - } - } else if (!this.definition.example) { - this.definition.example = this.examples; - } - - return SchemaMarkup.schemaToJSON(this.definition, this.models, modelsToIgnore, this.modelPropertyMacro); -}; - -Model.prototype.getMockSignature = function () { - return SchemaMarkup.schemaToHTML(this.name, this.definition, this.models, this.modelPropertyMacro); -}; - -},{"../schema-markup.js":7,"js-yaml":21,"lodash-compat/lang/isPlainObject":148,"lodash-compat/lang/isString":149}],10:[function(require,module,exports){ -'use strict'; - -var _ = { - cloneDeep: require('lodash-compat/lang/cloneDeep'), - isUndefined: require('lodash-compat/lang/isUndefined'), - isEmpty: require('lodash-compat/lang/isEmpty'), - isObject: require('lodash-compat/lang/isObject') -}; -var helpers = require('../helpers'); -var Model = require('./model'); -var SwaggerHttp = require('../http'); - -var Operation = module.exports = function (parent, scheme, operationId, httpMethod, path, args, definitions, models, clientAuthorizations) { - var errors = []; - - parent = parent || {}; - args = args || {}; - - if(parent && parent.options) { - this.client = parent.options.client || null; - this.responseInterceptor = parent.options.responseInterceptor || null; - } - this.authorizations = args.security; - this.basePath = parent.basePath || '/'; - this.clientAuthorizations = clientAuthorizations; - this.consumes = args.consumes || parent.consumes || ['application/json']; - this.produces = args.produces || parent.produces || ['application/json']; - this.deprecated = args.deprecated; - this.description = args.description; - this.host = parent.host || 'localhost'; - this.method = (httpMethod || errors.push('Operation ' + operationId + ' is missing method.')); - this.models = models || {}; - this.nickname = (operationId || errors.push('Operations must have a nickname.')); - this.operation = args; - this.operations = {}; - this.parameters = args !== null ? (args.parameters || []) : {}; - this.parent = parent; - this.path = (path || errors.push('Operation ' + this.nickname + ' is missing path.')); - this.responses = (args.responses || {}); - this.scheme = scheme || parent.scheme || 'http'; - this.schemes = args.schemes || parent.schemes; - this.security = args.security; - this.summary = args.summary || ''; - this.type = null; - this.useJQuery = parent.useJQuery; - this.parameterMacro = parent.parameterMacro || function (operation, parameter) { - return parameter.default; - }; - - this.inlineModels = []; - - if (typeof this.deprecated === 'string') { - switch(this.deprecated.toLowerCase()) { - case 'true': case 'yes': case '1': { - this.deprecated = true; - break; - } - - case 'false': case 'no': case '0': case null: { - this.deprecated = false; - break; - } - - default: this.deprecated = Boolean(this.deprecated); - } - } - - var i, model; - - if (definitions) { - // add to global models - var key; - - for (key in definitions) { - model = new Model(key, definitions[key], this.models, parent.modelPropertyMacro); - - if (model) { - this.models[key] = model; - } - } - } - else { - definitions = {}; - } - - for (i = 0; i < this.parameters.length; i++) { - var param = this.parameters[i]; - - // Allow macro to set the default value - param.default = this.parameterMacro(this, param); - - if (param.type === 'array') { - param.isList = true; - param.allowMultiple = true; - // the enum can be defined at the items level - if (param.items && param.items.enum) { - param['enum'] = param.items.enum; - } - } - - var innerType = this.getType(param); - - if (innerType && innerType.toString().toLowerCase() === 'boolean') { - param.allowableValues = {}; - param.isList = true; - param['enum'] = [true, false]; // use actual primitives - } - - if (typeof param['enum'] !== 'undefined') { - var id; - - param.allowableValues = {}; - param.allowableValues.values = []; - param.allowableValues.descriptiveValues = []; - - for (id = 0; id < param['enum'].length; id++) { - var value = param['enum'][id]; - var isDefault = (value === param.default || value+'' === param.default); - - param.allowableValues.values.push(value); - // Always have string for descriptive values.... - param.allowableValues.descriptiveValues.push({value : value+'', isDefault: isDefault}); - } - } - - if (param.type === 'array') { - innerType = [innerType]; - - if (typeof param.allowableValues === 'undefined') { - // can't show as a list if no values to select from - delete param.isList; - delete param.allowMultiple; - } - } - - param.signature = this.getModelSignature(innerType, this.models).toString(); - param.sampleJSON = this.getModelSampleJSON(innerType, this.models); - param.responseClassSignature = param.signature; - } - - var defaultResponseCode, response, responses = this.responses; - - if (responses['200']) { - response = responses['200']; - defaultResponseCode = '200'; - } else if (responses['201']) { - response = responses['201']; - defaultResponseCode = '201'; - } else if (responses['202']) { - response = responses['202']; - defaultResponseCode = '202'; - } else if (responses['203']) { - response = responses['203']; - defaultResponseCode = '203'; - } else if (responses['204']) { - response = responses['204']; - defaultResponseCode = '204'; - } else if (responses['205']) { - response = responses['205']; - defaultResponseCode = '205'; - } else if (responses['206']) { - response = responses['206']; - defaultResponseCode = '206'; - } else if (responses['default']) { - response = responses['default']; - defaultResponseCode = 'default'; - } - - if (response && response.schema) { - var resolvedModel = this.resolveModel(response.schema, definitions); - var successResponse; - - delete responses[defaultResponseCode]; - - if (resolvedModel) { - this.successResponse = {}; - successResponse = this.successResponse[defaultResponseCode] = resolvedModel; - } else if (!response.schema.type || response.schema.type === 'object' || response.schema.type === 'array') { - // Inline model - this.successResponse = {}; - successResponse = this.successResponse[defaultResponseCode] = new Model(undefined, response.schema || {}, this.models, parent.modelPropertyMacro); - } else { - // Primitive - this.successResponse = {}; - successResponse = this.successResponse[defaultResponseCode] = response.schema; - } - - if (successResponse) { - // Attach response properties - if (response.description) { - successResponse.description = response.description; - } - - if (response.examples) { - successResponse.examples = response.examples; - } - - if (response.headers) { - successResponse.headers = response.headers; - } - } - - this.type = response; - } - - if (errors.length > 0) { - if (this.resource && this.resource.api && this.resource.api.fail) { - this.resource.api.fail(errors); - } - } - - return this; -}; - -Operation.prototype.isDefaultArrayItemValue = function(value, param) { - if (param.default && Array.isArray(param.default)) { - return param.default.indexOf(value) !== -1; - } - return value === param.default; -}; - -Operation.prototype.getType = function (param) { - var type = param.type; - var format = param.format; - var isArray = false; - var str; - - if (type === 'integer' && format === 'int32') { - str = 'integer'; - } else if (type === 'integer' && format === 'int64') { - str = 'long'; - } else if (type === 'integer') { - str = 'integer'; - } else if (type === 'string') { - if (format === 'date-time') { - str = 'date-time'; - } else if (format === 'date') { - str = 'date'; - } else { - str = 'string'; - } - } else if (type === 'number' && format === 'float') { - str = 'float'; - } else if (type === 'number' && format === 'double') { - str = 'double'; - } else if (type === 'number') { - str = 'double'; - } else if (type === 'boolean') { - str = 'boolean'; - } else if (type === 'array') { - isArray = true; - - if (param.items) { - str = this.getType(param.items); - } - } - - if (param.$ref) { - str = helpers.simpleRef(param.$ref); - } - - var schema = param.schema; - - if (schema) { - var ref = schema.$ref; - - if (ref) { - ref = helpers.simpleRef(ref); - - if (isArray) { - return [ ref ]; - } else { - return ref; - } - } else { - // If inline schema, we add it our interal hash -> which gives us it's ID (int) - if(schema.type === 'object') { - return this.addInlineModel(schema); - } - return this.getType(schema); - } - } - if (isArray) { - return [ str ]; - } else { - return str; - } -}; - -/** - * adds an inline schema (model) to a hash, where we can ref it later - * @param {object} schema a schema - * @return {number} the ID of the schema being added, or null - **/ -Operation.prototype.addInlineModel = function (schema) { - var len = this.inlineModels.length; - var model = this.resolveModel(schema, {}); - if(model) { - this.inlineModels.push(model); - return 'Inline Model '+len; // return string ref of the inline model (used with #getInlineModel) - } - return null; // report errors? -}; - -/** - * gets the internal ref to an inline model - * @param {string} inline_str a string reference to an inline model - * @return {Model} the model being referenced. Or null - **/ -Operation.prototype.getInlineModel = function(inlineStr) { - if(/^Inline Model \d+$/.test(inlineStr)) { - var id = parseInt(inlineStr.substr('Inline Model'.length).trim(),10); // - var model = this.inlineModels[id]; - return model; - } - // I'm returning null here, should I rather throw an error? - return null; -}; - -Operation.prototype.resolveModel = function (schema, definitions) { - if (typeof schema.$ref !== 'undefined') { - var ref = schema.$ref; - - if (ref.indexOf('#/definitions/') === 0) { - ref = ref.substring('#/definitions/'.length); - } - - if (definitions[ref]) { - return new Model(ref, definitions[ref], this.models, this.parent.modelPropertyMacro); - } - // schema must at least be an object to get resolved to an inline Model - } else if (schema && typeof schema === 'object' && - (schema.type === 'object' || _.isUndefined(schema.type))) { - return new Model(undefined, schema, this.models, this.parent.modelPropertyMacro); - } - - return null; -}; - -Operation.prototype.help = function (dontPrint) { - var out = this.nickname + ': ' + this.summary + '\n'; - - for (var i = 0; i < this.parameters.length; i++) { - var param = this.parameters[i]; - var typeInfo = param.signature; - - out += '\n * ' + param.name + ' (' + typeInfo + '): ' + param.description; - } - - if (typeof dontPrint === 'undefined') { - helpers.log(out); - } - - return out; -}; - -Operation.prototype.getModelSignature = function (type, definitions) { - var isPrimitive, listType; - - if (type instanceof Array) { - listType = true; - type = type[0]; - } - - // Convert undefined to string of 'undefined' - if (typeof type === 'undefined') { - type = 'undefined'; - isPrimitive = true; - - } else if (definitions[type]){ - // a model def exists? - type = definitions[type]; /* Model */ - isPrimitive = false; - - } else if (this.getInlineModel(type)) { - type = this.getInlineModel(type); /* Model */ - isPrimitive = false; - - } else { - // We default to primitive - isPrimitive = true; - } - - if (isPrimitive) { - if (listType) { - return 'Array[' + type + ']'; - } else { - return type.toString(); - } - } else { - if (listType) { - return 'Array[' + type.getMockSignature() + ']'; - } else { - return type.getMockSignature(); - } - } -}; - -Operation.prototype.supportHeaderParams = function () { - return true; -}; - -Operation.prototype.supportedSubmitMethods = function () { - return this.parent.supportedSubmitMethods; -}; - -Operation.prototype.getHeaderParams = function (args) { - var headers = this.setContentTypes(args, {}); - - for (var i = 0; i < this.parameters.length; i++) { - var param = this.parameters[i]; - - if (typeof args[param.name] !== 'undefined') { - if (param.in === 'header') { - var value = args[param.name]; - - if (Array.isArray(value)) { - value = value.toString(); - } - - headers[param.name] = value; - } - } - } - - return headers; -}; - -Operation.prototype.urlify = function (args) { - var formParams = {}; - var requestUrl = this.path; - var querystring = ''; // grab params from the args, build the querystring along the way - - for (var i = 0; i < this.parameters.length; i++) { - var param = this.parameters[i]; - - if (typeof args[param.name] !== 'undefined') { - if (param.in === 'path') { - var reg = new RegExp('\{' + param.name + '\}', 'gi'); - var value = args[param.name]; - - if (Array.isArray(value)) { - value = this.encodePathCollection(param.collectionFormat, param.name, value); - } else { - value = this.encodePathParam(value); - } - - requestUrl = requestUrl.replace(reg, value); - } else if (param.in === 'query' && typeof args[param.name] !== 'undefined') { - if (querystring === '') { - querystring += '?'; - } else { - querystring += '&'; - } - - if (typeof param.collectionFormat !== 'undefined') { - var qp = args[param.name]; - - if (Array.isArray(qp)) { - querystring += this.encodeQueryCollection(param.collectionFormat, param.name, qp); - } else { - querystring += this.encodeQueryParam(param.name) + '=' + this.encodeQueryParam(args[param.name]); - } - } else { - querystring += this.encodeQueryParam(param.name) + '=' + this.encodeQueryParam(args[param.name]); - } - } else if (param.in === 'formData') { - formParams[param.name] = args[param.name]; - } - } - } - var url = this.scheme + '://' + this.host; - - if (this.basePath !== '/') { - url += this.basePath; - } - return url + requestUrl + querystring; -}; - -Operation.prototype.getMissingParams = function (args) { - var missingParams = []; // check required params, track the ones that are missing - var i; - - for (i = 0; i < this.parameters.length; i++) { - var param = this.parameters[i]; - - if (param.required === true) { - if (typeof args[param.name] === 'undefined') { - missingParams = param.name; - } - } - } - - return missingParams; -}; - -Operation.prototype.getBody = function (headers, args, opts) { - var formParams = {}, body, key, value, hasBody = false; - - for (var i = 0; i < this.parameters.length; i++) { - var param = this.parameters[i]; - - if (typeof args[param.name] !== 'undefined') { - if (param.in === 'body') { - body = args[param.name]; - } else if (param.in === 'formData') { - formParams[param.name] = args[param.name]; - } - } - else { - if(param.in === 'body') { - hasBody = true; - } - } - } - - // if body is null and hasBody is true, AND a JSON body is requested, send empty {} - if(hasBody && typeof body === 'undefined') { - var contentType = headers['Content-Type']; - if(contentType && contentType.indexOf('application/json') === 0) { - body = '{}'; - } - } - - // handle form params - if (headers['Content-Type'] === 'application/x-www-form-urlencoded') { - var encoded = ''; - - for (key in formParams) { - value = formParams[key]; - - if (typeof value !== 'undefined') { - if (encoded !== '') { - encoded += '&'; - } - - encoded += encodeURIComponent(key) + '=' + encodeURIComponent(value); - } - } - - body = encoded; - } else if (headers['Content-Type'] && headers['Content-Type'].indexOf('multipart/form-data') >= 0) { - if (opts.useJQuery) { - var bodyParam = new FormData(); - - bodyParam.type = 'formData'; - - for (key in formParams) { - value = args[key]; - - if (typeof value !== 'undefined') { - // required for jquery file upload - if (value.type === 'file' && value.value) { - delete headers['Content-Type']; - - bodyParam.append(key, value.value); - } else { - bodyParam.append(key, value); - } - } - } - - body = bodyParam; - } - } - - return body; -}; - -/** - * gets sample response for a single operation - **/ -Operation.prototype.getModelSampleJSON = function (type, models) { - var listType, sampleJson, innerType; - models = models || {}; - - listType = (type instanceof Array); - innerType = listType ? type[0] : type; - - if(models[innerType]) { - sampleJson = models[innerType].createJSONSample(); - } else if (this.getInlineModel(innerType)){ - sampleJson = this.getInlineModel(innerType).createJSONSample(); // may return null, if type isn't correct - } - - - if (sampleJson) { - sampleJson = listType ? [sampleJson] : sampleJson; - - if (typeof sampleJson === 'string') { - return sampleJson; - } else if (_.isObject(sampleJson)) { - var t = sampleJson; - - if (sampleJson instanceof Array && sampleJson.length > 0) { - t = sampleJson[0]; - } - - if (t.nodeName) { - var xmlString = new XMLSerializer().serializeToString(t); - - return this.formatXml(xmlString); - } else { - return JSON.stringify(sampleJson, null, 2); - } - } else { - return sampleJson; - } - } -}; - -/** - * legacy binding - **/ -Operation.prototype.do = function (args, opts, callback, error, parent) { - return this.execute(args, opts, callback, error, parent); -}; - -/** - * executes an operation - **/ -Operation.prototype.execute = function (arg1, arg2, arg3, arg4, parent) { - var args = arg1 || {}; - var opts = {}, success, error; - - if (_.isObject(arg2)) { - opts = arg2; - success = arg3; - error = arg4; - } - - if(this.client) { - opts.client = this.client; - } - if(this.responseInterceptor) { - opts.responseInterceptor = this.responseInterceptor; - } - - - if (typeof arg2 === 'function') { - success = arg2; - error = arg3; - } - - success = (success || this.parent.defaultSuccessCallback || helpers.log); - error = (error || this.parent.defaultErrorCallback || helpers.log); - - - if (typeof opts.useJQuery === 'undefined') { - opts.useJQuery = this.useJQuery; - } - var missingParams = this.getMissingParams(args); - - if (missingParams.length > 0) { - var message = 'missing required params: ' + missingParams; - - helpers.fail(message); - error(message); - - return; - } - - var allHeaders = this.getHeaderParams(args); - var contentTypeHeaders = this.setContentTypes(args, opts); - var headers = {}, attrname; - - for (attrname in allHeaders) { headers[attrname] = allHeaders[attrname]; } - for (attrname in contentTypeHeaders) { headers[attrname] = contentTypeHeaders[attrname]; } - - var body = this.getBody(contentTypeHeaders, args, opts); - var url = this.urlify(args); - - if(url.indexOf('.{format}') > 0) { - if(headers) { - var format = headers.Accept || headers.accept; - if(format && format.indexOf('json') > 0) { - url = url.replace('.{format}', '.json'); - } - else if(format && format.indexOf('xml') > 0) { - url = url.replace('.{format}', '.xml'); - } - } - } - - var obj = { - url: url, - method: this.method.toUpperCase(), - body: body, - useJQuery: opts.useJQuery, - headers: headers, - on: { - response: function (response) { - return success(response, parent); - }, - error: function (response) { - return error(response, parent); - } - } - }; - - this.clientAuthorizations.apply(obj, this.operation.security); - if (opts.mock === true) { - return obj; - } else { - new SwaggerHttp().execute(obj, opts); - } -}; - -function itemByPriority(col, itemPriority) { - - // No priorities? return first... - if(_.isEmpty(itemPriority)) { - return col[0]; - } - - for (var i = 0, len = itemPriority.length; i < len; i++) { - if(col.indexOf(itemPriority[i]) > -1) { - return itemPriority[i]; - } - } - - // Otherwise return first - return col[0]; -} - -Operation.prototype.setContentTypes = function (args, opts) { - // default type - var allDefinedParams = this.parameters; - var body; - var consumes = args.parameterContentType || itemByPriority(this.consumes, ['application/json', 'application/yaml']); - var accepts = opts.responseContentType || itemByPriority(this.produces, ['application/json', 'application/yaml']); - var definedFileParams = []; - var definedFormParams = []; - var headers = {}; - var i; - - // get params from the operation and set them in definedFileParams, definedFormParams, headers - for (i = 0; i < allDefinedParams.length; i++) { - var param = allDefinedParams[i]; - - if (param.in === 'formData') { - if (param.type === 'file') { - definedFileParams.push(param); - } else { - definedFormParams.push(param); - } - } else if (param.in === 'header' && opts) { - var key = param.name; - var headerValue = opts[param.name]; - - if (typeof opts[param.name] !== 'undefined') { - headers[key] = headerValue; - } - } else if (param.in === 'body' && typeof args[param.name] !== 'undefined') { - body = args[param.name]; - } - } - - // if there's a body, need to set the consumes header via requestContentType - if (this.method === 'post' || this.method === 'put' || this.method === 'patch' || - (this.method === 'delete' && body) ) { - if (opts.requestContentType) { - consumes = opts.requestContentType; - } - // if any form params, content type must be set - if (definedFormParams.length > 0) { - if (opts.requestContentType) { // override if set - consumes = opts.requestContentType; - } else if (definedFileParams.length > 0) { // if a file, must be multipart/form-data - consumes = 'multipart/form-data'; - } else { // default to x-www-from-urlencoded - consumes = 'application/x-www-form-urlencoded'; - } - } - } - else { - consumes = null; - } - - if (consumes && this.consumes) { - if (this.consumes.indexOf(consumes) === -1) { - helpers.log('server doesn\'t consume ' + consumes + ', try ' + JSON.stringify(this.consumes)); - } - } - - if (!this.matchesAccept(accepts)) { - helpers.log('server can\'t produce ' + accepts); - } - - if ((consumes && body !== '') || (consumes === 'application/x-www-form-urlencoded')) { - headers['Content-Type'] = consumes; - } - - if (accepts) { - headers.Accept = accepts; - } - - return headers; -}; - -/** - * Returns true if the request accepts header matches anything in this.produces. - * If this.produces contains * / *, ignore the accept header. - * @param {string=} accepts The client request accept header. - * @return {boolean} - */ -Operation.prototype.matchesAccept = function(accepts) { - // no accepts or produces, no problem! - if (!accepts || !this.produces) { - return true; - } - return this.produces.indexOf(accepts) !== -1 || this.produces.indexOf('*/*') !== -1; -}; - -Operation.prototype.asCurl = function (args1, args2) { - var opts = {mock: true}; - if (typeof args2 === 'object') { - for (var argKey in args2) { - opts[argKey] = args2[argKey]; - } - } - var obj = this.execute(args1, opts); - - this.clientAuthorizations.apply(obj); - - var results = []; - - results.push('-X ' + this.method.toUpperCase()); - - if (obj.headers) { - var key; - - for (key in obj.headers) { - results.push('--header "' + key + ': ' + obj.headers[key] + '"'); - } - } - - if (obj.body) { - var body; - - if (_.isObject(obj.body)) { - body = JSON.stringify(obj.body); - } else { - body = obj.body; - } - - results.push('-d "' + body.replace(/"/g, '\\"') + '"'); - } - - return 'curl ' + (results.join(' ')) + ' "' + obj.url + '"'; -}; - -Operation.prototype.encodePathCollection = function (type, name, value) { - var encoded = ''; - var i; - var separator = ''; - - if (type === 'ssv') { - separator = '%20'; - } else if (type === 'tsv') { - separator = '\\t'; - } else if (type === 'pipes') { - separator = '|'; - } else { - separator = ','; - } - - for (i = 0; i < value.length; i++) { - if (i === 0) { - encoded = this.encodeQueryParam(value[i]); - } else { - encoded += separator + this.encodeQueryParam(value[i]); - } - } - - return encoded; -}; - -Operation.prototype.encodeQueryCollection = function (type, name, value) { - var encoded = ''; - var i; - - if (type === 'default' || type === 'multi') { - for (i = 0; i < value.length; i++) { - if (i > 0) {encoded += '&';} - - encoded += this.encodeQueryParam(name) + '=' + this.encodeQueryParam(value[i]); - } - } else { - var separator = ''; - - if (type === 'csv') { - separator = ','; - } else if (type === 'ssv') { - separator = '%20'; - } else if (type === 'tsv') { - separator = '\\t'; - } else if (type === 'pipes') { - separator = '|'; - } else if (type === 'brackets') { - for (i = 0; i < value.length; i++) { - if (i !== 0) { - encoded += '&'; - } - - encoded += this.encodeQueryParam(name) + '[]=' + this.encodeQueryParam(value[i]); - } - } - - if (separator !== '') { - for (i = 0; i < value.length; i++) { - if (i === 0) { - encoded = this.encodeQueryParam(name) + '=' + this.encodeQueryParam(value[i]); - } else { - encoded += separator + this.encodeQueryParam(value[i]); - } - } - } - } - - return encoded; -}; - -Operation.prototype.encodeQueryParam = function (arg) { - return encodeURIComponent(arg); -}; - -/** - * TODO revisit, might not want to leave '/' - **/ -Operation.prototype.encodePathParam = function (pathParam) { - return encodeURIComponent(pathParam); -}; - -},{"../helpers":4,"../http":5,"./model":9,"lodash-compat/lang/cloneDeep":141,"lodash-compat/lang/isEmpty":144,"lodash-compat/lang/isObject":147,"lodash-compat/lang/isUndefined":151}],11:[function(require,module,exports){ -'use strict'; - -var OperationGroup = module.exports = function (tag, description, externalDocs, operation) { - this.description = description; - this.externalDocs = externalDocs; - this.name = tag; - this.operation = operation; - this.operationsArray = []; - this.path = tag; - this.tag = tag; -}; - -OperationGroup.prototype.sort = function () { - -}; - - -},{}],12:[function(require,module,exports){ - -},{}],13:[function(require,module,exports){ -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ - -var base64 = require('base64-js') -var ieee754 = require('ieee754') -var isArray = require('is-array') - -exports.Buffer = Buffer -exports.SlowBuffer = SlowBuffer -exports.INSPECT_MAX_BYTES = 50 -Buffer.poolSize = 8192 // not used by this implementation - -var rootParent = {} - -/** - * If `Buffer.TYPED_ARRAY_SUPPORT`: - * === true Use Uint8Array implementation (fastest) - * === false Use Object implementation (most compatible, even IE6) - * - * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, - * Opera 11.6+, iOS 4.2+. - * - * Note: - * - * - Implementation must support adding new properties to `Uint8Array` instances. - * Firefox 4-29 lacked support, fixed in Firefox 30+. - * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. - * - * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. - * - * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of - * incorrect length in some situations. - * - * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will - * get the Object implementation, which is slower but will work correctly. - */ -Buffer.TYPED_ARRAY_SUPPORT = (function () { - function Foo () {} - try { - var buf = new ArrayBuffer(0) - var arr = new Uint8Array(buf) - arr.foo = function () { return 42 } - arr.constructor = Foo - return arr.foo() === 42 && // typed array instances can be augmented - arr.constructor === Foo && // constructor can be set - typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` - new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` - } catch (e) { - return false - } -})() - -function kMaxLength () { - return Buffer.TYPED_ARRAY_SUPPORT - ? 0x7fffffff - : 0x3fffffff -} - -/** - * Class: Buffer - * ============= - * - * The Buffer constructor returns instances of `Uint8Array` that are augmented - * with function properties for all the node `Buffer` API functions. We use - * `Uint8Array` so that square bracket notation works as expected -- it returns - * a single octet. - * - * By augmenting the instances, we can avoid modifying the `Uint8Array` - * prototype. - */ -function Buffer (arg) { - if (!(this instanceof Buffer)) { - // Avoid going through an ArgumentsAdaptorTrampoline in the common case. - if (arguments.length > 1) return new Buffer(arg, arguments[1]) - return new Buffer(arg) - } - - this.length = 0 - this.parent = undefined - - // Common case. - if (typeof arg === 'number') { - return fromNumber(this, arg) - } - - // Slightly less common case. - if (typeof arg === 'string') { - return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8') - } - - // Unusual. - return fromObject(this, arg) -} - -function fromNumber (that, length) { - that = allocate(that, length < 0 ? 0 : checked(length) | 0) - if (!Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < length; i++) { - that[i] = 0 - } - } - return that -} - -function fromString (that, string, encoding) { - if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8' - - // Assumption: byteLength() return value is always < kMaxLength. - var length = byteLength(string, encoding) | 0 - that = allocate(that, length) - - that.write(string, encoding) - return that -} - -function fromObject (that, object) { - if (Buffer.isBuffer(object)) return fromBuffer(that, object) - - if (isArray(object)) return fromArray(that, object) - - if (object == null) { - throw new TypeError('must start with number, buffer, array or string') - } - - if (typeof ArrayBuffer !== 'undefined' && object.buffer instanceof ArrayBuffer) { - return fromTypedArray(that, object) - } - - if (object.length) return fromArrayLike(that, object) - - return fromJsonObject(that, object) -} - -function fromBuffer (that, buffer) { - var length = checked(buffer.length) | 0 - that = allocate(that, length) - buffer.copy(that, 0, 0, length) - return that -} - -function fromArray (that, array) { - var length = checked(array.length) | 0 - that = allocate(that, length) - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 - } - return that -} - -// Duplicate of fromArray() to keep fromArray() monomorphic. -function fromTypedArray (that, array) { - var length = checked(array.length) | 0 - that = allocate(that, length) - // Truncating the elements is probably not what people expect from typed - // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior - // of the old Buffer constructor. - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 - } - return that -} - -function fromArrayLike (that, array) { - var length = checked(array.length) | 0 - that = allocate(that, length) - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 - } - return that -} - -// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object. -// Returns a zero-length buffer for inputs that don't conform to the spec. -function fromJsonObject (that, object) { - var array - var length = 0 - - if (object.type === 'Buffer' && isArray(object.data)) { - array = object.data - length = checked(array.length) | 0 - } - that = allocate(that, length) - - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 - } - return that -} - -function allocate (that, length) { - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = Buffer._augment(new Uint8Array(length)) - } else { - // Fallback: Return an object instance of the Buffer class - that.length = length - that._isBuffer = true - } - - var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1 - if (fromPool) that.parent = rootParent - - return that -} - -function checked (length) { - // Note: cannot use `length < kMaxLength` here because that fails when - // length is NaN (which is otherwise coerced to zero.) - if (length >= kMaxLength()) { - throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + kMaxLength().toString(16) + ' bytes') - } - return length | 0 -} - -function SlowBuffer (subject, encoding) { - if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding) - - var buf = new Buffer(subject, encoding) - delete buf.parent - return buf -} - -Buffer.isBuffer = function isBuffer (b) { - return !!(b != null && b._isBuffer) -} - -Buffer.compare = function compare (a, b) { - if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { - throw new TypeError('Arguments must be Buffers') - } - - if (a === b) return 0 - - var x = a.length - var y = b.length - - var i = 0 - var len = Math.min(x, y) - while (i < len) { - if (a[i] !== b[i]) break - - ++i - } - - if (i !== len) { - x = a[i] - y = b[i] - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 -} - -Buffer.isEncoding = function isEncoding (encoding) { - switch (String(encoding).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'binary': - case 'base64': - case 'raw': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return true - default: - return false - } -} - -Buffer.concat = function concat (list, length) { - if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.') - - if (list.length === 0) { - return new Buffer(0) - } else if (list.length === 1) { - return list[0] - } - - var i - if (length === undefined) { - length = 0 - for (i = 0; i < list.length; i++) { - length += list[i].length - } - } - - var buf = new Buffer(length) - var pos = 0 - for (i = 0; i < list.length; i++) { - var item = list[i] - item.copy(buf, pos) - pos += item.length - } - return buf -} - -function byteLength (string, encoding) { - if (typeof string !== 'string') string = '' + string - - var len = string.length - if (len === 0) return 0 - - // Use a for loop to avoid recursion - var loweredCase = false - for (;;) { - switch (encoding) { - case 'ascii': - case 'binary': - // Deprecated - case 'raw': - case 'raws': - return len - case 'utf8': - case 'utf-8': - return utf8ToBytes(string).length - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return len * 2 - case 'hex': - return len >>> 1 - case 'base64': - return base64ToBytes(string).length - default: - if (loweredCase) return utf8ToBytes(string).length // assume utf8 - encoding = ('' + encoding).toLowerCase() - loweredCase = true - } - } -} -Buffer.byteLength = byteLength - -// pre-set for values that may exist in the future -Buffer.prototype.length = undefined -Buffer.prototype.parent = undefined - -function slowToString (encoding, start, end) { - var loweredCase = false - - start = start | 0 - end = end === undefined || end === Infinity ? this.length : end | 0 - - if (!encoding) encoding = 'utf8' - if (start < 0) start = 0 - if (end > this.length) end = this.length - if (end <= start) return '' - - while (true) { - switch (encoding) { - case 'hex': - return hexSlice(this, start, end) - - case 'utf8': - case 'utf-8': - return utf8Slice(this, start, end) - - case 'ascii': - return asciiSlice(this, start, end) - - case 'binary': - return binarySlice(this, start, end) - - case 'base64': - return base64Slice(this, start, end) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice(this, start, end) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = (encoding + '').toLowerCase() - loweredCase = true - } - } -} - -Buffer.prototype.toString = function toString () { - var length = this.length | 0 - if (length === 0) return '' - if (arguments.length === 0) return utf8Slice(this, 0, length) - return slowToString.apply(this, arguments) -} - -Buffer.prototype.equals = function equals (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return true - return Buffer.compare(this, b) === 0 -} - -Buffer.prototype.inspect = function inspect () { - var str = '' - var max = exports.INSPECT_MAX_BYTES - if (this.length > 0) { - str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') - if (this.length > max) str += ' ... ' - } - return '' -} - -Buffer.prototype.compare = function compare (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return 0 - return Buffer.compare(this, b) -} - -Buffer.prototype.indexOf = function indexOf (val, byteOffset) { - if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff - else if (byteOffset < -0x80000000) byteOffset = -0x80000000 - byteOffset >>= 0 - - if (this.length === 0) return -1 - if (byteOffset >= this.length) return -1 - - // Negative offsets start from the end of the buffer - if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) - - if (typeof val === 'string') { - if (val.length === 0) return -1 // special case: looking for empty string always fails - return String.prototype.indexOf.call(this, val, byteOffset) - } - if (Buffer.isBuffer(val)) { - return arrayIndexOf(this, val, byteOffset) - } - if (typeof val === 'number') { - if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { - return Uint8Array.prototype.indexOf.call(this, val, byteOffset) - } - return arrayIndexOf(this, [ val ], byteOffset) - } - - function arrayIndexOf (arr, val, byteOffset) { - var foundIndex = -1 - for (var i = 0; byteOffset + i < arr.length; i++) { - if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) { - if (foundIndex === -1) foundIndex = i - if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex - } else { - foundIndex = -1 - } - } - return -1 - } - - throw new TypeError('val must be string, number or Buffer') -} - -// `get` will be removed in Node 0.13+ -Buffer.prototype.get = function get (offset) { - console.log('.get() is deprecated. Access using array indexes instead.') - return this.readUInt8(offset) -} - -// `set` will be removed in Node 0.13+ -Buffer.prototype.set = function set (v, offset) { - console.log('.set() is deprecated. Access using array indexes instead.') - return this.writeUInt8(v, offset) -} - -function hexWrite (buf, string, offset, length) { - offset = Number(offset) || 0 - var remaining = buf.length - offset - if (!length) { - length = remaining - } else { - length = Number(length) - if (length > remaining) { - length = remaining - } - } - - // must be an even number of digits - var strLen = string.length - if (strLen % 2 !== 0) throw new Error('Invalid hex string') - - if (length > strLen / 2) { - length = strLen / 2 - } - for (var i = 0; i < length; i++) { - var parsed = parseInt(string.substr(i * 2, 2), 16) - if (isNaN(parsed)) throw new Error('Invalid hex string') - buf[offset + i] = parsed - } - return i -} - -function utf8Write (buf, string, offset, length) { - return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) -} - -function asciiWrite (buf, string, offset, length) { - return blitBuffer(asciiToBytes(string), buf, offset, length) -} - -function binaryWrite (buf, string, offset, length) { - return asciiWrite(buf, string, offset, length) -} - -function base64Write (buf, string, offset, length) { - return blitBuffer(base64ToBytes(string), buf, offset, length) -} - -function ucs2Write (buf, string, offset, length) { - return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) -} - -Buffer.prototype.write = function write (string, offset, length, encoding) { - // Buffer#write(string) - if (offset === undefined) { - encoding = 'utf8' - length = this.length - offset = 0 - // Buffer#write(string, encoding) - } else if (length === undefined && typeof offset === 'string') { - encoding = offset - length = this.length - offset = 0 - // Buffer#write(string, offset[, length][, encoding]) - } else if (isFinite(offset)) { - offset = offset | 0 - if (isFinite(length)) { - length = length | 0 - if (encoding === undefined) encoding = 'utf8' - } else { - encoding = length - length = undefined - } - // legacy write(string, encoding, offset, length) - remove in v0.13 - } else { - var swap = encoding - encoding = offset - offset = length | 0 - length = swap - } - - var remaining = this.length - offset - if (length === undefined || length > remaining) length = remaining - - if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { - throw new RangeError('attempt to write outside buffer bounds') - } - - if (!encoding) encoding = 'utf8' - - var loweredCase = false - for (;;) { - switch (encoding) { - case 'hex': - return hexWrite(this, string, offset, length) - - case 'utf8': - case 'utf-8': - return utf8Write(this, string, offset, length) - - case 'ascii': - return asciiWrite(this, string, offset, length) - - case 'binary': - return binaryWrite(this, string, offset, length) - - case 'base64': - // Warning: maxLength not taken into account in base64Write - return base64Write(this, string, offset, length) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return ucs2Write(this, string, offset, length) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = ('' + encoding).toLowerCase() - loweredCase = true - } - } -} - -Buffer.prototype.toJSON = function toJSON () { - return { - type: 'Buffer', - data: Array.prototype.slice.call(this._arr || this, 0) - } -} - -function base64Slice (buf, start, end) { - if (start === 0 && end === buf.length) { - return base64.fromByteArray(buf) - } else { - return base64.fromByteArray(buf.slice(start, end)) - } -} - -function utf8Slice (buf, start, end) { - var res = '' - var tmp = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; i++) { - if (buf[i] <= 0x7F) { - res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i]) - tmp = '' - } else { - tmp += '%' + buf[i].toString(16) - } - } - - return res + decodeUtf8Char(tmp) -} - -function asciiSlice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; i++) { - ret += String.fromCharCode(buf[i] & 0x7F) - } - return ret -} - -function binarySlice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; i++) { - ret += String.fromCharCode(buf[i]) - } - return ret -} - -function hexSlice (buf, start, end) { - var len = buf.length - - if (!start || start < 0) start = 0 - if (!end || end < 0 || end > len) end = len - - var out = '' - for (var i = start; i < end; i++) { - out += toHex(buf[i]) - } - return out -} - -function utf16leSlice (buf, start, end) { - var bytes = buf.slice(start, end) - var res = '' - for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) - } - return res -} - -Buffer.prototype.slice = function slice (start, end) { - var len = this.length - start = ~~start - end = end === undefined ? len : ~~end - - if (start < 0) { - start += len - if (start < 0) start = 0 - } else if (start > len) { - start = len - } - - if (end < 0) { - end += len - if (end < 0) end = 0 - } else if (end > len) { - end = len - } - - if (end < start) end = start - - var newBuf - if (Buffer.TYPED_ARRAY_SUPPORT) { - newBuf = Buffer._augment(this.subarray(start, end)) - } else { - var sliceLen = end - start - newBuf = new Buffer(sliceLen, undefined) - for (var i = 0; i < sliceLen; i++) { - newBuf[i] = this[i + start] - } - } - - if (newBuf.length) newBuf.parent = this.parent || this - - return newBuf -} - -/* - * Need to make sure that buffer isn't trying to write out of bounds. - */ -function checkOffset (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') - if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') -} - -Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul - } - - return val -} - -Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) { - checkOffset(offset, byteLength, this.length) - } - - var val = this[offset + --byteLength] - var mul = 1 - while (byteLength > 0 && (mul *= 0x100)) { - val += this[offset + --byteLength] * mul - } - - return val -} - -Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length) - return this[offset] -} - -Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - return this[offset] | (this[offset + 1] << 8) -} - -Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - return (this[offset] << 8) | this[offset + 1] -} - -Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return ((this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16)) + - (this[offset + 3] * 0x1000000) -} - -Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) -} - -Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul - } - mul *= 0x80 - - if (val >= mul) val -= Math.pow(2, 8 * byteLength) - - return val -} - -Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var i = byteLength - var mul = 1 - var val = this[offset + --i] - while (i > 0 && (mul *= 0x100)) { - val += this[offset + --i] * mul - } - mul *= 0x80 - - if (val >= mul) val -= Math.pow(2, 8 * byteLength) - - return val -} - -Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length) - if (!(this[offset] & 0x80)) return (this[offset]) - return ((0xff - this[offset] + 1) * -1) -} - -Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset] | (this[offset + 1] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset + 1] | (this[offset] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) -} - -Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) -} - -Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, true, 23, 4) -} - -Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, false, 23, 4) -} - -Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, true, 52, 8) -} - -Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, false, 52, 8) -} - -function checkInt (buf, value, offset, ext, max, min) { - if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') - if (value > max || value < min) throw new RangeError('value is out of bounds') - if (offset + ext > buf.length) throw new RangeError('index out of range') -} - -Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) - - var mul = 1 - var i = 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) - - var i = byteLength - 1 - var mul = 1 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - this[offset] = value - return offset + 1 -} - -function objectWriteUInt16 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { - buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> - (littleEndian ? i : 1 - i) * 8 - } -} - -Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value - this[offset + 1] = (value >>> 8) - } else { - objectWriteUInt16(this, value, offset, true) - } - return offset + 2 -} - -Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = value - } else { - objectWriteUInt16(this, value, offset, false) - } - return offset + 2 -} - -function objectWriteUInt32 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffffffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { - buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff - } -} - -Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset + 3] = (value >>> 24) - this[offset + 2] = (value >>> 16) - this[offset + 1] = (value >>> 8) - this[offset] = value - } else { - objectWriteUInt32(this, value, offset, true) - } - return offset + 4 -} - -Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = value - } else { - objectWriteUInt32(this, value, offset, false) - } - return offset + 4 -} - -Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1) - - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } - - var i = 0 - var mul = 1 - var sub = value < 0 ? 1 : 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1) - - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } - - var i = byteLength - 1 - var mul = 1 - var sub = value < 0 ? 1 : 0 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - if (value < 0) value = 0xff + value + 1 - this[offset] = value - return offset + 1 -} - -Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value - this[offset + 1] = (value >>> 8) - } else { - objectWriteUInt16(this, value, offset, true) - } - return offset + 2 -} - -Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = value - } else { - objectWriteUInt16(this, value, offset, false) - } - return offset + 2 -} - -Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = value - this[offset + 1] = (value >>> 8) - this[offset + 2] = (value >>> 16) - this[offset + 3] = (value >>> 24) - } else { - objectWriteUInt32(this, value, offset, true) - } - return offset + 4 -} - -Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (value < 0) value = 0xffffffff + value + 1 - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = value - } else { - objectWriteUInt32(this, value, offset, false) - } - return offset + 4 -} - -function checkIEEE754 (buf, value, offset, ext, max, min) { - if (value > max || value < min) throw new RangeError('value is out of bounds') - if (offset + ext > buf.length) throw new RangeError('index out of range') - if (offset < 0) throw new RangeError('index out of range') -} - -function writeFloat (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) - } - ieee754.write(buf, value, offset, littleEndian, 23, 4) - return offset + 4 -} - -Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { - return writeFloat(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { - return writeFloat(this, value, offset, false, noAssert) -} - -function writeDouble (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) - } - ieee754.write(buf, value, offset, littleEndian, 52, 8) - return offset + 8 -} - -Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { - return writeDouble(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { - return writeDouble(this, value, offset, false, noAssert) -} - -// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) -Buffer.prototype.copy = function copy (target, targetStart, start, end) { - if (!start) start = 0 - if (!end && end !== 0) end = this.length - if (targetStart >= target.length) targetStart = target.length - if (!targetStart) targetStart = 0 - if (end > 0 && end < start) end = start - - // Copy 0 bytes; we're done - if (end === start) return 0 - if (target.length === 0 || this.length === 0) return 0 - - // Fatal error conditions - if (targetStart < 0) { - throw new RangeError('targetStart out of bounds') - } - if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') - if (end < 0) throw new RangeError('sourceEnd out of bounds') - - // Are we oob? - if (end > this.length) end = this.length - if (target.length - targetStart < end - start) { - end = target.length - targetStart + start - } - - var len = end - start - - if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < len; i++) { - target[i + targetStart] = this[i + start] - } - } else { - target._set(this.subarray(start, start + len), targetStart) - } - - return len -} - -// fill(value, start=0, end=buffer.length) -Buffer.prototype.fill = function fill (value, start, end) { - if (!value) value = 0 - if (!start) start = 0 - if (!end) end = this.length - - if (end < start) throw new RangeError('end < start') - - // Fill 0 bytes; we're done - if (end === start) return - if (this.length === 0) return - - if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') - if (end < 0 || end > this.length) throw new RangeError('end out of bounds') - - var i - if (typeof value === 'number') { - for (i = start; i < end; i++) { - this[i] = value - } - } else { - var bytes = utf8ToBytes(value.toString()) - var len = bytes.length - for (i = start; i < end; i++) { - this[i] = bytes[i % len] - } - } - - return this -} - -/** - * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. - * Added in Node 0.12. Only available in browsers that support ArrayBuffer. - */ -Buffer.prototype.toArrayBuffer = function toArrayBuffer () { - if (typeof Uint8Array !== 'undefined') { - if (Buffer.TYPED_ARRAY_SUPPORT) { - return (new Buffer(this)).buffer - } else { - var buf = new Uint8Array(this.length) - for (var i = 0, len = buf.length; i < len; i += 1) { - buf[i] = this[i] - } - return buf.buffer - } - } else { - throw new TypeError('Buffer.toArrayBuffer not supported in this browser') - } -} - -// HELPER FUNCTIONS -// ================ - -var BP = Buffer.prototype - -/** - * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods - */ -Buffer._augment = function _augment (arr) { - arr.constructor = Buffer - arr._isBuffer = true - - // save reference to original Uint8Array set method before overwriting - arr._set = arr.set - - // deprecated, will be removed in node 0.13+ - arr.get = BP.get - arr.set = BP.set - - arr.write = BP.write - arr.toString = BP.toString - arr.toLocaleString = BP.toString - arr.toJSON = BP.toJSON - arr.equals = BP.equals - arr.compare = BP.compare - arr.indexOf = BP.indexOf - arr.copy = BP.copy - arr.slice = BP.slice - arr.readUIntLE = BP.readUIntLE - arr.readUIntBE = BP.readUIntBE - arr.readUInt8 = BP.readUInt8 - arr.readUInt16LE = BP.readUInt16LE - arr.readUInt16BE = BP.readUInt16BE - arr.readUInt32LE = BP.readUInt32LE - arr.readUInt32BE = BP.readUInt32BE - arr.readIntLE = BP.readIntLE - arr.readIntBE = BP.readIntBE - arr.readInt8 = BP.readInt8 - arr.readInt16LE = BP.readInt16LE - arr.readInt16BE = BP.readInt16BE - arr.readInt32LE = BP.readInt32LE - arr.readInt32BE = BP.readInt32BE - arr.readFloatLE = BP.readFloatLE - arr.readFloatBE = BP.readFloatBE - arr.readDoubleLE = BP.readDoubleLE - arr.readDoubleBE = BP.readDoubleBE - arr.writeUInt8 = BP.writeUInt8 - arr.writeUIntLE = BP.writeUIntLE - arr.writeUIntBE = BP.writeUIntBE - arr.writeUInt16LE = BP.writeUInt16LE - arr.writeUInt16BE = BP.writeUInt16BE - arr.writeUInt32LE = BP.writeUInt32LE - arr.writeUInt32BE = BP.writeUInt32BE - arr.writeIntLE = BP.writeIntLE - arr.writeIntBE = BP.writeIntBE - arr.writeInt8 = BP.writeInt8 - arr.writeInt16LE = BP.writeInt16LE - arr.writeInt16BE = BP.writeInt16BE - arr.writeInt32LE = BP.writeInt32LE - arr.writeInt32BE = BP.writeInt32BE - arr.writeFloatLE = BP.writeFloatLE - arr.writeFloatBE = BP.writeFloatBE - arr.writeDoubleLE = BP.writeDoubleLE - arr.writeDoubleBE = BP.writeDoubleBE - arr.fill = BP.fill - arr.inspect = BP.inspect - arr.toArrayBuffer = BP.toArrayBuffer - - return arr -} - -var INVALID_BASE64_RE = /[^+\/0-9A-z\-]/g - -function base64clean (str) { - // Node strips out invalid characters like \n and \t from the string, base64-js does not - str = stringtrim(str).replace(INVALID_BASE64_RE, '') - // Node converts strings with length < 2 to '' - if (str.length < 2) return '' - // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not - while (str.length % 4 !== 0) { - str = str + '=' - } - return str -} - -function stringtrim (str) { - if (str.trim) return str.trim() - return str.replace(/^\s+|\s+$/g, '') -} - -function toHex (n) { - if (n < 16) return '0' + n.toString(16) - return n.toString(16) -} - -function utf8ToBytes (string, units) { - units = units || Infinity - var codePoint - var length = string.length - var leadSurrogate = null - var bytes = [] - var i = 0 - - for (; i < length; i++) { - codePoint = string.charCodeAt(i) - - // is surrogate component - if (codePoint > 0xD7FF && codePoint < 0xE000) { - // last char was a lead - if (leadSurrogate) { - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = codePoint - continue - } else { - // valid surrogate pair - codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000 - leadSurrogate = null - } - } else { - // no lead yet - - if (codePoint > 0xDBFF) { - // unexpected trail - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } else if (i + 1 === length) { - // unpaired lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } else { - // valid lead - leadSurrogate = codePoint - continue - } - } - } else if (leadSurrogate) { - // valid bmp char, but last char was a lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = null - } - - // encode utf8 - if (codePoint < 0x80) { - if ((units -= 1) < 0) break - bytes.push(codePoint) - } else if (codePoint < 0x800) { - if ((units -= 2) < 0) break - bytes.push( - codePoint >> 0x6 | 0xC0, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x10000) { - if ((units -= 3) < 0) break - bytes.push( - codePoint >> 0xC | 0xE0, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x200000) { - if ((units -= 4) < 0) break - bytes.push( - codePoint >> 0x12 | 0xF0, - codePoint >> 0xC & 0x3F | 0x80, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else { - throw new Error('Invalid code point') - } - } - - return bytes -} - -function asciiToBytes (str) { - var byteArray = [] - for (var i = 0; i < str.length; i++) { - // Node's code seems to be doing this and not & 0x7F.. - byteArray.push(str.charCodeAt(i) & 0xFF) - } - return byteArray -} - -function utf16leToBytes (str, units) { - var c, hi, lo - var byteArray = [] - for (var i = 0; i < str.length; i++) { - if ((units -= 2) < 0) break - - c = str.charCodeAt(i) - hi = c >> 8 - lo = c % 256 - byteArray.push(lo) - byteArray.push(hi) - } - - return byteArray -} - -function base64ToBytes (str) { - return base64.toByteArray(base64clean(str)) -} - -function blitBuffer (src, dst, offset, length) { - for (var i = 0; i < length; i++) { - if ((i + offset >= dst.length) || (i >= src.length)) break - dst[i + offset] = src[i] - } - return i -} - -function decodeUtf8Char (str) { - try { - return decodeURIComponent(str) - } catch (err) { - return String.fromCharCode(0xFFFD) // UTF 8 invalid char - } -} - -},{"base64-js":14,"ieee754":15,"is-array":16}],14:[function(require,module,exports){ -var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - -;(function (exports) { - 'use strict'; - - var Arr = (typeof Uint8Array !== 'undefined') - ? Uint8Array - : Array - - var PLUS = '+'.charCodeAt(0) - var SLASH = '/'.charCodeAt(0) - var NUMBER = '0'.charCodeAt(0) - var LOWER = 'a'.charCodeAt(0) - var UPPER = 'A'.charCodeAt(0) - var PLUS_URL_SAFE = '-'.charCodeAt(0) - var SLASH_URL_SAFE = '_'.charCodeAt(0) - - function decode (elt) { - var code = elt.charCodeAt(0) - if (code === PLUS || - code === PLUS_URL_SAFE) - return 62 // '+' - if (code === SLASH || - code === SLASH_URL_SAFE) - return 63 // '/' - if (code < NUMBER) - return -1 //no match - if (code < NUMBER + 10) - return code - NUMBER + 26 + 26 - if (code < UPPER + 26) - return code - UPPER - if (code < LOWER + 26) - return code - LOWER + 26 - } - - function b64ToByteArray (b64) { - var i, j, l, tmp, placeHolders, arr - - if (b64.length % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - var len = b64.length - placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 - - // base64 is 4/3 + up to two characters of the original data - arr = new Arr(b64.length * 3 / 4 - placeHolders) - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? b64.length - 4 : b64.length - - var L = 0 - - function push (v) { - arr[L++] = v - } - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) - push((tmp & 0xFF0000) >> 16) - push((tmp & 0xFF00) >> 8) - push(tmp & 0xFF) - } - - if (placeHolders === 2) { - tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) - push(tmp & 0xFF) - } else if (placeHolders === 1) { - tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) - push((tmp >> 8) & 0xFF) - push(tmp & 0xFF) - } - - return arr - } - - function uint8ToBase64 (uint8) { - var i, - extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes - output = "", - temp, length - - function encode (num) { - return lookup.charAt(num) - } - - function tripletToBase64 (num) { - return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) - } - - // go through the array every three bytes, we'll deal with trailing stuff later - for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { - temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) - output += tripletToBase64(temp) - } - - // pad the end with zeros, but make sure to not forget the extra bytes - switch (extraBytes) { - case 1: - temp = uint8[uint8.length - 1] - output += encode(temp >> 2) - output += encode((temp << 4) & 0x3F) - output += '==' - break - case 2: - temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) - output += encode(temp >> 10) - output += encode((temp >> 4) & 0x3F) - output += encode((temp << 2) & 0x3F) - output += '=' - break - } - - return output - } - - exports.toByteArray = b64ToByteArray - exports.fromByteArray = uint8ToBase64 -}(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) - -},{}],15:[function(require,module,exports){ -exports.read = function (buffer, offset, isLE, mLen, nBytes) { - var e, m - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var nBits = -7 - var i = isLE ? (nBytes - 1) : 0 - var d = isLE ? -1 : 1 - var s = buffer[offset + i] - - i += d - - e = s & ((1 << (-nBits)) - 1) - s >>= (-nBits) - nBits += eLen - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - m = e & ((1 << (-nBits)) - 1) - e >>= (-nBits) - nBits += mLen - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - if (e === 0) { - e = 1 - eBias - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen) - e = e - eBias - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) -} - -exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) - var i = isLE ? 0 : (nBytes - 1) - var d = isLE ? 1 : -1 - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 - - value = Math.abs(value) - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0 - e = eMax - } else { - e = Math.floor(Math.log(value) / Math.LN2) - if (value * (c = Math.pow(2, -e)) < 1) { - e-- - c *= 2 - } - if (e + eBias >= 1) { - value += rt / c - } else { - value += rt * Math.pow(2, 1 - eBias) - } - if (value * c >= 2) { - e++ - c /= 2 - } - - if (e + eBias >= eMax) { - m = 0 - e = eMax - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen) - e = e + eBias - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) - e = 0 - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m - eLen += mLen - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128 -} - -},{}],16:[function(require,module,exports){ - -/** - * isArray - */ - -var isArray = Array.isArray; - -/** - * toString - */ - -var str = Object.prototype.toString; - -/** - * Whether or not the given `val` - * is an array. - * - * example: - * - * isArray([]); - * // > true - * isArray(arguments); - * // > false - * isArray(''); - * // > false - * - * @param {mixed} val - * @return {bool} - */ - -module.exports = isArray || function (val) { - return !! val && '[object Array]' == str.call(val); -}; - -},{}],17:[function(require,module,exports){ -// shim for using process in browser - -var process = module.exports = {}; -var queue = []; -var draining = false; - -function drainQueue() { - if (draining) { - return; - } - draining = true; - var currentQueue; - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - var i = -1; - while (++i < len) { - currentQueue[i](); - } - len = queue.length; - } - draining = false; -} -process.nextTick = function (fun) { - queue.push(fun); - if (!draining) { - setTimeout(drainQueue, 0); - } -}; - -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -// TODO(shtylman) -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - -},{}],18:[function(require,module,exports){ -(function (Buffer){ -(function () { - "use strict"; - - function btoa(str) { - var buffer - ; - - if (str instanceof Buffer) { - buffer = str; - } else { - buffer = new Buffer(str.toString(), 'binary'); - } - - return buffer.toString('base64'); - } - - module.exports = btoa; -}()); - -}).call(this,require("buffer").Buffer) -//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9idG9hL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uICgpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgZnVuY3Rpb24gYnRvYShzdHIpIHtcbiAgICB2YXIgYnVmZmVyXG4gICAgICA7XG5cbiAgICBpZiAoc3RyIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICBidWZmZXIgPSBzdHI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZmZlciA9IG5ldyBCdWZmZXIoc3RyLnRvU3RyaW5nKCksICdiaW5hcnknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgfVxuXG4gIG1vZHVsZS5leHBvcnRzID0gYnRvYTtcbn0oKSk7XG4iXX0= -},{"buffer":13}],19:[function(require,module,exports){ -/* jshint node: true */ -(function () { - "use strict"; - - function CookieAccessInfo(domain, path, secure, script) { - if (this instanceof CookieAccessInfo) { - this.domain = domain || undefined; - this.path = path || "/"; - this.secure = !!secure; - this.script = !!script; - return this; - } - return new CookieAccessInfo(domain, path, secure, script); - } - exports.CookieAccessInfo = CookieAccessInfo; - - function Cookie(cookiestr, request_domain, request_path) { - if (cookiestr instanceof Cookie) { - return cookiestr; - } - if (this instanceof Cookie) { - this.name = null; - this.value = null; - this.expiration_date = Infinity; - this.path = String(request_path || "/"); - this.explicit_path = false; - this.domain = request_domain || null; - this.explicit_domain = false; - this.secure = false; //how to define default? - this.noscript = false; //httponly - if (cookiestr) { - this.parse(cookiestr, request_domain, request_path); - } - return this; - } - return new Cookie(cookiestr); - } - exports.Cookie = Cookie; - - Cookie.prototype.toString = function toString() { - var str = [this.name + "=" + this.value]; - if (this.expiration_date !== Infinity) { - str.push("expires=" + (new Date(this.expiration_date)).toGMTString()); - } - if (this.domain) { - str.push("domain=" + this.domain); - } - if (this.path) { - str.push("path=" + this.path); - } - if (this.secure) { - str.push("secure"); - } - if (this.noscript) { - str.push("httponly"); - } - return str.join("; "); - }; - - Cookie.prototype.toValueString = function toValueString() { - return this.name + "=" + this.value; - }; - - var cookie_str_splitter = /[:](?=\s*[a-zA-Z0-9_\-]+\s*[=])/g; - Cookie.prototype.parse = function parse(str, request_domain, request_path) { - if (this instanceof Cookie) { - var parts = str.split(";").filter(function (value) { - return !!value; - }), - pair = parts[0].match(/([^=]+)=([\s\S]*)/), - key = pair[1], - value = pair[2], - i; - this.name = key; - this.value = value; - - for (i = 1; i < parts.length; i += 1) { - pair = parts[i].match(/([^=]+)(?:=([\s\S]*))?/); - key = pair[1].trim().toLowerCase(); - value = pair[2]; - switch (key) { - case "httponly": - this.noscript = true; - break; - case "expires": - this.expiration_date = value ? - Number(Date.parse(value)) : - Infinity; - break; - case "path": - this.path = value ? - value.trim() : - ""; - this.explicit_path = true; - break; - case "domain": - this.domain = value ? - value.trim() : - ""; - this.explicit_domain = !!this.domain; - break; - case "secure": - this.secure = true; - break; - } - } - - if (!this.explicit_path) { - this.path = request_path || "/"; - } - if (!this.explicit_domain) { - this.domain = request_domain; - } - - return this; - } - return new Cookie().parse(str, request_domain, request_path); - }; - - Cookie.prototype.matches = function matches(access_info) { - if (this.noscript && access_info.script || - this.secure && !access_info.secure || - !this.collidesWith(access_info)) { - return false; - } - return true; - }; - - Cookie.prototype.collidesWith = function collidesWith(access_info) { - if ((this.path && !access_info.path) || (this.domain && !access_info.domain)) { - return false; - } - if (this.path && access_info.path.indexOf(this.path) !== 0) { - return false; - } - if (!this.explicit_path) { - if (this.path !== access_info.path) { - return false; - } - } - var access_domain = access_info.domain && access_info.domain.replace(/^[\.]/,''); - var cookie_domain = this.domain && this.domain.replace(/^[\.]/,''); - if (cookie_domain === access_domain) { - return true; - } - if (cookie_domain) { - if (!this.explicit_domain) { - return false; // we already checked if the domains were exactly the same - } - var wildcard = access_domain.indexOf(cookie_domain); - if (wildcard === -1 || wildcard !== access_domain.length - cookie_domain.length) { - return false; - } - return true; - } - return true; - }; - - function CookieJar() { - var cookies, cookies_list, collidable_cookie; - if (this instanceof CookieJar) { - cookies = Object.create(null); //name: [Cookie] - - this.setCookie = function setCookie(cookie, request_domain, request_path) { - var remove, i; - cookie = new Cookie(cookie, request_domain, request_path); - //Delete the cookie if the set is past the current time - remove = cookie.expiration_date <= Date.now(); - if (cookies[cookie.name] !== undefined) { - cookies_list = cookies[cookie.name]; - for (i = 0; i < cookies_list.length; i += 1) { - collidable_cookie = cookies_list[i]; - if (collidable_cookie.collidesWith(cookie)) { - if (remove) { - cookies_list.splice(i, 1); - if (cookies_list.length === 0) { - delete cookies[cookie.name]; - } - return false; - } - cookies_list[i] = cookie; - return cookie; - } - } - if (remove) { - return false; - } - cookies_list.push(cookie); - return cookie; - } - if (remove) { - return false; - } - cookies[cookie.name] = [cookie]; - return cookies[cookie.name]; - }; - //returns a cookie - this.getCookie = function getCookie(cookie_name, access_info) { - var cookie, i; - cookies_list = cookies[cookie_name]; - if (!cookies_list) { - return; - } - for (i = 0; i < cookies_list.length; i += 1) { - cookie = cookies_list[i]; - if (cookie.expiration_date <= Date.now()) { - if (cookies_list.length === 0) { - delete cookies[cookie.name]; - } - continue; - } - if (cookie.matches(access_info)) { - return cookie; - } - } - }; - //returns a list of cookies - this.getCookies = function getCookies(access_info) { - var matches = [], cookie_name, cookie; - for (cookie_name in cookies) { - cookie = this.getCookie(cookie_name, access_info); - if (cookie) { - matches.push(cookie); - } - } - matches.toString = function toString() { - return matches.join(":"); - }; - matches.toValueString = function toValueString() { - return matches.map(function (c) { - return c.toValueString(); - }).join(';'); - }; - return matches; - }; - - return this; - } - return new CookieJar(); - } - exports.CookieJar = CookieJar; - - //returns list of cookies that were set correctly. Cookies that are expired and removed are not returned. - CookieJar.prototype.setCookies = function setCookies(cookies, request_domain, request_path) { - cookies = Array.isArray(cookies) ? - cookies : - cookies.split(cookie_str_splitter); - var successful = [], - i, - cookie; - cookies = cookies.map(Cookie); - for (i = 0; i < cookies.length; i += 1) { - cookie = cookies[i]; - if (this.setCookie(cookie, request_domain, request_path)) { - successful.push(cookie); - } - } - return successful; - }; -}()); - -},{}],20:[function(require,module,exports){ -/*! - * jQuery JavaScript Library v2.1.4 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2015-04-28T16:01Z - */ - -(function( global, factory ) { - - if ( typeof module === "object" && typeof module.exports === "object" ) { - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Support: Firefox 18+ -// Can't be in strict mode, several libs including ASP.NET trace -// the stack via arguments.caller.callee and Firefox dies if -// you try to trace through "use strict" call chains. (#13335) -// - -var arr = []; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var support = {}; - - - -var - // Use the correct document accordingly with window argument (sandbox) - document = window.document, - - version = "2.1.4", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android<4.1 - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - -jQuery.fn = jQuery.prototype = { - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num != null ? - - // Return just the one element from the set - ( num < 0 ? this[ num + this.length ] : this[ num ] ) : - - // Return all the elements in a clean array - slice.call( this ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - // parseFloat NaNs numeric-cast false positives (null|true|false|"") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - // adding 1 corrects loss of precision from parseFloat (#15100) - return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; - }, - - isPlainObject: function( obj ) { - // Not plain objects: - // - Any object or value whose internal [[Class]] property is not "[object Object]" - // - DOM nodes - // - window - if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.constructor && - !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { - return false; - } - - // If the function hasn't returned already, we're confident that - // |obj| is a plain object, created by {} or constructed with new Object - return true; - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - // Support: Android<4.0, iOS<6 (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call(obj) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - var script, - indirect = eval; - - code = jQuery.trim( code ); - - if ( code ) { - // If the code includes a valid, prologue position - // strict mode pragma, execute code by injecting a - // script tag into the document. - if ( code.indexOf("use strict") === 1 ) { - script = document.createElement("script"); - script.text = code; - document.head.appendChild( script ).parentNode.removeChild( script ); - } else { - // Otherwise, avoid the DOM node creation, insertion - // and removal by using an indirect global eval - indirect( code ); - } - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE9-11+ - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function( obj, callback, args ) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike( obj ); - - if ( args ) { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } - } - - return obj; - }, - - // Support: Android<4.1 - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArraylike( Object(arr) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, - i = 0, - length = elems.length, - isArray = isArraylike( elems ), - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -}); - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -function isArraylike( obj ) { - - // Support: iOS 8.2 (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.2.0-pre - * http://sizzlejs.com/ - * - * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2014-12-16 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // General-purpose constants - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // http://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + characterEncoding + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - - context = context || document; - results = results || []; - nodeType = context.nodeType; - - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - if ( !seed && documentIsHTML ) { - - // Try to shortcut find operations when possible (e.g., not under DocumentFragment) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document (jQuery #6963) - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // QSA path - if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - nid = old = expando; - newContext = context; - newSelector = nodeType !== 1 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); - - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while ( i-- ) { - groups[i] = nid + toSelector( groups[i] ); - } - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; - newSelector = groups.join(","); - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch(qsaError) { - } finally { - if ( !old ) { - context.removeAttribute("id"); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = attrs.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, parent, - doc = node ? node.ownerDocument || node : preferredDoc; - - // If no document and documentElement is available, return - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Set our document - document = doc; - docElem = doc.documentElement; - parent = doc.defaultView; - - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if ( parent && parent !== parent.top ) { - // IE11 does not have attachEvent, so all must suffer - if ( parent.addEventListener ) { - parent.addEventListener( "unload", unloadHandler, false ); - } else if ( parent.attachEvent ) { - parent.attachEvent( "onunload", unloadHandler ); - } - } - - /* Support tests - ---------------------------------------------------------------------- */ - documentIsHTML = !isXML( doc ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( doc.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !doc.getElementsByName || !doc.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [ m ] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - docElem.appendChild( div ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( div.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ - if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibing-combinator selector` fails - if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( div ) { - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = doc.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( div.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully does not implement inclusive descendent - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === doc ? -1 : - b === doc ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return doc; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, outerCache, node, diff, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || (parent[ expando ] = {}); - cache = outerCache[ type ] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - // Use previously-cached element index if available - } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) - } else { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { - // Cache the index of each encountered element - if ( useCache ) { - (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - if ( (oldCache = outerCache[ dir ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - outerCache[ dir ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context !== document && context; - } - - // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is no seed and only one group - if ( match.length === 1 ) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - }); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - }); - - } - - if ( typeof qualifier === "string" ) { - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) >= 0 ) !== not; - }); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - })); -}; - -jQuery.fn.extend({ - find: function( selector ) { - var i, - len = this.length, - ret = [], - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - filter: function( selector ) { - return this.pushStack( winnow(this, selector || [], false) ); - }, - not: function( selector ) { - return this.pushStack( winnow(this, selector || [], true) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -}); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - init = jQuery.fn.init = function( selector, context ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[2] ); - - // Support: Blackberry 4.6 - // gEBID returns nodes no longer in the document (#6963) - if ( elem && elem.parentNode ) { - // Inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return typeof rootjQuery.ready !== "undefined" ? - rootjQuery.ready( selector ) : - // Execute immediately if ready is not present - selector( jQuery ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.extend({ - dir: function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; - }, - - sibling: function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; - } -}); - -jQuery.fn.extend({ - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter(function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { - // Always skip document fragments - if ( cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors)) ) { - - matched.push( cur ); - break; - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.unique( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } -}); - -function sibling( cur, dir ) { - while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return elem.contentDocument || jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.unique( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -}); -var rnotwhite = (/\S+/g); - - - -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache -function createOptions( options ) { - var object = optionsCache[ options ] = {}; - jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - }); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : - jQuery.extend( {}, options ); - - var // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // Flag to know if list is currently firing - firing, - // First callback to fire (used internally by add and fireWith) - firingStart, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { - jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && type !== "string" ) { - // Inspect recursively - add( arg ); - } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); - }, - // Remove all callbacks from the list - empty: function() { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( list && ( !fired || stack ) ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - if ( firing ) { - stack.push( args ); - } else { - fire( args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -jQuery.extend({ - - Deferred: function( func ) { - var tuples = [ - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred(function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ](function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); - } - }); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; - - // Handle state - if ( stateString ) { - list.add(function() { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[0] ] = function() { - deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // Add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); - } else { - --remaining; - } - } - } - - // If we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -}); - - -// The deferred used on DOM ready -var readyList; - -jQuery.fn.ready = function( fn ) { - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; -}; - -jQuery.extend({ - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.triggerHandler ) { - jQuery( document ).triggerHandler( "ready" ); - jQuery( document ).off( "ready" ); - } - } -}); - -/** - * The ready event handler and self cleanup method - */ -function completed() { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); - jQuery.ready(); -} - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // We once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready ); - - } else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed, false ); - } - } - return readyList.promise( obj ); -}; - -// Kick off the DOM ready check even if the user does not -jQuery.ready.promise(); - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - len ? fn( elems[0], key ) : emptyGet; -}; - - -/** - * Determines whether an object can have data - */ -jQuery.acceptData = function( owner ) { - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - /* jshint -W018 */ - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - -function Data() { - // Support: Android<4, - // Old WebKit does not have Object.preventExtensions/freeze method, - // return new empty object instead with no [[set]] accessor - Object.defineProperty( this.cache = {}, 0, { - get: function() { - return {}; - } - }); - - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; -Data.accepts = jQuery.acceptData; - -Data.prototype = { - key: function( owner ) { - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return the key for a frozen object. - if ( !Data.accepts( owner ) ) { - return 0; - } - - var descriptor = {}, - // Check if the owner object already has a cache key - unlock = owner[ this.expando ]; - - // If not, create one - if ( !unlock ) { - unlock = Data.uid++; - - // Secure it in a non-enumerable, non-writable property - try { - descriptor[ this.expando ] = { value: unlock }; - Object.defineProperties( owner, descriptor ); - - // Support: Android<4 - // Fallback to a less secure definition - } catch ( e ) { - descriptor[ this.expando ] = unlock; - jQuery.extend( owner, descriptor ); - } - } - - // Ensure the cache object - if ( !this.cache[ unlock ] ) { - this.cache[ unlock ] = {}; - } - - return unlock; - }, - set: function( owner, data, value ) { - var prop, - // There may be an unlock assigned to this node, - // if there is no entry for this "owner", create one inline - // and set the unlock as though an owner entry had always existed - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - // Handle: [ owner, key, value ] args - if ( typeof data === "string" ) { - cache[ data ] = value; - - // Handle: [ owner, { properties } ] args - } else { - // Fresh assignments by object are shallow copied - if ( jQuery.isEmptyObject( cache ) ) { - jQuery.extend( this.cache[ unlock ], data ); - // Otherwise, copy the properties one-by-one to the cache object - } else { - for ( prop in data ) { - cache[ prop ] = data[ prop ]; - } - } - } - return cache; - }, - get: function( owner, key ) { - // Either a valid cache is found, or will be created. - // New caches will be created and the unlock returned, - // allowing direct access to the newly created - // empty data object. A valid owner object must be provided. - var cache = this.cache[ this.key( owner ) ]; - - return key === undefined ? - cache : cache[ key ]; - }, - access: function( owner, key, value ) { - var stored; - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ((key && typeof key === "string") && value === undefined) ) { - - stored = this.get( owner, key ); - - return stored !== undefined ? - stored : this.get( owner, jQuery.camelCase(key) ); - } - - // [*]When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, name, camel, - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - if ( key === undefined ) { - this.cache[ unlock ] = {}; - - } else { - // Support array or space separated string of keys - if ( jQuery.isArray( key ) ) { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = key.concat( key.map( jQuery.camelCase ) ); - } else { - camel = jQuery.camelCase( key ); - // Try the string as a key before any manipulation - if ( key in cache ) { - name = [ key, camel ]; - } else { - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - name = camel; - name = name in cache ? - [ name ] : ( name.match( rnotwhite ) || [] ); - } - } - - i = name.length; - while ( i-- ) { - delete cache[ name[ i ] ]; - } - } - }, - hasData: function( owner ) { - return !jQuery.isEmptyObject( - this.cache[ owner[ this.expando ] ] || {} - ); - }, - discard: function( owner ) { - if ( owner[ this.expando ] ) { - delete this.cache[ owner[ this.expando ] ]; - } - } -}; -var data_priv = new Data(); - -var data_user = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /([A-Z])/g; - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - data_user.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend({ - hasData: function( elem ) { - return data_user.hasData( elem ) || data_priv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return data_user.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - data_user.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to data_priv methods, these can be deprecated. - _data: function( elem, name, data ) { - return data_priv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - data_priv.remove( elem, name ); - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = data_user.get( elem ); - - if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE11+ - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice(5) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - data_priv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - data_user.set( this, key ); - }); - } - - return access( this, function( value ) { - var data, - camelKey = jQuery.camelCase( key ); - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - // Attempt to get data from the cache - // with the key as-is - data = data_user.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to get data from the cache - // with the key camelized - data = data_user.get( elem, camelKey ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, camelKey, undefined ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each(function() { - // First, attempt to store a copy or reference of any - // data that might've been store with a camelCased key. - var data = data_user.get( this, camelKey ); - - // For HTML5 data-* attribute interop, we have to - // store property names with dashes in a camelCase form. - // This might not apply to all properties...* - data_user.set( this, camelKey, value ); - - // *... In the case of properties that might _actually_ - // have dashes, we need to also store a copy of that - // unchanged property. - if ( key.indexOf("-") !== -1 && data !== undefined ) { - data_user.set( this, key, value ); - } - }); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each(function() { - data_user.remove( this, key ); - }); - } -}); - - -jQuery.extend({ - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = data_priv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray( data ) ) { - queue = data_priv.access( elem, type, jQuery.makeArray(data) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return data_priv.get( elem, key ) || data_priv.access( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - data_priv.remove( elem, [ type + "queue", key ] ); - }) - }); - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = data_priv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -}); -var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHidden = function( elem, el ) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); - }; - -var rcheckableType = (/^(?:checkbox|radio)$/i); - - - -(function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Safari<=5.1 - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Safari<=5.1, Android<4.2 - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE<=11+ - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -})(); -var strundefined = typeof undefined; - - - -support.focusinBubbles = "onfocusin" in window; - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !(events = elemData.events) ) { - events = elemData.events = {}; - } - if ( !(eventHandle = elemData.handle) ) { - eventHandle = elemData.handle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !(handlers = events[ type ]) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.hasData( elem ) && data_priv.get( elem ); - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - data_priv.remove( elem, "events" ); - } - }, - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === (elem.ownerDocument || document) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && jQuery.acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && - jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, j, ret, matched, handleObj, - handlerQueue = [], - args = slice.call( arguments ), - handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( (event.result = ret) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, matches, sel, handleObj, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.disabled !== true || event.type !== "click" ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, handlers: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); - } - - return handlerQueue; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: Cordova 2.5 (WebKit) (#13255) - // All events should have a target; Cordova deviceready doesn't - if ( !event.target ) { - event.target = document; - } - - // Support: Safari 6.0+, Chrome<28 - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } -}; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - // Support: Android<4.0 - src.returnValue === false ? - returnTrue : - returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && e.preventDefault ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && e.stopPropagation ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && e.stopImmediatePropagation ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -// Support: Chrome 15+ -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// Support: Firefox, Chrome, Safari -// Create "bubbling" focus and blur events -if ( !support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = data_priv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - data_priv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = data_priv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - data_priv.remove( doc, fix ); - - } else { - data_priv.access( doc, fix, attaches ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - var elem = this[0]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -}); - - -var - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rhtml = /<|&#?\w+;/, - rnoInnerhtml = /<(?:script|style|link)/i, - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rscriptType = /^$|\/(?:java|ecma)script/i, - rscriptTypeMasked = /^true\/(.*)/, - rcleanScript = /^\s*\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - - // Support: IE9 - option: [ 1, "" ], - - thead: [ 1, "", "
      " ], - col: [ 2, "", "
      " ], - tr: [ 2, "", "
      " ], - td: [ 3, "", "
      " ], - - _default: [ 0, "", "" ] - }; - -// Support: IE9 -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: 1.x compatibility -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute("type"); - } - - return elem; -} - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - data_priv.set( - elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) - ); - } -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( data_priv.hasData( src ) ) { - pdataOld = data_priv.access( src ); - pdataCur = data_priv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( data_user.hasData( src ) ) { - udataOld = data_user.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - data_user.set( dest, udataCur ); - } -} - -function getAll( context, tag ) { - var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : - context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : - []; - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], ret ) : - ret; -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -jQuery.extend({ - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - buildFragment: function( elems, context, scripts, selection ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - // Support: QtWebKit, PhantomJS - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement("div") ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: QtWebKit, PhantomJS - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( (elem = nodes[ i++ ]) ) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( (elem = tmp[ j++ ]) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; - }, - - cleanData: function( elems ) { - var data, elem, type, key, - special = jQuery.event.special, - i = 0; - - for ( ; (elem = elems[ i ]) !== undefined; i++ ) { - if ( jQuery.acceptData( elem ) ) { - key = elem[ data_priv.expando ]; - - if ( key && (data = data_priv.cache[ key ]) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - if ( data_priv.cache[ key ] ) { - // Discard any remaining `private` data - delete data_priv.cache[ key ]; - } - } - } - // Discard any remaining `user` data - delete data_user.cache[ elem[ data_user.expando ] ]; - } - } -}); - -jQuery.fn.extend({ - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each(function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - }); - }, null, value, arguments.length ); - }, - - append: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - }); - }, - - prepend: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - }); - }, - - before: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - }); - }, - - after: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - }); - }, - - remove: function( selector, keepData /* Internal Use Only */ ) { - var elem, - elems = selector ? jQuery.filter( selector, this ) : this, - i = 0; - - for ( ; (elem = elems[i]) != null; i++ ) { - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); - } - } - - return this; - }, - - empty: function() { - var elem, - i = 0; - - for ( ; (elem = this[i]) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map(function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = value.replace( rxhtmlTag, "<$1>" ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var arg = arguments[ 0 ]; - - // Make the changes, replacing each context element with the new content - this.domManip( arguments, function( elem ) { - arg = this.parentNode; - - jQuery.cleanData( getAll( this ) ); - - if ( arg ) { - arg.replaceChild( elem, this ); - } - }); - - // Force removal if there was no new content (e.g., from empty arguments) - return arg && (arg.length || arg.nodeType) ? this : this.remove(); - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, - - domManip: function( args, callback ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return this.each(function( index ) { - var self = set.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - self.domManip( args, callback ); - }); - } - - if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - // Support: QtWebKit - // jQuery.merge because push.apply(_, arraylike) throws - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( this[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - - if ( node.src ) { - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); - } - } - } - } - } - } - - return this; - } -}); - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: QtWebKit - // .get() because push.apply(_, arraylike) throws - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -}); - - -var iframe, - elemdisplay = {}; - -/** - * Retrieve the actual display of a element - * @param {String} name nodeName of the element - * @param {Object} doc Document object - */ -// Called only from within defaultDisplay -function actualDisplay( name, doc ) { - var style, - elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), - - // getDefaultComputedStyle might be reliably used only on attached element - display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? - - // Use of this method is a temporary fix (more like optimization) until something better comes along, - // since it was removed from specification and supported only in FF - style.display : jQuery.css( elem[ 0 ], "display" ); - - // We don't have any data stored on the element, - // so use "detach" method as fast way to get rid of the element - elem.detach(); - - return display; -} - -/** - * Try to determine the default display value of an element - * @param {String} nodeName - */ -function defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - - // Use the already-created iframe if possible - iframe = (iframe || jQuery( "